Skip to content

Conversation

tunnckoCore
Copy link
Owner

@tunnckoCore tunnckoCore commented Oct 24, 2019

Example

import { parse as acornParse } from 'acorn';
import { parseExpression } from '@babel/parser';
import { parseFunction } from '.';

function fooFn(bar, baz = 123) {
  return bar * baz;
}

// `node` is an AST Node
function bobbyPlugin(node, result) {
  const bobby = 'bobby';

  return { ...result, bobby };
}

function barryPlugin(node, result) {
  const hasDefaultParams =
    Object.values(result.defaults).filter(Boolean).length > 0;

  return { ...result, barry: 'barry barry', hasDefaultParams };
}

const result = parseFunction(fooFn, {
  parse: acornParse,
  plugins: [bobbyPlugin, barryPlugin],
  parserOptions: {},
});

console.log(result);

/* {
  name: 'fooFn',
  body: '\n  return bar * baz;\n',
  args: [ 'bar', 'baz' ],
  params: 'bar, baz',
  defaults: { bar: undefined, baz: '123' },
  value: '(function fooFn(bar, baz = 123) {\n  return bar * baz;\n})',
  isValid: true,
  isArrow: false,
  isAsync: false,
  isNamed: true,
  isAnonymous: false,
  isGenerator: false,
  isExpression: false,
  bobby: 'bobby',
  barry: 'barry barry',
  hasDefaultParams: true
} */

const res = parseFunction(fooFn, {
  parseExpression,
  parserOptions: {
    sourceType: 'module',
    allowAwaitOutsideFunction: true,
    allowReturnOutsideFunction: true,
  },
});
console.log(res);

Basic TypeScript typings

import { ParserOptions } from '@babel/parser';
import { File } from '@babel/types';

// eslint-disable-next-line @typescript-eslint/no-explicit-any
type FnType = (...args: any) => any;

export type Input = FnType | string;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export type Plugin = (node: any, result: Result) => Result | undefined;
export type Plugins = Plugin | Array<Plugin>;

export interface Options {
  parse?(input: string, options?: ParserOptions): File;
  parseExpression?(input: string, options?: ParserOptions): File;
  parserOptions?: ParserOptions;
  plugins?: Plugins;
}

export interface Result {
  name: string | null;
  body: string;
  args: Array<string>;
  params: string;
  defaults: { [key: string]: string | undefined };
  value: string;
  isValid: boolean;
  isArrow: boolean;
  isAsync: boolean;
  isNamed: boolean;
  isAnonymous: boolean;
  isGenerator: boolean;
  isExpression: boolean;
}

export function parseFunction(code: Input, options?: Options): Result;

BREAKING CHANGE: exports named `parseFunction`,

For more see #65 (comment)

Signed-off-by: Charlike Mike Reagent <[email protected]>
Signed-off-by: Charlike Mike Reagent <[email protected]>
@codecov
Copy link

codecov bot commented Oct 24, 2019

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 48.47%. Comparing base (6fbf37b) to head (ea4e8d5).
⚠️ Report is 323 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master      #72      +/-   ##
==========================================
- Coverage   48.91%   48.47%   -0.44%     
==========================================
  Files          26       26              
  Lines         828      821       -7     
  Branches      253      254       +1     
==========================================
- Hits          405      398       -7     
  Misses        334      334              
  Partials       89       89              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Signed-off-by: Charlike Mike Reagent <[email protected]>
Signed-off-by: Charlike Mike Reagent <[email protected]>
Signed-off-by: Charlike Mike Reagent <[email protected]>
Signed-off-by: Charlike Mike Reagent <[email protected]>
Signed-off-by: Charlike Mike Reagent <[email protected]>
Signed-off-by: Charlike Mike Reagent <[email protected]>
@tunnckoCore tunnckoCore changed the title feat: v6 of parse-function major: v6 of parse-function Oct 24, 2019
@tunnckoCore tunnckoCore added Pkg: parse-function Priority: High After critical issues are fixed, these should be dealt with before any further issues. Status: In Progress This issue is being worked on, and has someone assigned. Type: Documentation An Issue or Pull Request for improving or updating documentation. Type: Enhancement Most issues will probably be for additions or changes. Expected that this will result in a PR. Type: Maintenance Updating phrasing or wording to make things clearer or removing ambiguity, without a functionality. labels Oct 24, 2019
@tunnckoCore
Copy link
Owner Author

TODO:

  • update tests links in readme
  • add note for v6 too

