Comparing version 0.0.0-development to 0.0.0
@@ -1,3 +0,87 @@ | ||
"use strict"; | ||
'use strict'; | ||
process.stdin.pipe(process.stdout); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
require('./polyfills'); | ||
var _traverse = require('@babel/traverse'); | ||
var _traverse2 = _interopRequireDefault(_traverse); | ||
var _omitDeepLodash = require('omit-deep-lodash'); | ||
var _omitDeepLodash2 = _interopRequireDefault(_omitDeepLodash); | ||
var _deepEqual = require('deep-equal'); | ||
var _deepEqual2 = _interopRequireDefault(_deepEqual); | ||
var _parse = require('./parse'); | ||
var _parse2 = _interopRequireDefault(_parse); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
exports.default = (text, { pattern, anonymous }) => { | ||
const patternAsts = [].concat(getMeaningfulNode((0, _parse2.default)(pattern))); | ||
const ast = (0, _parse2.default)(text); | ||
return patternAsts.flatMap(patternAst => matchAsts(patternAst, ast, { anonymous })).map(match => { | ||
const code = readLineToStart(text, match.start) + text.substring(match.start, match.end) + readLineToEnd(text, match.end); | ||
return { text: code, node: match }; | ||
}); | ||
}; | ||
// import preprocess from './preprocess'; | ||
const getMeaningfulNode = ast => { | ||
switch (ast.type) { | ||
case 'File': | ||
return getMeaningfulNode(ast.program); | ||
case 'Program': | ||
return ast.body.map(getMeaningfulNode); | ||
case 'ExpressionStatement': | ||
return getMeaningfulNode(ast.expression); | ||
default: | ||
return ast; | ||
} | ||
}; | ||
const omitKeysDefault = ['start', 'end', 'loc']; | ||
const matchAsts = (smaller, bigger, { anonymous }) => { | ||
const omitKeys = anonymous ? [...omitKeysDefault, 'name'] : omitKeysDefault; | ||
const matches = []; | ||
smaller = (0, _omitDeepLodash2.default)(smaller, ...omitKeys); | ||
(0, _traverse2.default)(bigger, { | ||
enter(path) { | ||
if ((0, _deepEqual2.default)((0, _omitDeepLodash2.default)(path.node, ...omitKeys), smaller)) { | ||
matches.push(path.node); | ||
} | ||
} | ||
}); | ||
return matches; | ||
}; | ||
const readLineToStart = (text, index) => { | ||
const range = text.substring(0, index); | ||
const match = /\r?\n(.*)$/.exec(range); | ||
if (!match) { | ||
return ''; | ||
} | ||
return match[1]; | ||
}; | ||
const readLineToEnd = (text, index) => { | ||
const range = text.substring(index); | ||
const match = /^(.*)\r?\n/.exec(range); | ||
if (!match) { | ||
return ''; | ||
} | ||
return match[1]; | ||
}; |
{ | ||
"name": "ast-grep", | ||
"version": "0.0.0-development", | ||
"version": "0.0.0", | ||
"description": "Like grep, but more powerful than you can possibly imagine.", | ||
@@ -8,5 +8,19 @@ "repository": "azz/ast-grep", | ||
"main": "./dist", | ||
"bin": "./dist/bin/ast-grep.js", | ||
"license": "MIT", | ||
"files": ["dist"], | ||
"dependencies": {}, | ||
"files": [ | ||
"dist" | ||
], | ||
"dependencies": { | ||
"@babel/code-frame": "7.0.0-beta.37", | ||
"@babel/traverse": "^7.0.0-beta.37", | ||
"babylon": "7.0.0-beta.37", | ||
"core-js": "^2.5.3", | ||
"deep-equal": "^1.0.1", | ||
"get-stream": "^3.0.0", | ||
"globby": "^7.1.1", | ||
"mem": "^3.0.0", | ||
"mri": "^1.1.0", | ||
"omit-deep-lodash": "^1.0.0" | ||
}, | ||
"scripts": { | ||
@@ -16,3 +30,4 @@ "prepublishOnly": "yarn build", | ||
"test": "jest", | ||
"lint": "eslint . --ignore-path=.gitignore", | ||
"test:generate": "babel-node test/generate", | ||
"lint": "eslint .", | ||
"semantic-release": "semantic-release", | ||
@@ -24,5 +39,8 @@ "precommit": "pretty-quick --staged" | ||
"babel-core": "^6.26.0", | ||
"babel-plugin-transform-object-rest-spread": "^6.26.0", | ||
"babel-preset-env": "^1.6.1", | ||
"common-tags": "^1.7.2", | ||
"eslint": "^4.15.0", | ||
"eslint-config-prettier": "^2.9.0", | ||
"eslint-config-xo": "^0.19.0", | ||
"eslint-plugin-jest": "^21.5.0", | ||
@@ -34,3 +52,3 @@ "eslint-plugin-prettier": "^2.4.0", | ||
"pretty-quick": "^1.2.0", | ||
"semantic-release": "^11.0.2" | ||
"semantic-release": "^12.2.2" | ||
}, | ||
@@ -43,2 +61,3 @@ "prettier": { | ||
"extends": [ | ||
"xo/esnext", | ||
"eslint:recommended", | ||
@@ -54,7 +73,27 @@ "plugin:jest/recommended", | ||
"node": true | ||
}, | ||
"rules": { | ||
"no-console": "off" | ||
} | ||
}, | ||
"babel": { | ||
"presets": [["env", { "targets": { "node": "6.10" } }]] | ||
"presets": [ | ||
[ | ||
"env", | ||
{ | ||
"targets": { | ||
"node": "6.10" | ||
} | ||
} | ||
] | ||
], | ||
"plugins": [ | ||
"transform-object-rest-spread" | ||
] | ||
}, | ||
"jest": { | ||
"snapshotSerializers": [ | ||
"<rootDir>/test/raw-serializer.js" | ||
] | ||
} | ||
} |
@@ -11,2 +11,4 @@ # `ast-grep` | ||
Search your JavaScript files for patterns based on AST shape, rather than substrings or regular expressions. | ||
## Install | ||
@@ -17,3 +19,3 @@ | ||
```shellsession | ||
yarn add ast-grep | ||
yarn global add ast-grep | ||
``` | ||
@@ -24,5 +26,44 @@ | ||
```shellsession | ||
npm install --save ast-grep | ||
npm install --global --save ast-grep | ||
``` | ||
## Usage | ||
On standard in: | ||
```shellsession | ||
$ echo 'code();' | ast-grep 'code' | ||
code(); | ||
$ ast-grep 'foo()' < file.js | ||
foo(); | ||
``` | ||
On a set of files: | ||
```shellsession | ||
$ ast-grep 'yield* foo();' '**/*.js' | ||
``` | ||
## Flags | ||
### `--anonymous` | ||
**Alias**: `-a` | ||
Ignore names, this includes identifiers, types, etc. | ||
## Examples | ||
### Find all no-arg function calls: | ||
```shellsession | ||
$ echo -e 'foo();\nbar();' | ast-grep 'fn()' -a | ||
foo(); | ||
bar(); | ||
``` | ||
## FAQ | ||
### Q. But @azz, `grep` stands for Global Regular Expression Print, this tool doesn't use Regular Expressions! | ||
**A.** I know, but `gastp` doesn't sound great. |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Trivial Package
Supply chain riskPackages less than 10 lines of code are easily copied into your own project and may not warrant the additional supply chain risk of an external dependency.
Found 1 instance in 1 package
12565
8
200
67
10
15
2
+ Addedbabylon@7.0.0-beta.37
+ Addedcore-js@^2.5.3
+ Addeddeep-equal@^1.0.1
+ Addedget-stream@^3.0.0
+ Addedglobby@^7.1.1
+ Addedmem@^3.0.0
+ Addedmri@^1.1.0
+ Addedomit-deep-lodash@^1.0.0
+ Added@babel/code-frame@7.0.0-beta.377.26.2(transitive)
+ Added@babel/generator@7.26.8(transitive)
+ Added@babel/helper-string-parser@7.25.9(transitive)
+ Added@babel/helper-validator-identifier@7.25.9(transitive)
+ Added@babel/parser@7.26.8(transitive)
+ Added@babel/template@7.26.8(transitive)
+ Added@babel/traverse@7.26.8(transitive)
+ Added@babel/types@7.26.8(transitive)
+ Added@jridgewell/gen-mapping@0.3.8(transitive)
+ Added@jridgewell/resolve-uri@3.1.2(transitive)
+ Added@jridgewell/set-array@1.2.1(transitive)
+ Added@jridgewell/sourcemap-codec@1.5.0(transitive)
+ Added@jridgewell/trace-mapping@0.3.25(transitive)
+ Addedansi-styles@3.2.1(transitive)
+ Addedarray-union@1.0.2(transitive)
+ Addedarray-uniq@1.0.3(transitive)
+ Addedbabylon@7.0.0-beta.37(transitive)
+ Addedbalanced-match@1.0.2(transitive)
+ Addedbrace-expansion@1.1.11(transitive)
+ Addedcall-bind@1.0.8(transitive)
+ Addedcall-bind-apply-helpers@1.0.2(transitive)
+ Addedcall-bound@1.0.3(transitive)
+ Addedchalk@2.4.2(transitive)
+ Addedcolor-convert@1.9.3(transitive)
+ Addedcolor-name@1.1.3(transitive)
+ Addedconcat-map@0.0.1(transitive)
+ Addedcore-js@2.6.12(transitive)
+ Addeddebug@4.4.0(transitive)
+ Addeddeep-equal@1.1.2(transitive)
+ Addeddefine-data-property@1.1.4(transitive)
+ Addeddefine-properties@1.2.1(transitive)
+ Addeddir-glob@2.2.2(transitive)
+ Addeddunder-proto@1.0.1(transitive)
+ Addedes-define-property@1.0.1(transitive)
+ Addedes-errors@1.3.0(transitive)
+ Addedes-object-atoms@1.1.1(transitive)
+ Addedescape-string-regexp@1.0.5(transitive)
+ Addedesutils@2.0.3(transitive)
+ Addedfs.realpath@1.0.0(transitive)
+ Addedfunction-bind@1.1.2(transitive)
+ Addedfunctions-have-names@1.2.3(transitive)
+ Addedget-intrinsic@1.2.7(transitive)
+ Addedget-proto@1.0.1(transitive)
+ Addedget-stream@3.0.0(transitive)
+ Addedglob@7.2.3(transitive)
+ Addedglobals@11.12.0(transitive)
+ Addedglobby@7.1.1(transitive)
+ Addedgopd@1.2.0(transitive)
+ Addedhas-flag@3.0.0(transitive)
+ Addedhas-property-descriptors@1.0.2(transitive)
+ Addedhas-symbols@1.1.0(transitive)
+ Addedhas-tostringtag@1.0.2(transitive)
+ Addedhasown@2.0.2(transitive)
+ Addedignore@3.3.10(transitive)
+ Addedinflight@1.0.6(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedis-arguments@1.2.0(transitive)
+ Addedis-date-object@1.1.0(transitive)
+ Addedis-regex@1.2.1(transitive)
+ Addedjs-tokens@3.0.24.0.0(transitive)
+ Addedjsesc@3.1.0(transitive)
+ Addedlodash@4.17.21(transitive)
+ Addedmath-intrinsics@1.1.0(transitive)
+ Addedmem@3.0.1(transitive)
+ Addedmimic-fn@1.2.0(transitive)
+ Addedminimatch@3.1.2(transitive)
+ Addedmri@1.2.0(transitive)
+ Addedms@2.1.3(transitive)
+ Addedobject-is@1.1.6(transitive)
+ Addedobject-keys@1.1.1(transitive)
+ Addedomit-deep-lodash@1.1.7(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedp-is-promise@1.1.0(transitive)
+ Addedpath-is-absolute@1.0.1(transitive)
+ Addedpath-type@3.0.0(transitive)
+ Addedpicocolors@1.1.1(transitive)
+ Addedpify@3.0.0(transitive)
+ Addedregexp.prototype.flags@1.5.4(transitive)
+ Addedset-function-length@1.2.2(transitive)
+ Addedset-function-name@2.0.2(transitive)
+ Addedslash@1.0.0(transitive)
+ Addedsupports-color@5.5.0(transitive)
+ Addedwrappy@1.0.2(transitive)