From ab5225e8d5a5304e698f433d329957f6f1acfa11 Mon Sep 17 00:00:00 2001 From: Ashwin Vishnu <9155111+ashwinvis@users.noreply.github.com> Date: Sun, 21 Jul 2019 13:16:05 +0200 Subject: [PATCH] Release: 0.2.0 (#62) * Add an image to test * Tests and dev files to npmignore * Set rc1, require directory to be clean * Add changelog * Eslint * Installation options --- .eslintrc.yml | 253 ++++++++++++++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE.md | 4 +- .npmignore | 3 + CHANGELOG.md | 14 +++ README.md | 10 ++ instant-markdown-d | 6 +- package.json | 7 +- tests/images/test_img.png | Bin 0 -> 10075 bytes tests/test_math.md | 4 +- version.js | 2 +- 10 files changed, 295 insertions(+), 8 deletions(-) create mode 100644 .eslintrc.yml create mode 100644 .npmignore create mode 100644 CHANGELOG.md create mode 100644 tests/images/test_img.png diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 0000000..a79bf2c --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,253 @@ +env: + browser: true + commonjs: true + es6: true +extends: 'eslint:recommended' +globals: + Atomics: readonly + SharedArrayBuffer: readonly +parserOptions: + ecmaVersion: 2018 +rules: + accessor-pairs: error + array-bracket-newline: error + array-bracket-spacing: + - error + - never + array-callback-return: error + array-element-newline: error + arrow-body-style: error + arrow-parens: error + arrow-spacing: error + block-scoped-var: error + block-spacing: error + brace-style: 'off' + callback-return: error + camelcase: error + capitalized-comments: 'off' + class-methods-use-this: error + comma-dangle: 'off' + comma-spacing: + - error + - after: true + before: false + comma-style: + - error + - last + complexity: error + computed-property-spacing: + - error + - never + consistent-return: 'off' + consistent-this: error + curly: 'off' + default-case: error + dot-location: + - error + - property + dot-notation: error + eol-last: error + eqeqeq: error + func-call-spacing: error + func-name-matching: error + func-names: 'off' + func-style: + - error + - declaration + function-paren-newline: error + generator-star-spacing: error + global-require: 'off' + guard-for-in: error + handle-callback-err: error + id-blacklist: error + id-length: 'off' + id-match: error + implicit-arrow-linebreak: error + indent: 'off' + indent-legacy: 'off' + init-declarations: error + jsx-quotes: error + key-spacing: error + keyword-spacing: 'off' + line-comment-position: 'off' + linebreak-style: + - error + - unix + lines-around-comment: error + lines-around-directive: 'off' + lines-between-class-members: error + max-classes-per-file: error + max-depth: error + max-len: 'off' + max-lines: error + max-lines-per-function: error + max-nested-callbacks: error + max-params: error + max-statements: 'off' + max-statements-per-line: error + multiline-comment-style: + - error + - separate-lines + new-cap: error + new-parens: error + newline-after-var: 'off' + newline-before-return: 'off' + newline-per-chained-call: 'off' + no-alert: error + no-array-constructor: error + no-await-in-loop: error + no-bitwise: error + no-buffer-constructor: error + no-caller: error + no-catch-shadow: error + no-confusing-arrow: error + no-console: 'off' + no-continue: error + no-div-regex: error + no-duplicate-imports: error + no-else-return: error + no-empty-function: 'off' + no-eq-null: error + no-eval: error + no-extend-native: error + no-extra-bind: error + no-extra-label: error + no-extra-parens: error + no-floating-decimal: error + no-implicit-coercion: error + no-implicit-globals: error + no-implied-eval: error + no-inline-comments: 'off' + no-invalid-this: error + no-iterator: error + no-label-var: error + no-labels: error + no-lone-blocks: error + no-lonely-if: error + no-loop-func: error + no-magic-numbers: 'off' + no-mixed-operators: error + no-mixed-requires: 'off' + no-multi-assign: error + no-multi-spaces: + - error + - ignoreEOLComments: true + no-multi-str: error + no-multiple-empty-lines: error + no-native-reassign: error + no-negated-condition: error + no-negated-in-lhs: error + no-nested-ternary: error + no-new: error + no-new-func: error + no-new-object: error + no-new-require: error + no-new-wrappers: error + no-octal-escape: error + no-param-reassign: error + no-path-concat: 'off' + no-plusplus: error + no-process-env: 'off' + no-process-exit: 'off' + no-proto: error + no-restricted-globals: error + no-restricted-imports: error + no-restricted-modules: error + no-restricted-properties: error + no-restricted-syntax: error + no-return-assign: error + no-return-await: error + no-script-url: error + no-self-compare: error + no-sequences: error + no-shadow: error + no-spaced-func: error + no-sync: 'off' + no-tabs: error + no-template-curly-in-string: error + no-ternary: 'off' + no-throw-literal: error + no-trailing-spaces: error + no-undef-init: error + no-undefined: error + no-underscore-dangle: error + no-unmodified-loop-condition: error + no-unneeded-ternary: error + no-unused-expressions: error + no-use-before-define: 'off' + no-useless-call: error + no-useless-computed-key: error + no-useless-concat: error + no-useless-constructor: error + no-useless-rename: error + no-useless-return: error + no-var: error + no-void: error + no-warning-comments: error + no-whitespace-before-property: error + nonblock-statement-body-position: error + object-curly-newline: error + object-curly-spacing: 'off' + object-shorthand: 'off' + one-var: 'off' + one-var-declaration-per-line: error + operator-assignment: + - error + - always + operator-linebreak: error + padded-blocks: 'off' + padding-line-between-statements: error + prefer-arrow-callback: 'off' + prefer-const: 'off' + prefer-destructuring: 'off' + prefer-named-capture-group: 'off' + prefer-numeric-literals: error + prefer-object-spread: error + prefer-promise-reject-errors: error + prefer-reflect: error + prefer-rest-params: error + prefer-spread: error + prefer-template: 'off' + quote-props: 'off' + quotes: 'off' + radix: error + require-await: error + require-jsdoc: 'off' + require-unicode-regexp: 'off' + rest-spread-spacing: error + semi: 'off' + semi-spacing: error + semi-style: + - error + - last + sort-imports: error + sort-keys: 'off' + sort-vars: 'off' + space-before-blocks: 'off' + space-before-function-paren: 'off' + space-in-parens: + - error + - never + space-infix-ops: 'off' + space-unary-ops: error + spaced-comment: + - error + - always + strict: error + switch-colon-spacing: error + symbol-description: error + template-curly-spacing: + - error + - never + template-tag-spacing: error + unicode-bom: + - error + - never + valid-jsdoc: error + vars-on-top: error + wrap-iife: error + wrap-regex: 'off' + yield-star-spacing: error + yoda: + - error + - never diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 668ffc7..c4b04b0 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -11,8 +11,8 @@ ## Provide the output of test command (required) -Run `npm test&; sleep 5; npm stop` or at least equivalent of `cat -tests/test_math.md | instant-markdown-d --mathjax --debug` and paste the +Run `npm test&; sleep 5; npm stop` or at least equivalent of +`cd tests; cat test_math.md | instant-markdown-d --mathjax --debug` and paste the console output here: ```sh diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..4bb0878 --- /dev/null +++ b/.npmignore @@ -0,0 +1,3 @@ +tests/ +.github/ +.travis.yml diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..93e6c9f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,14 @@ +# 0.2.0.rc1 (2017-07-19) + +* Optional MathJax support +* Apache 2.0 license +* Mount `__dirname` directory to serve images etc. +* Browser port configuration +* Debug option +* Tests, CI +* Issue template +* ECMA6 upgrade, support only node>=8 + +# 0.1.1 (2017-07-19) + +* Bug fix for windows diff --git a/README.md b/README.md index 0bb1ced..9899e1d 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,18 @@ instant-markdown-d is a small Node.js server that enables instant compilation an Installation ------------ + +Install the mini-server by running either: + - `[sudo] npm -g install instant-markdown-d` +or pre-release version + +- `[sudo] npm -g install instant-markdown-d@next` + +see [vim-instant-markdown](https://github.com/suan/vim-instant-markdown) for +Vim / Neovim integration. + REST API -------- | Action | HTTP Method | Request URL | Request Body | diff --git a/instant-markdown-d b/instant-markdown-d index 8744314..074295d 100755 --- a/instant-markdown-d +++ b/instant-markdown-d @@ -1,5 +1,9 @@ #!/usr/bin/env node "use strict"; +// node builtins +const process = require('process'); + + const MarkdownIt = require('markdown-it'); const hljs = require('highlight.js'); const server = require('http').createServer(httpHandler), @@ -30,7 +34,7 @@ Options: --mathjax Enable MathJax parsing --browser BROWSER Use a custom browser --port PORT Use a custom port (default: 8090) - --debug Be verbose and do not open browser + --debug Be verbose and do not open browser -V, --version Display version -h, --help Display help\ `); diff --git a/package.json b/package.json index 1cf3833..063f32f 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "url": "git+https://github.com/suan/instant-markdown-d.git" }, "description": "Instantly-updating Markdown Server", - "version": "0.2.0", + "version": "0.2.0-rc.1", "license": "Apache-2.0", "homepage": "https://github.com/suan/instant-markdown-d", "engines": { @@ -20,8 +20,9 @@ "scripts": { "start": "./instant-markdown-d", "build": "genversion ./version.js", - "test": "cat tests/test_math.md | instant-markdown-d --mathjax --debug", - "stop": "curl -X DELETE -s -w 'status: %{http_code}' -m 3 localhost:8090" + "test": "cd tests; cat test_math.md | instant-markdown-d --mathjax --debug", + "stop": "curl -X DELETE -s -w 'status: %{http_code}' -m 3 localhost:8090", + "prepare": "npm run build; git clean -f;" }, "dependencies": { "highlight.js": "^9.15.6", diff --git a/tests/images/test_img.png b/tests/images/test_img.png new file mode 100644 index 0000000000000000000000000000000000000000..9d4f918741813b7ea8f9e0d0d60d0eefadc5be9f GIT binary patch literal 10075 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