Talk:Parsoid

Jump to navigation Jump to search

About this board

MediaWiki 1.35 Error contacting the Parsoid/RESTBase server: (curl error: 28) Timeout was reached

1
CharlesCivi (talkcontribs)

I just installed MediaWiki 1.35 on an Amazon Linux EC2 server, with php 7.3 and MariaDB

Everything seems to work fine, except when I try to edit a page using VisualEditor.

I cannot load a page for editing, I get the error:

Error contacting the Parsoid/RESTBase server: (curl error: 28) Timeout was reached

I can edit a new page with VisualEditor, but I when I try to save it, I get the same error.

Error contacting the Parsoid/RESTBase server: (curl error: 28) Timeout was reached

I have no trouble reaching the page via the REST endpoint:

http://MyWayCoolIPAddress/rest.php/v1/page/Main_Page

Which returns:

// 20201019142902

// http://MyWayCoolIPAddress/rest.php/v1/page/Main_Page

{

 "id": 1,
 "key": "Main_Page",
 "title": "Main Page",
 "latest": {
   "id": 1,
   "timestamp": "2020-10-14T17:17:27Z"
 },
 "content_model": "wikitext",
 "license": {
   "url": "",
   "title": ""
 },
 "source": "MediaWiki has been installed.\n\nConsult the User's Guide for information on using the wiki software.\n\n== Getting started ==\n* Configuration settings list\n* MediaWiki FAQ\n* MediaWiki release mailing list\n* Localise MediaWiki for your language\n* Learn how to combat spam on your wiki"

}


If I try to call the API endpoint directly:

http://MyWayCoolIPAddress/api.php?action=visualeditor&paction=parse&page=Main_Page

I get a similar error:

{

   "error": {
       "code": "apierror-visualeditor-docserver-http-error",
       "info": "Error contacting the Parsoid/RESTBase server: (curl error: 28) Timeout was reached",
       "*": "See http://MyWayCoolIPAddress/api.php for API usage. Subscribe to the mediawiki-api-announce mailing list at <https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce> for notice of API deprecations and breaking changes."
   }

}

This is MediaWiki 1.35, and as far as I know it includes Parsoid-PHP, so I don't need to do any additional configuration.

I assume VisualEditor is not the problem because I can edit a new page, I just can't save it.

Reply to "MediaWiki 1.35 Error contacting the Parsoid/RESTBase server: (curl error: 28) Timeout was reached"
2405:201:300B:8199:A13A:4053:59CD:BE98 (talkcontribs)

I am using service runner to use parsoid.js but it doesn't terminate even after I use runner.stop() argument, these are the options I passed to service runner what changes should be made here. {

       name: 'parsoid',
       module: 'node_modules/parsoid/lib/index.js',
       entrypoint: 'apiServiceWorker',
       conf: {
         timeouts: {
           // request: 4 * 60 * 1000, // Default
           request: 8 * 60 * 1000,
         },
         limits: {
           wt2html: {
             // maxWikitextSize: 1000000, // Default
             maxWikitextSize: 1000000 * 4,
             // maxListItems: 30000, // Default
             maxListItems: 30000 * 4,
             // maxTableCells: 30000, // Default
             maxTableCells: 30000 * 4,
             // maxTransclusions: 10000, // Default
             maxTransclusions: 10000 * 4,
             // maxImages: 1000, // Default
             maxImages: 1000 * 4,
             // maxTokens: 1000000, // Default
             maxTokens: 1000000 * 4,
           },
         },
         mwApis: [{
           uri: this.mw.apiUrl.href,
         }],
       },
     },

there was another service named MCS linked with it

SSastry (WMF) (talkcontribs)

We have *NOT* tested Parsoid/JS with node v0.12 and it is likely that is where this is failing. We will not be supporting Parsoid/JS on newer node versions since Parsoid has been ported over to PHP and is being integrated into MediaWiki core directly.

But, if we have a solution to this problem, we'll share here.


EDIT: I meant to say: we have *NOT* tested ... and missed the NOT,

Manan jethwani (talkcontribs)

hey thanks for replying but the parsoid doesn't terminate even on v0.12 I tried it at that point as well....

Manan jethwani (talkcontribs)

