2520 changed files with 2529 additions and 361161 deletions
-
5071.idea/workspace.xml
-
15govue2/govue-js-src/node_modules/.bin/JSONStream
-
17govue2/govue-js-src/node_modules/.bin/JSONStream.cmd
-
18govue2/govue-js-src/node_modules/.bin/JSONStream.ps1
-
15govue2/govue-js-src/node_modules/.bin/acorn
-
17govue2/govue-js-src/node_modules/.bin/acorn.cmd
-
18govue2/govue-js-src/node_modules/.bin/acorn.ps1
-
15govue2/govue-js-src/node_modules/.bin/browser-pack
-
17govue2/govue-js-src/node_modules/.bin/browser-pack.cmd
-
18govue2/govue-js-src/node_modules/.bin/browser-pack.ps1
-
15govue2/govue-js-src/node_modules/.bin/browserify
-
17govue2/govue-js-src/node_modules/.bin/browserify.cmd
-
18govue2/govue-js-src/node_modules/.bin/browserify.ps1
-
15govue2/govue-js-src/node_modules/.bin/deps-sort
-
17govue2/govue-js-src/node_modules/.bin/deps-sort.cmd
-
18govue2/govue-js-src/node_modules/.bin/deps-sort.ps1
-
15govue2/govue-js-src/node_modules/.bin/detective
-
17govue2/govue-js-src/node_modules/.bin/detective.cmd
-
18govue2/govue-js-src/node_modules/.bin/detective.ps1
-
15govue2/govue-js-src/node_modules/.bin/envify
-
17govue2/govue-js-src/node_modules/.bin/envify.cmd
-
18govue2/govue-js-src/node_modules/.bin/envify.ps1
-
15govue2/govue-js-src/node_modules/.bin/esparse
-
17govue2/govue-js-src/node_modules/.bin/esparse.cmd
-
18govue2/govue-js-src/node_modules/.bin/esparse.ps1
-
15govue2/govue-js-src/node_modules/.bin/esvalidate
-
17govue2/govue-js-src/node_modules/.bin/esvalidate.cmd
-
18govue2/govue-js-src/node_modules/.bin/esvalidate.ps1
-
15govue2/govue-js-src/node_modules/.bin/he
-
17govue2/govue-js-src/node_modules/.bin/he.cmd
-
18govue2/govue-js-src/node_modules/.bin/he.ps1
-
15govue2/govue-js-src/node_modules/.bin/insert-module-globals
-
17govue2/govue-js-src/node_modules/.bin/insert-module-globals.cmd
-
18govue2/govue-js-src/node_modules/.bin/insert-module-globals.ps1
-
15govue2/govue-js-src/node_modules/.bin/miller-rabin
-
17govue2/govue-js-src/node_modules/.bin/miller-rabin.cmd
-
18govue2/govue-js-src/node_modules/.bin/miller-rabin.ps1
-
15govue2/govue-js-src/node_modules/.bin/module-deps
-
17govue2/govue-js-src/node_modules/.bin/module-deps.cmd
-
18govue2/govue-js-src/node_modules/.bin/module-deps.ps1
-
15govue2/govue-js-src/node_modules/.bin/sha.js
-
17govue2/govue-js-src/node_modules/.bin/sha.js.cmd
-
18govue2/govue-js-src/node_modules/.bin/sha.js.ps1
-
15govue2/govue-js-src/node_modules/.bin/umd
-
17govue2/govue-js-src/node_modules/.bin/umd.cmd
-
18govue2/govue-js-src/node_modules/.bin/umd.ps1
-
15govue2/govue-js-src/node_modules/.bin/undeclared-identifiers
-
17govue2/govue-js-src/node_modules/.bin/undeclared-identifiers.cmd
-
18govue2/govue-js-src/node_modules/.bin/undeclared-identifiers.ps1
-
8govue2/govue-js-src/node_modules/JSONStream/.travis.yml
-
15govue2/govue-js-src/node_modules/JSONStream/LICENSE.APACHE2
-
24govue2/govue-js-src/node_modules/JSONStream/LICENSE.MIT
-
12govue2/govue-js-src/node_modules/JSONStream/bin.js
-
13govue2/govue-js-src/node_modules/JSONStream/examples/all_docs.js
-
247govue2/govue-js-src/node_modules/JSONStream/index.js
-
207govue2/govue-js-src/node_modules/JSONStream/readme.markdown
-
41govue2/govue-js-src/node_modules/JSONStream/test/bool.js
-
18govue2/govue-js-src/node_modules/JSONStream/test/browser.js
-
27govue2/govue-js-src/node_modules/JSONStream/test/destroy_missing.js
-
29govue2/govue-js-src/node_modules/JSONStream/test/doubledot1.js
-
30govue2/govue-js-src/node_modules/JSONStream/test/doubledot2.js
-
44govue2/govue-js-src/node_modules/JSONStream/test/empty.js
-
45govue2/govue-js-src/node_modules/JSONStream/test/error_contents.js
-
39govue2/govue-js-src/node_modules/JSONStream/test/fn.js
-
135govue2/govue-js-src/node_modules/JSONStream/test/gen.js
-
55govue2/govue-js-src/node_modules/JSONStream/test/header_footer.js
-
34govue2/govue-js-src/node_modules/JSONStream/test/issues.js
-
105govue2/govue-js-src/node_modules/JSONStream/test/keys.js
-
40govue2/govue-js-src/node_modules/JSONStream/test/map.js
-
36govue2/govue-js-src/node_modules/JSONStream/test/multiple_objects.js
-
29govue2/govue-js-src/node_modules/JSONStream/test/multiple_objects_error.js
-
28govue2/govue-js-src/node_modules/JSONStream/test/null.js
-
29govue2/govue-js-src/node_modules/JSONStream/test/parsejson.js
-
13govue2/govue-js-src/node_modules/JSONStream/test/run.js
-
41govue2/govue-js-src/node_modules/JSONStream/test/stringify.js
-
47govue2/govue-js-src/node_modules/JSONStream/test/stringify_object.js
-
35govue2/govue-js-src/node_modules/JSONStream/test/test.js
-
29govue2/govue-js-src/node_modules/JSONStream/test/test2.js
-
41govue2/govue-js-src/node_modules/JSONStream/test/two-ways.js
-
22govue2/govue-js-src/node_modules/acorn-node/.travis.yml
-
94govue2/govue-js-src/node_modules/acorn-node/CHANGELOG.md
-
95govue2/govue-js-src/node_modules/acorn-node/LICENSE.md
-
65govue2/govue-js-src/node_modules/acorn-node/README.md
-
36govue2/govue-js-src/node_modules/acorn-node/build.js
-
38govue2/govue-js-src/node_modules/acorn-node/index.js
-
71govue2/govue-js-src/node_modules/acorn-node/lib/bigint/index.js
-
70govue2/govue-js-src/node_modules/acorn-node/lib/class-fields/index.js
-
86govue2/govue-js-src/node_modules/acorn-node/lib/dynamic-import/index.js
-
43govue2/govue-js-src/node_modules/acorn-node/lib/export-ns-from/index.js
-
55govue2/govue-js-src/node_modules/acorn-node/lib/import-meta/index.js
-
61govue2/govue-js-src/node_modules/acorn-node/lib/numeric-separator/index.js
-
135govue2/govue-js-src/node_modules/acorn-node/lib/private-class-elements/index.js
-
139govue2/govue-js-src/node_modules/acorn-node/lib/static-class-features/index.js
-
154govue2/govue-js-src/node_modules/acorn-node/test/index.js
-
57govue2/govue-js-src/node_modules/acorn-node/walk.js
-
121govue2/govue-js-src/node_modules/acorn-walk/CHANGELOG.md
-
19govue2/govue-js-src/node_modules/acorn-walk/LICENSE
-
126govue2/govue-js-src/node_modules/acorn-walk/README.md
-
115govue2/govue-js-src/node_modules/acorn-walk/dist/walk.d.ts
-
461govue2/govue-js-src/node_modules/acorn-walk/dist/walk.js
5071
.idea/workspace.xml
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,15 +0,0 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
"$basedir/node" "$basedir/../JSONStream/bin.js" "$@" |
|||
ret=$? |
|||
else |
|||
node "$basedir/../JSONStream/bin.js" "$@" |
|||
ret=$? |
|||
fi |
|||
exit $ret |
@ -1,17 +0,0 @@ |
|||
@ECHO off |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
"%_prog%" "%dp0%\..\JSONStream\bin.js" %* |
|||
ENDLOCAL |
|||
EXIT /b %errorlevel% |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
@ -1,18 +0,0 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
& "$basedir/node$exe" "$basedir/../JSONStream/bin.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
& "node$exe" "$basedir/../JSONStream/bin.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -1,15 +0,0 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
"$basedir/node" "$basedir/../acorn/bin/acorn" "$@" |
|||
ret=$? |
|||
else |
|||
node "$basedir/../acorn/bin/acorn" "$@" |
|||
ret=$? |
|||
fi |
|||
exit $ret |
@ -1,17 +0,0 @@ |
|||
@ECHO off |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
"%_prog%" "%dp0%\..\acorn\bin\acorn" %* |
|||
ENDLOCAL |
|||
EXIT /b %errorlevel% |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
@ -1,18 +0,0 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
& "$basedir/node$exe" "$basedir/../acorn/bin/acorn" $args |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
& "node$exe" "$basedir/../acorn/bin/acorn" $args |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -1,15 +0,0 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
"$basedir/node" "$basedir/../browser-pack/bin/cmd.js" "$@" |
|||
ret=$? |
|||
else |
|||
node "$basedir/../browser-pack/bin/cmd.js" "$@" |
|||
ret=$? |
|||
fi |
|||
exit $ret |
@ -1,17 +0,0 @@ |
|||
@ECHO off |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
"%_prog%" "%dp0%\..\browser-pack\bin\cmd.js" %* |
|||
ENDLOCAL |
|||
EXIT /b %errorlevel% |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
@ -1,18 +0,0 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
& "$basedir/node$exe" "$basedir/../browser-pack/bin/cmd.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
& "node$exe" "$basedir/../browser-pack/bin/cmd.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -1,15 +0,0 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
"$basedir/node" "$basedir/../browserify/bin/cmd.js" "$@" |
|||
ret=$? |
|||
else |
|||
node "$basedir/../browserify/bin/cmd.js" "$@" |
|||
ret=$? |
|||
fi |
|||
exit $ret |
@ -1,17 +0,0 @@ |
|||
@ECHO off |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
"%_prog%" "%dp0%\..\browserify\bin\cmd.js" %* |
|||
ENDLOCAL |
|||
EXIT /b %errorlevel% |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
@ -1,18 +0,0 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
& "$basedir/node$exe" "$basedir/../browserify/bin/cmd.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
& "node$exe" "$basedir/../browserify/bin/cmd.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -1,15 +0,0 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
"$basedir/node" "$basedir/../deps-sort/bin/cmd.js" "$@" |
|||
ret=$? |
|||
else |
|||
node "$basedir/../deps-sort/bin/cmd.js" "$@" |
|||
ret=$? |
|||
fi |
|||
exit $ret |
@ -1,17 +0,0 @@ |
|||
@ECHO off |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
"%_prog%" "%dp0%\..\deps-sort\bin\cmd.js" %* |
|||
ENDLOCAL |
|||
EXIT /b %errorlevel% |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
@ -1,18 +0,0 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
& "$basedir/node$exe" "$basedir/../deps-sort/bin/cmd.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
& "node$exe" "$basedir/../deps-sort/bin/cmd.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -1,15 +0,0 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
"$basedir/node" "$basedir/../detective/bin/detective.js" "$@" |
|||
ret=$? |
|||
else |
|||
node "$basedir/../detective/bin/detective.js" "$@" |
|||
ret=$? |
|||
fi |
|||
exit $ret |
@ -1,17 +0,0 @@ |
|||
@ECHO off |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
"%_prog%" "%dp0%\..\detective\bin\detective.js" %* |
|||
ENDLOCAL |
|||
EXIT /b %errorlevel% |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
@ -1,18 +0,0 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
& "$basedir/node$exe" "$basedir/../detective/bin/detective.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
& "node$exe" "$basedir/../detective/bin/detective.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -1,15 +0,0 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
"$basedir/node" "$basedir/../envify/bin/envify" "$@" |
|||
ret=$? |
|||
else |
|||
node "$basedir/../envify/bin/envify" "$@" |
|||
ret=$? |
|||
fi |
|||
exit $ret |
@ -1,17 +0,0 @@ |
|||
@ECHO off |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
"%_prog%" "%dp0%\..\envify\bin\envify" %* |
|||
ENDLOCAL |
|||
EXIT /b %errorlevel% |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
@ -1,18 +0,0 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
& "$basedir/node$exe" "$basedir/../envify/bin/envify" $args |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
& "node$exe" "$basedir/../envify/bin/envify" $args |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -1,15 +0,0 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
"$basedir/node" "$basedir/../esprima/bin/esparse.js" "$@" |
|||
ret=$? |
|||
else |
|||
node "$basedir/../esprima/bin/esparse.js" "$@" |
|||
ret=$? |
|||
fi |
|||
exit $ret |
@ -1,17 +0,0 @@ |
|||
@ECHO off |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
"%_prog%" "%dp0%\..\esprima\bin\esparse.js" %* |
|||
ENDLOCAL |
|||
EXIT /b %errorlevel% |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
@ -1,18 +0,0 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
& "$basedir/node$exe" "$basedir/../esprima/bin/esparse.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
& "node$exe" "$basedir/../esprima/bin/esparse.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -1,15 +0,0 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
"$basedir/node" "$basedir/../esprima/bin/esvalidate.js" "$@" |
|||
ret=$? |
|||
else |
|||
node "$basedir/../esprima/bin/esvalidate.js" "$@" |
|||
ret=$? |
|||
fi |
|||
exit $ret |
@ -1,17 +0,0 @@ |
|||
@ECHO off |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
"%_prog%" "%dp0%\..\esprima\bin\esvalidate.js" %* |
|||
ENDLOCAL |
|||
EXIT /b %errorlevel% |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
@ -1,18 +0,0 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
& "$basedir/node$exe" "$basedir/../esprima/bin/esvalidate.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
& "node$exe" "$basedir/../esprima/bin/esvalidate.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -1,15 +0,0 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
"$basedir/node" "$basedir/../he/bin/he" "$@" |
|||
ret=$? |
|||
else |
|||
node "$basedir/../he/bin/he" "$@" |
|||
ret=$? |
|||
fi |
|||
exit $ret |
@ -1,17 +0,0 @@ |
|||
@ECHO off |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
"%_prog%" "%dp0%\..\he\bin\he" %* |
|||
ENDLOCAL |
|||
EXIT /b %errorlevel% |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
@ -1,18 +0,0 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
& "$basedir/node$exe" "$basedir/../he/bin/he" $args |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
& "node$exe" "$basedir/../he/bin/he" $args |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -1,15 +0,0 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
"$basedir/node" "$basedir/../insert-module-globals/bin/cmd.js" "$@" |
|||
ret=$? |
|||
else |
|||
node "$basedir/../insert-module-globals/bin/cmd.js" "$@" |
|||
ret=$? |
|||
fi |
|||
exit $ret |
@ -1,17 +0,0 @@ |
|||
@ECHO off |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
"%_prog%" "%dp0%\..\insert-module-globals\bin\cmd.js" %* |
|||
ENDLOCAL |
|||
EXIT /b %errorlevel% |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
@ -1,18 +0,0 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
& "$basedir/node$exe" "$basedir/../insert-module-globals/bin/cmd.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
& "node$exe" "$basedir/../insert-module-globals/bin/cmd.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -1,15 +0,0 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
"$basedir/node" "$basedir/../miller-rabin/bin/miller-rabin" "$@" |
|||
ret=$? |
|||
else |
|||
node "$basedir/../miller-rabin/bin/miller-rabin" "$@" |
|||
ret=$? |
|||
fi |
|||
exit $ret |
@ -1,17 +0,0 @@ |
|||
@ECHO off |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
"%_prog%" "%dp0%\..\miller-rabin\bin\miller-rabin" %* |
|||
ENDLOCAL |
|||
EXIT /b %errorlevel% |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
@ -1,18 +0,0 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
& "$basedir/node$exe" "$basedir/../miller-rabin/bin/miller-rabin" $args |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
& "node$exe" "$basedir/../miller-rabin/bin/miller-rabin" $args |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -1,15 +0,0 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
"$basedir/node" "$basedir/../module-deps/bin/cmd.js" "$@" |
|||
ret=$? |
|||
else |
|||
node "$basedir/../module-deps/bin/cmd.js" "$@" |
|||
ret=$? |
|||
fi |
|||
exit $ret |
@ -1,17 +0,0 @@ |
|||
@ECHO off |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
"%_prog%" "%dp0%\..\module-deps\bin\cmd.js" %* |
|||
ENDLOCAL |
|||
EXIT /b %errorlevel% |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
@ -1,18 +0,0 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
& "$basedir/node$exe" "$basedir/../module-deps/bin/cmd.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
& "node$exe" "$basedir/../module-deps/bin/cmd.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -1,15 +0,0 @@ |
|||
#!/bin/sh
|
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
"$basedir/node" "$basedir/../sha.js/bin.js" "$@" |
|||
ret=$? |
|||
else |
|||
node "$basedir/../sha.js/bin.js" "$@" |
|||
ret=$? |
|||
fi |
|||
exit $ret |
@ -1,17 +0,0 @@ |
|||
@ECHO off |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
"%_prog%" "%dp0%\..\sha.js\bin.js" %* |
|||
ENDLOCAL |
|||
EXIT /b %errorlevel% |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
@ -1,18 +0,0 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
& "$basedir/node$exe" "$basedir/../sha.js/bin.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
& "node$exe" "$basedir/../sha.js/bin.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -1,15 +0,0 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
"$basedir/node" "$basedir/../umd/bin/cli.js" "$@" |
|||
ret=$? |
|||
else |
|||
node "$basedir/../umd/bin/cli.js" "$@" |
|||
ret=$? |
|||
fi |
|||
exit $ret |
@ -1,17 +0,0 @@ |
|||
@ECHO off |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
"%_prog%" "%dp0%\..\umd\bin\cli.js" %* |
|||
ENDLOCAL |
|||
EXIT /b %errorlevel% |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
@ -1,18 +0,0 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
& "$basedir/node$exe" "$basedir/../umd/bin/cli.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
& "node$exe" "$basedir/../umd/bin/cli.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -1,15 +0,0 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
"$basedir/node" "$basedir/../undeclared-identifiers/bin.js" "$@" |
|||
ret=$? |
|||
else |
|||
node "$basedir/../undeclared-identifiers/bin.js" "$@" |
|||
ret=$? |
|||
fi |
|||
exit $ret |
@ -1,17 +0,0 @@ |
|||
@ECHO off |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
"%_prog%" "%dp0%\..\undeclared-identifiers\bin.js" %* |
|||
ENDLOCAL |
|||
EXIT /b %errorlevel% |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
@ -1,18 +0,0 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
& "$basedir/node$exe" "$basedir/../undeclared-identifiers/bin.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
& "node$exe" "$basedir/../undeclared-identifiers/bin.js" $args |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -1,8 +0,0 @@ |
|||
language: node_js |
|||
node_js: |
|||
- 4 |
|||
- 5 |
|||
- 6 |
|||
sudo: false |
|||
|
|||
|
@ -1,15 +0,0 @@ |
|||
Apache License, Version 2.0 |
|||
|
|||
Copyright (c) 2011 Dominic Tarr |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
@ -1,24 +0,0 @@ |
|||
The MIT License |
|||
|
|||
Copyright (c) 2011 Dominic Tarr |
|||
|
|||
Permission is hereby granted, free of charge, |
|||
to any person obtaining a copy of this software and |
|||
associated documentation files (the "Software"), to |
|||
deal in the Software without restriction, including |
|||
without limitation the rights to use, copy, modify, |
|||
merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom |
|||
the Software is furnished to do so, |
|||
subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice |
|||
shall be included in all copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
|||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
|||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR |
|||
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
|||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
|||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@ -1,12 +0,0 @@ |
|||
#! /usr/bin/env node
|
|||
|
|||
var JSONStream = require('./') |
|||
|
|||
if(!module.parent && process.title !== 'browser') { |
|||
process.stdin |
|||
.pipe(JSONStream.parse(process.argv[2])) |
|||
.pipe(JSONStream.stringify('[', ',\n', ']\n', 2)) |
|||
.pipe(process.stdout) |
|||
} |
|||
|
|||
|
@ -1,13 +0,0 @@ |
|||
var request = require('request') |
|||
, JSONStream = require('JSONStream') |
|||
, es = require('event-stream') |
|||
|
|||
var parser = JSONStream.parse(['rows', true]) //emit parts that match this path (any element of the rows array)
|
|||
, req = request({url: 'http://isaacs.couchone.com/registry/_all_docs'}) |
|||
, logger = es.mapSync(function (data) { //create a stream that logs to stderr,
|
|||
console.error(data) |
|||
return data |
|||
}) |
|||
|
|||
req.pipe(parser) |
|||
parser.pipe(logger) |
@ -1,247 +0,0 @@ |
|||
'use strict' |
|||
|
|||
var Parser = require('jsonparse') |
|||
, through = require('through') |
|||
|
|||
var bufferFrom = Buffer.from && Buffer.from !== Uint8Array.from |
|||
|
|||
/* |
|||
|
|||
the value of this.stack that creationix's jsonparse has is weird. |
|||
|
|||
it makes this code ugly, but his problem is way harder that mine, |
|||
so i'll forgive him. |
|||
|
|||
*/ |
|||
|
|||
exports.parse = function (path, map) { |
|||
var header, footer |
|||
var parser = new Parser() |
|||
var stream = through(function (chunk) { |
|||
if('string' === typeof chunk) |
|||
chunk = bufferFrom ? Buffer.from(chunk) : new Buffer(chunk) |
|||
parser.write(chunk) |
|||
}, |
|||
function (data) { |
|||
if(data) |
|||
stream.write(data) |
|||
if (header) |
|||
stream.emit('header', header) |
|||
if (footer) |
|||
stream.emit('footer', footer) |
|||
stream.queue(null) |
|||
}) |
|||
|
|||
if('string' === typeof path) |
|||
path = path.split('.').map(function (e) { |
|||
if (e === '$*') |
|||
return {emitKey: true} |
|||
else if (e === '*') |
|||
return true |
|||
else if (e === '') // '..'.split('.') returns an empty string
|
|||
return {recurse: true} |
|||
else |
|||
return e |
|||
}) |
|||
|
|||
|
|||
var count = 0, _key |
|||
if(!path || !path.length) |
|||
path = null |
|||
|
|||
parser.onValue = function (value) { |
|||
if (!this.root) |
|||
stream.root = value |
|||
|
|||
if(! path) return |
|||
|
|||
var i = 0 // iterates on path
|
|||
var j = 0 // iterates on stack
|
|||
var emitKey = false; |
|||
var emitPath = false; |
|||
while (i < path.length) { |
|||
var key = path[i] |
|||
var c |
|||
j++ |
|||
|
|||
if (key && !key.recurse) { |
|||
c = (j === this.stack.length) ? this : this.stack[j] |
|||
if (!c) return |
|||
if (! check(key, c.key)) { |
|||
setHeaderFooter(c.key, value) |
|||
return |
|||
} |
|||
emitKey = !!key.emitKey; |
|||
emitPath = !!key.emitPath; |
|||
i++ |
|||
} else { |
|||
i++ |
|||
var nextKey = path[i] |
|||
if (! nextKey) return |
|||
while (true) { |
|||
c = (j === this.stack.length) ? this : this.stack[j] |
|||
if (!c) return |
|||
if (check(nextKey, c.key)) { |
|||
i++; |
|||
if (!Object.isFrozen(this.stack[j])) |
|||
this.stack[j].value = null |
|||
break |
|||
} else { |
|||
setHeaderFooter(c.key, value) |
|||
} |
|||
j++ |
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
// emit header
|
|||
if (header) { |
|||
stream.emit('header', header); |
|||
header = false; |
|||
} |
|||
if (j !== this.stack.length) return |
|||
|
|||
count ++ |
|||
var actualPath = this.stack.slice(1).map(function(element) { return element.key }).concat([this.key]) |
|||
var data = value |
|||
if(null != data) |
|||
if(null != (data = map ? map(data, actualPath) : data)) { |
|||
if (emitKey || emitPath) { |
|||
data = { value: data }; |
|||
if (emitKey) |
|||
data["key"] = this.key; |
|||
if (emitPath) |
|||
data["path"] = actualPath; |
|||
} |
|||
|
|||
stream.queue(data) |
|||
} |
|||
if (this.value) delete this.value[this.key] |
|||
for(var k in this.stack) |
|||
if (!Object.isFrozen(this.stack[k])) |
|||
this.stack[k].value = null |
|||
} |
|||
parser._onToken = parser.onToken; |
|||
|
|||
parser.onToken = function (token, value) { |
|||
parser._onToken(token, value); |
|||
if (this.stack.length === 0) { |
|||
if (stream.root) { |
|||
if(!path) |
|||
stream.queue(stream.root) |
|||
count = 0; |
|||
stream.root = null; |
|||
} |
|||
} |
|||
} |
|||
|
|||
parser.onError = function (err) { |
|||
if(err.message.indexOf("at position") > -1) |
|||
err.message = "Invalid JSON (" + err.message + ")"; |
|||
stream.emit('error', err) |
|||
} |
|||
|
|||
return stream |
|||
|
|||
function setHeaderFooter(key, value) { |
|||
// header has not been emitted yet
|
|||
if (header !== false) { |
|||
header = header || {} |
|||
header[key] = value |
|||
} |
|||
|
|||
// footer has not been emitted yet but header has
|
|||
if (footer !== false && header === false) { |
|||
footer = footer || {} |
|||
footer[key] = value |
|||
} |
|||
} |
|||
} |
|||
|
|||
function check (x, y) { |
|||
if ('string' === typeof x) |
|||
return y == x |
|||
else if (x && 'function' === typeof x.exec) |
|||
return x.exec(y) |
|||
else if ('boolean' === typeof x || 'object' === typeof x) |
|||
return x |
|||
else if ('function' === typeof x) |
|||
return x(y) |
|||
return false |
|||
} |
|||
|
|||
exports.stringify = function (op, sep, cl, indent) { |
|||
indent = indent || 0 |
|||
if (op === false){ |
|||
op = '' |
|||
sep = '\n' |
|||
cl = '' |
|||
} else if (op == null) { |
|||
|
|||
op = '[\n' |
|||
sep = '\n,\n' |
|||
cl = '\n]\n' |
|||
|
|||
} |
|||
|
|||
//else, what ever you like
|
|||
|
|||
var stream |
|||
, first = true |
|||
, anyData = false |
|||
stream = through(function (data) { |
|||
anyData = true |
|||
try { |
|||
var json = JSON.stringify(data, null, indent) |
|||
} catch (err) { |
|||
return stream.emit('error', err) |
|||
} |
|||
if(first) { first = false ; stream.queue(op + json)} |
|||
else stream.queue(sep + json) |
|||
}, |
|||
function (data) { |
|||
if(!anyData) |
|||
stream.queue(op) |
|||
stream.queue(cl) |
|||
stream.queue(null) |
|||
}) |
|||
|
|||
return stream |
|||
} |
|||
|
|||
exports.stringifyObject = function (op, sep, cl, indent) { |
|||
indent = indent || 0 |
|||
if (op === false){ |
|||
op = '' |
|||
sep = '\n' |
|||
cl = '' |
|||
} else if (op == null) { |
|||
|
|||
op = '{\n' |
|||
sep = '\n,\n' |
|||
cl = '\n}\n' |
|||
|
|||
} |
|||
|
|||
//else, what ever you like
|
|||
|
|||
var first = true |
|||
var anyData = false |
|||
var stream = through(function (data) { |
|||
anyData = true |
|||
var json = JSON.stringify(data[0]) + ':' + JSON.stringify(data[1], null, indent) |
|||
if(first) { first = false ; this.queue(op + json)} |
|||
else this.queue(sep + json) |
|||
}, |
|||
function (data) { |
|||
if(!anyData) this.queue(op) |
|||
this.queue(cl) |
|||
|
|||
this.queue(null) |
|||
}) |
|||
|
|||
return stream |
|||
} |
|||
|
|||
|
@ -1,207 +0,0 @@ |
|||
# JSONStream |
|||
|
|||
streaming JSON.parse and stringify |
|||
|
|||
 |
|||
|
|||
## install |
|||
```npm install JSONStream``` |
|||
|
|||
## example |
|||
|
|||
``` js |
|||
|
|||
var request = require('request') |
|||
, JSONStream = require('JSONStream') |
|||
, es = require('event-stream') |
|||
|
|||
request({url: 'http://isaacs.couchone.com/registry/_all_docs'}) |
|||
.pipe(JSONStream.parse('rows.*')) |
|||
.pipe(es.mapSync(function (data) { |
|||
console.error(data) |
|||
return data |
|||
})) |
|||
``` |
|||
|
|||
## JSONStream.parse(path) |
|||
|
|||
parse stream of values that match a path |
|||
|
|||
``` js |
|||
JSONStream.parse('rows.*.doc') |
|||
``` |
|||
|
|||
The `..` operator is the recursive descent operator from [JSONPath](http://goessner.net/articles/JsonPath/), which will match a child at any depth (see examples below). |
|||
|
|||
If your keys have keys that include `.` or `*` etc, use an array instead. |
|||
`['row', true, /^doc/]`. |
|||
|
|||
If you use an array, `RegExp`s, booleans, and/or functions. The `..` operator is also available in array representation, using `{recurse: true}`. |
|||
any object that matches the path will be emitted as 'data' (and `pipe`d down stream) |
|||
|
|||
If `path` is empty or null, no 'data' events are emitted. |
|||
|
|||
If you want to have keys emitted, you can prefix your `*` operator with `$`: `obj.$*` - in this case the data passed to the stream is an object with a `key` holding the key and a `value` property holding the data. |
|||
|
|||
### Examples |
|||
|
|||
query a couchdb view: |
|||
|
|||
``` bash |
|||
curl -sS localhost:5984/tests/_all_docs&include_docs=true |
|||
``` |
|||
you will get something like this: |
|||
|
|||
``` js |
|||
{"total_rows":129,"offset":0,"rows":[ |
|||
{ "id":"change1_0.6995461115147918" |
|||
, "key":"change1_0.6995461115147918" |
|||
, "value":{"rev":"1-e240bae28c7bb3667f02760f6398d508"} |
|||
, "doc":{ |
|||
"_id": "change1_0.6995461115147918" |
|||
, "_rev": "1-e240bae28c7bb3667f02760f6398d508","hello":1} |
|||
}, |
|||
{ "id":"change2_0.6995461115147918" |
|||
, "key":"change2_0.6995461115147918" |
|||
, "value":{"rev":"1-13677d36b98c0c075145bb8975105153"} |
|||
, "doc":{ |
|||
"_id":"change2_0.6995461115147918" |
|||
, "_rev":"1-13677d36b98c0c075145bb8975105153" |
|||
, "hello":2 |
|||
} |
|||
}, |
|||
]} |
|||
|
|||
``` |
|||
|
|||
we are probably most interested in the `rows.*.doc` |
|||
|
|||
create a `Stream` that parses the documents from the feed like this: |
|||
|
|||
``` js |
|||
var stream = JSONStream.parse(['rows', true, 'doc']) //rows, ANYTHING, doc |
|||
|
|||
stream.on('data', function(data) { |
|||
console.log('received:', data); |
|||
}); |
|||
//emits anything from _before_ the first match |
|||
stream.on('header', function (data) { |
|||
console.log('header:', data) // => {"total_rows":129,"offset":0} |
|||
}) |
|||
|
|||
``` |
|||
awesome! |
|||
|
|||
In case you wanted the contents the doc emitted: |
|||
|
|||
``` js |
|||
var stream = JSONStream.parse(['rows', true, 'doc', {emitKey: true}]) //rows, ANYTHING, doc, items in docs with keys |
|||
|
|||
stream.on('data', function(data) { |
|||
console.log('key:', data.key); |
|||
console.log('value:', data.value); |
|||
}); |
|||
|
|||
``` |
|||
|
|||
You can also emit the path: |
|||
|
|||
``` js |
|||
var stream = JSONStream.parse(['rows', true, 'doc', {emitPath: true}]) //rows, ANYTHING, doc, items in docs with keys |
|||
|
|||
stream.on('data', function(data) { |
|||
console.log('path:', data.path); |
|||
console.log('value:', data.value); |
|||
}); |
|||
|
|||
``` |
|||
|
|||
### recursive patterns (..) |
|||
|
|||
`JSONStream.parse('docs..value')` |
|||
(or `JSONStream.parse(['docs', {recurse: true}, 'value'])` using an array) |
|||
will emit every `value` object that is a child, grand-child, etc. of the |
|||
`docs` object. In this example, it will match exactly 5 times at various depth |
|||
levels, emitting 0, 1, 2, 3 and 4 as results. |
|||
|
|||
```js |
|||
{ |
|||
"total": 5, |
|||
"docs": [ |
|||
{ |
|||
"key": { |
|||
"value": 0, |
|||
"some": "property" |
|||
} |
|||
}, |
|||
{"value": 1}, |
|||
{"value": 2}, |
|||
{"blbl": [{}, {"a":0, "b":1, "value":3}, 10]}, |
|||
{"value": 4} |
|||
] |
|||
} |
|||
``` |
|||
|
|||
## JSONStream.parse(pattern, map) |
|||
|
|||
provide a function that can be used to map or filter |
|||
the json output. `map` is passed the value at that node of the pattern, |
|||
if `map` return non-nullish (anything but `null` or `undefined`) |
|||
that value will be emitted in the stream. If it returns a nullish value, |
|||
nothing will be emitted. |
|||
|
|||
`JSONStream` also emits `'header'` and `'footer'` events, |
|||
the `'header'` event contains anything in the output that was before |
|||
the first match, and the `'footer'`, is anything after the last match. |
|||
|
|||
## JSONStream.stringify(open, sep, close) |
|||
|
|||
Create a writable stream. |
|||
|
|||
you may pass in custom `open`, `close`, and `seperator` strings. |
|||
But, by default, `JSONStream.stringify()` will create an array, |
|||
(with default options `open='[\n', sep='\n,\n', close='\n]\n'`) |
|||
|
|||
If you call `JSONStream.stringify(false)` |
|||
the elements will only be seperated by a newline. |
|||
|
|||
If you only write one item this will be valid JSON. |
|||
|
|||
If you write many items, |
|||
you can use a `RegExp` to split it into valid chunks. |
|||
|
|||
## JSONStream.stringifyObject(open, sep, close) |
|||
|
|||
Very much like `JSONStream.stringify`, |
|||
but creates a writable stream for objects instead of arrays. |
|||
|
|||
Accordingly, `open='{\n', sep='\n,\n', close='\n}\n'`. |
|||
|
|||
When you `.write()` to the stream you must supply an array with `[ key, data ]` |
|||
as the first argument. |
|||
|
|||
## unix tool |
|||
|
|||
query npm to see all the modules that browserify has ever depended on. |
|||
|
|||
``` bash |
|||
curl https://registry.npmjs.org/browserify | JSONStream 'versions.*.dependencies' |
|||
``` |
|||
|
|||
## numbers |
|||
|
|||
numbers will be emitted as numbers. |
|||
huge numbers that cannot be represented in memory as javascript numbers will be emitted as strings. |
|||
cf https://github.com/creationix/jsonparse/commit/044b268f01c4b8f97fb936fc85d3bcfba179e5bb for details. |
|||
|
|||
## Acknowlegements |
|||
|
|||
this module depends on https://github.com/creationix/jsonparse |
|||
by Tim Caswell |
|||
and also thanks to Florent Jaby for teaching me about parsing with: |
|||
https://github.com/Floby/node-json-streams |
|||
|
|||
## license |
|||
|
|||
Dual-licensed under the MIT License or the Apache License, version 2.0 |
|||
|
@ -1,41 +0,0 @@ |
|||
|
|||
var fs = require ('fs') |
|||
, join = require('path').join |
|||
, file = join(__dirname, 'fixtures','all_npm.json') |
|||
, JSONStream = require('../') |
|||
, it = require('it-is').style('colour') |
|||
|
|||
function randomObj () { |
|||
return ( |
|||
Math.random () < 0.4 |
|||
? {hello: 'eonuhckmqjk', |
|||
whatever: 236515, |
|||
lies: true, |
|||
nothing: [null], |
|||
// stuff: [Math.random(),Math.random(),Math.random()]
|
|||
} |
|||
: ['AOREC', 'reoubaor', {ouec: 62642}, [[[], {}, 53]]] |
|||
) |
|||
} |
|||
|
|||
var expected = [] |
|||
, stringify = JSONStream.stringify() |
|||
, es = require('event-stream') |
|||
, stringified = '' |
|||
, called = 0 |
|||
, count = 10 |
|||
, ended = false |
|||
|
|||
while (count --) |
|||
expected.push(randomObj()) |
|||
|
|||
es.connect( |
|||
es.readArray(expected), |
|||
stringify, |
|||
JSONStream.parse([true]), |
|||
es.writeArray(function (err, lines) { |
|||
|
|||
it(lines).has(expected) |
|||
console.error('PASSED') |
|||
}) |
|||
) |
@ -1,18 +0,0 @@ |
|||
var test = require('tape') |
|||
var JSONStream = require('../') |
|||
var testData = '{"rows":[{"hello":"world"}, {"foo": "bar"}]}' |
|||
|
|||
test('basic parsing', function (t) { |
|||
t.plan(2) |
|||
var parsed = JSONStream.parse("rows.*") |
|||
var parsedKeys = {} |
|||
parsed.on('data', function(match) { |
|||
parsedKeys[Object.keys(match)[0]] = true |
|||
}) |
|||
parsed.on('end', function() { |
|||
t.equal(!!parsedKeys['hello'], true) |
|||
t.equal(!!parsedKeys['foo'], true) |
|||
}) |
|||
parsed.write(testData) |
|||
parsed.end() |
|||
}) |
@ -1,27 +0,0 @@ |
|||
var fs = require ('fs'); |
|||
var net = require('net'); |
|||
var join = require('path').join; |
|||
var file = join(__dirname, 'fixtures','all_npm.json'); |
|||
var JSONStream = require('../'); |
|||
|
|||
|
|||
var server = net.createServer(function(client) { |
|||
var parser = JSONStream.parse([]); |
|||
parser.on('end', function() { |
|||
console.log('close') |
|||
console.error('PASSED'); |
|||
server.close(); |
|||
}); |
|||
client.pipe(parser); |
|||
var n = 4 |
|||
client.on('data', function () { |
|||
if(--n) return |
|||
client.end(); |
|||
}) |
|||
}); |
|||
server.listen(9999); |
|||
|
|||
|
|||
var client = net.connect({ port : 9999 }, function() { |
|||
fs.createReadStream(file).pipe(client).on('data', console.log) //.resume();
|
|||
}); |
@ -1,29 +0,0 @@ |
|||
var fs = require ('fs') |
|||
, join = require('path').join |
|||
, file = join(__dirname, 'fixtures','all_npm.json') |
|||
, JSONStream = require('../') |
|||
, it = require('it-is') |
|||
|
|||
var expected = JSON.parse(fs.readFileSync(file)) |
|||
, parser = JSONStream.parse('rows..rev') |
|||
, called = 0 |
|||
, ended = false |
|||
, parsed = [] |
|||
|
|||
fs.createReadStream(file).pipe(parser) |
|||
|
|||
parser.on('data', function (data) { |
|||
called ++ |
|||
parsed.push(data) |
|||
}) |
|||
|
|||
parser.on('end', function () { |
|||
ended = true |
|||
}) |
|||
|
|||
process.on('exit', function () { |
|||
it(called).equal(expected.rows.length) |
|||
for (var i = 0 ; i < expected.rows.length ; i++) |
|||
it(parsed[i]).deepEqual(expected.rows[i].value.rev) |
|||
console.error('PASSED') |
|||
}) |
@ -1,30 +0,0 @@ |
|||
var fs = require ('fs') |
|||
, join = require('path').join |
|||
, file = join(__dirname, 'fixtures','depth.json') |
|||
, JSONStream = require('../') |
|||
, it = require('it-is') |
|||
|
|||
var expected = JSON.parse(fs.readFileSync(file)) |
|||
, parser = JSONStream.parse(['docs', {recurse: true}, 'value']) |
|||
, called = 0 |
|||
, ended = false |
|||
, parsed = [] |
|||
|
|||
fs.createReadStream(file).pipe(parser) |
|||
|
|||
parser.on('data', function (data) { |
|||
called ++ |
|||
parsed.push(data) |
|||
}) |
|||
|
|||
parser.on('end', function () { |
|||
ended = true |
|||
}) |
|||
|
|||
process.on('exit', function () { |
|||
var expectedValues = [0, [1], {"a": 2}, "3", 4] |
|||
it(called).equal(expectedValues.length) |
|||
for (var i = 0 ; i < 5 ; i++) |
|||
it(parsed[i]).deepEqual(expectedValues[i]) |
|||
console.error('PASSED') |
|||
}) |
@ -1,44 +0,0 @@ |
|||
var JSONStream = require('../') |
|||
, stream = require('stream') |
|||
, it = require('it-is') |
|||
|
|||
var output = [ [], [] ] |
|||
|
|||
var parser1 = JSONStream.parse(['docs', /./]) |
|||
parser1.on('data', function(data) { |
|||
output[0].push(data) |
|||
}) |
|||
|
|||
var parser2 = JSONStream.parse(['docs', /./]) |
|||
parser2.on('data', function(data) { |
|||
output[1].push(data) |
|||
}) |
|||
|
|||
var pending = 2 |
|||
function onend () { |
|||
if (--pending > 0) return |
|||
it(output).deepEqual([ |
|||
[], [{hello: 'world'}] |
|||
]) |
|||
console.error('PASSED') |
|||
} |
|||
parser1.on('end', onend) |
|||
parser2.on('end', onend) |
|||
|
|||
function makeReadableStream() { |
|||
var readStream = new stream.Stream() |
|||
readStream.readable = true |
|||
readStream.write = function (data) { this.emit('data', data) } |
|||
readStream.end = function (data) { this.emit('end') } |
|||
return readStream |
|||
} |
|||
|
|||
var emptyArray = makeReadableStream() |
|||
emptyArray.pipe(parser1) |
|||
emptyArray.write('{"docs":[]}') |
|||
emptyArray.end() |
|||
|
|||
var objectArray = makeReadableStream() |
|||
objectArray.pipe(parser2) |
|||
objectArray.write('{"docs":[{"hello":"world"}]}') |
|||
objectArray.end() |
@ -1,45 +0,0 @@ |
|||
|
|||
|
|||
var fs = require ('fs') |
|||
, join = require('path').join |
|||
, file = join(__dirname, 'fixtures','error.json') |
|||
, JSONStream = require('../') |
|||
, it = require('it-is') |
|||
|
|||
var expected = JSON.parse(fs.readFileSync(file)) |
|||
, parser = JSONStream.parse(['rows']) |
|||
, called = 0 |
|||
, headerCalled = 0 |
|||
, footerCalled = 0 |
|||
, ended = false |
|||
, parsed = [] |
|||
|
|||
fs.createReadStream(file).pipe(parser) |
|||
|
|||
parser.on('header', function (data) { |
|||
headerCalled ++ |
|||
it(data).deepEqual({ |
|||
error: 'error_code', |
|||
message: 'this is an error message' |
|||
}) |
|||
}) |
|||
|
|||
parser.on('footer', function (data) { |
|||
footerCalled ++ |
|||
}) |
|||
|
|||
parser.on('data', function (data) { |
|||
called ++ |
|||
parsed.push(data) |
|||
}) |
|||
|
|||
parser.on('end', function () { |
|||
ended = true |
|||
}) |
|||
|
|||
process.on('exit', function () { |
|||
it(called).equal(0) |
|||
it(headerCalled).equal(1) |
|||
it(footerCalled).equal(0) |
|||
console.error('PASSED') |
|||
}) |
@ -1,39 +0,0 @@ |
|||
|
|||
|
|||
var fs = require ('fs') |
|||
, join = require('path').join |
|||
, file = join(__dirname, 'fixtures','all_npm.json') |
|||
, JSONStream = require('../') |
|||
, it = require('it-is') |
|||
|
|||
function fn (s) { |
|||
return !isNaN(parseInt(s, 10)) |
|||
} |
|||
|
|||
var expected = JSON.parse(fs.readFileSync(file)) |
|||
, parser = JSONStream.parse(['rows', fn]) |
|||
, called = 0 |
|||
, ended = false |
|||
, parsed = [] |
|||
|
|||
fs.createReadStream(file).pipe(parser) |
|||
|
|||
parser.on('data', function (data) { |
|||
called ++ |
|||
it.has({ |
|||
id: it.typeof('string'), |
|||
value: {rev: it.typeof('string')}, |
|||
key:it.typeof('string') |
|||
}) |
|||
parsed.push(data) |
|||
}) |
|||
|
|||
parser.on('end', function () { |
|||
ended = true |
|||
}) |
|||
|
|||
process.on('exit', function () { |
|||
it(called).equal(expected.rows.length) |
|||
it(parsed).deepEqual(expected.rows) |
|||
console.error('PASSED') |
|||
}) |
@ -1,135 +0,0 @@ |
|||
return // dont run this test for now since tape is weird and broken on 0.10
|
|||
|
|||
var fs = require('fs') |
|||
var JSONStream = require('../') |
|||
var file = process.argv[2] || '/tmp/JSONStream-test-large.json' |
|||
var size = Number(process.argv[3] || 100000) |
|||
var tape = require('tape') |
|||
// if (process.title !== 'browser') {
|
|||
tape('out of mem', function (t) { |
|||
t.plan(1) |
|||
//////////////////////////////////////////////////////
|
|||
// Produces a random number between arg1 and arg2
|
|||
//////////////////////////////////////////////////////
|
|||
var randomNumber = function (min, max) { |
|||
var number = Math.floor(Math.random() * (max - min + 1) + min); |
|||
return number; |
|||
}; |
|||
|
|||
//////////////////////////////////////////////////////
|
|||
// Produces a random string of a length between arg1 and arg2
|
|||
//////////////////////////////////////////////////////
|
|||
var randomString = function (min, max) { |
|||
|
|||
// add several spaces to increase chanses of creating 'words'
|
|||
var chars = ' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; |
|||
var result = ''; |
|||
|
|||
var randomLength = randomNumber(min, max); |
|||
|
|||
for (var i = randomLength; i > 0; --i) { |
|||
result += chars[Math.round(Math.random() * (chars.length - 1))]; |
|||
} |
|||
return result; |
|||
}; |
|||
|
|||
//////////////////////////////////////////////////////
|
|||
// Produces a random JSON document, as a string
|
|||
//////////////////////////////////////////////////////
|
|||
var randomJsonDoc = function () { |
|||
|
|||
var doc = { |
|||
"CrashOccurenceID": randomNumber(10000, 50000), |
|||
"CrashID": randomNumber(1000, 10000), |
|||
"SiteName": randomString(10, 25), |
|||
"MachineName": randomString(10, 25), |
|||
"Date": randomString(26, 26), |
|||
"ProcessDuration": randomString(18, 18), |
|||
"ThreadIdentityName": null, |
|||
"WindowsIdentityName": randomString(15, 40), |
|||
"OperatingSystemName": randomString(35, 65), |
|||
"DetailedExceptionInformation": randomString(100, 800) |
|||
}; |
|||
|
|||
doc = JSON.stringify(doc); |
|||
doc = doc.replace(/\,/g, ',\n'); // add new lines after each attribute
|
|||
return doc; |
|||
}; |
|||
|
|||
//////////////////////////////////////////////////////
|
|||
// generates test data
|
|||
//////////////////////////////////////////////////////
|
|||
var generateTestData = function (cb) { |
|||
|
|||
console.log('generating large data file...'); |
|||
|
|||
var stream = fs.createWriteStream(file, { |
|||
encoding: 'utf8' |
|||
}); |
|||
|
|||
var i = 0; |
|||
var max = size; |
|||
var writing = false |
|||
var split = ',\n'; |
|||
var doc = randomJsonDoc(); |
|||
stream.write('['); |
|||
|
|||
function write () { |
|||
if(writing) return |
|||
writing = true |
|||
while(++i < max) { |
|||
if(Math.random() < 0.001) |
|||
console.log('generate..', i + ' / ' + size) |
|||
if(!stream.write(doc + split)) { |
|||
writing = false |
|||
return stream.once('drain', write) |
|||
} |
|||
} |
|||
stream.write(doc + ']') |
|||
stream.end(); |
|||
console.log('END') |
|||
} |
|||
write() |
|||
stream.on('close', cb) |
|||
}; |
|||
|
|||
//////////////////////////////////////////////////////
|
|||
// Shows that parsing 100000 instances using JSONStream fails
|
|||
//
|
|||
// After several seconds, you will get this crash
|
|||
// FATAL ERROR: JS Allocation failed - process out of memory
|
|||
//////////////////////////////////////////////////////
|
|||
var testJSONStreamParse_causesOutOfMem = function (done) { |
|||
var items = 0 |
|||
console.log('parsing data files using JSONStream...'); |
|||
|
|||
var parser = JSONStream.parse([true]); |
|||
var stream = fs.createReadStream(file); |
|||
stream.pipe(parser); |
|||
|
|||
parser.on('data', function (data) { |
|||
items++ |
|||
if(Math.random() < 0.01) console.log(items, '...') |
|||
}); |
|||
|
|||
parser.on('end', function () { |
|||
t.equal(items, size) |
|||
}); |
|||
|
|||
}; |
|||
|
|||
//////////////////////////////////////////////////////
|
|||
// main
|
|||
//////////////////////////////////////////////////////
|
|||
|
|||
fs.stat(file, function (err, stat) { |
|||
console.log(stat) |
|||
if(err) |
|||
generateTestData(testJSONStreamParse_causesOutOfMem); |
|||
else |
|||
testJSONStreamParse_causesOutOfMem() |
|||
}) |
|||
|
|||
}) |
|||
|
|||
// }
|
@ -1,55 +0,0 @@ |
|||
|
|||
|
|||
var fs = require ('fs') |
|||
, join = require('path').join |
|||
, file = join(__dirname, 'fixtures','header_footer.json') |
|||
, JSONStream = require('../') |
|||
, it = require('it-is') |
|||
|
|||
var expected = JSON.parse(fs.readFileSync(file)) |
|||
, parser = JSONStream.parse(['rows', /\d+/ /*, 'value'*/]) |
|||
, called = 0 |
|||
, headerCalled = 0 |
|||
, footerCalled = 0 |
|||
, ended = false |
|||
, parsed = [] |
|||
|
|||
fs.createReadStream(file).pipe(parser) |
|||
|
|||
parser.on('header', function (data) { |
|||
headerCalled ++ |
|||
it(data).deepEqual({ |
|||
total_rows: 129, |
|||
offset: 0 |
|||
}) |
|||
}) |
|||
|
|||
parser.on('footer', function (data) { |
|||
footerCalled ++ |
|||
it(data).deepEqual({ |
|||
foo: { bar: 'baz' } |
|||
}) |
|||
}) |
|||
|
|||
parser.on('data', function (data) { |
|||
called ++ |
|||
it.has({ |
|||
id: it.typeof('string'), |
|||
value: {rev: it.typeof('string')}, |
|||
key:it.typeof('string') |
|||
}) |
|||
it(headerCalled).equal(1) |
|||
parsed.push(data) |
|||
}) |
|||
|
|||
parser.on('end', function () { |
|||
ended = true |
|||
}) |
|||
|
|||
process.on('exit', function () { |
|||
it(called).equal(expected.rows.length) |
|||
it(headerCalled).equal(1) |
|||
it(footerCalled).equal(1) |
|||
it(parsed).deepEqual(expected.rows) |
|||
console.error('PASSED') |
|||
}) |
@ -1,34 +0,0 @@ |
|||
var JSONStream = require('../'); |
|||
var test = require('tape') |
|||
|
|||
test('#66', function (t) { |
|||
var error = 0; |
|||
var stream = JSONStream |
|||
.parse() |
|||
.on('error', function (err) { |
|||
t.ok(err); |
|||
error++; |
|||
}) |
|||
.on('end', function () { |
|||
t.ok(error === 1); |
|||
t.end(); |
|||
}); |
|||
|
|||
stream.write('["foo":bar['); |
|||
stream.end(); |
|||
|
|||
}); |
|||
|
|||
test('#81 - failure to parse nested objects', function (t) { |
|||
var stream = JSONStream |
|||
.parse('.bar.foo') |
|||
.on('error', function (err) { |
|||
t.error(err); |
|||
}) |
|||
.on('end', function () { |
|||
t.end(); |
|||
}); |
|||
|
|||
stream.write('{"bar":{"foo":"baz"}}'); |
|||
stream.end(); |
|||
}); |
@ -1,105 +0,0 @@ |
|||
var test = require('tape'); |
|||
var fs = require ('fs'); |
|||
var join = require('path').join; |
|||
var couch_sample_file = join(__dirname, 'fixtures','couch_sample.json'); |
|||
var JSONStream = require('../'); |
|||
|
|||
var fixture = { |
|||
obj: { |
|||
one: 1, |
|||
two: 2, |
|||
three: 3 |
|||
} |
|||
}; |
|||
|
|||
function assertFixtureKeys(stream, t) { |
|||
var keys = []; |
|||
var values = []; |
|||
stream.on('data', function(data) { |
|||
keys.push(data.key); |
|||
values.push(data.value); |
|||
}); |
|||
|
|||
stream.on('end', function() { |
|||
t.deepEqual(keys, ['one', 'two', 'three']); |
|||
t.deepEqual(values, [1,2,3]); |
|||
t.end(); |
|||
}); |
|||
stream.write(JSON.stringify(fixture)); |
|||
stream.end(); |
|||
} |
|||
|
|||
test('keys via string', function(t) { |
|||
var stream = JSONStream.parse('obj.$*'); |
|||
assertFixtureKeys(stream, t); |
|||
}); |
|||
|
|||
test('keys via array', function(t) { |
|||
var stream = JSONStream.parse(['obj',{emitKey: true}]); |
|||
assertFixtureKeys(stream, t); |
|||
}); |
|||
|
|||
test('path via array', function(t) { |
|||
var stream = JSONStream.parse(['obj',{emitPath: true}]); |
|||
|
|||
var paths = []; |
|||
var values = []; |
|||
stream.on('data', function(data) { |
|||
console.log(JSON.stringify(data)); |
|||
paths.push(data.path); |
|||
values.push(data.value); |
|||
}); |
|||
|
|||
stream.on('end', function() { |
|||
t.deepEqual(paths, [['obj', 'one'], ['obj', 'two'], ['obj', 'three']]); |
|||
t.deepEqual(values, [1,2,3]); |
|||
t.end(); |
|||
}); |
|||
stream.write(JSON.stringify(fixture)); |
|||
stream.end(); |
|||
}); |
|||
|
|||
test('advanced keys', function(t) { |
|||
var advanced = fs.readFileSync(couch_sample_file); |
|||
var stream = JSONStream.parse(['rows', true, 'doc', {emitKey: true}]); |
|||
|
|||
var keys = []; |
|||
var values = []; |
|||
stream.on('data', function(data) { |
|||
keys.push(data.key); |
|||
values.push(data.value); |
|||
}); |
|||
|
|||
stream.on('end', function() { |
|||
t.deepEqual(keys, [ |
|||
'_id', '_rev', 'hello', |
|||
'_id', '_rev', 'hello' |
|||
]); |
|||
t.deepEqual(values, [ |
|||
"change1_0.6995461115147918", "1-e240bae28c7bb3667f02760f6398d508", 1, |
|||
"change2_0.6995461115147918", "1-13677d36b98c0c075145bb8975105153", 2 |
|||
]); |
|||
t.end(); |
|||
}); |
|||
stream.write(advanced); |
|||
stream.end(); |
|||
}); |
|||
|
|||
test('parent keys', function(t) { |
|||
var stream = JSONStream.parse('$*'); |
|||
var d = null; |
|||
stream.on('data', function(data) { |
|||
if(d) t.fail('should only be called once'); |
|||
d = data; |
|||
}); |
|||
|
|||
stream.on('end', function() { |
|||
t.deepEqual(d,{ |
|||
key: 'obj', |
|||
value: fixture.obj |
|||
}); |
|||
t.end(); |
|||
}); |
|||
stream.write(JSON.stringify(fixture)); |
|||
stream.end(); |
|||
}) |
@ -1,40 +0,0 @@ |
|||
|
|||
var test = require('tape') |
|||
|
|||
var JSONStream = require('../') |
|||
|
|||
test('map function', function (t) { |
|||
|
|||
var actual = [] |
|||
|
|||
stream = JSONStream.parse([true], function (e) { return e*10 }) |
|||
stream.on('data', function (v) { actual.push(v)}) |
|||
stream.on('end', function () { |
|||
t.deepEqual(actual, [10,20,30,40,50,60]) |
|||
t.end() |
|||
|
|||
}) |
|||
|
|||
stream.write(JSON.stringify([1,2,3,4,5,6], null, 2)) |
|||
stream.end() |
|||
|
|||
}) |
|||
|
|||
test('filter function', function (t) { |
|||
|
|||
var actual = [] |
|||
|
|||
stream = JSONStream |
|||
.parse([true], function (e) { return e%2 ? e : null}) |
|||
.on('data', function (v) { actual.push(v)}) |
|||
.on('end', function () { |
|||
t.deepEqual(actual, [1,3,5]) |
|||
t.end() |
|||
|
|||
}) |
|||
|
|||
stream.write(JSON.stringify([1,2,3,4,5,6], null, 2)) |
|||
stream.end() |
|||
|
|||
}) |
|||
|
@ -1,36 +0,0 @@ |
|||
var fs = require ('fs'); |
|||
var net = require('net'); |
|||
var join = require('path').join; |
|||
var file = join(__dirname, 'fixtures','all_npm.json'); |
|||
var it = require('it-is'); |
|||
var JSONStream = require('../'); |
|||
|
|||
var str = fs.readFileSync(file); |
|||
|
|||
var datas = {} |
|||
|
|||
var server = net.createServer(function(client) { |
|||
var data_calls = 0; |
|||
var parser = JSONStream.parse(['rows', true, 'key']); |
|||
parser.on('data', function(data) { |
|||
++ data_calls; |
|||
datas[data] = (datas[data] || 0) + 1 |
|||
it(data).typeof('string') |
|||
}); |
|||
|
|||
parser.on('end', function() { |
|||
console.log('END') |
|||
var min = Infinity |
|||
for (var d in datas) |
|||
min = min > datas[d] ? datas[d] : min |
|||
it(min).equal(3); |
|||
server.close(); |
|||
}); |
|||
client.pipe(parser); |
|||
}); |
|||
server.listen(9999); |
|||
|
|||
var client = net.connect({ port : 9999 }, function() { |
|||
var msgs = str + ' ' + str + '\n\n' + str |
|||
client.end(msgs); |
|||
}); |
@ -1,29 +0,0 @@ |
|||
var fs = require ('fs'); |
|||
var net = require('net'); |
|||
var join = require('path').join; |
|||
var file = join(__dirname, 'fixtures','all_npm.json'); |
|||
var it = require('it-is'); |
|||
var JSONStream = require('../'); |
|||
|
|||
var str = fs.readFileSync(file); |
|||
|
|||
var server = net.createServer(function(client) { |
|||
var data_calls = 0; |
|||
var parser = JSONStream.parse(); |
|||
parser.on('error', function(err) { |
|||
console.log(err); |
|||
server.close(); |
|||
}); |
|||
|
|||
parser.on('end', function() { |
|||
console.log('END'); |
|||
server.close(); |
|||
}); |
|||
client.pipe(parser); |
|||
}); |
|||
server.listen(9999); |
|||
|
|||
var client = net.connect({ port : 9999 }, function() { |
|||
var msgs = str + '}'; |
|||
client.end(msgs); |
|||
}); |
@ -1,28 +0,0 @@ |
|||
var JSONStream = require('../') |
|||
|
|||
var data = [ |
|||
{ID: 1, optional: null}, |
|||
{ID: 2, optional: null}, |
|||
{ID: 3, optional: 20}, |
|||
{ID: 4, optional: null}, |
|||
{ID: 5, optional: 'hello'}, |
|||
{ID: 6, optional: null} |
|||
] |
|||
|
|||
|
|||
var test = require('tape') |
|||
|
|||
test ('null properties', function (t) { |
|||
var actual = [] |
|||
var stream = |
|||
|
|||
JSONStream.parse('*.optional') |
|||
.on('data', function (v) { actual.push(v) }) |
|||
.on('end', function () { |
|||
t.deepEqual(actual, [20, 'hello']) |
|||
t.end() |
|||
}) |
|||
|
|||
stream.write(JSON.stringify(data, null, 2)) |
|||
stream.end() |
|||
}) |
@ -1,29 +0,0 @@ |
|||
|
|||
|
|||
/* |
|||
sometimes jsonparse changes numbers slightly. |
|||
*/ |
|||
|
|||
var r = Math.random() |
|||
, Parser = require('jsonparse') |
|||
, p = new Parser() |
|||
, assert = require('assert') |
|||
, times = 20 |
|||
, bufferFrom = Buffer.from && Buffer.from !== Uint8Array.from |
|||
, str |
|||
|
|||
while (times --) { |
|||
|
|||
assert.equal(JSON.parse(JSON.stringify(r)), r, 'core JSON') |
|||
|
|||
p.onValue = function (v) { |
|||
console.error('parsed', v) |
|||
assert.equal(v,r) |
|||
} |
|||
console.error('correct', r) |
|||
str = JSON.stringify([r]) |
|||
p.write (bufferFrom ? Buffer.from(str) : new Buffer(str)) |
|||
|
|||
|
|||
|
|||
} |
@ -1,13 +0,0 @@ |
|||
var readdirSync = require('fs').readdirSync |
|||
var spawnSync = require('child_process').spawnSync |
|||
var extname = require('path').extname |
|||
|
|||
var files = readdirSync(__dirname) |
|||
files.forEach(function(file){ |
|||
if (extname(file) !== '.js' || file === 'run.js') |
|||
return |
|||
console.log(`*** ${file} ***`) |
|||
var result = spawnSync(process.argv0, [file], { stdio: 'inherit', cwd: __dirname} ) |
|||
if (result.status !== 0) |
|||
process.exit(result.status) |
|||
}) |
@ -1,41 +0,0 @@ |
|||
|
|||
var fs = require ('fs') |
|||
, join = require('path').join |
|||
, file = join(__dirname, 'fixtures','all_npm.json') |
|||
, JSONStream = require('../') |
|||
, it = require('it-is').style('colour') |
|||
|
|||
function randomObj () { |
|||
return ( |
|||
Math.random () < 0.4 |
|||
? {hello: 'eonuhckmqjk', |
|||
whatever: 236515, |
|||
lies: true, |
|||
nothing: [null], |
|||
stuff: [Math.random(),Math.random(),Math.random()] |
|||
} |
|||
: ['AOREC', 'reoubaor', {ouec: 62642}, [[[], {}, 53]]] |
|||
) |
|||
} |
|||
|
|||
var expected = [] |
|||
, stringify = JSONStream.stringify() |
|||
, es = require('event-stream') |
|||
, stringified = '' |
|||
, called = 0 |
|||
, count = 10 |
|||
, ended = false |
|||
|
|||
while (count --) |
|||
expected.push(randomObj()) |
|||
|
|||
es.connect( |
|||
es.readArray(expected), |
|||
stringify, |
|||
//JSONStream.parse([/./]),
|
|||
es.writeArray(function (err, lines) { |
|||
|
|||
it(JSON.parse(lines.join(''))).deepEqual(expected) |
|||
console.error('PASSED') |
|||
}) |
|||
) |
@ -1,47 +0,0 @@ |
|||
|
|||
var fs = require ('fs') |
|||
, join = require('path').join |
|||
, file = join(__dirname, 'fixtures','all_npm.json') |
|||
, JSONStream = require('../') |
|||
, it = require('it-is').style('colour') |
|||
, es = require('event-stream') |
|||
, pending = 10 |
|||
, passed = true |
|||
|
|||
function randomObj () { |
|||
return ( |
|||
Math.random () < 0.4 |
|||
? {hello: 'eonuhckmqjk', |
|||
whatever: 236515, |
|||
lies: true, |
|||
nothing: [null], |
|||
stuff: [Math.random(),Math.random(),Math.random()] |
|||
} |
|||
: ['AOREC', 'reoubaor', {ouec: 62642}, [[[], {}, 53]]] |
|||
) |
|||
} |
|||
|
|||
for (var ix = 0; ix < pending; ix++) (function (count) { |
|||
var expected = {} |
|||
, stringify = JSONStream.stringifyObject() |
|||
|
|||
es.connect( |
|||
stringify, |
|||
es.writeArray(function (err, lines) { |
|||
it(JSON.parse(lines.join(''))).deepEqual(expected) |
|||
if (--pending === 0) { |
|||
console.error('PASSED') |
|||
} |
|||
}) |
|||
) |
|||
|
|||
while (count --) { |
|||
var key = Math.random().toString(16).slice(2) |
|||
expected[key] = randomObj() |
|||
stringify.write([ key, expected[key] ]) |
|||
} |
|||
|
|||
process.nextTick(function () { |
|||
stringify.end() |
|||
}) |
|||
})(ix) |
@ -1,35 +0,0 @@ |
|||
|
|||
|
|||
var fs = require ('fs') |
|||
, join = require('path').join |
|||
, file = join(__dirname, 'fixtures','all_npm.json') |
|||
, JSONStream = require('../') |
|||
, it = require('it-is') |
|||
|
|||
var expected = JSON.parse(fs.readFileSync(file)) |
|||
, parser = JSONStream.parse(['rows', /\d+/ /*, 'value'*/]) |
|||
, called = 0 |
|||
, ended = false |
|||
, parsed = [] |
|||
|
|||
fs.createReadStream(file).pipe(parser) |
|||
|
|||
parser.on('data', function (data) { |
|||
called ++ |
|||
it.has({ |
|||
id: it.typeof('string'), |
|||
value: {rev: it.typeof('string')}, |
|||
key:it.typeof('string') |
|||
}) |
|||
parsed.push(data) |
|||
}) |
|||
|
|||
parser.on('end', function () { |
|||
ended = true |
|||
}) |
|||
|
|||
process.on('exit', function () { |
|||
it(called).equal(expected.rows.length) |
|||
it(parsed).deepEqual(expected.rows) |
|||
console.error('PASSED') |
|||
}) |
@ -1,29 +0,0 @@ |
|||
|
|||
|
|||
var fs = require ('fs') |
|||
, join = require('path').join |
|||
, file = join(__dirname, '..','package.json') |
|||
, JSONStream = require('../') |
|||
, it = require('it-is') |
|||
|
|||
var expected = JSON.parse(fs.readFileSync(file)) |
|||
, parser = JSONStream.parse([]) |
|||
, called = 0 |
|||
, ended = false |
|||
, parsed = [] |
|||
|
|||
fs.createReadStream(file).pipe(parser) |
|||
|
|||
parser.on('data', function (data) { |
|||
called ++ |
|||
it(data).deepEqual(expected) |
|||
}) |
|||
|
|||
parser.on('end', function () { |
|||
ended = true |
|||
}) |
|||
|
|||
process.on('exit', function () { |
|||
it(called).equal(1) |
|||
console.error('PASSED') |
|||
}) |
@ -1,41 +0,0 @@ |
|||
|
|||
var fs = require ('fs') |
|||
, join = require('path').join |
|||
, file = join(__dirname, 'fixtures','all_npm.json') |
|||
, JSONStream = require('../') |
|||
, it = require('it-is').style('colour') |
|||
|
|||
function randomObj () { |
|||
return ( |
|||
Math.random () < 0.4 |
|||
? {hello: 'eonuhckmqjk', |
|||
whatever: 236515, |
|||
lies: true, |
|||
nothing: [null], |
|||
// stuff: [Math.random(),Math.random(),Math.random()]
|
|||
} |
|||
: ['AOREC', 'reoubaor', {ouec: 62642}, [[[], {}, 53]]] |
|||
) |
|||
} |
|||
|
|||
var expected = [] |
|||
, stringify = JSONStream.stringify() |
|||
, es = require('event-stream') |
|||
, stringified = '' |
|||
, called = 0 |
|||
, count = 10 |
|||
, ended = false |
|||
|
|||
while (count --) |
|||
expected.push(randomObj()) |
|||
|
|||
es.connect( |
|||
es.readArray(expected), |
|||
stringify, |
|||
JSONStream.parse([/./]), |
|||
es.writeArray(function (err, lines) { |
|||
|
|||
it(lines).has(expected) |
|||
console.error('PASSED') |
|||
}) |
|||
) |
@ -1,22 +0,0 @@ |
|||
language: node_js |
|||
node_js: |
|||
- '12' |
|||
- '11' |
|||
- '10' |
|||
- '9' |
|||
- '8' |
|||
- '6' |
|||
- '4' |
|||
- '0.12' |
|||
- '0.10' |
|||
- '0.8' |
|||
- '0.6' |
|||
before_install: |
|||
- 'nvm install-latest-npm' |
|||
install: |
|||
- 'if [ "${TRAVIS_NODE_VERSION}" = "0.6" ] || [ "${TRAVIS_NODE_VERSION}" = "0.9" ]; then nvm install --latest-npm 0.8 && npm install && nvm use "${TRAVIS_NODE_VERSION}"; else npm install; fi;' |
|||
sudo: false |
|||
matrix: |
|||
fast_finish: true |
|||
allow_failures: |
|||
- node_js: "0.6" |
@ -1,94 +0,0 @@ |
|||
# acorn-node change log |
|||
|
|||
All notable changes to this project will be documented in this file. |
|||
|
|||
This project adheres to [Semantic Versioning](http://semver.org/). |
|||
|
|||
## 1.8.2 |
|||
* Revert a breaking change in import.meta parsing. |
|||
|
|||
## 1.8.1 |
|||
* Fix crash in compiled private-class-elements code. |
|||
|
|||
## 1.8.0 |
|||
* Upgrade acorn to v7. |
|||
|
|||
For backwards compatibility, `acorn-node` still uses the `Import` node type for dynamic imports, _NOT_ `ImportExpression` like acorn v7 and estree. |
|||
* Add numeric separator support: |
|||
```js |
|||
var a = 10_000_000_000_000_000_000_000_000n; |
|||
``` |
|||
|
|||
## 1.7.0 |
|||
* Add class instance fields support: |
|||
```js |
|||
class X { |
|||
pub = 1; |
|||
#priv = 2; |
|||
} |
|||
``` |
|||
* Add class static fields support: |
|||
```js |
|||
class X { |
|||
static pub = 1; |
|||
static #priv = 2; |
|||
} |
|||
``` |
|||
* Add `export * as ns` support when `sourceType` is 'module': |
|||
```js |
|||
export * as ns from './ns.mjs'; |
|||
``` |
|||
|
|||
## 1.6.2 |
|||
|
|||
* Allow dynamic `import()` in scripts. |
|||
* Update minimum dependency versions, fixing a peerDependency warning. |
|||
* Add Node 10 and 11 to CI. |
|||
|
|||
## 1.6.1 |
|||
|
|||
* Update acorn-dynamic-import to v4. |
|||
|
|||
## 1.6.0 |
|||
|
|||
* Upgrade acorn to v6. |
|||
* Add bigint support. |
|||
|
|||
## 1.5.2 |
|||
|
|||
* Upgrade acorn to support optional catch binding in the AST walker. |
|||
|
|||
## 1.5.1 |
|||
|
|||
* Fix tests on Node <= 0.12. |
|||
|
|||
## 1.5.0 |
|||
|
|||
* Add tests for async iteration, optional catch binding, import.meta, |
|||
dynamic import, bigint (currently unsupported). |
|||
* Add import.meta support. (`sourceType: 'module'` only) |
|||
* Add dynamic import support. (`sourceType: 'module'` only) |
|||
* Fix optional catch binding support in the walker. |
|||
|
|||
## 1.4.0 |
|||
|
|||
* Upgrade acorn to 5.6, which supports optional catch bindings and other |
|||
new syntax features. |
|||
* Set ecmaVersion to 2019 to opt in to optional catch bindings etc. |
|||
|
|||
## 1.3.0 |
|||
|
|||
* Upgrade acorn to 5.4, which supports object spread and async iteration. |
|||
* Remove acorn5-object-spread plugin. |
|||
|
|||
## 1.2.0 |
|||
|
|||
* Expose `acorn/dist/walk` as `acorn-node/walk`. |
|||
|
|||
## 1.1.0 |
|||
|
|||
* Enable `allowHashBang` and `allowReturnOutsideFunction` by default. |
|||
|
|||
## 1.0.0 |
|||
|
|||
* Initial release. |
@ -1,95 +0,0 @@ |
|||
# [Apache License 2.0](https://spdx.org/licenses/Apache-2.0) |
|||
|
|||
Copyright 2018 Renée Kooi <renee@kooi.me> |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
> http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
|
|||
## acorn-bigint |
|||
|
|||
The code in the `lib/bigint` folder is compiled from code licensed as MIT: |
|||
|
|||
> Copyright (C) 2017-2018 by Adrian Heine |
|||
> |
|||
> Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
> of this software and associated documentation files (the "Software"), to deal |
|||
> in the Software without restriction, including without limitation the rights |
|||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
> copies of the Software, and to permit persons to whom the Software is |
|||
> furnished to do so, subject to the following conditions: |
|||
> |
|||
> The above copyright notice and this permission notice shall be included in |
|||
> all copies or substantial portions of the Software. |
|||
> |
|||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
> THE SOFTWARE. |
|||
|
|||
Find the source code at https://github.com/acornjs/acorn-bigint. |
|||
|
|||
## acorn-import-meta |
|||
|
|||
The code in the `lib/import-meta` folder is compiled from code licensed as MIT: |
|||
|
|||
> Copyright (C) 2017-2018 by Adrian Heine |
|||
> |
|||
> Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
> of this software and associated documentation files (the "Software"), to deal |
|||
> in the Software without restriction, including without limitation the rights |
|||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
> copies of the Software, and to permit persons to whom the Software is |
|||
> furnished to do so, subject to the following conditions: |
|||
> |
|||
> The above copyright notice and this permission notice shall be included in |
|||
> all copies or substantial portions of the Software. |
|||
> |
|||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
> THE SOFTWARE. |
|||
|
|||
Find the source code at https://github.com/acornjs/acorn-import-meta. |
|||
|
|||
## acorn-dynamic-import |
|||
|
|||
The code in the `lib/dynamic-import` folder is licensed as MIT: |
|||
|
|||
> MIT License |
|||
> |
|||
> Copyright (c) 2016 Jordan Gensler |
|||
> |
|||
> Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
> of this software and associated documentation files (the "Software"), to deal |
|||
> in the Software without restriction, including without limitation the rights |
|||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
> copies of the Software, and to permit persons to whom the Software is |
|||
> furnished to do so, subject to the following conditions: |
|||
> |
|||
> The above copyright notice and this permission notice shall be included in all |
|||
> copies or substantial portions of the Software. |
|||
> |
|||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
> SOFTWARE. |
|||
|
|||
Find the source code at https://github.com/kesne/acorn-dynamic-import. |
@ -1,65 +0,0 @@ |
|||
# acorn-node |
|||
|
|||
[Acorn](https://github.com/acornjs/acorn) preloaded with plugins for syntax parity with recent Node versions. |
|||
|
|||
It also includes versions of the plugins compiled with [Bublé](https://github.com/rich-harris/buble), so they can be run on old Node versions (0.6 and up). |
|||
|
|||
[![npm][npm-image]][npm-url] |
|||
[![travis][travis-image]][travis-url] |
|||
[![standard][standard-image]][standard-url] |
|||
|
|||
[npm-image]: https://img.shields.io/npm/v/acorn-node.svg?style=flat-square |
|||
[npm-url]: https://www.npmjs.com/package/acorn-node |
|||
[travis-image]: https://img.shields.io/travis/browserify/acorn-node/master.svg?style=flat-square |
|||
[travis-url]: https://travis-ci.org/browserify/acorn-node |
|||
[standard-image]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square |
|||
[standard-url]: http://npm.im/standard |
|||
|
|||
## Install |
|||
|
|||
``` |
|||
npm install acorn-node |
|||
``` |
|||
|
|||
## Usage |
|||
|
|||
```js |
|||
var acorn = require('acorn-node') |
|||
``` |
|||
|
|||
The API is the same as [acorn](https://github.com/acornjs/acorn), but the following syntax features are enabled by default: |
|||
|
|||
- Bigint syntax `10n` |
|||
- Numeric separators syntax `10_000` |
|||
- Public and private class instance fields |
|||
- Public and private class static fields |
|||
- Dynamic `import()` |
|||
- The `import.meta` property |
|||
- `export * as ns from` syntax |
|||
|
|||
And the following options have different defaults from acorn, to match Node modules: |
|||
|
|||
- `ecmaVersion: 2019` |
|||
- `allowHashBang: true` |
|||
- `allowReturnOutsideFunction: true` |
|||
|
|||
```js |
|||
var walk = require('acorn-node/walk') |
|||
``` |
|||
|
|||
The Acorn syntax tree walker. Comes preconfigured for the syntax plugins if necessary. |
|||
See the [acorn documentation](https://github.com/acornjs/acorn#distwalkjs) for details. |
|||
|
|||
## License |
|||
|
|||
The files in the repo root and the ./test folder are licensed as [Apache-2.0](LICENSE.md). |
|||
|
|||
The files in lib/ are generated from other packages: |
|||
|
|||
- lib/bigint: [acorn-bigint](https://github.com/acornjs/acorn-bigint]), MIT |
|||
- lib/class-private-elements: [acorn-class-private-elements](https://github.com/acornjs/acorn-class-private-elements), MIT |
|||
- lib/dynamic-import: [acorn-dynamic-import](https://github.com/acornjs/acorn-dynamic-import), MIT |
|||
- lib/export-ns-from: [acorn-export-ns-from](https://github.com/acornjs/acorn-export-ns-from), MIT |
|||
- lib/import-meta: [acorn-import-meta](https://github.com/acornjs/acorn-import-meta), MIT |
|||
- lib/numeric-separator: [acorn-numeric-separator](https://github.com/acornjs/acorn-numeric-separator]), MIT |
|||
- lib/static-class-features: [acorn-static-class-features](https://github.com/acornjs/acorn-static-class-features), MIT |
@ -1,36 +0,0 @@ |
|||
var fs = require('fs') |
|||
var path = require('path') |
|||
var mkdirp = require('mkdirp') |
|||
var buble = require('buble') |
|||
|
|||
var HEADER = '/* Generated by `npm run build`, do not edit! */\n\n' |
|||
|
|||
function compile (name, output, fix) { |
|||
console.log(name, '→', output) |
|||
mkdirp.sync(path.dirname(path.join(__dirname, output))) |
|||
var source = fs.readFileSync(require.resolve(name), 'utf8') |
|||
if (fix) source = fix(source) |
|||
var result = buble.transform(source, { |
|||
transforms: { |
|||
dangerousForOf: true |
|||
} |
|||
}) |
|||
fs.writeFileSync(path.join(__dirname, output), HEADER + result.code, 'utf8') |
|||
} |
|||
|
|||
function privateClassElements (str) { |
|||
return str.replace('acorn-private-class-elements', '../private-class-elements') |
|||
} |
|||
|
|||
compile('acorn-bigint', './lib/bigint/index.js') |
|||
compile('acorn-numeric-separator', './lib/numeric-separator/index.js') |
|||
compile('acorn-dynamic-import', './lib/dynamic-import/index.js') |
|||
compile('acorn-import-meta', './lib/import-meta/index.js') |
|||
compile('acorn-export-ns-from', './lib/export-ns-from/index.js') |
|||
compile('acorn-class-fields', './lib/class-fields/index.js', privateClassElements) |
|||
compile('acorn-static-class-features', './lib/static-class-features/index.js', privateClassElements) |
|||
compile('acorn-private-class-elements', './lib/private-class-elements/index.js', function (str) { |
|||
return str.replace('class extends Parser', 'class Parser_ extends Parser') |
|||
// it also works with v7
|
|||
.replace('if (acorn.version.indexOf("6.") != 0 || acorn.version.indexOf("6.0.") == 0) {', 'if (false) {') |
|||
}) |
@ -1,38 +0,0 @@ |
|||
var acorn = require('acorn') |
|||
var xtend = require('xtend') |
|||
|
|||
var CJSParser = acorn.Parser |
|||
.extend(require('./lib/bigint')) |
|||
.extend(require('./lib/class-fields')) |
|||
.extend(require('./lib/static-class-features')) |
|||
.extend(require('./lib/numeric-separator')) |
|||
.extend(require('./lib/dynamic-import').default) |
|||
var ESModulesParser = CJSParser |
|||
.extend(require('./lib/export-ns-from')) |
|||
.extend(require('./lib/import-meta')) |
|||
|
|||
function mapOptions (opts) { |
|||
if (!opts) opts = {} |
|||
return xtend({ |
|||
ecmaVersion: 2020, |
|||
allowHashBang: true, |
|||
allowReturnOutsideFunction: true |
|||
}, opts) |
|||
} |
|||
|
|||
function getParser (opts) { |
|||
if (!opts) opts = {} |
|||
return opts.sourceType === 'module' ? ESModulesParser : CJSParser |
|||
} |
|||
|
|||
module.exports = exports = xtend(acorn, { |
|||
parse: function parse (src, opts) { |
|||
return getParser(opts).parse(src, mapOptions(opts)) |
|||
}, |
|||
parseExpressionAt: function parseExpressionAt (src, offset, opts) { |
|||
return getParser(opts).parseExpressionAt(src, offset, mapOptions(opts)) |
|||
}, |
|||
tokenizer: function tokenizer (src, opts) { |
|||
return getParser(opts).tokenizer(src, mapOptions(opts)) |
|||
} |
|||
}) |
@ -1,71 +0,0 @@ |
|||
/* Generated by `npm run build`, do not edit! */ |
|||
|
|||
"use strict" |
|||
|
|||
var acorn = require("acorn") |
|||
var tt = acorn.tokTypes |
|||
var isIdentifierStart = acorn.isIdentifierStart |
|||
|
|||
module.exports = function(Parser) { |
|||
return /*@__PURE__*/(function (Parser) { |
|||
function anonymous () { |
|||
Parser.apply(this, arguments); |
|||
} |
|||
|
|||
if ( Parser ) anonymous.__proto__ = Parser; |
|||
anonymous.prototype = Object.create( Parser && Parser.prototype ); |
|||
anonymous.prototype.constructor = anonymous; |
|||
|
|||
anonymous.prototype.parseLiteral = function parseLiteral (value) { |
|||
var node = Parser.prototype.parseLiteral.call(this, value) |
|||
if (node.raw.charCodeAt(node.raw.length - 1) == 110) { node.bigint = this.getNumberInput(node.start, node.end) } |
|||
return node |
|||
}; |
|||
|
|||
anonymous.prototype.readRadixNumber = function readRadixNumber (radix) { |
|||
var start = this.pos |
|||
this.pos += 2 // 0x
|
|||
var val = this.readInt(radix) |
|||
if (val === null) { this.raise(this.start + 2, ("Expected number in radix " + radix)) } |
|||
if (this.input.charCodeAt(this.pos) == 110) { |
|||
var str = this.getNumberInput(start, this.pos) |
|||
val = typeof BigInt !== "undefined" ? BigInt(str) : null |
|||
++this.pos |
|||
} else if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, "Identifier directly after number") } |
|||
return this.finishToken(tt.num, val) |
|||
}; |
|||
|
|||
anonymous.prototype.readNumber = function readNumber (startsWithDot) { |
|||
var start = this.pos |
|||
|
|||
// Not an int
|
|||
if (startsWithDot) { return Parser.prototype.readNumber.call(this, startsWithDot) } |
|||
|
|||
// Legacy octal
|
|||
if (this.input.charCodeAt(start) === 48 && this.input.charCodeAt(start + 1) !== 110) { |
|||
return Parser.prototype.readNumber.call(this, startsWithDot) |
|||
} |
|||
|
|||
if (this.readInt(10) === null) { this.raise(start, "Invalid number") } |
|||
|
|||
// Not a BigInt, reset and parse again
|
|||
if (this.input.charCodeAt(this.pos) != 110) { |
|||
this.pos = start |
|||
return Parser.prototype.readNumber.call(this, startsWithDot) |
|||
} |
|||
|
|||
var str = this.getNumberInput(start, this.pos) |
|||
var val = typeof BigInt !== "undefined" ? BigInt(str) : null |
|||
++this.pos |
|||
return this.finishToken(tt.num, val) |
|||
}; |
|||
|
|||
// This is basically a hook for acorn-numeric-separator
|
|||
anonymous.prototype.getNumberInput = function getNumberInput (start, end) { |
|||
if (Parser.prototype.getNumberInput) { return Parser.prototype.getNumberInput.call(this, start, end) } |
|||
return this.input.slice(start, end) |
|||
}; |
|||
|
|||
return anonymous; |
|||
}(Parser)) |
|||
} |
@ -1,70 +0,0 @@ |
|||
/* Generated by `npm run build`, do not edit! */ |
|||
|
|||
"use strict" |
|||
|
|||
var acorn = require("acorn") |
|||
var tt = acorn.tokTypes |
|||
var privateClassElements = require("../private-class-elements") |
|||
|
|||
function maybeParseFieldValue(field) { |
|||
if (this.eat(tt.eq)) { |
|||
var oldInFieldValue = this._inFieldValue |
|||
this._inFieldValue = true |
|||
field.value = this.parseExpression() |
|||
this._inFieldValue = oldInFieldValue |
|||
} else { field.value = null } |
|||
} |
|||
|
|||
module.exports = function(Parser) { |
|||
Parser = privateClassElements(Parser) |
|||
return /*@__PURE__*/(function (Parser) { |
|||
function anonymous () { |
|||
Parser.apply(this, arguments); |
|||
} |
|||
|
|||
if ( Parser ) anonymous.__proto__ = Parser; |
|||
anonymous.prototype = Object.create( Parser && Parser.prototype ); |
|||
anonymous.prototype.constructor = anonymous; |
|||
|
|||
anonymous.prototype.parseClassElement = function parseClassElement (_constructorAllowsSuper) { |
|||
if (this.options.ecmaVersion >= 8 && (this.type == tt.name || this.type == this.privateNameToken || this.type == tt.bracketL || this.type == tt.string)) { |
|||
var branch = this._branch() |
|||
if (branch.type == tt.bracketL) { |
|||
var count = 0 |
|||
do { |
|||
if (branch.eat(tt.bracketL)) { ++count } |
|||
else if (branch.eat(tt.bracketR)) { --count } |
|||
else { branch.next() } |
|||
} while (count > 0) |
|||
} else { branch.next() } |
|||
if (branch.type == tt.eq || branch.canInsertSemicolon() || branch.type == tt.semi) { |
|||
var node = this.startNode() |
|||
if (this.type == this.privateNameToken) { |
|||
this.parsePrivateClassElementName(node) |
|||
} else { |
|||
this.parsePropertyName(node) |
|||
} |
|||
if ((node.key.type === "Identifier" && node.key.name === "constructor") || |
|||
(node.key.type === "Literal" && node.key.value === "constructor")) { |
|||
this.raise(node.key.start, "Classes may not have a field called constructor") |
|||
} |
|||
maybeParseFieldValue.call(this, node) |
|||
this.finishNode(node, "FieldDefinition") |
|||
this.semicolon() |
|||
return node |
|||
} |
|||
} |
|||
|
|||
return Parser.prototype.parseClassElement.apply(this, arguments) |
|||
}; |
|||
|
|||
// Prohibit arguments in class field initializers
|
|||
anonymous.prototype.parseIdent = function parseIdent (liberal, isBinding) { |
|||
var ident = Parser.prototype.parseIdent.call(this, liberal, isBinding) |
|||
if (this._inFieldValue && ident.name == "arguments") { this.raise(ident.start, "A class field initializer may not contain arguments") } |
|||
return ident |
|||
}; |
|||
|
|||
return anonymous; |
|||
}(Parser)) |
|||
} |
@ -1,86 +0,0 @@ |
|||
/* Generated by `npm run build`, do not edit! */ |
|||
|
|||
'use strict'; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
exports.DynamicImportKey = undefined; |
|||
|
|||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); |
|||
|
|||
var _get = function () { |
|||
function get(object, property, receiver) { if (object === null) { object = Function.prototype; } var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } |
|||
|
|||
return get; |
|||
}(); |
|||
|
|||
exports['default'] = dynamicImport; |
|||
|
|||
var _acorn = require('acorn'); |
|||
|
|||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
|||
|
|||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } |
|||
|
|||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } } /* eslint-disable no-underscore-dangle */ |
|||
|
|||
|
|||
var DynamicImportKey = exports.DynamicImportKey = 'Import'; |
|||
|
|||
// NOTE: This allows `yield import()` to parse correctly.
|
|||
_acorn.tokTypes._import.startsExpr = true; |
|||
|
|||
function parseDynamicImport() { |
|||
var node = this.startNode(); |
|||
this.next(); |
|||
if (this.type !== _acorn.tokTypes.parenL) { |
|||
this.unexpected(); |
|||
} |
|||
return this.finishNode(node, DynamicImportKey); |
|||
} |
|||
|
|||
function parenAfter() { |
|||
return (/^(\s|\/\/.*|\/\*[^]*?\*\/)*\(/.test(this.input.slice(this.pos)) |
|||
); |
|||
} |
|||
|
|||
function dynamicImport(Parser) { |
|||
return function (_Parser) { |
|||
_inherits(_class, _Parser); |
|||
|
|||
function _class() { |
|||
_classCallCheck(this, _class); |
|||
|
|||
return _possibleConstructorReturn(this, (_class.__proto__ || Object.getPrototypeOf(_class)).apply(this, arguments)); |
|||
} |
|||
|
|||
_createClass(_class, [{ |
|||
key: 'parseStatement', |
|||
value: function () { |
|||
function parseStatement(context, topLevel, exports) { |
|||
if (this.type === _acorn.tokTypes._import && parenAfter.call(this)) { |
|||
return this.parseExpressionStatement(this.startNode(), this.parseExpression()); |
|||
} |
|||
return _get(_class.prototype.__proto__ || Object.getPrototypeOf(_class.prototype), 'parseStatement', this).call(this, context, topLevel, exports); |
|||
} |
|||
|
|||
return parseStatement; |
|||
}() |
|||
}, { |
|||
key: 'parseExprAtom', |
|||
value: function () { |
|||
function parseExprAtom(refDestructuringErrors) { |
|||
if (this.type === _acorn.tokTypes._import) { |
|||
return parseDynamicImport.call(this); |
|||
} |
|||
return _get(_class.prototype.__proto__ || Object.getPrototypeOf(_class.prototype), 'parseExprAtom', this).call(this, refDestructuringErrors); |
|||
} |
|||
|
|||
return parseExprAtom; |
|||
}() |
|||
}]); |
|||
|
|||
return _class; |
|||
}(Parser); |
|||
} |
@ -1,43 +0,0 @@ |
|||
/* Generated by `npm run build`, do not edit! */ |
|||
|
|||
"use strict" |
|||
|
|||
var skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g |
|||
|
|||
var tt = require("acorn").tokTypes |
|||
|
|||
module.exports = function(Parser) { |
|||
return /*@__PURE__*/(function (Parser) { |
|||
function anonymous () { |
|||
Parser.apply(this, arguments); |
|||
} |
|||
|
|||
if ( Parser ) anonymous.__proto__ = Parser; |
|||
anonymous.prototype = Object.create( Parser && Parser.prototype ); |
|||
anonymous.prototype.constructor = anonymous; |
|||
|
|||
anonymous.prototype.parseExport = function parseExport (node, exports) { |
|||
skipWhiteSpace.lastIndex = this.pos |
|||
var skip = skipWhiteSpace.exec(this.input) |
|||
var next = this.input.charAt(this.pos + skip[0].length) |
|||
if (next !== "*") { return Parser.prototype.parseExport.call(this, node, exports) } |
|||
|
|||
this.next() |
|||
var specifier = this.startNode() |
|||
this.expect(tt.star) |
|||
if (this.eatContextual("as")) { |
|||
node.declaration = null |
|||
specifier.exported = this.parseIdent(true) |
|||
this.checkExport(exports, specifier.exported.name, this.lastTokStart) |
|||
node.specifiers = [this.finishNode(specifier, "ExportNamespaceSpecifier")] |
|||
} |
|||
this.expectContextual("from") |
|||
if (this.type !== tt.string) { this.unexpected() } |
|||
node.source = this.parseExprAtom() |
|||
this.semicolon() |
|||
return this.finishNode(node, node.specifiers ? "ExportNamedDeclaration" : "ExportAllDeclaration") |
|||
}; |
|||
|
|||
return anonymous; |
|||
}(Parser)) |
|||
} |
@ -1,55 +0,0 @@ |
|||
/* Generated by `npm run build`, do not edit! */ |
|||
|
|||
"use strict" |
|||
|
|||
var tt = require("acorn").tokTypes |
|||
|
|||
var skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g |
|||
|
|||
var nextTokenIsDot = function (parser) { |
|||
skipWhiteSpace.lastIndex = parser.pos |
|||
var skip = skipWhiteSpace.exec(parser.input) |
|||
var next = parser.pos + skip[0].length |
|||
return parser.input.slice(next, next + 1) === "." |
|||
} |
|||
|
|||
module.exports = function(Parser) { |
|||
return /*@__PURE__*/(function (Parser) { |
|||
function anonymous () { |
|||
Parser.apply(this, arguments); |
|||
} |
|||
|
|||
if ( Parser ) anonymous.__proto__ = Parser; |
|||
anonymous.prototype = Object.create( Parser && Parser.prototype ); |
|||
anonymous.prototype.constructor = anonymous; |
|||
|
|||
anonymous.prototype.parseExprAtom = function parseExprAtom (refDestructuringErrors) { |
|||
if (this.type !== tt._import || !nextTokenIsDot(this)) { return Parser.prototype.parseExprAtom.call(this, refDestructuringErrors) } |
|||
|
|||
if (!this.options.allowImportExportEverywhere && !this.inModule) { |
|||
this.raise(this.start, "'import' and 'export' may appear only with 'sourceType: module'") |
|||
} |
|||
|
|||
var node = this.startNode() |
|||
node.meta = this.parseIdent(true) |
|||
this.expect(tt.dot) |
|||
node.property = this.parseIdent(true) |
|||
if (node.property.name !== "meta") { |
|||
this.raiseRecoverable(node.property.start, "The only valid meta property for import is import.meta") |
|||
} |
|||
return this.finishNode(node, "MetaProperty") |
|||
}; |
|||
|
|||
anonymous.prototype.parseStatement = function parseStatement (context, topLevel, exports) { |
|||
if (this.type !== tt._import || !nextTokenIsDot(this)) { |
|||
return Parser.prototype.parseStatement.call(this, context, topLevel, exports) |
|||
} |
|||
|
|||
var node = this.startNode() |
|||
var expr = this.parseExpression() |
|||
return this.parseExpressionStatement(node, expr) |
|||
}; |
|||
|
|||
return anonymous; |
|||
}(Parser)) |
|||
} |
@ -1,61 +0,0 @@ |
|||
/* Generated by `npm run build`, do not edit! */ |
|||
|
|||
"use strict" |
|||
|
|||
module.exports = function(Parser) { |
|||
return /*@__PURE__*/(function (Parser) { |
|||
function anonymous () { |
|||
Parser.apply(this, arguments); |
|||
} |
|||
|
|||
if ( Parser ) anonymous.__proto__ = Parser; |
|||
anonymous.prototype = Object.create( Parser && Parser.prototype ); |
|||
anonymous.prototype.constructor = anonymous; |
|||
|
|||
anonymous.prototype.readInt = function readInt (radix, len) { |
|||
// Hack: len is only != null for unicode escape sequences,
|
|||
// where numeric separators are not allowed
|
|||
if (len != null) { return Parser.prototype.readInt.call(this, radix, len) } |
|||
|
|||
var start = this.pos, total = 0, acceptUnderscore = false |
|||
for (;;) { |
|||
var code = this.input.charCodeAt(this.pos), val = (void 0) |
|||
if (code >= 97) { val = code - 97 + 10 } // a
|
|||
else if (code == 95) { |
|||
if (!acceptUnderscore) { this.raise(this.pos, "Invalid numeric separator") } |
|||
++this.pos |
|||
acceptUnderscore = false |
|||
continue |
|||
} else if (code >= 65) { val = code - 65 + 10 } // A
|
|||
else if (code >= 48 && code <= 57) { val = code - 48 } // 0-9
|
|||
else { val = Infinity } |
|||
if (val >= radix) { break } |
|||
++this.pos |
|||
total = total * radix + val |
|||
acceptUnderscore = true |
|||
} |
|||
if (this.pos === start) { return null } |
|||
if (!acceptUnderscore) { this.raise(this.pos - 1, "Invalid numeric separator") } |
|||
|
|||
return total |
|||
}; |
|||
|
|||
anonymous.prototype.readNumber = function readNumber (startsWithDot) { |
|||
var token = Parser.prototype.readNumber.call(this, startsWithDot) |
|||
var octal = this.end - this.start >= 2 && this.input.charCodeAt(this.start) === 48 |
|||
var stripped = this.getNumberInput(this.start, this.end) |
|||
if (stripped.length < this.end - this.start) { |
|||
if (octal) { this.raise(this.start, "Invalid number") } |
|||
this.value = parseFloat(stripped) |
|||
} |
|||
return token |
|||
}; |
|||
|
|||
// This is used by acorn-bigint
|
|||
anonymous.prototype.getNumberInput = function getNumberInput (start, end) { |
|||
return this.input.slice(start, end).replace(/_/g, "") |
|||
}; |
|||
|
|||
return anonymous; |
|||
}(Parser)) |
|||
} |
@ -1,135 +0,0 @@ |
|||
/* Generated by `npm run build`, do not edit! */ |
|||
|
|||
"use strict" |
|||
|
|||
var acorn = require("acorn") |
|||
if (false) { |
|||
throw new Error(("acorn-private-class-elements requires acorn@^6.1.0, not " + (acorn.version))) |
|||
} |
|||
var tt = acorn.tokTypes |
|||
var TokenType = acorn.TokenType |
|||
|
|||
module.exports = function(Parser) { |
|||
// Only load this plugin once.
|
|||
if (Parser.prototype.parsePrivateName) { |
|||
return Parser |
|||
} |
|||
|
|||
// Make sure `Parser` comes from the same acorn as our `tt`,
|
|||
// otherwise the comparisons fail.
|
|||
var cur = Parser |
|||
while (cur && cur !== acorn.Parser) { |
|||
cur = cur.__proto__ |
|||
} |
|||
if (cur !== acorn.Parser) { |
|||
throw new Error("acorn-private-class-elements does not support mixing different acorn copies") |
|||
} |
|||
|
|||
Parser = /*@__PURE__*/(function (Parser) { |
|||
function Parser_ () { |
|||
Parser.apply(this, arguments); |
|||
} |
|||
|
|||
if ( Parser ) Parser_.__proto__ = Parser; |
|||
Parser_.prototype = Object.create( Parser && Parser.prototype ); |
|||
Parser_.prototype.constructor = Parser_; |
|||
|
|||
Parser_.prototype._branch = function _branch () { |
|||
this.__branch = this.__branch || new Parser({ecmaVersion: this.options.ecmaVersion}, this.input) |
|||
this.__branch.end = this.end |
|||
this.__branch.pos = this.pos |
|||
this.__branch.type = this.type |
|||
this.__branch.value = this.value |
|||
this.__branch.containsEsc = this.containsEsc |
|||
return this.__branch |
|||
}; |
|||
|
|||
Parser_.prototype.parsePrivateClassElementName = function parsePrivateClassElementName (element) { |
|||
element.computed = false |
|||
element.key = this.parsePrivateName() |
|||
if (element.key.name == "constructor") { this.raise(element.key.start, "Classes may not have a private element named constructor") } |
|||
var accept = {get: "set", set: "get"}[element.kind] |
|||
var privateBoundNames = this._privateBoundNamesStack[this._privateBoundNamesStack.length - 1] |
|||
if (Object.prototype.hasOwnProperty.call(privateBoundNames, element.key.name) && privateBoundNames[element.key.name] !== accept) { |
|||
this.raise(element.start, "Duplicate private element") |
|||
} |
|||
privateBoundNames[element.key.name] = element.kind || true |
|||
delete this._unresolvedPrivateNamesStack[this._unresolvedPrivateNamesStack.length - 1][element.key.name] |
|||
return element.key |
|||
}; |
|||
|
|||
Parser_.prototype.parsePrivateName = function parsePrivateName () { |
|||
var node = this.startNode() |
|||
node.name = this.value |
|||
this.next() |
|||
this.finishNode(node, "PrivateName") |
|||
if (this.options.allowReserved == "never") { this.checkUnreserved(node) } |
|||
return node |
|||
}; |
|||
|
|||
// Parse # token
|
|||
Parser_.prototype.getTokenFromCode = function getTokenFromCode (code) { |
|||
if (code === 35) { |
|||
++this.pos |
|||
var word = this.readWord1() |
|||
return this.finishToken(this.privateNameToken, word) |
|||
} |
|||
return Parser.prototype.getTokenFromCode.call(this, code) |
|||
}; |
|||
|
|||
// Manage stacks and check for undeclared private names
|
|||
Parser_.prototype.parseClass = function parseClass (node, isStatement) { |
|||
this._privateBoundNamesStack = this._privateBoundNamesStack || [] |
|||
var privateBoundNames = Object.create(this._privateBoundNamesStack[this._privateBoundNamesStack.length - 1] || null) |
|||
this._privateBoundNamesStack.push(privateBoundNames) |
|||
this._unresolvedPrivateNamesStack = this._unresolvedPrivateNamesStack || [] |
|||
var unresolvedPrivateNames = Object.create(null) |
|||
this._unresolvedPrivateNamesStack.push(unresolvedPrivateNames) |
|||
var _return = Parser.prototype.parseClass.call(this, node, isStatement) |
|||
this._privateBoundNamesStack.pop() |
|||
this._unresolvedPrivateNamesStack.pop() |
|||
if (!this._unresolvedPrivateNamesStack.length) { |
|||
var names = Object.keys(unresolvedPrivateNames) |
|||
if (names.length) { |
|||
names.sort(function (n1, n2) { return unresolvedPrivateNames[n1] - unresolvedPrivateNames[n2]; }) |
|||
this.raise(unresolvedPrivateNames[names[0]], "Usage of undeclared private name") |
|||
} |
|||
} else { Object.assign(this._unresolvedPrivateNamesStack[this._unresolvedPrivateNamesStack.length - 1], unresolvedPrivateNames) } |
|||
return _return |
|||
}; |
|||
|
|||
// Parse private element access
|
|||
Parser_.prototype.parseSubscript = function parseSubscript (base, startPos, startLoc, noCalls, maybeAsyncArrow) { |
|||
if (!this.eat(tt.dot)) { |
|||
return Parser.prototype.parseSubscript.call(this, base, startPos, startLoc, noCalls, maybeAsyncArrow) |
|||
} |
|||
var node = this.startNodeAt(startPos, startLoc) |
|||
node.object = base |
|||
node.computed = false |
|||
if (this.type == this.privateNameToken) { |
|||
node.property = this.parsePrivateName() |
|||
if (!this._privateBoundNamesStack.length || !this._privateBoundNamesStack[this._privateBoundNamesStack.length - 1][node.property.name]) { |
|||
this._unresolvedPrivateNamesStack[this._unresolvedPrivateNamesStack.length - 1][node.property.name] = node.property.start |
|||
} |
|||
} else { |
|||
node.property = this.parseIdent(true) |
|||
} |
|||
return this.finishNode(node, "MemberExpression") |
|||
}; |
|||
|
|||
// Prohibit delete of private class elements
|
|||
Parser_.prototype.parseMaybeUnary = function parseMaybeUnary (refDestructuringErrors, sawUnary) { |
|||
var _return = Parser.prototype.parseMaybeUnary.call(this, refDestructuringErrors, sawUnary) |
|||
if (_return.operator == "delete") { |
|||
if (_return.argument.type == "MemberExpression" && _return.argument.property.type == "PrivateName") { |
|||
this.raise(_return.start, "Private elements may not be deleted") |
|||
} |
|||
} |
|||
return _return |
|||
}; |
|||
|
|||
return Parser_; |
|||
}(Parser)) |
|||
Parser.prototype.privateNameToken = new TokenType("privateName") |
|||
return Parser |
|||
} |
@ -1,139 +0,0 @@ |
|||
/* Generated by `npm run build`, do not edit! */ |
|||
|
|||
"use strict" |
|||
|
|||
var skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g |
|||
|
|||
var acorn = require("acorn") |
|||
var tt = acorn.tokTypes |
|||
|
|||
function maybeParseFieldValue(field) { |
|||
if (this.eat(tt.eq)) { |
|||
var oldInFieldValue = this._inStaticFieldValue |
|||
this._inStaticFieldValue = true |
|||
field.value = this.parseExpression() |
|||
this._inStaticFieldValue = oldInFieldValue |
|||
} else { field.value = null } |
|||
} |
|||
|
|||
var privateClassElements = require("../private-class-elements") |
|||
|
|||
module.exports = function(Parser) { |
|||
var ExtendedParser = privateClassElements(Parser) |
|||
|
|||
return /*@__PURE__*/(function (ExtendedParser) { |
|||
function anonymous () { |
|||
ExtendedParser.apply(this, arguments); |
|||
} |
|||
|
|||
if ( ExtendedParser ) anonymous.__proto__ = ExtendedParser; |
|||
anonymous.prototype = Object.create( ExtendedParser && ExtendedParser.prototype ); |
|||
anonymous.prototype.constructor = anonymous; |
|||
|
|||
anonymous.prototype.parseClassElement = function parseClassElement (_constructorAllowsSuper) { |
|||
var this$1 = this; |
|||
|
|||
if (this.eat(tt.semi)) { return null } |
|||
|
|||
var node = this.startNode() |
|||
|
|||
var tryContextual = function (k, noLineBreak) { |
|||
if (typeof noLineBreak == "undefined") { noLineBreak = false } |
|||
var start = this$1.start, startLoc = this$1.startLoc |
|||
if (!this$1.eatContextual(k)) { return false } |
|||
if (this$1.type !== tt.parenL && (!noLineBreak || !this$1.canInsertSemicolon())) { return true } |
|||
if (node.key) { this$1.unexpected() } |
|||
node.computed = false |
|||
node.key = this$1.startNodeAt(start, startLoc) |
|||
node.key.name = k |
|||
this$1.finishNode(node.key, "Identifier") |
|||
return false |
|||
} |
|||
|
|||
node.static = tryContextual("static") |
|||
if (!node.static) { return ExtendedParser.prototype.parseClassElement.apply(this, arguments) } |
|||
|
|||
var isGenerator = this.eat(tt.star) |
|||
var isAsync = false |
|||
if (!isGenerator) { |
|||
// Special-case for `async`, since `parseClassMember` currently looks
|
|||
// for `(` to determine whether `async` is a method name
|
|||
if (this.options.ecmaVersion >= 8 && this.isContextual("async")) { |
|||
skipWhiteSpace.lastIndex = this.pos |
|||
var skip = skipWhiteSpace.exec(this.input) |
|||
var next = this.input.charAt(this.pos + skip[0].length) |
|||
if (next === ";" || next === "=") { |
|||
node.key = this.parseIdent(true) |
|||
node.computed = false |
|||
maybeParseFieldValue.call(this, node) |
|||
this.finishNode(node, "FieldDefinition") |
|||
this.semicolon() |
|||
return node |
|||
} else if (this.options.ecmaVersion >= 8 && tryContextual("async", true)) { |
|||
isAsync = true |
|||
isGenerator = this.options.ecmaVersion >= 9 && this.eat(tt.star) |
|||
} |
|||
} else if (tryContextual("get")) { |
|||
node.kind = "get" |
|||
} else if (tryContextual("set")) { |
|||
node.kind = "set" |
|||
} |
|||
} |
|||
if (this.type === this.privateNameToken) { |
|||
this.parsePrivateClassElementName(node) |
|||
if (this.type !== tt.parenL) { |
|||
if (node.key.name === "prototype") { |
|||
this.raise(node.key.start, "Classes may not have a private static property named prototype") |
|||
} |
|||
maybeParseFieldValue.call(this, node) |
|||
this.finishNode(node, "FieldDefinition") |
|||
this.semicolon() |
|||
return node |
|||
} |
|||
} else if (!node.key) { |
|||
this.parsePropertyName(node) |
|||
if ((node.key.name || node.key.value) === "prototype" && !node.computed) { |
|||
this.raise(node.key.start, "Classes may not have a static property named prototype") |
|||
} |
|||
} |
|||
if (!node.kind) { node.kind = "method" } |
|||
this.parseClassMethod(node, isGenerator, isAsync) |
|||
if (!node.kind && (node.key.name || node.key.value) === "constructor" && !node.computed) { |
|||
this.raise(node.key.start, "Classes may not have a static field named constructor") |
|||
} |
|||
if (node.kind === "get" && node.value.params.length !== 0) { |
|||
this.raiseRecoverable(node.value.start, "getter should have no params") |
|||
} |
|||
if (node.kind === "set" && node.value.params.length !== 1) { |
|||
this.raiseRecoverable(node.value.start, "setter should have exactly one param") |
|||
} |
|||
if (node.kind === "set" && node.value.params[0].type === "RestElement") { |
|||
this.raiseRecoverable(node.value.params[0].start, "Setter cannot use rest params") |
|||
} |
|||
|
|||
return node |
|||
|
|||
}; |
|||
|
|||
// Parse public static fields
|
|||
anonymous.prototype.parseClassMethod = function parseClassMethod (method, isGenerator, isAsync, _allowsDirectSuper) { |
|||
if (isGenerator || isAsync || method.kind != "method" || !method.static || this.options.ecmaVersion < 8 || this.type == tt.parenL) { |
|||
return ExtendedParser.prototype.parseClassMethod.apply(this, arguments) |
|||
} |
|||
maybeParseFieldValue.call(this, method) |
|||
delete method.kind |
|||
method = this.finishNode(method, "FieldDefinition") |
|||
this.semicolon() |
|||
return method |
|||
}; |
|||
|
|||
// Prohibit arguments in class field initializers
|
|||
anonymous.prototype.parseIdent = function parseIdent (liberal, isBinding) { |
|||
var ident = ExtendedParser.prototype.parseIdent.call(this, liberal, isBinding) |
|||
if (this._inStaticFieldValue && ident.name == "arguments") { this.raise(ident.start, "A static class field initializer may not contain arguments") } |
|||
return ident |
|||
}; |
|||
|
|||
return anonymous; |
|||
}(ExtendedParser)) |
|||
} |
@ -1,154 +0,0 @@ |
|||
var test = require('tape') |
|||
var acorn = require('../') |
|||
var walk = require('../walk') |
|||
var baseAcorn = require('acorn') |
|||
|
|||
test('parses object spread syntax', function (t) { |
|||
var ast = acorn.parse('var a = { ...b }') |
|||
t.equal(ast.body[0].declarations[0].init.type, 'ObjectExpression') |
|||
t.equal(ast.body[0].declarations[0].init.properties[0].type, 'SpreadElement') |
|||
|
|||
ast = acorn.parse('function a ({ ...b }) {}') |
|||
t.equal(ast.body[0].params[0].type, 'ObjectPattern') |
|||
t.equal(ast.body[0].params[0].properties[0].type, 'RestElement') |
|||
|
|||
t.end() |
|||
}) |
|||
|
|||
test('does not change main acorn module', function (t) { |
|||
t.throws(function () { |
|||
baseAcorn.parse('var a = 10n') |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('tokenizes object spread syntax', function (t) { |
|||
var tokenizer = acorn.tokenizer('var a = { ...b }') |
|||
|
|||
t.doesNotThrow(function (t) { |
|||
while (tokenizer.getToken().type !== acorn.tokTypes.eof) {} |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('allows hashbangs by default', function (t) { |
|||
t.doesNotThrow(function () { |
|||
acorn.parse('#!/usr/bin/env node\nconsole.log("ok")') |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('allows top level return by default', function (t) { |
|||
t.doesNotThrow(function () { |
|||
acorn.parse('console.log("ok"); return; console.log("not ok")') |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('supports async generators', function (t) { |
|||
t.doesNotThrow(function () { |
|||
acorn.parse('async function* a () { await x; yield 1 }') |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('supports async iteration', function (t) { |
|||
t.doesNotThrow(function () { |
|||
acorn.parse('async function l (y) { for await (const x of y) {} }') |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('supports optional catch', function (t) { |
|||
t.doesNotThrow(function () { |
|||
acorn.parse('try { throw null } catch {}') |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('supports bigint', function (t) { |
|||
t.doesNotThrow(function () { |
|||
acorn.parse('50n ** 50n') |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('supports numeric separators', function (t) { |
|||
t.doesNotThrow(function () { |
|||
acorn.parse('50_000_000n ** 1n') |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('supports import.meta with sourceType: module', function (t) { |
|||
t.doesNotThrow(function () { |
|||
acorn.parse('console.log(import.meta.url)', { sourceType: 'module' }) |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('supports dynamic import() with sourceType: module', function (t) { |
|||
t.doesNotThrow(function () { |
|||
acorn.parse('import("./whatever.mjs")', { sourceType: 'module' }) |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('supports dynamic import() with sourceType: script', function (t) { |
|||
t.doesNotThrow(function () { |
|||
acorn.parse('import("./whatever.mjs")', { sourceType: 'script' }) |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('supports class instance properties', function (t) { |
|||
t.doesNotThrow(function () { |
|||
acorn.parse('class X { x = y }', { sourceType: 'script' }) |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('supports private class instance properties', function (t) { |
|||
t.doesNotThrow(function () { |
|||
acorn.parse('class X { #x = y }', { sourceType: 'script' }) |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('supports class static properties', function (t) { |
|||
t.doesNotThrow(function () { |
|||
acorn.parse('class X { static x = y }', { sourceType: 'script' }) |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('supports private class static properties', function (t) { |
|||
t.doesNotThrow(function () { |
|||
acorn.parse('class X { static #x = y }', { sourceType: 'script' }) |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('supports namespace export syntax with sourceType: module', function (t) { |
|||
t.doesNotThrow(function () { |
|||
acorn.parse('export * as x from "./x.mjs";', { sourceType: 'module' }) |
|||
}) |
|||
t.end() |
|||
}) |
|||
|
|||
test('walk supports plugin syntax', function (t) { |
|||
var ast = acorn.parse( |
|||
'async function* a() { try { await import(xyz); } catch { for await (x of null) {} } yield import.meta.url }', |
|||
{ sourceType: 'module' } |
|||
) |
|||
t.plan(2) |
|||
walk.simple(ast, { |
|||
Import: function () { |
|||
t.pass('import()') |
|||
}, |
|||
MetaProperty: function () { |
|||
t.pass('import.meta') |
|||
} |
|||
}) |
|||
t.end() |
|||
}) |
@ -1,57 +0,0 @@ |
|||
var xtend = require('xtend') |
|||
var walk = require('acorn-walk') |
|||
|
|||
var base = xtend(walk.base) |
|||
base.Import = function () {} |
|||
|
|||
function simple (node, visitors, baseVisitor, state, override) { |
|||
return walk.simple(node, visitors, baseVisitor || base, state, override) |
|||
} |
|||
|
|||
function ancestor (node, visitors, baseVisitor, state) { |
|||
return walk.ancestor(node, visitors, baseVisitor || base, state) |
|||
} |
|||
|
|||
function recursive (node, state, funcs, baseVisitor, override) { |
|||
return walk.recursive(node, state, funcs, baseVisitor || base, override) |
|||
} |
|||
|
|||
function full (node, callback, baseVisitor, state, override) { |
|||
return walk.full(node, callback, baseVisitor || base, state, override) |
|||
} |
|||
|
|||
function fullAncestor (node, callback, baseVisitor, state) { |
|||
return walk.fullAncestor(node, callback, baseVisitor || base, state) |
|||
} |
|||
|
|||
function findNodeAt (node, start, end, test, baseVisitor, state) { |
|||
return walk.findNodeAt(node, start, end, test, baseVisitor || base, state) |
|||
} |
|||
|
|||
function findNodeAround (node, pos, test, baseVisitor, state) { |
|||
return walk.findNodeAround(node, pos, test, baseVisitor || base, state) |
|||
} |
|||
|
|||
function findNodeAfter (node, pos, test, baseVisitor, state) { |
|||
return walk.findNodeAfter(node, pos, test, baseVisitor || base, state) |
|||
} |
|||
|
|||
function findNodeBefore (node, pos, test, baseVisitor, state) { |
|||
return walk.findNodeBefore(node, pos, test, baseVisitor || base, state) |
|||
} |
|||
|
|||
function make (funcs, baseVisitor) { |
|||
return walk.make(funcs, baseVisitor || base) |
|||
} |
|||
|
|||
exports.simple = simple |
|||
exports.ancestor = ancestor |
|||
exports.recursive = recursive |
|||
exports.full = full |
|||
exports.fullAncestor = fullAncestor |
|||
exports.findNodeAt = findNodeAt |
|||
exports.findNodeAround = findNodeAround |
|||
exports.findNodeAfter = findNodeAfter |
|||
exports.findNodeBefore = findNodeBefore |
|||
exports.make = make |
|||
exports.base = base |
@ -1,121 +0,0 @@ |
|||
## 7.1.1 (2020-02-13) |
|||
|
|||
### Bug fixes |
|||
|
|||
Clean up the type definitions to actually work well with the main parser. |
|||
|
|||
## 7.1.0 (2020-02-11) |
|||
|
|||
### New features |
|||
|
|||
Add a TypeScript definition file for the library. |
|||
|
|||
## 7.0.0 (2017-08-12) |
|||
|
|||
### New features |
|||
|
|||
Support walking `ImportExpression` nodes. |
|||
|
|||
## 6.2.0 (2017-07-04) |
|||
|
|||
### New features |
|||
|
|||
Add support for `Import` nodes. |
|||
|
|||
## 6.1.0 (2018-09-28) |
|||
|
|||
### New features |
|||
|
|||
The walker now walks `TemplateElement` nodes. |
|||
|
|||
## 6.0.1 (2018-09-14) |
|||
|
|||
### Bug fixes |
|||
|
|||
Fix bad "main" field in package.json. |
|||
|
|||
## 6.0.0 (2018-09-14) |
|||
|
|||
### Breaking changes |
|||
|
|||
This is now a separate package, `acorn-walk`, rather than part of the main `acorn` package. |
|||
|
|||
The `ScopeBody` and `ScopeExpression` meta-node-types are no longer supported. |
|||
|
|||
## 5.7.1 (2018-06-15) |
|||
|
|||
### Bug fixes |
|||
|
|||
Make sure the walker and bin files are rebuilt on release (the previous release didn't get the up-to-date versions). |
|||
|
|||
## 5.7.0 (2018-06-15) |
|||
|
|||
### Bug fixes |
|||
|
|||
Fix crash in walker when walking a binding-less catch node. |
|||
|
|||
## 5.6.2 (2018-06-05) |
|||
|
|||
### Bug fixes |
|||
|
|||
In the walker, go back to allowing the `baseVisitor` argument to be null to default to the default base everywhere. |
|||
|
|||
## 5.6.1 (2018-06-01) |
|||
|
|||
### Bug fixes |
|||
|
|||
Fix regression when passing `null` as fourth argument to `walk.recursive`. |
|||
|
|||
## 5.6.0 (2018-05-31) |
|||
|
|||
### Bug fixes |
|||
|
|||
Fix a bug in the walker that caused a crash when walking an object pattern spread. |
|||
|
|||
## 5.5.1 (2018-03-06) |
|||
|
|||
### Bug fixes |
|||
|
|||
Fix regression in walker causing property values in object patterns to be walked as expressions. |
|||
|
|||
## 5.5.0 (2018-02-27) |
|||
|
|||
### Bug fixes |
|||
|
|||
Support object spread in the AST walker. |
|||
|
|||
## 5.4.1 (2018-02-02) |
|||
|
|||
### Bug fixes |
|||
|
|||
5.4.0 somehow accidentally included an old version of walk.js. |
|||
|
|||
## 5.2.0 (2017-10-30) |
|||
|
|||
### Bug fixes |
|||
|
|||
The `full` and `fullAncestor` walkers no longer visit nodes multiple times. |
|||
|
|||
## 5.1.0 (2017-07-05) |
|||
|
|||
### New features |
|||
|
|||
New walker functions `full` and `fullAncestor`. |
|||
|
|||
## 3.2.0 (2016-06-07) |
|||
|
|||
### New features |
|||
|
|||
Make it possible to use `visit.ancestor` with a walk state. |
|||
|
|||
## 3.1.0 (2016-04-18) |
|||
|
|||
### New features |
|||
|
|||
The walker now allows defining handlers for `CatchClause` nodes. |
|||
|
|||
## 2.5.2 (2015-10-27) |
|||
|
|||
### Fixes |
|||
|
|||
Fix bug where the walker walked an exported `let` statement as an expression. |
@ -1,19 +0,0 @@ |
|||
Copyright (C) 2012-2018 by various contributors (see AUTHORS) |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in |
|||
all copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
THE SOFTWARE. |
@ -1,126 +0,0 @@ |
|||
# Acorn AST walker |
|||
|
|||
An abstract syntax tree walker for the |
|||
[ESTree](https://github.com/estree/estree) format. |
|||
|
|||
## Community |
|||
|
|||
Acorn is open source software released under an |
|||
[MIT license](https://github.com/acornjs/acorn/blob/master/acorn-walk/LICENSE). |
|||
|
|||
You are welcome to |
|||
[report bugs](https://github.com/acornjs/acorn/issues) or create pull |
|||
requests on [github](https://github.com/acornjs/acorn). For questions |
|||
and discussion, please use the |
|||
[Tern discussion forum](https://discuss.ternjs.net). |
|||
|
|||
## Installation |
|||
|
|||
The easiest way to install acorn is from [`npm`](https://www.npmjs.com/): |
|||
|
|||
```sh |
|||
npm install acorn-walk |
|||
``` |
|||
|
|||
Alternately, you can download the source and build acorn yourself: |
|||
|
|||
```sh |
|||
git clone https://github.com/acornjs/acorn.git |
|||
cd acorn |
|||
npm install |
|||
``` |
|||
|
|||
## Interface |
|||
|
|||
An algorithm for recursing through a syntax tree is stored as an |
|||
object, with a property for each tree node type holding a function |
|||
that will recurse through such a node. There are several ways to run |
|||
such a walker. |
|||
|
|||
**simple**`(node, visitors, base, state)` does a 'simple' walk over a |
|||
tree. `node` should be the AST node to walk, and `visitors` an object |
|||
with properties whose names correspond to node types in the [ESTree |
|||
spec](https://github.com/estree/estree). The properties should contain |
|||
functions that will be called with the node object and, if applicable |
|||
the state at that point. The last two arguments are optional. `base` |
|||
is a walker algorithm, and `state` is a start state. The default |
|||
walker will simply visit all statements and expressions and not |
|||
produce a meaningful state. (An example of a use of state is to track |
|||
scope at each point in the tree.) |
|||
|
|||
```js |
|||
const acorn = require("acorn") |
|||
const walk = require("acorn-walk") |
|||
|
|||
walk.simple(acorn.parse("let x = 10"), { |
|||
Literal(node) { |
|||
console.log(`Found a literal: ${node.value}`) |
|||
} |
|||
}) |
|||
``` |
|||
|
|||
**ancestor**`(node, visitors, base, state)` does a 'simple' walk over |
|||
a tree, building up an array of ancestor nodes (including the current node) |
|||
and passing the array to the callbacks as a third parameter. |
|||
|
|||
```js |
|||
const acorn = require("acorn") |
|||
const walk = require("acorn-walk") |
|||
|
|||
walk.ancestor(acorn.parse("foo('hi')"), { |
|||
Literal(_, ancestors) { |
|||
console.log("This literal's ancestors are:", ancestors.map(n => n.type)) |
|||
} |
|||
}) |
|||
``` |
|||
|
|||
**recursive**`(node, state, functions, base)` does a 'recursive' |
|||
walk, where the walker functions are responsible for continuing the |
|||
walk on the child nodes of their target node. `state` is the start |
|||
state, and `functions` should contain an object that maps node types |
|||
to walker functions. Such functions are called with `(node, state, c)` |
|||
arguments, and can cause the walk to continue on a sub-node by calling |
|||
the `c` argument on it with `(node, state)` arguments. The optional |
|||
`base` argument provides the fallback walker functions for node types |
|||
that aren't handled in the `functions` object. If not given, the |
|||
default walkers will be used. |
|||
|
|||
**make**`(functions, base)` builds a new walker object by using the |
|||
walker functions in `functions` and filling in the missing ones by |
|||
taking defaults from `base`. |
|||
|
|||
**full**`(node, callback, base, state)` does a 'full' walk over a |
|||
tree, calling the callback with the arguments (node, state, type) for |
|||
each node |
|||
|
|||
**fullAncestor**`(node, callback, base, state)` does a 'full' walk |
|||
over a tree, building up an array of ancestor nodes (including the |
|||
current node) and passing the array to the callbacks as a third |
|||
parameter. |
|||
|
|||
```js |
|||
const acorn = require("acorn") |
|||
const walk = require("acorn-walk") |
|||
|
|||
walk.full(acorn.parse("1 + 1"), node => { |
|||
console.log(`There's a ${node.type} node at ${node.ch}`) |
|||
}) |
|||
``` |
|||
|
|||
**findNodeAt**`(node, start, end, test, base, state)` tries to locate |
|||
a node in a tree at the given start and/or end offsets, which |
|||
satisfies the predicate `test`. `start` and `end` can be either `null` |
|||
(as wildcard) or a number. `test` may be a string (indicating a node |
|||
type) or a function that takes `(nodeType, node)` arguments and |
|||
returns a boolean indicating whether this node is interesting. `base` |
|||
and `state` are optional, and can be used to specify a custom walker. |
|||
Nodes are tested from inner to outer, so if two nodes match the |
|||
boundaries, the inner one will be preferred. |
|||
|
|||
**findNodeAround**`(node, pos, test, base, state)` is a lot like |
|||
`findNodeAt`, but will match any node that exists 'around' (spanning) |
|||
the given position. |
|||
|
|||
**findNodeAfter**`(node, pos, test, base, state)` is similar to |
|||
`findNodeAround`, but will match all nodes *after* the given position |
|||
(testing outer nodes before inner nodes). |
@ -1,115 +0,0 @@ |
|||
import {Node} from 'acorn'; |
|||
|
|||
declare module "acorn-walk" { |
|||
type FullWalkerCallback<TState> = ( |
|||
node: Node, |
|||
state: TState, |
|||
type: string |
|||
) => void; |
|||
|
|||
type FullAncestorWalkerCallback<TState> = ( |
|||
node: Node, |
|||
state: TState | Node[], |
|||
ancestors: Node[], |
|||
type: string |
|||
) => void; |
|||
type WalkerCallback<TState> = (node: Node, state: TState) => void; |
|||
|
|||
type SimpleWalkerFn<TState> = ( |
|||
node: Node, |
|||
state: TState |
|||
) => void; |
|||
|
|||
type AncestorWalkerFn<TState> = ( |
|||
node: Node, |
|||
state: TState| Node[], |
|||
ancestors: Node[] |
|||
) => void; |
|||
|
|||
type RecursiveWalkerFn<TState> = ( |
|||
node: Node, |
|||
state: TState, |
|||
callback: WalkerCallback<TState> |
|||
) => void; |
|||
|
|||
type SimpleVisitors<TState> = { |
|||
[type: string]: SimpleWalkerFn<TState> |
|||
}; |
|||
|
|||
type AncestorVisitors<TState> = { |
|||
[type: string]: AncestorWalkerFn<TState> |
|||
}; |
|||
|
|||
type RecursiveVisitors<TState> = { |
|||
[type: string]: RecursiveWalkerFn<TState> |
|||
}; |
|||
|
|||
type FindPredicate = (type: string, node: Node) => boolean; |
|||
|
|||
interface Found<TState> { |
|||
node: Node, |
|||
state: TState |
|||
} |
|||
|
|||
export function simple<TState>( |
|||
node: Node, |
|||
visitors: SimpleVisitors<TState>, |
|||
base?: RecursiveVisitors<TState>, |
|||
state?: TState |
|||
): void; |
|||
|
|||
export function ancestor<TState>( |
|||
node: Node, |
|||
visitors: AncestorVisitors<TState>, |
|||
base?: RecursiveVisitors<TState>, |
|||
state?: TState |
|||
): void; |
|||
|
|||
export function recursive<TState>( |
|||
node: Node, |
|||
state: TState, |
|||
functions: RecursiveVisitors<TState>, |
|||
base?: RecursiveVisitors<TState> |
|||
): void; |
|||
|
|||
export function full<TState>( |
|||
node: Node, |
|||
callback: FullWalkerCallback<TState>, |
|||
base?: RecursiveVisitors<TState>, |
|||
state?: TState |
|||
): void; |
|||
|
|||
export function fullAncestor<TState>( |
|||
node: Node, |
|||
callback: FullAncestorWalkerCallback<TState>, |
|||
base?: RecursiveVisitors<TState>, |
|||
state?: TState |
|||
): void; |
|||
|
|||
export function make<TState>( |
|||
functions: RecursiveVisitors<TState>, |
|||
base?: RecursiveVisitors<TState> |
|||
): RecursiveVisitors<TState>; |
|||
|
|||
export function findNodeAt<TState>( |
|||
node: Node, |
|||
start: number | undefined, |
|||
end: number | undefined, |
|||
type: string, |
|||
base?: RecursiveVisitors<TState>, |
|||
state?: TState |
|||
): Found<TState> | undefined; |
|||
|
|||
export function findNodeAt<TState>( |
|||
node: Node, |
|||
start: number | undefined, |
|||
end: number | undefined, |
|||
type?: FindPredicate, |
|||
base?: RecursiveVisitors<TState>, |
|||
state?: TState |
|||
): Found<TState> | undefined; |
|||
|
|||
export const findNodeAround: typeof findNodeAt; |
|||
|
|||
export const findNodeAfter: typeof findNodeAt; |
|||
} |
@ -1,461 +0,0 @@ |
|||
(function (global, factory) { |
|||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : |
|||
typeof define === 'function' && define.amd ? define(['exports'], factory) : |
|||
(global = global || self, factory((global.acorn = global.acorn || {}, global.acorn.walk = {}))); |
|||
}(this, function (exports) { 'use strict'; |
|||
|
|||
// AST walker module for Mozilla Parser API compatible trees
|
|||
|
|||
// A simple walk is one where you simply specify callbacks to be
|
|||
// called on specific nodes. The last two arguments are optional. A
|
|||
// simple use would be
|
|||
//
|
|||
// walk.simple(myTree, {
|
|||
// Expression: function(node) { ... }
|
|||
// });
|
|||
//
|
|||
// to do something with all expressions. All Parser API node types
|
|||
// can be used to identify node types, as well as Expression and
|
|||
// Statement, which denote categories of nodes.
|
|||
//
|
|||
// The base argument can be used to pass a custom (recursive)
|
|||
// walker, and state can be used to give this walked an initial
|
|||
// state.
|
|||
|
|||
function simple(node, visitors, baseVisitor, state, override) { |
|||
if (!baseVisitor) { baseVisitor = base |
|||
; }(function c(node, st, override) { |
|||
var type = override || node.type, found = visitors[type]; |
|||
baseVisitor[type](node, st, c); |
|||
if (found) { found(node, st); } |
|||
})(node, state, override); |
|||
} |
|||
|
|||
// An ancestor walk keeps an array of ancestor nodes (including the
|
|||
// current node) and passes them to the callback as third parameter
|
|||
// (and also as state parameter when no other state is present).
|
|||
function ancestor(node, visitors, baseVisitor, state, override) { |
|||
var ancestors = []; |
|||
if (!baseVisitor) { baseVisitor = base |
|||
; }(function c(node, st, override) { |
|||
var type = override || node.type, found = visitors[type]; |
|||
var isNew = node !== ancestors[ancestors.length - 1]; |
|||
if (isNew) { ancestors.push(node); } |
|||
baseVisitor[type](node, st, c); |
|||
if (found) { found(node, st || ancestors, ancestors); } |
|||
if (isNew) { ancestors.pop(); } |
|||
})(node, state, override); |
|||
} |
|||
|
|||
// A recursive walk is one where your functions override the default
|
|||
// walkers. They can modify and replace the state parameter that's
|
|||
// threaded through the walk, and can opt how and whether to walk
|
|||
// their child nodes (by calling their third argument on these
|
|||
// nodes).
|
|||
function recursive(node, state, funcs, baseVisitor, override) { |
|||
var visitor = funcs ? make(funcs, baseVisitor || undefined) : baseVisitor |
|||
;(function c(node, st, override) { |
|||
visitor[override || node.type](node, st, c); |
|||
})(node, state, override); |
|||
} |
|||
|
|||
function makeTest(test) { |
|||
if (typeof test === "string") |
|||
{ return function (type) { return type === test; } } |
|||
else if (!test) |
|||
{ return function () { return true; } } |
|||
else |
|||
{ return test } |
|||
} |
|||
|
|||
var Found = function Found(node, state) { this.node = node; this.state = state; }; |
|||
|
|||
// A full walk triggers the callback on each node
|
|||
function full(node, callback, baseVisitor, state, override) { |
|||
if (!baseVisitor) { baseVisitor = base |
|||
; }(function c(node, st, override) { |
|||
var type = override || node.type; |
|||
baseVisitor[type](node, st, c); |
|||
if (!override) { callback(node, st, type); } |
|||
})(node, state, override); |
|||
} |
|||
|
|||
// An fullAncestor walk is like an ancestor walk, but triggers
|
|||
// the callback on each node
|
|||
function fullAncestor(node, callback, baseVisitor, state) { |
|||
if (!baseVisitor) { baseVisitor = base; } |
|||
var ancestors = [] |
|||
;(function c(node, st, override) { |
|||
var type = override || node.type; |
|||
var isNew = node !== ancestors[ancestors.length - 1]; |
|||
if (isNew) { ancestors.push(node); } |
|||
baseVisitor[type](node, st, c); |
|||
if (!override) { callback(node, st || ancestors, ancestors, type); } |
|||
if (isNew) { ancestors.pop(); } |
|||
})(node, state); |
|||
} |
|||
|
|||
// Find a node with a given start, end, and type (all are optional,
|
|||
// null can be used as wildcard). Returns a {node, state} object, or
|
|||
// undefined when it doesn't find a matching node.
|
|||
function findNodeAt(node, start, end, test, baseVisitor, state) { |
|||
if (!baseVisitor) { baseVisitor = base; } |
|||
test = makeTest(test); |
|||
try { |
|||
(function c(node, st, override) { |
|||
var type = override || node.type; |
|||
if ((start == null || node.start <= start) && |
|||
(end == null || node.end >= end)) |
|||
{ baseVisitor[type](node, st, c); } |
|||
if ((start == null || node.start === start) && |
|||
(end == null || node.end === end) && |
|||
test(type, node)) |
|||
{ throw new Found(node, st) } |
|||
})(node, state); |
|||
} catch (e) { |
|||
if (e instanceof Found) { return e } |
|||
throw e |
|||
} |
|||
} |
|||
|
|||
// Find the innermost node of a given type that contains the given
|
|||
// position. Interface similar to findNodeAt.
|
|||
function findNodeAround(node, pos, test, baseVisitor, state) { |
|||
test = makeTest(test); |
|||
if (!baseVisitor) { baseVisitor = base; } |
|||
try { |
|||
(function c(node, st, override) { |
|||
var type = override || node.type; |
|||
if (node.start > pos || node.end < pos) { return } |
|||
baseVisitor[type](node, st, c); |
|||
if (test(type, node)) { throw new Found(node, st) } |
|||
})(node, state); |
|||
} catch (e) { |
|||
if (e instanceof Found) { return e } |
|||
throw e |
|||
} |
|||
} |
|||
|
|||
// Find the outermost matching node after a given position.
|
|||
function findNodeAfter(node, pos, test, baseVisitor, state) { |
|||
test = makeTest(test); |
|||
if (!baseVisitor) { baseVisitor = base; } |
|||
try { |
|||
(function c(node, st, override) { |
|||
if (node.end < pos) { return } |
|||
var type = override || node.type; |
|||
if (node.start >= pos && test(type, node)) { throw new Found(node, st) } |
|||
baseVisitor[type](node, st, c); |
|||
})(node, state); |
|||
} catch (e) { |
|||
if (e instanceof Found) { return e } |
|||
throw e |
|||
} |
|||
} |
|||
|
|||
// Find the outermost matching node before a given position.
|
|||
function findNodeBefore(node, pos, test, baseVisitor, state) { |
|||
test = makeTest(test); |
|||
if (!baseVisitor) { baseVisitor = base; } |
|||
var max |
|||
;(function c(node, st, override) { |
|||
if (node.start > pos) { return } |
|||
var type = override || node.type; |
|||
if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node)) |
|||
{ max = new Found(node, st); } |
|||
baseVisitor[type](node, st, c); |
|||
})(node, state); |
|||
return max |
|||
} |
|||
|
|||
// Fallback to an Object.create polyfill for older environments.
|
|||
var create = Object.create || function(proto) { |
|||
function Ctor() {} |
|||
Ctor.prototype = proto; |
|||
return new Ctor |
|||
}; |
|||
|
|||
// Used to create a custom walker. Will fill in all missing node
|
|||
// type properties with the defaults.
|
|||
function make(funcs, baseVisitor) { |
|||
var visitor = create(baseVisitor || base); |
|||
for (var type in funcs) { visitor[type] = funcs[type]; } |
|||
return visitor |
|||
} |
|||
|
|||
function skipThrough(node, st, c) { c(node, st); } |
|||
function ignore(_node, _st, _c) {} |
|||
|
|||
// Node walkers.
|
|||
|
|||
var base = {}; |
|||
|
|||
base.Program = base.BlockStatement = function (node, st, c) { |
|||
for (var i = 0, list = node.body; i < list.length; i += 1) |
|||
{ |
|||
var stmt = list[i]; |
|||
|
|||
c(stmt, st, "Statement"); |
|||
} |
|||
}; |
|||
base.Statement = skipThrough; |
|||
base.EmptyStatement = ignore; |
|||
base.ExpressionStatement = base.ParenthesizedExpression = |
|||
function (node, st, c) { return c(node.expression, st, "Expression"); }; |
|||
base.IfStatement = function (node, st, c) { |
|||
c(node.test, st, "Expression"); |
|||
c(node.consequent, st, "Statement"); |
|||
if (node.alternate) { c(node.alternate, st, "Statement"); } |
|||
}; |
|||
base.LabeledStatement = function (node, st, c) { return c(node.body, st, "Statement"); }; |
|||
base.BreakStatement = base.ContinueStatement = ignore; |
|||
base.WithStatement = function (node, st, c) { |
|||
c(node.object, st, "Expression"); |
|||
c(node.body, st, "Statement"); |
|||
}; |
|||
base.SwitchStatement = function (node, st, c) { |
|||
c(node.discriminant, st, "Expression"); |
|||
for (var i$1 = 0, list$1 = node.cases; i$1 < list$1.length; i$1 += 1) { |
|||
var cs = list$1[i$1]; |
|||
|
|||
if (cs.test) { c(cs.test, st, "Expression"); } |
|||
for (var i = 0, list = cs.consequent; i < list.length; i += 1) |
|||
{ |
|||
var cons = list[i]; |
|||
|
|||
c(cons, st, "Statement"); |
|||
} |
|||
} |
|||
}; |
|||
base.SwitchCase = function (node, st, c) { |
|||
if (node.test) { c(node.test, st, "Expression"); } |
|||
for (var i = 0, list = node.consequent; i < list.length; i += 1) |
|||
{ |
|||
var cons = list[i]; |
|||
|
|||
c(cons, st, "Statement"); |
|||
} |
|||
}; |
|||
base.ReturnStatement = base.YieldExpression = base.AwaitExpression = function (node, st, c) { |
|||
if (node.argument) { c(node.argument, st, "Expression"); } |
|||
}; |
|||
base.ThrowStatement = base.SpreadElement = |
|||
function (node, st, c) { return c(node.argument, st, "Expression"); }; |
|||
base.TryStatement = function (node, st, c) { |
|||
c(node.block, st, "Statement"); |
|||
if (node.handler) { c(node.handler, st); } |
|||
if (node.finalizer) { c(node.finalizer, st, "Statement"); } |
|||
}; |
|||
base.CatchClause = function (node, st, c) { |
|||
if (node.param) { c(node.param, st, "Pattern"); } |
|||
c(node.body, st, "Statement"); |
|||
}; |
|||
base.WhileStatement = base.DoWhileStatement = function (node, st, c) { |
|||
c(node.test, st, "Expression"); |
|||
c(node.body, st, "Statement"); |
|||
}; |
|||
base.ForStatement = function (node, st, c) { |
|||
if (node.init) { c(node.init, st, "ForInit"); } |
|||
if (node.test) { c(node.test, st, "Expression"); } |
|||
if (node.update) { c(node.update, st, "Expression"); } |
|||
c(node.body, st, "Statement"); |
|||
}; |
|||
base.ForInStatement = base.ForOfStatement = function (node, st, c) { |
|||
c(node.left, st, "ForInit"); |
|||
c(node.right, st, "Expression"); |
|||
c(node.body, st, "Statement"); |
|||
}; |
|||
base.ForInit = function (node, st, c) { |
|||
if (node.type === "VariableDeclaration") { c(node, st); } |
|||
else { c(node, st, "Expression"); } |
|||
}; |
|||
base.DebuggerStatement = ignore; |
|||
|
|||
base.FunctionDeclaration = function (node, st, c) { return c(node, st, "Function"); }; |
|||
base.VariableDeclaration = function (node, st, c) { |
|||
for (var i = 0, list = node.declarations; i < list.length; i += 1) |
|||
{ |
|||
var decl = list[i]; |
|||
|
|||
c(decl, st); |
|||
} |
|||
}; |
|||
base.VariableDeclarator = function (node, st, c) { |
|||
c(node.id, st, "Pattern"); |
|||
if (node.init) { c(node.init, st, "Expression"); } |
|||
}; |
|||
|
|||
base.Function = function (node, st, c) { |
|||
if (node.id) { c(node.id, st, "Pattern"); } |
|||
for (var i = 0, list = node.params; i < list.length; i += 1) |
|||
{ |
|||
var param = list[i]; |
|||
|
|||
c(param, st, "Pattern"); |
|||
} |
|||
c(node.body, st, node.expression ? "Expression" : "Statement"); |
|||
}; |
|||
|
|||
base.Pattern = function (node, st, c) { |
|||
if (node.type === "Identifier") |
|||
{ c(node, st, "VariablePattern"); } |
|||
else if (node.type === "MemberExpression") |
|||
{ c(node, st, "MemberPattern"); } |
|||
else |
|||
{ c(node, st); } |
|||
}; |
|||
base.VariablePattern = ignore; |
|||
base.MemberPattern = skipThrough; |
|||
base.RestElement = function (node, st, c) { return c(node.argument, st, "Pattern"); }; |
|||
base.ArrayPattern = function (node, st, c) { |
|||
for (var i = 0, list = node.elements; i < list.length; i += 1) { |
|||
var elt = list[i]; |
|||
|
|||
if (elt) { c(elt, st, "Pattern"); } |
|||
} |
|||
}; |
|||
base.ObjectPattern = function (node, st, c) { |
|||
for (var i = 0, list = node.properties; i < list.length; i += 1) { |
|||
var prop = list[i]; |
|||
|
|||
if (prop.type === "Property") { |
|||
if (prop.computed) { c(prop.key, st, "Expression"); } |
|||
c(prop.value, st, "Pattern"); |
|||
} else if (prop.type === "RestElement") { |
|||
c(prop.argument, st, "Pattern"); |
|||
} |
|||
} |
|||
}; |
|||
|
|||
base.Expression = skipThrough; |
|||
base.ThisExpression = base.Super = base.MetaProperty = ignore; |
|||
base.ArrayExpression = function (node, st, c) { |
|||
for (var i = 0, list = node.elements; i < list.length; i += 1) { |
|||
var elt = list[i]; |
|||
|
|||
if (elt) { c(elt, st, "Expression"); } |
|||
} |
|||
}; |
|||
base.ObjectExpression = function (node, st, c) { |
|||
for (var i = 0, list = node.properties; i < list.length; i += 1) |
|||
{ |
|||
var prop = list[i]; |
|||
|
|||
c(prop, st); |
|||
} |
|||
}; |
|||
base.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration; |
|||
base.SequenceExpression = function (node, st, c) { |
|||
for (var i = 0, list = node.expressions; i < list.length; i += 1) |
|||
{ |
|||
var expr = list[i]; |
|||
|
|||
c(expr, st, "Expression"); |
|||
} |
|||
}; |
|||
base.TemplateLiteral = function (node, st, c) { |
|||
for (var i = 0, list = node.quasis; i < list.length; i += 1) |
|||
{ |
|||
var quasi = list[i]; |
|||
|
|||
c(quasi, st); |
|||
} |
|||
|
|||
for (var i$1 = 0, list$1 = node.expressions; i$1 < list$1.length; i$1 += 1) |
|||
{ |
|||
var expr = list$1[i$1]; |
|||
|
|||
c(expr, st, "Expression"); |
|||
} |
|||
}; |
|||
base.TemplateElement = ignore; |
|||
base.UnaryExpression = base.UpdateExpression = function (node, st, c) { |
|||
c(node.argument, st, "Expression"); |
|||
}; |
|||
base.BinaryExpression = base.LogicalExpression = function (node, st, c) { |
|||
c(node.left, st, "Expression"); |
|||
c(node.right, st, "Expression"); |
|||
}; |
|||
base.AssignmentExpression = base.AssignmentPattern = function (node, st, c) { |
|||
c(node.left, st, "Pattern"); |
|||
c(node.right, st, "Expression"); |
|||
}; |
|||
base.ConditionalExpression = function (node, st, c) { |
|||
c(node.test, st, "Expression"); |
|||
c(node.consequent, st, "Expression"); |
|||
c(node.alternate, st, "Expression"); |
|||
}; |
|||
base.NewExpression = base.CallExpression = function (node, st, c) { |
|||
c(node.callee, st, "Expression"); |
|||
if (node.arguments) |
|||
{ for (var i = 0, list = node.arguments; i < list.length; i += 1) |
|||
{ |
|||
var arg = list[i]; |
|||
|
|||
c(arg, st, "Expression"); |
|||
} } |
|||
}; |
|||
base.MemberExpression = function (node, st, c) { |
|||
c(node.object, st, "Expression"); |
|||
if (node.computed) { c(node.property, st, "Expression"); } |
|||
}; |
|||
base.ExportNamedDeclaration = base.ExportDefaultDeclaration = function (node, st, c) { |
|||
if (node.declaration) |
|||
{ c(node.declaration, st, node.type === "ExportNamedDeclaration" || node.declaration.id ? "Statement" : "Expression"); } |
|||
if (node.source) { c(node.source, st, "Expression"); } |
|||
}; |
|||
base.ExportAllDeclaration = function (node, st, c) { |
|||
c(node.source, st, "Expression"); |
|||
}; |
|||
base.ImportDeclaration = function (node, st, c) { |
|||
for (var i = 0, list = node.specifiers; i < list.length; i += 1) |
|||
{ |
|||
var spec = list[i]; |
|||
|
|||
c(spec, st); |
|||
} |
|||
c(node.source, st, "Expression"); |
|||
}; |
|||
base.ImportExpression = function (node, st, c) { |
|||
c(node.source, st, "Expression"); |
|||
}; |
|||
base.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.Literal = ignore; |
|||
|
|||
base.TaggedTemplateExpression = function (node, st, c) { |
|||
c(node.tag, st, "Expression"); |
|||
c(node.quasi, st, "Expression"); |
|||
}; |
|||
base.ClassDeclaration = base.ClassExpression = function (node, st, c) { return c(node, st, "Class"); }; |
|||
base.Class = function (node, st, c) { |
|||
if (node.id) { c(node.id, st, "Pattern"); } |
|||
if (node.superClass) { c(node.superClass, st, "Expression"); } |
|||
c(node.body, st); |
|||
}; |
|||
base.ClassBody = function (node, st, c) { |
|||
for (var i = 0, list = node.body; i < list.length; i += 1) |
|||
{ |
|||
var elt = list[i]; |
|||
|
|||
c(elt, st); |
|||
} |
|||
}; |
|||
base.MethodDefinition = base.Property = function (node, st, c) { |
|||
if (node.computed) { c(node.key, st, "Expression"); } |
|||
c(node.value, st, "Expression"); |
|||
}; |
|||
|
|||
exports.ancestor = ancestor; |
|||
exports.base = base; |
|||
exports.findNodeAfter = findNodeAfter; |
|||
exports.findNodeAround = findNodeAround; |
|||
exports.findNodeAt = findNodeAt; |
|||
exports.findNodeBefore = findNodeBefore; |
|||
exports.full = full; |
|||
exports.fullAncestor = fullAncestor; |
|||
exports.make = make; |
|||
exports.recursive = recursive; |
|||
exports.simple = simple; |
|||
|
|||
Object.defineProperty(exports, '__esModule', { value: true }); |
|||
|
|||
})); |
Some files were not shown because too many files changed in this diff
Write
Preview
Loading…
Cancel
Save
Reference in new issue