Skip to content

Commit

Permalink
Modernize project, implement custom serialization
Browse files Browse the repository at this point in the history
JSON.stringify() just wasn't good enough (as it can't handle functions inside arrays and objects).
  • Loading branch information
meyfa committed May 31, 2018
1 parent e04da36 commit fc954eb
Show file tree
Hide file tree
Showing 9 changed files with 392 additions and 244 deletions.
264 changes: 67 additions & 197 deletions .eslintrc
@@ -1,204 +1,74 @@
env:
node: true
browser: false
node: true

# http://eslint.org/docs/rules/
rules:
# Possible Errors
comma-dangle: [2, always-multiline]
no-cond-assign: 2
no-console: 0
no-constant-condition: 2
no-control-regex: 2
no-debugger: 2
no-dupe-args: 2
no-dupe-keys: 2
no-duplicate-case: 2
no-empty: 2
no-empty-character-class: 2
no-ex-assign: 2
no-extra-boolean-cast: 2
no-extra-parens: 0
no-extra-semi: 2
no-func-assign: 2
no-inner-declarations: [2, functions]
no-invalid-regexp: 2
no-irregular-whitespace: 2
no-negated-in-lhs: 2
no-obj-calls: 2
no-regex-spaces: 2
no-sparse-arrays: 2
no-unexpected-multiline: 2
no-unreachable: 2
use-isnan: 2
valid-jsdoc: 0
valid-typeof: 2

# Best Practices
accessor-pairs: 2
block-scoped-var: 0
complexity: [2, 6]
consistent-return: 0
curly: 2
default-case: 0
dot-location: 0
dot-notation: 0
eqeqeq: 2
guard-for-in: 2
no-alert: 2
no-caller: 2
no-case-declarations: 2
no-div-regex: 2
no-else-return: 0
no-empty-pattern: 2
no-eq-null: 2
no-eval: 2
no-extend-native: 2
no-extra-bind: 2
no-fallthrough: 2
no-floating-decimal: 0
no-implicit-coercion: 0
no-implied-eval: 2
no-invalid-this: 2
no-iterator: 2
no-labels: 2
no-lone-blocks: 2
no-loop-func: 2
no-magic-number: 0
no-multi-spaces: 2
no-multi-str: 2
no-native-reassign: 2
no-new-func: 2
no-new-wrappers: 2
no-new: 2
no-octal-escape: 2
no-octal: 2
no-proto: 2
no-redeclare: 2
no-return-assign: 2
no-script-url: 2
no-self-compare: 2
no-sequences: 2
no-throw-literal: 2
no-unused-expressions: 2
no-useless-call: 2
no-useless-concat: 2
no-void: 2
no-warning-comments: 0
no-with: 2
radix: 2
vars-on-top: 0
wrap-iife: [2, inside]
yoda: 2
parserOptions:
ecmaVersion: 6

# Strict
strict: [2, global]
rules:
# important
eol-last: [error, always]
no-irregular-whitespace: [error]
strict: [error, global]
eqeqeq: [error]
no-use-before-define: [error, { functions: false, variables: true }]
no-invalid-regexp: [error]
no-empty-character-class: [error]
no-unreachable: [error]
semi: [error, always]
no-unexpected-multiline: [error]
no-dupe-args: [error]
no-dupe-keys: [error]
no-duplicate-case: [error]
valid-typeof: [error]
no-unsafe-negation: [error]
no-redeclare: [error]
no-delete-var: [error]

# Variables
init-declarations: 0
no-catch-shadow: 2
no-delete-var: 2
no-label-var: 2
no-shadow-restricted-names: 2
no-shadow: 2
no-undef-init: 2
no-undef: 0
no-undefined: 0
no-unused-vars: 2
no-use-before-define: 0
# possible errors
no-obj-calls: [error]
no-unused-vars: [error]
no-shadow: [error]
no-compare-neg-zero: [error]
no-cond-assign: [error]
no-return-assign: [error]
no-sparse-arrays: [error]
radix: [error]
handle-callback-err: [error]
no-constant-condition: [warn]
no-extra-boolean-cast: [warn]
no-param-reassign: [warn]
no-self-assign: [warn]
no-self-compare: [warn]
no-throw-literal: [warn]
no-useless-return: [warn]

# Node.js and CommonJS
callback-return: 2
global-require: 2
handle-callback-err: 2
no-mixed-requires: 2
no-new-require: 2
no-path-concat: 2
no-process-exit: 2
no-restricted-modules: 0
no-sync: 0
# documentation
valid-jsdoc: [error]