services: [{

        name: 'mcs',
        module: 'node_modules/service-mobileapp-node/app.js',
        conf: {
          port: 6927,
          mwapi_req: {
Manan jethwani (talkcontribs)
Manan jethwani (talkcontribs)
},
       }, {
       name: 'parsoid',
       module: 'node_modules/parsoid/lib/index.js',
       entrypoint: 'apiServiceWorker',
       conf: {
         limits: {
           wt2html: {
             // maxWikitextSize: 1000000, // Default
             maxWikitextSize: 1000000 * 4,
             // maxListItems: 30000, // Default
             maxListItems: 30000 * 4,
             // maxTableCells: 30000, // Default
             maxTableCells: 30000 * 4,
             // maxTransclusions: 10000, // Default
             maxTransclusions: 10000 * 4,
             // maxImages: 1000, // Default
             maxImages: 1000 * 4,
             // maxTokens: 1000000, // Default
             maxTokens: 1000000 * 4,
           },
         },
         mwApis: [{
           uri: this.mw.apiUrl.href,
         }],
       },
Manan jethwani (talkcontribs)

these are the all options I am using for services in service runner

SSastry (WMF) (talkcontribs)

Sorry, I edited my comment above, but we have *NOT* tested this with v0.12.

Manan jethwani (talkcontribs)

ok but can you just mention where are all the arguments for configuration mentioned so that I can try to apply it myself if possible

Reply to "service doesn't terminate"

Parsoid doesn't run: "cannot find module index.js"

4
AID-PMBD (talkcontribs)

Hello Everyone,

Setup:

Mediawiki Version: 1.31

Node.js Version: 10.22.0

Parsoid Version: 0.9.0 from https://releases.wikimedia.org/parsoid/

OS: Ubuntu 18.04

I've been trying to get Parsoid and Visual Editor running for a while now.

Error

Visual Editor gives me this Error when I try to edit a page:

"Fehler beim Laden der Daten vom Server: apierror-visualeditor-docserver-http-error: (curl error: 7) Couldn't connect to server"

Also the Version page of my Wiki doesn't list Parsoid at all. I therefore concluded that Parsoid isn't running properly.

When I try to run Parsoid manually with the command: node bin/server.js

I get this error: https://pastebin.com/q7g2p3DY

When I try to start Parsoid with "sudo service parsoid restart" I get the error: "Failed to restart parsoid.service: Unit parsoid.service not found".

Parsoid Installation workflow:

wget https://releases.wikimedia.org/parsoid/parsoid_0.9.0all_all.deb

sudo dpkg -i parsoid_0.9.0all_all.deb

sudo apt-get install -f

Then I edited the config.yaml in /etc/mediawiki/parsoid adding my Api adress.

I did the same with the config.yaml in /usr/lib/parsoid/src.

I can curl my Api with "curl http://192.168.178.XX/XXXX/api.php"

Does anyone have an idea what I can do to makes this configuration work? Unfortunately I need some extensions for my project that are not supported beyond MW 1.31, so I can't just update to the latest version.

Cheers

AID-PMBD

Arlolra (talkcontribs)
AID-PMBD (talkcontribs)

Thank you for the reply.


I reinstalled parsoid following the instructions given in the post you linked me to, but now I get a different error when trying to run it:


Installation Workflow:

1.       cd /opt

2.       Sudo git clone --depth 1 --branch v0.9.0 https://gerrit.wikimedia.org/r/p/mediawiki/services/parsoid parsoid

3.       Config.yaml in cd /opt/parsoid edited


Error:

When using "node bin/server.js"


internal/modules/cjs/loader.js:638

   throw err;

   ^

Error: Cannot find module 'service-runner'

   at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)

   at Function.Module._load (internal/modules/cjs/loader.js:562:25)

   at Module.require (internal/modules/cjs/loader.js:692:17)

   at require (internal/modules/cjs/helpers.js:25:18)

   at Object.<anonymous> (/opt/parsoid/bin/server.js:5:21)

   at Module._compile (internal/modules/cjs/loader.js:778:30)

   at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)

   at Module.load (internal/modules/cjs/loader.js:653:32)

   at tryModuleLoad (internal/modules/cjs/loader.js:593:12)

   at Function.Module._load (internal/modules/cjs/loader.js:585:3)


When using "sudo service parsoid start"


Failed to start parsoid.service: Unit parsoid.service not found.


Any idea as to where I went wrong this time?


Cheers

AID-PMBD

AID-PMBD (talkcontribs)

If someone has any idea as to what I could do to fix the issue it would be appreciated.


Cheers

AID-PMBD

Reply to "Parsoid doesn't run: "cannot find module index.js""

Couldn't resolve host name (curl error: 6) but able to curl MediaWiki fine

2
Summary by Arlolra

User disappeared

FireAmpersand (talkcontribs)

Not sure if I should be posting here or on the visualeditor page, but I can't for the life of me get Parsaoid/VisualEditor working.

Here is some info about my setup:

- Host: Centos 8

- Docker Installed and MediaWiki is running on that with 80->80

- MediaWiki is a private wiki

- Parsaoid is installed on the host and mapped to 8001 (Default had a conflict with container already in use)

- VisualEditor is installed and throws no error other then the one in the title.


Now I have gone through the following pages to try to troubleshoot my issue:

Parsoid/Troubleshooting

Extension:VisualEditor#Linking with Parsoid in private wikis


Currently I can curl the api through Parsoid and get values through a private wiki but within mediawiki, I can not edit with visual editor.


LocalSetting.php


<?php

# This file was automatically generated by the MediaWiki 1.34.0

# installer. If you make manual changes, please keep track in case you

# need to recreate them later.

#

# See includes/DefaultSettings.php for all configurable settings

# and their default values, but don't forget to make changes in _this_

# file, not there.

#

# Further documentation for configuration settings may be found at:

# https://www.mediawiki.org/wiki/Manual:Configuration_settings

# Protect against web entry

if ( !defined( 'MEDIAWIKI' ) ) {

   exit;

}

## Uncomment this to disable output compression

# $wgDisableOutputCompression = true;

$wgSitename = "FireAmpersand Documentation";

$wgMetaNamespace = "FireAmpersand_Documentation";

## The URL base path to the directory containing the wiki;

## defaults for all runtime URL paths are based off of this.

## For more information on customizing the URLs

## (like /w/index.php/Page_title to /wiki/Page_title) please see:

## https://www.mediawiki.org/wiki/Manual:Short_URL

$wgScriptPath = "";

## The protocol and server name to use in fully-qualified URLs

$wgServer = "http://bumblebee.fireampersand.ca";

## The URL path to static resources (images, scripts, etc.)

$wgResourceBasePath = $wgScriptPath;

## The URL path to the logo.  Make sure you change this from the default,

## or else you'll overwrite your logo when you upgrade!

$wgLogo = "$wgResourceBasePath/resources/assets/wiki.png";

## UPO means: this is also a user preference option

$wgEnableEmail = false;

$wgEnableUserEmail = true; # UPO

$wgEmergencyContact = "apache@🌻.invalid";

$wgPasswordSender = "apache@🌻.invalid";

$wgEnotifUserTalk = false; # UPO

$wgEnotifWatchlist = false; # UPO

$wgEmailAuthentication = true;

## Database settings

$wgDBtype = "sqlite";

$wgDBserver = "";

$wgDBname = "my_wiki";

$wgDBuser = "";

$wgDBpassword = "";

# SQLite-specific settings

$wgSQLiteDataDir = "/var/www/data";

$wgObjectCaches[CACHE_DB] = [

   'class' => SqlBagOStuff::class,

   'loggroup' => 'SQLBagOStuff',

   'server' => [

       'type' => 'sqlite',

       'dbname' => 'wikicache',

       'tablePrefix' => '',

       'variables' => [ 'synchronous' => 'NORMAL' ],

       'dbDirectory' => $wgSQLiteDataDir,

       'trxMode' => 'IMMEDIATE',

       'flags' => 0

   ]

];

$wgLocalisationCacheConf['storeServer'] = [

   'type' => 'sqlite',

   'dbname' => "{$wgDBname}_l10n_cache",

   'tablePrefix' => '',

   'variables' => [ 'synchronous' => 'NORMAL' ],

   'dbDirectory' => $wgSQLiteDataDir,

   'trxMode' => 'IMMEDIATE',

   'flags' => 0

];

$wgJobTypeConf['default'] = [

   'class' => 'JobQueueDB',

   'claimTTL' => 3600,

   'server' => [

       'type' => 'sqlite',

       'dbname' => "{$wgDBname}_jobqueue",

       'tablePrefix' => '',

       'variables' => [ 'synchronous' => 'NORMAL' ],

       'dbDirectory' => $wgSQLiteDataDir,

       'trxMode' => 'IMMEDIATE',

       'flags' => 0

   ]

];

## Shared memory settings

$wgMainCacheType = CACHE_ACCEL;

$wgMemCachedServers = [];

## To enable image uploads, make sure the 'images' directory

## is writable, then set this to true:

$wgEnableUploads = true;

$wgUseImageMagick = true;

$wgImageMagickConvertCommand = "/usr/bin/convert";

# InstantCommons allows wiki to use images from https://commons.wikimedia.org

$wgUseInstantCommons = false;

# Periodically send a pingback to https://www.mediawiki.org/ with basic data

# about this MediaWiki instance. The Wikimedia Foundation shares this data

# with MediaWiki developers to help guide future development efforts.

$wgPingback = false;

## If you use ImageMagick (or any other shell command) on a

## Linux server, this will need to be set to the name of an

## available UTF-8 locale

$wgShellLocale = "C.UTF-8";

## Set $wgCacheDirectory to a writable directory on the web server

## to make your wiki go slightly faster. The directory should not

## be publicly accessible from the web.

#$wgCacheDirectory = "$IP/cache";

# Site language code, should be one of the list in ./languages/data/Names.php

$wgLanguageCode = "en-ca";

$wgSecretKey = "d8f1a050a167350916861d1c65c428ec2e15ef1ddde8c3d305533350dd83f480";

# Changing this will log out all existing sessions.

$wgAuthenticationTokenVersion = "1";

# Site upgrade key. Must be set to a string (default provided) to turn on the

# web installer while LocalSettings.php is in place

$wgUpgradeKey = "364ffa43b8516e75";

## For attaching licensing metadata to pages, and displaying an

## appropriate copyright notice / icon. GNU Free Documentation

## License and Creative Commons licenses are supported so far.

$wgRightsPage = ""; # Set to the title of a wiki page that describes your license/copyright

$wgRightsUrl = "";

$wgRightsText = "";

$wgRightsIcon = "";

# Path to the GNU diff3 utility. Used for conflict resolution.

$wgDiff3 = "/usr/bin/diff3";

# The following permissions were set based on your choice in the installer

$wgGroupPermissions['*']['createaccount'] = false;

$wgGroupPermissions['*']['edit'] = false;

$wgGroupPermissions['*']['read'] = false;

## Default skin: you can change the default skin. Use the internal symbolic

## names, ie 'vector', 'monobook':

$wgDefaultSkin = "vector";

# Enabled skins.

# The following skins were automatically enabled:

wfLoadSkin( 'MonoBook' );

wfLoadSkin( 'Timeless' );

wfLoadSkin( 'Vector' );

# End of automatically generated settings.

# Add more configuration options below.

#Extensions

# VisualEditor

wfLoadExtension( 'VisualEditor' );

$wgDefaultUserOptions['visualeditor-enable'] = 1;

$wgHiddenPrefs[] = 'visualeditor-enable';

#Parsoid Connection

$wgVirtualRestConfig['modules']['parsoid'] = array(

   #URL to the Parsoid instance

   'url' => 'http://bumblebee.fireampersand.ca:8001',

   'domain' => 'localhost',

   'prefix' => 'localhost'

   );

//$wgSessionsInObjectCache = true;

//$wgVirtualRestConfig['modules']['parsoid']['forwardCookies'] = true;

if ( $_SERVER['REMOTE_ADDR'] == '172.17.0.1'){

   $wgGroupPermissions['*']['read'] = true;

   $wgGroupPermissions['*']['edit'] = true;

};

ini_set('error_log','/tmp/php-error.log');

error_log($_SERVER['REMOTE_ADDR']);



Any help would be apreciated, been working on this since last night.

Arlolra (talkcontribs)

Error in the npm test for the parsoid folder?

6
Summary by Arlolra

Follow CentOS step-by-step

Pdwangchao (talkcontribs)

I installed the parsoid and run the "npm install", everything is OK. But when I use the npm test ,Error occoured. Anyone knows the reason or give some advise?

the log file is below:

0 info it worked if it ends with ok

1 verbose cli [ '/usr/local/bin/node', '/usr/local/bin/npm', 'run', 'nsp' ]

2 info using npm@5.4.0

3 info using node@v6.11.2

4 verbose run-script [ 'prensp', 'nsp', 'postnsp' ]

5 info lifecycle parsoid@0.7.1~prensp: parsoid@0.7.1

6 info lifecycle parsoid@0.7.1~nsp: parsoid@0.7.1

7 verbose lifecycle parsoid@0.7.1~nsp: unsafe-perm in lifecycle true

8 verbose lifecycle parsoid@0.7.1~nsp: PATH: /usr/local/lib/node_modules/npm/bin/node-gyp-bin:/data/wwwroot/default/mediawiki/services/parsoid/node_modules/.bin:/usr/local/lib/node_modules/npm/bin/node-gyp-bin:/data/wwwroot/default/mediawiki/services/parsoid/node_modules/.bin:/usr/local/php/bin:/usr/local/apache/bin:/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

9 verbose lifecycle parsoid@0.7.1~nsp: CWD: /data/wwwroot/default/mediawiki/services/parsoid

10 silly lifecycle parsoid@0.7.1~nsp: Args: [ '-c', 'nsp check' ]

11 silly lifecycle parsoid@0.7.1~nsp: Returned: code: 1  signal: null

12 info lifecycle parsoid@0.7.1~nsp: Failed to exec nsp script

13 verbose stack Error: parsoid@0.7.1 nsp: `nsp check`

13 verbose stack Exit status 1

13 verbose stack     at EventEmitter.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/index.js:280:16)

