pvincent
2 years ago
commit
e30d26d9a0
1015 changed files with 195137 additions and 0 deletions
-
1.gitignore
-
1.semver_git_tag
-
9.vscode/extensions.json
-
7.vscode/settings.json
-
7README.md
-
1node_modules/.bin/acorn
-
1node_modules/.bin/cssesc
-
1node_modules/.bin/detective
-
1node_modules/.bin/nanoid
-
1node_modules/.bin/resolve
-
1node_modules/.bin/tailwind
-
1node_modules/.bin/tailwindcss
-
778node_modules/.package-lock.json
-
21node_modules/@nodelib/fs.scandir/LICENSE
-
171node_modules/@nodelib/fs.scandir/README.md
-
20node_modules/@nodelib/fs.scandir/out/adapters/fs.d.ts
-
19node_modules/@nodelib/fs.scandir/out/adapters/fs.js
-
4node_modules/@nodelib/fs.scandir/out/constants.d.ts
-
17node_modules/@nodelib/fs.scandir/out/constants.js
-
12node_modules/@nodelib/fs.scandir/out/index.d.ts
-
26node_modules/@nodelib/fs.scandir/out/index.js
-
7node_modules/@nodelib/fs.scandir/out/providers/async.d.ts
-
104node_modules/@nodelib/fs.scandir/out/providers/async.js
-
1node_modules/@nodelib/fs.scandir/out/providers/common.d.ts
-
13node_modules/@nodelib/fs.scandir/out/providers/common.js
-
5node_modules/@nodelib/fs.scandir/out/providers/sync.d.ts
-
54node_modules/@nodelib/fs.scandir/out/providers/sync.js
-
20node_modules/@nodelib/fs.scandir/out/settings.d.ts
-
24node_modules/@nodelib/fs.scandir/out/settings.js
-
20node_modules/@nodelib/fs.scandir/out/types/index.d.ts
-
2node_modules/@nodelib/fs.scandir/out/types/index.js
-
2node_modules/@nodelib/fs.scandir/out/utils/fs.d.ts
-
19node_modules/@nodelib/fs.scandir/out/utils/fs.js
-
2node_modules/@nodelib/fs.scandir/out/utils/index.d.ts
-
5node_modules/@nodelib/fs.scandir/out/utils/index.js
-
44node_modules/@nodelib/fs.scandir/package.json
-
21node_modules/@nodelib/fs.stat/LICENSE
-
126node_modules/@nodelib/fs.stat/README.md
-
13node_modules/@nodelib/fs.stat/out/adapters/fs.d.ts
-
17node_modules/@nodelib/fs.stat/out/adapters/fs.js
-
12node_modules/@nodelib/fs.stat/out/index.d.ts
-
26node_modules/@nodelib/fs.stat/out/index.js
-
4node_modules/@nodelib/fs.stat/out/providers/async.d.ts
-
36node_modules/@nodelib/fs.stat/out/providers/async.js
-
3node_modules/@nodelib/fs.stat/out/providers/sync.d.ts
-
23node_modules/@nodelib/fs.stat/out/providers/sync.js
-
16node_modules/@nodelib/fs.stat/out/settings.d.ts
-
16node_modules/@nodelib/fs.stat/out/settings.js
-
4node_modules/@nodelib/fs.stat/out/types/index.d.ts
-
2node_modules/@nodelib/fs.stat/out/types/index.js
-
37node_modules/@nodelib/fs.stat/package.json
-
21node_modules/@nodelib/fs.walk/LICENSE
-
215node_modules/@nodelib/fs.walk/README.md
-
14node_modules/@nodelib/fs.walk/out/index.d.ts
-
34node_modules/@nodelib/fs.walk/out/index.js
-
12node_modules/@nodelib/fs.walk/out/providers/async.d.ts
-
30node_modules/@nodelib/fs.walk/out/providers/async.js
-
4node_modules/@nodelib/fs.walk/out/providers/index.d.ts
-
9node_modules/@nodelib/fs.walk/out/providers/index.js
-
12node_modules/@nodelib/fs.walk/out/providers/stream.d.ts
-
34node_modules/@nodelib/fs.walk/out/providers/stream.js
-
10node_modules/@nodelib/fs.walk/out/providers/sync.d.ts
-
14node_modules/@nodelib/fs.walk/out/providers/sync.js
-
30node_modules/@nodelib/fs.walk/out/readers/async.d.ts
-
97node_modules/@nodelib/fs.walk/out/readers/async.js
-
7node_modules/@nodelib/fs.walk/out/readers/common.d.ts
-
31node_modules/@nodelib/fs.walk/out/readers/common.js
-
6node_modules/@nodelib/fs.walk/out/readers/reader.d.ts
-
11node_modules/@nodelib/fs.walk/out/readers/reader.js
-
15node_modules/@nodelib/fs.walk/out/readers/sync.d.ts
-
59node_modules/@nodelib/fs.walk/out/readers/sync.js
-
30node_modules/@nodelib/fs.walk/out/settings.d.ts
-
26node_modules/@nodelib/fs.walk/out/settings.js
-
8node_modules/@nodelib/fs.walk/out/types/index.d.ts
-
2node_modules/@nodelib/fs.walk/out/types/index.js
-
44node_modules/@nodelib/fs.walk/package.json
-
22node_modules/acorn-node/.travis.yml
-
94node_modules/acorn-node/CHANGELOG.md
-
95node_modules/acorn-node/LICENSE.md
-
65node_modules/acorn-node/README.md
-
36node_modules/acorn-node/build.js
-
38node_modules/acorn-node/index.js
-
71node_modules/acorn-node/lib/bigint/index.js
-
70node_modules/acorn-node/lib/class-fields/index.js
-
86node_modules/acorn-node/lib/dynamic-import/index.js
-
43node_modules/acorn-node/lib/export-ns-from/index.js
-
55node_modules/acorn-node/lib/import-meta/index.js
-
61node_modules/acorn-node/lib/numeric-separator/index.js
-
135node_modules/acorn-node/lib/private-class-elements/index.js
-
139node_modules/acorn-node/lib/static-class-features/index.js
-
51node_modules/acorn-node/package.json
-
154node_modules/acorn-node/test/index.js
-
57node_modules/acorn-node/walk.js
-
131node_modules/acorn-walk/CHANGELOG.md
-
19node_modules/acorn-walk/LICENSE
-
126node_modules/acorn-walk/README.md
-
112node_modules/acorn-walk/dist/walk.d.ts
-
463node_modules/acorn-walk/dist/walk.js
-
1node_modules/acorn-walk/dist/walk.js.map
-
443node_modules/acorn-walk/dist/walk.mjs
@ -0,0 +1 @@ |
|||||
|
node_modules |
@ -0,0 +1 @@ |
|||||
|
0.0.1 |
@ -0,0 +1,9 @@ |
|||||
|
{ |
||||
|
"recommendations": [ |
||||
|
"dbaeumer.vscode-eslint", |
||||
|
"esbenp.prettier-vscode", |
||||
|
"streetsidesoftware.code-spell-checker", |
||||
|
"streetsidesoftware.code-spell-checker-french-reforme", |
||||
|
"bradlc.vscode-tailwindcss", |
||||
|
] |
||||
|
} |
@ -0,0 +1,7 @@ |
|||||
|
{ |
||||
|
"cSpell.language": "en,fr-FR", |
||||
|
"cSpell.words": [ |
||||
|
"crealise", |
||||
|
"Créalise" |
||||
|
], |
||||
|
} |
@ -0,0 +1,7 @@ |
|||||
|
Web Development example 01 |
||||
|
========================== |
||||
|
|
||||
|
* [x] Tailwind |
||||
|
* [x] Font Awesome |
||||
|
* [x] Alpine JS |
||||
|
* [x] transition |
@ -0,0 +1 @@ |
|||||
|
../acorn/bin/acorn |
@ -0,0 +1 @@ |
|||||
|
../cssesc/bin/cssesc |
@ -0,0 +1 @@ |
|||||
|
../detective/bin/detective.js |
@ -0,0 +1 @@ |
|||||
|
../nanoid/bin/nanoid.cjs |
@ -0,0 +1 @@ |
|||||
|
../resolve/bin/resolve |
@ -0,0 +1 @@ |
|||||
|
../tailwindcss/lib/cli.js |
@ -0,0 +1 @@ |
|||||
|
../tailwindcss/lib/cli.js |
@ -0,0 +1,778 @@ |
|||||
|
{ |
||||
|
"name": "webdev-minimal", |
||||
|
"lockfileVersion": 2, |
||||
|
"requires": true, |
||||
|
"packages": { |
||||
|
"node_modules/@nodelib/fs.scandir": { |
||||
|
"version": "2.1.5", |
||||
|
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", |
||||
|
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"@nodelib/fs.stat": "2.0.5", |
||||
|
"run-parallel": "^1.1.9" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">= 8" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/@nodelib/fs.stat": { |
||||
|
"version": "2.0.5", |
||||
|
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", |
||||
|
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"node": ">= 8" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/@nodelib/fs.walk": { |
||||
|
"version": "1.2.8", |
||||
|
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", |
||||
|
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"@nodelib/fs.scandir": "2.1.5", |
||||
|
"fastq": "^1.6.0" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">= 8" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/acorn": { |
||||
|
"version": "7.4.1", |
||||
|
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", |
||||
|
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", |
||||
|
"dev": true, |
||||
|
"bin": { |
||||
|
"acorn": "bin/acorn" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=0.4.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/acorn-node": { |
||||
|
"version": "1.8.2", |
||||
|
"resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", |
||||
|
"integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"acorn": "^7.0.0", |
||||
|
"acorn-walk": "^7.0.0", |
||||
|
"xtend": "^4.0.2" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/acorn-walk": { |
||||
|
"version": "7.2.0", |
||||
|
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", |
||||
|
"integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"node": ">=0.4.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/anymatch": { |
||||
|
"version": "3.1.2", |
||||
|
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", |
||||
|
"integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"normalize-path": "^3.0.0", |
||||
|
"picomatch": "^2.0.4" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">= 8" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/arg": { |
||||
|
"version": "5.0.2", |
||||
|
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", |
||||
|
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", |
||||
|
"dev": true |
||||
|
}, |
||||
|
"node_modules/binary-extensions": { |
||||
|
"version": "2.2.0", |
||||
|
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", |
||||
|
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"node": ">=8" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/braces": { |
||||
|
"version": "3.0.2", |
||||
|
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", |
||||
|
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"fill-range": "^7.0.1" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=8" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/camelcase-css": { |
||||
|
"version": "2.0.1", |
||||
|
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", |
||||
|
"integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"node": ">= 6" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/chokidar": { |
||||
|
"version": "3.5.3", |
||||
|
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", |
||||
|
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", |
||||
|
"dev": true, |
||||
|
"funding": [ |
||||
|
{ |
||||
|
"type": "individual", |
||||
|
"url": "https://paulmillr.com/funding/" |
||||
|
} |
||||
|
], |
||||
|
"dependencies": { |
||||
|
"anymatch": "~3.1.2", |
||||
|
"braces": "~3.0.2", |
||||
|
"glob-parent": "~5.1.2", |
||||
|
"is-binary-path": "~2.1.0", |
||||
|
"is-glob": "~4.0.1", |
||||
|
"normalize-path": "~3.0.0", |
||||
|
"readdirp": "~3.6.0" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">= 8.10.0" |
||||
|
}, |
||||
|
"optionalDependencies": { |
||||
|
"fsevents": "~2.3.2" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/chokidar/node_modules/glob-parent": { |
||||
|
"version": "5.1.2", |
||||
|
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", |
||||
|
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"is-glob": "^4.0.1" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">= 6" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/color-name": { |
||||
|
"version": "1.1.4", |
||||
|
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", |
||||
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", |
||||
|
"dev": true |
||||
|
}, |
||||
|
"node_modules/cssesc": { |
||||
|
"version": "3.0.0", |
||||
|
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", |
||||
|
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", |
||||
|
"dev": true, |
||||
|
"bin": { |
||||
|
"cssesc": "bin/cssesc" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=4" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/defined": { |
||||
|
"version": "1.0.0", |
||||
|
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", |
||||
|
"integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", |
||||
|
"dev": true |
||||
|
}, |
||||
|
"node_modules/detective": { |
||||
|
"version": "5.2.1", |
||||
|
"resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", |
||||
|
"integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"acorn-node": "^1.8.2", |
||||
|
"defined": "^1.0.0", |
||||
|
"minimist": "^1.2.6" |
||||
|
}, |
||||
|
"bin": { |
||||
|
"detective": "bin/detective.js" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=0.8.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/didyoumean": { |
||||
|
"version": "1.2.2", |
||||
|
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", |
||||
|
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", |
||||
|
"dev": true |
||||
|
}, |
||||
|
"node_modules/dlv": { |
||||
|
"version": "1.1.3", |
||||
|
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", |
||||
|
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", |
||||
|
"dev": true |
||||
|
}, |
||||
|
"node_modules/fast-glob": { |
||||
|
"version": "3.2.12", |
||||
|
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", |
||||
|
"integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"@nodelib/fs.stat": "^2.0.2", |
||||
|
"@nodelib/fs.walk": "^1.2.3", |
||||
|
"glob-parent": "^5.1.2", |
||||
|
"merge2": "^1.3.0", |
||||
|
"micromatch": "^4.0.4" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=8.6.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/fast-glob/node_modules/glob-parent": { |
||||
|
"version": "5.1.2", |
||||
|
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", |
||||
|
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"is-glob": "^4.0.1" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">= 6" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/fastq": { |
||||
|
"version": "1.13.0", |
||||
|
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", |
||||
|
"integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"reusify": "^1.0.4" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/fill-range": { |
||||
|
"version": "7.0.1", |
||||
|
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", |
||||
|
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"to-regex-range": "^5.0.1" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=8" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/function-bind": { |
||||
|
"version": "1.1.1", |
||||
|
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", |
||||
|
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", |
||||
|
"dev": true |
||||
|
}, |
||||
|
"node_modules/glob-parent": { |
||||
|
"version": "6.0.2", |
||||
|
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", |
||||
|
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"is-glob": "^4.0.3" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=10.13.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/has": { |
||||
|
"version": "1.0.3", |
||||
|
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", |
||||
|
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"function-bind": "^1.1.1" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">= 0.4.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/is-binary-path": { |
||||
|
"version": "2.1.0", |
||||
|
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", |
||||
|
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"binary-extensions": "^2.0.0" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=8" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/is-core-module": { |
||||
|
"version": "2.10.0", |
||||
|
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", |
||||
|
"integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"has": "^1.0.3" |
||||
|
}, |
||||
|
"funding": { |
||||
|
"url": "https://github.com/sponsors/ljharb" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/is-extglob": { |
||||
|
"version": "2.1.1", |
||||
|
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", |
||||
|
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"node": ">=0.10.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/is-glob": { |
||||
|
"version": "4.0.3", |
||||
|
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", |
||||
|
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"is-extglob": "^2.1.1" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=0.10.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/is-number": { |
||||
|
"version": "7.0.0", |
||||
|
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", |
||||
|
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"node": ">=0.12.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/lilconfig": { |
||||
|
"version": "2.0.6", |
||||
|
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", |
||||
|
"integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"node": ">=10" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/merge2": { |
||||
|
"version": "1.4.1", |
||||
|
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", |
||||
|
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"node": ">= 8" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/micromatch": { |
||||
|
"version": "4.0.5", |
||||
|
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", |
||||
|
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"braces": "^3.0.2", |
||||
|
"picomatch": "^2.3.1" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=8.6" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/minimist": { |
||||
|
"version": "1.2.6", |
||||
|
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", |
||||
|
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", |
||||
|
"dev": true |
||||
|
}, |
||||
|
"node_modules/nanoid": { |
||||
|
"version": "3.3.4", |
||||
|
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", |
||||
|
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", |
||||
|
"dev": true, |
||||
|
"peer": true, |
||||
|
"bin": { |
||||
|
"nanoid": "bin/nanoid.cjs" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/normalize-path": { |
||||
|
"version": "3.0.0", |
||||
|
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", |
||||
|
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"node": ">=0.10.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/object-hash": { |
||||
|
"version": "3.0.0", |
||||
|
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", |
||||
|
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"node": ">= 6" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/path-parse": { |
||||
|
"version": "1.0.7", |
||||
|
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", |
||||
|
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", |
||||
|
"dev": true |
||||
|
}, |
||||
|
"node_modules/picocolors": { |
||||
|
"version": "1.0.0", |
||||
|
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", |
||||
|
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", |
||||
|
"dev": true |
||||
|
}, |
||||
|
"node_modules/picomatch": { |
||||
|
"version": "2.3.1", |
||||
|
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", |
||||
|
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"node": ">=8.6" |
||||
|
}, |
||||
|
"funding": { |
||||
|
"url": "https://github.com/sponsors/jonschlinkert" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/pify": { |
||||
|
"version": "2.3.0", |
||||
|
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", |
||||
|
"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"node": ">=0.10.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/postcss": { |
||||
|
"version": "8.4.17", |
||||
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz", |
||||
|
"integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==", |
||||
|
"dev": true, |
||||
|
"funding": [ |
||||
|
{ |
||||
|
"type": "opencollective", |
||||
|
"url": "https://opencollective.com/postcss/" |
||||
|
}, |
||||
|
{ |
||||
|
"type": "tidelift", |
||||
|
"url": "https://tidelift.com/funding/github/npm/postcss" |
||||
|
} |
||||
|
], |
||||
|
"peer": true, |
||||
|
"dependencies": { |
||||
|
"nanoid": "^3.3.4", |
||||
|
"picocolors": "^1.0.0", |
||||
|
"source-map-js": "^1.0.2" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": "^10 || ^12 || >=14" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/postcss-import": { |
||||
|
"version": "14.1.0", |
||||
|
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", |
||||
|
"integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"postcss-value-parser": "^4.0.0", |
||||
|
"read-cache": "^1.0.0", |
||||
|
"resolve": "^1.1.7" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=10.0.0" |
||||
|
}, |
||||
|
"peerDependencies": { |
||||
|
"postcss": "^8.0.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/postcss-js": { |
||||
|
"version": "4.0.0", |
||||
|
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", |
||||
|
"integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"camelcase-css": "^2.0.1" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": "^12 || ^14 || >= 16" |
||||
|
}, |
||||
|
"funding": { |
||||
|
"type": "opencollective", |
||||
|
"url": "https://opencollective.com/postcss/" |
||||
|
}, |
||||
|
"peerDependencies": { |
||||
|
"postcss": "^8.3.3" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/postcss-load-config": { |
||||
|
"version": "3.1.4", |
||||
|
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", |
||||
|
"integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"lilconfig": "^2.0.5", |
||||
|
"yaml": "^1.10.2" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">= 10" |
||||
|
}, |
||||
|
"funding": { |
||||
|
"type": "opencollective", |
||||
|
"url": "https://opencollective.com/postcss/" |
||||
|
}, |
||||
|
"peerDependencies": { |
||||
|
"postcss": ">=8.0.9", |
||||
|
"ts-node": ">=9.0.0" |
||||
|
}, |
||||
|
"peerDependenciesMeta": { |
||||
|
"postcss": { |
||||
|
"optional": true |
||||
|
}, |
||||
|
"ts-node": { |
||||
|
"optional": true |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/postcss-nested": { |
||||
|
"version": "5.0.6", |
||||
|
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", |
||||
|
"integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"postcss-selector-parser": "^6.0.6" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=12.0" |
||||
|
}, |
||||
|
"funding": { |
||||
|
"type": "opencollective", |
||||
|
"url": "https://opencollective.com/postcss/" |
||||
|
}, |
||||
|
"peerDependencies": { |
||||
|
"postcss": "^8.2.14" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/postcss-selector-parser": { |
||||
|
"version": "6.0.10", |
||||
|
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", |
||||
|
"integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"cssesc": "^3.0.0", |
||||
|
"util-deprecate": "^1.0.2" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=4" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/postcss-value-parser": { |
||||
|
"version": "4.2.0", |
||||
|
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", |
||||
|
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", |
||||
|
"dev": true |
||||
|
}, |
||||
|
"node_modules/queue-microtask": { |
||||
|
"version": "1.2.3", |
||||
|
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", |
||||
|
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", |
||||
|
"dev": true, |
||||
|
"funding": [ |
||||
|
{ |
||||
|
"type": "github", |
||||
|
"url": "https://github.com/sponsors/feross" |
||||
|
}, |
||||
|
{ |
||||
|
"type": "patreon", |
||||
|
"url": "https://www.patreon.com/feross" |
||||
|
}, |
||||
|
{ |
||||
|
"type": "consulting", |
||||
|
"url": "https://feross.org/support" |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
"node_modules/quick-lru": { |
||||
|
"version": "5.1.1", |
||||
|
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", |
||||
|
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"node": ">=10" |
||||
|
}, |
||||
|
"funding": { |
||||
|
"url": "https://github.com/sponsors/sindresorhus" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/read-cache": { |
||||
|
"version": "1.0.0", |
||||
|
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", |
||||
|
"integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"pify": "^2.3.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/readdirp": { |
||||
|
"version": "3.6.0", |
||||
|
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", |
||||
|
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"picomatch": "^2.2.1" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=8.10.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/resolve": { |
||||
|
"version": "1.22.1", |
||||
|
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", |
||||
|
"integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"is-core-module": "^2.9.0", |
||||
|
"path-parse": "^1.0.7", |
||||
|
"supports-preserve-symlinks-flag": "^1.0.0" |
||||
|
}, |
||||
|
"bin": { |
||||
|
"resolve": "bin/resolve" |
||||
|
}, |
||||
|
"funding": { |
||||
|
"url": "https://github.com/sponsors/ljharb" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/reusify": { |
||||
|
"version": "1.0.4", |
||||
|
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", |
||||
|
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"iojs": ">=1.0.0", |
||||
|
"node": ">=0.10.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/run-parallel": { |
||||
|
"version": "1.2.0", |
||||
|
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", |
||||
|
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", |
||||
|
"dev": true, |
||||
|
"funding": [ |
||||
|
{ |
||||
|
"type": "github", |
||||
|
"url": "https://github.com/sponsors/feross" |
||||
|
}, |
||||
|
{ |
||||
|
"type": "patreon", |
||||
|
"url": "https://www.patreon.com/feross" |
||||
|
}, |
||||
|
{ |
||||
|
"type": "consulting", |
||||
|
"url": "https://feross.org/support" |
||||
|
} |
||||
|
], |
||||
|
"dependencies": { |
||||
|
"queue-microtask": "^1.2.2" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/source-map-js": { |
||||
|
"version": "1.0.2", |
||||
|
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", |
||||
|
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", |
||||
|
"dev": true, |
||||
|
"peer": true, |
||||
|
"engines": { |
||||
|
"node": ">=0.10.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/supports-preserve-symlinks-flag": { |
||||
|
"version": "1.0.0", |
||||
|
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", |
||||
|
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"node": ">= 0.4" |
||||
|
}, |
||||
|
"funding": { |
||||
|
"url": "https://github.com/sponsors/ljharb" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/tailwindcss": { |
||||
|
"version": "3.1.8", |
||||
|
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz", |
||||
|
"integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"arg": "^5.0.2", |
||||
|
"chokidar": "^3.5.3", |
||||
|
"color-name": "^1.1.4", |
||||
|
"detective": "^5.2.1", |
||||
|
"didyoumean": "^1.2.2", |
||||
|
"dlv": "^1.1.3", |
||||
|
"fast-glob": "^3.2.11", |
||||
|
"glob-parent": "^6.0.2", |
||||
|
"is-glob": "^4.0.3", |
||||
|
"lilconfig": "^2.0.6", |
||||
|
"normalize-path": "^3.0.0", |
||||
|
"object-hash": "^3.0.0", |
||||
|
"picocolors": "^1.0.0", |
||||
|
"postcss": "^8.4.14", |
||||
|
"postcss-import": "^14.1.0", |
||||
|
"postcss-js": "^4.0.0", |
||||
|
"postcss-load-config": "^3.1.4", |
||||
|
"postcss-nested": "5.0.6", |
||||
|
"postcss-selector-parser": "^6.0.10", |
||||
|
"postcss-value-parser": "^4.2.0", |
||||
|
"quick-lru": "^5.1.1", |
||||
|
"resolve": "^1.22.1" |
||||
|
}, |
||||
|
"bin": { |
||||
|
"tailwind": "lib/cli.js", |
||||
|
"tailwindcss": "lib/cli.js" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=12.13.0" |
||||
|
}, |
||||
|
"peerDependencies": { |
||||
|
"postcss": "^8.0.9" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/to-regex-range": { |
||||
|
"version": "5.0.1", |
||||
|
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", |
||||
|
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", |
||||
|
"dev": true, |
||||
|
"dependencies": { |
||||
|
"is-number": "^7.0.0" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=8.0" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/util-deprecate": { |
||||
|
"version": "1.0.2", |
||||
|
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", |
||||
|
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", |
||||
|
"dev": true |
||||
|
}, |
||||
|
"node_modules/xtend": { |
||||
|
"version": "4.0.2", |
||||
|
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", |
||||
|
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"node": ">=0.4" |
||||
|
} |
||||
|
}, |
||||
|
"node_modules/yaml": { |
||||
|
"version": "1.10.2", |
||||
|
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", |
||||
|
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", |
||||
|
"dev": true, |
||||
|
"engines": { |
||||
|
"node": ">= 6" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,21 @@ |
|||||
|
The MIT License (MIT) |
||||
|
|
||||
|
Copyright (c) Denis Malinochkin |
||||
|
|
||||
|
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. |
@ -0,0 +1,171 @@ |
|||||
|
# @nodelib/fs.scandir |
||||
|
|
||||
|
> List files and directories inside the specified directory. |
||||
|
|
||||
|
## :bulb: Highlights |
||||
|
|
||||
|
The package is aimed at obtaining information about entries in the directory. |
||||
|
|
||||
|
* :moneybag: Returns useful information: `name`, `path`, `dirent` and `stats` (optional). |
||||
|
* :gear: On Node.js 10.10+ uses the mechanism without additional calls to determine the entry type. See [`old` and `modern` mode](#old-and-modern-mode). |
||||
|
* :link: Can safely work with broken symbolic links. |
||||
|
|
||||
|
## Install |
||||
|
|
||||
|
```console |
||||
|
npm install @nodelib/fs.scandir |
||||
|
``` |
||||
|
|
||||
|
## Usage |
||||
|
|
||||
|
```ts |
||||
|
import * as fsScandir from '@nodelib/fs.scandir'; |
||||
|
|
||||
|
fsScandir.scandir('path', (error, stats) => { /* … */ }); |
||||
|
``` |
||||
|
|
||||
|
## API |
||||
|
|
||||
|
### .scandir(path, [optionsOrSettings], callback) |
||||
|
|
||||
|
Returns an array of plain objects ([`Entry`](#entry)) with information about entry for provided path with standard callback-style. |
||||
|
|
||||
|
```ts |
||||
|
fsScandir.scandir('path', (error, entries) => { /* … */ }); |
||||
|
fsScandir.scandir('path', {}, (error, entries) => { /* … */ }); |
||||
|
fsScandir.scandir('path', new fsScandir.Settings(), (error, entries) => { /* … */ }); |
||||
|
``` |
||||
|
|
||||
|
### .scandirSync(path, [optionsOrSettings]) |
||||
|
|
||||
|
Returns an array of plain objects ([`Entry`](#entry)) with information about entry for provided path. |
||||
|
|
||||
|
```ts |
||||
|
const entries = fsScandir.scandirSync('path'); |
||||
|
const entries = fsScandir.scandirSync('path', {}); |
||||
|
const entries = fsScandir.scandirSync(('path', new fsScandir.Settings()); |
||||
|
``` |
||||
|
|
||||
|
#### path |
||||
|
|
||||
|
* Required: `true` |
||||
|
* Type: `string | Buffer | URL` |
||||
|
|
||||
|
A path to a file. If a URL is provided, it must use the `file:` protocol. |
||||
|
|
||||
|
#### optionsOrSettings |
||||
|
|
||||
|
* Required: `false` |
||||
|
* Type: `Options | Settings` |
||||
|
* Default: An instance of `Settings` class |
||||
|
|
||||
|
An [`Options`](#options) object or an instance of [`Settings`](#settingsoptions) class. |
||||
|
|
||||
|
> :book: When you pass a plain object, an instance of the `Settings` class will be created automatically. If you plan to call the method frequently, use a pre-created instance of the `Settings` class. |
||||
|
|
||||
|
### Settings([options]) |
||||
|
|
||||
|
A class of full settings of the package. |
||||
|
|
||||
|
```ts |
||||
|
const settings = new fsScandir.Settings({ followSymbolicLinks: false }); |
||||
|
|
||||
|
const entries = fsScandir.scandirSync('path', settings); |
||||
|
``` |
||||
|
|
||||
|
## Entry |
||||
|
|
||||
|
* `name` — The name of the entry (`unknown.txt`). |
||||
|
* `path` — The path of the entry relative to call directory (`root/unknown.txt`). |
||||
|
* `dirent` — An instance of [`fs.Dirent`](./src/types/index.ts) class. On Node.js below 10.10 will be emulated by [`DirentFromStats`](./src/utils/fs.ts) class. |
||||
|
* `stats` (optional) — An instance of `fs.Stats` class. |
||||
|
|
||||
|
For example, the `scandir` call for `tools` directory with one directory inside: |
||||
|
|
||||
|
```ts |
||||
|
{ |
||||
|
dirent: Dirent { name: 'typedoc', /* … */ }, |
||||
|
name: 'typedoc', |
||||
|
path: 'tools/typedoc' |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
## Options |
||||
|
|
||||
|
### stats |
||||
|
|
||||
|
* Type: `boolean` |
||||
|
* Default: `false` |
||||
|
|
||||
|
Adds an instance of `fs.Stats` class to the [`Entry`](#entry). |
||||
|
|
||||
|
> :book: Always use `fs.readdir` without the `withFileTypes` option. ??TODO?? |
||||
|
|
||||
|
### followSymbolicLinks |
||||
|
|
||||
|
* Type: `boolean` |
||||
|
* Default: `false` |
||||
|
|
||||
|
Follow symbolic links or not. Call `fs.stat` on symbolic link if `true`. |
||||
|
|
||||
|
### `throwErrorOnBrokenSymbolicLink` |
||||
|
|
||||
|
* Type: `boolean` |
||||
|
* Default: `true` |
||||
|
|
||||
|
Throw an error when symbolic link is broken if `true` or safely use `lstat` call if `false`. |
||||
|
|
||||
|
### `pathSegmentSeparator` |
||||
|
|
||||
|
* Type: `string` |
||||
|
* Default: `path.sep` |
||||
|
|
||||
|
By default, this package uses the correct path separator for your OS (`\` on Windows, `/` on Unix-like systems). But you can set this option to any separator character(s) that you want to use instead. |
||||
|
|
||||
|
### `fs` |
||||
|
|
||||
|
* Type: [`FileSystemAdapter`](./src/adapters/fs.ts) |
||||
|
* Default: A default FS methods |
||||
|
|
||||
|
By default, the built-in Node.js module (`fs`) is used to work with the file system. You can replace any method with your own. |
||||
|
|
||||
|
```ts |
||||
|
interface FileSystemAdapter { |
||||
|
lstat?: typeof fs.lstat; |
||||
|
stat?: typeof fs.stat; |
||||
|
lstatSync?: typeof fs.lstatSync; |
||||
|
statSync?: typeof fs.statSync; |
||||
|
readdir?: typeof fs.readdir; |
||||
|
readdirSync?: typeof fs.readdirSync; |
||||
|
} |
||||
|
|
||||
|
const settings = new fsScandir.Settings({ |
||||
|
fs: { lstat: fakeLstat } |
||||
|
}); |
||||
|
``` |
||||
|
|
||||
|
## `old` and `modern` mode |
||||
|
|
||||
|
This package has two modes that are used depending on the environment and parameters of use. |
||||
|
|
||||
|
### old |
||||
|
|
||||
|
* Node.js below `10.10` or when the `stats` option is enabled |
||||
|
|
||||
|
When working in the old mode, the directory is read first (`fs.readdir`), then the type of entries is determined (`fs.lstat` and/or `fs.stat` for symbolic links). |
||||
|
|
||||
|
### modern |
||||
|
|
||||
|
* Node.js 10.10+ and the `stats` option is disabled |
||||
|
|
||||
|
In the modern mode, reading the directory (`fs.readdir` with the `withFileTypes` option) is combined with obtaining information about its entries. An additional call for symbolic links (`fs.stat`) is still present. |
||||
|
|
||||
|
This mode makes fewer calls to the file system. It's faster. |
||||
|
|
||||
|
## Changelog |
||||
|
|
||||
|
See the [Releases section of our GitHub project](https://github.com/nodelib/nodelib/releases) for changelog for each release version. |
||||
|
|
||||
|
## License |
||||
|
|
||||
|
This software is released under the terms of the MIT license. |
@ -0,0 +1,20 @@ |
|||||
|
import type * as fsStat from '@nodelib/fs.stat'; |
||||
|
import type { Dirent, ErrnoException } from '../types'; |
||||
|
export interface ReaddirAsynchronousMethod { |
||||
|
(filepath: string, options: { |
||||
|
withFileTypes: true; |
||||
|
}, callback: (error: ErrnoException | null, files: Dirent[]) => void): void; |
||||
|
(filepath: string, callback: (error: ErrnoException | null, files: string[]) => void): void; |
||||
|
} |
||||
|
export interface ReaddirSynchronousMethod { |
||||
|
(filepath: string, options: { |
||||
|
withFileTypes: true; |
||||
|
}): Dirent[]; |
||||
|
(filepath: string): string[]; |
||||
|
} |
||||
|
export declare type FileSystemAdapter = fsStat.FileSystemAdapter & { |
||||
|
readdir: ReaddirAsynchronousMethod; |
||||
|
readdirSync: ReaddirSynchronousMethod; |
||||
|
}; |
||||
|
export declare const FILE_SYSTEM_ADAPTER: FileSystemAdapter; |
||||
|
export declare function createFileSystemAdapter(fsMethods?: Partial<FileSystemAdapter>): FileSystemAdapter; |
@ -0,0 +1,19 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
exports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0; |
||||
|
const fs = require("fs"); |
||||
|
exports.FILE_SYSTEM_ADAPTER = { |
||||
|
lstat: fs.lstat, |
||||
|
stat: fs.stat, |
||||
|
lstatSync: fs.lstatSync, |
||||
|
statSync: fs.statSync, |
||||
|
readdir: fs.readdir, |
||||
|
readdirSync: fs.readdirSync |
||||
|
}; |
||||
|
function createFileSystemAdapter(fsMethods) { |
||||
|
if (fsMethods === undefined) { |
||||
|
return exports.FILE_SYSTEM_ADAPTER; |
||||
|
} |
||||
|
return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods); |
||||
|
} |
||||
|
exports.createFileSystemAdapter = createFileSystemAdapter; |
@ -0,0 +1,4 @@ |
|||||
|
/** |
||||
|
* IS `true` for Node.js 10.10 and greater. |
||||
|
*/ |
||||
|
export declare const IS_SUPPORT_READDIR_WITH_FILE_TYPES: boolean; |
@ -0,0 +1,17 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = void 0; |
||||
|
const NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.'); |
||||
|
if (NODE_PROCESS_VERSION_PARTS[0] === undefined || NODE_PROCESS_VERSION_PARTS[1] === undefined) { |
||||
|
throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`); |
||||
|
} |
||||
|
const MAJOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[0], 10); |
||||
|
const MINOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[1], 10); |
||||
|
const SUPPORTED_MAJOR_VERSION = 10; |
||||
|
const SUPPORTED_MINOR_VERSION = 10; |
||||
|
const IS_MATCHED_BY_MAJOR = MAJOR_VERSION > SUPPORTED_MAJOR_VERSION; |
||||
|
const IS_MATCHED_BY_MAJOR_AND_MINOR = MAJOR_VERSION === SUPPORTED_MAJOR_VERSION && MINOR_VERSION >= SUPPORTED_MINOR_VERSION; |
||||
|
/** |
||||
|
* IS `true` for Node.js 10.10 and greater. |
||||
|
*/ |
||||
|
exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_BY_MAJOR_AND_MINOR; |
@ -0,0 +1,12 @@ |
|||||
|
import type { FileSystemAdapter, ReaddirAsynchronousMethod, ReaddirSynchronousMethod } from './adapters/fs'; |
||||
|
import * as async from './providers/async'; |
||||
|
import Settings, { Options } from './settings'; |
||||
|
import type { Dirent, Entry } from './types'; |
||||
|
declare type AsyncCallback = async.AsyncCallback; |
||||
|
declare function scandir(path: string, callback: AsyncCallback): void; |
||||
|
declare function scandir(path: string, optionsOrSettings: Options | Settings, callback: AsyncCallback): void; |
||||
|
declare namespace scandir { |
||||
|
function __promisify__(path: string, optionsOrSettings?: Options | Settings): Promise<Entry[]>; |
||||
|
} |
||||
|
declare function scandirSync(path: string, optionsOrSettings?: Options | Settings): Entry[]; |
||||
|
export { scandir, scandirSync, Settings, AsyncCallback, Dirent, Entry, FileSystemAdapter, ReaddirAsynchronousMethod, ReaddirSynchronousMethod, Options }; |
@ -0,0 +1,26 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
exports.Settings = exports.scandirSync = exports.scandir = void 0; |
||||
|
const async = require("./providers/async"); |
||||
|
const sync = require("./providers/sync"); |
||||
|
const settings_1 = require("./settings"); |
||||
|
exports.Settings = settings_1.default; |
||||
|
function scandir(path, optionsOrSettingsOrCallback, callback) { |
||||
|
if (typeof optionsOrSettingsOrCallback === 'function') { |
||||
|
async.read(path, getSettings(), optionsOrSettingsOrCallback); |
||||
|
return; |
||||
|
} |
||||
|
async.read(path, getSettings(optionsOrSettingsOrCallback), callback); |
||||
|
} |
||||
|
exports.scandir = scandir; |
||||
|
function scandirSync(path, optionsOrSettings) { |
||||
|
const settings = getSettings(optionsOrSettings); |
||||
|
return sync.read(path, settings); |
||||
|
} |
||||
|
exports.scandirSync = scandirSync; |
||||
|
function getSettings(settingsOrOptions = {}) { |
||||
|
if (settingsOrOptions instanceof settings_1.default) { |
||||
|
return settingsOrOptions; |
||||
|
} |
||||
|
return new settings_1.default(settingsOrOptions); |
||||
|
} |
@ -0,0 +1,7 @@ |
|||||
|
/// <reference types="node" />
|
||||
|
import type Settings from '../settings'; |
||||
|
import type { Entry } from '../types'; |
||||
|
export declare type AsyncCallback = (error: NodeJS.ErrnoException, entries: Entry[]) => void; |
||||
|
export declare function read(directory: string, settings: Settings, callback: AsyncCallback): void; |
||||
|
export declare function readdirWithFileTypes(directory: string, settings: Settings, callback: AsyncCallback): void; |
||||
|
export declare function readdir(directory: string, settings: Settings, callback: AsyncCallback): void; |
@ -0,0 +1,104 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
exports.readdir = exports.readdirWithFileTypes = exports.read = void 0; |
||||
|
const fsStat = require("@nodelib/fs.stat"); |
||||
|
const rpl = require("run-parallel"); |
||||
|
const constants_1 = require("../constants"); |
||||
|
const utils = require("../utils"); |
||||
|
const common = require("./common"); |
||||
|
function read(directory, settings, callback) { |
||||
|
if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { |
||||
|
readdirWithFileTypes(directory, settings, callback); |
||||
|
return; |
||||
|
} |
||||
|
readdir(directory, settings, callback); |
||||
|
} |
||||
|
exports.read = read; |
||||
|
function readdirWithFileTypes(directory, settings, callback) { |
||||
|
settings.fs.readdir(directory, { withFileTypes: true }, (readdirError, dirents) => { |
||||
|
if (readdirError !== null) { |
||||
|
callFailureCallback(callback, readdirError); |
||||
|
return; |
||||
|
} |
||||
|
const entries = dirents.map((dirent) => ({ |
||||
|
dirent, |
||||
|
name: dirent.name, |
||||
|
path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator) |
||||
|
})); |
||||
|
if (!settings.followSymbolicLinks) { |
||||
|
callSuccessCallback(callback, entries); |
||||
|
return; |
||||
|
} |
||||
|
const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings)); |
||||
|
rpl(tasks, (rplError, rplEntries) => { |
||||
|
if (rplError !== null) { |
||||
|
callFailureCallback(callback, rplError); |
||||
|
return; |
||||
|
} |
||||
|
callSuccessCallback(callback, rplEntries); |
||||
|
}); |
||||
|
}); |
||||
|
} |
||||
|
exports.readdirWithFileTypes = readdirWithFileTypes; |
||||
|
function makeRplTaskEntry(entry, settings) { |
||||
|
return (done) => { |
||||
|
if (!entry.dirent.isSymbolicLink()) { |
||||
|
done(null, entry); |
||||
|
return; |
||||
|
} |
||||
|
settings.fs.stat(entry.path, (statError, stats) => { |
||||
|
if (statError !== null) { |
||||
|
if (settings.throwErrorOnBrokenSymbolicLink) { |
||||
|
done(statError); |
||||
|
return; |
||||
|
} |
||||
|
done(null, entry); |
||||
|
return; |
||||
|
} |
||||
|
entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); |
||||
|
done(null, entry); |
||||
|
}); |
||||
|
}; |
||||
|
} |
||||
|
function readdir(directory, settings, callback) { |
||||
|
settings.fs.readdir(directory, (readdirError, names) => { |
||||
|
if (readdirError !== null) { |
||||
|
callFailureCallback(callback, readdirError); |
||||
|
return; |
||||
|
} |
||||
|
const tasks = names.map((name) => { |
||||
|
const path = common.joinPathSegments(directory, name, settings.pathSegmentSeparator); |
||||
|
return (done) => { |
||||
|
fsStat.stat(path, settings.fsStatSettings, (error, stats) => { |
||||
|
if (error !== null) { |
||||
|
done(error); |
||||
|
return; |
||||
|
} |
||||
|
const entry = { |
||||
|
name, |
||||
|
path, |
||||
|
dirent: utils.fs.createDirentFromStats(name, stats) |
||||
|
}; |
||||
|
if (settings.stats) { |
||||
|
entry.stats = stats; |
||||
|
} |
||||
|
done(null, entry); |
||||
|
}); |
||||
|
}; |
||||
|
}); |
||||
|
rpl(tasks, (rplError, entries) => { |
||||
|
if (rplError !== null) { |
||||
|
callFailureCallback(callback, rplError); |
||||
|
return; |
||||
|
} |
||||
|
callSuccessCallback(callback, entries); |
||||
|
}); |
||||
|
}); |
||||
|
} |
||||
|
exports.readdir = readdir; |
||||
|
function callFailureCallback(callback, error) { |
||||
|
callback(error); |
||||
|
} |
||||
|
function callSuccessCallback(callback, result) { |
||||
|
callback(null, result); |
||||
|
} |
@ -0,0 +1 @@ |
|||||
|
export declare function joinPathSegments(a: string, b: string, separator: string): string; |
@ -0,0 +1,13 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
exports.joinPathSegments = void 0; |
||||
|
function joinPathSegments(a, b, separator) { |
||||
|
/** |
||||
|
* The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`). |
||||
|
*/ |
||||
|
if (a.endsWith(separator)) { |
||||
|
return a + b; |
||||
|
} |
||||
|
return a + separator + b; |
||||
|
} |
||||
|
exports.joinPathSegments = joinPathSegments; |
@ -0,0 +1,5 @@ |
|||||
|
import type Settings from '../settings'; |
||||
|
import type { Entry } from '../types'; |
||||
|
export declare function read(directory: string, settings: Settings): Entry[]; |
||||
|
export declare function readdirWithFileTypes(directory: string, settings: Settings): Entry[]; |
||||
|
export declare function readdir(directory: string, settings: Settings): Entry[]; |
@ -0,0 +1,54 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
exports.readdir = exports.readdirWithFileTypes = exports.read = void 0; |
||||
|
const fsStat = require("@nodelib/fs.stat"); |
||||
|
const constants_1 = require("../constants"); |
||||
|
const utils = require("../utils"); |
||||
|
const common = require("./common"); |
||||
|
function read(directory, settings) { |
||||
|
if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { |
||||
|
return readdirWithFileTypes(directory, settings); |
||||
|
} |
||||
|
return readdir(directory, settings); |
||||
|
} |
||||
|
exports.read = read; |
||||
|
function readdirWithFileTypes(directory, settings) { |
||||
|
const dirents = settings.fs.readdirSync(directory, { withFileTypes: true }); |
||||
|
return dirents.map((dirent) => { |
||||
|
const entry = { |
||||
|
dirent, |
||||
|
name: dirent.name, |
||||
|
path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator) |
||||
|
}; |
||||
|
if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) { |
||||
|
try { |
||||
|
const stats = settings.fs.statSync(entry.path); |
||||
|
entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); |
||||
|
} |
||||
|
catch (error) { |
||||
|
if (settings.throwErrorOnBrokenSymbolicLink) { |
||||
|
throw error; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return entry; |
||||
|
}); |
||||
|
} |
||||
|
exports.readdirWithFileTypes = readdirWithFileTypes; |
||||
|
function readdir(directory, settings) { |
||||
|
const names = settings.fs.readdirSync(directory); |
||||
|
return names.map((name) => { |
||||
|
const entryPath = common.joinPathSegments(directory, name, settings.pathSegmentSeparator); |
||||
|
const stats = fsStat.statSync(entryPath, settings.fsStatSettings); |
||||
|
const entry = { |
||||
|
name, |
||||
|
path: entryPath, |
||||
|
dirent: utils.fs.createDirentFromStats(name, stats) |
||||
|
}; |
||||
|
if (settings.stats) { |
||||
|
entry.stats = stats; |
||||
|
} |
||||
|
return entry; |
||||
|
}); |
||||
|
} |
||||
|
exports.readdir = readdir; |
@ -0,0 +1,20 @@ |
|||||
|
import * as fsStat from '@nodelib/fs.stat'; |
||||
|
import * as fs from './adapters/fs'; |
||||
|
export interface Options { |
||||
|
followSymbolicLinks?: boolean; |
||||
|
fs?: Partial<fs.FileSystemAdapter>; |
||||
|
pathSegmentSeparator?: string; |
||||
|
stats?: boolean; |
||||
|
throwErrorOnBrokenSymbolicLink?: boolean; |
||||
|
} |
||||
|
export default class Settings { |
||||
|
private readonly _options; |
||||
|
readonly followSymbolicLinks: boolean; |
||||
|
readonly fs: fs.FileSystemAdapter; |
||||
|
readonly pathSegmentSeparator: string; |
||||
|
readonly stats: boolean; |
||||
|
readonly throwErrorOnBrokenSymbolicLink: boolean; |
||||
|
readonly fsStatSettings: fsStat.Settings; |
||||
|
constructor(_options?: Options); |
||||
|
private _getValue; |
||||
|
} |
@ -0,0 +1,24 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
const path = require("path"); |
||||
|
const fsStat = require("@nodelib/fs.stat"); |
||||
|
const fs = require("./adapters/fs"); |
||||
|
class Settings { |
||||
|
constructor(_options = {}) { |
||||
|
this._options = _options; |
||||
|
this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false); |
||||
|
this.fs = fs.createFileSystemAdapter(this._options.fs); |
||||
|
this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); |
||||
|
this.stats = this._getValue(this._options.stats, false); |
||||
|
this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); |
||||
|
this.fsStatSettings = new fsStat.Settings({ |
||||
|
followSymbolicLink: this.followSymbolicLinks, |
||||
|
fs: this.fs, |
||||
|
throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink |
||||
|
}); |
||||
|
} |
||||
|
_getValue(option, value) { |
||||
|
return option !== null && option !== void 0 ? option : value; |
||||
|
} |
||||
|
} |
||||
|
exports.default = Settings; |
@ -0,0 +1,20 @@ |
|||||
|
/// <reference types="node" />
|
||||
|
import type * as fs from 'fs'; |
||||
|
export interface Entry { |
||||
|
dirent: Dirent; |
||||
|
name: string; |
||||
|
path: string; |
||||
|
stats?: Stats; |
||||
|
} |
||||
|
export declare type Stats = fs.Stats; |
||||
|
export declare type ErrnoException = NodeJS.ErrnoException; |
||||
|
export interface Dirent { |
||||
|
isBlockDevice: () => boolean; |
||||
|
isCharacterDevice: () => boolean; |
||||
|
isDirectory: () => boolean; |
||||
|
isFIFO: () => boolean; |
||||
|
isFile: () => boolean; |
||||
|
isSocket: () => boolean; |
||||
|
isSymbolicLink: () => boolean; |
||||
|
name: string; |
||||
|
} |
@ -0,0 +1,2 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
@ -0,0 +1,2 @@ |
|||||
|
import type { Dirent, Stats } from '../types'; |
||||
|
export declare function createDirentFromStats(name: string, stats: Stats): Dirent; |
@ -0,0 +1,19 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
exports.createDirentFromStats = void 0; |
||||
|
class DirentFromStats { |
||||
|
constructor(name, stats) { |
||||
|
this.name = name; |
||||
|
this.isBlockDevice = stats.isBlockDevice.bind(stats); |
||||
|
this.isCharacterDevice = stats.isCharacterDevice.bind(stats); |
||||
|
this.isDirectory = stats.isDirectory.bind(stats); |
||||
|
this.isFIFO = stats.isFIFO.bind(stats); |
||||
|
this.isFile = stats.isFile.bind(stats); |
||||
|
this.isSocket = stats.isSocket.bind(stats); |
||||
|
this.isSymbolicLink = stats.isSymbolicLink.bind(stats); |
||||
|
} |
||||
|
} |
||||
|
function createDirentFromStats(name, stats) { |
||||
|
return new DirentFromStats(name, stats); |
||||
|
} |
||||
|
exports.createDirentFromStats = createDirentFromStats; |
@ -0,0 +1,2 @@ |
|||||
|
import * as fs from './fs'; |
||||
|
export { fs }; |
@ -0,0 +1,5 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
exports.fs = void 0; |
||||
|
const fs = require("./fs"); |
||||
|
exports.fs = fs; |
@ -0,0 +1,44 @@ |
|||||
|
{ |
||||
|
"name": "@nodelib/fs.scandir", |
||||
|
"version": "2.1.5", |
||||
|
"description": "List files and directories inside the specified directory", |
||||
|
"license": "MIT", |
||||
|
"repository": "https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.scandir", |
||||
|
"keywords": [ |
||||
|
"NodeLib", |
||||
|
"fs", |
||||
|
"FileSystem", |
||||
|
"file system", |
||||
|
"scandir", |
||||
|
"readdir", |
||||
|
"dirent" |
||||
|
], |
||||
|
"engines": { |
||||
|
"node": ">= 8" |
||||
|
}, |
||||
|
"files": [ |
||||
|
"out/**", |
||||
|
"!out/**/*.map", |
||||
|
"!out/**/*.spec.*" |
||||
|
], |
||||
|
"main": "out/index.js", |
||||
|
"typings": "out/index.d.ts", |
||||
|
"scripts": { |
||||
|
"clean": "rimraf {tsconfig.tsbuildinfo,out}", |
||||
|
"lint": "eslint \"src/**/*.ts\" --cache", |
||||
|
"compile": "tsc -b .", |
||||
|
"compile:watch": "tsc -p . --watch --sourceMap", |
||||
|
"test": "mocha \"out/**/*.spec.js\" -s 0", |
||||
|
"build": "npm run clean && npm run compile && npm run lint && npm test", |
||||
|
"watch": "npm run clean && npm run compile:watch" |
||||
|
}, |
||||
|
"dependencies": { |
||||
|
"@nodelib/fs.stat": "2.0.5", |
||||
|
"run-parallel": "^1.1.9" |
||||
|
}, |
||||
|
"devDependencies": { |
||||
|
"@nodelib/fs.macchiato": "1.0.4", |
||||
|
"@types/run-parallel": "^1.1.0" |
||||
|
}, |
||||
|
"gitHead": "d6a7960d5281d3dd5f8e2efba49bb552d090f562" |
||||
|
} |
@ -0,0 +1,21 @@ |
|||||
|
The MIT License (MIT) |
||||
|
|
||||
|
Copyright (c) Denis Malinochkin |
||||
|
|
||||
|
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. |
@ -0,0 +1,126 @@ |
|||||
|
# @nodelib/fs.stat |
||||
|
|
||||
|
> Get the status of a file with some features. |
||||
|
|
||||
|
## :bulb: Highlights |
||||
|
|
||||
|
Wrapper around standard method `fs.lstat` and `fs.stat` with some features. |
||||
|
|
||||
|
* :beginner: Normally follows symbolic link. |
||||
|
* :gear: Can safely work with broken symbolic link. |
||||
|
|
||||
|
## Install |
||||
|
|
||||
|
```console |
||||
|
npm install @nodelib/fs.stat |
||||
|
``` |
||||
|
|
||||
|
## Usage |
||||
|
|
||||
|
```ts |
||||
|
import * as fsStat from '@nodelib/fs.stat'; |
||||
|
|
||||
|
fsStat.stat('path', (error, stats) => { /* … */ }); |
||||
|
``` |
||||
|
|
||||
|
## API |
||||
|
|
||||
|
### .stat(path, [optionsOrSettings], callback) |
||||
|
|
||||
|
Returns an instance of `fs.Stats` class for provided path with standard callback-style. |
||||
|
|
||||
|
```ts |
||||
|
fsStat.stat('path', (error, stats) => { /* … */ }); |
||||
|
fsStat.stat('path', {}, (error, stats) => { /* … */ }); |
||||
|
fsStat.stat('path', new fsStat.Settings(), (error, stats) => { /* … */ }); |
||||
|
``` |
||||
|
|
||||
|
### .statSync(path, [optionsOrSettings]) |
||||
|
|
||||
|
Returns an instance of `fs.Stats` class for provided path. |
||||
|
|
||||
|
```ts |
||||
|
const stats = fsStat.stat('path'); |
||||
|
const stats = fsStat.stat('path', {}); |
||||
|
const stats = fsStat.stat('path', new fsStat.Settings()); |
||||
|
``` |
||||
|
|
||||
|
#### path |
||||
|
|
||||
|
* Required: `true` |
||||
|
* Type: `string | Buffer | URL` |
||||
|
|
||||
|
A path to a file. If a URL is provided, it must use the `file:` protocol. |
||||
|
|
||||
|
#### optionsOrSettings |
||||
|
|
||||
|
* Required: `false` |
||||
|
* Type: `Options | Settings` |
||||
|
* Default: An instance of `Settings` class |
||||
|
|
||||
|
An [`Options`](#options) object or an instance of [`Settings`](#settings) class. |
||||
|
|
||||
|
> :book: When you pass a plain object, an instance of the `Settings` class will be created automatically. If you plan to call the method frequently, use a pre-created instance of the `Settings` class. |
||||
|
|
||||
|
### Settings([options]) |
||||
|
|
||||
|
A class of full settings of the package. |
||||
|
|
||||
|
```ts |
||||
|
const settings = new fsStat.Settings({ followSymbolicLink: false }); |
||||
|
|
||||
|
const stats = fsStat.stat('path', settings); |
||||
|
``` |
||||
|
|
||||
|
## Options |
||||
|
|
||||
|
### `followSymbolicLink` |
||||
|
|
||||
|
* Type: `boolean` |
||||
|
* Default: `true` |
||||
|
|
||||
|
Follow symbolic link or not. Call `fs.stat` on symbolic link if `true`. |
||||
|
|
||||
|
### `markSymbolicLink` |
||||
|
|
||||
|
* Type: `boolean` |
||||
|
* Default: `false` |
||||
|
|
||||
|
Mark symbolic link by setting the return value of `isSymbolicLink` function to always `true` (even after `fs.stat`). |
||||
|
|
||||
|
> :book: Can be used if you want to know what is hidden behind a symbolic link, but still continue to know that it is a symbolic link. |
||||
|
|
||||
|
### `throwErrorOnBrokenSymbolicLink` |
||||
|
|
||||
|
* Type: `boolean` |
||||
|
* Default: `true` |
||||
|
|
||||
|
Throw an error when symbolic link is broken if `true` or safely return `lstat` call if `false`. |
||||
|
|
||||
|
### `fs` |
||||
|
|
||||
|
* Type: [`FileSystemAdapter`](./src/adapters/fs.ts) |
||||
|
* Default: A default FS methods |
||||
|
|
||||
|
By default, the built-in Node.js module (`fs`) is used to work with the file system. You can replace any method with your own. |
||||
|
|
||||
|
```ts |
||||
|
interface FileSystemAdapter { |
||||
|
lstat?: typeof fs.lstat; |
||||
|
stat?: typeof fs.stat; |
||||
|
lstatSync?: typeof fs.lstatSync; |
||||
|
statSync?: typeof fs.statSync; |
||||
|
} |
||||
|
|
||||
|
const settings = new fsStat.Settings({ |
||||
|
fs: { lstat: fakeLstat } |
||||
|
}); |
||||
|
``` |
||||
|
|
||||
|
## Changelog |
||||
|
|
||||
|
See the [Releases section of our GitHub project](https://github.com/nodelib/nodelib/releases) for changelog for each release version. |
||||
|
|
||||
|
## License |
||||
|
|
||||
|
This software is released under the terms of the MIT license. |
@ -0,0 +1,13 @@ |
|||||
|
/// <reference types="node" />
|
||||
|
import * as fs from 'fs'; |
||||
|
import type { ErrnoException } from '../types'; |
||||
|
export declare type StatAsynchronousMethod = (path: string, callback: (error: ErrnoException | null, stats: fs.Stats) => void) => void; |
||||
|
export declare type StatSynchronousMethod = (path: string) => fs.Stats; |
||||
|
export interface FileSystemAdapter { |
||||
|
lstat: StatAsynchronousMethod; |
||||
|
stat: StatAsynchronousMethod; |
||||
|
lstatSync: StatSynchronousMethod; |
||||
|
statSync: StatSynchronousMethod; |
||||
|
} |
||||
|
export declare const FILE_SYSTEM_ADAPTER: FileSystemAdapter; |
||||
|
export declare function createFileSystemAdapter(fsMethods?: Partial<FileSystemAdapter>): FileSystemAdapter; |
@ -0,0 +1,17 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
exports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0; |
||||
|
const fs = require("fs"); |
||||
|
exports.FILE_SYSTEM_ADAPTER = { |
||||
|
lstat: fs.lstat, |
||||
|
stat: fs.stat, |
||||
|
lstatSync: fs.lstatSync, |
||||
|
statSync: fs.statSync |
||||
|
}; |
||||
|
function createFileSystemAdapter(fsMethods) { |
||||
|
if (fsMethods === undefined) { |
||||
|
return exports.FILE_SYSTEM_ADAPTER; |
||||
|
} |
||||
|
return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods); |
||||
|
} |
||||
|
exports.createFileSystemAdapter = createFileSystemAdapter; |
@ -0,0 +1,12 @@ |
|||||
|
import type { FileSystemAdapter, StatAsynchronousMethod, StatSynchronousMethod } from './adapters/fs'; |
||||
|
import * as async from './providers/async'; |
||||
|
import Settings, { Options } from './settings'; |
||||
|
import type { Stats } from './types'; |
||||
|
declare type AsyncCallback = async.AsyncCallback; |
||||
|
declare function stat(path: string, callback: AsyncCallback): void; |
||||
|
declare function stat(path: string, optionsOrSettings: Options | Settings, callback: AsyncCallback): void; |
||||
|
declare namespace stat { |
||||
|
function __promisify__(path: string, optionsOrSettings?: Options | Settings): Promise<Stats>; |
||||
|
} |
||||
|
declare function statSync(path: string, optionsOrSettings?: Options | Settings): Stats; |
||||
|
export { Settings, stat, statSync, AsyncCallback, FileSystemAdapter, StatAsynchronousMethod, StatSynchronousMethod, Options, Stats }; |
@ -0,0 +1,26 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
exports.statSync = exports.stat = exports.Settings = void 0; |
||||
|
const async = require("./providers/async"); |
||||
|
const sync = require("./providers/sync"); |
||||
|
const settings_1 = require("./settings"); |
||||
|
exports.Settings = settings_1.default; |
||||
|
function stat(path, optionsOrSettingsOrCallback, callback) { |
||||
|
if (typeof optionsOrSettingsOrCallback === 'function') { |
||||
|
async.read(path, getSettings(), optionsOrSettingsOrCallback); |
||||
|
return; |
||||
|
} |
||||
|
async.read(path, getSettings(optionsOrSettingsOrCallback), callback); |
||||
|
} |
||||
|
exports.stat = stat; |
||||
|
function statSync(path, optionsOrSettings) { |
||||
|
const settings = getSettings(optionsOrSettings); |
||||
|
return sync.read(path, settings); |
||||
|
} |
||||
|
exports.statSync = statSync; |
||||
|
function getSettings(settingsOrOptions = {}) { |
||||
|
if (settingsOrOptions instanceof settings_1.default) { |
||||
|
return settingsOrOptions; |
||||
|
} |
||||
|
return new settings_1.default(settingsOrOptions); |
||||
|
} |
@ -0,0 +1,4 @@ |
|||||
|
import type Settings from '../settings'; |
||||
|
import type { ErrnoException, Stats } from '../types'; |
||||
|
export declare type AsyncCallback = (error: ErrnoException, stats: Stats) => void; |
||||
|
export declare function read(path: string, settings: Settings, callback: AsyncCallback): void; |
@ -0,0 +1,36 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
exports.read = void 0; |
||||
|
function read(path, settings, callback) { |
||||
|
settings.fs.lstat(path, (lstatError, lstat) => { |
||||
|
if (lstatError !== null) { |
||||
|
callFailureCallback(callback, lstatError); |
||||
|
return; |
||||
|
} |
||||
|
if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { |
||||
|
callSuccessCallback(callback, lstat); |
||||
|
return; |
||||
|
} |
||||
|
settings.fs.stat(path, (statError, stat) => { |
||||
|
if (statError !== null) { |
||||
|
if (settings.throwErrorOnBrokenSymbolicLink) { |
||||
|
callFailureCallback(callback, statError); |
||||
|
return; |
||||
|
} |
||||
|
callSuccessCallback(callback, lstat); |
||||
|
return; |
||||
|
} |
||||
|
if (settings.markSymbolicLink) { |
||||
|
stat.isSymbolicLink = () => true; |
||||
|
} |
||||
|
callSuccessCallback(callback, stat); |
||||
|
}); |
||||
|
}); |
||||
|
} |
||||
|
exports.read = read; |
||||
|
function callFailureCallback(callback, error) { |
||||
|
callback(error); |
||||
|
} |
||||
|
function callSuccessCallback(callback, result) { |
||||
|
callback(null, result); |
||||
|
} |
@ -0,0 +1,3 @@ |
|||||
|
import type Settings from '../settings'; |
||||
|
import type { Stats } from '../types'; |
||||
|
export declare function read(path: string, settings: Settings): Stats; |
@ -0,0 +1,23 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
exports.read = void 0; |
||||
|
function read(path, settings) { |
||||
|
const lstat = settings.fs.lstatSync(path); |
||||
|
if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { |
||||
|
return lstat; |
||||
|
} |
||||
|
try { |
||||
|
const stat = settings.fs.statSync(path); |
||||
|
if (settings.markSymbolicLink) { |
||||
|
stat.isSymbolicLink = () => true; |
||||
|
} |
||||
|
return stat; |
||||
|
} |
||||
|
catch (error) { |
||||
|
if (!settings.throwErrorOnBrokenSymbolicLink) { |
||||
|
return lstat; |
||||
|
} |
||||
|
throw error; |
||||
|
} |
||||
|
} |
||||
|
exports.read = read; |
@ -0,0 +1,16 @@ |
|||||
|
import * as fs from './adapters/fs'; |
||||
|
export interface Options { |
||||
|
followSymbolicLink?: boolean; |
||||
|
fs?: Partial<fs.FileSystemAdapter>; |
||||
|
markSymbolicLink?: boolean; |
||||
|
throwErrorOnBrokenSymbolicLink?: boolean; |
||||
|
} |
||||
|
export default class Settings { |
||||
|
private readonly _options; |
||||
|
readonly followSymbolicLink: boolean; |
||||
|
readonly fs: fs.FileSystemAdapter; |
||||
|
readonly markSymbolicLink: boolean; |
||||
|
readonly throwErrorOnBrokenSymbolicLink: boolean; |
||||
|
constructor(_options?: Options); |
||||
|
private _getValue; |
||||
|
} |
@ -0,0 +1,16 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
const fs = require("./adapters/fs"); |
||||
|
class Settings { |
||||
|
constructor(_options = {}) { |
||||
|
this._options = _options; |
||||
|
this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true); |
||||
|
this.fs = fs.createFileSystemAdapter(this._options.fs); |
||||
|
this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false); |
||||
|
this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); |
||||
|
} |
||||
|
_getValue(option, value) { |
||||
|
return option !== null && option !== void 0 ? option : value; |
||||
|
} |
||||
|
} |
||||
|
exports.default = Settings; |
@ -0,0 +1,4 @@ |
|||||
|
/// <reference types="node" />
|
||||
|
import type * as fs from 'fs'; |
||||
|
export declare type Stats = fs.Stats; |
||||
|
export declare type ErrnoException = NodeJS.ErrnoException; |
@ -0,0 +1,2 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
@ -0,0 +1,37 @@ |
|||||
|
{ |
||||
|
"name": "@nodelib/fs.stat", |
||||
|
"version": "2.0.5", |
||||
|
"description": "Get the status of a file with some features", |
||||
|
"license": "MIT", |
||||
|
"repository": "https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.stat", |
||||
|
"keywords": [ |
||||
|
"NodeLib", |
||||
|
"fs", |
||||
|
"FileSystem", |
||||
|
"file system", |
||||
|
"stat" |
||||
|
], |
||||
|
"engines": { |
||||
|
"node": ">= 8" |
||||
|
}, |
||||
|
"files": [ |
||||
|
"out/**", |
||||
|
"!out/**/*.map", |
||||
|
"!out/**/*.spec.*" |
||||
|
], |
||||
|
"main": "out/index.js", |
||||
|
"typings": "out/index.d.ts", |
||||
|
"scripts": { |
||||
|
"clean": "rimraf {tsconfig.tsbuildinfo,out}", |
||||
|
"lint": "eslint \"src/**/*.ts\" --cache", |
||||
|
"compile": "tsc -b .", |
||||
|
"compile:watch": "tsc -p . --watch --sourceMap", |
||||
|
"test": "mocha \"out/**/*.spec.js\" -s 0", |
||||
|
"build": "npm run clean && npm run compile && npm run lint && npm test", |
||||
|
"watch": "npm run clean && npm run compile:watch" |
||||
|
}, |
||||
|
"devDependencies": { |
||||
|
"@nodelib/fs.macchiato": "1.0.4" |
||||
|
}, |
||||
|
"gitHead": "d6a7960d5281d3dd5f8e2efba49bb552d090f562" |
||||
|
} |
@ -0,0 +1,21 @@ |
|||||
|
The MIT License (MIT) |
||||
|
|
||||
|
Copyright (c) Denis Malinochkin |
||||
|
|
||||
|
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. |
@ -0,0 +1,215 @@ |
|||||
|
# @nodelib/fs.walk |
||||
|
|
||||
|
> A library for efficiently walking a directory recursively. |
||||
|
|
||||
|
## :bulb: Highlights |
||||
|
|
||||
|
* :moneybag: Returns useful information: `name`, `path`, `dirent` and `stats` (optional). |
||||
|
* :rocket: On Node.js 10.10+ uses the mechanism without additional calls to determine the entry type for performance reasons. See [`old` and `modern` mode](https://github.com/nodelib/nodelib/blob/master/packages/fs/fs.scandir/README.md#old-and-modern-mode). |
||||
|
* :gear: Built-in directories/files and error filtering system. |
||||
|
* :link: Can safely work with broken symbolic links. |
||||
|
|
||||
|
## Install |
||||
|
|
||||
|
```console |
||||
|
npm install @nodelib/fs.walk |
||||
|
``` |
||||
|
|
||||
|
## Usage |
||||
|
|
||||
|
```ts |
||||
|
import * as fsWalk from '@nodelib/fs.walk'; |
||||
|
|
||||
|
fsWalk.walk('path', (error, entries) => { /* … */ }); |
||||
|
``` |
||||
|
|
||||
|
## API |
||||
|
|
||||
|
### .walk(path, [optionsOrSettings], callback) |
||||
|
|
||||
|
Reads the directory recursively and asynchronously. Requires a callback function. |
||||
|
|
||||
|
> :book: If you want to use the Promise API, use `util.promisify`. |
||||
|
|
||||
|
```ts |
||||
|
fsWalk.walk('path', (error, entries) => { /* … */ }); |
||||
|
fsWalk.walk('path', {}, (error, entries) => { /* … */ }); |
||||
|
fsWalk.walk('path', new fsWalk.Settings(), (error, entries) => { /* … */ }); |
||||
|
``` |
||||
|
|
||||
|
### .walkStream(path, [optionsOrSettings]) |
||||
|
|
||||
|
Reads the directory recursively and asynchronously. [Readable Stream](https://nodejs.org/dist/latest-v12.x/docs/api/stream.html#stream_readable_streams) is used as a provider. |
||||
|
|
||||
|
```ts |
||||
|
const stream = fsWalk.walkStream('path'); |
||||
|
const stream = fsWalk.walkStream('path', {}); |
||||
|
const stream = fsWalk.walkStream('path', new fsWalk.Settings()); |
||||
|
``` |
||||
|
|
||||
|
### .walkSync(path, [optionsOrSettings]) |
||||
|
|
||||
|
Reads the directory recursively and synchronously. Returns an array of entries. |
||||
|
|
||||
|
```ts |
||||
|
const entries = fsWalk.walkSync('path'); |
||||
|
const entries = fsWalk.walkSync('path', {}); |
||||
|
const entries = fsWalk.walkSync('path', new fsWalk.Settings()); |
||||
|
``` |
||||
|
|
||||
|
#### path |
||||
|
|
||||
|
* Required: `true` |
||||
|
* Type: `string | Buffer | URL` |
||||
|
|
||||
|
A path to a file. If a URL is provided, it must use the `file:` protocol. |
||||
|
|
||||
|
#### optionsOrSettings |
||||
|
|
||||
|
* Required: `false` |
||||
|
* Type: `Options | Settings` |
||||
|
* Default: An instance of `Settings` class |
||||
|
|
||||
|
An [`Options`](#options) object or an instance of [`Settings`](#settings) class. |
||||
|
|
||||
|
> :book: When you pass a plain object, an instance of the `Settings` class will be created automatically. If you plan to call the method frequently, use a pre-created instance of the `Settings` class. |
||||
|
|
||||
|
### Settings([options]) |
||||
|
|
||||
|
A class of full settings of the package. |
||||
|
|
||||
|
```ts |
||||
|
const settings = new fsWalk.Settings({ followSymbolicLinks: true }); |
||||
|
|
||||
|
const entries = fsWalk.walkSync('path', settings); |
||||
|
``` |
||||
|
|
||||
|
## Entry |
||||
|
|
||||
|
* `name` — The name of the entry (`unknown.txt`). |
||||
|
* `path` — The path of the entry relative to call directory (`root/unknown.txt`). |
||||
|
* `dirent` — An instance of [`fs.Dirent`](./src/types/index.ts) class. |
||||
|
* [`stats`] — An instance of `fs.Stats` class. |
||||
|
|
||||
|
## Options |
||||
|
|
||||
|
### basePath |
||||
|
|
||||
|
* Type: `string` |
||||
|
* Default: `undefined` |
||||
|
|
||||
|
By default, all paths are built relative to the root path. You can use this option to set custom root path. |
||||
|
|
||||
|
In the example below we read the files from the `root` directory, but in the results the root path will be `custom`. |
||||
|
|
||||
|
```ts |
||||
|
fsWalk.walkSync('root'); // → ['root/file.txt'] |
||||
|
fsWalk.walkSync('root', { basePath: 'custom' }); // → ['custom/file.txt'] |
||||
|
``` |
||||
|
|
||||
|
### concurrency |
||||
|
|
||||
|
* Type: `number` |
||||
|
* Default: `Infinity` |
||||
|
|
||||
|
The maximum number of concurrent calls to `fs.readdir`. |
||||
|
|
||||
|
> :book: The higher the number, the higher performance and the load on the File System. If you want to read in quiet mode, set the value to `4 * os.cpus().length` (4 is default size of [thread pool work scheduling](http://docs.libuv.org/en/v1.x/threadpool.html#thread-pool-work-scheduling)). |
||||
|
|
||||
|
### deepFilter |
||||
|
|
||||
|
* Type: [`DeepFilterFunction`](./src/settings.ts) |
||||
|
* Default: `undefined` |
||||
|
|
||||
|
A function that indicates whether the directory will be read deep or not. |
||||
|
|
||||
|
```ts |
||||
|
// Skip all directories that starts with `node_modules` |
||||
|
const filter: DeepFilterFunction = (entry) => !entry.path.startsWith('node_modules'); |
||||
|
``` |
||||
|
|
||||
|
### entryFilter |
||||
|
|
||||
|
* Type: [`EntryFilterFunction`](./src/settings.ts) |
||||
|
* Default: `undefined` |
||||
|
|
||||
|
A function that indicates whether the entry will be included to results or not. |
||||
|
|
||||
|
```ts |
||||
|
// Exclude all `.js` files from results |
||||
|
const filter: EntryFilterFunction = (entry) => !entry.name.endsWith('.js'); |
||||
|
``` |
||||
|
|
||||
|
### errorFilter |
||||
|
|
||||
|
* Type: [`ErrorFilterFunction`](./src/settings.ts) |
||||
|
* Default: `undefined` |
||||
|
|
||||
|
A function that allows you to skip errors that occur when reading directories. |
||||
|
|
||||
|
For example, you can skip `ENOENT` errors if required: |
||||
|
|
||||
|
```ts |
||||
|
// Skip all ENOENT errors |
||||
|
const filter: ErrorFilterFunction = (error) => error.code == 'ENOENT'; |
||||
|
``` |
||||
|
|
||||
|
### stats |
||||
|
|
||||
|
* Type: `boolean` |
||||
|
* Default: `false` |
||||
|
|
||||
|
Adds an instance of `fs.Stats` class to the [`Entry`](#entry). |
||||
|
|
||||
|
> :book: Always use `fs.readdir` with additional `fs.lstat/fs.stat` calls to determine the entry type. |
||||
|
|
||||
|
### followSymbolicLinks |
||||
|
|
||||
|
* Type: `boolean` |
||||
|
* Default: `false` |
||||
|
|
||||
|
Follow symbolic links or not. Call `fs.stat` on symbolic link if `true`. |
||||
|
|
||||
|
### `throwErrorOnBrokenSymbolicLink` |
||||
|
|
||||
|
* Type: `boolean` |
||||
|
* Default: `true` |
||||
|
|
||||
|
Throw an error when symbolic link is broken if `true` or safely return `lstat` call if `false`. |
||||
|
|
||||
|
### `pathSegmentSeparator` |
||||
|
|
||||
|
* Type: `string` |
||||
|
* Default: `path.sep` |
||||
|
|
||||
|
By default, this package uses the correct path separator for your OS (`\` on Windows, `/` on Unix-like systems). But you can set this option to any separator character(s) that you want to use instead. |
||||
|
|
||||
|
### `fs` |
||||
|
|
||||
|
* Type: `FileSystemAdapter` |
||||
|
* Default: A default FS methods |
||||
|
|
||||
|
By default, the built-in Node.js module (`fs`) is used to work with the file system. You can replace any method with your own. |
||||
|
|
||||
|
```ts |
||||
|
interface FileSystemAdapter { |
||||
|
lstat: typeof fs.lstat; |
||||
|
stat: typeof fs.stat; |
||||
|
lstatSync: typeof fs.lstatSync; |
||||
|
statSync: typeof fs.statSync; |
||||
|
readdir: typeof fs.readdir; |
||||
|
readdirSync: typeof fs.readdirSync; |
||||
|
} |
||||
|
|
||||
|
const settings = new fsWalk.Settings({ |
||||
|
fs: { lstat: fakeLstat } |
||||
|
}); |
||||
|
``` |
||||
|
|
||||
|
## Changelog |
||||
|
|
||||
|
See the [Releases section of our GitHub project](https://github.com/nodelib/nodelib/releases) for changelog for each release version. |
||||
|
|
||||
|
## License |
||||
|
|
||||
|
This software is released under the terms of the MIT license. |
@ -0,0 +1,14 @@ |
|||||
|
/// <reference types="node" />
|
||||
|
import type { Readable } from 'stream'; |
||||
|
import type { Dirent, FileSystemAdapter } from '@nodelib/fs.scandir'; |
||||
|
import { AsyncCallback } from './providers/async'; |
||||
|
import Settings, { DeepFilterFunction, EntryFilterFunction, ErrorFilterFunction, Options } from './settings'; |
||||
|
import type { Entry } from './types'; |
||||
|
declare function walk(directory: string, callback: AsyncCallback): void; |
||||
|
declare function walk(directory: string, optionsOrSettings: Options | Settings, callback: AsyncCallback): void; |
||||
|
declare namespace walk { |
||||
|
function __promisify__(directory: string, optionsOrSettings?: Options | Settings): Promise<Entry[]>; |
||||
|
} |
||||
|
declare function walkSync(directory: string, optionsOrSettings?: Options | Settings): Entry[]; |
||||
|
declare function walkStream(directory: string, optionsOrSettings?: Options | Settings): Readable; |
||||
|
export { walk, walkSync, walkStream, Settings, AsyncCallback, Dirent, Entry, FileSystemAdapter, Options, DeepFilterFunction, EntryFilterFunction, ErrorFilterFunction }; |
@ -0,0 +1,34 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
exports.Settings = exports.walkStream = exports.walkSync = exports.walk = void 0; |
||||
|
const async_1 = require("./providers/async"); |
||||
|
const stream_1 = require("./providers/stream"); |
||||
|
const sync_1 = require("./providers/sync"); |
||||
|
const settings_1 = require("./settings"); |
||||
|
exports.Settings = settings_1.default; |
||||
|
function walk(directory, optionsOrSettingsOrCallback, callback) { |
||||
|
if (typeof optionsOrSettingsOrCallback === 'function') { |
||||
|
new async_1.default(directory, getSettings()).read(optionsOrSettingsOrCallback); |
||||
|
return; |
||||
|
} |
||||
|
new async_1.default(directory, getSettings(optionsOrSettingsOrCallback)).read(callback); |
||||
|
} |
||||
|
exports.walk = walk; |
||||
|
function walkSync(directory, optionsOrSettings) { |
||||
|
const settings = getSettings(optionsOrSettings); |
||||
|
const provider = new sync_1.default(directory, settings); |
||||
|
return provider.read(); |
||||
|
} |
||||
|
exports.walkSync = walkSync; |
||||
|
function walkStream(directory, optionsOrSettings) { |
||||
|
const settings = getSettings(optionsOrSettings); |
||||
|
const provider = new stream_1.default(directory, settings); |
||||
|
return provider.read(); |
||||
|
} |
||||
|
exports.walkStream = walkStream; |
||||
|
function getSettings(settingsOrOptions = {}) { |
||||
|
if (settingsOrOptions instanceof settings_1.default) { |
||||
|
return settingsOrOptions; |
||||
|
} |
||||
|
return new settings_1.default(settingsOrOptions); |
||||
|
} |
@ -0,0 +1,12 @@ |
|||||
|
import AsyncReader from '../readers/async'; |
||||
|
import type Settings from '../settings'; |
||||
|
import type { Entry, Errno } from '../types'; |
||||
|
export declare type AsyncCallback = (error: Errno, entries: Entry[]) => void; |
||||
|
export default class AsyncProvider { |
||||
|
private readonly _root; |
||||
|
private readonly _settings; |
||||
|
protected readonly _reader: AsyncReader; |
||||
|
private readonly _storage; |
||||
|
constructor(_root: string, _settings: Settings); |
||||
|
read(callback: AsyncCallback): void; |
||||
|
} |
@ -0,0 +1,30 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
const async_1 = require("../readers/async"); |
||||
|
class AsyncProvider { |
||||
|
constructor(_root, _settings) { |
||||
|
this._root = _root; |
||||
|
this._settings = _settings; |
||||
|
this._reader = new async_1.default(this._root, this._settings); |
||||
|
this._storage = []; |
||||
|
} |
||||
|
read(callback) { |
||||
|
this._reader.onError((error) => { |
||||
|
callFailureCallback(callback, error); |
||||
|
}); |
||||
|
this._reader.onEntry((entry) => { |
||||
|
this._storage.push(entry); |
||||
|
}); |
||||
|
this._reader.onEnd(() => { |
||||
|
callSuccessCallback(callback, this._storage); |
||||
|
}); |
||||
|
this._reader.read(); |
||||
|
} |
||||
|
} |
||||
|
exports.default = AsyncProvider; |
||||
|
function callFailureCallback(callback, error) { |
||||
|
callback(error); |
||||
|
} |
||||
|
function callSuccessCallback(callback, entries) { |
||||
|
callback(null, entries); |
||||
|
} |
@ -0,0 +1,4 @@ |
|||||
|
import AsyncProvider from './async'; |
||||
|
import StreamProvider from './stream'; |
||||
|
import SyncProvider from './sync'; |
||||
|
export { AsyncProvider, StreamProvider, SyncProvider }; |
@ -0,0 +1,9 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
exports.SyncProvider = exports.StreamProvider = exports.AsyncProvider = void 0; |
||||
|
const async_1 = require("./async"); |
||||
|
exports.AsyncProvider = async_1.default; |
||||
|
const stream_1 = require("./stream"); |
||||
|
exports.StreamProvider = stream_1.default; |
||||
|
const sync_1 = require("./sync"); |
||||
|
exports.SyncProvider = sync_1.default; |
@ -0,0 +1,12 @@ |
|||||
|
/// <reference types="node" />
|
||||
|
import { Readable } from 'stream'; |
||||
|
import AsyncReader from '../readers/async'; |
||||
|
import type Settings from '../settings'; |
||||
|
export default class StreamProvider { |
||||
|
private readonly _root; |
||||
|
private readonly _settings; |
||||
|
protected readonly _reader: AsyncReader; |
||||
|
protected readonly _stream: Readable; |
||||
|
constructor(_root: string, _settings: Settings); |
||||
|
read(): Readable; |
||||
|
} |
@ -0,0 +1,34 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
const stream_1 = require("stream"); |
||||
|
const async_1 = require("../readers/async"); |
||||
|
class StreamProvider { |
||||
|
constructor(_root, _settings) { |
||||
|
this._root = _root; |
||||
|
this._settings = _settings; |
||||
|
this._reader = new async_1.default(this._root, this._settings); |
||||
|
this._stream = new stream_1.Readable({ |
||||
|
objectMode: true, |
||||
|
read: () => { }, |
||||
|
destroy: () => { |
||||
|
if (!this._reader.isDestroyed) { |
||||
|
this._reader.destroy(); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
read() { |
||||
|
this._reader.onError((error) => { |
||||
|
this._stream.emit('error', error); |
||||
|
}); |
||||
|
this._reader.onEntry((entry) => { |
||||
|
this._stream.push(entry); |
||||
|
}); |
||||
|
this._reader.onEnd(() => { |
||||
|
this._stream.push(null); |
||||
|
}); |
||||
|
this._reader.read(); |
||||
|
return this._stream; |
||||
|
} |
||||
|
} |
||||
|
exports.default = StreamProvider; |
@ -0,0 +1,10 @@ |
|||||
|
import SyncReader from '../readers/sync'; |
||||
|
import type Settings from '../settings'; |
||||
|
import type { Entry } from '../types'; |
||||
|
export default class SyncProvider { |
||||
|
private readonly _root; |
||||
|
private readonly _settings; |
||||
|
protected readonly _reader: SyncReader; |
||||
|
constructor(_root: string, _settings: Settings); |
||||
|
read(): Entry[]; |
||||
|
} |
@ -0,0 +1,14 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
const sync_1 = require("../readers/sync"); |
||||
|
class SyncProvider { |
||||
|
constructor(_root, _settings) { |
||||
|
this._root = _root; |
||||
|
this._settings = _settings; |
||||
|
this._reader = new sync_1.default(this._root, this._settings); |
||||
|
} |
||||
|
read() { |
||||
|
return this._reader.read(); |
||||
|
} |
||||
|
} |
||||
|
exports.default = SyncProvider; |
@ -0,0 +1,30 @@ |
|||||
|
/// <reference types="node" />
|
||||
|
import { EventEmitter } from 'events'; |
||||
|
import * as fsScandir from '@nodelib/fs.scandir'; |
||||
|
import type Settings from '../settings'; |
||||
|
import type { Entry, Errno } from '../types'; |
||||
|
import Reader from './reader'; |
||||
|
declare type EntryEventCallback = (entry: Entry) => void; |
||||
|
declare type ErrorEventCallback = (error: Errno) => void; |
||||
|
declare type EndEventCallback = () => void; |
||||
|
export default class AsyncReader extends Reader { |
||||
|
protected readonly _settings: Settings; |
||||
|
protected readonly _scandir: typeof fsScandir.scandir; |
||||
|
protected readonly _emitter: EventEmitter; |
||||
|
private readonly _queue; |
||||
|
private _isFatalError; |
||||
|
private _isDestroyed; |
||||
|
constructor(_root: string, _settings: Settings); |
||||
|
read(): EventEmitter; |
||||
|
get isDestroyed(): boolean; |
||||
|
destroy(): void; |
||||
|
onEntry(callback: EntryEventCallback): void; |
||||
|
onError(callback: ErrorEventCallback): void; |
||||
|
onEnd(callback: EndEventCallback): void; |
||||
|
private _pushToQueue; |
||||
|
private _worker; |
||||
|
private _handleError; |
||||
|
private _handleEntry; |
||||
|
private _emitEntry; |
||||
|
} |
||||
|
export {}; |
@ -0,0 +1,97 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
const events_1 = require("events"); |
||||
|
const fsScandir = require("@nodelib/fs.scandir"); |
||||
|
const fastq = require("fastq"); |
||||
|
const common = require("./common"); |
||||
|
const reader_1 = require("./reader"); |
||||
|
class AsyncReader extends reader_1.default { |
||||
|
constructor(_root, _settings) { |
||||
|
super(_root, _settings); |
||||
|
this._settings = _settings; |
||||
|
this._scandir = fsScandir.scandir; |
||||
|
this._emitter = new events_1.EventEmitter(); |
||||
|
this._queue = fastq(this._worker.bind(this), this._settings.concurrency); |
||||
|
this._isFatalError = false; |
||||
|
this._isDestroyed = false; |
||||
|
this._queue.drain = () => { |
||||
|
if (!this._isFatalError) { |
||||
|
this._emitter.emit('end'); |
||||
|
} |
||||
|
}; |
||||
|
} |
||||
|
read() { |
||||
|
this._isFatalError = false; |
||||
|
this._isDestroyed = false; |
||||
|
setImmediate(() => { |
||||
|
this._pushToQueue(this._root, this._settings.basePath); |
||||
|
}); |
||||
|
return this._emitter; |
||||
|
} |
||||
|
get isDestroyed() { |
||||
|
return this._isDestroyed; |
||||
|
} |
||||
|
destroy() { |
||||
|
if (this._isDestroyed) { |
||||
|
throw new Error('The reader is already destroyed'); |
||||
|
} |
||||
|
this._isDestroyed = true; |
||||
|
this._queue.killAndDrain(); |
||||
|
} |
||||
|
onEntry(callback) { |
||||
|
this._emitter.on('entry', callback); |
||||
|
} |
||||
|
onError(callback) { |
||||
|
this._emitter.once('error', callback); |
||||
|
} |
||||
|
onEnd(callback) { |
||||
|
this._emitter.once('end', callback); |
||||
|
} |
||||
|
_pushToQueue(directory, base) { |
||||
|
const queueItem = { directory, base }; |
||||
|
this._queue.push(queueItem, (error) => { |
||||
|
if (error !== null) { |
||||
|
this._handleError(error); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
_worker(item, done) { |
||||
|
this._scandir(item.directory, this._settings.fsScandirSettings, (error, entries) => { |
||||
|
if (error !== null) { |
||||
|
done(error, undefined); |
||||
|
return; |
||||
|
} |
||||
|
for (const entry of entries) { |
||||
|
this._handleEntry(entry, item.base); |
||||
|
} |
||||
|
done(null, undefined); |
||||
|
}); |
||||
|
} |
||||
|
_handleError(error) { |
||||
|
if (this._isDestroyed || !common.isFatalError(this._settings, error)) { |
||||
|
return; |
||||
|
} |
||||
|
this._isFatalError = true; |
||||
|
this._isDestroyed = true; |
||||
|
this._emitter.emit('error', error); |
||||
|
} |
||||
|
_handleEntry(entry, base) { |
||||
|
if (this._isDestroyed || this._isFatalError) { |
||||
|
return; |
||||
|
} |
||||
|
const fullpath = entry.path; |
||||
|
if (base !== undefined) { |
||||
|
entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); |
||||
|
} |
||||
|
if (common.isAppliedFilter(this._settings.entryFilter, entry)) { |
||||
|
this._emitEntry(entry); |
||||
|
} |
||||
|
if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { |
||||
|
this._pushToQueue(fullpath, base === undefined ? undefined : entry.path); |
||||
|
} |
||||
|
} |
||||
|
_emitEntry(entry) { |
||||
|
this._emitter.emit('entry', entry); |
||||
|
} |
||||
|
} |
||||
|
exports.default = AsyncReader; |
@ -0,0 +1,7 @@ |
|||||
|
import type { FilterFunction } from '../settings'; |
||||
|
import type Settings from '../settings'; |
||||
|
import type { Errno } from '../types'; |
||||
|
export declare function isFatalError(settings: Settings, error: Errno): boolean; |
||||
|
export declare function isAppliedFilter<T>(filter: FilterFunction<T> | null, value: T): boolean; |
||||
|
export declare function replacePathSegmentSeparator(filepath: string, separator: string): string; |
||||
|
export declare function joinPathSegments(a: string, b: string, separator: string): string; |
@ -0,0 +1,31 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
exports.joinPathSegments = exports.replacePathSegmentSeparator = exports.isAppliedFilter = exports.isFatalError = void 0; |
||||
|
function isFatalError(settings, error) { |
||||
|
if (settings.errorFilter === null) { |
||||
|
return true; |
||||
|
} |
||||
|
return !settings.errorFilter(error); |
||||
|
} |
||||
|
exports.isFatalError = isFatalError; |
||||
|
function isAppliedFilter(filter, value) { |
||||
|
return filter === null || filter(value); |
||||
|
} |
||||
|
exports.isAppliedFilter = isAppliedFilter; |
||||
|
function replacePathSegmentSeparator(filepath, separator) { |
||||
|
return filepath.split(/[/\\]/).join(separator); |
||||
|
} |
||||
|
exports.replacePathSegmentSeparator = replacePathSegmentSeparator; |
||||
|
function joinPathSegments(a, b, separator) { |
||||
|
if (a === '') { |
||||
|
return b; |
||||
|
} |
||||
|
/** |
||||
|
* The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`). |
||||
|
*/ |
||||
|
if (a.endsWith(separator)) { |
||||
|
return a + b; |
||||
|
} |
||||
|
return a + separator + b; |
||||
|
} |
||||
|
exports.joinPathSegments = joinPathSegments; |
@ -0,0 +1,6 @@ |
|||||
|
import type Settings from '../settings'; |
||||
|
export default class Reader { |
||||
|
protected readonly _root: string; |
||||
|
protected readonly _settings: Settings; |
||||
|
constructor(_root: string, _settings: Settings); |
||||
|
} |
@ -0,0 +1,11 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
const common = require("./common"); |
||||
|
class Reader { |
||||
|
constructor(_root, _settings) { |
||||
|
this._root = _root; |
||||
|
this._settings = _settings; |
||||
|
this._root = common.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator); |
||||
|
} |
||||
|
} |
||||
|
exports.default = Reader; |
@ -0,0 +1,15 @@ |
|||||
|
import * as fsScandir from '@nodelib/fs.scandir'; |
||||
|
import type { Entry } from '../types'; |
||||
|
import Reader from './reader'; |
||||
|
export default class SyncReader extends Reader { |
||||
|
protected readonly _scandir: typeof fsScandir.scandirSync; |
||||
|
private readonly _storage; |
||||
|
private readonly _queue; |
||||
|
read(): Entry[]; |
||||
|
private _pushToQueue; |
||||
|
private _handleQueue; |
||||
|
private _handleDirectory; |
||||
|
private _handleError; |
||||
|
private _handleEntry; |
||||
|
private _pushToStorage; |
||||
|
} |
@ -0,0 +1,59 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
const fsScandir = require("@nodelib/fs.scandir"); |
||||
|
const common = require("./common"); |
||||
|
const reader_1 = require("./reader"); |
||||
|
class SyncReader extends reader_1.default { |
||||
|
constructor() { |
||||
|
super(...arguments); |
||||
|
this._scandir = fsScandir.scandirSync; |
||||
|
this._storage = []; |
||||
|
this._queue = new Set(); |
||||
|
} |
||||
|
read() { |
||||
|
this._pushToQueue(this._root, this._settings.basePath); |
||||
|
this._handleQueue(); |
||||
|
return this._storage; |
||||
|
} |
||||
|
_pushToQueue(directory, base) { |
||||
|
this._queue.add({ directory, base }); |
||||
|
} |
||||
|
_handleQueue() { |
||||
|
for (const item of this._queue.values()) { |
||||
|
this._handleDirectory(item.directory, item.base); |
||||
|
} |
||||
|
} |
||||
|
_handleDirectory(directory, base) { |
||||
|
try { |
||||
|
const entries = this._scandir(directory, this._settings.fsScandirSettings); |
||||
|
for (const entry of entries) { |
||||
|
this._handleEntry(entry, base); |
||||
|
} |
||||
|
} |
||||
|
catch (error) { |
||||
|
this._handleError(error); |
||||
|
} |
||||
|
} |
||||
|
_handleError(error) { |
||||
|
if (!common.isFatalError(this._settings, error)) { |
||||
|
return; |
||||
|
} |
||||
|
throw error; |
||||
|
} |
||||
|
_handleEntry(entry, base) { |
||||
|
const fullpath = entry.path; |
||||
|
if (base !== undefined) { |
||||
|
entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); |
||||
|
} |
||||
|
if (common.isAppliedFilter(this._settings.entryFilter, entry)) { |
||||
|
this._pushToStorage(entry); |
||||
|
} |
||||
|
if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { |
||||
|
this._pushToQueue(fullpath, base === undefined ? undefined : entry.path); |
||||
|
} |
||||
|
} |
||||
|
_pushToStorage(entry) { |
||||
|
this._storage.push(entry); |
||||
|
} |
||||
|
} |
||||
|
exports.default = SyncReader; |
@ -0,0 +1,30 @@ |
|||||
|
import * as fsScandir from '@nodelib/fs.scandir'; |
||||
|
import type { Entry, Errno } from './types'; |
||||
|
export declare type FilterFunction<T> = (value: T) => boolean; |
||||
|
export declare type DeepFilterFunction = FilterFunction<Entry>; |
||||
|
export declare type EntryFilterFunction = FilterFunction<Entry>; |
||||
|
export declare type ErrorFilterFunction = FilterFunction<Errno>; |
||||
|
export interface Options { |
||||
|
basePath?: string; |
||||
|
concurrency?: number; |
||||
|
deepFilter?: DeepFilterFunction; |
||||
|
entryFilter?: EntryFilterFunction; |
||||
|
errorFilter?: ErrorFilterFunction; |
||||
|
followSymbolicLinks?: boolean; |
||||
|
fs?: Partial<fsScandir.FileSystemAdapter>; |
||||
|
pathSegmentSeparator?: string; |
||||
|
stats?: boolean; |
||||
|
throwErrorOnBrokenSymbolicLink?: boolean; |
||||
|
} |
||||
|
export default class Settings { |
||||
|
private readonly _options; |
||||
|
readonly basePath?: string; |
||||
|
readonly concurrency: number; |
||||
|
readonly deepFilter: DeepFilterFunction | null; |
||||
|
readonly entryFilter: EntryFilterFunction | null; |
||||
|
readonly errorFilter: ErrorFilterFunction | null; |
||||
|
readonly pathSegmentSeparator: string; |
||||
|
readonly fsScandirSettings: fsScandir.Settings; |
||||
|
constructor(_options?: Options); |
||||
|
private _getValue; |
||||
|
} |
@ -0,0 +1,26 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||
|
const path = require("path"); |
||||
|
const fsScandir = require("@nodelib/fs.scandir"); |
||||
|
class Settings { |
||||
|
constructor(_options = {}) { |
||||
|
this._options = _options; |
||||
|
this.basePath = this._getValue(this._options.basePath, undefined); |
||||
|
this.concurrency = this._getValue(this._options.concurrency, Number.POSITIVE_INFINITY); |
||||
|
this.deepFilter = this._getValue(this._options.deepFilter, null); |
||||
|
this.entryFilter = this._getValue(this._options.entryFilter, null); |
||||
|
this.errorFilter = this._getValue(this._options.errorFilter, null); |
||||
|
this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); |
||||
|
this.fsScandirSettings = new fsScandir.Settings({ |
||||
|
followSymbolicLinks: this._options.followSymbolicLinks, |
||||
|
fs: this._options.fs, |
||||
|
pathSegmentSeparator: this._options.pathSegmentSeparator, |
||||
|
stats: this._options.stats, |
||||
|
throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink |
||||
|
}); |
||||
|
} |
||||
|
_getValue(option, value) { |
||||
|
return option !== null && option !== void 0 ? option : value; |
||||
|
} |
||||
|
} |
||||
|
exports.default = Settings; |
@ -0,0 +1,8 @@ |
|||||
|
/// <reference types="node" />
|
||||
|
import type * as scandir from '@nodelib/fs.scandir'; |
||||
|
export declare type Entry = scandir.Entry; |
||||
|
export declare type Errno = NodeJS.ErrnoException; |
||||
|
export interface QueueItem { |
||||
|
directory: string; |
||||
|
base?: string; |
||||
|
} |
@ -0,0 +1,2 @@ |
|||||
|
"use strict"; |
||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
@ -0,0 +1,44 @@ |
|||||
|
{ |
||||
|
"name": "@nodelib/fs.walk", |
||||
|
"version": "1.2.8", |
||||
|
"description": "A library for efficiently walking a directory recursively", |
||||
|
"license": "MIT", |
||||
|
"repository": "https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.walk", |
||||
|
"keywords": [ |
||||
|
"NodeLib", |
||||
|
"fs", |
||||
|
"FileSystem", |
||||
|
"file system", |
||||
|
"walk", |
||||
|
"scanner", |
||||
|
"crawler" |
||||
|
], |
||||
|
"engines": { |
||||
|
"node": ">= 8" |
||||
|
}, |
||||
|
"files": [ |
||||
|
"out/**", |
||||
|
"!out/**/*.map", |
||||
|
"!out/**/*.spec.*", |
||||
|
"!out/**/tests/**" |
||||
|
], |
||||
|
"main": "out/index.js", |
||||
|
"typings": "out/index.d.ts", |
||||
|
"scripts": { |
||||
|
"clean": "rimraf {tsconfig.tsbuildinfo,out}", |
||||
|
"lint": "eslint \"src/**/*.ts\" --cache", |
||||
|
"compile": "tsc -b .", |
||||
|
"compile:watch": "tsc -p . --watch --sourceMap", |
||||
|
"test": "mocha \"out/**/*.spec.js\" -s 0", |
||||
|
"build": "npm run clean && npm run compile && npm run lint && npm test", |
||||
|
"watch": "npm run clean && npm run compile:watch" |
||||
|
}, |
||||
|
"dependencies": { |
||||
|
"@nodelib/fs.scandir": "2.1.5", |
||||
|
"fastq": "^1.6.0" |
||||
|
}, |
||||
|
"devDependencies": { |
||||
|
"@nodelib/fs.macchiato": "1.0.4" |
||||
|
}, |
||||
|
"gitHead": "1e5bad48565da2b06b8600e744324ea240bf49d8" |
||||
|
} |
@ -0,0 +1,22 @@ |
|||||
|
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" |
@ -0,0 +1,94 @@ |
|||||
|
# 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. |
@ -0,0 +1,95 @@ |
|||||
|
# [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. |
@ -0,0 +1,65 @@ |
|||||
|
# 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 |
@ -0,0 +1,36 @@ |
|||||
|
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) {') |
||||
|
}) |
@ -0,0 +1,38 @@ |
|||||
|
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)) |
||||
|
} |
||||
|
}) |
@ -0,0 +1,71 @@ |
|||||
|
/* 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)) |
||||
|
} |
@ -0,0 +1,70 @@ |
|||||
|
/* 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)) |
||||
|
} |
@ -0,0 +1,86 @@ |
|||||
|
/* 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); |
||||
|
} |
@ -0,0 +1,43 @@ |
|||||
|
/* 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)) |
||||
|
} |
@ -0,0 +1,55 @@ |
|||||
|
/* 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)) |
||||
|
} |
@ -0,0 +1,61 @@ |
|||||
|
/* 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)) |
||||
|
} |
@ -0,0 +1,135 @@ |
|||||
|
/* 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 |
||||
|
} |
@ -0,0 +1,139 @@ |
|||||
|
/* 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)) |
||||
|
} |
@ -0,0 +1,51 @@ |
|||||
|
{ |
||||
|
"name": "acorn-node", |
||||
|
"description": "the acorn javascript parser, preloaded with plugins for syntax parity with recent node versions", |
||||
|
"version": "1.8.2", |
||||
|
"author": "Renée Kooi <renee@kooi.me>", |
||||
|
"bugs": { |
||||
|
"url": "https://github.com/browserify/acorn-node/issues" |
||||
|
}, |
||||
|
"dependencies": { |
||||
|
"acorn": "^7.0.0", |
||||
|
"acorn-walk": "^7.0.0", |
||||
|
"xtend": "^4.0.2" |
||||
|
}, |
||||
|
"devDependencies": { |
||||
|
"acorn-bigint": "^0.4.0", |
||||
|
"acorn-class-fields": "^0.3.1", |
||||
|
"acorn-dynamic-import": "^4.0.0", |
||||
|
"acorn-export-ns-from": "^0.1.0", |
||||
|
"acorn-import-meta": "^0.3.0", |
||||
|
"acorn-numeric-separator": "^0.3.0", |
||||
|
"acorn-private-class-elements": "^0.1.1", |
||||
|
"acorn-static-class-features": "^0.2.0", |
||||
|
"buble": "^0.19.8", |
||||
|
"mkdirp": "^0.5.1", |
||||
|
"standard": "^13.1.0", |
||||
|
"tape": "^4.11.0" |
||||
|
}, |
||||
|
"homepage": "https://github.com/browserify/acorn-node", |
||||
|
"keywords": [ |
||||
|
"acorn", |
||||
|
"browserify", |
||||
|
"javascript", |
||||
|
"parser" |
||||
|
], |
||||
|
"license": "Apache-2.0", |
||||
|
"main": "index.js", |
||||
|
"repository": { |
||||
|
"type": "git", |
||||
|
"url": "https://github.com/browserify/acorn-node.git" |
||||
|
}, |
||||
|
"scripts": { |
||||
|
"test": "standard && node test/index.js", |
||||
|
"prepublishOnly": "npm run build", |
||||
|
"build": "node build.js" |
||||
|
}, |
||||
|
"standard": { |
||||
|
"ignore": [ |
||||
|
"lib/*/*.js" |
||||
|
] |
||||
|
} |
||||
|
} |
@ -0,0 +1,154 @@ |
|||||
|
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() |
||||
|
}) |
@ -0,0 +1,57 @@ |
|||||
|
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 |
@ -0,0 +1,131 @@ |
|||||
|
## 7.2.0 (2020-06-17) |
||||
|
|
||||
|
### New features |
||||
|
|
||||
|
Support optional chaining and nullish coalescing. |
||||
|
|
||||
|
Support `import.meta`. |
||||
|
|
||||
|
Add support for `export * as ns from "source"`. |
||||
|
|
||||
|
## 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. |
@ -0,0 +1,19 @@ |
|||||
|
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. |
@ -0,0 +1,126 @@ |
|||||
|
# 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). |
@ -0,0 +1,112 @@ |
|||||
|
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?: FindPredicate | string, |
||||
|
base?: RecursiveVisitors<TState>, |
||||
|
state?: TState |
||||
|
): Found<TState> | undefined; |
||||
|
|
||||
|
export function findNodeAround<TState>( |
||||
|
node: Node, |
||||
|
start: number | undefined, |
||||
|
type?: FindPredicate | string, |
||||
|
base?: RecursiveVisitors<TState>, |
||||
|
state?: TState |
||||
|
): Found<TState> | undefined; |
||||
|
|
||||
|
export const findNodeAfter: typeof findNodeAround; |
||||
|
} |
@ -0,0 +1,463 @@ |
|||||
|
(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 = base.ChainExpression = |
||||
|
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) { |
||||
|
if (node.exported) |
||||
|
{ c(node.exported, st); } |
||||
|
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 }); |
||||
|
|
||||
|
}))); |
1
node_modules/acorn-walk/dist/walk.js.map
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,443 @@ |
|||||
|
// 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 = base.ChainExpression = |
||||
|
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) { |
||||
|
if (node.exported) |
||||
|
{ c(node.exported, st); } |
||||
|
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"); |
||||
|
}; |
||||
|
|
||||
|
export { ancestor, base, findNodeAfter, findNodeAround, findNodeAt, findNodeBefore, full, fullAncestor, make, recursive, simple }; |
Some files were not shown because too many files changed in this diff
Write
Preview
Loading…
Cancel
Save
Reference in new issue