From 7b99edc47102cf1f6b0777cbe803bf190f7aeb3c Mon Sep 17 00:00:00 2001 From: SamTV12345 <40429738+samtv12345@users.noreply.github.com> Date: Fri, 23 Jun 2023 20:53:55 +0200 Subject: [PATCH] Moved to ts for other dependencies. --- src/node/db/API.ts | 31 +- src/node/db/AuthorManager.ts | 10 +- src/node/db/DB.ts | 20 +- src/node/db/GroupManager.ts | 6 +- src/node/db/Pad.ts | 33 +- src/node/db/ReadOnlyManager.ts | 6 +- src/node/db/SecurityManager.ts | 4 +- src/node/eejs/index.ts | 4 +- src/node/handler/ImportHandler.ts | 4 +- src/node/handler/PadMessageHandler.ts | 28 +- src/node/hooks/express.ts | 10 +- src/node/hooks/express/adminplugins.ts | 34 +- src/node/hooks/express/adminsettings.ts | 14 +- src/node/hooks/express/errorhandling.ts | 5 +- src/node/hooks/express/importexport.ts | 2 +- src/node/hooks/express/openapi.ts | 2 +- src/node/hooks/express/padurlsanitize.ts | 2 +- src/node/hooks/express/socketio.ts | 8 +- src/node/hooks/express/specialpages.ts | 10 +- src/node/hooks/express/tests.ts | 4 +- src/node/hooks/express/webaccess.ts | 7 +- src/node/hooks/i18n.ts | 12 +- src/node/models/CMDArgv.ts | 3 + src/node/utils/Abiword.ts | 6 +- src/node/utils/Cli.ts | 17 +- src/node/utils/ExportEtherpad.ts | 6 +- src/node/utils/ExportHtml.ts | 14 +- src/node/utils/ImportEtherpad.ts | 8 +- src/node/utils/Minify.ts | 6 +- src/node/utils/Settings.ts | 38 +- src/node/utils/TidyHtml.ts | 2 +- src/node/utils/UpdateCheck.ts | 4 +- src/node/utils/customError.ts | 1 + src/node/utils/padDiff.ts | 4 +- src/node/utils/run_cmd.ts | 2 +- src/package-lock.json | 1653 +++++++---------- src/package.json | 4 +- src/static/js/{Changeset.js => Changeset.ts} | 154 +- src/static/js/pluginfw/{hooks.js => hooks.ts} | 45 +- .../pluginfw/{installer.js => installer.ts} | 56 +- .../{plugin_defs.js => plugin_defs.ts} | 24 +- .../js/pluginfw/{plugins.js => plugins.ts} | 82 +- .../js/pluginfw/{shared.js => shared.ts} | 14 +- src/static/js/pluginfw/{tsort.js => tsort.ts} | 8 +- src/static/module/InstallerModel.ts | 5 + src/static/module/PluginInfo.ts | 4 + src/tsconfig.json | 3 +- 47 files changed, 1056 insertions(+), 1363 deletions(-) create mode 100644 src/node/models/CMDArgv.ts rename src/static/js/{Changeset.js => Changeset.ts} (95%) rename src/static/js/pluginfw/{hooks.js => hooks.ts} (93%) rename src/static/js/pluginfw/{installer.js => installer.ts} (66%) rename src/static/js/pluginfw/{plugin_defs.js => plugin_defs.ts} (72%) rename src/static/js/pluginfw/{plugins.js => plugins.ts} (70%) rename src/static/js/pluginfw/{shared.js => shared.ts} (91%) rename src/static/js/pluginfw/{tsort.js => tsort.ts} (89%) create mode 100644 src/static/module/InstallerModel.ts create mode 100644 src/static/module/PluginInfo.ts diff --git a/src/node/db/API.ts b/src/node/db/API.ts index d434eb556..6f585ccee 100644 --- a/src/node/db/API.ts +++ b/src/node/db/API.ts @@ -50,41 +50,18 @@ import {getPadHTMLDocument} from "../utils/ExportHtml"; * GROUP FUNCTIONS **** ******************** */ -/* -exports.listAllGroups = listAllGroups; -exports.createGroup = createGroup; -exports.createGroupIfNotExistsFor = createGroupIfNotExistsFor; -exports.deleteGroup = deleteGroup; -exports.listPads = listPads; -exports.createGroupPad = createGroupPad; -*/ /* ******************** * PADLIST FUNCTION *** ******************** */ -/* -exports.listAllPads = padManager.listAllPads; -*/ + /* ******************** * AUTHOR FUNCTIONS *** ******************** */ -/* -exports.createAuthor = createAuthor; -exports.createAuthorIfNotExistsFor = createAuthorIfNotExistsFor; -exports.getAuthorName = getAuthorName; -exports.listPadsOfAuthor = listPadsOfAuthor; -exports.padUsers = padMessageHandler.padUsers; -exports.padUsersCount = padMessageHandler.padUsersCount; -*/ + /* ******************** * SESSION FUNCTIONS ** ******************** */ -/* -exports.createSession = sessionManager.createSession; -exports.deleteSession = sessionManager.deleteSession; -exports.getSessionInfo = sessionManager.getSessionInfo; -exports.listSessionsOfGroup = sessionManager.listSessionsOfGroup; -exports.listSessionsOfAuthor = sessionManager.listSessionsOfAuthor; -*/ + /* *********************** * PAD CONTENT FUNCTIONS * *********************** */ @@ -742,7 +719,7 @@ Example returns: {"code":0,"message":"ok","data":null} {"code":4,"message":"no or wrong API Key","data":null} */ -exports.checkToken = async () => { +export const checkToken = async () => { }; /** diff --git a/src/node/db/AuthorManager.ts b/src/node/db/AuthorManager.ts index a3f5db0dc..3dd316f67 100644 --- a/src/node/db/AuthorManager.ts +++ b/src/node/db/AuthorManager.ts @@ -21,7 +21,7 @@ import {db} from './DB'; import {CustomError} from '../utils/customError'; -import hooks from '../../static/js/pluginfw/hooks.js'; +import {aCallFirst} from '../../static/js/pluginfw/hooks.js'; const {randomString, padutils: {warnDeprecated}} = require('../../static/js/pad_utils'); @@ -110,7 +110,7 @@ const getAuthor4Token2 = async (token: string) => { export const getAuthorId = async (token, user) => { const context = {dbKey: token, token, user}; - let [authorId] = await hooks.aCallFirst('getAuthorId', context); + let [authorId] = await aCallFirst('getAuthorId', context); if (!authorId) authorId = await getAuthor4Token2(context.dbKey); return authorId; }; @@ -137,7 +137,7 @@ export const createAuthorIfNotExistsFor = async (authorMapper, name: string) => if (name) { // set the name of this author - await exports.setAuthorName(author.authorID, name); + await setAuthorName(author.authorID, name); } return author; @@ -155,7 +155,7 @@ export const mapAuthorWithDBKey = async (mapperkey: string, mapper) => { if (author == null) { // there is no author with this mapper, so create one - const author = await exports.createAuthor(null); + const author = await createAuthor(null); // create the token2author relation await db.set(`${mapperkey}:${mapper}`, author.authorID); @@ -182,7 +182,7 @@ export const createAuthor = async (name) => { // create the globalAuthors db entry const authorObj = { - colorId: Math.floor(Math.random() * (exports.getColorPalette().length)), + colorId: Math.floor(Math.random() * (getColorPalette().length)), name, timestamp: Date.now(), }; diff --git a/src/node/db/DB.ts b/src/node/db/DB.ts index 6eca386fe..9d1379fe8 100644 --- a/src/node/db/DB.ts +++ b/src/node/db/DB.ts @@ -31,32 +31,32 @@ const logger = log4js.getLogger('ueberDB'); /** * The UeberDB Object that provides the database functions */ -const db = null; +let db = null; /** * Initializes the database with the settings provided by the settings module */ const init = async () => { - exports.db = new ueberDB.Database(dbType, dbSettings, null, logger); - await exports.db.init(); - if (exports.db.metrics != null) { - for (const [metric, value] of Object.entries(exports.db.metrics)) { + db = new ueberDB.Database(dbType, dbSettings, null, logger); + await db.init(); + if (db.metrics != null) { + for (const [metric, value] of Object.entries(db.metrics)) { if (typeof value !== 'number') continue; // FIXME find a better replacement for measure-core - createCollection.gauge(`ueberdb_${metric}`, () => exports.db.metrics[metric]); + createCollection.gauge(`ueberdb_${metric}`, () => db.metrics[metric]); } } for (const fn of ['get', 'set', 'findKeys', 'getSub', 'setSub', 'remove']) { - const f = exports.db[fn]; - exports[fn] = async (...args) => await f.call(exports.db, ...args); + const f = db[fn]; + exports[fn] = async (...args) => await f.call(db, ...args); Object.setPrototypeOf(exports[fn], Object.getPrototypeOf(f)); Object.defineProperties(exports[fn], Object.getOwnPropertyDescriptors(f)); } }; const shutdown = async (hookName, context) => { - if (exports.db != null) await exports.db.close(); - exports.db = null; + if (db != null) await db.close(); + db = null; logger.log('Database closed'); }; diff --git a/src/node/db/GroupManager.ts b/src/node/db/GroupManager.ts index 0be2205d8..5df48b2e3 100644 --- a/src/node/db/GroupManager.ts +++ b/src/node/db/GroupManager.ts @@ -90,8 +90,8 @@ export const createGroupIfNotExistsFor = async (groupMapper) => { throw new CustomError('groupMapper is not a string', 'apierror'); } const groupID = await db.get(`mapper2group:${groupMapper}`); - if (groupID && await exports.doesGroupExist(groupID)) return {groupID}; - const result = await exports.createGroup(); + if (groupID && await doesGroupExist(groupID)) return {groupID}; + const result = await createGroup(); await Promise.all([ db.set(`mapper2group:${groupMapper}`, result.groupID), // Remember the mapping in the group record so that it can be cleaned up when the group is @@ -132,7 +132,7 @@ export const createGroupPad = async (groupID, padName, text, authorId = '') => { }; export const listPads = async (groupID) => { - const exists = await exports.doesGroupExist(groupID); + const exists = await doesGroupExist(groupID); // ensure the group exists if (!exists) { diff --git a/src/node/db/Pad.ts b/src/node/db/Pad.ts index be7ac0155..b894299c3 100644 --- a/src/node/db/Pad.ts +++ b/src/node/db/Pad.ts @@ -4,7 +4,7 @@ */ import AttributeMap from '../../static/js/AttributeMap'; -import Changeset from '../../static/js/Changeset'; +import {applyToAText, makeAText} from '../../static/js/Changeset'; import ChatMessage from '../../static/js/ChatMessage'; import {AttributePool} from '../../static/js/AttributePool'; import {Stream} from '../utils/Stream'; @@ -19,7 +19,7 @@ import {doesGroupExist} from './GroupManager'; import {CustomError} from '../utils/customError'; import {getReadOnlyId} from './ReadOnlyManager'; import {randomString} from '../utils/randomstring'; -import hooks from '../../static/js/pluginfw/hooks'; +import {aCallAll} from '../../static/js/pluginfw/hooks'; import {timesLimit} from '../utils/promises'; import {padutils} from '../../static/js/pad_utils'; /** @@ -27,7 +27,7 @@ import {padutils} from '../../static/js/pad_utils'; * line breaks and convert Tabs to spaces * @param txt */ -exports.cleanText = (txt) => txt.replace(/\r\n/g, '\n') +export const cleanText = (txt) => txt.replace(/\r\n/g, '\n') .replace(/\r/g, '\n') .replace(/\t/g, ' ') .replace(/\xa0/g, ' '); @@ -51,7 +51,7 @@ export class Pad { */ constructor(id: string, database = db) { this.db = database; - this.atext = Changeset.makeAText('\n'); + this.atext = makeAText('\n'); this.pool = new AttributePool(); this.head = -1; this.chatHead = -1; @@ -83,11 +83,11 @@ export class Pad { } async appendRevision(aChangeset, authorId = '') { - const newAText = Changeset.applyToAText(aChangeset, this.atext, this.pool); + const newAText = applyToAText(aChangeset, this.atext, this.pool); if (newAText.text === this.atext.text && newAText.attribs === this.atext.attribs) { return this.head; } - Changeset.copyAText(newAText, this.atext); + copyAText(newAText, this.atext); const newRev = ++this.head; @@ -109,7 +109,7 @@ export class Pad { }), this.saveToDatabase(), authorId && addPad(authorId, this.id), - hooks.aCallAll(hook, { + aCallAll(hook, { pad: this, authorId, get author() { @@ -188,7 +188,7 @@ export class Pad { ]); const apool = this.apool(); let atext = keyAText; - for (const cs of changesets) atext = Changeset.applyToAText(cs, atext, apool); + for (const cs of changesets) atext = applyToAText(cs, atext, apool); return atext; } @@ -259,7 +259,7 @@ export class Pad { const orig = this.text(); assert(orig.endsWith('\n')); if (start + ndel > orig.length) throw new RangeError('start/delete past the end of the text'); - ins = exports.cleanText(ins); + ins = cleanText(ins); const willEndWithNewline = start + ndel < orig.length || // Keeping last char (which is guaranteed to be a newline). ins.endsWith('\n') || @@ -362,14 +362,14 @@ export class Pad { } else { if (text == null) { const context = {pad: this, authorId, type: 'text', content: defaultPadText}; - await hooks.aCallAll('padDefaultContent', context); + await aCallAll('padDefaultContent', context); if (context.type !== 'text') throw new Error(`unsupported content type: ${context.type}`); - text = exports.cleanText(context.content); + text = cleanText(context.content); } const firstChangeset = Changeset.makeSplice('\n', 0, 0, text); await this.appendRevision(firstChangeset, authorId); } - await hooks.aCallAll('padLoad', {pad: this}); + await aCallAll('padLoad', {pad: this}); } async copy(destinationID, force) { @@ -405,7 +405,7 @@ export class Pad { const dstPad = await getPad(destinationID, null); // let the plugins know the pad was copied - await hooks.aCallAll('padCopy', { + await aCallAll('padCopy', { get originalPad() { padutils.warnDeprecated('padCopy originalPad context property is deprecated; use srcPad instead'); return this.srcPad; @@ -506,7 +506,7 @@ export class Pad { const changeset = Changeset.pack(oldLength, newLength, assem.toString(), newText); dstPad.appendRevision(changeset, authorId); - await hooks.aCallAll('padCopy', { + await aCallAll('padCopy', { get originalPad() { padutils.warnDeprecated('padCopy originalPad context property is deprecated; use srcPad instead'); return this.srcPad; @@ -571,7 +571,7 @@ export class Pad { // delete the pad entry and delete pad from padManager p.push(removePad(padID)); - p.push(hooks.aCallAll('padRemove', { + p.push(aCallAll('padRemove', { get padID() { padutils.warnDeprecated('padRemove padID context property is deprecated; use pad.id instead'); return this.pad.id; @@ -730,7 +730,6 @@ export class Pad { .batch(100).buffer(99); for (const p of chats) await p; - await hooks.aCallAll('padCheck', {pad: this}); + await aCallAll('padCheck', {pad: this}); } } -exports.Pad = Pad; diff --git a/src/node/db/ReadOnlyManager.ts b/src/node/db/ReadOnlyManager.ts index 8d5a036c8..a96ad53ed 100644 --- a/src/node/db/ReadOnlyManager.ts +++ b/src/node/db/ReadOnlyManager.ts @@ -61,11 +61,11 @@ export const getPadId = async (readOnlyId) => await db.get(`readonly2pad:${readO * @param {String} id padIdOrReadonlyPadId read only id or real pad id */ export const getIds = async (id: string) => { - const readonly = exports.isReadOnlyId(id); + const readonly = isReadOnlyId(id); // Might be null, if this is an unknown read-only id - const readOnlyPadId = readonly ? id : await exports.getReadOnlyId(id); - const padId = readonly ? await exports.getPadId(id) : id; + const readOnlyPadId = readonly ? id : await getReadOnlyId(id); + const padId = readonly ? await getPadId(id) : id; return {readOnlyPadId, padId, readonly}; }; diff --git a/src/node/db/SecurityManager.ts b/src/node/db/SecurityManager.ts index ca894b5e5..f0fc26551 100644 --- a/src/node/db/SecurityManager.ts +++ b/src/node/db/SecurityManager.ts @@ -21,7 +21,7 @@ import {getAuthorId} from "./AuthorManager"; -import hooks from "../../static/js/pluginfw/hooks.js"; +import {callAll} from "../../static/js/pluginfw/hooks.js"; import {doesPadExist, getPad} from "./PadManager"; @@ -102,7 +102,7 @@ export const checkAccess = async (padID, sessionCookie, token, userSettings) => // allow plugins to deny access const isFalse = (x) => x === false; - if (hooks.callAll('onAccessCheck', {padID, token, sessionCookie}).some(isFalse)) { + if (callAll('onAccessCheck', {padID, token, sessionCookie}).some(isFalse)) { authLogger.debug('access denied: an onAccessCheck hook function returned false'); return DENY; } diff --git a/src/node/eejs/index.ts b/src/node/eejs/index.ts index 42faa52a1..ff125e4c3 100644 --- a/src/node/eejs/index.ts +++ b/src/node/eejs/index.ts @@ -23,7 +23,7 @@ import ejs from 'ejs'; import fs from "fs"; -import hooks from "../../static/js/pluginfw/hooks.js"; +import {callAll} from "../../static/js/pluginfw/hooks.js"; import path from "path"; @@ -64,7 +64,7 @@ export const end_block = () => { const content = info.__output.get(); info.__output.set(info.__output_stack.pop()); const args = {content, renderContext}; - hooks.callAll(`eejsBlock_${name}`, args); + callAll(`eejsBlock_${name}`, args); info.__output.set(info.__output.get().concat(args.content)); }; diff --git a/src/node/handler/ImportHandler.ts b/src/node/handler/ImportHandler.ts index 92f5e38a7..d83c15c67 100644 --- a/src/node/handler/ImportHandler.ts +++ b/src/node/handler/ImportHandler.ts @@ -32,7 +32,7 @@ import os from 'os'; import {setPadHTML} from '../utils/ImportHtml'; import {setPadRaw} from '../utils/ImportEtherpad'; import log4js from 'log4js'; -import hooks from '../../static/js/pluginfw/hooks.js'; +import {aCallAll} from '../../static/js/pluginfw/hooks.js'; const logger = log4js.getLogger('ImportHandler'); @@ -134,7 +134,7 @@ const doImport = async (req, res, padId, authorId) => { const destFile = path.join(tmpDirectory, `etherpad_import_${randNum}.${exportExtension}`); const context = {srcFile, destFile, fileEnding, padId, ImportError}; - const importHandledByPlugin = (await hooks.aCallAll('import', context)).some((x) => x); + const importHandledByPlugin = (await aCallAll('import', context)).some((x) => x); const fileIsEtherpad = (fileEnding === '.etherpad'); const fileIsHTML = (fileEnding === '.html' || fileEnding === '.htm'); const fileIsTXT = (fileEnding === '.txt'); diff --git a/src/node/handler/PadMessageHandler.ts b/src/node/handler/PadMessageHandler.ts index 5e9f0665d..edd97a703 100644 --- a/src/node/handler/PadMessageHandler.ts +++ b/src/node/handler/PadMessageHandler.ts @@ -45,15 +45,14 @@ import { indentationOnNewLine, padOptions, padShortcutEnabled, - randomVersionString, scrollWhenFocusLineIsOutOfViewport, skinName, skinVariants, sofficeAvailable } from '../utils/Settings'; -import plugins from '../../static/js/pluginfw/plugin_defs.js'; +import {parts, plugins} from '../../static/js/pluginfw/plugin_defs.js'; import log4js from "log4js"; -import hooks from '../../static/js/pluginfw/hooks.js'; +import {aCallAll, deprecationNotices} from '../../static/js/pluginfw/hooks.js'; import {createCollection} from '../stats'; import {strict as assert} from "assert"; @@ -62,6 +61,7 @@ import {userCanModify} from '../hooks/express/webaccess'; import {ErrorCaused} from "../models/ErrorCaused"; import {Pad} from "../db/Pad"; import {SessionInfo} from "../models/SessionInfo"; +import {randomString} from "../utils/randomstring"; const securityManager = require('../db/SecurityManager'); @@ -71,7 +71,7 @@ const accessLogger = log4js.getLogger('access'); let rateLimiter; let socketio = null; -hooks.deprecationNotices.clientReady = 'use the userJoin hook instead'; +deprecationNotices.clientReady = 'use the userJoin hook instead'; const addContextToError = (err: Error, pfx) => { const newErr = new ErrorCaused(`${pfx}${err.message}`, err); @@ -225,7 +225,7 @@ export const handleDisconnect = async (socket) => { }, }, }); - await hooks.aCallAll('userLeave', { + await aCallAll('userLeave', { ...session, // For backwards compatibility. authorId: session.author, readOnly: session.readonly, @@ -328,7 +328,7 @@ export const handleMessage = async (socket, message) => { return this.socket; }, }; - for (const res of await hooks.aCallAll('handleMessageSecurity', context)) { + for (const res of await aCallAll('handleMessageSecurity', context)) { switch (res) { case true: padutils.warnDeprecated( @@ -346,7 +346,7 @@ export const handleMessage = async (socket, message) => { } // Call handleMessage hook. If a plugin returns null, the message will be dropped. - if ((await hooks.aCallAll('handleMessage', context)).some((m) => m == null)) { + if ((await aCallAll('handleMessage', context)).some((m) => m == null)) { return; } @@ -475,7 +475,7 @@ export const sendChatMessageToPadClients = async (mt, puId, text = null, padId = const message = mt instanceof ChatMessage ? mt : new ChatMessage(text, puId, mt); padId = mt instanceof ChatMessage ? puId : padId; const pad = await getPad(padId, null, message.authorId); - await hooks.aCallAll('chatNewMessage', {message, pad, padId}); + await aCallAll('chatNewMessage', {message, pad, padId}); // pad.appendChatMessage() ignores the displayName property so we don't need to wait for // authorManager.getAuthorName() to resolve before saving the message to the database. const promise = pad.appendChatMessage(message); @@ -809,7 +809,7 @@ const handleClientReady = async (socket, message) => { if (sessionInfo == null) throw new Error('client disconnected'); assert(sessionInfo.author); - await hooks.aCallAll('clientReady', message); // Deprecated due to awkward context. + await aCallAll('clientReady', message); // Deprecated due to awkward context. let {colorId: authorColorId, name: authorName} = message.userInfo || {}; if (authorColorId && !/^#(?:[0-9A-F]{3}){1,2}$/i.test(authorColorId)) { @@ -957,7 +957,7 @@ const handleClientReady = async (socket, message) => { const clientVars = { skinName: skinName, skinVariants: skinVariants, - randomVersionString: randomVersionString, + randomVersionString: randomString(4), accountPrivs: { maxRevisions: 100, }, @@ -995,8 +995,8 @@ const handleClientReady = async (socket, message) => { sofficeAvailable: sofficeAvailable(), exportAvailable: exportAvailable(), plugins: { - plugins: plugins.plugins, - parts: plugins.parts, + plugins: plugins, + parts: parts, }, indentationOnNewLine: indentationOnNewLine, scrollWhenFocusLineIsOutOfViewport: { @@ -1022,7 +1022,7 @@ const handleClientReady = async (socket, message) => { } // call the clientVars-hook so plugins can modify them before they get sent to the client - const messages = await hooks.aCallAll('clientVars', {clientVars, pad, socket}); + const messages = await aCallAll('clientVars', {clientVars, pad, socket}); // combine our old object with the new attributes from the hook for (const msg of messages) { @@ -1093,7 +1093,7 @@ const handleClientReady = async (socket, message) => { socket.json.send(msg); })); - await hooks.aCallAll('userJoin', { + await aCallAll('userJoin', { authorId: sessionInfo.author, displayName: authorName, padId: sessionInfo.padId, diff --git a/src/node/hooks/express.ts b/src/node/hooks/express.ts index 74f5834d2..61b1bf96c 100644 --- a/src/node/hooks/express.ts +++ b/src/node/hooks/express.ts @@ -10,7 +10,7 @@ import fs from "fs"; import expressSession from "express-session"; -import hooks from "../../static/js/pluginfw/hooks"; +import {aCallAll} from "../../static/js/pluginfw/hooks"; import log4js from "log4js"; @@ -52,7 +52,7 @@ const closeServer = async () => { // Call exports.server.close() to reject new connections but don't await just yet because the // Promise won't resolve until all preexisting connections are closed. const p = util.promisify(server.close.bind(server))(); - await hooks.aCallAll('expressCloseServer'); + await aCallAll('expressCloseServer'); // Give existing connections some time to close on their own before forcibly terminating. The // time should be long enough to avoid interrupting most preexisting transmissions but short // enough to avoid a noticeable outage. @@ -240,14 +240,14 @@ sessionMiddleware = expressSession({ // Give plugins an opportunity to install handlers/middleware before the express-session // middleware. This allows plugins to avoid creating an express-session record in the database // when it is not needed (e.g., public static content). - await hooks.aCallAll('expressPreSession', {app}); + await aCallAll('expressPreSession', {app}); app.use(sessionMiddleware); app.use(checkAccess2); await Promise.all([ - hooks.aCallAll('expressConfigure', {app}), - hooks.aCallAll('expressCreateServer', {app, server: server}), + aCallAll('expressConfigure', {app}), + aCallAll('expressCreateServer', {app, server: server}), ]); server.on('connection', (socket) => { sockets.add(socket); diff --git a/src/node/hooks/express/adminplugins.ts b/src/node/hooks/express/adminplugins.ts index 02a9b1939..03a62655f 100644 --- a/src/node/hooks/express/adminplugins.ts +++ b/src/node/hooks/express/adminplugins.ts @@ -3,11 +3,11 @@ import {required} from '../../eejs'; import {getEpVersion, getGitCommit} from "../../utils/Settings"; -import installer from "../../../static/js/pluginfw/installer"; +import {getAvailablePlugins, install, search, uninstall} from "../../../static/js/pluginfw/installer"; -import pluginDefs from "../../../static/js/pluginfw/plugin_defs"; +import {plugins} from "../../../static/js/pluginfw/plugin_defs"; -import plugins from "../../../static/js/pluginfw/plugins"; +import {formatHooks, formatParts, formatPlugins} from "../../../static/js/pluginfw/plugins"; import semver from "semver"; @@ -16,7 +16,7 @@ import UpdateCheck from "../../utils/UpdateCheck"; export const expressCreateServer = (hookName, args, cb) => { args.app.get('/admin/plugins', (req, res) => { res.send(required('ep_etherpad-lite/templates/admin/plugins.html', { - plugins: pluginDefs.plugins, + plugins: plugins, req, errors: [], })); @@ -29,10 +29,10 @@ export const expressCreateServer = (hookName, args, cb) => { res.send(required('ep_etherpad-lite/templates/admin/plugins-info.html', { gitCommit, epVersion, - installedPlugins: `
${plugins.formatPlugins().replace(/, /g, '\n')}
`, - installedParts: `
${plugins.formatParts()}
`, - installedServerHooks: `
${plugins.formatHooks('hooks', true)}
`, - installedClientHooks: `
${plugins.formatHooks('client_hooks', true)}
`, + installedPlugins: `
${formatPlugins().replace(/, /g, '\n')}
`, + installedParts: `
${formatParts()}
`, + installedServerHooks: `
${formatHooks('hooks', true)}
`, + installedClientHooks: `
${formatHooks('client_hooks', true)}
`, latestVersion: UpdateCheck.getLatestVersion(), req, })); @@ -50,7 +50,7 @@ export const socketio = (hookName, args, cb) => { socket.on('getInstalled', (query) => { // send currently installed plugins const installed = - Object.keys(pluginDefs.plugins).map((plugin) => pluginDefs.plugins[plugin].package); + Object.keys(plugins).map((plugin) => plugins[plugin].package); socket.emit('results:installed', {installed}); }); @@ -58,13 +58,13 @@ export const socketio = (hookName, args, cb) => { socket.on('checkUpdates', async () => { // Check plugins for updates try { - const results = await installer.getAvailablePlugins(/* maxCacheAge:*/ 60 * 10); + const results = await getAvailablePlugins(/* maxCacheAge:*/ 60 * 10); - const updatable = Object.keys(pluginDefs.plugins).filter((plugin) => { + const updatable = Object.keys(plugins).filter((plugin) => { if (!results[plugin]) return false; const latestVersion = results[plugin].version; - const currentVersion = pluginDefs.plugins[plugin].package.version; + const currentVersion = plugins[plugin].package.version; return semver.gt(latestVersion, currentVersion); }); @@ -79,7 +79,7 @@ export const socketio = (hookName, args, cb) => { socket.on('getAvailable', async (query) => { try { - const results = await installer.getAvailablePlugins(/* maxCacheAge:*/ false); + const results = await getAvailablePlugins(/* maxCacheAge:*/ false); socket.emit('results:available', results); } catch (er) { console.error(er); @@ -89,10 +89,10 @@ export const socketio = (hookName, args, cb) => { socket.on('search', async (query) => { try { - const results = await installer.search(query.searchTerm, /* maxCacheAge:*/ 60 * 10); + const results = await search(query.searchTerm, /* maxCacheAge:*/ 60 * 10); let res = Object.keys(results) .map((pluginName) => results[pluginName]) - .filter((plugin) => !pluginDefs.plugins[plugin.name]); + .filter((plugin) => !plugins[plugin.name]); res = sortPluginList(res, query.sortBy, query.sortDir) .slice(query.offset, query.offset + query.limit); socket.emit('results:search', {results: res, query}); @@ -104,7 +104,7 @@ export const socketio = (hookName, args, cb) => { }); socket.on('install', (pluginName) => { - installer.install(pluginName, (err) => { + install(pluginName, (err) => { if (err) console.warn(err.stack || err.toString()); socket.emit('finished:install', { @@ -116,7 +116,7 @@ export const socketio = (hookName, args, cb) => { }); socket.on('uninstall', (pluginName) => { - installer.uninstall(pluginName, (err) => { + uninstall(pluginName, (err) => { if (err) console.warn(err.stack || err.toString()); socket.emit('finished:uninstall', {plugin: pluginName, error: err ? err.message : null}); diff --git a/src/node/hooks/express/adminsettings.ts b/src/node/hooks/express/adminsettings.ts index b55f2d05d..404d6eefd 100644 --- a/src/node/hooks/express/adminsettings.ts +++ b/src/node/hooks/express/adminsettings.ts @@ -3,14 +3,14 @@ import {required} from '../../eejs'; import {promises as fsp} from "fs"; -import hooks from "../../../static/js/pluginfw/hooks"; +import {aCallAll} from "../../../static/js/pluginfw/hooks"; -import plugins from "../../../static/js/pluginfw/plugins"; +import {update} from "../../../static/js/pluginfw/plugins"; import {reloadSettings, settingsFilename, showSettingsInAdminPage} from "../../utils/Settings"; import * as settings from "../../utils/Settings"; -exports.expressCreateServer = (hookName, {app}) => { +export const expressCreateServer = (hookName, {app}) => { app.get('/admin/settings', (req, res) => { res.send(required('ep_etherpad-lite/templates/admin/settings.html', { req, @@ -20,7 +20,7 @@ exports.expressCreateServer = (hookName, {app}) => { }); }; -exports.socketio = (hookName, {io}) => { +export const socketio = (hookName, {io}) => { io.of('/settings').on('connection', (socket) => { const {session: {user: {is_admin: isAdmin} = {}} = {}}:SessionSocketModel = socket.conn.request; if (!isAdmin) return; @@ -50,9 +50,9 @@ exports.socketio = (hookName, {io}) => { socket.on('restartServer', async () => { console.log('Admin request to restart server through a socket on /admin/settings'); reloadSettings(); - await plugins.update(); - await hooks.aCallAll('loadSettings', {}); - await hooks.aCallAll('restartServer'); + await update(); + await aCallAll('loadSettings', {}); + await aCallAll('restartServer'); }); }); }; diff --git a/src/node/hooks/express/errorhandling.ts b/src/node/hooks/express/errorhandling.ts index 0252a6dcb..9e2992251 100644 --- a/src/node/hooks/express/errorhandling.ts +++ b/src/node/hooks/express/errorhandling.ts @@ -2,8 +2,9 @@ import {createCollection} from '../../stats'; -exports.expressCreateServer = (hook_name, args, cb) => { - exports.app = args.app; +export let app:any; +export const expressCreateServer = (hook_name, args, cb) => { + app = args.app; // Handle errors args.app.use((err, req, res, next) => { diff --git a/src/node/hooks/express/importexport.ts b/src/node/hooks/express/importexport.ts index e5d096b76..5d4101ead 100644 --- a/src/node/hooks/express/importexport.ts +++ b/src/node/hooks/express/importexport.ts @@ -10,7 +10,7 @@ import rateLimit from 'express-rate-limit'; import {checkAccess} from '../../db/SecurityManager'; import {userCanModify} from './webaccess'; -exports.expressCreateServer = (hookName, args, cb) => { +export const expressCreateServer = (hookName, args, cb) => { importExportRateLimiting.onLimitReached = (req, res, options) => { // when the rate limiter triggers, write a warning in the logs console.warn('Import/Export rate limiter triggered on ' + diff --git a/src/node/hooks/express/openapi.ts b/src/node/hooks/express/openapi.ts index 4dde98e8f..68001bce7 100644 --- a/src/node/hooks/express/openapi.ts +++ b/src/node/hooks/express/openapi.ts @@ -548,7 +548,7 @@ const generateDefinitionForVersion = (version, style = APIPathStyle.FLAT) => { return definition; }; -exports.expressPreSession = async (hookName, {app}) => { +export const expressPreSession = async (hookName, {app}) => { // create openapi-backend handlers for each api version under /api/{version}/* for (const version of Object.keys(apiHandler.version)) { // we support two different styles of api: flat + rest diff --git a/src/node/hooks/express/padurlsanitize.ts b/src/node/hooks/express/padurlsanitize.ts index 00006bca4..233f6f97c 100644 --- a/src/node/hooks/express/padurlsanitize.ts +++ b/src/node/hooks/express/padurlsanitize.ts @@ -2,7 +2,7 @@ import {isValidPadId, sanitizePadId} from '../../db/PadManager'; -exports.expressCreateServer = (hookName, args, cb) => { +export const expressCreateServer = (hookName, args, cb) => { // redirects browser to the pad's sanitized url if needed. otherwise, renders the html args.app.param('pad', (req, res, next, padId) => { (async () => { diff --git a/src/node/hooks/express/socketio.ts b/src/node/hooks/express/socketio.ts index feed1a2fb..23c262329 100644 --- a/src/node/hooks/express/socketio.ts +++ b/src/node/hooks/express/socketio.ts @@ -7,7 +7,7 @@ import proxyaddr from 'proxy-addr'; import {socketIo, socketTransportProtocols, trustProxy} from '../../utils/Settings'; import socketio from 'socket.io'; import {addComponent, setSocketIO} from '../../handler/SocketIORouter'; -import hooks from '../../../static/js/pluginfw/hooks'; +import {callAll} from '../../../static/js/pluginfw/hooks'; import * as padMessageHandler from '../../handler/PadMessageHandler'; let io; @@ -15,7 +15,7 @@ const logger = log4js.getLogger('socket.io'); const sockets = new Set(); const socketsEvents = new events.EventEmitter(); -exports.expressCloseServer = async () => { +export const expressCloseServer = async () => { if (io == null) return; logger.info('Closing socket.io engine...'); // Close the socket.io engine to disconnect existing clients and reject new clients. Don't call @@ -46,7 +46,7 @@ exports.expressCloseServer = async () => { logger.info('All socket.io clients have disconnected'); }; -exports.expressCreateServer = (hookName, args, cb) => { +export const expressCreateServer = (hookName, args, cb) => { // init socket.io and redirect all requests to the MessageHandler // there shouldn't be a browser that isn't compatible to all // transports in this list at once @@ -133,7 +133,7 @@ exports.expressCreateServer = (hookName, args, cb) => { setSocketIO(io); addComponent('pad', padMessageHandler); - hooks.callAll('socketio', {app: args.app, io, server: args.server}); + callAll('socketio', {app: args.app, io, server: args.server}); return cb(); }; diff --git a/src/node/hooks/express/specialpages.ts b/src/node/hooks/express/specialpages.ts index 8b934d297..8a21beaa8 100644 --- a/src/node/hooks/express/specialpages.ts +++ b/src/node/hooks/express/specialpages.ts @@ -5,12 +5,12 @@ import {required} from '../../eejs'; import fs from 'fs'; const fsp = fs.promises; import {} from '../../utils/toolbar'; -import hooks from '../../../static/js/pluginfw/hooks'; +import {callAll} from '../../../static/js/pluginfw/hooks'; import {favicon, getEpVersion, maxAge, root, skinName} from '../../utils/Settings'; import util from 'util'; import {userCanModify} from './webaccess'; -exports.expressPreSession = async (hookName, {app}) => { +export const expressPreSession = async (hookName, {app}) => { // This endpoint is intended to conform to: // https://www.ietf.org/archive/id/draft-inadarei-api-health-check-06.html app.get('/health', (req, res) => { @@ -63,7 +63,7 @@ exports.expressPreSession = async (hookName, {app}) => { }); }; -exports.expressCreateServer = (hookName, args, cb) => { +export const expressCreateServer = (hookName, args, cb) => { // serve index.html under / args.app.get('/', (req, res) => { res.send(required('ep_etherpad-lite/templates/index.html', {req})); @@ -74,7 +74,7 @@ exports.expressCreateServer = (hookName, args, cb) => { // The below might break for pads being rewritten const isReadOnly = !userCanModify(req.params.pad, req); - hooks.callAll('padInitToolbar', { + callAll('padInitToolbar', { toolbar, isReadOnly, }); @@ -90,7 +90,7 @@ exports.expressCreateServer = (hookName, args, cb) => { // serve timeslider.html under /p/$padname/timeslider args.app.get('/p/:pad/timeslider', (req, res, next) => { - hooks.callAll('padInitToolbar', { + callAll('padInitToolbar', { toolbar, }); diff --git a/src/node/hooks/express/tests.ts b/src/node/hooks/express/tests.ts index 3b9db80b6..5ecfef43b 100644 --- a/src/node/hooks/express/tests.ts +++ b/src/node/hooks/express/tests.ts @@ -3,7 +3,7 @@ import path from 'path'; import {promises as fsp} from "fs"; -import plugins from "../../../static/js/pluginfw/plugin_defs"; +import {plugins} from "../../../static/js/pluginfw/plugin_defs"; import sanitizePathname from "../../utils/sanitizePathname"; @@ -36,7 +36,7 @@ export const expressPreSession = async (hookName, {app}) => { app.get('/tests/frontend/frontendTestSpecs.json', (req, res, next) => { (async () => { const modules = []; - await Promise.all(Object.entries(plugins.plugins).map(async ([plugin, def]) => { + await Promise.all(Object.entries(plugins).map(async ([plugin, def]) => { const mappedDef = def as Presession; let {package: {path: pluginPath}} = mappedDef; if (!pluginPath.endsWith(path.sep)) pluginPath += path.sep; diff --git a/src/node/hooks/express/webaccess.ts b/src/node/hooks/express/webaccess.ts index 58ecdace2..4aac30643 100644 --- a/src/node/hooks/express/webaccess.ts +++ b/src/node/hooks/express/webaccess.ts @@ -6,17 +6,18 @@ import log4js from "log4js"; import {requireAuthentication, requireAuthorization, setUsers, users} from "../../utils/Settings"; -import hooks from "../../../static/js/pluginfw/hooks"; +import {deprecationNotices} from "../../../static/js/pluginfw/hooks"; import {getPadId, isReadOnlyId} from "../../db/ReadOnlyManager"; import {UserIndexedModel} from "../../models/UserIndexedModel"; const httpLogger = log4js.getLogger('http'); -hooks.deprecationNotices.authFailure = 'use the authnFailure and authzFailure hooks instead'; +deprecationNotices.authFailure = 'use the authnFailure and authzFailure hooks instead'; // Promisified wrapper around hooks.aCallFirst. const aCallFirst = (hookName, context, pred = null) => new Promise((resolve, reject) => { - hooks.aCallFirst(hookName, context, (err, r) => err != null ? reject(err) : resolve(r), pred); + // FIXME Why are there 4 arguments but only 3 parameters? + aCallFirst(hookName, context, (err, r) => err != null ? reject(err) : resolve(r)); }); const aCallFirst0 = diff --git a/src/node/hooks/i18n.ts b/src/node/hooks/i18n.ts index f6bf38f70..7ce55f744 100644 --- a/src/node/hooks/i18n.ts +++ b/src/node/hooks/i18n.ts @@ -4,7 +4,7 @@ import languages from 'languages4translatewiki'; import fs from 'fs'; import path from 'path'; import _ from 'underscore'; -import pluginDefs from '../../static/js/pluginfw/plugin_defs.js'; +import {plugins} from '../../static/js/pluginfw/plugin_defs.js'; import {check} from '../utils/path_exists'; import {customLocaleStrings, maxAge, root} from '../utils/Settings'; import {Presession} from "../models/Presession"; @@ -41,7 +41,7 @@ const getAllLocales = () => { extractLangs(path.join(root, 'src/locales')); // add plugins languages (if any) - for (const val of Object.values(pluginDefs.plugins)) { + for (const val of Object.values(plugins)) { const pluginPath:Presession = val as Presession // plugin locales should overwrite etherpad's core locales if (pluginPath.package.path.endsWith('/ep_etherpad-lite') === true) continue; @@ -86,7 +86,7 @@ const getAllLocales = () => { // returns a hash of all available languages availables with nativeName and direction // e.g. { es: {nativeName: "espaƱol", direction: "ltr"}, ... } -const getAvailableLangs = (locales) => { +export const getAvailableLangs = (locales) => { const result = {}; for (const langcode of Object.keys(locales)) { result[langcode] = languages.getLanguageInfo(langcode); @@ -104,16 +104,16 @@ const generateLocaleIndex = (locales) => { }; -exports.expressPreSession = async (hookName, {app}) => { +export const expressPreSession = async (hookName, {app}) => { // regenerate locales on server restart const locales = getAllLocales(); const localeIndex = generateLocaleIndex(locales); - exports.availableLangs = getAvailableLangs(locales); + let availableLangs = getAvailableLangs(locales); app.get('/locales/:locale', (req, res) => { // works with /locale/en and /locale/en.json requests const locale = req.params.locale.split('.')[0]; - if (Object.prototype.hasOwnProperty.call(exports.availableLangs, locale)) { + if (Object.prototype.hasOwnProperty.call(availableLangs, locale)) { res.setHeader('Cache-Control', `public, max-age=${maxAge}`); res.setHeader('Content-Type', 'application/json; charset=utf-8'); res.send(`{"${locale}":${JSON.stringify(locales[locale])}}`); diff --git a/src/node/models/CMDArgv.ts b/src/node/models/CMDArgv.ts new file mode 100644 index 000000000..9e663cfa7 --- /dev/null +++ b/src/node/models/CMDArgv.ts @@ -0,0 +1,3 @@ +export type CMDArgv = { + [key: string]: any +} diff --git a/src/node/utils/Abiword.ts b/src/node/utils/Abiword.ts index b83fc6a3d..90cd88bdd 100644 --- a/src/node/utils/Abiword.ts +++ b/src/node/utils/Abiword.ts @@ -25,10 +25,12 @@ import async from 'async'; import {abiword} from './Settings'; import os from 'os'; +export let convertFile; + // on windows we have to spawn a process for each convertion, // cause the plugin abicommand doesn't exist on this platform if (os.type().indexOf('Windows') > -1) { - exports.convertFile = async (srcFile, destFile, type) => { + convertFile = async (srcFile, destFile, type) => { const abiword2 = spawn(abiword, [`--to=${destFile}`, srcFile]); let stdoutBuffer = ''; abiword2.stdout.on('data', (data) => { stdoutBuffer += data.toString(); }); @@ -85,7 +87,7 @@ if (os.type().indexOf('Windows') > -1) { }; }, 1); - exports.convertFile = async (srcFile, destFile, type) => { + convertFile = async (srcFile, destFile, type) => { await queue.pushAsync({srcFile, destFile, type}); }; } diff --git a/src/node/utils/Cli.ts b/src/node/utils/Cli.ts index 946fd66ca..260478cce 100644 --- a/src/node/utils/Cli.ts +++ b/src/node/utils/Cli.ts @@ -21,32 +21,35 @@ */ // An object containing the parsed command-line options -export const argv = process.argv.slice(2); +import {CMDArgv} from "../models/CMDArgv"; -let arg, prevArg; +const argvcmd = process.argv.slice(2); +let arg, prevArg + +export const argv:CMDArgv|undefined = {}; // Loop through args -for (let i = 0; i < argv.length; i++) { +for (let i = 0; i < argvcmd.length; i++) { arg = argv[i]; // Override location of settings.json file if (prevArg === '--settings' || prevArg === '-s') { - exports.argv.settings = arg; + argv.settings = arg; } // Override location of credentials.json file if (prevArg === '--credentials') { - exports.argv.credentials = arg; + argv.credentials = arg; } // Override location of settings.json file if (prevArg === '--sessionkey') { - exports.argv.sessionkey = arg; + argv.sessionkey = arg; } // Override location of settings.json file if (prevArg === '--apikey') { - exports.argv.apikey = arg; + argv.apikey = arg; } prevArg = arg; diff --git a/src/node/utils/ExportEtherpad.ts b/src/node/utils/ExportEtherpad.ts index d548590bd..c20741840 100644 --- a/src/node/utils/ExportEtherpad.ts +++ b/src/node/utils/ExportEtherpad.ts @@ -20,7 +20,7 @@ import {strict as assert} from "assert"; import {getAuthor} from "../db/AuthorManager"; -import hooks from "../../static/js/pluginfw/hooks"; +import {aCallAll} from "../../static/js/pluginfw/hooks"; import {getPad} from "../db/PadManager"; @@ -28,7 +28,7 @@ export const getPadRaw = async (padId, readOnlyId) => { const dstPfx = `pad:${readOnlyId || padId}`; const [pad, customPrefixes] = await Promise.all([ getPad(padId), - hooks.aCallAll('exportEtherpadAdditionalContent'), + aCallAll('exportEtherpadAdditionalContent'), ]); const pluginRecords = await Promise.all(customPrefixes.map(async (customPrefix) => { const srcPfx = `${customPrefix}:${padId}`; @@ -58,7 +58,7 @@ export const getPadRaw = async (padId, readOnlyId) => { })(); const data = {[dstPfx]: pad}; for (const [dstKey, p] of new Stream(records).batch(100).buffer(99)) data[dstKey] = await p; - await hooks.aCallAll('exportEtherpad', { + await aCallAll('exportEtherpad', { pad, data, dstPadId: readOnlyId || padId, diff --git a/src/node/utils/ExportHtml.ts b/src/node/utils/ExportHtml.ts index c8a7d6884..8ec4fc104 100644 --- a/src/node/utils/ExportHtml.ts +++ b/src/node/utils/ExportHtml.ts @@ -23,7 +23,7 @@ import {getPad} from "../db/PadManager"; import _ from "underscore"; import Security from '../../static/js/security'; -import hooks from '../../static/js/pluginfw/hooks'; +import {aCallAll} from '../../static/js/pluginfw/hooks'; import {required} from '../eejs'; import {_analyzeLine, _encodeWhitespace} from "./ExportHelper"; @@ -51,7 +51,7 @@ export const getHTMLFromAtext = async (pad, atext, authorColors?) => { await Promise.all([ // prepare tags stored as ['tag', true] to be exported - hooks.aCallAll('exportHtmlAdditionalTags', pad).then((newProps) => { + aCallAll('exportHtmlAdditionalTags', pad).then((newProps) => { newProps.forEach((prop) => { tags.push(prop); props.push(prop); @@ -59,7 +59,7 @@ export const getHTMLFromAtext = async (pad, atext, authorColors?) => { }), // prepare tags stored as ['tag', 'value'] to be exported. This will generate HTML with tags // like - hooks.aCallAll('exportHtmlAdditionalTagsWithData', pad).then((newProps) => { + aCallAll('exportHtmlAdditionalTagsWithData', pad).then((newProps) => { newProps.forEach((prop) => { tags.push(`span data-${prop[0]}="${prop[1]}"`); props.push(prop); @@ -314,7 +314,7 @@ export const getHTMLFromAtext = async (pad, atext, authorColors?) => { if (i < textLines.length) { nextLine = _analyzeLine(textLines[i + 1], attribLines[i + 1], apool); } - await hooks.aCallAll('getLineHTMLForExport', context); + await aCallAll('getLineHTMLForExport', context); // To create list parent elements if ((!prevLine || prevLine.listLevel !== line.listLevel) || (line.listTypeName !== prevLine.listTypeName)) { @@ -451,7 +451,7 @@ export const getHTMLFromAtext = async (pad, atext, authorColors?) => { padId: pad.id, }; - await hooks.aCallAll('getLineHTMLForExport', context); + await aCallAll('getLineHTMLForExport', context); pieces.push(context.lineContent, '
'); } } @@ -464,14 +464,14 @@ export const getPadHTMLDocument = async (padId, revNum, readOnlyId?) => { // Include some Styles into the Head for Export let stylesForExportCSS = ''; - const stylesForExport = await hooks.aCallAll('stylesForExport', padId); + const stylesForExport = await aCallAll('stylesForExport', padId); stylesForExport.forEach((css) => { stylesForExportCSS += css; }); let html = await getPadHTML(pad, revNum); - for (const hookHtml of await hooks.aCallAll('exportHTMLAdditionalContent', {padId})) { + for (const hookHtml of await aCallAll('exportHTMLAdditionalContent', {padId})) { html += hookHtml; } diff --git a/src/node/utils/ImportEtherpad.ts b/src/node/utils/ImportEtherpad.ts index 09dca8ecd..925815991 100644 --- a/src/node/utils/ImportEtherpad.ts +++ b/src/node/utils/ImportEtherpad.ts @@ -21,7 +21,7 @@ import {Pad} from '../db/Pad'; import {Stream} from './Stream'; import {addPad, doesAuthorExist} from '../db/AuthorManager'; import {db} from '../db/DB'; -import hooks from '../../static/js/pluginfw/hooks'; +import {aCallAll, callAll} from '../../static/js/pluginfw/hooks'; import log4js from "log4js"; import {supportedElems} from "../../static/js/contentcollector"; @@ -34,14 +34,14 @@ export const setPadRaw = async (padId, r, authorId = '') => { const records = JSON.parse(r); // get supported block Elements from plugins, we will use this later. - hooks.callAll('ccRegisterBlockElements').forEach((element) => { + callAll('ccRegisterBlockElements').forEach((element) => { supportedElems.add(element); }); // DB key prefixes for pad records. Each key is expected to have the form `${prefix}:${padId}` or // `${prefix}:${padId}:${otherstuff}`. const padKeyPrefixes = [ - ...await hooks.aCallAll('exportEtherpadAdditionalContent'), + ...await aCallAll('exportEtherpadAdditionalContent'), 'pad', ]; @@ -103,7 +103,7 @@ export const setPadRaw = async (padId, r, authorId = '') => { const pad = new Pad(padId, padDb); await pad.init(null, authorId); - await hooks.aCallAll('importEtherpad', { + await aCallAll('importEtherpad', { pad, // Shallow freeze meant to prevent accidental bugs. It would be better to deep freeze, but // it's not worth the added complexity. diff --git a/src/node/utils/Minify.ts b/src/node/utils/Minify.ts index 03a7a403e..830bd9c1b 100644 --- a/src/node/utils/Minify.ts +++ b/src/node/utils/Minify.ts @@ -26,7 +26,7 @@ import {promises as fs} from "fs"; import path from "path"; -import plugins from "../../static/js/pluginfw/plugin_defs"; +import {plugins} from "../../static/js/pluginfw/plugin_defs"; import RequireKernel from "etherpad-require-kernel"; @@ -155,8 +155,8 @@ const minify = async (req, res) => { const library = match[1]; const libraryPath = match[2] || ''; - if (plugins.plugins[library] && match[3]) { - const plugin = plugins.plugins[library]; + if (plugins[library] && match[3]) { + const plugin = plugins[library]; const pluginPath = plugin.package.realPath; filename = path.join(pluginPath, libraryPath); // On Windows, path.relative converts forward slashes to backslashes. Convert them back diff --git a/src/node/utils/Settings.ts b/src/node/utils/Settings.ts index 2813e5030..a50597469 100644 --- a/src/node/utils/Settings.ts +++ b/src/node/utils/Settings.ts @@ -29,19 +29,20 @@ import exp from "constants"; -const absolutePaths = require('./AbsolutePaths'); -const deepEqual = require('fast-deep-equal/es6'); +import {findEtherpadRoot, makeAbsolute, isSubdir} from './AbsolutePaths'; +import deepEqual from 'fast-deep-equal/es6'; import fs from 'fs'; import os from 'os'; import path from 'path'; -const argv = require('./Cli').argv; import jsonminify from 'jsonminify'; import log4js from 'log4js'; import {LogLevel} from "../models/LogLevel"; -const randomString = require('./randomstring'); +import {argv} from "./Cli"; + +import {randomString} from './randomstring'; const suppressDisableMsg = ' -- To suppress these warning messages change ' + 'suppressErrorsInPadText to true in your settings.json\n'; -const _ = require('underscore'); +import _ from 'underscore'; const logger = log4js.getLogger('settings'); @@ -53,7 +54,10 @@ const nonSettings = [ // This is a function to make it easy to create a new instance. It is important to not reuse a // config object after passing it to log4js.configure() because that method mutates the object. :( -const defaultLogConfig = () => ({appenders: [{type: 'console'}]}); +const defaultLogConfig = () => ({appenders: { console: { type: 'console' } }, +categories:{ + default: { appenders: ['console'], level: 'info'} +}}); const defaultLogLevel = 'INFO'; const initLogging = (logLevel, config) => { @@ -71,11 +75,11 @@ const initLogging = (logLevel, config) => { initLogging(defaultLogLevel, defaultLogConfig()); /* Root path of the installation */ -export const root = absolutePaths.findEtherpadRoot(); +export const root = findEtherpadRoot(); logger.info('All relative paths will be interpreted relative to the identified ' + `Etherpad base dir: ${root}`); -export const settingsFilename = absolutePaths.makeAbsolute(argv.settings || 'settings.json'); -export const credentialsFilename = absolutePaths.makeAbsolute(argv.credentials || 'credentials.json'); +export const settingsFilename = makeAbsolute(argv.settings || 'settings.json'); +export const credentialsFilename = makeAbsolute(argv.credentials || 'credentials.json'); /** * The app title, visible e.g. in the browser window @@ -737,9 +741,7 @@ const parseSettings = (settingsFilename: string, isSettings:boolean) => { process.exit(1); } -}; - -export const randomVersionString = randomString(4); +} export const reloadSettings = () => { @@ -772,7 +774,7 @@ export const reloadSettings = () => { let skinPath = path.join(skinBasePath, skinName); // what if someone sets skinName == ".." or "."? We catch him! - if (absolutePaths.isSubdir(skinBasePath, skinPath) === false) { + if (isSubdir(skinBasePath, skinPath) === false) { logger.error(`Skin path ${skinPath} must be a subdirectory of ${skinBasePath}. ` + 'Falling back to the default "colibris".'); @@ -821,7 +823,7 @@ export const reloadSettings = () => { } if (!sessionKey) { - const sessionkeyFilename = absolutePaths.makeAbsolute(argv.sessionkey || './SESSIONKEY.txt'); + const sessionkeyFilename = makeAbsolute(argv.sessionkey || './SESSIONKEY.txt'); try { sessionKey = fs.readFileSync(sessionkeyFilename, 'utf8'); logger.info(`Session key loaded from: ${sessionkeyFilename}`); @@ -846,7 +848,7 @@ export const reloadSettings = () => { defaultPadText += `\nWarning: ${dirtyWarning}${suppressDisableMsg}`; } - dbSettings.filename = absolutePaths.makeAbsolute(dbSettings.filename); + dbSettings.filename = makeAbsolute(dbSettings.filename); logger.warn(`${dirtyWarning} File location: ${dbSettings.filename}`); } @@ -867,10 +869,12 @@ export const reloadSettings = () => { * ACHTUNG: this may prevent caching HTTP proxies to work * TODO: remove the "?v=randomstring" parameter, and replace with hashed filenames instead */ - logger.info(`Random string used for versioning assets: ${randomVersionString}`); + const randomVersionStringWith4Chars = randomString(4); + logger.info(`Random string used for versioning assets: ${randomVersionStringWith4Chars}`); + return settings }; -exports.exportedForTestingOnly = { +export const exportedForTestingOnly = { parseSettings, }; diff --git a/src/node/utils/TidyHtml.ts b/src/node/utils/TidyHtml.ts index cbedc8056..56fa68972 100644 --- a/src/node/utils/TidyHtml.ts +++ b/src/node/utils/TidyHtml.ts @@ -8,7 +8,7 @@ import {tidyHtml} from "./Settings"; import {spawn} from "child_process"; -exports.tidy = (srcFile) => { +export const tidy = (srcFile) => { const logger = log4js.getLogger('TidyHtml'); return new Promise((resolve, reject) => { diff --git a/src/node/utils/UpdateCheck.ts b/src/node/utils/UpdateCheck.ts index d20219b28..de18d2f17 100644 --- a/src/node/utils/UpdateCheck.ts +++ b/src/node/utils/UpdateCheck.ts @@ -28,7 +28,7 @@ const loadEtherpadInformations = () => new Promise((resolve, reject) }); const getLatestVersion = () => { - exports.needsUpdate(); + needsUpdate(); if(infos === undefined){ throw new Error("Could not retrieve latest version") } @@ -36,7 +36,7 @@ const getLatestVersion = () => { return infos.latestVersion; } -exports.needsUpdate = (cb?:(arg0: boolean)=>void) => { +export const needsUpdate = (cb?:(arg0: boolean)=>void) => { loadEtherpadInformations().then((info) => { if (semver.gt(info.latestVersion, getEpVersion())) { if (cb) return cb(true); diff --git a/src/node/utils/customError.ts b/src/node/utils/customError.ts index 79cbbd47c..b90946f65 100644 --- a/src/node/utils/customError.ts +++ b/src/node/utils/customError.ts @@ -10,6 +10,7 @@ export class CustomError extends Error { code: any; signal: any; + easysync: boolean /** * Creates an instance of CustomError. * @param {*} message diff --git a/src/node/utils/padDiff.ts b/src/node/utils/padDiff.ts index da8ff6877..88dd3d4b4 100644 --- a/src/node/utils/padDiff.ts +++ b/src/node/utils/padDiff.ts @@ -254,7 +254,7 @@ PadDiff.prototype._createDeletionChangeset = function (cs, startAText, apool) { // They include final newlines on lines. const linesGet = (idx) => { - if (lines.get) { + if ("get" in lines && lines.get instanceof Function) { return lines.get(idx); } else { return lines[idx]; @@ -262,7 +262,7 @@ PadDiff.prototype._createDeletionChangeset = function (cs, startAText, apool) { }; const aLinesGet = (idx) => { - if (alines.get) { + if ("get" in alines && alines.get instanceof Function) { return alines.get(idx); } else { return alines[idx]; diff --git a/src/node/utils/run_cmd.ts b/src/node/utils/run_cmd.ts index 716e528b4..b98cb9b45 100644 --- a/src/node/utils/run_cmd.ts +++ b/src/node/utils/run_cmd.ts @@ -69,7 +69,7 @@ const logLines = (readable, logLineFn) => { * - `stderr`: Similar to `stdout` but for stderr. * - `child`: The ChildProcess object. */ -export const exportCMD: (args: string[], opts:CMDOptions)=>void = async (args, opts = { +export const exportCMD: (args: string[], opts?:CMDOptions)=>void = async (args, opts = { cwd: undefined, stdio: undefined, env: undefined diff --git a/src/package-lock.json b/src/package-lock.json index dd27c26e2..618ce284a 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -10,6 +10,7 @@ "license": "Apache-2.0", "dependencies": { "async": "^3.2.2", + "cjstoesm": "^2.1.2", "clean-css": "^5.3.2", "cookie-parser": "^1.4.6", "cross-spawn": "^7.0.3", @@ -854,7 +855,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -867,7 +867,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -876,7 +875,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1538,6 +1536,14 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, + "node_modules/@wessberg/stringutil": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/@wessberg/stringutil/-/stringutil-1.0.19.tgz", + "integrity": "sha512-9AZHVXWlpN8Cn9k5BC/O0Dzb9E9xfEMXzYrNunwvkUTvuK7xgQPVRZpLo+jWCOZ5r8oBa8NIrHuPEu1hzbb6bg==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@xmldom/xmldom": { "version": "0.8.8", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.8.tgz", @@ -2158,7 +2164,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -2455,6 +2460,47 @@ "node": ">=10" } }, + "node_modules/cjstoesm": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cjstoesm/-/cjstoesm-2.1.2.tgz", + "integrity": "sha512-zAbvVcY+HSxy4tTRfskV7DEK7l8nJTjpO9wuQumUu48JWBezqNgt7p9CFe3KACZJtHk8BJECSvl3ccV1qYT2RA==", + "dependencies": { + "@wessberg/stringutil": "^1.0.19", + "ansi-colors": "^4.1.3", + "commander": "^9.3.0", + "compatfactory": "^1.0.1", + "crosspath": "^2.0.0", + "fast-glob": "^3.2.11", + "helpertypes": "^0.0.18", + "reserved-words": "^0.1.2", + "resolve": "^1.22.0" + }, + "bin": { + "cjstoesm": "bin/cjstoesm.js" + }, + "engines": { + "node": ">=14.9.0" + }, + "peerDependencies": { + "typescript": ">=3.2.x || >= 4.x" + } + }, + "node_modules/cjstoesm/node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cjstoesm/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/clean-css": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", @@ -2578,6 +2624,20 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "node_modules/compatfactory": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/compatfactory/-/compatfactory-1.0.1.tgz", + "integrity": "sha512-hR9u0HSZTKDNNchPtMHg6myeNx0XO+av7UZIJPsi4rPALJBHi/W5Mbwi19hC/xm6y3JkYpxVYjTqnSGsU5X/iw==", + "dependencies": { + "helpertypes": "^0.0.18" + }, + "engines": { + "node": ">=14.9.0" + }, + "peerDependencies": { + "typescript": ">=3.x || >= 4.x" + } + }, "node_modules/component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", @@ -2773,6 +2833,22 @@ "node": ">= 8" } }, + "node_modules/crosspath": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crosspath/-/crosspath-2.0.0.tgz", + "integrity": "sha512-ju88BYCQ2uvjO2bR+SsgLSTwTSctU+6Vp2ePbKPgSCZyy4MWZxYsT738DlKVRE5utUjobjPRm1MkTYKJxCmpTA==", + "dependencies": { + "@types/node": "^17.0.36" + }, + "engines": { + "node": ">=14.9.0" + } + }, + "node_modules/crosspath/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, "node_modules/css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", @@ -4550,17 +4626,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/abbrev": { "version": "1.1.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/agent-base": { "version": "4.3.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "es6-promisify": "^5.0.0" }, @@ -4570,10 +4644,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/agentkeepalive": { "version": "3.5.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "humanize-ms": "^1.2.1" }, @@ -4583,30 +4656,27 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/ansi-align": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "string-width": "^2.0.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/ansi-regex": { "version": "2.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/ansi-styles": { "version": "3.2.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -4616,38 +4686,33 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/ansicolors": { "version": "0.3.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/ansistyles": { "version": "0.1.3", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/aproba": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/archy": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/are-we-there-yet": { "version": "1.1.4", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -4655,10 +4720,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/are-we-there-yet/node_modules/readable-stream": { "version": "2.3.6", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -4671,89 +4735,78 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/are-we-there-yet/node_modules/string_decoder": { "version": "1.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/asap": { "version": "2.0.6", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/asn1": { "version": "0.2.4", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": "~2.1.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/assert-plus": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/asynckit": { "version": "0.4.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/aws-sign2": { "version": "0.7.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "*" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/aws4": { "version": "1.8.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/balanced-match": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/bcrypt-pbkdf": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "BSD-3-Clause", - "optional": true, - "peer": true, "dependencies": { "tweetnacl": "^0.14.3" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/bin-links": { "version": "1.1.8", - "dev": true, + "extraneous": true, "inBundle": true, "license": "Artistic-2.0", - "peer": true, "dependencies": { "bluebird": "^3.5.3", "cmd-shim": "^3.0.0", @@ -4765,17 +4818,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/bluebird": { "version": "3.5.5", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/boxen": { "version": "1.3.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-align": "^2.0.0", "camelcase": "^4.0.0", @@ -4791,10 +4842,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/brace-expansion": { "version": "1.1.11", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4802,44 +4852,39 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/buffer-from": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/builtins": { "version": "1.0.3", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/byline": { "version": "5.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/byte-size": { "version": "5.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6.0.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/cacache": { "version": "12.0.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "bluebird": "^3.5.5", "chownr": "^1.1.1", @@ -4860,44 +4905,39 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/call-limit": { "version": "1.1.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/camelcase": { "version": "4.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/capture-stack-trace": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/caseless": { "version": "0.12.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/chalk": { "version": "2.4.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -4909,24 +4949,21 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/chownr": { "version": "1.1.4", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/ci-info": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/cidr-regex": { "version": "2.0.10", - "dev": true, + "extraneous": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "ip-regex": "^2.1.0" }, @@ -4936,20 +4973,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/cli-boxes": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/cli-columns": { "version": "3.1.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "string-width": "^2.0.0", "strip-ansi": "^3.0.1" @@ -4960,10 +4995,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/cli-table3": { "version": "0.5.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "object-assign": "^4.1.0", "string-width": "^2.1.1" @@ -4977,10 +5011,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/cliui": { "version": "5.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", @@ -4989,30 +5022,27 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/cliui/node_modules/ansi-regex": { "version": "4.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/cliui/node_modules/string-width": { "version": "3.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -5024,10 +5054,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/cliui/node_modules/strip-ansi": { "version": "5.2.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -5037,20 +5066,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/clone": { "version": "1.0.4", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/cmd-shim": { "version": "3.0.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "mkdirp": "~0.5.0" @@ -5058,48 +5085,42 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/code-point-at": { "version": "1.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/color-convert": { "version": "1.9.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "^1.1.1" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/color-name": { "version": "1.1.3", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/colors": { "version": "1.3.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=0.1.90" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/columnify": { "version": "1.5.4", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "strip-ansi": "^3.0.0", "wcwidth": "^1.0.0" @@ -5107,10 +5128,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/combined-stream": { "version": "1.0.6", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -5120,20 +5140,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/concat-map": { "version": "0.0.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/concat-stream": { "version": "1.6.2", - "dev": true, "engines": [ "node >= 0.8" ], + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -5143,10 +5161,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/concat-stream/node_modules/readable-stream": { "version": "2.3.6", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5159,19 +5176,17 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/config-chain": { "version": "1.1.12", - "dev": true, + "extraneous": true, "inBundle": true, - "peer": true, "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -5179,10 +5194,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/configstore": { "version": "3.1.5", - "dev": true, + "extraneous": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "dot-prop": "^4.2.1", "graceful-fs": "^4.1.2", @@ -5197,17 +5211,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/console-control-strings": { "version": "1.1.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/copy-concurrently": { "version": "1.0.5", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -5219,31 +5231,27 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/copy-concurrently/node_modules/aproba": { "version": "1.2.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/copy-concurrently/node_modules/iferr": { "version": "0.1.5", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/core-util-is": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/create-error-class": { "version": "3.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "capture-stack-trace": "^1.0.0" }, @@ -5253,10 +5261,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/cross-spawn": { "version": "5.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", @@ -5265,10 +5272,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/cross-spawn/node_modules/lru-cache": { "version": "4.1.5", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -5276,33 +5282,29 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/cross-spawn/node_modules/yallist": { "version": "2.1.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/crypto-random-string": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/cyclist": { "version": "0.2.2", - "dev": true, - "inBundle": true, - "peer": true + "extraneous": true, + "inBundle": true }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/dashdash": { "version": "1.14.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "assert-plus": "^1.0.0" }, @@ -5312,77 +5314,69 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/debug": { "version": "3.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/debuglog": { "version": "1.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": "*" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/decamelize": { "version": "1.2.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/decode-uri-component": { "version": "0.2.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/deep-extend": { "version": "0.6.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4.0.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/defaults": { "version": "1.0.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "clone": "^1.0.2" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/define-properties": { "version": "1.1.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "object-keys": "^1.0.12" }, @@ -5392,47 +5386,42 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/delayed-stream": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.4.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/delegates": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/detect-indent": { "version": "5.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/detect-newline": { "version": "2.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/dezalgo": { "version": "1.0.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "asap": "^2.0.0", "wrappy": "1" @@ -5440,10 +5429,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/dot-prop": { "version": "4.2.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "is-obj": "^1.0.0" }, @@ -5453,27 +5441,24 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/dotenv": { "version": "5.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=4.6.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/duplexer3": { "version": "0.1.4", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/duplexify": { "version": "3.6.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -5483,10 +5468,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/duplexify/node_modules/readable-stream": { "version": "2.3.6", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5499,21 +5483,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/duplexify/node_modules/string_decoder": { "version": "1.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/ecc-jsbn": { "version": "0.1.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -5521,61 +5502,54 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/editor": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/emoji-regex": { "version": "7.0.3", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/encoding": { "version": "0.1.12", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "iconv-lite": "~0.4.13" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/end-of-stream": { "version": "1.4.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "once": "^1.4.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/env-paths": { "version": "2.2.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/err-code": { "version": "1.1.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/errno": { "version": "0.1.7", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "prr": "~1.0.1" }, @@ -5585,10 +5559,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/es-abstract": { "version": "1.12.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "es-to-primitive": "^1.1.1", "function-bind": "^1.1.1", @@ -5602,10 +5575,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/es-to-primitive": { "version": "1.2.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -5617,37 +5589,33 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/es6-promise": { "version": "4.2.8", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/es6-promisify": { "version": "5.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "es6-promise": "^4.0.3" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/escape-string-regexp": { "version": "1.0.5", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/execa": { "version": "0.7.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^5.0.1", "get-stream": "^3.0.0", @@ -5663,58 +5631,51 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/execa/node_modules/get-stream": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/extend": { "version": "3.0.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/extsprintf": { "version": "1.3.0", - "dev": true, "engines": [ "node >=0.6.0" ], + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/fast-json-stable-stringify": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/figgy-pudding": { "version": "3.5.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/find-npm-prefix": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/flush-write-stream": { "version": "1.0.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.4" @@ -5722,10 +5683,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/flush-write-stream/node_modules/readable-stream": { "version": "2.3.6", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5738,30 +5698,27 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/flush-write-stream/node_modules/string_decoder": { "version": "1.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/forever-agent": { "version": "0.6.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "*" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/form-data": { "version": "2.3.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "1.0.6", @@ -5773,10 +5730,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/from2": { "version": "2.3.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -5784,10 +5740,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/from2/node_modules/readable-stream": { "version": "2.3.6", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5800,30 +5755,27 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/from2/node_modules/string_decoder": { "version": "1.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/fs-minipass": { "version": "1.2.7", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^2.6.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/fs-minipass/node_modules/minipass": { "version": "2.9.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -5831,10 +5783,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/fs-vacuum": { "version": "1.2.10", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "path-is-inside": "^1.0.1", @@ -5843,10 +5794,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/fs-write-stream-atomic": { "version": "1.0.10", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -5856,17 +5806,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/fs-write-stream-atomic/node_modules/iferr": { "version": "0.1.5", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/fs-write-stream-atomic/node_modules/readable-stream": { "version": "2.3.6", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5879,34 +5827,30 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/fs-write-stream-atomic/node_modules/string_decoder": { "version": "1.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/fs.realpath": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/function-bind": { "version": "1.1.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/gauge": { "version": "2.7.4", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -5920,17 +5864,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/gauge/node_modules/aproba": { "version": "1.2.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/gauge/node_modules/string-width": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5942,17 +5884,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/genfun": { "version": "5.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/gentle-fs": { "version": "2.3.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "Artistic-2.0", - "peer": true, "dependencies": { "aproba": "^1.1.2", "chownr": "^1.1.2", @@ -5969,34 +5909,30 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/gentle-fs/node_modules/aproba": { "version": "1.2.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/gentle-fs/node_modules/iferr": { "version": "0.1.5", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/get-caller-file": { "version": "2.0.5", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/get-stream": { "version": "4.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "pump": "^3.0.0" }, @@ -6006,20 +5942,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/getpass": { "version": "0.1.7", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "assert-plus": "^1.0.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/glob": { "version": "7.1.6", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6037,10 +5971,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/global-dirs": { "version": "0.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ini": "^1.3.4" }, @@ -6050,10 +5983,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/got": { "version": "6.7.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "create-error-class": "^3.0.0", "duplexer3": "^0.1.4", @@ -6073,27 +6005,24 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/got/node_modules/get-stream": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/graceful-fs": { "version": "4.2.4", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/har-schema": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": ">=4" } @@ -6101,10 +6030,9 @@ "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/har-validator": { "version": "5.1.5", "deprecated": "this library is no longer supported", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -6115,10 +6043,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/har-validator/node_modules/ajv": { "version": "6.12.6", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6132,24 +6059,21 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/har-validator/node_modules/fast-deep-equal": { "version": "3.1.3", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/har-validator/node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/has": { "version": "1.0.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -6159,51 +6083,45 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/has-flag": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/has-symbols": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/has-unicode": { "version": "2.0.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/hosted-git-info": { "version": "2.8.9", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/http-cache-semantics": { "version": "3.8.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/http-proxy-agent": { "version": "2.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "agent-base": "4", "debug": "3.1.0" @@ -6214,10 +6132,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/http-signature": { "version": "1.2.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -6230,10 +6147,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/https-proxy-agent": { "version": "2.2.4", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "agent-base": "^4.3.0", "debug": "^3.1.0" @@ -6244,20 +6160,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/humanize-ms": { "version": "1.2.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.0.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/iconv-lite": { "version": "0.4.23", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -6267,57 +6181,51 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/iferr": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6.0.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/ignore-walk": { "version": "3.0.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minimatch": "^3.0.4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/import-lazy": { "version": "2.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/imurmurhash": { "version": "0.1.4", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.19" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/infer-owner": { "version": "1.0.4", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/inflight": { "version": "1.0.6", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -6325,24 +6233,21 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/inherits": { "version": "2.0.4", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/ini": { "version": "1.3.8", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/init-package-json": { "version": "1.10.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "glob": "^7.1.1", "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", @@ -6356,37 +6261,33 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/ip": { "version": "1.1.5", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/ip-regex": { "version": "2.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/is-callable": { "version": "1.1.4", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/is-ci": { "version": "1.2.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ci-info": "^1.5.0" }, @@ -6396,17 +6297,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/is-ci/node_modules/ci-info": { "version": "1.6.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/is-cidr": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "cidr-regex": "^2.0.10" }, @@ -6416,20 +6315,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/is-date-object": { "version": "1.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/is-fullwidth-code-point": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "number-is-nan": "^1.0.0" }, @@ -6439,10 +6336,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/is-installed-globally": { "version": "0.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "global-dirs": "^0.1.0", "is-path-inside": "^1.0.0" @@ -6453,30 +6349,27 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/is-npm": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/is-obj": { "version": "1.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/is-path-inside": { "version": "1.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "path-is-inside": "^1.0.1" }, @@ -6486,20 +6379,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/is-redirect": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/is-regex": { "version": "1.0.4", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "has": "^1.0.1" }, @@ -6509,30 +6400,27 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/is-retry-allowed": { "version": "1.2.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/is-stream": { "version": "1.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/is-symbol": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "has-symbols": "^1.0.0" }, @@ -6542,76 +6430,65 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/is-typedarray": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/isarray": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/isexe": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/isstream": { "version": "0.1.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/jsbn": { "version": "0.1.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/json-parse-better-errors": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/json-schema": { "version": "0.2.3", - "dev": true, - "inBundle": true, - "peer": true + "extraneous": true, + "inBundle": true }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/json-stringify-safe": { "version": "5.0.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/jsonparse": { "version": "1.3.1", - "dev": true, "engines": [ "node >= 0.2.0" ], + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/JSONStream": { "version": "1.3.5", - "dev": true, + "extraneous": true, "inBundle": true, "license": "(MIT OR Apache-2.0)", - "peer": true, "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -6625,13 +6502,12 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/jsprim": { "version": "1.4.1", - "dev": true, "engines": [ "node >=0.6.0" ], + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -6641,10 +6517,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/latest-version": { "version": "3.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "package-json": "^4.0.0" }, @@ -6654,17 +6529,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/lazy-property": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/libcipm": { "version": "4.0.8", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "bin-links": "^1.1.2", "bluebird": "^3.5.1", @@ -6685,10 +6558,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/libnpm": { "version": "3.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "bin-links": "^1.1.2", "bluebird": "^3.5.3", @@ -6714,10 +6586,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/libnpmaccess": { "version": "3.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^2.0.0", "get-stream": "^4.0.0", @@ -6727,10 +6598,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/libnpmconfig": { "version": "1.2.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "figgy-pudding": "^3.5.1", "find-up": "^3.0.0", @@ -6739,10 +6609,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/libnpmconfig/node_modules/find-up": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^3.0.0" }, @@ -6752,10 +6621,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/libnpmconfig/node_modules/locate-path": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -6766,10 +6634,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/libnpmconfig/node_modules/p-limit": { "version": "2.2.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -6779,10 +6646,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/libnpmconfig/node_modules/p-locate": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^2.0.0" }, @@ -6792,20 +6658,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/libnpmconfig/node_modules/p-try": { "version": "2.2.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/libnpmhook": { "version": "5.0.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^2.0.0", "figgy-pudding": "^3.4.1", @@ -6815,10 +6679,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/libnpmorg": { "version": "1.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^2.0.0", "figgy-pudding": "^3.4.1", @@ -6828,10 +6691,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/libnpmpublish": { "version": "1.1.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^2.0.0", "figgy-pudding": "^3.5.1", @@ -6846,10 +6708,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/libnpmsearch": { "version": "2.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "figgy-pudding": "^3.5.1", "get-stream": "^4.0.0", @@ -6858,10 +6719,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/libnpmteam": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^2.0.0", "figgy-pudding": "^3.4.1", @@ -6871,10 +6731,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/libnpx": { "version": "10.2.4", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "dotenv": "^5.0.1", "npm-package-arg": "^6.0.0", @@ -6891,10 +6750,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/lock-verify": { "version": "2.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "npm-package-arg": "^6.1.0", "semver": "^5.4.1" @@ -6902,10 +6760,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/lockfile": { "version": "1.0.4", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "signal-exit": "^3.0.2" } @@ -6918,10 +6775,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/lodash._baseuniq": { "version": "4.6.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "lodash._createset": "~4.0.0", "lodash._root": "~3.0.0" @@ -6950,10 +6806,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/lodash._createset": { "version": "4.0.3", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/lodash._getnative": { "version": "3.9.1", @@ -6963,17 +6818,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/lodash._root": { "version": "3.0.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/lodash.clonedeep": { "version": "4.5.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/lodash.restparam": { "version": "3.6.1", @@ -6983,51 +6836,45 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/lodash.union": { "version": "4.6.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/lodash.uniq": { "version": "4.5.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/lodash.without": { "version": "4.4.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/lowercase-keys": { "version": "1.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/lru-cache": { "version": "5.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "yallist": "^3.0.2" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/make-dir": { "version": "1.3.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "pify": "^3.0.0" }, @@ -7037,10 +6884,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/make-fetch-happen": { "version": "5.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "agentkeepalive": "^3.4.1", "cacache": "^12.0.0", @@ -7057,27 +6903,24 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/meant": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/mime-db": { "version": "1.35.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/mime-types": { "version": "2.1.19", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "mime-db": "~1.35.0" }, @@ -7087,10 +6930,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/minimatch": { "version": "3.0.4", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7100,27 +6942,24 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/minimist": { "version": "1.2.5", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/minizlib": { "version": "1.3.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^2.9.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/minizlib/node_modules/minipass": { "version": "2.9.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -7128,10 +6967,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/mississippi": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -7150,10 +6988,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/mkdirp": { "version": "0.5.5", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "minimist": "^1.2.5" }, @@ -7163,17 +7000,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/mkdirp/node_modules/minimist": { "version": "1.2.5", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/move-concurrently": { "version": "1.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -7185,31 +7020,27 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/move-concurrently/node_modules/aproba": { "version": "1.2.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/ms": { "version": "2.1.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/mute-stream": { "version": "0.0.7", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/node-fetch-npm": { "version": "2.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "encoding": "^0.1.11", "json-parse-better-errors": "^1.0.0", @@ -7221,10 +7052,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/node-gyp": { "version": "5.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", @@ -7247,10 +7077,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/nopt": { "version": "4.0.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "abbrev": "1", "osenv": "^0.1.4" @@ -7261,10 +7090,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/normalize-package-data": { "version": "2.5.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -7274,20 +7102,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/normalize-package-data/node_modules/resolve": { "version": "1.10.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "path-parse": "^1.0.6" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/npm-audit-report": { "version": "1.3.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "cli-table3": "^0.5.0", "console-control-strings": "^1.1.0" @@ -7295,37 +7121,33 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/npm-bundled": { "version": "1.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "npm-normalize-package-bin": "^1.0.1" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/npm-cache-filename": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/npm-install-checks": { "version": "3.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "semver": "^2.3.0 || 3.x || 4 || 5" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/npm-lifecycle": { "version": "3.1.5", - "dev": true, + "extraneous": true, "inBundle": true, "license": "Artistic-2.0", - "peer": true, "dependencies": { "byline": "^5.0.0", "graceful-fs": "^4.1.15", @@ -7339,24 +7161,21 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/npm-logical-tree": { "version": "1.2.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/npm-normalize-package-bin": { "version": "1.0.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/npm-package-arg": { "version": "6.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "hosted-git-info": "^2.7.1", "osenv": "^0.1.5", @@ -7366,10 +7185,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/npm-packlist": { "version": "1.4.8", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1", @@ -7378,10 +7196,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/npm-pick-manifest": { "version": "3.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "figgy-pudding": "^3.5.1", "npm-package-arg": "^6.0.0", @@ -7390,10 +7207,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/npm-profile": { "version": "4.0.4", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^1.1.2 || 2", "figgy-pudding": "^3.4.1", @@ -7402,10 +7218,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/npm-registry-fetch": { "version": "4.0.7", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "bluebird": "^3.5.1", "figgy-pudding": "^3.4.1", @@ -7418,7 +7233,7 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/npm-registry-fetch/node_modules/safe-buffer": { "version": "5.2.1", - "dev": true, + "extraneous": true, "funding": [ { "type": "github", @@ -7434,15 +7249,13 @@ } ], "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/npm-run-path": { "version": "2.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "path-key": "^2.0.0" }, @@ -7452,17 +7265,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/npm-user-validate": { "version": "1.0.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/npmlog": { "version": "4.1.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -7472,50 +7283,45 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/number-is-nan": { "version": "1.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/oauth-sign": { "version": "0.9.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "*" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/object-assign": { "version": "4.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/object-keys": { "version": "1.0.12", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/object.getownpropertydescriptors": { "version": "2.0.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "define-properties": "^1.1.2", "es-abstract": "^1.5.1" @@ -7526,50 +7332,45 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/once": { "version": "1.4.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "wrappy": "1" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/opener": { "version": "1.5.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "(WTFPL OR MIT)", - "peer": true, "bin": { "opener": "bin/opener-bin.js" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/os-homedir": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/os-tmpdir": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/osenv": { "version": "0.1.5", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" @@ -7577,20 +7378,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/p-finally": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/package-json": { "version": "4.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "got": "^6.7.1", "registry-auth-token": "^3.0.1", @@ -7603,10 +7402,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/pacote": { "version": "9.5.12", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "bluebird": "^3.5.3", "cacache": "^12.0.2", @@ -7642,10 +7440,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/pacote/node_modules/minipass": { "version": "2.9.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -7653,10 +7450,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/parallel-transform": { "version": "1.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "cyclist": "~0.2.2", "inherits": "^2.0.3", @@ -7665,10 +7461,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/parallel-transform/node_modules/readable-stream": { "version": "2.3.6", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -7681,105 +7476,93 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/parallel-transform/node_modules/string_decoder": { "version": "1.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/path-exists": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/path-is-absolute": { "version": "1.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/path-is-inside": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "(WTFPL OR MIT)", - "peer": true + "license": "(WTFPL OR MIT)" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/path-key": { "version": "2.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/path-parse": { "version": "1.0.6", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/performance-now": { "version": "2.1.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/pify": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/prepend-http": { "version": "1.0.4", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/process-nextick-args": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/promise-inflight": { "version": "1.0.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/promise-retry": { "version": "1.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "err-code": "^1.0.0", "retry": "^0.10.0" @@ -7790,68 +7573,60 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/promise-retry/node_modules/retry": { "version": "0.10.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": "*" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/promzard": { "version": "0.3.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "read": "1" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/proto-list": { "version": "1.2.4", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/protoduck": { "version": "5.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "genfun": "^5.0.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/prr": { "version": "1.0.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/pseudomap": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/psl": { "version": "1.1.29", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/pump": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -7859,10 +7634,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/pumpify": { "version": "1.5.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -7871,10 +7645,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/pumpify/node_modules/pump": { "version": "2.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -7882,36 +7655,32 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/punycode": { "version": "1.4.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/qrcode-terminal": { "version": "0.12.0", - "dev": true, + "extraneous": true, "inBundle": true, - "peer": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/qs": { "version": "6.5.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.6" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/query-string": { "version": "6.8.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "decode-uri-component": "^0.2.0", "split-on-first": "^1.0.0", @@ -7923,17 +7692,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/qw": { "version": "1.0.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/rc": { "version": "1.2.8", - "dev": true, + "extraneous": true, "inBundle": true, "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "peer": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -7946,10 +7713,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/read": { "version": "1.0.7", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "mute-stream": "~0.0.4" }, @@ -7959,20 +7725,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/read-cmd-shim": { "version": "1.0.5", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "graceful-fs": "^4.1.2" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/read-installed": { "version": "4.0.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "debuglog": "^1.0.1", "read-package-json": "^2.0.0", @@ -7987,10 +7751,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/read-package-json": { "version": "2.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "glob": "^7.1.1", "json-parse-better-errors": "^1.0.1", @@ -8003,10 +7766,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/read-package-tree": { "version": "5.3.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "read-package-json": "^2.0.0", "readdir-scoped-modules": "^1.0.0", @@ -8015,10 +7777,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/readable-stream": { "version": "3.6.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -8030,10 +7791,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/readdir-scoped-modules": { "version": "1.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "debuglog": "^1.0.1", "dezalgo": "^1.0.0", @@ -8043,10 +7803,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/registry-auth-token": { "version": "3.4.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "rc": "^1.1.6", "safe-buffer": "^5.0.1" @@ -8054,10 +7813,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/registry-url": { "version": "3.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "rc": "^1.0.1" }, @@ -8067,10 +7825,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/request": { "version": "2.88.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -8099,47 +7856,42 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/require-directory": { "version": "2.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/require-main-filename": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/resolve-from": { "version": "4.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/retry": { "version": "0.12.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/rimraf": { "version": "2.7.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -8149,51 +7901,45 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/run-queue": { "version": "1.0.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^1.1.1" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/run-queue/node_modules/aproba": { "version": "1.2.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/safe-buffer": { "version": "5.1.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/semver": { "version": "5.7.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/semver-diff": { "version": "2.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "semver": "^5.0.3" }, @@ -8203,27 +7949,24 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/set-blocking": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/sha": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "(BSD-2-Clause OR MIT)", - "peer": true, "dependencies": { "graceful-fs": "^4.1.2" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/shebang-command": { "version": "1.2.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "shebang-regex": "^1.0.0" }, @@ -8233,37 +7976,33 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/shebang-regex": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/signal-exit": { "version": "3.0.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/slide": { "version": "1.1.6", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "*" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/smart-buffer": { "version": "4.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -8271,10 +8010,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/socks": { "version": "2.3.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ip": "1.1.5", "smart-buffer": "^4.1.0" @@ -8286,10 +8024,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/socks-proxy-agent": { "version": "4.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "agent-base": "~4.2.1", "socks": "~2.3.2" @@ -8300,10 +8037,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/socks-proxy-agent/node_modules/agent-base": { "version": "4.2.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "es6-promisify": "^5.0.0" }, @@ -8313,17 +8049,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/sorted-object": { "version": "2.0.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "(WTFPL OR MIT)", - "peer": true + "license": "(WTFPL OR MIT)" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/sorted-union-stream": { "version": "2.1.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "from2": "^1.3.0", "stream-iterate": "^1.1.0" @@ -8331,10 +8065,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/sorted-union-stream/node_modules/from2": { "version": "1.3.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "inherits": "~2.0.1", "readable-stream": "~1.1.10" @@ -8342,17 +8075,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/sorted-union-stream/node_modules/isarray": { "version": "0.0.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/sorted-union-stream/node_modules/readable-stream": { "version": "1.1.14", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -8362,17 +8093,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/sorted-union-stream/node_modules/string_decoder": { "version": "0.10.31", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/spdx-correct": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -8380,17 +8109,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/spdx-exceptions": { "version": "2.1.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "CC-BY-3.0", - "peer": true + "license": "CC-BY-3.0" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/spdx-expression-parse": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -8398,27 +8125,24 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/spdx-license-ids": { "version": "3.0.5", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "CC0-1.0", - "peer": true + "license": "CC0-1.0" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/split-on-first": { "version": "1.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/sshpk": { "version": "1.14.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -8443,20 +8167,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/ssri": { "version": "6.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "figgy-pudding": "^3.5.1" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/stream-each": { "version": "1.2.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" @@ -8464,10 +8186,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/stream-iterate": { "version": "1.2.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "readable-stream": "^2.1.5", "stream-shift": "^1.0.0" @@ -8475,10 +8196,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/stream-iterate/node_modules/readable-stream": { "version": "2.3.6", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -8491,54 +8211,48 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/stream-iterate/node_modules/string_decoder": { "version": "1.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/stream-shift": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/strict-uri-encode": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/string_decoder": { "version": "1.3.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.2.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/string-width": { "version": "2.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -8549,30 +8263,27 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/string-width/node_modules/is-fullwidth-code-point": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { "version": "4.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^3.0.0" }, @@ -8582,17 +8293,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/stringify-package": { "version": "1.0.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/strip-ansi": { "version": "3.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^2.0.0" }, @@ -8602,30 +8311,27 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/strip-eof": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/strip-json-comments": { "version": "2.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/supports-color": { "version": "5.4.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -8635,10 +8341,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/tar": { "version": "4.4.13", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", @@ -8654,10 +8359,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/tar/node_modules/minipass": { "version": "2.9.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -8665,10 +8369,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/term-size": { "version": "1.2.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "execa": "^0.7.0" }, @@ -8678,24 +8381,21 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/text-table": { "version": "0.2.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/through": { "version": "2.3.8", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/through2": { "version": "2.0.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "readable-stream": "^2.1.5", "xtend": "~4.0.1" @@ -8703,10 +8403,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/through2/node_modules/readable-stream": { "version": "2.3.6", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -8719,37 +8418,33 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/through2/node_modules/string_decoder": { "version": "1.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/timed-out": { "version": "4.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/tiny-relative-date": { "version": "1.3.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/tough-cookie": { "version": "2.4.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "psl": "^1.1.24", "punycode": "^1.4.1" @@ -8760,10 +8455,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/tunnel-agent": { "version": "0.6.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -8773,62 +8467,54 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/tweetnacl": { "version": "0.14.5", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "Unlicense", - "optional": true, - "peer": true + "license": "Unlicense" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/typedarray": { "version": "0.0.6", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/uid-number": { "version": "0.0.6", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "*" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/umask": { "version": "1.1.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/unique-filename": { "version": "1.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "unique-slug": "^2.0.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/unique-slug": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "imurmurhash": "^0.1.4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/unique-string": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "crypto-random-string": "^1.0.0" }, @@ -8838,30 +8524,27 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/unpipe": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/unzip-response": { "version": "2.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/update-notifier": { "version": "2.5.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "boxen": "^1.2.1", "chalk": "^2.0.1", @@ -8880,30 +8563,27 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/uri-js": { "version": "4.4.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "punycode": "^2.1.0" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/uri-js/node_modules/punycode": { "version": "2.1.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/url-parse-lax": { "version": "1.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "prepend-http": "^1.0.1" }, @@ -8913,44 +8593,39 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/util-deprecate": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/util-extend": { "version": "1.0.3", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/util-promisify": { "version": "2.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "object.getownpropertydescriptors": "^2.0.3" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/uuid": { "version": "3.3.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "bin": { "uuid": "bin/uuid" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/validate-npm-package-license": { "version": "3.0.4", - "dev": true, + "extraneous": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -8958,23 +8633,21 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/validate-npm-package-name": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "builtins": "^1.0.3" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/verror": { "version": "1.10.0", - "dev": true, "engines": [ "node >=0.6.0" ], + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -8983,20 +8656,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/wcwidth": { "version": "1.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "defaults": "^1.0.3" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/which": { "version": "1.3.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -9006,27 +8677,24 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/which-module": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/wide-align": { "version": "1.1.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "string-width": "^1.0.2" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/wide-align/node_modules/string-width": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -9038,10 +8706,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/widest-line": { "version": "2.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "string-width": "^2.1.1" }, @@ -9051,20 +8718,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/worker-farm": { "version": "1.7.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "errno": "~0.1.7" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/wrap-ansi": { "version": "5.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", @@ -9076,30 +8741,27 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "4.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { "version": "3.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -9111,10 +8773,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "5.2.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -9124,17 +8785,15 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/wrappy": { "version": "1.0.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/write-file-atomic": { "version": "2.4.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -9143,44 +8802,39 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/xdg-basedir": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/xtend": { "version": "4.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/y18n": { "version": "4.0.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/yallist": { "version": "3.0.3", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/yargs": { "version": "14.2.3", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "cliui": "^5.0.0", "decamelize": "^1.2.0", @@ -9197,10 +8851,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/yargs-parser": { "version": "15.0.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -9208,30 +8861,27 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/yargs-parser/node_modules/camelcase": { "version": "5.3.1", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/yargs/node_modules/ansi-regex": { "version": "4.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/yargs/node_modules/find-up": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^3.0.0" }, @@ -9241,20 +8891,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "2.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/yargs/node_modules/locate-path": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -9265,10 +8913,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/yargs/node_modules/p-limit": { "version": "2.3.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -9281,10 +8928,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/yargs/node_modules/p-locate": { "version": "3.0.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^2.0.0" }, @@ -9294,20 +8940,18 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/yargs/node_modules/p-try": { "version": "2.2.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/yargs/node_modules/string-width": { "version": "3.1.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -9319,10 +8963,9 @@ }, "node_modules/ep_etherpad-lite/node_modules/npm/node_modules/yargs/node_modules/strip-ansi": { "version": "5.2.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -11007,7 +10650,6 @@ "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -11023,7 +10665,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -11050,7 +10691,6 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -11098,7 +10738,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -11747,6 +11386,14 @@ "he": "bin/he" } }, + "node_modules/helpertypes": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/helpertypes/-/helpertypes-0.0.18.tgz", + "integrity": "sha512-XRhfbSEmR+poXUC5/8AbmYNJb2riOT6qPzjGJZr0S9YedHiaY+/tzPYzWMUclYMEdCYo/1l8PDYrQFCj02v97w==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -12248,7 +11895,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -12266,7 +11912,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -12306,7 +11951,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -13275,7 +12919,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -13292,7 +12935,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -14672,8 +14314,8 @@ }, "node_modules/npm/node_modules/bcrypt-pbkdf": { "version": "1.0.2", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "inBundle": true, + "license": "BSD-3-Clause", "optional": true, "dependencies": { "tweetnacl": "^0.14.3" @@ -14956,8 +14598,8 @@ }, "node_modules/npm/node_modules/colors": { "version": "1.3.3", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", "inBundle": true, + "license": "MIT", "optional": true, "engines": { "node": ">=0.1.90" @@ -15300,8 +14942,8 @@ }, "node_modules/npm/node_modules/ecc-jsbn": { "version": "0.1.2", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "inBundle": true, + "license": "MIT", "optional": true, "dependencies": { "jsbn": "~0.1.0", @@ -16165,8 +15807,8 @@ }, "node_modules/npm/node_modules/jsbn": { "version": "0.1.1", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "inBundle": true, + "license": "MIT", "optional": true }, "node_modules/npm/node_modules/json-parse-better-errors": { @@ -16456,7 +16098,6 @@ }, "node_modules/npm/node_modules/lodash._baseindexof": { "version": "3.1.0", - "extraneous": true, "inBundle": true, "license": "MIT" }, @@ -16471,19 +16112,16 @@ }, "node_modules/npm/node_modules/lodash._bindcallback": { "version": "3.0.1", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/lodash._cacheindexof": { "version": "3.0.2", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/lodash._createcache": { "version": "3.1.2", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -16497,7 +16135,6 @@ }, "node_modules/npm/node_modules/lodash._getnative": { "version": "3.9.1", - "extraneous": true, "inBundle": true, "license": "MIT" }, @@ -16513,7 +16150,6 @@ }, "node_modules/npm/node_modules/lodash.restparam": { "version": "3.6.1", - "extraneous": true, "inBundle": true, "license": "MIT" }, @@ -18015,8 +17651,8 @@ }, "node_modules/npm/node_modules/tweetnacl": { "version": "0.14.5", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "inBundle": true, + "license": "Unlicense", "optional": true }, "node_modules/npm/node_modules/typedarray": { @@ -18937,7 +18573,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -19145,7 +18780,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -19486,6 +19120,11 @@ "node": ">=0.10.0" } }, + "node_modules/reserved-words": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", + "integrity": "sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==" + }, "node_modules/resolve": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", @@ -19546,7 +19185,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -19576,7 +19214,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -20845,7 +20482,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -21042,7 +20678,6 @@ "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/src/package.json b/src/package.json index 6ade4d3d1..9b8a08abe 100644 --- a/src/package.json +++ b/src/package.json @@ -31,6 +31,7 @@ ], "dependencies": { "async": "^3.2.2", + "cjstoesm": "^2.1.2", "clean-css": "^5.3.2", "cookie-parser": "^1.4.6", "cross-spawn": "^7.0.3", @@ -113,6 +114,5 @@ "dev": "concurrently \"npx tsc --watch\" \"nodemon -q dist/server.js\"" }, "version": "1.9.0", - "license": "Apache-2.0", - "type": "module" + "license": "Apache-2.0" } diff --git a/src/static/js/Changeset.js b/src/static/js/Changeset.ts similarity index 95% rename from src/static/js/Changeset.js rename to src/static/js/Changeset.ts index 53b3f2c8f..e9f7dfc8d 100644 --- a/src/static/js/Changeset.js +++ b/src/static/js/Changeset.ts @@ -22,6 +22,8 @@ * https://github.com/ether/pad/blob/master/infrastructure/ace/www/easysync2.js */ +import {CustomError} from "../../node/utils/customError"; + const AttributeMap = require('./AttributeMap'); const AttributePool = require('./AttributePool'); const attributes = require('./attributes'); @@ -47,8 +49,8 @@ const {padutils} = require('./pad_utils'); * * @param {string} msg - Just some message */ -const error = (msg) => { - const e = new Error(msg); +export const error = (msg) => { + const e = new CustomError(msg); e.easysync = true; throw e; }; @@ -71,7 +73,7 @@ const assert = (b, msg) => { * @param {string} str - string of the number in base 36 * @returns {number} number */ -exports.parseNum = (str) => parseInt(str, 36); +export const parseNum = (str) => parseInt(str, 36); /** * Writes a number in base 36 and puts it in a string. @@ -79,12 +81,16 @@ exports.parseNum = (str) => parseInt(str, 36); * @param {number} num - number * @returns {string} string */ -exports.numToString = (num) => num.toString(36).toLowerCase(); +export const numToString = (num) => num.toString(36).toLowerCase(); /** * An operation to apply to a shared document. */ class Op { + opcode: string; + chars: number; + lines: number; + attribs: string; /** * @param {(''|'='|'+'|'-')} [opcode=''] - Initial value of the `opcode` property. */ @@ -146,11 +152,11 @@ class Op { toString() { if (!this.opcode) throw new TypeError('null op'); if (typeof this.attribs !== 'string') throw new TypeError('attribs must be a string'); - const l = this.lines ? `|${exports.numToString(this.lines)}` : ''; - return this.attribs + l + this.opcode + exports.numToString(this.chars); + const l = this.lines ? `|${numToString(this.lines)}` : ''; + return this.attribs + l + this.opcode + numToString(this.chars); } } -exports.Op = Op; +export const Op = Op; /** * Describes changes to apply to a document. Does not include the attribute pool or the original @@ -170,7 +176,7 @@ exports.Op = Op; * @param {string} cs - String representation of the Changeset * @returns {number} oldLen property */ -exports.oldLen = (cs) => exports.unpack(cs).oldLen; +export const oldLen = (cs) => exports.unpack(cs).oldLen; /** * Returns the length of the text after changeset is applied. @@ -178,7 +184,7 @@ exports.oldLen = (cs) => exports.unpack(cs).oldLen; * @param {string} cs - String representation of the Changeset * @returns {number} newLen property */ -exports.newLen = (cs) => exports.unpack(cs).newLen; +export const newLen = (cs) => exports.unpack(cs).newLen; /** * Parses a string of serialized changeset operations. @@ -187,7 +193,7 @@ exports.newLen = (cs) => exports.unpack(cs).newLen; * @yields {Op} * @returns {Generator} */ -exports.deserializeOps = function* (ops) { +export const deserializeOps = function* (ops) { // TODO: Migrate to String.prototype.matchAll() once there is enough browser support. const regex = /((?:\*[0-9a-z]+)*)(?:\|([0-9a-z]+))?([-+=])([0-9a-z]+)|(.)/g; let match; @@ -195,8 +201,8 @@ exports.deserializeOps = function* (ops) { if (match[5] === '$') return; // Start of the insert operation character bank. if (match[5] != null) error(`invalid operation: ${ops.slice(regex.lastIndex - 1)}`); const op = new Op(match[3]); - op.lines = exports.parseNum(match[2] || '0'); - op.chars = exports.parseNum(match[4]); + op.lines = parseNum(match[2] || '0'); + op.chars = parseNum(match[4]); op.attribs = match[1]; yield op; } @@ -210,11 +216,18 @@ exports.deserializeOps = function* (ops) { * @deprecated Use `deserializeOps` instead. */ class OpIter { + private _next: { + value: any; + done: boolean, + + + }; + private _gen: any; /** * @param {string} ops - String encoding the change operations to iterate over. */ constructor(ops) { - this._gen = exports.deserializeOps(ops); + this._gen = deserializeOps(ops); this._next = this._gen.next(); } @@ -252,7 +265,7 @@ class OpIter { * @param {string} opsStr - String encoding of the change operations to perform. * @returns {OpIter} Operator iterator object. */ -exports.opIterator = (opsStr) => { +export const opIterator = (opsStr) => { padutils.warnDeprecated( 'Changeset.opIterator() is deprecated; use Changeset.deserializeOps() instead'); return new OpIter(opsStr); @@ -277,7 +290,7 @@ const clearOp = (op) => { * @param {('+'|'-'|'='|'')} [optOpcode=''] - The operation's operator. * @returns {Op} */ -exports.newOp = (optOpcode) => { +export const newOp = (optOpcode) => { padutils.warnDeprecated('Changeset.newOp() is deprecated; use the Changeset.Op class instead'); return new Op(optOpcode); }; @@ -370,17 +383,17 @@ const opsFromText = function* (opcode, text, attribs = '', pool = null) { * @param {string} cs - Changeset to check * @returns {string} the checked Changeset */ -exports.checkRep = (cs) => { - const unpacked = exports.unpack(cs); +export const checkRep = (cs) => { + const unpacked = unpack(cs); const oldLen = unpacked.oldLen; const newLen = unpacked.newLen; const ops = unpacked.ops; let charBank = unpacked.charBank; - const assem = exports.smartOpAssembler(); + const assem = smartOpAssembler(); let oldPos = 0; let calcNewLen = 0; - for (const o of exports.deserializeOps(ops)) { + for (const o of deserializeOps(ops)) { switch (o.opcode) { case '=': oldPos += o.chars; @@ -413,7 +426,7 @@ exports.checkRep = (cs) => { assert(calcNewLen === newLen, 'Invalid changeset: claimed length does not match actual length'); assert(charBank === '', 'Invalid changeset: excess characters in the charBank'); assem.endDocument(); - const normalized = exports.pack(oldLen, calcNewLen, assem.toString(), unpacked.charBank); + const normalized = pack(oldLen, calcNewLen, assem.toString(), unpacked.charBank); assert(normalized === cs, 'Invalid changeset: not in canonical form'); return cs; }; @@ -421,11 +434,11 @@ exports.checkRep = (cs) => { /** * @returns {SmartOpAssembler} */ -exports.smartOpAssembler = () => { - const minusAssem = exports.mergingOpAssembler(); - const plusAssem = exports.mergingOpAssembler(); - const keepAssem = exports.mergingOpAssembler(); - const assem = exports.stringAssembler(); +export const smartOpAssembler = () => { + const minusAssem = mergingOpAssembler(); + const plusAssem = mergingOpAssembler(); + const keepAssem = mergingOpAssembler(); + const assem = stringAssembler(); let lastOpcode = ''; let lengthChange = 0; @@ -515,8 +528,8 @@ exports.smartOpAssembler = () => { /** * @returns {MergingOpAssembler} */ -exports.mergingOpAssembler = () => { - const assem = exports.opAssembler(); +export const mergingOpAssembler = () => { + const assem = opAssembler(); const bufOp = new Op(); // If we get, for example, insertions [xxx\n,yyy], those don't merge, @@ -528,7 +541,7 @@ exports.mergingOpAssembler = () => { /** * @param {boolean} [isEndDocument] */ - const flush = (isEndDocument) => { + const flush = (isEndDocument?: boolean) => { if (!bufOp.opcode) return; if (isEndDocument && bufOp.opcode === '=' && !bufOp.attribs) { // final merged keep, leave it implicit @@ -589,7 +602,7 @@ exports.mergingOpAssembler = () => { /** * @returns {OpAssembler} */ -exports.opAssembler = () => { +export const opAssembler = () => { let serialized = ''; /** @@ -627,7 +640,7 @@ exports.opAssembler = () => { * @param {string} str - String to iterate over * @returns {StringIterator} */ -exports.stringIterator = (str) => { +export const stringIterator = (str) => { let curIndex = 0; // newLines is the number of \n between curIndex and str.length let newLines = str.split('\n').length - 1; @@ -677,7 +690,7 @@ exports.stringIterator = (str) => { /** * @returns {StringAssembler} */ -exports.stringAssembler = () => ({ +export const stringAssembler = () => ({ _str: '', clear() { this._str = ''; }, /** @@ -711,6 +724,11 @@ exports.stringAssembler = () => ({ * with no newlines. */ class TextLinesMutator { + private _lines: any; + private _curSplice: number[]|{[key: string]:any}; + private _inSplice: boolean; + private _curLine: number; + private _curCol: number; /** * @param {(string[]|StringArrayLike)} lines - Lines to mutate (in place). */ @@ -798,10 +816,12 @@ class TextLinesMutator { * close or TODO(doc). */ _leaveSplice() { - this._lines.splice(...this._curSplice); - this._curSplice.length = 2; - this._curSplice[0] = this._curSplice[1] = 0; - this._inSplice = false; + if(this._curSplice instanceof Array) { + this._lines.splice(...this._curSplice); + this._curSplice.length = 2; + this._curSplice[0] = this._curSplice[1] = 0; + this._inSplice = false; + } } /** @@ -837,7 +857,7 @@ class TextLinesMutator { * @param {number} L - * @param {boolean} includeInSplice - Indicates that attributes are present. */ - skipLines(L, includeInSplice) { + skipLines(L, includeInSplice?:boolean) { if (!L) return; if (includeInSplice) { if (!this._inSplice) this._enterSplice(); @@ -905,7 +925,7 @@ class TextLinesMutator { return this._linesSlice(m, m + k).join(''); }; - let removed = ''; + let removed:string|number = ''; if (this._isCurLineInSplice()) { if (this._curCol === 0) { removed = this._curSplice[this._curSplice.length - 1]; @@ -958,7 +978,7 @@ class TextLinesMutator { if (!text) return; if (!this._inSplice) this._enterSplice(); if (L) { - const newLines = exports.splitTextLines(text); + const newLines = splitTextLines(text); if (this._isCurLineInSplice()) { const sline = this._curSplice.length - 1; /** @type {string} */ @@ -1039,11 +1059,11 @@ class TextLinesMutator { * @returns {string} the integrated changeset */ const applyZip = (in1, in2, func) => { - const ops1 = exports.deserializeOps(in1); - const ops2 = exports.deserializeOps(in2); + const ops1 = deserializeOps(in1); + const ops2 = deserializeOps(in2); let next1 = ops1.next(); let next2 = ops2.next(); - const assem = exports.smartOpAssembler(); + const assem = smartOpAssembler(); while (!next1.done || !next2.done) { if (!next1.done && !next1.value.opcode) next1 = ops1.next(); if (!next2.done && !next2.value.opcode) next2 = ops2.next(); @@ -1063,13 +1083,13 @@ const applyZip = (in1, in2, func) => { * @param {string} cs - The encoded changeset. * @returns {Changeset} */ -exports.unpack = (cs) => { +export const unpack = (cs) => { const headerRegex = /Z:([0-9a-z]+)([><])([0-9a-z]+)|/; const headerMatch = headerRegex.exec(cs); if ((!headerMatch) || (!headerMatch[0])) error(`Not a changeset: ${cs}`); - const oldLen = exports.parseNum(headerMatch[1]); + const oldLen = parseNum(headerMatch[1]); const changeSign = (headerMatch[2] === '>') ? 1 : -1; - const changeMag = exports.parseNum(headerMatch[3]); + const changeMag = parseNum(headerMatch[3]); const newLen = oldLen + changeSign * changeMag; const opsStart = headerMatch[0].length; let opsEnd = cs.indexOf('$'); @@ -1091,12 +1111,12 @@ exports.unpack = (cs) => { * @param {string} bank - Characters for insert operations. * @returns {string} The encoded changeset. */ -exports.pack = (oldLen, newLen, opsStr, bank) => { +export const pack = (oldLen, newLen, opsStr, bank) => { const lenDiff = newLen - oldLen; - const lenDiffStr = (lenDiff >= 0 ? `>${exports.numToString(lenDiff)}` - : `<${exports.numToString(-lenDiff)}`); + const lenDiffStr = (lenDiff >= 0 ? `>${numToString(lenDiff)}` + : `<${numToString(-lenDiff)}`); const a = []; - a.push('Z:', exports.numToString(oldLen), lenDiffStr, opsStr, '$', bank); + a.push('Z:', numToString(oldLen), lenDiffStr, opsStr, '$', bank); return a.join(''); }; @@ -1107,13 +1127,13 @@ exports.pack = (oldLen, newLen, opsStr, bank) => { * @param {string} str - String to which a Changeset should be applied * @returns {string} */ -exports.applyToText = (cs, str) => { - const unpacked = exports.unpack(cs); +export const applyToText = (cs, str) => { + const unpacked = unpack(cs); assert(str.length === unpacked.oldLen, `mismatched apply: ${str.length} / ${unpacked.oldLen}`); - const bankIter = exports.stringIterator(unpacked.charBank); - const strIter = exports.stringIterator(str); - const assem = exports.stringAssembler(); - for (const op of exports.deserializeOps(unpacked.ops)) { + const bankIter = stringIterator(unpacked.charBank); + const strIter = stringIterator(str); + const assem = stringAssembler(); + for (const op of deserializeOps(unpacked.ops)) { switch (op.opcode) { case '+': // op is + and op.lines 0: no newlines must be in op.chars @@ -1151,11 +1171,11 @@ exports.applyToText = (cs, str) => { * @param {string} cs - the changeset to apply * @param {string[]} lines - The lines to which the changeset needs to be applied */ -exports.mutateTextLines = (cs, lines) => { - const unpacked = exports.unpack(cs); - const bankIter = exports.stringIterator(unpacked.charBank); +export const mutateTextLines = (cs, lines) => { + const unpacked = unpack(cs); + const bankIter = stringIterator(unpacked.charBank); const mut = new TextLinesMutator(lines); - for (const op of exports.deserializeOps(unpacked.ops)) { + for (const op of deserializeOps(unpacked.ops)) { switch (op.opcode) { case '+': mut.insert(bankIter.take(op.chars), op.lines); @@ -1180,7 +1200,7 @@ exports.mutateTextLines = (cs, lines) => { * @param {AttributePool} pool - attribute pool * @returns {string} */ -exports.composeAttributes = (att1, att2, resultIsMutation, pool) => { +export const composeAttributes = (att1, att2, resultIsMutation, pool) => { // att1 and att2 are strings like "*3*f*1c", asMutation is a boolean. // Sometimes attribute (key,value) pairs are treated as attribute presence // information, while other times they are treated as operations that @@ -1258,7 +1278,7 @@ const slicerZipperFunc = (attOp, csOp, pool) => { // normally be the empty string. However, padDiff.js adds attributes to remove ops and needs // them preserved so they are copied here. ? csOp.attribs - : exports.composeAttributes(attOp.attribs, csOp.attribs, attOp.opcode === '=', pool); + : composeAttributes(attOp.attribs, csOp.attribs, attOp.opcode === '=', pool); partiallyConsumedOp.chars -= fullyConsumedOp.chars; partiallyConsumedOp.lines -= fullyConsumedOp.lines; if (!partiallyConsumedOp.chars) partiallyConsumedOp.opcode = ''; @@ -1275,8 +1295,8 @@ const slicerZipperFunc = (attOp, csOp, pool) => { * @param {AttributePool} pool - the attibutes pool * @returns {string} */ -exports.applyToAttribution = (cs, astr, pool) => { - const unpacked = exports.unpack(cs); +export const applyToAttribution = (cs, astr, pool) => { + const unpacked = unpack(cs); return applyZip(astr, unpacked.ops, (op1, op2) => slicerZipperFunc(op1, op2, pool)); }; @@ -1749,7 +1769,7 @@ exports.mapAttribNumbers = (cs, func) => { * attributes * @returns {AText} */ -exports.makeAText = (text, attribs) => ({ +export const makeAText = (text, attribs) => ({ text, attribs: (attribs || exports.makeAttribution(text)), }); @@ -1762,7 +1782,7 @@ exports.makeAText = (text, attribs) => ({ * @param {AttributePool} pool - Attribute Pool to add to * @returns {AText} */ -exports.applyToAText = (cs, atext, pool) => ({ +export const applyToAText = (cs, atext, pool) => ({ text: exports.applyToText(cs, atext.text), attribs: exports.applyToAttribution(cs, atext.attribs, pool), }); @@ -1787,7 +1807,7 @@ exports.cloneAText = (atext) => { * @param {AText} atext1 - * @param {AText} atext2 - */ -exports.copyAText = (atext1, atext2) => { +export const copyAText = (atext1, atext2) => { atext2.text = atext1.text; atext2.attribs = atext1.attribs; }; @@ -1799,10 +1819,10 @@ exports.copyAText = (atext1, atext2) => { * @yields {Op} * @returns {Generator} */ -exports.opsFromAText = function* (atext) { +export const opsFromAText = function* (atext) { // intentionally skips last newline char of atext let lastOp = null; - for (const op of exports.deserializeOps(atext.attribs)) { + for (const op of deserializeOps(atext.attribs)) { if (lastOp != null) yield lastOp; lastOp = op; } diff --git a/src/static/js/pluginfw/hooks.js b/src/static/js/pluginfw/hooks.ts similarity index 93% rename from src/static/js/pluginfw/hooks.js rename to src/static/js/pluginfw/hooks.ts index 89f4267bb..90a479b18 100644 --- a/src/static/js/pluginfw/hooks.js +++ b/src/static/js/pluginfw/hooks.ts @@ -1,6 +1,6 @@ 'use strict'; -const pluginDefs = require('./plugin_defs'); +import {hooks} from './plugin_defs'; // Maps the name of a server-side hook to a string explaining the deprecation // (e.g., 'use the foo hook instead'). @@ -10,12 +10,15 @@ const pluginDefs = require('./plugin_defs'); // const hooks = require('ep_etherpad-lite/static/js/pluginfw/hooks'); // hooks.deprecationNotices.fooBar = 'use the newSpiffy hook instead'; // -exports.deprecationNotices = {}; +export const deprecationNotices:{ + authFailure?: string; + clientReady?: string +} = {}; const deprecationWarned = {}; const checkDeprecation = (hook) => { - const notice = exports.deprecationNotices[hook.hook_name]; + const notice = deprecationNotices[hook.hook_name]; if (notice == null) return; if (deprecationWarned[hook.hook_fn_name]) return; console.warn(`${hook.hook_name} hook used by the ${hook.part.plugin} plugin ` + @@ -189,10 +192,10 @@ const callHookFnSync = (hook, context) => { // 1. Collect all values returned by the hook functions into an array. // 2. Convert each `undefined` entry into `[]`. // 3. Flatten one level. -exports.callAll = (hookName, context) => { +export const callAll = (hookName, context?) => { if (context == null) context = {}; - const hooks = pluginDefs.hooks[hookName] || []; - return flatten1(hooks.map((hook) => normalizeValue(callHookFnSync(hook, context)))); + const hooksResult = hooks[hookName] || []; + return flatten1(hooksResult.map((hook) => normalizeValue(callHookFnSync(hook, context)))); }; // Calls the hook function asynchronously and returns a Promise that either resolves to the hook @@ -342,23 +345,23 @@ const callHookFnAsync = async (hook, context) => { // 2. Convert each `undefined` entry into `[]`. // 3. Flatten one level. // If cb is non-null, this function resolves to the value returned by cb. -exports.aCallAll = async (hookName, context, cb = null) => { - if (cb != null) return await attachCallback(exports.aCallAll(hookName, context), cb); +export const aCallAll = async (hookName, context?, cb = null) => { + if (cb != null) return await attachCallback(aCallAll(hookName, context), cb); if (context == null) context = {}; - const hooks = pluginDefs.hooks[hookName] || []; + const hooksResult = hooks[hookName] || []; const results = await Promise.all( - hooks.map(async (hook) => normalizeValue(await callHookFnAsync(hook, context)))); + hooksResult.map(async (hook) => normalizeValue(await callHookFnAsync(hook, context)))); return flatten1(results); }; // Like `aCallAll()` except the hook functions are called one at a time instead of concurrently. // Only use this function if the hook functions must be called one at a time, otherwise use // `aCallAll()`. -exports.callAllSerial = async (hookName, context) => { +export const callAllSerial = async (hookName, context) => { if (context == null) context = {}; - const hooks = pluginDefs.hooks[hookName] || []; + const hooksResult = hooks[hookName] || []; const results = []; - for (const hook of hooks) { + for (const hook of hooksResult) { results.push(normalizeValue(await callHookFnAsync(hook, context))); } return flatten1(results); @@ -367,11 +370,11 @@ exports.callAllSerial = async (hookName, context) => { // DEPRECATED: Use `aCallFirst()` instead. // // Like `aCallFirst()`, but synchronous. Hook functions must provide their values synchronously. -exports.callFirst = (hookName, context) => { +export const callFirst = (hookName, context) => { if (context == null) context = {}; const predicate = (val) => val.length; - const hooks = pluginDefs.hooks[hookName] || []; - for (const hook of hooks) { + const hooksResult = hooks[hookName] || []; + for (const hook of hooksResult) { const val = normalizeValue(callHookFnSync(hook, context)); if (predicate(val)) return val; } @@ -399,21 +402,21 @@ exports.callFirst = (hookName, context) => { // If cb is nullish, resolves to an array that is either the normalized value that satisfied the // predicate or empty if the predicate was never satisfied. If cb is non-nullish, resolves to the // value returned from cb(). -exports.aCallFirst = async (hookName, context, cb = null, predicate = null) => { +export const aCallFirst = async (hookName, context, cb = null, predicate = null) => { if (cb != null) { - return await attachCallback(exports.aCallFirst(hookName, context, null, predicate), cb); + return await attachCallback(aCallFirst(hookName, context, null, predicate), cb); } if (context == null) context = {}; if (predicate == null) predicate = (val) => val.length; - const hooks = pluginDefs.hooks[hookName] || []; - for (const hook of hooks) { + const hooksResult = hooks[hookName] || []; + for (const hook of hooksResult) { const val = normalizeValue(await callHookFnAsync(hook, context)); if (predicate(val)) return val; } return []; }; -exports.exportedForTestingOnly = { +export const exportedForTestingOnly = { callHookFnAsync, callHookFnSync, deprecationWarned, diff --git a/src/static/js/pluginfw/installer.js b/src/static/js/pluginfw/installer.ts similarity index 66% rename from src/static/js/pluginfw/installer.js rename to src/static/js/pluginfw/installer.ts index dd3dddc88..e10e41971 100644 --- a/src/static/js/pluginfw/installer.js +++ b/src/static/js/pluginfw/installer.ts @@ -1,18 +1,23 @@ 'use strict'; -const log4js = require('log4js'); -const plugins = require('./plugins'); -const hooks = require('./hooks'); -const request = require('request'); -const runCmd = require('../../../node/utils/run_cmd'); -const settings = require('../../../node/utils/Settings'); +import log4js from 'log4js'; +import {prefix, update} from "./plugins"; + +import {aCallAll} from "./hooks"; + +import request from "request"; + +import {exportCMD} from "../../../node/utils/run_cmd"; + +import {reloadSettings} from "../../../node/utils/Settings"; +import {InstallerModel} from "../../module/InstallerModel"; const logger = log4js.getLogger('plugins'); const onAllTasksFinished = async () => { - settings.reloadSettings(); - await hooks.aCallAll('loadSettings', {settings}); - await hooks.aCallAll('restartServer'); + const settings = reloadSettings(); + await aCallAll('loadSettings', {settings}); + await aCallAll('restartServer'); }; let tasks = 0; @@ -27,54 +32,54 @@ const wrapTaskCb = (cb) => { }; }; -exports.uninstall = async (pluginName, cb = null) => { +export const uninstall = async (pluginName, cb = null) => { cb = wrapTaskCb(cb); logger.info(`Uninstalling plugin ${pluginName}...`); try { // The --no-save flag prevents npm from creating package.json or package-lock.json. // The --legacy-peer-deps flag is required to work around a bug in npm v7: // https://github.com/npm/cli/issues/2199 - await runCmd(['npm', 'uninstall', '--no-save', '--legacy-peer-deps', pluginName]); + await exportCMD(['npm', 'uninstall', '--no-save', '--legacy-peer-deps', pluginName]); } catch (err) { logger.error(`Failed to uninstall plugin ${pluginName}`); cb(err || new Error(err)); throw err; } logger.info(`Successfully uninstalled plugin ${pluginName}`); - await hooks.aCallAll('pluginUninstall', {pluginName}); - await plugins.update(); + await aCallAll('pluginUninstall', {pluginName}); + await update(); cb(null); }; -exports.install = async (pluginName, cb = null) => { +export const install = async (pluginName, cb = null) => { cb = wrapTaskCb(cb); logger.info(`Installing plugin ${pluginName}...`); try { // The --no-save flag prevents npm from creating package.json or package-lock.json. // The --legacy-peer-deps flag is required to work around a bug in npm v7: // https://github.com/npm/cli/issues/2199 - await runCmd(['npm', 'install', '--no-save', '--legacy-peer-deps', pluginName]); + await exportCMD(['npm', 'install', '--no-save', '--legacy-peer-deps', pluginName]); } catch (err) { logger.error(`Failed to install plugin ${pluginName}`); cb(err || new Error(err)); throw err; } logger.info(`Successfully installed plugin ${pluginName}`); - await hooks.aCallAll('pluginInstall', {pluginName}); - await plugins.update(); + await aCallAll('pluginInstall', {pluginName}); + await update(); cb(null); }; -exports.availablePlugins = null; +export let availablePlugins = null; let cacheTimestamp = 0; -exports.getAvailablePlugins = (maxCacheAge) => { +export const getAvailablePlugins = (maxCacheAge) => { const nowTimestamp = Math.round(Date.now() / 1000); return new Promise((resolve, reject) => { // check cache age before making any request - if (exports.availablePlugins && maxCacheAge && (nowTimestamp - cacheTimestamp) <= maxCacheAge) { - return resolve(exports.availablePlugins); + if (availablePlugins && maxCacheAge && (nowTimestamp - cacheTimestamp) <= maxCacheAge) { + return resolve(availablePlugins); } request('https://static.etherpad.org/plugins.json', (er, response, plugins) => { @@ -87,7 +92,7 @@ exports.getAvailablePlugins = (maxCacheAge) => { plugins = []; } - exports.availablePlugins = plugins; + availablePlugins = plugins; cacheTimestamp = nowTimestamp; resolve(plugins); }); @@ -95,18 +100,19 @@ exports.getAvailablePlugins = (maxCacheAge) => { }; -exports.search = (searchTerm, maxCacheAge) => exports.getAvailablePlugins(maxCacheAge).then( - (results) => { +export const search = (searchTerm, maxCacheAge) => getAvailablePlugins(maxCacheAge).then( + (results: InstallerModel[]) => { const res = {}; if (searchTerm) { searchTerm = searchTerm.toLowerCase(); } + for (const pluginName in results) { // for every available plugin // TODO: Also search in keywords here! - if (pluginName.indexOf(plugins.prefix) !== 0) continue; + if (pluginName.indexOf(prefix) !== 0) continue; if (searchTerm && !~results[pluginName].name.toLowerCase().indexOf(searchTerm) && (typeof results[pluginName].description !== 'undefined' && diff --git a/src/static/js/pluginfw/plugin_defs.js b/src/static/js/pluginfw/plugin_defs.ts similarity index 72% rename from src/static/js/pluginfw/plugin_defs.js rename to src/static/js/pluginfw/plugin_defs.ts index f7d10879e..1a7553757 100644 --- a/src/static/js/pluginfw/plugin_defs.js +++ b/src/static/js/pluginfw/plugin_defs.ts @@ -8,13 +8,13 @@ // * hook_fn: Plugin-supplied hook function. // * hook_fn_name: Name of the hook function, with the form :. // * part: The ep.json part object that declared the hook. See exports.plugins. -exports.hooks = {}; +export const hooks = {}; // Whether the plugins have been loaded. -exports.loaded = false; +export let loaded = false; // Topologically sorted list of parts from exports.plugins. -exports.parts = []; +export const parts = []; // Maps the name of a plugin to the plugin's definition provided in ep.json. The ep.json object is // augmented with additional metadata: @@ -25,4 +25,20 @@ exports.parts = []; // - version // - path // - realPath -exports.plugins = {}; +export const plugins = {}; + +export const setPlugins = (newPlugins) => { + Object.assign(plugins, newPlugins); +} + +export const setParts = (newParts) => { + Object.assign(parts, newParts); +} + +export const setHooks = (newHooks) => { + Object.assign(hooks, newHooks); +} + +export const setLoaded = (newLoaded) => { + loaded = newLoaded; +} diff --git a/src/static/js/pluginfw/plugins.js b/src/static/js/pluginfw/plugins.ts similarity index 70% rename from src/static/js/pluginfw/plugins.js rename to src/static/js/pluginfw/plugins.ts index ec3cfaa92..ddb9f3c29 100644 --- a/src/static/js/pluginfw/plugins.js +++ b/src/static/js/pluginfw/plugins.ts @@ -1,20 +1,28 @@ 'use strict'; -const fs = require('fs').promises; -const hooks = require('./hooks'); -const log4js = require('log4js'); -const path = require('path'); -const runCmd = require('../../../node/utils/run_cmd'); -const tsort = require('./tsort'); -const pluginUtils = require('./shared'); -const defs = require('./plugin_defs'); +import {promises as fs} from "fs"; + +import {aCallAll} from "./hooks"; + +import log4js from "log4js"; + +import path from "path"; + +import {exportCMD} from "../../../node/utils/run_cmd"; + +import {tsort} from "./tsort"; + +import {extractHooks} from "./shared"; + +import {loaded, parts, plugins, setHooks, setLoaded, setParts, setPlugins} from "./plugin_defs"; +import {PluginInfo} from "../../module/PluginInfo"; const logger = log4js.getLogger('plugins'); // Log the version of npm at startup. (async () => { try { - const version = await runCmd(['npm', '--version'], {stdio: [null, 'string']}); + const version = await exportCMD(['npm', '--version'], {stdio: [null, 'string']}); logger.info(`npm --version: ${version}`); } catch (err) { logger.error(`Failed to get npm version: ${err.stack || err}`); @@ -22,16 +30,19 @@ const logger = log4js.getLogger('plugins'); } })(); -exports.prefix = 'ep_'; +type PartType = { + [keys: string]:any +} +export const prefix = 'ep_'; -exports.formatPlugins = () => Object.keys(defs.plugins).join(', '); +export const formatPlugins = () => Object.keys(plugins).join(', '); -exports.formatParts = () => defs.parts.map((part) => part.full_name).join('\n'); +export const formatParts = () => parts.map((part) => part.full_name).join('\n'); -exports.formatHooks = (hookSetName, html) => { +export const formatHooks = (hookSetName, html) => { let hooks = new Map(); - for (const [pluginName, def] of Object.entries(defs.plugins)) { - for (const part of def.parts) { + for (const [pluginName, def] of Object.entries(plugins)) { + for (const part of parts) { for (const [hookName, hookFnName] of Object.entries(part[hookSetName] || {})) { let hookEntry = hooks.get(hookName); if (!hookEntry) { @@ -53,7 +64,7 @@ exports.formatHooks = (hookSetName, html) => { hooks = new Map([...hooks].sort(sortStringKeys)); for (const [hookName, hookEntry] of hooks) { lines.push(html ? `
${hookName}:
` : ` ${hookName}:`); - const sortedHookEntry = new Map([...hookEntry].sort(sortStringKeys)); + const sortedHookEntry = new Map([...hookEntry].sort(sortStringKeys)); hooks.set(hookName, sortedHookEntry); for (const [pluginName, pluginEntry] of sortedHookEntry) { lines.push(html ? `
${pluginName}:
` : ` ${pluginName}:`); @@ -72,20 +83,20 @@ exports.formatHooks = (hookSetName, html) => { return lines.join('\n'); }; -exports.pathNormalization = (part, hookFnName, hookName) => { +export const pathNormalization = (part, hookFnName, hookName) => { const tmp = hookFnName.split(':'); // hookFnName might be something like 'C:\\foo.js:myFunc'. // If there is a single colon assume it's 'filename:funcname' not 'C:\\filename'. const functionName = (tmp.length > 1 ? tmp.pop() : null) || hookName; const moduleName = tmp.join(':') || part.plugin; - const packageDir = path.dirname(defs.plugins[part.plugin].package.path); + const packageDir = path.dirname(plugins[part.plugin].package.path); const fileName = path.join(packageDir, moduleName); return `${fileName}:${functionName}`; }; -exports.update = async () => { +export const update = async () => { const packages = await exports.getPackages(); - const parts = {}; // Key is full name. sortParts converts this into a topologically sorted array. - const plugins = {}; + let parts:{[keys: string]:any} = {}; // Key is full name. sortParts converts this into a topologically sorted array. + let plugins = {}; // Load plugin metadata ep.json await Promise.all(Object.keys(packages).map(async (pluginName) => { @@ -94,13 +105,13 @@ exports.update = async () => { })); logger.info(`Loaded ${Object.keys(packages).length} plugins`); - defs.plugins = plugins; - defs.parts = sortParts(parts); - defs.hooks = pluginUtils.extractHooks(defs.parts, 'hooks', exports.pathNormalization); - defs.loaded = true; - await Promise.all(Object.keys(defs.plugins).map(async (p) => { + setPlugins(plugins); + setParts(sortParts(parts)) + setHooks(extractHooks(parts, 'hooks', exports.pathNormalization)); + setLoaded(true) + await Promise.all(Object.keys(plugins).map(async (p) => { const logger = log4js.getLogger(`plugin:${p}`); - await hooks.aCallAll(`init_${p}`, {logger}); + await aCallAll(`init_${p}`, {logger}); })); }; @@ -112,13 +123,15 @@ exports.getPackages = async () => { // unset or set to `development`) because otherwise `npm ls` will not mention any packages // that are not included in `package.json` (which is expected to not exist). const cmd = ['npm', 'ls', '--long', '--json', '--depth=0', '--no-production']; - const {dependencies = {}} = JSON.parse(await runCmd(cmd, {stdio: [null, 'string']})); + const {dependencies = {}} = JSON.parse(await exportCMD(cmd, {stdio: [null, 'string']}) as unknown as string); await Promise.all(Object.entries(dependencies).map(async ([pkg, info]) => { if (!pkg.startsWith(exports.prefix)) { delete dependencies[pkg]; return; } - info.realPath = await fs.realpath(info.path); + const mappedInfo = info as PluginInfo + + mappedInfo.realPath = await fs.realpath(mappedInfo.path); })); return dependencies; }; @@ -126,7 +139,7 @@ exports.getPackages = async () => { const loadPlugin = async (packages, pluginName, plugins, parts) => { const pluginPath = path.resolve(packages[pluginName].path, 'ep.json'); try { - const data = await fs.readFile(pluginPath); + const data = await fs.readFile(pluginPath, "utf8"); try { const plugin = JSON.parse(data); plugin.package = packages[pluginName]; @@ -145,7 +158,7 @@ const loadPlugin = async (packages, pluginName, plugins, parts) => { }; const partsToParentChildList = (parts) => { - const res = []; + const res:(string|number)[][] = []; for (const name of Object.keys(parts)) { for (const childName of parts[name].post || []) { res.push([name, childName]); @@ -161,6 +174,7 @@ const partsToParentChildList = (parts) => { }; // Used only in Node, so no need for _ -const sortParts = (parts) => tsort(partsToParentChildList(parts)) - .filter((name) => parts[name] !== undefined) - .map((name) => parts[name]); +//FIXME Is this better +const sortParts = (parts:PartType) => tsort(partsToParentChildList(parts)) + .filter((name) => name !== undefined) + .map((name) => name); diff --git a/src/static/js/pluginfw/shared.js b/src/static/js/pluginfw/shared.ts similarity index 91% rename from src/static/js/pluginfw/shared.js rename to src/static/js/pluginfw/shared.ts index 2c81ccd81..ec22b8cc6 100644 --- a/src/static/js/pluginfw/shared.js +++ b/src/static/js/pluginfw/shared.ts @@ -1,6 +1,6 @@ 'use strict'; -const defs = require('./plugin_defs'); +import {parts} from './plugin_defs'; const disabledHookReasons = { hooks: { @@ -9,7 +9,7 @@ const disabledHookReasons = { }, }; -const loadFn = (path, hookName) => { +export const loadFn = (path, hookName) => { let functionName; const parts = path.split(':'); @@ -33,7 +33,7 @@ const loadFn = (path, hookName) => { return fn; }; -const extractHooks = (parts, hookSetName, normalizer) => { +export const extractHooks = (parts, hookSetName, normalizer) => { const hooks = {}; for (const part of parts) { for (const [hookName, regHookFnName] of Object.entries(part[hookSetName] || {})) { @@ -72,9 +72,7 @@ const extractHooks = (parts, hookSetName, normalizer) => { } } return hooks; -}; - -exports.extractHooks = extractHooks; +} /* * Returns an array containing the names of the installed client-side plugins @@ -88,8 +86,8 @@ exports.extractHooks = extractHooks; * No plugins: [] * Some plugins: [ 'ep_adminpads', 'ep_add_buttons', 'ep_activepads' ] */ -exports.clientPluginNames = () => { - const clientPluginNames = defs.parts +export const clientPluginNames = () => { + const clientPluginNames = parts .filter((part) => Object.prototype.hasOwnProperty.call(part, 'client_hooks')) .map((part) => `plugin-${part.plugin}`); return [...new Set(clientPluginNames)]; diff --git a/src/static/js/pluginfw/tsort.js b/src/static/js/pluginfw/tsort.ts similarity index 89% rename from src/static/js/pluginfw/tsort.js rename to src/static/js/pluginfw/tsort.ts index 117f8555c..bebac95c0 100644 --- a/src/static/js/pluginfw/tsort.js +++ b/src/static/js/pluginfw/tsort.ts @@ -4,14 +4,14 @@ * general topological sort * from https://gist.github.com/1232505 * @author SHIN Suzuki (shinout310@gmail.com) - * @param Array edges : list of edges. each edge forms Array e.g. [12 , 3] + * @param edges Array edges : list of edges. each edge forms Array e.g. [12 , 3] * * @returns Array : topological sorted list of IDs **/ -const tsort = (edges) => { +export const tsort = (edges: (string|number)[][]) => { const nodes = {}; // hash: stringified id of the node => { id: id, afters: lisf of ids } - const sorted = []; // sorted list of IDs ( returned value ) + const sorted: (string|number)[][]= []; // sorted list of IDs ( returned value ) const visited = {}; // hash: id of already visited node => true const Node = function (id) { @@ -62,7 +62,7 @@ const tsort = (edges) => { **/ const tsortTest = () => { // example 1: success - let edges = [ + let edges:(string|number)[][] = [ [1, 2], [1, 3], [2, 4], diff --git a/src/static/module/InstallerModel.ts b/src/static/module/InstallerModel.ts new file mode 100644 index 000000000..39e6bf51d --- /dev/null +++ b/src/static/module/InstallerModel.ts @@ -0,0 +1,5 @@ +export type InstallerModel = { + name: string, + description: string, + +} diff --git a/src/static/module/PluginInfo.ts b/src/static/module/PluginInfo.ts new file mode 100644 index 000000000..8508e3c4b --- /dev/null +++ b/src/static/module/PluginInfo.ts @@ -0,0 +1,4 @@ +export type PluginInfo = { + realPath: string, + path: string, +} diff --git a/src/tsconfig.json b/src/tsconfig.json index b99c6c15a..fb9bc8c7a 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "allowJs": true, "typeRoots": ["node_modules/@types"], "types": ["node", "jquery"], "module": "commonjs", @@ -7,7 +8,7 @@ "target": "es6", "moduleResolution": "node", "sourceMap": true, - "outDir": "dist" + "outDir": "../dist" }, "lib": ["es2015"] }