13 verbose stack     at emitTwo (events.js:106:13)

13 verbose stack     at EventEmitter.emit (events.js:191:7)

13 verbose stack     at ChildProcess.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/lib/spawn.js:55:14)

13 verbose stack     at emitTwo (events.js:106:13)

13 verbose stack     at ChildProcess.emit (events.js:191:7)

13 verbose stack     at maybeClose (internal/child_process.js:891:16)

13 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5)

14 verbose pkgid parsoid@0.7.1

15 verbose cwd /data/wwwroot/default/mediawiki/services/parsoid

16 verbose Linux 3.10.0-514.26.2.el7.x86_64

17 verbose argv "/usr/local/bin/node" "/usr/local/bin/npm" "run" "nsp"

18 verbose node v6.11.2

19 verbose npm  v5.4.0

20 error code ELIFECYCLE

21 error errno 1

22 error parsoid@0.7.1 nsp: `nsp check`

22 error Exit status 1

23 error Failed at the parsoid@0.7.1 nsp script.

23 error This is probably not a problem with npm. There is likely additional logging output above.

24 verbose exit [ 1, true ]

Arlolra (talkcontribs)

Are there any warnings of missing packages when you run npm ls?

nsp check makes a request to nodesecurity.io, is that being rejected by a firewall or something>

Pdwangchao (talkcontribs)

Hi Arlolra

Thanks for your reply!

Yes, it exists.

when I use "npm ls", the output is below. I google for it but have no idea. when I run the "nsp check", nothing happened. Then I ran it again and the output is "bash: nsp: command not found..."

By the way, I install the parsoid by git clone method, and install the nodejs by yum method(v6.11.1) and then the make method(v6.11.2).

npm ls:

parsoid@0.7.1 /data/wwwroot/default/mediawiki/services/parsoid

├── alea@0.0.9

├── async@0.9.2

├─┬ babybird@0.0.1

│ ├── asap@2.0.5

│ └── is-arguments@1.0.2

├─┬ body-parser@1.17.1

│ ├── bytes@2.4.0

│ ├── content-type@1.0.2

│ ├─┬ debug@2.6.1

│ │ └── ms@0.7.2

│ ├── depd@1.1.0

│ ├─┬ http-errors@1.6.1

│ │ ├── depd@1.1.0 deduped

│ │ ├── inherits@2.0.3

│ │ ├── setprototypeof@1.0.3 deduped

│ │ └── statuses@1.3.1 deduped

│ ├── iconv-lite@0.4.15

│ ├─┬ on-finished@2.3.0

│ │ └── ee-first@1.1.1

│ ├── qs@6.4.0

│ ├─┬ raw-body@2.2.0

│ │ ├── bytes@2.4.0 deduped

│ │ ├── iconv-lite@0.4.15 deduped

│ │ └── unpipe@1.0.0 deduped

│ └─┬ type-is@1.6.15

│   ├── media-typer@0.3.0

│   └── mime-types@2.1.15 deduped

├─┬ chai@3.5.0

│ ├── assertion-error@1.0.2

│ ├─┬ deep-eql@0.1.3

│ │ └── type-detect@0.1.1

│ └── type-detect@1.0.0

├── colors@1.1.2

├─┬ compression@1.6.2

│ ├─┬ accepts@1.3.3

│ │ ├── mime-types@2.1.15 deduped

