diff --git a/client/js/components/copy-path.vue b/client/js/components/copy-path.vue new file mode 100644 index 00000000..86567a54 --- /dev/null +++ b/client/js/components/copy-path.vue @@ -0,0 +1,17 @@ + + + diff --git a/client/js/pages/view.js b/client/js/pages/view.js index 72c07f42..bde05222 100644 --- a/client/js/pages/view.js +++ b/client/js/pages/view.js @@ -1,12 +1,23 @@ 'use strict' +/* eslint-disable no-new */ + import $ from 'jquery' import MathJax from 'mathjax' +import * as CopyPath from '../components/copy-path.vue' +import Vue from 'vue' module.exports = (alerts) => { if ($('#page-type-view').length) { let currentBasePath = ($('#page-type-view').data('entrypath') !== 'home') ? $('#page-type-view').data('entrypath') : '' + // Copy Path + + new Vue({ + el: '.modal-copypath', + render: h => h(CopyPath) + }) + // MathJax Render MathJax.Hub.Config({ diff --git a/fuse.js b/fuse.js index 8711dcc2..908b9679 100644 --- a/fuse.js +++ b/fuse.js @@ -188,11 +188,12 @@ globalTasks.then(() => { fuse = fsbx.FuseBox.init({ homeDir: './client', - outFile: './assets/js/bundle.min.js', + output: './assets/js/$name.min.js', alias: ALIASES, shim: SHIMS, plugins: [ - [ fsbx.SassPlugin({ includePaths: ['../core'] }), fsbx.CSSPlugin() ], + fsbx.VuePlugin(), + [ '.scss', fsbx.SassPlugin(), fsbx.CSSPlugin() ], fsbx.BabelPlugin({ comments: false, presets: ['es2015'] }), fsbx.JSONPlugin() ], @@ -200,15 +201,16 @@ globalTasks.then(() => { log: true }) - fuse.devServer('>index.js', { + fuse.dev({ port: 4444, - httpServer: false, - hmr: false + httpServer: false }) - // Server + fuse.bundle('bundle') + .instructions('> index.js') + .watch() - _.delay(() => { + fuse.run().then(() => { nodemon({ exec: (args.i) ? 'node --inspect server' : 'node server', ignore: ['assets/', 'client/', 'data/', 'repo/', 'tests/'], @@ -216,7 +218,8 @@ globalTasks.then(() => { watch: ['server'], env: { 'NODE_ENV': 'development' } }) - }, 1000) + }) + break // ============================================= // CONFIGURE - DEVELOPER MODE @@ -226,11 +229,11 @@ globalTasks.then(() => { fuse = fsbx.FuseBox.init({ homeDir: './client', - outFile: './assets/js/configure.min.js', + output: './assets/js/$name.min.js', alias: ALIASES, shim: SHIMS, plugins: [ - [ fsbx.SassPlugin({ includePaths: ['../core'] }), fsbx.CSSPlugin() ], + [ '.scss', fsbx.SassPlugin(), fsbx.CSSPlugin() ], fsbx.BabelPlugin({ comments: false, presets: ['es2015'] }), fsbx.JSONPlugin() ], @@ -238,14 +241,16 @@ globalTasks.then(() => { log: true }) - fuse.devServer('>configure.js', { + fuse.dev({ port: 4444, httpServer: false }) - // Server + fuse.bundle('configure') + .instructions('> configure.js') + .watch() - _.delay(() => { + fuse.run().then(() => { nodemon({ exec: 'node wiki configure', ignore: ['assets/', 'client/', 'data/', 'repo/', 'tests/'], @@ -253,7 +258,8 @@ globalTasks.then(() => { watch: ['server/configure.js'], env: { 'NODE_ENV': 'development' } }) - }, 1000) + }) + break // ============================================= // BUILD ONLY MODE @@ -261,11 +267,13 @@ globalTasks.then(() => { case 'build': fuse = fsbx.FuseBox.init({ homeDir: './client', + output: './assets/js/$name.min.js', alias: ALIASES, shim: SHIMS, plugins: [ fsbx.EnvPlugin({ NODE_ENV: 'production' }), - [ fsbx.SassPlugin({ outputStyle: 'compressed', includePaths: ['./node_modules/requarks-core'] }), fsbx.CSSPlugin() ], + fsbx.VuePlugin(), + [ '.scss', fsbx.SassPlugin({ outputStyle: 'compressed' }), fsbx.CSSPlugin() ], fsbx.BabelPlugin({ config: { comments: false, @@ -282,10 +290,10 @@ globalTasks.then(() => { log: true }) - fuse.bundle({ - './assets/js/bundle.min.js': '>index.js', - './assets/js/configure.min.js': '>configure.js' - }).then(() => { + fuse.bundle('bundle').instructions('> index.js') + fuse.bundle('configure').instructions('> configure.js') + + fuse.run().then(() => { console.info(colors.green.bold('\nAssets compilation + bundling completed.')) }).catch(err => { console.error(colors.red(' X Bundle compilation failed! ' + err.message)) diff --git a/package.json b/package.json index 08352ff4..570847df 100644 --- a/package.json +++ b/package.json @@ -134,7 +134,7 @@ "eslint-plugin-node": "latest", "eslint-plugin-promise": "latest", "eslint-plugin-standard": "latest", - "fuse-box": "^1.3.131", + "fuse-box": "^2.0.0-beta.13", "jest": "latest", "jquery": "^3.2.1", "jquery-contextmenu": "^2.4.4", @@ -148,9 +148,11 @@ "snyk": "latest", "standard": "latest", "twemoji-awesome": "^1.0.6", + "typescript": "^2.3.2", "uglify-js": "latest", "vee-validate": "^2.0.0-rc.2", - "vue": "^2.3.0" + "vue": "^2.3.2", + "vue-template-compiler": "^2.3.2" }, "standard": { "globals": [ diff --git a/server/libs/markdown.js b/server/libs/markdown.js index 101c2587..012b2e0a 100644 --- a/server/libs/markdown.js +++ b/server/libs/markdown.js @@ -112,10 +112,10 @@ const parseTree = (content) => { let content = '' let anchor = '' if (heading.children && heading.children.length > 0 && heading.children[0].type === 'link_open') { - content = removeMarkdown(heading.children[1].content) + content = mdRemove(heading.children[1].content) anchor = _.kebabCase(content) } else { - content = removeMarkdown(heading.content) + content = mdRemove(heading.content) anchor = _.kebabCase(heading.children.reduce((acc, t) => acc + t.content, '')) } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..68aba21a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "allowJs": true, + "alwaysStrict": true, + "module": "commonjs", + "moduleResolution": "node", + "noImplicitAny": true, + "preserveConstEnums": true, + "removeComments": true, + "sourceMap": false, + "strictNullChecks": true, + "suppressImplicitAnyIndexErrors": true, + "target": "es5" + } +} diff --git a/yarn.lock b/yarn.lock index 014c6cb7..b3f8765d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -273,12 +273,18 @@ async@1.5, async@^1.4.0, async@^1.5, async@~1.5: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@2.1.4, async@^2.1.4: +async@2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" dependencies: lodash "^4.14.0" +async@^2.1.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.4.0.tgz#4990200f18ea5b837c2cc4f8c031a6985c385611" + dependencies: + lodash "^4.14.0" + async@~0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" @@ -1490,6 +1496,10 @@ dashdash@^1.12.0, dashdash@^1.14.0: dependencies: assert-plus "^1.0.0" +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + debug-log@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" @@ -1851,10 +1861,14 @@ es6-map@^0.1.3: es6-symbol "~3.1.1" event-emitter "~0.3.5" -es6-promise@3.2.1, es6-promise@^3.0.2, es6-promise@^3.1.2: +es6-promise@3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4" +es6-promise@^3.0.2, es6-promise@^3.1.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + es6-set@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" @@ -2434,8 +2448,8 @@ fs-extra@^2.0.0: jsonfile "^2.1.0" fs-extra@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.0.tgz#244e0c4b0b8818f54040ec049d8a2bddc1202861" + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" dependencies: graceful-fs "^4.1.2" jsonfile "^3.0.0" @@ -2481,9 +2495,9 @@ functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" -fuse-box@^1.3.131: - version "1.3.131" - resolved "https://registry.yarnpkg.com/fuse-box/-/fuse-box-1.3.131.tgz#8325ae47236139aad6b2cbe92a4a5fafea3063c6" +fuse-box@^2.0.0-beta.13: + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/fuse-box/-/fuse-box-2.0.0-beta.13.tgz#b30651dbe199f6297cdbe8a6e1907329dc73fd0c" dependencies: acorn "^4.0.3" acorn-es7 "^0.1.0" @@ -2492,22 +2506,30 @@ fuse-box@^1.3.131: app-root-path "^2.0.1" base64-img "^1.0.3" base64-js "^1.2.0" + chokidar "^1.6.1" commander "^2.9.0" concat-with-sourcemaps "^1.0.4" escodegen "^1.8.1" express "^4.14.0" fs-extra "^2.0.0" + fuse-tools "^1.0.4" glob "^7.1.1" ieee754 "^1.1.8" inquirer "^3.0.6" + mustache "^2.3.0" postcss "^5.2.11" pretty-time "^0.2.0" prettysize "0.0.3" realm-utils "^1.0.8" request "^2.79.0" + shorthash "0.0.2" watch "^1.0.1" ws "^1.1.1" +fuse-tools@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fuse-tools/-/fuse-tools-1.0.5.tgz#98c9f5133348a9a91357cbf8bf57171fa6cd614a" + gauge@~2.7.1: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -2685,8 +2707,8 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" handlebars@^4.0.3: - version "4.0.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.7.tgz#e97325aeb8ea0b9e12b9c4dd73c4c312ad0ede59" + version "4.0.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.8.tgz#22b875cd3f0e6cbea30314f144e82bc7a72ff420" dependencies: async "^1.4.0" optimist "^0.6.1" @@ -2750,6 +2772,10 @@ hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" +he@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + highlight.js@^9.11.0: version "9.11.0" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.11.0.tgz#47f98c7399918700db2caf230ded12cec41a84ae" @@ -2848,8 +2874,8 @@ ignore-by-default@^1.0.0: resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" ignore@^3.0.11, ignore@^3.0.9, ignore@^3.2.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.7.tgz#4810ca5f1d8eca5595213a34b94f2eb4ed926bbd" + version "3.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.0.tgz#3812d22cbe9125f2c2b4915755a1b8abd745a001" image-size@^0.5.1: version "0.5.1" @@ -4099,8 +4125,8 @@ markdown-it-emoji@^1.3.0: resolved "https://registry.yarnpkg.com/markdown-it-emoji/-/markdown-it-emoji-1.3.0.tgz#903ae1a9968c3f17d4e142f115d4ec575e56d2cb" markdown-it-expand-tabs@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/markdown-it-expand-tabs/-/markdown-it-expand-tabs-1.0.11.tgz#7804ab5aab8b1368191b43469d87e2ede4af086a" + version "1.0.12" + resolved "https://registry.yarnpkg.com/markdown-it-expand-tabs/-/markdown-it-expand-tabs-1.0.12.tgz#f54bd2f303f858ee6798ca2bd83fe70144814ca0" dependencies: lodash.repeat "^4.0.0" @@ -4117,8 +4143,8 @@ markdown-it-mathjax@^2.0.0: resolved "https://registry.yarnpkg.com/markdown-it-mathjax/-/markdown-it-mathjax-2.0.0.tgz#ae2b4f4c5c719a03f9e475c664f7b2685231d9e9" markdown-it-task-lists@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/markdown-it-task-lists/-/markdown-it-task-lists-2.0.0.tgz#471edd893fe87b8bb61d48fd427f8f20b5ab739e" + version "2.0.1" + resolved "https://registry.yarnpkg.com/markdown-it-task-lists/-/markdown-it-task-lists-2.0.1.tgz#a9ce7f55cde9f45e0fca629071d11d3fd5a69416" markdown-it@^8.3.1: version "8.3.1" @@ -4347,6 +4373,10 @@ muri@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/muri/-/muri-1.2.1.tgz#ec7ea5ce6ca6a523eb1ab35bacda5fa816c9aa3c" +mustache@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" + mute-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" @@ -4623,13 +4653,13 @@ on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@^1.3.0, once@~1.3.0: +once@^1.3.0, once@^1.3.1, once@~1.3.0: version "1.3.3" resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" dependencies: wrappy "1" -once@^1.3.1, once@^1.3.3, once@^1.4.0: +once@^1.3.3, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -5529,8 +5559,8 @@ regexpu-core@^2.0.0: regjsparser "^0.1.4" registry-auth-token@^3.0.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.0.tgz#57ae67347e73d96345ed1bc01294c7237c02aa63" + version "3.3.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" dependencies: rc "^1.1.6" safe-buffer "^5.0.1" @@ -5860,6 +5890,10 @@ shimmer@^1.0.0, shimmer@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.1.0.tgz#97d7377137ffbbab425522e429fe0aa89a488b35" +shorthash@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/shorthash/-/shorthash-0.0.2.tgz#59b268eecbde59038b30da202bcfbddeb2c4a4eb" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -5984,8 +6018,8 @@ snyk-try-require@^1.1.1, snyk-try-require@^1.2.0: then-fs "^2.0.0" snyk@latest: - version "1.29.0" - resolved "https://registry.yarnpkg.com/snyk/-/snyk-1.29.0.tgz#20be4eaddc9641ca004fb24368dc33d6f82d17dc" + version "1.30.0" + resolved "https://registry.yarnpkg.com/snyk/-/snyk-1.30.0.tgz#a323809ea477d6aff0e325f5995cb491c0d7ca3d" dependencies: abbrev "^1.0.7" ansi-escapes "^1.3.0" @@ -6494,6 +6528,10 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" +typescript@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.3.2.tgz#f0f045e196f69a72f06b25fd3bd39d01c3ce9984" + typo-js@*: version "1.0.3" resolved "https://registry.yarnpkg.com/typo-js/-/typo-js-1.0.3.tgz#54d8ebc7949f1a7810908b6002c6841526c99d5a" @@ -6673,8 +6711,8 @@ vasync@^1.6.4: verror "1.6.0" vee-validate@^2.0.0-rc.2: - version "2.0.0-rc.2" - resolved "https://registry.yarnpkg.com/vee-validate/-/vee-validate-2.0.0-rc.2.tgz#bb93b021e272465f432fe829d7e52cf626bafdc4" + version "2.0.0-rc.3" + resolved "https://registry.yarnpkg.com/vee-validate/-/vee-validate-2.0.0-rc.3.tgz#2ae889c203d0fcaca787a16070027ef36e5b1f6d" verror@1.3.6: version "1.3.6" @@ -6689,8 +6727,8 @@ verror@1.6.0: extsprintf "1.2.0" verror@^1.8.1: - version "1.9.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.9.0.tgz#107a8a2d14c33586fc4bb830057cd2d19ae2a6ee" + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -6706,9 +6744,16 @@ void-elements@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" -vue@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.3.0.tgz#bc44db0488c5245c788304c7683efe7b4c862d82" +vue-template-compiler@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.3.2.tgz#d48a7f53df5f497033827182ceb4f0d340803017" + dependencies: + de-indent "^1.0.2" + he "^1.1.0" + +vue@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.3.2.tgz#9e52aae3593480be235ff227557837e69f98203a" vxx@^1.2.0: version "1.2.1"