# Stylistic Issues
array-bracket-spacing: [1, never]
block-spacing: 2
brace-style: 2
camelcase: 2
comma-spacing: 2
comma-style: 2
computed-property-spacing: 2
consistent-this: 0
eol-last: 2
func-names: 0
func-style: 0
id-length: 0
id-match: 0
indent: [2, 4]
jsx-quotes: 0
key-spacing: 2
linebreak-style: 0
lines-around-comment: 0
max-depth: 0
max-len: 0
max-nested-callbacks: 0
max-params: 0
max-statements: [2, 30]
new-cap: 2
new-parens: 2
newline-after-var: 0
no-array-constructor: 0
no-bitwise: 0
no-continue: 0
no-inline-comments: 0
no-lonely-if: 2
no-mixed-spaces-and-tabs: 2
no-multiple-empty-lines: 0
no-negated-condition: 0
no-nested-ternary: 2
no-new-object: 0
no-plusplus: 0
no-restricted-syntax: 0
no-spaced-func: 0
no-ternary: 0
no-trailing-spaces: 2
no-underscore-dangle: 0
no-unneeded-ternary: 0
object-curly-spacing: [2, always]
one-var: 0
operator-assignment: 2
operator-linebreak: 0
padded-blocks: 0
quote-props: 0
quotes: 0
require-jsdoc: 0
semi-spacing: 0
semi: 2
sort-vars: 0
space-after-keywords: 0
space-before-blocks: 0
space-before-function-paren: 0
space-before-keywords: 0
space-in-parens: 0
space-infix-ops: 0
space-return-throw-case: 0
space-unary-ops: 0
spaced-comment: 0
wrap-regex: 0
# deprecations
no-octal: [error]
no-octal-escape: [error]
no-with: [error]
no-eval: [error]
no-alert: [warn]
no-debugger: [warn]
no-var: [warn]

# ECMAScript 6
arrow-body-style: 0
arrow-parens: 0
arrow-spacing: 0
constructor-super: 0
generator-star-spacing: 0
no-arrow-condition: 0
no-class-assign: 0
no-const-assign: 0
no-dupe-class-members: 0
no-this-before-super: 0
no-var: 0
object-shorthand: 0
prefer-arrow-callback: 0
prefer-const: 0
prefer-reflect: 0
prefer-spread: 0
prefer-template: 0
require-yield: 0
# style
wrap-iife: [error, any]
max-len: [warn, 120]
no-trailing-spaces: [warn]
space-in-parens: [warn, never]
no-extra-parens: [warn]
indent: [warn, 4]
quotes: [warn, double, { avoidEscape: true }]
camelcase: [warn, { properties: always }]
space-before-blocks: [warn, always]
curly: [warn, all]
no-empty: [warn]
brace-style: [warn, 1tbs]
comma-style: [warn, last]
comma-dangle: [warn, always-multiline]
dot-notation: [warn]
yoda: [warn]
1 change: 1 addition & 0 deletions .gitattributes
@@ -0,0 +1 @@
* text=auto
2 changes: 1 addition & 1 deletion .travis.yml
@@ -1,6 +1,6 @@
language: node_js
node_js:
- "node"
- "6"
- "5"
- "4"
- "0.10"
2 changes: 1 addition & 1 deletion LICENSE
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2017 Fabian Meyer
Copyright (c) 2017 - 2018 Fabian Meyer

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
31 changes: 14 additions & 17 deletions README.md
@@ -1,13 +1,13 @@
# runstring

[![Build Status](https://travis-ci.org/meyfa/runstring.svg?branch=master)](https://travis-ci.org/meyfa/runstring)
[![Code Climate](https://codeclimate.com/github/meyfa/runstring/badges/gpa.svg)](https://codeclimate.com/github/meyfa/runstring)
[![Maintainability](https://api.codeclimate.com/v1/badges/39e38e2764a453e66a43/maintainability)](https://codeclimate.com/github/meyfa/runstring/maintainability)

Convert JS functions to runnable strings. With parameter serialization!

This was made for Electron's `executeJavaScript()` method, so that the code does
not need to be constructed as a string but can be passed as a regular function
that is immediately invoked with specific parameters.
not need to be constructed as a string but can be passed as an IIFE string with
specific arguments.

## Usage

Expand All @@ -17,17 +17,18 @@ Simply invoke the module with a function and the parameters that should be
passed to that function.

```javascript
var runstring = require("runstring");
var code = runstring(myFunction, arg1, arg2, ...);
const runstring = require("runstring");

let code = runstring(myFunction, arg1, arg2, ...);
// do something with `code`
```

### Example 1

```javascript
var runstring = require("runstring");
const runstring = require("runstring");

var code = runstring(function (a, b) {
let code = runstring(function (a, b) {
return a + b;
}, 5, 7);
```
Expand All @@ -43,11 +44,11 @@ Any parameter type is supported — numbers, strings, objects, arrays, and
even other functions can all be passed to the module for stringification:

```javascript
var runstring = require("runstring");
const runstring = require("runstring");

var code = runstring(function (predicate, action) {
var elements = document.getElementsByClassName("item");
for (var i = 0; i < elements.length; ++i) {
let code = runstring(function (predicate, action) {
const elements = document.getElementsByClassName("item");
for (let i = 0; i < elements.length; ++i) {
if (predicate(elements[i])) {
action(elements[i]);
}
Expand All @@ -65,8 +66,8 @@ function removeElement(e) {

```
";(function (predicate, action) {
var elements = document.getElementsByClassName("item");
for (var i = 0; i < elements.length; ++i) {
const elements = document.getElementsByClassName("item");
for (let i = 0; i < elements.length; ++i) {
if (predicate(elements[i])) {
action(elements[i]);
}
Expand All @@ -77,7 +78,3 @@ function removeElement(e) {
e.parentNode.removeChild(e);
});"
```

## Tests

Tests use Mocha and should be run using `npm test`.

0 comments on commit fc954eb

Please sign in to comment.