│ │ └── negotiator@0.6.1 deduped (git+https://github.com/arlolra/negotiator.git#0418ab4e9a665772b7e233564a4525c9d9a8ec3a)

│ ├── bytes@2.3.0

│ ├─┬ compressible@2.0.10

│ │ └── mime-db@1.27.0

│ ├─┬ debug@2.2.0

│ │ └── ms@0.7.1

│ ├── on-headers@1.0.1

│ └── vary@1.1.1

├─┬ connect-busboy@0.0.2

│ └─┬ busboy@0.2.14

│   ├─┬ dicer@0.2.5

│   │ ├── readable-stream@1.1.14 deduped

│   │ └── streamsearch@0.1.2

│   └─┬ readable-stream@1.1.14

│     ├── core-util-is@1.0.2

│     ├── inherits@2.0.3 deduped

│     ├── isarray@0.0.1

│     └── string_decoder@0.10.31

├── content-type@1.0.1 (git+https://github.com/wikimedia/content-type.git#47b2632d0a2ee79a7d67268e2f6621becd95d05b)

├── core-js@2.4.1

├─┬ coveralls@2.13.0

│ ├─┬ js-yaml@3.6.1

│ │ ├── argparse@1.0.9 deduped

│ │ └── esprima@2.7.3

│ ├── lcov-parse@0.0.10

│ ├── log-driver@1.2.5

│ ├── minimist@1.2.0

│ └─┬ request@2.79.0

│   ├── aws-sign2@0.6.0 deduped

│   ├── aws4@1.6.0 deduped

│   ├── caseless@0.11.0

│   ├── combined-stream@1.0.5 deduped

│   ├── extend@3.0.0 deduped

│   ├── forever-agent@0.6.1 deduped

│   ├── form-data@2.1.2 deduped

│   ├─┬ har-validator@2.0.6

│   │ ├── chalk@1.1.3 deduped

│   │ ├─┬ commander@2.9.0

│   │ │ └── graceful-readlink@1.0.1

│   │ ├── is-my-json-valid@2.16.0 deduped

│   │ └─┬ pinkie-promise@2.0.1

│   │   └── pinkie@2.0.4

│   ├── hawk@3.1.3 deduped

│   ├── http-signature@1.1.1 deduped

│   ├── is-typedarray@1.0.0 deduped

│   ├── isstream@0.1.2 deduped

│   ├── json-stringify-safe@5.0.1 deduped

│   ├── mime-types@2.1.15 deduped

│   ├── oauth-sign@0.8.2 deduped

│   ├── qs@6.3.2

│   ├── stringstream@0.0.5 deduped

│   ├── tough-cookie@2.3.2 deduped

│   ├── tunnel-agent@0.4.3

│   └── uuid@3.0.1

├── diff@1.4.0

├── domino@1.0.28

├── entities@1.1.1

├─┬ eslint@3.19.0

│ ├─┬ babel-code-frame@6.22.0

│ │ ├── chalk@1.1.3 deduped

│ │ ├── esutils@2.0.2 deduped

│ │ └── js-tokens@3.0.1

│ ├─┬ chalk@1.1.3

│ │ ├── ansi-styles@2.2.1

│ │ ├── escape-string-regexp@1.0.5

│ │ ├─┬ has-ansi@2.0.0

│ │ │ └── ansi-regex@2.1.1 deduped

│ │ ├─┬ strip-ansi@3.0.1

│ │ │ └── ansi-regex@2.1.1 deduped

│ │ └── supports-color@2.0.0

│ ├─┬ concat-stream@1.6.0

│ │ ├── inherits@2.0.3 deduped

│ │ ├─┬ readable-stream@2.2.9

│ │ │ ├── buffer-shims@1.0.0

│ │ │ ├── core-util-is@1.0.2 deduped

│ │ │ ├── inherits@2.0.3 deduped

│ │ │ ├── isarray@1.0.0

│ │ │ ├── process-nextick-args@1.0.7

│ │ │ ├─┬ string_decoder@1.0.0

│ │ │ │ └── buffer-shims@1.0.0 deduped

│ │ │ └── util-deprecate@1.0.2

│ │ └── typedarray@0.0.6

│ ├── debug@2.6.1 deduped

│ ├─┬ doctrine@2.0.0

│ │ ├── esutils@2.0.2 deduped

│ │ └── isarray@1.0.0

│ ├─┬ escope@3.6.0

│ │ ├─┬ es6-map@0.1.5

│ │ │ ├─┬ d@1.0.0

│ │ │ │ └── es5-ext@0.10.15 deduped

│ │ │ ├─┬ es5-ext@0.10.15

│ │ │ │ ├── es6-iterator@2.0.1 deduped

│ │ │ │ └── es6-symbol@3.1.1 deduped

│ │ │ ├─┬ es6-iterator@2.0.1

│ │ │ │ ├── d@1.0.0 deduped

│ │ │ │ ├── es5-ext@0.10.15 deduped

│ │ │ │ └── es6-symbol@3.1.1 deduped

│ │ │ ├─┬ es6-set@0.1.5

│ │ │ │ ├── d@1.0.0 deduped

│ │ │ │ ├── es5-ext@0.10.15 deduped

│ │ │ │ ├── es6-iterator@2.0.1 deduped

│ │ │ │ ├── es6-symbol@3.1.1 deduped

│ │ │ │ └── event-emitter@0.3.5 deduped

│ │ │ ├─┬ es6-symbol@3.1.1

│ │ │ │ ├── d@1.0.0 deduped

│ │ │ │ └── es5-ext@0.10.15 deduped

│ │ │ └─┬ event-emitter@0.3.5

│ │ │   ├── d@1.0.0 deduped

│ │ │   └── es5-ext@0.10.15 deduped

│ │ ├─┬ es6-weak-map@2.0.2

│ │ │ ├── d@1.0.0 deduped

│ │ │ ├── es5-ext@0.10.15 deduped

│ │ │ ├── es6-iterator@2.0.1 deduped

│ │ │ └── es6-symbol@3.1.1 deduped

│ │ ├─┬ esrecurse@4.1.0

│ │ │ ├── estraverse@4.1.1

│ │ │ └── object-assign@4.1.1 deduped

│ │ └── estraverse@4.2.0

│ ├─┬ espree@3.4.2

│ │ ├── acorn@5.0.3

│ │ └─┬ acorn-jsx@3.0.1

│ │   └── acorn@3.3.0

│ ├─┬ esquery@1.0.0

│ │ └── estraverse@4.2.0

│ ├── estraverse@4.2.0

│ ├── esutils@2.0.2

│ ├─┬ file-entry-cache@2.0.0

│ │ ├─┬ flat-cache@1.2.2

│ │ │ ├── circular-json@0.3.1

│ │ │ ├─┬ del@2.2.2

│ │ │ │ ├─┬ globby@5.0.0

│ │ │ │ │ ├─┬ array-union@1.0.2

│ │ │ │ │ │ └── array-uniq@1.0.3

│ │ │ │ │ ├── arrify@1.0.1

│ │ │ │ │ ├─┬ glob@7.1.1

│ │ │ │ │ │ ├── fs.realpath@1.0.0 deduped

│ │ │ │ │ │ ├── inflight@1.0.6 deduped

│ │ │ │ │ │ ├── inherits@2.0.3 deduped

│ │ │ │ │ │ ├── minimatch@3.0.3 deduped

│ │ │ │ │ │ ├── once@1.4.0 deduped

│ │ │ │ │ │ └── path-is-absolute@1.0.1 deduped

│ │ │ │ │ ├── object-assign@4.1.1 deduped

│ │ │ │ │ ├── pify@2.3.0 deduped

│ │ │ │ │ └── pinkie-promise@2.0.1 deduped

│ │ │ │ ├── is-path-cwd@1.0.0

│ │ │ │ ├─┬ is-path-in-cwd@1.0.0

│ │ │ │ │ └─┬ is-path-inside@1.0.0

│ │ │ │ │   └── path-is-inside@1.0.2 deduped

│ │ │ │ ├── object-assign@4.1.1 deduped

│ │ │ │ ├── pify@2.3.0

│ │ │ │ ├── pinkie-promise@2.0.1 deduped

│ │ │ │ └─┬ rimraf@2.6.1

│ │ │ │   └─┬ glob@7.1.1

│ │ │ │     ├── fs.realpath@1.0.0 deduped

│ │ │ │     ├── inflight@1.0.6 deduped

│ │ │ │     ├── inherits@2.0.3 deduped

│ │ │ │     ├── minimatch@3.0.3 deduped

│ │ │ │     ├── once@1.4.0 deduped

│ │ │ │     └── path-is-absolute@1.0.1 deduped

│ │ │ ├── graceful-fs@4.1.11 deduped

│ │ │ └─┬ write@0.2.1

│ │ │   └── mkdirp@0.5.1 deduped

│ │ └── object-assign@4.1.1

│ ├─┬ glob@7.1.1

│ │ ├── fs.realpath@1.0.0

│ │ ├─┬ inflight@1.0.6

│ │ │ ├── once@1.4.0 deduped

│ │ │ └── wrappy@1.0.2 deduped

│ │ ├── inherits@2.0.3 deduped

│ │ ├─┬ minimatch@3.0.3

│ │ │ └─┬ brace-expansion@1.1.6

│ │ │   ├── balanced-match@0.4.2

│ │ │   └── concat-map@0.0.1

│ │ ├── once@1.4.0 deduped

│ │ └── path-is-absolute@1.0.1

│ ├── globals@9.17.0

│ ├── ignore@3.2.7

│ ├── imurmurhash@0.1.4

│ ├─┬ inquirer@0.12.0

│ │ ├── ansi-escapes@1.4.0

│ │ ├── ansi-regex@2.1.1

│ │ ├── chalk@1.1.3 deduped

│ │ ├─┬ cli-cursor@1.0.2

│ │ │ └─┬ restore-cursor@1.0.1

│ │ │   ├── exit-hook@1.1.1

│ │ │   └── onetime@1.1.0

│ │ ├── cli-width@2.1.0

│ │ ├─┬ figures@1.7.0

│ │ │ ├── escape-string-regexp@1.0.5 deduped

│ │ │ └── object-assign@4.1.1 deduped

│ │ ├── lodash@4.17.4

│ │ ├─┬ readline2@1.0.1

│ │ │ ├── code-point-at@1.1.0 deduped

│ │ │ ├── is-fullwidth-code-point@1.0.0 deduped

│ │ │ └── mute-stream@0.0.5

│ │ ├─┬ run-async@0.1.0

│ │ │ └── once@1.4.0 deduped

│ │ ├── rx-lite@3.1.2

│ │ ├── string-width@1.0.2 deduped

│ │ ├── strip-ansi@3.0.1 deduped

│ │ └── through@2.3.8

│ ├─┬ is-my-json-valid@2.16.0

│ │ ├── generate-function@2.0.0

│ │ ├─┬ generate-object-property@1.2.0

│ │ │ └── is-property@1.0.2

│ │ ├── jsonpointer@4.0.1

│ │ └── xtend@4.0.1

│ ├─┬ is-resolvable@1.0.0

│ │ └── tryit@1.0.3

│ ├── js-yaml@3.8.3 deduped

│ ├─┬ json-stable-stringify@1.0.1

│ │ └── jsonify@0.0.0

│ ├─┬ levn@0.3.0

│ │ ├── prelude-ls@1.1.2

│ │ └─┬ type-check@0.3.2

│ │   └── prelude-ls@1.1.2 deduped

│ ├── lodash@4.17.4

│ ├─┬ mkdirp@0.5.1

│ │ └── minimist@0.0.8

│ ├── natural-compare@1.4.0

│ ├─┬ optionator@0.8.2

│ │ ├── deep-is@0.1.3

│ │ ├── fast-levenshtein@2.0.6

│ │ ├── levn@0.3.0 deduped

│ │ ├── prelude-ls@1.1.2 deduped

│ │ ├── type-check@0.3.2 deduped

│ │ └── wordwrap@1.0.0

│ ├── path-is-inside@1.0.2

│ ├── pluralize@1.2.1

│ ├── progress@1.1.8

│ ├─┬ require-uncached@1.0.3

│ │ ├─┬ caller-path@0.1.0

│ │ │ └── callsites@0.2.0

│ │ └── resolve-from@1.0.1

│ ├─┬ shelljs@0.7.7

│ │ ├── glob@7.1.1 deduped

│ │ ├── interpret@1.0.3

│ │ └─┬ rechoir@0.6.2

│ │   └── resolve@1.1.7 deduped

│ ├── strip-bom@3.0.0

│ ├── strip-json-comments@2.0.1

│ ├─┬ table@3.8.3

│ │ ├─┬ ajv@4.11.5

│ │ │ ├── co@4.6.0

│ │ │ └── json-stable-stringify@1.0.1 deduped

│ │ ├── ajv-keywords@1.5.1

│ │ ├── chalk@1.1.3 deduped

│ │ ├── lodash@4.17.4

│ │ ├── slice-ansi@0.0.4

│ │ └─┬ string-width@2.0.0

│ │   ├── is-fullwidth-code-point@2.0.0

│ │   └── strip-ansi@3.0.1 deduped

│ ├── text-table@0.2.0

│ └─┬ user-home@2.0.0

│   └── os-homedir@1.0.2

├── eslint-config-node-services@2.1.1

├─┬ eslint-plugin-jsdoc@3.0.2

│ ├─┬ comment-parser@0.4.0

│ │ └─┬ readable-stream@2.2.9

│ │   ├── buffer-shims@1.0.0 deduped

│ │   ├── core-util-is@1.0.2 deduped

│ │   ├── inherits@2.0.3 deduped

│ │   ├── isarray@1.0.0

│ │   ├── process-nextick-args@1.0.7 deduped

│ │   ├─┬ string_decoder@1.0.0

│ │   │ └── buffer-shims@1.0.0 deduped

│ │   └── util-deprecate@1.0.2 deduped

│ └── lodash@4.17.4

├─┬ eslint-plugin-json@1.2.0

│ └─┬ jshint@2.9.4

│   ├─┬ cli@1.0.1

│   │ ├── exit@0.1.2 deduped

│   │ └─┬ glob@7.1.1

│   │   ├── fs.realpath@1.0.0 deduped

│   │   ├── inflight@1.0.6 deduped

│   │   ├── inherits@2.0.3 deduped

│   │   ├── minimatch@3.0.3 deduped

│   │   ├── once@1.4.0 deduped

│   │   └── path-is-absolute@1.0.1 deduped

│   ├─┬ console-browserify@1.1.0

│   │ └── date-now@0.1.4

│   ├── exit@0.1.2

│   ├─┬ htmlparser2@3.8.3

│   │ ├── domelementtype@1.3.0

│   │ ├─┬ domhandler@2.3.0

│   │ │ └── domelementtype@1.3.0 deduped

│   │ ├─┬ domutils@1.5.1

│   │ │ ├─┬ dom-serializer@0.1.0

│   │ │ │ ├── domelementtype@1.1.3

│   │ │ │ └── entities@1.1.1 deduped

│   │ │ └── domelementtype@1.3.0 deduped

│   │ ├── entities@1.0.0

│   │ └── readable-stream@1.1.14 deduped

│   ├── lodash@3.7.0

│   ├── minimatch@3.0.3 deduped

│   ├── shelljs@0.3.0

│   └── strip-json-comments@1.0.4

├─┬ express@4.15.2

│ ├── accepts@1.3.3 deduped

│ ├── array-flatten@1.1.1

│ ├── content-disposition@0.5.2

│ ├── content-type@1.0.2

│ ├── cookie@0.3.1

│ ├── cookie-signature@1.0.6

│ ├── debug@2.6.1 deduped

│ ├── depd@1.1.0 deduped

│ ├── encodeurl@1.0.1

│ ├── escape-html@1.0.3

│ ├── etag@1.8.0

│ ├── finalhandler@1.0.1 deduped

│ ├── fresh@0.5.0

│ ├── merge-descriptors@1.0.1

│ ├── methods@1.1.2

│ ├── on-finished@2.3.0 deduped

│ ├── parseurl@1.3.1

│ ├── path-to-regexp@0.1.7

│ ├─┬ proxy-addr@1.1.4

│ │ ├── forwarded@0.1.0

│ │ └── ipaddr.js@1.3.0

│ ├── qs@6.4.0 deduped

│ ├── range-parser@1.2.0

│ ├─┬ send@0.15.1

│ │ ├── debug@2.6.1 deduped

│ │ ├── depd@1.1.0 deduped

│ │ ├── destroy@1.0.4

│ │ ├── encodeurl@1.0.1 deduped

│ │ ├── escape-html@1.0.3 deduped

│ │ ├── etag@1.8.0 deduped

│ │ ├── fresh@0.5.0 deduped

│ │ ├── http-errors@1.6.1 deduped

│ │ ├── mime@1.3.4

│ │ ├── ms@0.7.2 deduped

│ │ ├── on-finished@2.3.0 deduped

│ │ ├── range-parser@1.2.0 deduped

│ │ └── statuses@1.3.1 deduped

│ ├─┬ serve-static@1.12.1

│ │ ├── encodeurl@1.0.1 deduped

│ │ ├── escape-html@1.0.3 deduped

│ │ ├── parseurl@1.3.1 deduped

│ │ └── send@0.15.1 deduped

│ ├── setprototypeof@1.0.3

│ ├── statuses@1.3.1

│ ├── type-is@1.6.15 deduped

│ ├── utils-merge@1.0.0

│ └── vary@1.1.1 deduped

├─┬ express-handlebars@3.0.0

│ ├─┬ glob@6.0.4

│ │ ├── inflight@1.0.6 deduped

│ │ ├── inherits@2.0.3 deduped

│ │ ├── minimatch@3.0.3 deduped

│ │ ├── once@1.4.0 deduped

│ │ └── path-is-absolute@1.0.1 deduped

│ ├── graceful-fs@4.1.11

│ ├─┬ handlebars@4.0.6

│ │ ├── async@1.5.2

│ │ ├─┬ optimist@0.6.1

│ │ │ ├── minimist@0.0.10

│ │ │ └── wordwrap@0.0.3

│ │ ├─┬ source-map@0.4.4

│ │ │ └── amdefine@1.0.1

│ │ └── UNMET OPTIONAL DEPENDENCY uglify-js@^2.6

│ ├─┬ object.assign@4.0.4

│ │ ├─┬ define-properties@1.1.2

│ │ │ ├── foreach@2.0.5

│ │ │ └── object-keys@1.0.11 deduped

│ │ ├── function-bind@1.1.0

│ │ └── object-keys@1.0.11

│ └─┬ promise@7.1.1

│   └── asap@2.0.5 deduped

├─┬ finalhandler@1.0.1

│ ├─┬ debug@2.6.3

│ │ └── ms@0.7.2 deduped

│ ├── encodeurl@1.0.1 deduped

│ ├── escape-html@1.0.3 deduped

│ ├── on-finished@2.3.0 deduped

│ ├── parseurl@1.3.1 deduped

│ ├── statuses@1.3.1 deduped

│ └── unpipe@1.0.0

├─┬ istanbul@0.4.5

│ ├── abbrev@1.0.9

│ ├── async@1.5.2

│ ├─┬ escodegen@1.8.1

│ │ ├── esprima@2.7.3

│ │ ├── estraverse@1.9.3

│ │ ├── esutils@2.0.2 deduped

│ │ ├── optionator@0.8.2 deduped

│ │ └── source-map@0.4.4 deduped

│ ├── esprima@2.7.3

│ ├─┬ glob@5.0.15

│ │ ├── inflight@1.0.6 deduped

│ │ ├── inherits@2.0.3 deduped

│ │ ├── minimatch@3.0.3 deduped

│ │ ├── once@1.4.0 deduped

│ │ └── path-is-absolute@1.0.1 deduped

│ ├── handlebars@4.0.6 deduped

│ ├── js-yaml@3.8.3 deduped

│ ├── mkdirp@0.5.1 deduped

│ ├─┬ nopt@3.0.6

│ │ └── abbrev@1.0.9 deduped

│ ├─┬ once@1.4.0

│ │ └── wrappy@1.0.2

│ ├── resolve@1.1.7

│ ├─┬ supports-color@3.2.3

│ │ └── has-flag@1.0.0

│ ├─┬ which@1.2.14

│ │ └── isexe@2.0.0

│ └── wordwrap@1.0.0

├─┬ js-yaml@3.8.3

│ ├─┬ argparse@1.0.9

│ │ └── sprintf-js@1.0.3

│ └── esprima@3.1.3

├── mediawiki-title@0.6.3

├─┬ mocha@2.5.3

│ ├── commander@2.3.0

│ ├─┬ debug@2.2.0

│ │ └── ms@0.7.1

│ ├── diff@1.4.0 deduped

│ ├── escape-string-regexp@1.0.2

│ ├─┬ glob@3.2.11

│ │ ├── inherits@2.0.3 deduped

│ │ └─┬ minimatch@0.3.0

│ │   ├── lru-cache@2.7.3

│ │   └── sigmund@1.0.1

│ ├── growl@1.9.2

│ ├─┬ jade@0.26.3

│ │ ├── commander@0.6.1

│ │ └── mkdirp@0.3.0

│ ├── mkdirp@0.5.1 deduped

│ ├── supports-color@1.2.0

│ └── to-iso-string@0.0.2

├── negotiator@0.6.1 (git+https://github.com/arlolra/negotiator.git#0418ab4e9a665772b7e233564a4525c9d9a8ec3a)

├─┬ nock@8.2.1

│ ├── chai@3.5.0 deduped

│ ├── debug@2.6.1 deduped

│ ├── deep-equal@1.0.1

│ ├── json-stringify-safe@5.0.1

│ ├── lodash@4.9.0

│ ├── mkdirp@0.5.1 deduped

│ ├── propagate@0.4.0

│ └── qs@6.4.0 deduped

├── node-uuid@1.4.8

├─┬ nsp@2.6.3

│ ├─┬ chalk@1.1.3

│ │ ├── ansi-styles@2.2.1

│ │ ├── escape-string-regexp@1.0.5

│ │ ├─┬ has-ansi@2.0.0

│ │ │ └── ansi-regex@2.0.0

│ │ ├─┬ strip-ansi@3.0.1

│ │ │ └── ansi-regex@2.0.0

│ │ └── supports-color@2.0.0

│ ├─┬ cli-table@0.3.1

│ │ └── colors@1.0.3

│ ├── cvss@1.0.1

│ ├─┬ https-proxy-agent@1.0.0

│ │ ├─┬ agent-base@2.0.1

│ │ │ ├── extend@3.0.0 deduped

│ │ │ └── semver@5.0.3

│ │ ├─┬ debug@2.2.0

│ │ │ └── ms@0.7.1

│ │ └── extend@3.0.0

│ ├─┬ joi@6.10.1

│ │ ├── hoek@2.16.3

│ │ ├── isemail@1.2.0

│ │ ├── moment@2.12.0

│ │ └─┬ topo@1.1.0

│ │   └── hoek@2.16.3 deduped

│ ├── nodesecurity-npm-utils@5.0.0

│ ├── path-is-absolute@1.0.0

│ ├─┬ rc@1.1.6

│ │ ├── deep-extend@0.4.1

│ │ ├── ini@1.3.4

│ │ ├── minimist@1.2.0

│ │ └── strip-json-comments@1.0.4

│ ├── semver@5.1.0

│ ├─┬ subcommand@2.0.3

│ │ ├── cliclopts@1.1.1

│ │ ├─┬ debug@2.2.0

│ │ │ └── ms@0.7.1

│ │ ├── minimist@1.2.0

│ │ └── xtend@4.0.1

│ └─┬ wreck@6.3.0

│   ├─┬ boom@2.10.1

│   │ └── hoek@2.16.3 deduped

│   └── hoek@2.16.3

├── pegjs@0.8.0 (git+https://github.com/tstarling/pegjs.git#36d584bd7bbc564c86c058c5dfe8053b1fe1d584)

├─┬ prfun@2.1.4

│ └── core-js@2.4.1 deduped

├─┬ request@2.81.0

│ ├── aws-sign2@0.6.0

│ ├── aws4@1.6.0

│ ├── caseless@0.12.0

│ ├─┬ combined-stream@1.0.5

│ │ └── delayed-stream@1.0.0

│ ├── extend@3.0.0

│ ├── forever-agent@0.6.1

│ ├─┬ form-data@2.1.2

│ │ ├── asynckit@0.4.0

│ │ ├── combined-stream@1.0.5 deduped

│ │ └── mime-types@2.1.15 deduped

│ ├─┬ har-validator@4.2.1

│ │ ├── ajv@4.11.5 deduped

│ │ └── har-schema@1.0.5

│ ├─┬ hawk@3.1.3

│ │ ├─┬ boom@2.10.1

│ │ │ └── hoek@2.16.3 deduped

│ │ ├─┬ cryptiles@2.0.5

│ │ │ └── boom@2.10.1 deduped

│ │ ├── hoek@2.16.3

│ │ └─┬ sntp@1.0.9

│ │   └── hoek@2.16.3 deduped

│ ├─┬ http-signature@1.1.1

│ │ ├── assert-plus@0.2.0

│ │ ├─┬ jsprim@1.4.0

│ │ │ ├── assert-plus@1.0.0

│ │ │ ├── extsprintf@1.0.2

│ │ │ ├── json-schema@0.2.3

│ │ │ └─┬ verror@1.3.6

│ │ │   └── extsprintf@1.0.2 deduped

│ │ └─┬ sshpk@1.11.0

│ │   ├── asn1@0.2.3

│ │   ├── assert-plus@1.0.0

│ │   ├── UNMET OPTIONAL DEPENDENCY bcrypt-pbkdf@^1.0.0

│ │   ├─┬ dashdash@1.14.1

│ │   │ └── assert-plus@1.0.0

│ │   ├── UNMET OPTIONAL DEPENDENCY ecc-jsbn@~0.1.1

│ │   ├─┬ getpass@0.1.6

│ │   │ └── assert-plus@1.0.0

│ │   ├── UNMET OPTIONAL DEPENDENCY jodid25519@^1.0.0

│ │   ├── UNMET OPTIONAL DEPENDENCY jsbn@~0.1.0

│ │   └── UNMET OPTIONAL DEPENDENCY tweetnacl@~0.14.0

│ ├── is-typedarray@1.0.0

│ ├── isstream@0.1.2

│ ├── json-stringify-safe@5.0.1 deduped

│ ├─┬ mime-types@2.1.15

│ │ └── mime-db@1.27.0 deduped

│ ├── oauth-sign@0.8.2

│ ├── performance-now@0.2.0

│ ├── qs@6.4.0 deduped

│ ├── safe-buffer@5.0.1

│ ├── stringstream@0.0.5

│ ├─┬ tough-cookie@2.3.2

│ │ └── punycode@1.4.1

│ ├─┬ tunnel-agent@0.6.0

│ │ └── safe-buffer@5.0.1 deduped

│ └── uuid@3.0.1

├── semver@5.3.0

├─┬ serve-favicon@2.4.2

│ ├── etag@1.8.0 deduped

│ ├── fresh@0.5.0 deduped

│ ├── ms@1.0.0

│ └── parseurl@1.3.1 deduped

├─┬ service-runner@2.2.5

│ ├── bluebird@3.5.0

│ ├─┬ bunyan@1.8.10

│ │ ├── UNMET OPTIONAL DEPENDENCY dtrace-provider@~0.8

│ │ ├── UNMET OPTIONAL DEPENDENCY moment@^2.10.6

│ │ ├── UNMET OPTIONAL DEPENDENCY mv@~2

│ │ └── UNMET OPTIONAL DEPENDENCY safe-json-stringify@~1

│ ├── bunyan-syslog-udp@0.1.0

│ ├─┬ dnscache@1.0.1

│ │ ├── asap@2.0.5 deduped

│ │ └─┬ lodash.clone@4.3.2

│ │   └── lodash._baseclone@4.5.7

│ ├── extend@3.0.0 deduped

│ ├─┬ gelf-stream@1.1.1

│ │ └── gelfling@0.3.1

│ ├── hot-shots@4.4.0

│ ├── js-yaml@3.8.3 deduped

│ ├─┬ limitation@0.2.0

│ │ ├── bluebird@3.5.0 deduped

│ │ ├─┬ kad@1.3.6 (git+https://github.com/gwicke/kad.git#936c91652d757ea6f9dd30e44698afb0daaa1d17)

│ │ │ ├── async@0.9.2 deduped

│ │ │ ├── clarinet@0.11.0

│ │ │ ├── colors@1.1.2 deduped

│ │ │ ├── hat@0.0.3

│ │ │ ├─┬ kad-fs@0.0.4

│ │ │ │ └─┬ readable-stream@2.2.6

│ │ │ │   ├── buffer-shims@1.0.0 deduped

│ │ │ │   ├── core-util-is@1.0.2 deduped

│ │ │ │   ├── inherits@2.0.3 deduped

│ │ │ │   ├── isarray@1.0.0

│ │ │ │   ├── process-nextick-args@1.0.7 deduped

│ │ │ │   ├── string_decoder@0.10.31 deduped

│ │ │ │   └── util-deprecate@1.0.2 deduped

│ │ │ ├─┬ kad-localstorage@0.0.7

│ │ │ │ └── dom-storage@2.0.2

│ │ │ ├─┬ kad-memstore@0.0.1

│ │ │ │ └─┬ readable-stream@2.2.6

│ │ │ │   ├── buffer-shims@1.0.0 deduped

│ │ │ │   ├── core-util-is@1.0.2 deduped

│ │ │ │   ├── inherits@2.0.3 deduped

│ │ │ │   ├── isarray@1.0.0

│ │ │ │   ├── process-nextick-args@1.0.7 deduped

│ │ │ │   ├── string_decoder@0.10.31 deduped

│ │ │ │   └── util-deprecate@1.0.2 deduped

│ │ │ ├── lodash@3.10.1

│ │ │ ├── merge@1.2.0

│ │ │ ├── ms@0.7.2 deduped

│ │ │ └─┬ msgpack5@3.4.1

│ │ │   ├─┬ bl@1.2.0

│ │ │   │ └─┬ readable-stream@2.2.6

│ │ │   │   ├── buffer-shims@1.0.0 deduped

│ │ │   │   ├── core-util-is@1.0.2 deduped

│ │ │   │   ├── inherits@2.0.3 deduped

│ │ │   │   ├── isarray@1.0.0

│ │ │   │   ├── process-nextick-args@1.0.7 deduped

│ │ │   │   ├── string_decoder@0.10.31 deduped

│ │ │   │   └── util-deprecate@1.0.2 deduped

│ │ │   ├── inherits@2.0.3 deduped

│ │ │   └─┬ readable-stream@2.2.6

│ │ │     ├── buffer-shims@1.0.0 deduped

│ │ │     ├── core-util-is@1.0.2 deduped

│ │ │     ├── inherits@2.0.3 deduped

│ │ │     ├── isarray@1.0.0

│ │ │     ├── process-nextick-args@1.0.7 deduped

│ │ │     ├── string_decoder@0.10.31 deduped

│ │ │     └── util-deprecate@1.0.2 deduped

│ │ └─┬ readable-stream@2.2.6

│ │   ├── buffer-shims@1.0.0 deduped

│ │   ├── core-util-is@1.0.2 deduped

│ │   ├── inherits@2.0.3 deduped

│ │   ├── isarray@1.0.0

│ │   ├── process-nextick-args@1.0.7 deduped

│ │   ├── string_decoder@0.10.31 deduped

│ │   └── util-deprecate@1.0.2 deduped

│ ├── semver@5.3.0 deduped

│ └── yargs@6.6.0 deduped

├── simplediff@0.1.1

├─┬ supertest@1.2.0

│ ├── methods@1.1.2 deduped

│ └─┬ superagent@1.8.5

│   ├── component-emitter@1.2.1

│   ├── cookiejar@2.0.6

│   ├── debug@2.6.1 deduped

│   ├── extend@3.0.0 deduped

│   ├─┬ form-data@1.0.0-rc3

│   │ ├── async@1.5.2

│   │ ├── combined-stream@1.0.5 deduped

│   │ └── mime-types@2.1.15 deduped

│   ├── formidable@1.0.17

│   ├── methods@1.1.2 deduped

│   ├── mime@1.3.4 deduped

│   ├── qs@2.3.3

│   ├─┬ readable-stream@1.0.27-1

│   │ ├── core-util-is@1.0.2 deduped

│   │ ├── inherits@2.0.3 deduped

│   │ ├── isarray@0.0.1 deduped

│   │ └── string_decoder@0.10.31 deduped

│   └── reduce-component@1.0.1

└─┬ yargs@6.6.0

  ├── camelcase@3.0.0

  ├─┬ cliui@3.2.0

  │ ├── string-width@1.0.2 deduped

  │ ├── strip-ansi@3.0.1 deduped

  │ └─┬ wrap-ansi@2.1.0

  │   ├── string-width@1.0.2 deduped

  │   └── strip-ansi@3.0.1 deduped

  ├── decamelize@1.2.0

  ├── get-caller-file@1.0.2

  ├─┬ os-locale@1.4.0

  │ └─┬ lcid@1.0.0

  │   └── invert-kv@1.0.0

  ├─┬ read-pkg-up@1.0.1

  │ ├─┬ find-up@1.1.2

  │ │ ├─┬ path-exists@2.1.0

  │ │ │ └── pinkie-promise@2.0.1 deduped

  │ │ └── pinkie-promise@2.0.1 deduped

  │ └─┬ read-pkg@1.1.0

  │   ├─┬ load-json-file@1.1.0

  │   │ ├── graceful-fs@4.1.11 deduped

  │   │ ├─┬ parse-json@2.2.0

  │   │ │ └─┬ error-ex@1.3.1

  │   │ │   └── is-arrayish@0.2.1

  │   │ ├── pify@2.3.0 deduped

  │   │ ├── pinkie-promise@2.0.1 deduped

  │   │ └─┬ strip-bom@2.0.0

  │   │   └── is-utf8@0.2.1

  │   ├─┬ normalize-package-data@2.3.6

  │   │ ├── hosted-git-info@2.4.1

  │   │ ├─┬ is-builtin-module@1.0.0

  │   │ │ └── builtin-modules@1.1.1

  │   │ ├── semver@5.3.0 deduped

  │   │ └─┬ validate-npm-package-license@3.0.1

  │   │   ├─┬ spdx-correct@1.0.2

  │   │   │ └── spdx-license-ids@1.2.2

  │   │   └── spdx-expression-parse@1.0.4

  │   └─┬ path-type@1.1.0

  │     ├── graceful-fs@4.1.11 deduped

  │     ├── pify@2.3.0 deduped

  │     └── pinkie-promise@2.0.1 deduped

  ├── require-directory@2.1.1

  ├── require-main-filename@1.0.1

  ├── set-blocking@2.0.0

  ├─┬ string-width@1.0.2

  │ ├── code-point-at@1.1.0

  │ ├─┬ is-fullwidth-code-point@1.0.0

  │ │ └── number-is-nan@1.0.1

  │ └── strip-ansi@3.0.1 deduped

  ├── which-module@1.0.0

  ├── y18n@3.2.1

  └─┬ yargs-parser@4.2.1

    └── camelcase@3.0.0 deduped

Pdwangchao (talkcontribs)
Benn2003 (talkcontribs)
== English ==

According to this website https://www.centos.org/forums/viewtopic.php?f=47&t=53223&p=225372#p225372 all commands were executed.

The following should be set in the LocalSettings.php file from MediaWiki:

# Namespces for VE

        $ wgVisualEditorNamespaces = array_merge (

         $ WgContentNamespaces,          array (*) );

The following error is logged when the website is accessed:

FastCGI sent in stderr: "PHP message: PHP Parse error: syntax error, unexpected '*', expecting ')' in /usr/share/mediawiki/mediawiki-1.34.0/LocalSettings.php on line 130"

Line 130 specifies "array (*)".

Can anyone help?

== German ==

Gemäß dieser Webseite https://www.centos.org/forums/viewtopic.php?f=47&t=53223&p=225372#p225372 wurden alle Befehle ausgeführt.

In der Datei LocalSettings.php vom MediaWiki soll folgendes eingestellt werden:

# Namespces for VE

       $wgVisualEditorNamespaces = array_merge(

        $wgContentNamespaces,         array( * ) );

Beim Aufruf der Webseite wird folgender Fehler protokolliert:

FastCGI sent in stderr: "PHP message: PHP Parse error:  syntax error, unexpected '*', expecting ')' in /usr/share/mediawiki/mediawiki-1.34.0/LocalSettings.php on line 130"

In Zeile 130 ist "array( * )" angegeben.

Kann jemand weiterhelfen?

Arlolra (talkcontribs)

$wgVisualEditorNamespaces was the config for which namespaces to enable VE.

The default was array( NS_MAIN ), so you can try that.

I imagine the * was just a stand in for all of them. It's broken syntax.

Wikifarm issues with parsoid

2
Summary by Arlolra

User disappeared

Nickm84 (talkcontribs)

Has anybody been able to configure and run parsoid on a wikifarm that's sharing resources? I'm following the steps outlined in "the big switch" section which i've been able to get setup successfully. Manual:Wiki family


The problem is when editing pages with similar titles, for instance the Main_Page. When you edit the page from one wiki site, the other sites will show the same edited content from wiki1 when you edit their pages. I'm guessing this is because they're all using the same API. Is there any way around this?

Arlolra (talkcontribs)

I believe there are wikifarms that have had some success running parsoid.

"yum install git npm" doesn't work

6
Summary by Arlolra

Install Parsoid/PHP instead

TheSplatGuy (talkcontribs)

Hello all, I have been trying to set up VisualEditor for two days now because of how much a nightmare this is and I have finally gotten to this point where I need to download parsoid. So I am on a shared server which means that I can't use sudo or apt-get so I need to use the development section of this article. However when I try to put in the command "yum install git npm" it responds with the folling error message:

CRITICAL:yum.cli:Config Error: Error accessing file for config file:///etc/yum.conf

The thing is I have absolutely no clue how to solve this and I am getting pretty sick and tired of dealing with this stuff so please any advice would help. I am using an SSH through my terminal, Bluehost as my hosting service, and cPanel as the management system.

Aron Manning (talkcontribs)

Tip: join us on MediaWiki_on_Discord for help.

I don't know your hosting provider, so this might not be helpful, but anyway: yum is also a package manager just like apt-get, so that might be the reason why you can't use it.

As you're running that command I assume git and npm are not installed... you can skip git by uploading through ssh/scp. npm: I assume you can install it by hand in your user folder, or you might not even need it if you are running the latest parsoid: it's been ported to php recently. However, I haven't used that yet, so I suggest you asking this on discord. Hope that helps.

TheSplatGuy (talkcontribs)

I am sorry I did not mention this earlier but the hosting service I use is Bluehost. the hosting plan that I got is Shared hosting and I use cPanel for file management. from what I have done so far git works, but npm and yum do not (because they are not installed).

Arlolra (talkcontribs)
Aron Manning (talkcontribs)

Using Parsoid/PHP is a good idea. It's part of MediaWiki since 1.35 (October 2019), but it's not enabled by default (that's expected to change around or after June 2020). You find it in `vendor/wikimedia/parsoid` folder installed as a package by composer.

The mediawiki page describes the configuration, but there are some confusing bits. I've just recently set it up for myself so if you need help, I can be to your service (preferably on discord, but here too) @TheSplatGuy.

Arlolra (talkcontribs)

Feel free to update the page to clarify the confusing bits :)

Using Parsoid independently

10
Summary by Arlolra

Try parsing with --mock

AB1908 (talkcontribs)

Hi folks. I recently got Parsoid running and ran into a bit of trouble. I wanted to generate (only) HTML from wikitext while using two extensions, Cite and Spoiler, with a few adjustments for Cite. However, I'm unable to find a way to reliably get the output I want. Pandoc and alternative parsers listed on MediaWiki have incomplete support at best and incorrect output at worst and other markup tools/languages like Markdown or AsciiDoc aren't versatile enough. It seems that, to modify Cite's settings, I need to use system messages for which I'd need MediaWiki set up, something I'd like to avoid as all I want is a parser. Is my current goal of using only Parsoid to generate HTML impossible? If not, how am I supposed to go about it? Am I misunderstanding things? I've jumped through a lot of hoops and tested a bunch of different parsers. I've exhausted all my options before asking here; I really wish to avoid writing HTML as much as I can and wikitext is the best lightweight markup language I've found, so I'd appreciate any help.

SSastry (WMF) (talkcontribs)

As long as you don't have templates and images, you can make this work. However, Parsoid does not know about the Spoiler extension and so you would need a Parsoid-native implementation of it. But, once that is in place, you can use the bin/parse.php script with the --mock option to parse your wikitext and generate HTML. It operates without MediaWiki.

If you do have templates and images, then, you will need to update the mocks to provide expected output for those templates / media requests (which is workable if you have a small number of them).

AB1908 (talkcontribs)

This is excellent. Thank you very much for the help and for the work on the parser in general (I honestly didn't expect a reply from the team lead). I have a few more questions if you could bear with me:

1. Where would I find a parsoid-native implementation of an extension? How do I "enable" it, so to speak, for Parsoid? Is it the source code of the extension?

2. What are "mocks"? I couldn't find much information on them. The --help for parse.js doesn't list them and I couldn't find documentation on them either. I am using an up-to-date copy of the source.

3. I would like to customise the output of the Cite extension which can be done via system messages. How do I do that without using MediaWiki? Do I have to change configurations elsewhere? (non essential, can be ignored)

Arlolra (talkcontribs)

For now, native extensions are in the Parsoid repo, in src/Ext/ and lib/ext/. They will eventually move to the respective extension repos.

Mocks weren't a concept in Parsoid/JS. You'd want to use the --offline flag for the same purpose. But keep in mind that Parsoid/JS is only getting security fixes and is rapidly approaching EOL. You should consider working with Parsoid/PHP

AB1908 (talkcontribs)

> For now, native extensions are in the Parsoid repo, in src/Ext/ and lib/ext/. They will eventually move to the respective extension repos.


I assume this means using the Spoiler extension is off the table. Regardless, thanks again for taking the time to help.

Arlolra (talkcontribs)

No, if you wrote a native implementation of it, there's an extension registration mechanism. The code can live wherever you want.

SSastry (WMF) (talkcontribs)

If https://github.com/Telshin/Spoilers/blob/master/SpoilersHooks.php is the spoiler extension, that should be fairly simple to implement. Take a look @ Parsoid/Extension API#Examples (but will require the master branch of Parsoid). If you are working with the JS version, it will still be simple, but you will have to take a look at Cite's ref.js file and the toDOM method there.

But anyway, yes, you will need to write that code before you can use the spoiler extension with Parsoid.

SSastry (WMF) (talkcontribs)

For example, see below:

[subbu@earth:~/work/wmf/parsoid] echo -e "a <ref>boo</ref>\n\n*a\n*b" | php bin/parse.php --mock --body_only --pageName 'Testing' --normalize=parsoid

<p>a <sup class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{},"body":{"id":"mw-reference-text-cite_note-1"}}'><a href="./Testing#cite_note-1"><span class="mw-reflink-text">[1]</span></a></sup></p>
<ul>
<li>a</li>
<li>b</li>
</ul>
<div class="mw-references-wrap" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{},"autoGenerated":true}'>
<ol class="mw-references references">
<li id="cite_note-1"><a href="./Testing#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">boo</span></li>
</ol>
</div>
AB1908 (talkcontribs)

The php script fails for me stating that ../vendor/autoload.php was not found. This is a total non-issue for me though as I have the JS version working.

Arlolra (talkcontribs)

You need to composer install before running the php script.

111.125.208.58 (talkcontribs)

I have mediawiki and parsoid setup locally

I am trying to expand templates locally, while coverting from wikitetx to HTML. But templates remain as it is.

can anyone suggest where i am going wrong

Arlolra (talkcontribs)

Are the templates defined in your local mediawiki instance?

111.125.208.58 (talkcontribs)

How to do it,

I have enabled few extensions like ParserFunctions, Scribunto, to expand templates.

I am trying to convert "{{Convert|907|hp|kW PS|0|abbr=on}}" --> "907 hp (676 kW; 920 PS)" but i get output as "Template:Convert"


Arlolra (talkcontribs)

You need to create a page on your local wiki, //localhost/wiki/Template:Convert, or whathaveyou.

You can copy the source from enwiki, https://en.wikipedia.org/w/index.php?title=Template:Convert&action=edit

Although, that seems to invoke a Scribunto module, so you'll also need a //localhost/wiki/Module:Convert as well.

Again, the source can be copied from, https://en.wikipedia.org/w/index.php?title=Module:Convert&action=edit

Alternatively, depending on how you're planning on using the tool, you can set --domain en.wikipedia.org to use the templates defined there, but then you won't have access to the pages on your local wiki.

SSastry (WMF) (talkcontribs)
111.125.208.58 (talkcontribs)

@Arlolra and @SSastry (WMF) Thanks for guidinig me through the solution,

Another question has arised to me, likewise i have multiple templates which i need to expand while converting from wikitext to HTML. So manual importing of each template could be cumbersome. Is there a way to download all the template dumps at once and then import to local mediwaiki.

Arlolra (talkcontribs)

Again, you might want to consider parsing with --domain en.wikipedia.org or wherever you're getting this content from, rather than your local wiki

There are larger project dumps you can import at https://meta.wikimedia.org/wiki/Data_dumps

Reply to "expand templates locally"

Error loading data from server

2
JJ245-AA (talkcontribs)

Hello everyone!

I installed parsoid successfully. I was able to use the visual editor to edit a page at first but the second time I try to edit it I get the following error -

Error loading data from server: apierror-visualeditor-docserver-http: HTTP 404. Would you like to retry?


Any help would be greatly appreciated!!

Thanks

Arlolra (talkcontribs)

Can you provide some more information about the wiki and how it's configured?

Reply to "Error loading data from server"