From deadf924c93c36e257dae2edfa556ad6185b500a Mon Sep 17 00:00:00 2001 From: "jeroen.akkerman" Date: Fri, 6 Jul 2018 16:03:52 +0200 Subject: [PATCH] First typescript effort! --- .gitignore | 1 + dist/easymde.min.css | 2 +- dist/easymde.min.js | 2 +- gulpfile.js | 57 ---- gulpfile.ts | 108 +++++++ package-lock.json | 724 +++++++++++++++++++++++++++++++++---------- package.json | 21 +- src/ts/newmde.ts | 514 ++++++++++++++++++++++++++++++ src/ts/tablist.ts | 41 +++ tsconfig.json | 33 ++ tslint.json | 37 +++ 11 files changed, 1310 insertions(+), 230 deletions(-) delete mode 100644 gulpfile.js create mode 100644 gulpfile.ts create mode 100644 src/ts/newmde.ts create mode 100644 src/ts/tablist.ts create mode 100644 tsconfig.json create mode 100644 tslint.json diff --git a/.gitignore b/.gitignore index 48e3f6f..1c93015 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ node_modules/ .idea/ .vscode/ dev_test/ +build/ diff --git a/dist/easymde.min.css b/dist/easymde.min.css index a76883f..9778862 100644 --- a/dist/easymde.min.css +++ b/dist/easymde.min.css @@ -1,5 +1,5 @@ /** - * easymde v2.1.0 + * easymde v3.0.0 * Copyright Jeroen Akkerman * @link https://github.com/ionaru/easy-markdown-editor * @license MIT diff --git a/dist/easymde.min.js b/dist/easymde.min.js index 38b9f58..e0ec5df 100644 --- a/dist/easymde.min.js +++ b/dist/easymde.min.js @@ -1,5 +1,5 @@ /** - * easymde v2.1.0 + * easymde v3.0.0 * Copyright Jeroen Akkerman * @link https://github.com/ionaru/easy-markdown-editor * @license MIT diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index 89be24c..0000000 --- a/gulpfile.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -var gulp = require('gulp'); -var cleanCSS = require('gulp-clean-css'); -var uglify = require('gulp-uglify'); -var concat = require('gulp-concat'); -var header = require('gulp-header'); -var buffer = require('vinyl-buffer'); -var pkg = require('./package.json'); -var eslint = require('gulp-eslint'); -var browserify = require('browserify'); -var source = require('vinyl-source-stream'); -var rename = require('gulp-rename'); - -var banner = ['/**', - ' * <%= pkg.name %> v<%= pkg.version %>', - ' * Copyright <%= pkg.author %>', - ' * @link <%= pkg.repository.url %>', - ' * @license <%= pkg.license %>', - ' */', - ''].join('\n'); - -function lint() { - return gulp.src('./src/js/**/*.js') - .pipe(eslint()) - .pipe(eslint.format()) - .pipe(eslint.failAfterError()); -} - -function scripts() { - return browserify({entries: './src/js/easymde.js', standalone: 'EasyMDE'}).bundle() - .pipe(source('easymde.min.js')) - .pipe(buffer()) - .pipe(uglify()) - .pipe(header(banner, {pkg: pkg})) - .pipe(gulp.dest('./dist/')); -} - -function styles() { - var css_files = [ - './node_modules/codemirror/lib/codemirror.css', - './src/css/*.css', - './node_modules/codemirror-spell-checker/src/css/spell-checker.css' - ]; - - return gulp.src(css_files) - .pipe(concat('easymde.css')) - .pipe(cleanCSS()) - .pipe(rename('easymde.min.css')) - .pipe(buffer()) - .pipe(header(banner, {pkg: pkg})) - .pipe(gulp.dest('./dist/')); -} - -var build = gulp.parallel(gulp.series(lint, scripts), styles); - -gulp.task('default', build); diff --git a/gulpfile.ts b/gulpfile.ts new file mode 100644 index 0000000..a4583e2 --- /dev/null +++ b/gulpfile.ts @@ -0,0 +1,108 @@ +// import * as fs from 'fs'; +import * as gulp from 'gulp'; +import * as ts from 'gulp-typescript'; +import * as uglify from 'gulp-uglify'; +import * as typescript from 'typescript'; +// import SimpleMDE from './src2/simplemde2'; +// import * as browserify from 'gulp' +// import * as cleanCSS from 'gulp-clean-css'; +// import * as header from 'gulp-header'; +// import * as rename from 'gulp-rename'; +// import * as browserify from 'browserify'; + +// var gulp = require('gulp'), +const cleanCSS = require('gulp-clean-css'); +// uglify = require('gulp-uglify'), +const concat = require('gulp-concat'), + header = require('gulp-header'), + buffer = require('vinyl-buffer'), + pkg = require('./package.json'), + eslint = require('gulp-eslint'), + browserify = require('browserify'), + source = require('vinyl-source-stream'), + rename = require('gulp-rename'); + +const banner = ['/**', + ' * <%= pkg.name %> v<%= pkg.version %>', + ' * Copyright <%= pkg.author %>', + ' * @link <%= pkg.repository.url %>', + ' * @license <%= pkg.license %>', + ' */', + ''].join('\n'); + +function lintJavascript() { + gulp.src('./src/js/**/*.js') + .pipe(eslint()) + .pipe(eslint.format()) + .pipe(eslint.failAfterError()); +} + +gulp.task('lint', lintJavascript); + +function buildJavascript() { + return browserify({entries: './src/js/easymde.js', standalone: 'EasyMDE'}).bundle() + .pipe(source('easymde.min.js')) + .pipe(buffer()) + .pipe(uglify()) + .pipe(header(banner, {pkg})) + .pipe(gulp.dest('dist')); +} + +gulp.task('scripts', gulp.series(lintJavascript, buildJavascript)); + +function buildStyles() { + const cssFiles = [ + './node_modules/codemirror/lib/codemirror.css', + './src/css/*.css', + './node_modules/codemirror-spell-checker/src/css/spell-checker.css', + ]; + + return gulp.src(cssFiles) + .pipe(concat('easymde.css')) + .pipe(cleanCSS()) + .pipe(rename('easymde.min.css')) + .pipe(buffer()) + .pipe(header(banner, {pkg})) + .pipe(gulp.dest('dist')); +} + +gulp.task('styles', buildStyles); + +gulp.task('default', gulp.parallel(buildStyles, buildJavascript)); + +function compileTypescript() { + let failed = false; + const tsProject = ts.createProject('tsconfig.json', {typescript}); + return gulp.src('src/ts/**/*.ts') + .pipe(tsProject()) + .on('error', () => { + failed = true; + }) + .on('finish', () => { + if (failed) { + process.exit(1); + } + }) + .pipe(gulp.dest('build')); +} + +function buildTypescript() { + return browserify(['build/newmde.js'], {standalone: 'NewMDE'}) + // return browserify(['build/index.js'], {standalone: 'Test'}) + // return browserify(['build/test.js'], {standalone: 'Test'}) + // .plugin('tsify', {project: 'tsconfig.json'}) + .bundle() + .pipe(source('newmde.min.js')) + .pipe(buffer()) + .pipe(uglify()) + .pipe(header(banner, {pkg})) + .pipe(gulp.dest('dist')); +} + +gulp.task('build', gulp.series(compileTypescript, buildTypescript)); +// return browserify({entries: './src/js/easymde.js', standalone: 'EasyMDE'}).bundle() +// .pipe(source('easymde.min.js')) +// .pipe(buffer()) +// .pipe(uglify()) +// .pipe(header(banner, {pkg})) +// .pipe(gulp.dest('./dist/')); diff --git a/package-lock.json b/package-lock.json index 1b7aafb..6efd0b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,205 @@ { "name": "easymde", - "version": "2.2.2", + "version": "3.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/browserify": { + "version": "12.0.33", + "resolved": "https://registry.npmjs.org/@types/browserify/-/browserify-12.0.33.tgz", + "integrity": "sha512-mY6dYfq1Ns3Xqz/JFUcyoWaXtm0XDoNhkU1vCwM/ULM5zqNL+SbtacJhce/JCgPeCdbqdVqq77tJ4HwdtypSxg==", + "dev": true, + "requires": { + "@types/insert-module-globals": "*", + "@types/node": "*" + } + }, + "@types/chokidar": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@types/chokidar/-/chokidar-1.7.5.tgz", + "integrity": "sha512-PDkSRY7KltW3M60hSBlerxI8SFPXsO3AL/aRVsO4Kh9IHRW74Ih75gUuTd/aE4LSSFqypb10UIX3QzOJwBQMGQ==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/node": "*" + } + }, + "@types/codemirror": { + "version": "0.0.58", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.58.tgz", + "integrity": "sha512-z74f1e0zqxJ8xrss10bsrjnoJZHE4zDkC8Q7ACw82gr6e4ILSUe0GNifNg1uIaSbR3UQf5sqHJO8vn9GQLFKbA==", + "dev": true + }, + "@types/events": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", + "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", + "dev": true + }, + "@types/glob": { + "version": "5.0.35", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz", + "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-RHv6ZQjcTncXo3thYZrsbAVwoy4vSKosSWhuhuQxLOTv74OJuFQxXkmUuZCr3q9uNBEVCvIzmZL/FeRNbHZGUg==", + "dev": true, + "requires": { + "@types/glob": "*", + "@types/node": "*" + } + }, + "@types/gulp": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/gulp/-/gulp-4.0.5.tgz", + "integrity": "sha512-nx1QjPTiRpvLfYsZ7MBu7bT6Cm7tAXyLbY0xbdx2IEMxCK2v2urIhJMQZHW0iV1TskM71Xl6p2uRRuWDbk+/7g==", + "dev": true, + "requires": { + "@types/chokidar": "*", + "@types/undertaker": "*", + "@types/vinyl-fs": "*" + } + }, + "@types/gulp-concat": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/gulp-concat/-/gulp-concat-0.0.32.tgz", + "integrity": "sha512-CUCFADlITzzBfBa2bdGzhKtvBr4eFh+evb+4igVbvPoO5RyPfHifmyQlZl6lM7q19+OKncRlFXDU7B4X9Ayo2g==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/gulp-rename": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/gulp-rename/-/gulp-rename-0.0.33.tgz", + "integrity": "sha512-FIZQvbZJj6V1gHPTzO+g/BCWpDur7fJrroae4gwV3LaoHBQ+MrR9sB+2HssK8fHv4WdY6hVNxkcft9bYatuPIA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/gulp-uglify": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/gulp-uglify/-/gulp-uglify-3.0.5.tgz", + "integrity": "sha512-LD2b6gCPugrKI1W188nIp0gm+cAnGGwaTFpPdeZYVXwPHdoCQloy3du0JR62MeMjAwUwlcOb+SKYT6Qgw7yBiA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/uglify-js": "^2" + } + }, + "@types/highlight.js": { + "version": "9.12.3", + "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.3.tgz", + "integrity": "sha512-pGF/zvYOACZ/gLGWdQH8zSwteQS1epp68yRcVLJMgUck/MjEn/FBYmPub9pXT8C1e4a8YZfHo1CKyV8q1vKUnQ==", + "dev": true + }, + "@types/insert-module-globals": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/insert-module-globals/-/insert-module-globals-7.0.0.tgz", + "integrity": "sha512-zudCJPwluh1VUDB6Gl/OQdRp+fYy3+47huJB/JMQubMS2p+sH18MCVK4WUz3FqaWLB12yh5ELxVR/+tqwlm/qA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/marked": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.4.0.tgz", + "integrity": "sha512-xkURX55US18wHme+O2UlqJf3Fo7FqT5VAL+OJ/zK+jP2NX57naryDHoiqt/pMIwZjDc62sRvXUWuQQxQiBdheQ==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.1.tgz", + "integrity": "sha512-AFLl1IALIuyt6oK4AYZsgWVJ/5rnyzQWud7IebaZWWV3YmgtPZkQmYio9R5Ze/2pdd7XfqF5bP+hWS11mAKoOQ==", + "dev": true + }, + "@types/uglify-js": { + "version": "2.6.31", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-2.6.31.tgz", + "integrity": "sha512-LjcyGt6CHsgZ0AoofnMwhyxo9hUqz2mgl6IcF+S8B1zdSTxHAvTO/1RPvBAHG3C1ZeAc+AoWA5mb3lDJKtM9Zg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/undertaker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/undertaker/-/undertaker-1.2.0.tgz", + "integrity": "sha512-bx/5nZCGkasXs6qaA3B6SVDjBZqdyk04UO12e0uEPSzjt5H8jEJw0DKe7O7IM0hM2bVHRh70pmOH7PEHqXwzOw==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/undertaker-registry": "*" + } + }, + "@types/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha512-Z4TYuEKn9+RbNVk1Ll2SS4x1JeLHecolIbM/a8gveaHsW0Hr+RQMraZACwTO2VD7JvepgA6UO1A1VrbktQrIbQ==", + "dev": true + }, + "@types/vinyl": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.2.tgz", + "integrity": "sha512-2iYpNuOl98SrLPBZfEN9Mh2JCJ2EI9HU35SfgBEb51DcmaHkhp8cKMblYeBqMQiwXMgAD3W60DbQ4i/UdLiXhw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/vinyl-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/vinyl-buffer/-/vinyl-buffer-1.0.0.tgz", + "integrity": "sha512-ZVi/FtaFLx+sBvNFVB27joPf6+hX3AMYhO6KZMG3HsaNx4WGFfNxWYFcr4yZLiya4uyHCOe0r4zRX1QJIjJq2A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/vinyl-fs": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-2.4.8.tgz", + "integrity": "sha512-yE2pN9OOrxJVeO7IZLHAHrh5R4Q0osbn5WQRuQU6GdXoK7dNFrMK3K7YhATkzf3z0yQBkol3+gafs7Rp0s7dDg==", + "dev": true, + "requires": { + "@types/glob-stream": "*", + "@types/node": "*", + "@types/vinyl": "*" + } + }, + "@types/vinyl-source-stream": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/vinyl-source-stream/-/vinyl-source-stream-0.0.30.tgz", + "integrity": "sha512-RbIEp1V45sf2qQdYKddnn68rak3MwFclG8lqRgSDIrxNnDc74P3tMXLy26vj5zSI832K65dhwTwr2cNp5Gqpuw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "JSONStream": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", @@ -21,18 +217,18 @@ "dev": true }, "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", + "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", "dev": true, "requires": { - "acorn": "^3.0.4" + "acorn": "^5.0.3" }, "dependencies": { "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", "dev": true } } @@ -56,21 +252,21 @@ } }, "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", + "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" } }, "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", "dev": true }, "ansi-colors": { @@ -828,23 +1024,24 @@ "dev": true }, "chokidar": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", - "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", "dev": true, "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.0", "braces": "^2.3.0", - "fsevents": "^1.1.2", + "fsevents": "^1.2.2", "glob-parent": "^3.1.0", "inherits": "^2.0.1", "is-binary-path": "^1.0.0", "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", "normalize-path": "^2.1.1", "path-is-absolute": "^1.0.0", "readdirp": "^2.0.0", - "upath": "^1.0.0" + "upath": "^1.0.5" } }, "cipher-base": { @@ -950,12 +1147,6 @@ "readable-stream": "^2.3.5" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -1030,9 +1221,9 @@ } }, "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", + "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==", "dev": true }, "component-emitter": { @@ -1157,12 +1348,14 @@ } }, "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "lru-cache": "^4.0.1", + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } @@ -1362,6 +1555,12 @@ "minimist": "^1.1.1" } }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -1444,18 +1643,42 @@ } }, "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, "es5-ext": { - "version": "0.10.42", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", - "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", + "version": "0.10.45", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", + "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", "dev": true, "requires": { "es6-iterator": "~2.0.3", @@ -1503,49 +1726,49 @@ "dev": true }, "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.0.1.tgz", + "integrity": "sha512-D5nG2rErquLUstgUaxJlWB5+gu+U/3VDY0fk/Iuq8y9CUFy/7Y6oF4N2cR1tV8knzQvciIbfqfohd359xTLIKQ==", "dev": true, "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", + "ajv": "^6.5.0", + "babel-code-frame": "^6.26.0", "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", + "cross-spawn": "^6.0.5", "debug": "^3.1.0", "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", + "eslint-scope": "^4.0.0", "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^2.0.0", "functional-red-black-tree": "^1.0.1", "glob": "^7.1.2", - "globals": "^11.0.1", + "globals": "^11.5.0", "ignore": "^3.3.3", "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", + "inquirer": "^5.2.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.11.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", "path-is-inside": "^1.0.2", "pluralize": "^7.0.0", "progress": "^2.0.0", - "regexpp": "^1.0.1", + "regexpp": "^1.1.0", "require-uncached": "^1.0.3", - "semver": "^5.3.0", + "semver": "^5.5.0", + "string.prototype.matchall": "^2.0.0", "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" + "strip-json-comments": "^2.0.1", + "table": "^4.0.3", + "text-table": "^0.2.0" }, "dependencies": { "ansi-regex": { @@ -1575,9 +1798,9 @@ } }, "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -1591,19 +1814,19 @@ "dev": true }, "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", + "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", "dev": true, "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "acorn": "^5.6.0", + "acorn-jsx": "^4.1.1" }, "dependencies": { "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", "dev": true } } @@ -1819,9 +2042,9 @@ } }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, "fast-json-stable-stringify": { @@ -2641,9 +2864,9 @@ } }, "globals": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", - "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", "dev": true }, "globby": { @@ -2739,14 +2962,14 @@ } }, "gulp-eslint": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-4.0.2.tgz", - "integrity": "sha512-fcFUQzFsN6dJ6KZlG+qPOEkqfcevRUXgztkYCvhNvJeSvOicC8ucutN4qR/ID8LmNZx9YPIkBzazTNnVvbh8wg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-5.0.0.tgz", + "integrity": "sha512-9GUqCqh85C7rP9120cpxXuZz2ayq3BZc85pCTuPJS03VQYxne0aWPIXWx6LSvsGPa3uRqtSO537vaugOh+5cXg==", "dev": true, "requires": { - "eslint": "^4.0.0", + "eslint": "^5.0.1", "fancy-log": "^1.3.2", - "plugin-error": "^1.0.0" + "plugin-error": "^1.0.1" } }, "gulp-header": { @@ -2761,11 +2984,39 @@ } }, "gulp-rename": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.3.tgz", - "integrity": "sha512-CmdPM0BjJ105QCX1fk+j7NGhiN/1rCl9HLGss+KllBS/tdYadpjTxqdKyh/5fNV+M3yjT1MFz5z93bXdrTyzAw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.3.0.tgz", + "integrity": "sha512-nEuZB7/9i0IZ8AXORTizl2QLP9tcC9uWc/s329zElBLJw1CfOhmMXBxwVlCRKjDyrWuhVP0uBKl61KeQ32TiCg==", "dev": true }, + "gulp-typescript": { + "version": "5.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-5.0.0-alpha.3.tgz", + "integrity": "sha512-6iSBjqBXAUqRsLUh/9XtlOnSzpPMbLrr5rqGj4UPLtGpDwFHW/fVTuRgv6LAWiKesLIUDDM0ourxvcpu2trecQ==", + "dev": true, + "requires": { + "ansi-colors": "^2.0.2", + "plugin-error": "^1.0.1", + "source-map": "^0.7.3", + "through2": "^2.0.3", + "vinyl": "^2.1.0", + "vinyl-fs": "^3.0.3" + }, + "dependencies": { + "ansi-colors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-2.0.2.tgz", + "integrity": "sha512-lqxzclDUlcMM72ab/b4imVvMCyO+jELG+a5DPuE2qFAwGkzQilb6iEgzQPhSmNCM7onBHsq/9Mggh4HaqilTlA==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, "gulp-uglify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.0.tgz", @@ -2881,6 +3132,11 @@ "minimalistic-assert": "^1.0.0" } }, + "highlight.js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz", + "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=" + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -2902,9 +3158,9 @@ } }, "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.1.tgz", + "integrity": "sha512-Ba4+0M4YvIDUUsprMjhVTU1yN9F2/LJSAl69ZpzaLT4l4j5mwTS6jqqW9Ojvj6lKz/veqPzpJBqGbXspOb533A==", "dev": true }, "htmlescape": { @@ -2935,9 +3191,9 @@ "dev": true }, "ignore": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", - "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, "imurmurhash": { @@ -2978,22 +3234,21 @@ } }, "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", "dev": true, "requires": { "ansi-escapes": "^3.0.0", "chalk": "^2.0.0", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "external-editor": "^2.0.4", + "external-editor": "^2.1.0", "figures": "^2.0.0", "lodash": "^4.3.0", "mute-stream": "0.0.7", "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", + "rxjs": "^5.5.2", "string-width": "^2.1.0", "strip-ansi": "^4.0.0", "through": "^2.3.6" @@ -3121,6 +3376,12 @@ "builtin-modules": "^1.0.0" } }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -3141,6 +3402,12 @@ } } }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -3216,23 +3483,6 @@ } } }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -3272,6 +3522,15 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, "is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", @@ -3287,6 +3546,12 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, "is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -3349,9 +3614,9 @@ } }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify": { @@ -3509,6 +3774,12 @@ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, "lodash.memoize": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", @@ -3534,16 +3805,6 @@ "lodash._reinterpolate": "~3.0.0" } }, - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, "make-error": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", @@ -3761,9 +4022,9 @@ "optional": true }, "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { "arr-diff": "^4.0.0", @@ -3771,7 +4032,6 @@ "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "fragment-cache": "^0.2.1", - "is-odd": "^2.0.0", "is-windows": "^1.0.2", "kind-of": "^6.0.2", "object.pick": "^1.3.0", @@ -3792,6 +4052,12 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "dev": true + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -4088,6 +4354,12 @@ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, "path-parse": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", @@ -4214,12 +4486,6 @@ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "public-encrypt": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", @@ -4367,6 +4633,15 @@ "safe-regex": "^1.1.0" } }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2" + } + }, "regexpp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", @@ -4535,19 +4810,13 @@ "is-promise": "^2.1.0" } }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "rxjs": { + "version": "5.5.11", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", + "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", "dev": true, "requires": { - "rx-lite": "*" + "symbol-observable": "1.0.1" } }, "safe-buffer": { @@ -4817,6 +5086,24 @@ "urix": "^0.1.0" } }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", @@ -4969,6 +5256,19 @@ "strip-ansi": "^3.0.0" } }, + "string.prototype.matchall": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-2.0.0.tgz", + "integrity": "sha512-WoZ+B2ypng1dp4iFLF2kmZlwwlE19gmjgKuhL1FJfDgCREWb3ye3SDVHSzLH6bxfnvYmkCxbzkmWcQZHA4P//Q==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.10.0", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "regexp.prototype.flags": "^1.2.0" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -5027,6 +5327,12 @@ "es6-symbol": "^3.1.1" } }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, "syntax-error": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", @@ -5037,13 +5343,13 @@ } }, "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", "dev": true, "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", "chalk": "^2.1.0", "lodash": "^4.17.4", "slice-ansi": "1.0.0", @@ -5206,6 +5512,65 @@ "through2": "^2.0.3" } }, + "ts-node": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.0.tgz", + "integrity": "sha512-klJsfswHP0FuOLsvBZ/zzCfUvakOSSxds78mVeK7I+qP76YWtxf16hEZsp3U+b0kIo82R5UatGFeblYMqabb2Q==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "dependencies": { + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "dev": true + } + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tslint": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.10.0.tgz", + "integrity": "sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM=", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.12.1" + } + }, + "tsutils": { + "version": "2.27.2", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.2.tgz", + "integrity": "sha512-qf6rmT84TFMuxAKez2pIfR8UCai49iQsfB7YWVjV1bKpy/d0PWT5rEOSM6La9PiHZ0k1RRZQiwVdVJfQ3BPHgg==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", @@ -5227,18 +5592,24 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "dev": true + }, "typo-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.0.3.tgz", "integrity": "sha1-VNjrx5SfGngQkItgAsaEFSbJnVo=" }, "uglify-js": { - "version": "3.3.25", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.25.tgz", - "integrity": "sha512-hobogryjDV36VrLK3Y69ou4REyrTApzUblVFmdQOYRe8cYaSmFJXMb4dR9McdvYDSbeNdzUgYr2YVukJaErJcA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.3.tgz", + "integrity": "sha512-RbOgGjF04sFUNSi8xGOTB9AmtVmMmVVAL5a7lxIgJ8urejJen+priq0ooRIHHa8AXI/dSvNF9yYMz9OP4PhybQ==", "dev": true, "requires": { - "commander": "~2.15.0", + "commander": "~2.16.0", "source-map": "~0.6.1" }, "dependencies": { @@ -5387,6 +5758,23 @@ "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", "dev": true }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -5444,9 +5832,9 @@ "dev": true }, "v8flags": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.0.tgz", - "integrity": "sha512-0m69VIK2dudEf2Ub0xwLQhZkDZu85OmiOpTw+UGDt56ibviYICHziM/3aE+oVg7IjGPp0c83w3eSVqa+lYZ9UQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz", + "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==", "dev": true, "requires": { "homedir-polyfill": "^1.0.1" @@ -5623,12 +6011,6 @@ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, "yargs": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", @@ -5658,6 +6040,12 @@ "requires": { "camelcase": "^3.0.0" } + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true } } } diff --git a/package.json b/package.json index af24e1a..eb10235 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "easymde", - "version": "2.2.2", + "version": "3.0.0", "description": "A simple, beautiful, and embeddable JavaScript Markdown editor that easy to use. Features include autosaving and spell checking.", "keywords": [ "embeddable", @@ -18,17 +18,32 @@ "dependencies": { "codemirror": "^5.39.0", "codemirror-spell-checker": "1.1.2", + "highlight.js": "^9.12.0", "marked": "^0.4.0" }, "devDependencies": { + "@types/browserify": "^12.0.33", + "@types/codemirror": "0.0.58", + "@types/gulp": "^4.0.5", + "@types/gulp-concat": "0.0.32", + "@types/gulp-rename": "0.0.33", + "@types/gulp-uglify": "^3.0.4", + "@types/highlight.js": "^9.12.2", + "@types/marked": "^0.4.0", + "@types/vinyl-buffer": "^1.0.0", + "@types/vinyl-source-stream": "0.0.30", "browserify": "^16.2.2", "gulp": "^4.0.0", "gulp-clean-css": "^3.9.4", "gulp-concat": "^2.6.1", - "gulp-eslint": "^4.0.0", + "gulp-eslint": "^5.0.0", "gulp-header": "^2.0.5", - "gulp-rename": "^1.2.3", + "gulp-rename": "^1.3.0", + "gulp-typescript": "^5.0.0-alpha.3", "gulp-uglify": "^3.0.0", + "ts-node": "^7.0.0", + "tslint": "^5.10.0", + "typescript": "^2.9.2", "vinyl-buffer": "^1.0.0", "vinyl-source-stream": "^2.0.0" }, diff --git a/src/ts/newmde.ts b/src/ts/newmde.ts new file mode 100644 index 0000000..796afe4 --- /dev/null +++ b/src/ts/newmde.ts @@ -0,0 +1,514 @@ +import * as cm from 'codemirror'; +import 'codemirror/addon/display/fullscreen'; +import * as hljs from 'highlight.js'; +import * as marked from 'marked'; + +interface IRenderingConfig { + markedOptions?: any; + singleLineBreaks?: any; + codeSyntaxHighlighting?: any; + hljs?: hljs.HLJSStatic; +} + +interface IOptions { + autoDownloadFontAwesome?: boolean | undefined; + renderingConfig?: IRenderingConfig | undefined; +} + +interface IToolBarButtonOptions { + action?: any; + icon: string; + name: string; + title: string; +} + +module.exports = class NewMDE { + + private static verifyAndReturnElement(element?: HTMLElement): HTMLTextAreaElement { + if (!element) { + throw new Error('SimpleMDE: Parameter "element" is null.'); + } + + if (!(element instanceof HTMLTextAreaElement)) { + throw new Error('SimpleMDE: Parameter "element" must be a TextArea.'); + } + + return element; + } + + private element: HTMLTextAreaElement; + private options: IOptions; + private codemirror: cm.EditorFromTextArea; + private toolBar: HTMLDivElement; + private rendered: boolean; + + private fullScreenActive = false; + private sideBySideActive = false; + + constructor(element?: HTMLElement, options: IOptions = {}) { + this.element = NewMDE.verifyAndReturnElement(element); + this.rendered = !!this.element.getAttribute('rendered'); + this.options = options; + this.codemirror = this.render(); + this.toolBar = this.createToolBar(); + } + + private markdown(text: string): string { + + console.log('Markdown!'); + + // Initialize with default options + let markedOptions: marked.MarkedOptions = { + breaks: true, + }; + + if (this.options.renderingConfig) { + if (this.options.renderingConfig.markedOptions !== undefined) { + markedOptions = this.options.renderingConfig.markedOptions; + } + + if (this.options.renderingConfig.singleLineBreaks !== undefined) { + markedOptions.breaks = this.options.renderingConfig.singleLineBreaks; + } + + if (this.options.renderingConfig.codeSyntaxHighlighting !== undefined) { + markedOptions.highlight = ((code: string) => hljs.highlightAuto(code).value); + } + } + + marked.setOptions(markedOptions); + + console.log(marked(text)); + + return marked(text); + } + + private render(): cm.EditorFromTextArea { + if (this.rendered) { + throw new Error(`SimpleMDE: Element with ID "${this.element.id}" is already a SimpleMDE instance.`); + // Already rendered. + // return; + } + + // var keyMaps = {}; + // + // for (var key in options.shortcuts) { + // // null stands for "do not bind this command" + // if (options.shortcuts[key] !== null && bindings[key] !== null) { + // (function (key) { + // keyMaps[fixShortcut(options.shortcuts[key])] = function () { + // bindings[key](self); + // }; + // })(key); + // } + // } + // + // keyMaps['Enter'] = 'newlineAndIndentContinueMarkdownList'; + // keyMaps['Tab'] = 'tabAndIndentMarkdownList'; + // keyMaps['Shift-Tab'] = 'shiftTabAndUnindentMarkdownList'; + // keyMaps['Esc'] = function (cm) { + // if (cm.getOption('fullScreen')) toggleFullScreen(self); + // }; + + const codemirror = cm.fromTextArea(this.element, { + // lineWrapping: (options.lineWrapping === false) ? false : true, + // allowDropFileTypes: ['text/plain'], + // indentWithTabs: (options.indentWithTabs === false) ? false : true, + lineNumbers: false, + // tabSize: (options.tabSize != undefined) ? options.tabSize : 2, + // indentUnit: (options.tabSize != undefined) ? options.tabSize : 2, + mode: { + gitHubSpice: false, + name: 'gfm', + }, + // autofocus: (options.autofocus === true) ? true : false, + // extraKeys: keyMaps, + placeholder: 'This is a thing!', + // backdrop: null, + theme: 'paper', + // styleSelectedText: (options.styleSelectedText != undefined) ? options.styleSelectedText : !isMobile(), + }); + codemirror.getScrollerElement().style.minHeight = '300px'; + + this.createSideBySide(codemirror); + + this.element.setAttribute('rendered', 'true'); + + return codemirror; + } + + private createSideBySide(codemirror: cm.EditorFromTextArea) { + const wrapper = codemirror.getWrapperElement(); + let preview = wrapper.nextElementSibling; + + if (!preview || !preview.classList.contains('editor-preview-side')) { + preview = document.createElement('div'); + preview.classList.add('editor-preview-side'); + if (wrapper.parentNode) { + wrapper.parentNode.insertBefore(preview, wrapper.nextSibling); + } else { + throw new Error('Wrapper has no parent node!'); + } + } + + if (!preview) { + throw new Error('Cannot find preview element!'); + } + + let cScroll = false; + let pScroll = false; + + // Syncs scroll editor -> preview + cm.on(codemirror, 'scroll', (v: cm.EditorFromTextArea) => { + preview = preview as HTMLDivElement; + if (cScroll) { + cScroll = false; + return; + } + pScroll = true; + const height = v.getScrollInfo().height - v.getScrollInfo().clientHeight; + const ratio = parseFloat(v.getScrollInfo().top) / height; + const move = (preview.scrollHeight - preview.clientHeight) * ratio; + preview.scrollTop = move; + }); + + (preview as HTMLDivElement).onscroll = () => { + preview = preview as HTMLDivElement; + if (pScroll) { + pScroll = false; + return; + } + cScroll = true; + const height = preview.scrollHeight - preview.clientHeight; + const ratio = preview.scrollTop / height; + const move = (this.codemirror.getScrollInfo().height - this.codemirror.getScrollInfo().clientHeight) * ratio; + this.codemirror.scrollTo(0, move); + }; + return preview; + } + + // SimpleMDE.prototype.createSideBySide = function () { + // var cm = this.codemirror; + // var wrapper = cm.getWrapperElement(); + // var preview = wrapper.nextSibling; + // + // if (!preview || !/editor-preview-side/.test(preview.className)) { + // preview = document.createElement('div'); + // preview.className = 'editor-preview-side'; + // wrapper.parentNode.insertBefore(preview, wrapper.nextSibling); + // } + // + // if (this.options.syncSideBySidePreviewScroll === false) return preview; + // // Syncs scroll editor -> preview + // var cScroll = false; + // var pScroll = false; + // cm.on('scroll', function (v) { + // if (cScroll) { + // cScroll = false; + // return; + // } + // pScroll = true; + // var height = v.getScrollInfo().height - v.getScrollInfo().clientHeight; + // var ratio = parseFloat(v.getScrollInfo().top) / height; + // var move = (preview.scrollHeight - preview.clientHeight) * ratio; + // preview.scrollTop = move; + // }); + // + // // Syncs scroll preview -> editor + // preview.onscroll = function () { + // if (pScroll) { + // pScroll = false; + // return; + // } + // cScroll = true; + // var height = preview.scrollHeight - preview.clientHeight; + // var ratio = parseFloat(preview.scrollTop) / height; + // var move = (cm.getScrollInfo().height - cm.getScrollInfo().clientHeight) * ratio; + // cm.scrollTo(0, move); + // }; + // return preview; + // }; + + private static toggleSideBySide(editor: NewMDE) { + console.log('s-by-s'); + const codeMirrorInstance = editor.codemirror; + const wrapper = codeMirrorInstance.getWrapperElement(); + const preview = wrapper.nextElementSibling; + if (!preview) { + throw new Error('Could not find element to render preview to!'); + } + preview.classList.toggle('editor-preview-active-side'); + editor.toggleToolBarButtonActive(editor.toolBar.getElementsByClassName('side-by-side')[0]); + + wrapper.classList.toggle('CodeMirror-sided'); + + const func = () => preview.innerHTML = editor.markdown(codeMirrorInstance.getValue()); + cm.on(codeMirrorInstance, 'update', func); + // preview.innerHTML = editor. + + if (!editor.fullScreenActive) { + // Side-by-side can only be shown in fullscreen. + NewMDE.toggleFullScreen(editor); + } + + editor.sideBySideActive = !editor.sideBySideActive; + } + + // function toggleSideBySide(editor) { + // var cm = editor.codemirror; + // var wrapper = cm.getWrapperElement(); + // var preview = wrapper.nextSibling; + // var toolbarButton = editor.toolbarElements['side-by-side']; + // var useSideBySideListener = false; + // if (/editor-preview-active-side/.test(preview.className)) { + // preview.className = preview.className.replace( + // /\s*editor-preview-active-side\s*/g, '' + // ); + // toolbarButton.className = toolbarButton.className.replace(/\s*active\s*/g, ''); + // wrapper.className = wrapper.className.replace(/\s*CodeMirror-sided\s*/g, ' '); + // } else { + // // When the preview button is clicked for the first time, + // // give some time for the transition from editor.css to fire and the view to slide from right to left, + // // instead of just appearing. + // setTimeout(function () { + // if (!cm.getOption('fullScreen')) + // toggleFullScreen(editor); + // preview.className += ' editor-preview-active-side'; + // }, 1); + // toolbarButton.className += ' active'; + // wrapper.className += ' CodeMirror-sided'; + // useSideBySideListener = true; + // } + // + // // Hide normal preview if active + // var previewNormal = wrapper.lastChild; + // if (/editor-preview-active/.test(previewNormal.className)) { + // previewNormal.className = previewNormal.className.replace( + // /\s*editor-preview-active\s*/g, '' + // ); + // var toolbar = editor.toolbarElements.preview; + // var toolbar_div = wrapper.previousSibling; + // toolbar.className = toolbar.className.replace(/\s*active\s*/g, ''); + // toolbar_div.className = toolbar_div.className.replace(/\s*disabled-for-preview*/g, ''); + // } + // + // var sideBySideRenderingFunction = function () { + // preview.innerHTML = editor.options.previewRender(editor.value(), preview); + // }; + // + // if (!cm.sideBySideRenderingFunction) { + // cm.sideBySideRenderingFunction = sideBySideRenderingFunction; + // } + // + // if (useSideBySideListener) { + // preview.innerHTML = editor.options.previewRender(editor.value(), preview); + // cm.on('update', cm.sideBySideRenderingFunction); + // } else { + // cm.off('update', cm.sideBySideRenderingFunction); + // } + // + // // Refresh to fix selection being off (#309) + // cm.refresh(); + // } + + private static toggleBold(_editor: NewMDE) { + console.log('Bold!'); + // _toggleBlock(editor, 'bold', editor.options.blockStyles.bold); + } + + private static toggleFullScreen(editor: NewMDE) { + editor.toolBar.classList.toggle('fullscreen'); + editor.codemirror.getWrapperElement().classList.toggle('CodeMirror-fullscreen'); + + editor.toggleToolBarButtonActive(editor.toolBar.getElementsByClassName('fullscreen')[0]); + + if (editor.fullScreenActive && editor.sideBySideActive) { + NewMDE.toggleSideBySide(editor); + } + + editor.fullScreenActive = !editor.fullScreenActive; + } + + private toggleToolBarButtonActive(buttonElement: Element | undefined) { + if (buttonElement) { + buttonElement.classList.toggle('active'); + } + } + + private togglePreview(_editor: NewMDE) { + console.log('Preview!'); + console.log(this); + } + + private undo(editor: NewMDE) { + editor.codemirror.execCommand('undo'); + } + + private redo(editor: NewMDE) { + editor.codemirror.execCommand('redo'); + } + + private createToolBar(): HTMLDivElement { + const defaultToolBarLayout: IToolBarButtonOptions[][] = [ + [{ + action: NewMDE.toggleBold, + icon: 'fa fa-bold', + name: 'bold', + title: 'Bold', + }, { + // action: toggleItalic, + icon: 'fa fa-italic', + name: 'italic', + title: 'Italic', + }, { + // action: toggleStrikethrough, + icon: 'fa fa-strikethrough', + name: 'strikethrough', + title: 'Strikethrough', + }, { + // action: toggleHeadingSmaller, + icon: 'fa fa-header fa-heading', + name: 'heading', + title: 'Heading', + }], [{ + // action: toggleCodeBlock, + icon: 'fa fa-code', + name: 'code', + title: 'Code', + }, { + // action: toggleBlockquote, + icon: 'fa fa-quote-left', + name: 'quote', + title: 'Quote', + }, { + // action: toggleUnorderedList, + icon: 'fa fa-list-ul', + name: 'unordered-list', + title: 'Generic List', + }, { + // action: toggleOrderedList, + icon: 'fa fa-list-ol', + name: 'ordered-list', + title: 'Numbered List', + }, { + // action: cleanBlock, + icon: 'fa fa-eraser fa-clean-block', + name: 'clean-block', + title: 'Clean block', + }], [{ + // action: drawLink, + icon: 'fa fa-link', + name: 'link', + title: 'Create Link', + }, { + // action: drawImage, + icon: 'fa fa-image', + name: 'image', + title: 'Insert Image', + }, { + // action: drawHorizontalRule, + icon: 'fa fa-minus', + name: 'horizontal-rule', + title: 'Insert Horizontal Line', + }], [{ + action: this.togglePreview, + icon: 'fa fa-eye', + name: 'preview', + // noDisable: true, + // noMobile: true, + title: 'Toggle Preview', + }, { + action: NewMDE.toggleSideBySide, + icon: 'fa fa-columns', + name: 'side-by-side', + // noDisable: true, + // noMobile: true, + title: 'Toggle Side by Side', + }, { + action: NewMDE.toggleFullScreen, + icon: 'fa fa-arrows-alt', + name: 'fullscreen', + // noDisable: true, + // noMobile: true, + title: 'Toggle Fullscreen', + }], [{ + action: 'https://simplemde.com/markdown-guide', + icon: 'fa fa-question-circle', + name: 'guide', + // noDisable: true, + title: 'Markdown Guide', + }], [{ + action: this.undo, + icon: 'fa fa-undo', + name: 'undo', + // noDisable: true, + title: 'Undo', + }, { + action: this.redo, + icon: 'fa fa-repeat', + name: 'redo', + // noDisable: true, + title: 'Redo', + }], + ]; + + const toolBar = document.createElement('div'); + toolBar.className = 'editor-toolbar'; + + for (const toolBarButtonSection of defaultToolBarLayout) { + const toolBarSection: HTMLElement[] = []; + + for (const toolBarButtonOptions of toolBarButtonSection) { + toolBarSection.push(this.createToolBarButton(toolBarButtonOptions)); + } + + // Create a separator if this is not the last toolbar section. + if (defaultToolBarLayout.indexOf(toolBarButtonSection) !== (defaultToolBarLayout.length - 1)) { + toolBarSection.push(this.createToolBarSeparator()); + } + + for (const toolBarEntry of toolBarSection) { + toolBar.appendChild(toolBarEntry); + } + } + + // Add the toolbar to the editor. + const cmWrapper = this.codemirror.getWrapperElement(); + if (cmWrapper.parentNode) { + cmWrapper.parentNode.insertBefore(toolBar, cmWrapper); + } + + return toolBar; + } + + private createToolBarButton(toolBarButtonOptions: IToolBarButtonOptions): HTMLButtonElement { + const buttonElement: HTMLButtonElement = document.createElement('button'); + buttonElement.tabIndex = -1; + buttonElement.classList.add(toolBarButtonOptions.name); + + // Set the button tooltip. + buttonElement.title = toolBarButtonOptions.title; + + // Set the button onclick action. + if (typeof toolBarButtonOptions.action === 'function') { + buttonElement.onclick = () => toolBarButtonOptions.action(this); + // buttonElement.addEventListener() + } else if (typeof toolBarButtonOptions.action === 'string') { + buttonElement.onclick = () => window.open(toolBarButtonOptions.action); + } + + // Set the button icon. + const buttonIcon = document.createElement('i'); + buttonIcon.className = toolBarButtonOptions.icon; + + buttonElement.appendChild(buttonIcon); + return buttonElement; + } + + private createToolBarSeparator() { + const separatorElement = document.createElement('span'); + separatorElement.className = 'separator'; + separatorElement.innerHTML = '|'; + return separatorElement; + } +}; diff --git a/src/ts/tablist.ts b/src/ts/tablist.ts new file mode 100644 index 0000000..88e5043 --- /dev/null +++ b/src/ts/tablist.ts @@ -0,0 +1,41 @@ +// import * as CodeMirror from 'codemirror'; +// +// CodeMirror.commands.tabAndIndentMarkdownList = (cm: any) => { +// let ranges = cm.listSelections(); +// let pos = ranges[0].head; +// let eolState = cm.getStateAfter(pos.line); +// let inList = eolState.list !== false; +// +// if (inList) { +// cm.execCommand('indentMore'); +// return; +// } +// +// if (cm.options.indentWithTabs) { +// cm.execCommand('insertTab'); +// } +// else { +// let spaces = Array(cm.options.tabSize + 1).join(' '); +// cm.replaceSelection(spaces); +// } +// }; +// +// CodeMirror.commands.shiftTabAndUnindentMarkdownList = (cm: any) => { +// let ranges = cm.listSelections(); +// let pos = ranges[0].head; +// let eolState = cm.getStateAfter(pos.line); +// let inList = eolState.list !== false; +// +// if (inList) { +// cm.execCommand('indentLess'); +// return; +// } +// +// if (cm.options.indentWithTabs) { +// cm.execCommand('insertTab'); +// } +// else { +// let spaces = Array(cm.options.tabSize + 1).join(' '); +// cm.replaceSelection(spaces); +// } +// }; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8f01964 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "baseUrl": "", + "declaration": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noFallthroughCasesInSwitch": true, + "lib": [ + "es5", + "es6", + "dom" + ], + "moduleResolution": "node", + "outDir": "./dist", + "target": "es5", + "typeRoots": [ + "./node_modules/@types" + ] + }, + "exclude": [ + "node_modules", + "src/**/*.spec.ts" + ], + "include": [ + "src/**/*.ts" + ] +} diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..b9e0730 --- /dev/null +++ b/tslint.json @@ -0,0 +1,37 @@ +{ + "defaultSeverity": "error", + "extends": [ + "tslint:latest" + ], + "rules": { + "max-line-length": [ + true, + 140 + ], + "no-unused-expression": [ + true, + "allow-new" + ], + "quotemark": [ + true, + "single" + ], + "trailing-comma": [ + true, + { + "multiline": "always", + "singleline": "never" + } + ], + "variable-name": [ + true, + "ban-keywords", + "check-format", + "allow-leading-underscore" + ], + "no-submodule-imports": [ + true, + "codemirror/addon" + ] + } +}