Signed-off-by: Charlike Mike Reagent <[email protected]>
tunnckoCore referenced this pull request Dec 4, 2019
* fix(rename): rename "result.valid" to "result.isValid"
* docs(isValid): update docs because isValid change
* fix(rename): the "result.orig" to "result.value"
* docs(result): update docs for "result.orig" to "result.value" change
* docs(api): update docs
* feat(benchmarks): add benchmarks
* test(espree): add tests using espree parser
* chore(yarn): force update
* docs(tips): add Pro Tips section
* docs(related): update related libs
* fix(package): add engines field
* chore(release): 3.0.0
* refactor(index): plugins api, more tests, support es6 method notation
* fix(package): bump to babylon@next
* fix(codeclimate): xx
* fix(style): codeclimate issues
* test(*): clarify a bit the tests for "anonymous" functions
* fix(package): force update yarn
* docs(*): update readme, description and site url
* fix(package): update deps and npm scripts, fix travis/appveyor
* chore(package): standard ignore benchmark dir
* fix(package): fix linting
* feat(methods): reorganize repo, introduce ".use" and ".parse" methods
* fix(codeclimate): analize lib folder
* docs(api): start docs
* docs(api): update api docs
* docs(readme): update usage example
* docs(readme): add Features and few more sections
* fix(.use): allow plugins that just extends the core api and not return a
* docs(notes): add human description on the Plugins Architecture
* docs(readme): better navigation
* chore(release): 4.0.0
* fix(package): include files in npm package
* fix(arrows): bug when found arrow on function body
* docs(readme): update
* chore(release): 4.0.1
* fix(objectMethod): bug when default arguments is used in object method
* docs(links): update links pointing to test.js file
* chore(release): 4.0.2
* fix(tests): make it work on node 4
* chore(release): 4.0.3
* chore(renovate): Configure Renovate (#34)
* Add renovate.json
* chore(renovate): update config
* refactor(deps): Pin Dependencies (#36)
* fix(renovate/deps): Update dependency define-property to version ^1.0.0
* chore(renovate/devDeps): Update dependency acorn to version 5.1.1
* chore(renovate/devDeps): Update dependency benchmarked to version 1.1.1
* chore(deps): pin prod deps
* fix(renovate/deps): Update dependency babylon to version 7.0.0-beta.18
* chore(renovate/devDeps): Update dependency clone-deep to version 1.0.0
* chore(renovate/devDeps): Update dependency cz-conventional-changelog to version 2.0.0

* chore(renovate/devDeps): Update dependency for-in to version 1.0.2
* chore(renovate/devDeps): Update dependency nyc to version 11.1.0
* chore(renovate/devDeps): Update dependency standard to version 10.0.2
* fix(renovate/deps): update dependency babylon to version 7.0.0-beta.19
* chore(renovate/devDeps): update dependency espree to v3.5.0
* chore(deps): update lock file
* chore(renovate/devDeps): update dependency standard to v10.0.3
* major(release): BREAKING CHANGE: Require Node.js >= 6 & npm >= 5
* fix(readme): generate readme
* fix(logo): fix logo to be centered
* fix(readme): add features section again
* fix(sr): fix semantic-release added things
* chore(devDeps): update dependency eslint-config-standard-tunnckocore to
* fix(codeclimate): add config file, to exclude benchmarks
* fix(pkg): fix codeclimate and npm script for release
* chore(bump): force bump hela to latest, update renovate config
* chore(nyc): bump everything to 100%
* chore(benchmarks): remove them since we dont need
* fix(build): move to es6 modules by default
* fix(deps): bump hela to latest
* fix(deps): force bump to [email protected]; include fresh script
* fix(deps): bump hela
* chore(devDeps): update dependency hela to v0.4.2
* fix(deps): update deps, renovate config, contrib file
* chore(devDeps): update dependency hela to v0.5.4
* chore(devDeps): update dependency hela to v0.5.5
* chore(devDeps): update dependency eslint-config-standard-tunnckocore to
* fix(misc): update codeclimate
* chore(devDeps): update dependency eslint-config-standard-tunnckocore to v1.0.5
* chore(devDeps): update dependency semantic-release to ^7.0.0 (#45)
* chore(devDeps): update dependency hela to v0.5.6
* chore(devDeps): update dependency hela to v0.5.7
* chore(devDeps): update dependency eslint to v4.5.0
* chore(devDeps): update dependency hela to v0.5.8
* fix(deps): update dependency babylon to v7.0.0-beta.20
* chore(devDeps): update dependency hela to v0.5.9
* chore(devDeps): update dependency eslint-config-standard-tunnckocore to v1.0.6
* chore(devDeps): update dependency eslint-config-standard-tunnckocore to v1.0.7
* chore(devDeps): update dependency hela to v0.6.0
* chore(devDeps): update dependency hela to v0.7.0
* fix(deps): update dependency babylon to v7.0.0-beta.21
* chore(devDeps): update dependency hela to v0.7.2
* fix(deps): update dependency babylon to v7.0.0-beta.22
* chore(devDeps): update dependency hela to v0.7.3
* chore(devDeps): update dependency eslint to v4.6.0
* chore(devDeps): update dependency eslint to v4.6.1
* chore(devDeps): update dependency acorn to v5.1.2
* chore(devDeps): update dependency hela to v0.7.4
* chore(devDeps): update dependency hela to v0.7.5
* chore(renovate): update config to try DCO
* chore(cfg): update renovate config
* chore(devDeps): update dependency hela to v0.7.6 (#49)
* chore(devDeps): update dependency hela to 0.7.6
* chore(deps): update Signed-off-by tag
* chore(devDeps): update dependency hela to 0.7.7
* fix(deps): update dependency babylon to 7.0.0-beta.23
* chore(devDeps): update dependency eslint to 4.7.0
* chore(devDeps): update dependency espree to 3.5.1
* chore(devDeps): update dependency eslint to 4.7.1
* fix(deps): update dependency babylon to 7.0.0-beta.24
* chore(devDeps): update dependency eslint-config-standard-tunnckocore to v1.0.8 (#60)
* chore(devDeps): update dependency eslint-config-standard-tunnckocore to 1.0.9
* fix(deps): update dependency babylon to 7.0.0-beta.25
* fix(arrows): handle async arrow functions
* add case for async arrow functions when wrapping
* add missing `done()` to test case
* fix(deps): update dependency babylon to 7.0.0-beta.26
* chore(devDeps): update dependency eslint-config-standard-tunnckocore to 1.0.10
* fix(deps): update dependency babylon to 7.0.0-beta.27
* chore(devDeps): update dependency eslint to 4.8.0
* fix(boilerplate): update stuff and modernize tests
* fix(docs): update dogs
* fix(deps): force update hela preset, activate semantic-release
* fix(renovate): test use of shareable configs
* fix(renovate): pin all deps, pr not pending
* refactor(deps): renovate pin dependencies packages (#70)
* chore(deps): update dependency hela to v1.1.3
* fix(misc): force update
* fix(docs): publish docs folder
* Set theme jekyll-theme-minimal
* Set theme jekyll-theme-cayman
* fix(deps): update dependency babylon to v7.0.0-beta.28
* fix(deps): update dependency babylon to v7.0.0-beta.29
* fix: remove yarn release
* fix(deps): update dependency babylon to v7.0.0-beta.30
* chore(deps): update dependency acorn to v5.2.0
* chore(deps): update dependency acorn to v5.2.1
* fix(deps): update dependency babylon to v7.0.0-beta.31
* chore(deps): update dependency espree to v3.5.2
* fix(deps): update dependency babylon to v7.0.0-beta.32
* chore(deps): update dependency clone-deep to v2.0.1
* fix(deps): update dependency babylon to v7.0.0-beta.33
* fix(deps): update dependency define-property to v2.0.0
* fix(deps): update dependency babylon to v7.0.0-beta.34
* fix(deps): update dependency babylon to v7.0.0-beta.35
* fix(deps): update dependency babylon to v7.0.0-beta.36
* chore(deps): update dependency acorn to v5.3.0
* fix(deps): update dependency babylon to v7.0.0-beta.37
* fix(deps): update dependency babylon to v7.0.0-beta.38
* chore(deps): update dependency clone-deep to v2.0.2
* fix(deps): update dependency define-property to v2.0.1
* fix(deps): update dependency define-property to v2.0.2
* fix(deps): update dependency babylon to v7.0.0-beta.39
* chore(deps): update dependency acorn to v5.4.0
* chore(deps): update dependency acorn to v5.4.1
* chore(deps): update dependency espree to v3.5.3
* feat(params): add support for list of expressions as default value (#111)

(a = (doSomething(), doSomethingElse(), true)) => {} is a prefectly valid syntax that is used
extensively by code instrumenters. When a list of expressions is used as a default value, only the
last expression is the actual default value. This commit add support for this syntax.
TAG: latest

fixes #110

* chore(readme): update nsp id
* chore(readme): fix links for NodeSecurity
* chore(readme): update releasing badge
* fix(dist): include bundles in dist, so in npm package
* fix(deps): update dependency babylon to v7.0.0-beta.40
* chore: 5.1.2 manual publish
* fix(deps): use new-release package for automatic publishing
* fix(ci): use npx in travis and test only on node 6
* fix(releasing): update readme and travis
* fix(misc): obviously manual publishing...
* chore(readme): fix badges and readme
* fix(stuff): finally release and publish with dist/index.js
* chore(deps): update dependency acorn to v5.5.0
* feat(result): values of default params to be always strings (#121)

Changes in [Result object](https://github.com/tunnckoCore/parse-function#result)!

**Possible breaking change, if you depend on values of `result.defaults`!**

Now `result.defaults` is key/value pairs as before, but the value is always of type `string` or `undefined`!
Casting of values is delegated to the end user which before was not consistent and was actual value of the default parameter.

Example **(before)**:

```js
const result = app.parse('(a = 123) => {}')
console.log(result.defaults)
// => { a: 123 }
```

Example **(after)**:

```js
const result = app.parse('(a = 123) => {}')

// notice that `123` now is string!
console.log(result.defaults)
// => { a: '123' }
```

* chore: publish v5.2.0 to npm
* chore(deps): update dependency espree to v3.5.4
* fix: release 5.2.1 with dist folder
* fix(release): add new-release to publish on CI
* fix(release): add new-release to publish on CI - 2
* fix(ci): switch to CircleCI
* fix: circle config update

* fix: circle config update

Signed-off-by: Charlike Mike Reagent <[email protected]>

* fix(ci): update readme badges and CircleCI config

* fix(pkg): placeholder

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency acorn to v5.5.1

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency acorn to v5.5.3

Signed-off-by: Charlike Mike Reagent <[email protected]>

* fix(deps): update dependency babylon to v7.0.0-beta.41

Signed-off-by: Charlike Mike Reagent <[email protected]>

* fix(deps): update dependency babylon to v7.0.0-beta.42

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update circleci/node to tag 8

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update circleci/node:8 digest

Signed-off-by: Charlike Mike Reagent <[email protected]>

* fix(deps): update dependency babylon to v7.0.0-beta.43

Signed-off-by: Charlike Mike Reagent <[email protected]>

* fix(deps): update dependency babylon to v7.0.0-beta.44

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency clone-deep to v4.0.0

Signed-off-by: Charlike Mike Reagent <[email protected]>

* fix(deps): update dependency babylon to v7.0.0-beta.45

Signed-off-by: Charlike Mike Reagent <[email protected]>

* fix(deps): update dependency babylon to v7.0.0-beta.46

Signed-off-by: Charlike Mike Reagent <[email protected]>

* fix(deps): update dependency babylon to v7.0.0-beta.47

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency acorn to v5.6.0

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency acorn to v5.6.1

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency acorn to v5.6.2

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency new-release to v4.0.2

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency new-release to v4.0.3

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency acorn to v5.7.1

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency espree to v4

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency new-release to v4.0.4

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency new-release to v4.0.5

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency new-release to v4.0.6

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency acorn to v5.7.2

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency new-release to v4.0.7

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency acorn to v5.7.3

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore: update build badge

* chore: update codecov badge

* chore(deps): update dependency husky to v1

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v1.0.1

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v1.1.0

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v1.1.1

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v1.1.2

Signed-off-by: Charlike Mike Reagent <[email protected]>

* fix: say "Bye bye!" to NodeSecurityProject ;(

It was a great service. Sadly @npm bought them and integrated it into their CLI, which totally sucks, because if you don't use npm you lose that cool functionality.

* chore(deps): update dependency new-release to v4.0.8

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency espree to v4.1.0

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v1.1.3

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency new-release to v4.0.9

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency new-release to v5

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update new-release to latest

* chore(deps): update dependency husky to v1.1.4

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency new-release to v5.0.4

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v1.2.0

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency clone-deep to v4.0.1

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency espree to v5

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v1.2.1

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v1.3.0

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v1.3.1

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency espree to v5.0.1

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v2

Signed-off-by: Charlike Mike Reagent <[email protected]>

* fix(deps): update dependency arrify to v2

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v2.4.0

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v2.4.1

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency espree to v6

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v2.5.0

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v2.6.0

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore: add GitHub Sponsoring button (funding file)

* chore(github/funding): fix typo

* chore(funding): re-fix the typo

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v2.7.0

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v3

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v3.0.1

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v3.0.2

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v3.0.3

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v3.0.4

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency espree to v6.1.0

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency espree to v6.1.1

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v3.0.5

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v3.0.7

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v3.0.8

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore(deps): update dependency husky to v3.0.9

Signed-off-by: Charlike Mike Reagent <[email protected]>

* feat: add parse-function to monorepo

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore: fmt

Signed-off-by: Charlike Mike Reagent <[email protected]>

* chore: wrong place

Signed-off-by: Charlike Mike Reagent <[email protected]>
@tunnckoCore
Copy link
Owner Author

tunnckoCore commented Jul 24, 2022

Why there is 2 PRs #67?! 🤔 🤣 I'm picking up this one, because it seems 5 days more recent, and is no TypeScript - it's simply separated on index.d.ts

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Pkg: parse-function Priority: High After critical issues are fixed, these should be dealt with before any further issues. Status: In Progress This issue is being worked on, and has someone assigned. Type: Documentation An Issue or Pull Request for improving or updating documentation. Type: Enhancement Most issues will probably be for additions or changes. Expected that this will result in a PR. Type: Maintenance Updating phrasing or wording to make things clearer or removing ambiguity, without a functionality.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Next Major: Simplifying the API, docs and the plugins, smaller codebase, TypeScript support
1 participant