From d9dbd0f62fa0231232287f457cce8751317c88c3 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Sun, 3 Jul 2022 01:37:28 +0000 Subject: [PATCH] feat: login screen UI + server code cleanup --- .editorconfig | 2 +- .nvmrc | 1 - client/client-app.js | 2 +- client/client-setup.js | 21 - client/components/login.vue | 38 +- client/index-legacy.js | 4 - client/index-setup.js | 11 - dev/index.js | 2 +- dev/templates/{master.pug => base.pug} | 1 + dev/templates/setup.pug | 48 - dev/webpack/webpack.dev.js | 25 +- dev/webpack/webpack.prod.js | 25 +- package.json | 2 +- server/core/kernel.js | 43 +- server/core/system.js | 2 +- server/core/telemetry.js | 144 --- server/graph/resolvers/storage.js | 9 +- server/graph/schemas/authentication.graphql | 1 + server/index.js | 2 + server/models/sites.js | 22 + server/setup.js | 450 ------- server/themes/default/theme.yml | 25 - server/themes/default/thumbnail.png | Bin 22355 -> 0 bytes server/views/admin.pug | 2 +- .../legacy.pug => server/views/base.pug | 43 +- server/views/editor.pug | 2 +- server/views/error.pug | 2 +- server/views/history.pug | 2 +- server/views/legacy/login.pug | 23 - server/views/legacy/page.pug | 60 - server/views/login.pug | 2 +- server/views/new.pug | 2 +- server/views/notfound.pug | 2 +- server/views/page.pug | 2 +- server/views/profile.pug | 2 +- server/views/register.pug | 2 +- server/views/source.pug | 2 +- server/views/tags.pug | 2 +- server/views/unauthorized.pug | 2 +- server/views/welcome.pug | 2 +- server/{master.js => web.js} | 21 +- ux/.eslintrc.js | 1 + ux/index.html | 3 + ux/package.json | 29 +- ux/quasar.config.js | 2 +- ux/src/App.vue | 43 +- ux/src/components/GroupEditOverlay.vue | 3 +- ux/src/components/IconPickerDialog.vue | 2 +- ux/src/components/PageDataTemplateDialog.vue | 3 +- ux/src/components/PageRelationDialog.vue | 3 +- ux/src/components/SiteActivateDialog.vue | 2 +- ux/src/components/UserChangePwdDialog.vue | 2 +- ux/src/components/UserCreateDialog.vue | 3 +- ux/src/components/UserEditOverlay.vue | 7 +- ux/src/components/WebhookEditDialog.vue | 2 +- ux/src/css/app.scss | 4 +- ux/src/css/quasar.variables.scss | 4 + ux/src/i18n/locales/en.json | 4 +- ux/src/layouts/AdminLayout.vue | 2 +- ux/src/layouts/AuthLayout.vue | 93 +- ux/src/pages/AdminNavigation.vue | 41 +- ux/src/pages/AdminRendering.vue | 9 +- ux/src/pages/Login.vue | 1039 ++++++++--------- ux/src/router/routes.js | 14 +- ux/src/stores/admin.js | 2 +- ux/src/stores/site.js | 2 +- ux/yarn.lock | 551 +++++---- 67 files changed, 1077 insertions(+), 1848 deletions(-) delete mode 100644 .nvmrc delete mode 100644 client/client-setup.js delete mode 100644 client/index-legacy.js delete mode 100644 client/index-setup.js rename dev/templates/{master.pug => base.pug} (99%) delete mode 100644 dev/templates/setup.pug delete mode 100644 server/core/telemetry.js delete mode 100644 server/setup.js delete mode 100644 server/themes/default/theme.yml delete mode 100644 server/themes/default/thumbnail.png rename dev/templates/legacy.pug => server/views/base.pug (80%) delete mode 100644 server/views/legacy/login.pug delete mode 100644 server/views/legacy/page.pug rename server/{master.js => web.js} (91%) diff --git a/.editorconfig b/.editorconfig index b9583094..50dbfd02 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,7 +8,7 @@ trim_trailing_whitespace = true end_of_line = lf insert_final_newline = true -[*.{jade,pug,md}] +[*.{pug,md}] trim_trailing_whitespace = false [Makefile] diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index 0c6886ca..00000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v12.16.3 diff --git a/client/client-app.js b/client/client-app.js index c70db6dd..6d4c4340 100644 --- a/client/client-app.js +++ b/client/client-app.js @@ -47,7 +47,7 @@ store.commit('user/REFRESH_AUTH') // Initialize Apollo Client (GraphQL) // ==================================== -const graphQLEndpoint = window.location.protocol + '//' + window.location.host + '/graphql' +const graphQLEndpoint = window.location.protocol + '//' + window.location.host + '/_graphql' const graphQLLink = ApolloLink.from([ new ErrorLink(({ graphQLErrors, networkError }) => { diff --git a/client/client-setup.js b/client/client-setup.js deleted file mode 100644 index 2eb68371..00000000 --- a/client/client-setup.js +++ /dev/null @@ -1,21 +0,0 @@ -/* eslint-disable import/first */ -import Vue from 'vue' -import Vuetify from 'vuetify/lib' -import boot from './modules/boot' -/* eslint-enable import/first */ - -window.WIKI = null -window.boot = boot - -Vue.use(Vuetify) - -Vue.component('setup', () => import(/* webpackMode: "eager" */ './components/setup.vue')) - -let bootstrap = () => { - window.WIKI = new Vue({ - el: '#root', - vuetify: new Vuetify() - }) -} - -window.boot.onDOMReady(bootstrap) diff --git a/client/components/login.vue b/client/components/login.vue index f74a4744..e7875ccf 100644 --- a/client/components/login.vue +++ b/client/components/login.vue @@ -662,26 +662,34 @@ export default { apollo: { strategies: { query: gql` - { - authentication { - activeStrategies(enabledOnly: true) { + query loginFetchSiteStrategies( + $siteId: UUID + ) { + authStrategies( + siteId: $siteId + enabledOnly: true + ) { + key + strategy { key - strategy { - key - logo - color - icon - useForm - usernameType - } - displayName - order - selfRegistration + logo + color + icon + useForm + usernameType } + displayName + order + selfRegistration } } `, - update: (data) => _.sortBy(data.authentication.activeStrategies, ['order']), + variables () { + return { + siteId: siteConfig.id + } + }, + update: (data) => _.sortBy(data.authStrategies, ['order']), watchLoading (isLoading) { this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'login-strategies-refresh') } diff --git a/client/index-legacy.js b/client/index-legacy.js deleted file mode 100644 index ac2f6f51..00000000 --- a/client/index-legacy.js +++ /dev/null @@ -1,4 +0,0 @@ -require('./scss/legacy.scss') -require('./scss/fonts/default.scss') - -window.WIKI = null diff --git a/client/index-setup.js b/client/index-setup.js deleted file mode 100644 index 4d398de0..00000000 --- a/client/index-setup.js +++ /dev/null @@ -1,11 +0,0 @@ -require('core-js/stable') -require('regenerator-runtime/runtime') - -/* eslint-disable no-unused-expressions */ - -require('./scss/app.scss') -import(/* webpackChunkName: "mdi" */ '@mdi/font/css/materialdesignicons.css') - -require('./helpers/compatibility.js') - -require('./client-setup.js') diff --git a/dev/index.js b/dev/index.js index f3b719db..9f565e80 100644 --- a/dev/index.js +++ b/dev/index.js @@ -60,7 +60,7 @@ const init = { }, async reload() { console.warn(chalk.yellow('--- Gracefully stopping server...')) - await global.WIKI.kernel.shutdown() + await global.WIKI.kernel.shutdown(true) console.warn(chalk.yellow('--- Purging node modules cache...')) diff --git a/dev/templates/master.pug b/dev/templates/base.pug similarity index 99% rename from dev/templates/master.pug rename to dev/templates/base.pug index 478d2725..fa90ce42 100644 --- a/dev/templates/master.pug +++ b/dev/templates/base.pug @@ -29,6 +29,7 @@ html(lang=siteConfig.lang) //- Site Properties script. + var siteId = "!{siteId}" var siteConfig = !{JSON.stringify(siteConfig)} var siteLangs = !{JSON.stringify(langs)} diff --git a/dev/templates/setup.pug b/dev/templates/setup.pug deleted file mode 100644 index e264901e..00000000 --- a/dev/templates/setup.pug +++ /dev/null @@ -1,48 +0,0 @@ -doctype html -html - head - meta(http-equiv='X-UA-Compatible', content='IE=edge') - meta(charset='UTF-8') - meta(name='viewport', content='user-scalable=yes, width=device-width, initial-scale=1, maximum-scale=5') - meta(name='theme-color', content='#1976d2') - meta(name='msapplication-TileColor', content='#1976d2') - meta(name='msapplication-TileImage', content='/_assets/favicons/mstile-150x150.png') - title Wiki.js Setup - - //- Favicon - link(rel='apple-touch-icon', sizes='180x180', href='/_assets/favicons/apple-touch-icon.png') - link(rel='icon', type='image/png', sizes='192x192', href='/_assets/favicons/android-chrome-192x192.png') - link(rel='icon', type='image/png', sizes='32x32', href='/_assets/favicons/favicon-32x32.png') - link(rel='icon', type='image/png', sizes='16x16', href='/_assets/favicons/favicon-16x16.png') - link(rel='mask-icon', href='/_assets/favicons/safari-pinned-tab.svg', color='#1976d2') - link(rel='manifest', href='/_assets/manifest.json') - - //- Site Lang - script. - var siteConfig = !{JSON.stringify({ title: config.title })} - - //- Dev Mode Warning - if devMode - script. - siteConfig.devMode = true - - //- CSS - <% for (var index in htmlWebpackPlugin.files.css) { %> - link( - type='text/css' - rel='stylesheet' - href='<%= htmlWebpackPlugin.files.css[index] %>' - ) - <% } %> - - //- JS - <% for (var index in htmlWebpackPlugin.files.js) { %> - script( - type='text/javascript' - src='<%= htmlWebpackPlugin.files.js[index] %>' - ) - <% } %> - - body - #root - setup(telemetry-id=telemetryClientID, wiki-version=packageObj.version) diff --git a/dev/webpack/webpack.dev.js b/dev/webpack/webpack.dev.js index ed570944..a15e1d44 100644 --- a/dev/webpack/webpack.dev.js +++ b/dev/webpack/webpack.dev.js @@ -24,9 +24,7 @@ fs.emptyDirSync(path.join(process.cwd(), 'assets-legacy')) module.exports = { mode: 'development', entry: { - app: ['./client/index-app.js', 'webpack-hot-middleware/client'], - legacy: ['./client/index-legacy.js', 'webpack-hot-middleware/client'], - setup: ['./client/index-setup.js', 'webpack-hot-middleware/client'] + app: ['./client/index-app.js', 'webpack-hot-middleware/client'] }, output: { path: path.join(process.cwd(), 'assets-legacy'), @@ -197,25 +195,10 @@ module.exports = { ] }), new HtmlWebpackPlugin({ - template: 'dev/templates/master.pug', - filename: '../server/views/master.pug', + template: 'dev/templates/base.pug', + filename: '../server/views/base.pug', hash: false, - inject: false, - excludeChunks: ['setup', 'legacy'] - }), - new HtmlWebpackPlugin({ - template: 'dev/templates/legacy.pug', - filename: '../server/views/legacy/master.pug', - hash: false, - inject: false, - excludeChunks: ['setup', 'app'] - }), - new HtmlWebpackPlugin({ - template: 'dev/templates/setup.pug', - filename: '../server/views/setup.pug', - hash: false, - inject: false, - excludeChunks: ['app', 'legacy'] + inject: false }), new HtmlWebpackPugPlugin(), new WebpackBarPlugin({ diff --git a/dev/webpack/webpack.prod.js b/dev/webpack/webpack.prod.js index f7bc315b..58d6c788 100644 --- a/dev/webpack/webpack.prod.js +++ b/dev/webpack/webpack.prod.js @@ -29,9 +29,7 @@ fs.emptyDirSync(path.join(process.cwd(), 'assets-legacy')) module.exports = { mode: 'production', entry: { - app: './client/index-app.js', - legacy: './client/index-legacy.js', - setup: './client/index-setup.js' + app: './client/index-app.js' }, output: { path: path.join(process.cwd(), 'assets-legacy'), @@ -208,25 +206,10 @@ module.exports = { chunkFilename: 'css/[name].[chunkhash].css' }), new HtmlWebpackPlugin({ - template: 'dev/templates/master.pug', - filename: '../server/views/master.pug', + template: 'dev/templates/base.pug', + filename: '../server/views/base.pug', hash: false, - inject: false, - excludeChunks: ['setup', 'legacy'] - }), - new HtmlWebpackPlugin({ - template: 'dev/templates/legacy.pug', - filename: '../server/views/legacy/master.pug', - hash: false, - inject: false, - excludeChunks: ['setup', 'app'] - }), - new HtmlWebpackPlugin({ - template: 'dev/templates/setup.pug', - filename: '../server/views/setup.pug', - hash: false, - inject: false, - excludeChunks: ['app', 'legacy'] + inject: false }), new HtmlWebpackPugPlugin(), new ScriptExtHtmlWebpackPlugin({ diff --git a/package.json b/package.json index 9bb75bfb..e7d75086 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "scripts": { "start": "node server", "dev": "nodemon server", - "legacy:dev": "node dev", + "legacy:dev": "NODE_OPTIONS=--openssl-legacy-provider node dev", "legacy:build": "NODE_OPTIONS=--openssl-legacy-provider webpack --profile --config dev/webpack/webpack.prod.js", "test": "eslint --format codeframe --ext .js,.vue . && pug-lint server/views && jest", "cypress:open": "cypress open" diff --git a/server/core/kernel.js b/server/core/kernel.js index f2a067b9..cf6903dd 100644 --- a/server/core/kernel.js +++ b/server/core/kernel.js @@ -24,14 +24,13 @@ module.exports = { process.exit(1) } - this.bootMaster() + this.bootWeb() }, /** - * Pre-Master Boot Sequence + * Pre-Web Boot Sequence */ - async preBootMaster() { + async preBootWeb() { try { - await this.initTelemetry() WIKI.sideloader = await require('./sideloader').init() WIKI.cache = require('./cache').init() WIKI.scheduler = require('./scheduler').init() @@ -48,22 +47,22 @@ module.exports = { } }, /** - * Boot Master Process + * Boot Web Process */ - async bootMaster() { + async bootWeb() { try { - await this.preBootMaster() - await require('../master')() - this.postBootMaster() + await this.preBootWeb() + await require('../web')() + this.postBootWeb() } catch (err) { WIKI.logger.error(err) process.exit(1) } }, /** - * Post-Master Boot Sequence + * Post-Web Boot Sequence */ - async postBootMaster() { + async postBootWeb() { await WIKI.models.analytics.refreshProvidersFromDisk() await WIKI.models.authentication.refreshStrategiesFromDisk() await WIKI.models.commentProviders.refreshProvidersFromDisk() @@ -74,30 +73,16 @@ module.exports = { await WIKI.auth.activateStrategies() await WIKI.models.commentProviders.initProvider() + await WIKI.models.sites.reloadCache() await WIKI.models.storage.initTargets() // WIKI.scheduler.start() await WIKI.models.subscribeToNotifications() }, - /** - * Init Telemetry - */ - async initTelemetry() { - require('./telemetry').init() - - process.on('unhandledRejection', (err) => { - WIKI.logger.warn(err) - WIKI.telemetry.sendError(err) - }) - process.on('uncaughtException', (err) => { - WIKI.logger.warn(err) - WIKI.telemetry.sendError(err) - }) - }, /** * Graceful shutdown */ - async shutdown () { + async shutdown (devMode = false) { if (WIKI.servers) { await WIKI.servers.stopServers() } @@ -113,6 +98,8 @@ module.exports = { if (WIKI.asar) { await WIKI.asar.unload() } - process.exit(0) + if (!devMode) { + process.exit(0) + } } } diff --git a/server/core/system.js b/server/core/system.js index c90d436e..2429c802 100644 --- a/server/core/system.js +++ b/server/core/system.js @@ -11,7 +11,7 @@ module.exports = { minimumVersionRequired: '3.0.0-beta.0', minimumNodeRequired: '18.0.0' }, - init() { + init () { // Clear content cache fs.emptyDir(path.resolve(WIKI.ROOTPATH, WIKI.config.dataPath, 'cache')) diff --git a/server/core/telemetry.js b/server/core/telemetry.js deleted file mode 100644 index 5453d693..00000000 --- a/server/core/telemetry.js +++ /dev/null @@ -1,144 +0,0 @@ -const _ = require('lodash') -const { createApolloFetch } = require('apollo-fetch') -const { v4: uuid } = require('uuid') -const os = require('os') -const fs = require('fs-extra') - -/* global WIKI */ - -module.exports = { - enabled: false, - init() { - WIKI.telemetry = this - - if (_.get(WIKI.config, 'telemetry.isEnabled', false) === true && WIKI.config.offline !== true) { - this.enabled = true - this.sendInstanceEvent('STARTUP') - } - }, - sendError(err) { - // TODO - }, - sendEvent(eventCategory, eventAction, eventLabel) { - // TODO - }, - async sendInstanceEvent(eventType) { - if (WIKI.devMode || !this.enabled) { return } - - try { - const apollo = createApolloFetch({ - uri: WIKI.config.graphEndpoint - }) - - // Platform detection - let platform = 'LINUX' - let isDockerized = false - let osname = `${os.type()} ${os.release()}` - switch (os.platform()) { - case 'win32': - platform = 'WINDOWS' - break - case 'darwin': - platform = 'MACOS' - break - default: - platform = 'LINUX' - isDockerized = await fs.pathExists('/.dockerenv') - if (isDockerized) { - osname = 'Docker' - } - break - } - - // DB Version detection - let dbVersion = 'Unknown' - switch (WIKI.config.db.type) { - case 'mariadb': - case 'mysql': - const resultMYSQL = await WIKI.models.knex.raw('SELECT VERSION() as version;') - dbVersion = _.get(resultMYSQL, '[0][0].version', 'Unknown') - break - case 'mssql': - const resultMSSQL = await WIKI.models.knex.raw('SELECT @@VERSION as version;') - dbVersion = _.get(resultMSSQL, '[0].version', 'Unknown') - break - case 'postgres': - dbVersion = _.get(WIKI.models, 'knex.client.version', 'Unknown') - break - case 'sqlite': - dbVersion = _.get(WIKI.models, 'knex.client.driver.VERSION', 'Unknown') - break - } - - let arch = os.arch().toUpperCase() - if (['ARM', 'ARM64', 'X32', 'X64'].indexOf(arch) < 0) { - arch = 'OTHER' - } - - // Send Event - const respStrings = await apollo({ - query: `mutation ( - $version: String! - $platform: TelemetryPlatform! - $os: String! - $architecture: TelemetryArchitecture! - $dbType: TelemetryDBType! - $dbVersion: String! - $nodeVersion: String! - $cpuCores: Int! - $ramMBytes: Int!, - $clientId: String!, - $event: TelemetryInstanceEvent! - ) { - telemetry { - instance( - version: $version - platform: $platform - os: $os - architecture: $architecture - dbType: $dbType - dbVersion: $dbVersion - nodeVersion: $nodeVersion - cpuCores: $cpuCores - ramMBytes: $ramMBytes - clientId: $clientId - event: $event - ) { - responseResult { - succeeded - errorCode - slug - message - } - } - } - }`, - variables: { - version: WIKI.version, - platform, - os: osname, - architecture: arch, - dbType: WIKI.config.db.type.toUpperCase(), - dbVersion, - nodeVersion: process.version.substr(1), - cpuCores: os.cpus().length, - ramMBytes: Math.round(os.totalmem() / 1024 / 1024), - clientId: WIKI.config.telemetry.clientId, - event: eventType - } - }) - const telemetryResponse = _.get(respStrings, 'data.telemetry.instance.responseResult', { succeeded: false, message: 'Unexpected Error' }) - if (!telemetryResponse.succeeded) { - WIKI.logger.warn('Failed to send instance telemetry: ' + telemetryResponse.message) - } else { - WIKI.logger.info('Telemetry is active: [ OK ]') - } - } catch (err) { - WIKI.logger.warn(err) - } - }, - generateClientId() { - _.set(WIKI.config, 'telemetry.clientId', uuid()) - return WIKI.config.telemetry.clientId - } -} diff --git a/server/graph/resolvers/storage.js b/server/graph/resolvers/storage.js index 1f659835..ec5f4d08 100644 --- a/server/graph/resolvers/storage.js +++ b/server/graph/resolvers/storage.js @@ -32,6 +32,7 @@ module.exports = { // }), ['title', 'key']) return _.sortBy(WIKI.storage.defs.map(md => { const dbTarget = dbTargets.find(tg => tg.module === md.key) + console.info(md.actions) return { id: dbTarget?.id ?? uuid(), isEnabled: dbTarget?.isEnabled ?? false, @@ -62,12 +63,12 @@ module.exports = { setup: { handler: md?.setup?.handler, state: dbTarget?.state?.setup ?? 'notconfigured', - values: md.setup?.handler - ? _.transform(md.setup.defaultValues, + values: md.setup?.handler ? + _.transform(md.setup.defaultValues, (r, v, k) => { r[k] = dbTarget?.config?.[k] ?? v - }, {}) - : {} + }, {}) : + {} }, config: _.transform(md.props, (r, v, k) => { const cfValue = dbTarget?.config?.[k] ?? v.default diff --git a/server/graph/schemas/authentication.graphql b/server/graph/schemas/authentication.graphql index 8834899f..d32a0853 100644 --- a/server/graph/schemas/authentication.graphql +++ b/server/graph/schemas/authentication.graphql @@ -8,6 +8,7 @@ extend type Query { apiState: Boolean authStrategies( + siteId: UUID enabledOnly: Boolean ): [AuthenticationStrategy] } diff --git a/server/index.js b/server/index.js index 8588963c..96af8921 100644 --- a/server/index.js +++ b/server/index.js @@ -22,6 +22,8 @@ let WIKI = { Error: require('./helpers/error'), configSvc: require('./core/config'), kernel: require('./core/kernel'), + sites: {}, + sitesMappings: {}, startedAt: DateTime.utc(), storage: { defs: [], diff --git a/server/models/sites.js b/server/models/sites.js index 329c3a5f..b0c5b5a9 100644 --- a/server/models/sites.js +++ b/server/models/sites.js @@ -28,6 +28,28 @@ module.exports = class Site extends Model { return ['config'] } + static async getSiteByHostname ({ hostname, forceReload = false }) { + if (forceReload) { + await WIKI.models.sites.reloadCache() + } + const siteId = WIKI.sitesMappings[hostname] || WIKI.sitesMappings['*'] + if (siteId) { + return WIKI.sites[siteId] + } + return null + } + + static async reloadCache () { + WIKI.logger.info('Reloading site configurations...') + const sites = await WIKI.models.sites.query().orderBy('id') + WIKI.sites = _.keyBy(sites, 'id') + WIKI.sitesMappings = {} + for (const site of sites) { + WIKI.sitesMappings[site.hostname] = site.id + } + WIKI.logger.info(`Loaded ${sites.length} site configurations [ OK ]`) + } + static async createSite (hostname, config) { const newSite = await WIKI.models.sites.query().insertAndFetch({ hostname, diff --git a/server/setup.js b/server/setup.js deleted file mode 100644 index 6d87a29f..00000000 --- a/server/setup.js +++ /dev/null @@ -1,450 +0,0 @@ -const path = require('path') -const { v4: uuid } = require('uuid') -const bodyParser = require('body-parser') -const compression = require('compression') -const express = require('express') -const favicon = require('serve-favicon') -const http = require('http') -const Promise = require('bluebird') -const fs = require('fs-extra') -const _ = require('lodash') -const crypto = Promise.promisifyAll(require('crypto')) -const pem2jwk = require('pem-jwk').pem2jwk -const semver = require('semver') - -/* global WIKI */ - -module.exports = () => { - WIKI.config.site = { - path: '', - title: 'Wiki.js' - } - - WIKI.system = require('./core/system') - - // ---------------------------------------- - // Define Express App - // ---------------------------------------- - - let app = express() - app.use(compression()) - - // ---------------------------------------- - // Public Assets - // ---------------------------------------- - - app.use(favicon(path.join(WIKI.ROOTPATH, 'assets', 'favicon.ico'))) - app.use('/_assets', express.static(path.join(WIKI.ROOTPATH, 'assets'))) - - // ---------------------------------------- - // View Engine Setup - // ---------------------------------------- - - app.set('views', path.join(WIKI.SERVERPATH, 'views')) - app.set('view engine', 'pug') - - app.use(bodyParser.json()) - app.use(bodyParser.urlencoded({ extended: false })) - - app.locals.config = WIKI.config - app.locals.data = WIKI.data - app.locals._ = require('lodash') - app.locals.devMode = WIKI.devMode - - // ---------------------------------------- - // HMR (Dev Mode Only) - // ---------------------------------------- - - if (global.DEV) { - app.use(global.WP_DEV.devMiddleware) - app.use(global.WP_DEV.hotMiddleware) - } - - // ---------------------------------------- - // Controllers - // ---------------------------------------- - - app.get('*', async (req, res) => { - let packageObj = await fs.readJson(path.join(WIKI.ROOTPATH, 'package.json')) - res.render('setup', { packageObj }) - }) - - /** - * Finalize - */ - app.post('/finalize', async (req, res) => { - try { - // Set config - _.set(WIKI.config, 'auth', { - audience: 'urn:wiki.js', - tokenExpiration: '30m', - tokenRenewal: '14d' - }) - _.set(WIKI.config, 'company', '') - _.set(WIKI.config, 'features', { - featurePageRatings: true, - featurePageComments: true, - featurePersonalWikis: true - }) - _.set(WIKI.config, 'graphEndpoint', 'https://graph.requarks.io') - _.set(WIKI.config, 'host', req.body.siteUrl) - _.set(WIKI.config, 'lang', { - code: 'en', - autoUpdate: true, - namespacing: false, - namespaces: [] - }) - _.set(WIKI.config, 'logo', { - hasLogo: false, - logoIsSquare: false - }) - _.set(WIKI.config, 'mail', { - senderName: '', - senderEmail: '', - host: '', - port: 465, - secure: true, - verifySSL: true, - user: '', - pass: '', - useDKIM: false, - dkimDomainName: '', - dkimKeySelector: '', - dkimPrivateKey: '' - }) - _.set(WIKI.config, 'seo', { - description: '', - robots: ['index', 'follow'], - analyticsService: '', - analyticsId: '' - }) - _.set(WIKI.config, 'sessionSecret', (await crypto.randomBytesAsync(32)).toString('hex')) - _.set(WIKI.config, 'telemetry', { - isEnabled: req.body.telemetry === true, - clientId: uuid() - }) - _.set(WIKI.config, 'theming', { - theme: 'default', - darkMode: false, - iconset: 'mdi', - injectCSS: '', - injectHead: '', - injectBody: '' - }) - _.set(WIKI.config, 'title', 'Wiki.js') - - // Init Telemetry - WIKI.kernel.initTelemetry() - // WIKI.telemetry.sendEvent('setup', 'install-start') - - // Basic checks - if (!semver.satisfies(process.version, '>=10.12')) { - throw new Error('Node.js 10.12.x or later required!') - } - - // Create directory structure - WIKI.logger.info('Creating data directories...') - await fs.ensureDir(path.resolve(WIKI.ROOTPATH, WIKI.config.dataPath)) - await fs.emptyDir(path.resolve(WIKI.ROOTPATH, WIKI.config.dataPath, 'cache')) - await fs.ensureDir(path.resolve(WIKI.ROOTPATH, WIKI.config.dataPath, 'uploads')) - - // Generate certificates - WIKI.logger.info('Generating certificates...') - const certs = crypto.generateKeyPairSync('rsa', { - modulusLength: 2048, - publicKeyEncoding: { - type: 'pkcs1', - format: 'pem' - }, - privateKeyEncoding: { - type: 'pkcs1', - format: 'pem', - cipher: 'aes-256-cbc', - passphrase: WIKI.config.sessionSecret - } - }) - - _.set(WIKI.config, 'certs', { - jwk: pem2jwk(certs.publicKey), - public: certs.publicKey, - private: certs.privateKey - }) - - // Save config to DB - WIKI.logger.info('Persisting config to DB...') - await WIKI.configSvc.saveToDb([ - 'auth', - 'certs', - 'company', - 'features', - 'graphEndpoint', - 'host', - 'lang', - 'logo', - 'mail', - 'seo', - 'sessionSecret', - 'telemetry', - 'theming', - 'uploads', - 'title' - ], false) - - // Truncate tables (reset from previous failed install) - await WIKI.models.locales.query().where('code', '!=', 'x').del() - await WIKI.models.navigation.query().truncate() - switch (WIKI.config.db.type) { - case 'postgres': - await WIKI.models.knex.raw('TRUNCATE groups, users CASCADE') - break - case 'mysql': - case 'mariadb': - await WIKI.models.groups.query().where('id', '>', 0).del() - await WIKI.models.users.query().where('id', '>', 0).del() - await WIKI.models.knex.raw('ALTER TABLE `groups` AUTO_INCREMENT = 1') - await WIKI.models.knex.raw('ALTER TABLE `users` AUTO_INCREMENT = 1') - break - case 'mssql': - await WIKI.models.groups.query().del() - await WIKI.models.users.query().del() - await WIKI.models.knex.raw(` - IF EXISTS (SELECT * FROM sys.identity_columns WHERE OBJECT_NAME(OBJECT_ID) = 'groups' AND last_value IS NOT NULL) - DBCC CHECKIDENT ([groups], RESEED, 0) - `) - await WIKI.models.knex.raw(` - IF EXISTS (SELECT * FROM sys.identity_columns WHERE OBJECT_NAME(OBJECT_ID) = 'users' AND last_value IS NOT NULL) - DBCC CHECKIDENT ([users], RESEED, 0) - `) - break - case 'sqlite': - await WIKI.models.groups.query().truncate() - await WIKI.models.users.query().truncate() - break - } - - // Create default locale - WIKI.logger.info('Installing default locale...') - await WIKI.models.locales.query().insert({ - code: 'en', - strings: {}, - isRTL: false, - name: 'English', - nativeName: 'English' - }) - - // Create default groups - - WIKI.logger.info('Creating default groups...') - const adminGroup = await WIKI.models.groups.query().insert({ - name: 'Administrators', - permissions: JSON.stringify(['manage:system']), - pageRules: JSON.stringify([]), - isSystem: true - }) - const guestGroup = await WIKI.models.groups.query().insert({ - name: 'Guests', - permissions: JSON.stringify(['read:pages', 'read:assets', 'read:comments']), - pageRules: JSON.stringify([ - { id: 'guest', roles: ['read:pages', 'read:assets', 'read:comments'], match: 'START', deny: false, path: '', locales: [] } - ]), - isSystem: true - }) - if (adminGroup.id !== 1 || guestGroup.id !== 2) { - throw new Error('Incorrect groups auto-increment configuration! Should start at 0 and increment by 1. Contact your database administrator.') - } - - // Load local authentication strategy - await WIKI.models.authentication.query().insert({ - key: 'local', - config: {}, - selfRegistration: false, - isEnabled: true, - domainWhitelist: {v: []}, - autoEnrollGroups: {v: []}, - order: 0, - strategyKey: 'local', - displayName: 'Local' - }) - - // Load editors + enable default - await WIKI.models.editors.refreshEditorsFromDisk() - await WIKI.models.editors.query().patch({ isEnabled: true }).where('key', 'markdown') - - // Load loggers - await WIKI.models.loggers.refreshLoggersFromDisk() - - // Load renderers - await WIKI.models.renderers.refreshRenderersFromDisk() - - // Load search engines + enable default - await WIKI.models.searchEngines.refreshSearchEnginesFromDisk() - await WIKI.models.searchEngines.query().patch({ isEnabled: true }).where('key', 'db') - - // WIKI.telemetry.sendEvent('setup', 'install-loadedmodules') - - // Load storage targets - await WIKI.models.storage.refreshTargetsFromDisk() - - // Create root administrator - WIKI.logger.info('Creating root administrator...') - const adminUser = await WIKI.models.users.query().insert({ - email: req.body.adminEmail.toLowerCase(), - provider: 'local', - password: req.body.adminPassword, - name: 'Administrator', - locale: 'en', - defaultEditor: 'markdown', - tfaIsActive: false, - isActive: true, - isVerified: true - }) - await adminUser.$relatedQuery('groups').relate(adminGroup.id) - - // Create Guest account - WIKI.logger.info('Creating guest account...') - const guestUser = await WIKI.models.users.query().insert({ - provider: 'local', - email: 'guest@example.com', - name: 'Guest', - password: '', - locale: 'en', - defaultEditor: 'markdown', - tfaIsActive: false, - isSystem: true, - isActive: true, - isVerified: true - }) - await guestUser.$relatedQuery('groups').relate(guestGroup.id) - if (adminUser.id !== 1 || guestUser.id !== 2) { - throw new Error('Incorrect users auto-increment configuration! Should start at 0 and increment by 1. Contact your database administrator.') - } - - // Create site nav - - WIKI.logger.info('Creating default site navigation') - await WIKI.models.navigation.query().insert({ - key: 'site', - config: [ - { - locale: 'en', - items: [ - { - id: uuid(), - icon: 'mdi-home', - kind: 'link', - label: 'Home', - target: '/', - targetType: 'home', - visibilityMode: 'all', - visibilityGroups: null - } - ] - } - ] - }) - - WIKI.logger.info('Setup is complete!') - // WIKI.telemetry.sendEvent('setup', 'install-completed') - res.json({ - ok: true, - redirectPath: '/', - redirectPort: WIKI.config.port - }).end() - - if (WIKI.config.telemetry.isEnabled) { - await WIKI.telemetry.sendInstanceEvent('INSTALL') - } - - WIKI.config.setup = false - - WIKI.logger.info('Stopping Setup...') - WIKI.server.destroy(() => { - WIKI.logger.info('Setup stopped. Starting Wiki.js...') - _.delay(() => { - WIKI.kernel.bootMaster() - }, 1000) - }) - } catch (err) { - try { - await WIKI.models.knex('settings').truncate() - } catch (err) {} - WIKI.telemetry.sendError(err) - res.json({ ok: false, error: err.message }) - } - }) - - // ---------------------------------------- - // Error handling - // ---------------------------------------- - - app.use(function (req, res, next) { - const err = new Error('Not Found') - err.status = 404 - next(err) - }) - - app.use(function (err, req, res, next) { - res.status(err.status || 500) - res.send({ - message: err.message, - error: WIKI.IS_DEBUG ? err : {} - }) - WIKI.logger.error(err.message) - WIKI.telemetry.sendError(err) - }) - - // ---------------------------------------- - // Start HTTP server - // ---------------------------------------- - - WIKI.logger.info(`Starting HTTP server on port ${WIKI.config.port}...`) - - app.set('port', WIKI.config.port) - - WIKI.logger.info(`HTTP Server on port: [ ${WIKI.config.port} ]`) - WIKI.server = http.createServer(app) - WIKI.server.listen(WIKI.config.port, WIKI.config.bindIP) - - var openConnections = [] - - WIKI.server.on('connection', (conn) => { - let key = conn.remoteAddress + ':' + conn.remotePort - openConnections[key] = conn - conn.on('close', () => { - openConnections.splice(key, 1) - }) - }) - - WIKI.server.destroy = (cb) => { - WIKI.server.close(cb) - for (let key in openConnections) { - openConnections[key].destroy() - } - } - - WIKI.server.on('error', (error) => { - if (error.syscall !== 'listen') { - throw error - } - - switch (error.code) { - case 'EACCES': - WIKI.logger.error('Listening on port ' + WIKI.config.port + ' requires elevated privileges!') - return process.exit(1) - case 'EADDRINUSE': - WIKI.logger.error('Port ' + WIKI.config.port + ' is already in use!') - return process.exit(1) - default: - throw error - } - }) - - WIKI.server.on('listening', () => { - WIKI.logger.info('HTTP Server: [ RUNNING ]') - WIKI.logger.info('πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»πŸ”»') - WIKI.logger.info('') - WIKI.logger.info(`Browse to http://YOUR-SERVER-IP:${WIKI.config.port}/ to complete setup!`) - WIKI.logger.info('') - WIKI.logger.info('πŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”ΊπŸ”Ί') - }) -} diff --git a/server/themes/default/theme.yml b/server/themes/default/theme.yml deleted file mode 100644 index 42a9e274..00000000 --- a/server/themes/default/theme.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Default -author: requarks.io -site: https://wiki.requarks.io/ -version: 1.0.0 -requirements: - minimum: '>= 2.0.0' - maximum: '< 3.0.0' -props: - accentColor: - type: String - title: Accent Color - hint: Color used in the sidebar navigation and other elements. - order: 1 - default: blue darken-2 - control: color-material - tocPosition: - type: String - title: Table of Contents Position - hint: Select whether the table of contents is shown on the left, right or not at all. - order: 2 - default: left - enum: - - left - - right - - hidden diff --git a/server/themes/default/thumbnail.png b/server/themes/default/thumbnail.png deleted file mode 100644 index 489e3f836fc2c8e1313f28f7a94a55b79a1c6f6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22355 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 diff --git a/server/views/admin.pug b/server/views/admin.pug index 3434fdf3..487740cd 100644 --- a/server/views/admin.pug +++ b/server/views/admin.pug @@ -1,4 +1,4 @@ -extends master.pug +extends base.pug block body #root diff --git a/dev/templates/legacy.pug b/server/views/base.pug similarity index 80% rename from dev/templates/legacy.pug rename to server/views/base.pug index 14f9d489..b5d2dd8c 100644 --- a/dev/templates/legacy.pug +++ b/server/views/base.pug @@ -1,5 +1,5 @@ doctype html -html +html(lang=siteConfig.lang) head meta(http-equiv='X-UA-Compatible', content='IE=edge') meta(charset='UTF-8') @@ -21,12 +21,23 @@ html //- Favicon link(rel='apple-touch-icon', sizes='180x180', href='/_assets/favicons/apple-touch-icon.png') - link(rel='icon', type='image/png', sizes='192x192', href='/_assets/favicons/android-icon-192x192.png') + link(rel='icon', type='image/png', sizes='192x192', href='/_assets/favicons/android-chrome-192x192.png') link(rel='icon', type='image/png', sizes='32x32', href='/_assets/favicons/favicon-32x32.png') link(rel='icon', type='image/png', sizes='16x16', href='/_assets/favicons/favicon-16x16.png') link(rel='mask-icon', href='/_assets/favicons/safari-pinned-tab.svg', color='#1976d2') link(rel='manifest', href='/_assets/manifest.json') + //- Site Properties + script. + var siteId = "!{siteId}" + var siteConfig = !{JSON.stringify(siteConfig)} + var siteLangs = !{JSON.stringify(langs)} + + //- Dev Mode Warning + if devMode + script. + siteConfig.devMode = true + //- Icon Set if config.theming.iconset === 'fa' link( @@ -42,26 +53,24 @@ html ) //- CSS - <% for (var index in htmlWebpackPlugin.files.css) { %> - link( - type='text/css' - rel='stylesheet' - href='<%= htmlWebpackPlugin.files.css[index] %>' - ) - <% } %> - - script( - crossorigin='anonymous' - src='https://polyfill.io/v3/polyfill.min.js?features=EventSource' - ) + //- JS - <% for (var index in htmlWebpackPlugin.files.js) { %> + + + script( + type='text/javascript' + src='/_assets-legacy/js/runtime.js' + ) + + + script( type='text/javascript' - src='<%= htmlWebpackPlugin.files.js[index] %>' + src='/_assets-legacy/js/app.js' ) - <% } %> + + != analyticsCode.head diff --git a/server/views/editor.pug b/server/views/editor.pug index 0f0b64c0..b395cbec 100644 --- a/server/views/editor.pug +++ b/server/views/editor.pug @@ -1,4 +1,4 @@ -extends master.pug +extends base.pug block head if injectCode.css diff --git a/server/views/error.pug b/server/views/error.pug index acc8e280..27d45321 100644 --- a/server/views/error.pug +++ b/server/views/error.pug @@ -1,4 +1,4 @@ -extends master.pug +extends base.pug block body #root.is-fullscreen diff --git a/server/views/history.pug b/server/views/history.pug index 5adb9c57..02384329 100644 --- a/server/views/history.pug +++ b/server/views/history.pug @@ -1,4 +1,4 @@ -extends master.pug +extends base.pug block head diff --git a/server/views/legacy/login.pug b/server/views/legacy/login.pug deleted file mode 100644 index cd519561..00000000 --- a/server/views/legacy/login.pug +++ /dev/null @@ -1,23 +0,0 @@ -extends master.pug - -block body - #root - .login-deprecated!= t('outdatedBrowserWarning', { modernBrowser: '' + t('modernBrowser') + '', interpolation: { escapeValue: false } }) - .login - .login-dialog - if err - .login-error= err.message - form(method='post', action='/login') - h1= config.title - select(name='strategy') - each str in formStrategies - option(value=str.key, selected)= str.title - input(type='text', name='user', placeholder=t('auth:fields.emailUser')) - input(type='password', name='pass', placeholder=t('auth:fields.password')) - button(type='submit')= t('auth:actions.login') - if socialStrategies.length - .login-social - h2= t('auth:orLoginUsingStrategy') - each str in socialStrategies - a.login-social-icon(href='/login/' + str.key, class=str.color) - != str.icon diff --git a/server/views/legacy/page.pug b/server/views/legacy/page.pug deleted file mode 100644 index 48e8ad5e..00000000 --- a/server/views/legacy/page.pug +++ /dev/null @@ -1,60 +0,0 @@ -extends master.pug - -block head - if injectCode.css - style(type='text/css')!= injectCode.css - if injectCode.head - != injectCode.head - -block body - #root - .header - span.header-title= siteConfig.title - span.header-deprecated!= t('outdatedBrowserWarning', { modernBrowser: '' + t('modernBrowser') + '', interpolation: { escapeValue: false } }) - span.header-login - if !isAuthenticated - a(href='/login', title='Login') - i.mdi.mdi-account-circle - else - a(href='/logout', title='Logout') - i.mdi.mdi-logout - .main - .sidebar - each navItem in sidebar - if navItem.k === 'link' - a.sidebar-link(href=navItem.t) - i.mdi(class=navItem.c) - span= navItem.l - else if navItem.k === 'divider' - .sidebar-divider - else if navItem.k === 'header' - .sidebar-title= navItem.l - .main-container - .page-header - .page-header-left - h1= page.title - h2= page.description - //- .page-header-right - //- .page-header-right-title Last edited by - //- .page-header-right-author= page.authorName - //- .page-header-right-updated= page.updatedAt - .page-contents.v-content - .contents - div!= page.render - if page.toc.length - .toc - .toc-title= t('page.toc') - each tocItem, tocIdx in page.toc - a.toc-tile(href=tocItem.anchor) - i.mdi.mdi-chevron-right - span= tocItem.title - if tocIdx < page.toc.length - 1 || tocItem.children.length - .toc-divider - each tocSubItem in tocItem.children - a.toc-tile.inset(href=tocSubItem.anchor) - i.mdi.mdi-chevron-right - span= tocSubItem.title - if tocIdx < page.toc.length - 1 - .toc-divider.inset - if injectCode.body - != injectCode.body diff --git a/server/views/login.pug b/server/views/login.pug index c0408cd9..80cc7395 100644 --- a/server/views/login.pug +++ b/server/views/login.pug @@ -1,4 +1,4 @@ -extends master.pug +extends base.pug block body #root.is-fullscreen diff --git a/server/views/new.pug b/server/views/new.pug index 79080d20..f1487b34 100644 --- a/server/views/new.pug +++ b/server/views/new.pug @@ -1,4 +1,4 @@ -extends master.pug +extends base.pug block body #root.is-fullscreen diff --git a/server/views/notfound.pug b/server/views/notfound.pug index d0d5d66e..f678c4dd 100644 --- a/server/views/notfound.pug +++ b/server/views/notfound.pug @@ -1,4 +1,4 @@ -extends master.pug +extends base.pug block body #root.is-fullscreen diff --git a/server/views/page.pug b/server/views/page.pug index cc19fbae..4cfd3eba 100644 --- a/server/views/page.pug +++ b/server/views/page.pug @@ -1,4 +1,4 @@ -extends master.pug +extends base.pug block head if injectCode.css diff --git a/server/views/profile.pug b/server/views/profile.pug index 084ae408..f0dd2560 100644 --- a/server/views/profile.pug +++ b/server/views/profile.pug @@ -1,4 +1,4 @@ -extends master.pug +extends base.pug block body #root diff --git a/server/views/register.pug b/server/views/register.pug index 952885f8..a02e2c2e 100644 --- a/server/views/register.pug +++ b/server/views/register.pug @@ -1,4 +1,4 @@ -extends master.pug +extends base.pug block body #root.is-fullscreen diff --git a/server/views/source.pug b/server/views/source.pug index c3cb1e95..59e9e6aa 100644 --- a/server/views/source.pug +++ b/server/views/source.pug @@ -1,4 +1,4 @@ -extends master.pug +extends base.pug block head diff --git a/server/views/tags.pug b/server/views/tags.pug index 6443f0b4..f2f49f8d 100644 --- a/server/views/tags.pug +++ b/server/views/tags.pug @@ -1,4 +1,4 @@ -extends master.pug +extends base.pug block body #root diff --git a/server/views/unauthorized.pug b/server/views/unauthorized.pug index 3a36ec69..02e5138e 100644 --- a/server/views/unauthorized.pug +++ b/server/views/unauthorized.pug @@ -1,4 +1,4 @@ -extends master.pug +extends base.pug block body #root.is-fullscreen diff --git a/server/views/welcome.pug b/server/views/welcome.pug index 3be66e23..56b7693d 100644 --- a/server/views/welcome.pug +++ b/server/views/welcome.pug @@ -1,4 +1,4 @@ -extends master.pug +extends base.pug block body #root.is-fullscreen diff --git a/server/master.js b/server/web.js similarity index 91% rename from server/master.js rename to server/web.js index 7c6fd342..ba88ef9d 100644 --- a/server/master.js +++ b/server/web.js @@ -149,15 +149,20 @@ module.exports = async () => { // ---------------------------------------- app.use(async (req, res, next) => { + const currentSite = await WIKI.models.sites.getSiteByHostname({ hostname: req.hostname }) + if (!currentSite) { + return res.status(404).send('Site Not Found') + } + res.locals.siteConfig = { - title: WIKI.config.title, - theme: WIKI.config.theming.theme, - darkMode: WIKI.config.theming.darkMode, - lang: WIKI.config.lang.code, - rtl: WIKI.config.lang.rtl, - company: WIKI.config.company, - contentLicense: WIKI.config.contentLicense, - logoUrl: WIKI.config.logoUrl + id: currentSite.id, + title: currentSite.config.title, + darkMode: currentSite.config.theme.dark, + lang: currentSite.config.locale, + rtl: false, // TODO: handle RTL + company: currentSite.config.company, + contentLicense: currentSite.config.contentLicense, + logoUrl: currentSite.config.logoUrl } res.locals.langs = await WIKI.models.locales.getNavLocales({ cache: true }) res.locals.analyticsCode = await WIKI.models.analytics.getCode({ cache: true }) diff --git a/ux/.eslintrc.js b/ux/.eslintrc.js index 037260f2..e6f432a8 100644 --- a/ux/.eslintrc.js +++ b/ux/.eslintrc.js @@ -68,6 +68,7 @@ module.exports = { 'prefer-promise-reject-errors': 'off', 'no-unused-vars': 'off', + 'vue/multi-word-component-names': 'off', // allow debugger during development only 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' diff --git a/ux/index.html b/ux/index.html index ac7a142b..684144bb 100644 --- a/ux/index.html +++ b/ux/index.html @@ -8,6 +8,9 @@ Wiki.js + + + diff --git a/ux/src/router/routes.js b/ux/src/router/routes.js index 6598d5d4..c1e94be4 100644 --- a/ux/src/router/routes.js +++ b/ux/src/router/routes.js @@ -8,13 +8,13 @@ const routes = [ // { path: 'n/:editor?', component: () => import('../pages/Index.vue') } // ] // }, - // { - // path: '/login', - // component: () => import('../layouts/AuthLayout.vue'), - // children: [ - // { path: '', component: () => import('../pages/Login.vue') } - // ] - // }, + { + path: '/login', + component: () => import('../layouts/AuthLayout.vue'), + children: [ + { path: '', component: () => import('../pages/Login.vue') } + ] + }, // { // path: '/p', // component: () => import('../layouts/ProfileLayout.vue'), diff --git a/ux/src/stores/admin.js b/ux/src/stores/admin.js index 606d854b..e692f738 100644 --- a/ux/src/stores/admin.js +++ b/ux/src/stores/admin.js @@ -1,6 +1,6 @@ import { defineStore } from 'pinia' import gql from 'graphql-tag' -import cloneDeep from 'lodash/cloneDeep' +import { cloneDeep } from 'lodash-es' /* global APOLLO_CLIENT */ diff --git a/ux/src/stores/site.js b/ux/src/stores/site.js index 03fc733a..a631f236 100644 --- a/ux/src/stores/site.js +++ b/ux/src/stores/site.js @@ -1,6 +1,6 @@ import { defineStore } from 'pinia' import gql from 'graphql-tag' -import clone from 'lodash/clone' +import { clone } from 'lodash-es' export const useSiteStore = defineStore('site', { state: () => ({ diff --git a/ux/yarn.lock b/ux/yarn.lock index c4b1f9b4..bef90c4a 100644 --- a/ux/yarn.lock +++ b/ux/yarn.lock @@ -5,9 +5,9 @@ __metadata: version: 6 cacheKey: 8 -"@apollo/client@npm:3.6.8": - version: 3.6.8 - resolution: "@apollo/client@npm:3.6.8" +"@apollo/client@npm:3.6.9": + version: 3.6.9 + resolution: "@apollo/client@npm:3.6.9" dependencies: "@graphql-typed-document-node/core": ^3.1.1 "@wry/context": ^0.6.0 @@ -33,7 +33,7 @@ __metadata: optional: true subscriptions-transport-ws: optional: true - checksum: c29dd3f68952cf17229b72d39188e0d93ea672ae1e1615f90b1d95ba7553c6a03bc16dede7c13b23c60e9863d7ff183f56d62b233a761127000f544a490f63f7 + checksum: a3c037ef3465cb5d736d8495c9c2dcb9741e39d9c102f147b479af1923c5913f710981a311d1098b9969ebe87769b749c22274decb5977ad0619032e7ac2cf26 languageName: node linkType: hard @@ -130,7 +130,19 @@ __metadata: languageName: node linkType: hard -"@codemirror/commands@npm:6.0.0, @codemirror/commands@npm:6.x, @codemirror/commands@npm:^6.0.0": +"@codemirror/commands@npm:6.0.1": + version: 6.0.1 + resolution: "@codemirror/commands@npm:6.0.1" + dependencies: + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + checksum: 7b3b73596c13d256b267aa7e2a0dd1fb297426918e9e42135faa4280cc220ff66b0d4743cd6214b6ed2111eccf3c125d1f197fc8585c48c45b386210d53673dd + languageName: node + linkType: hard + +"@codemirror/commands@npm:6.x, @codemirror/commands@npm:^6.0.0": version: 6.0.0 resolution: "@codemirror/commands@npm:6.0.0" dependencies: @@ -225,7 +237,22 @@ __metadata: languageName: node linkType: hard -"@codemirror/lang-html@npm:6.0.0, @codemirror/lang-html@npm:^6.0.0": +"@codemirror/lang-html@npm:6.1.0": + version: 6.1.0 + resolution: "@codemirror/lang-html@npm:6.1.0" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/lang-css": ^6.0.0 + "@codemirror/lang-javascript": ^6.0.0 + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@lezer/common": ^1.0.0 + "@lezer/html": ^1.0.0 + checksum: 7a526c9b626d034d6b340d1dfe44061e5e3af87c875709a69de830ed102ce32b71ed733ba0ff02b78388371497907970e163ec84f0ae90a58a807122a17348e0 + languageName: node + linkType: hard + +"@codemirror/lang-html@npm:^6.0.0": version: 6.0.0 resolution: "@codemirror/lang-html@npm:6.0.0" dependencies: @@ -240,7 +267,22 @@ __metadata: languageName: node linkType: hard -"@codemirror/lang-javascript@npm:6.0.0, @codemirror/lang-javascript@npm:^6.0.0": +"@codemirror/lang-javascript@npm:6.0.1": + version: 6.0.1 + resolution: "@codemirror/lang-javascript@npm:6.0.1" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/language": ^6.0.0 + "@codemirror/lint": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + "@lezer/javascript": ^1.0.0 + checksum: 630573877ec3f2fdaedf3c7bf3bf9a8a7645f76bde52ad2d4c51cb1e173b49ccda5d7944f98521ff5f723ec12ae196c03a9f044fe91e50a5bf615d3b867966cf + languageName: node + linkType: hard + +"@codemirror/lang-javascript@npm:^6.0.0": version: 6.0.0 resolution: "@codemirror/lang-javascript@npm:6.0.0" dependencies: @@ -424,7 +466,18 @@ __metadata: languageName: node linkType: hard -"@codemirror/view@npm:6.0.1, @codemirror/view@npm:6.x, @codemirror/view@npm:^6.0.0": +"@codemirror/view@npm:6.0.2": + version: 6.0.2 + resolution: "@codemirror/view@npm:6.0.2" + dependencies: + "@codemirror/state": ^6.0.0 + style-mod: ^4.0.0 + w3c-keyname: ^2.2.4 + checksum: a9dbc2b97cb1aa8d88bd0cdcc9560660c89ecff93fd86b6ecdda920a6bd22b0e1ccf72c010ac743d7daf4185a03c78bafecd9860e336585bbcca0b93dde55566 + languageName: node + linkType: hard + +"@codemirror/view@npm:6.x, @codemirror/view@npm:^6.0.0": version: 6.0.1 resolution: "@codemirror/view@npm:6.0.1" dependencies: @@ -830,9 +883,9 @@ __metadata: languageName: node linkType: hard -"@quasar/app-vite@npm:1.0.2": - version: 1.0.2 - resolution: "@quasar/app-vite@npm:1.0.2" +"@quasar/app-vite@npm:1.0.4": + version: 1.0.4 + resolution: "@quasar/app-vite@npm:1.0.4" dependencies: "@quasar/fastclick": 1.1.5 "@quasar/vite-plugin": ^1.0.9 @@ -848,7 +901,7 @@ __metadata: cross-spawn: ^7.0.3 dot-prop: 6.0.1 elementtree: 0.1.7 - esbuild: 0.14.29 + esbuild: 0.14.47 express: ^4.17.3 fast-glob: 3.2.11 fs-extra: ^10.0.1 @@ -868,7 +921,7 @@ __metadata: semver: ^7.3.5 serialize-javascript: ^6.0.0 table: ^6.8.0 - vite: 2.9.1 + vite: 2.9.13 webpack-merge: ^5.8.0 peerDependencies: electron-builder: ^22.0.0 @@ -895,14 +948,14 @@ __metadata: optional: true bin: quasar: bin/quasar - checksum: b6fac0061299605f9c77a0ab683298e476c4b606bdafe87ca3db871e88a65017e8079703df0300191b4f7a9b5b067cde7935913041ac546c98b1dc0309d3fec9 + checksum: 531e1a640602f71947caa10595076c10a1ff2b80b676c641f088399245b66cd2851d8c365fc7cdeda71bf214b33fa14600fdfb22cf40d37be7ab7a7622052744 languageName: node linkType: hard -"@quasar/extras@npm:1.14.0": - version: 1.14.0 - resolution: "@quasar/extras@npm:1.14.0" - checksum: 60eacf3995172a11c59af6266461f665219488e33e85ab99fb293365fdd95e3dda5427a5ab548b7a5058ee0e3f5d4a6045ad8feeb99e1b0ad9b37f1cbd8d2100 +"@quasar/extras@npm:1.14.2": + version: 1.14.2 + resolution: "@quasar/extras@npm:1.14.2" + checksum: 600305d8fb641eca6990ef1527ce544c35835a4af088b58263851b70df444d6890e134dc01cb7da3f256ec8b5ae369ce2d5c29ddadff2452fff6e080e0411905 languageName: node linkType: hard @@ -1896,6 +1949,15 @@ __metadata: languageName: node linkType: hard +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: ^1.9.0 + checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 + languageName: node + linkType: hard + "ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" @@ -2043,24 +2105,6 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:10.4.7": - version: 10.4.7 - resolution: "autoprefixer@npm:10.4.7" - dependencies: - browserslist: ^4.20.3 - caniuse-lite: ^1.0.30001335 - fraction.js: ^4.2.0 - normalize-range: ^0.1.2 - picocolors: ^1.0.0 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.1.0 - bin: - autoprefixer: bin/autoprefixer - checksum: 0e55d0d19806c672ec0c79cc23c27cf77e90edf2600670735266ba33ec5294458f404baaa2f7cd4cfe359cf7a97b3c86f01886bdbdc129a4f2f76ca5977a91af - languageName: node - linkType: hard - "babel-walk@npm:3.0.0-canary-5": version: 3.0.0-canary-5 resolution: "babel-walk@npm:3.0.0-canary-5" @@ -2155,25 +2199,21 @@ __metadata: languageName: node linkType: hard -"browser-fs-access@npm:0.29.6": - version: 0.29.6 - resolution: "browser-fs-access@npm:0.29.6" - checksum: 9ee904e3a62cd92b60de1aa3121b5d46c2700e1ee09e14d27681563c9772181c6d219a4f80865856b707a3e68b09bd0c20821f06490096311fa1a0b91d2d53a8 +"browser-fs-access@npm:0.30.2": + version: 0.30.2 + resolution: "browser-fs-access@npm:0.30.2" + checksum: 4fa53ebe2e5ea5fb2df39f2ce78ae67cf3b0710877f123d57d8a9f7be171e27b8c8413079fe023612aa05d27549c38ff68a94f694750fd766cf9ecd80067d822 languageName: node linkType: hard -"browserslist@npm:^4.20.3": - version: 4.20.3 - resolution: "browserslist@npm:4.20.3" +"browserlist@npm:latest": + version: 1.0.1 + resolution: "browserlist@npm:1.0.1" dependencies: - caniuse-lite: ^1.0.30001332 - electron-to-chromium: ^1.4.118 - escalade: ^3.1.1 - node-releases: ^2.0.3 - picocolors: ^1.0.0 + chalk: ^2.4.1 bin: - browserslist: cli.js - checksum: 1e4b719ac2ca0fe235218a606e8b8ef16b8809e0973b924158c39fbc435a0b0fe43437ea52dd6ef5ad2efcb83fcb07431244e472270177814217f7c563651f7d + browserlist: ./cli.js + checksum: db4dc273b59637f4e716676978d2c8a2431fb021860ec8ea9552eebe24bff67e955630d42c3995a9b03c1606819b18fb032ab943103b54b830933ec4d695e516 languageName: node linkType: hard @@ -2270,17 +2310,14 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001332": - version: 1.0.30001334 - resolution: "caniuse-lite@npm:1.0.30001334" - checksum: 1a1c783942d53ca37dc3dbdd7c4a6f7994996d0bfd178d4f4cdd714c6b09d9d9f48a3a2452e009e8203aba4b7a2da43f3d9d88060668a46fc237dbe0d39358a3 - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001335": - version: 1.0.30001341 - resolution: "caniuse-lite@npm:1.0.30001341" - checksum: 7262b093fb0bf49dbc5328418f5ce4e3dbb0b13e39c015f986ba1807634c123ac214efc94df7d095a336f57f86852b4b63ee61838f18dcc3a4a35f87b390c8f5 +"chalk@npm:^2.4.1": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 languageName: node linkType: hard @@ -2422,9 +2459,9 @@ __metadata: languageName: node linkType: hard -"codemirror@npm:6.0.0": - version: 6.0.0 - resolution: "codemirror@npm:6.0.0" +"codemirror@npm:6.0.1": + version: 6.0.1 + resolution: "codemirror@npm:6.0.1" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/commands": ^6.0.0 @@ -2433,7 +2470,16 @@ __metadata: "@codemirror/search": ^6.0.0 "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 - checksum: 42fb2b5ac5d4b8616a733de5efd7913764c1d13dcc27f732af5ed5e98f657a53ab5549437b53d73ed89d004423141ee65612a5e54c451538ef6d75afed4cd3e2 + checksum: 1a78f7077ac5801bdbff162aa0c61bf2b974603c7e9a477198c3ce50c789af674a061d7c293c58b73807eda345c2b5228c38ad2aabb9319d552d5486f785cbef + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: 1.1.3 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 languageName: node linkType: hard @@ -2446,6 +2492,13 @@ __metadata: languageName: node linkType: hard +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + languageName: node + linkType: hard + "color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" @@ -2789,13 +2842,6 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.118": - version: 1.4.137 - resolution: "electron-to-chromium@npm:1.4.137" - checksum: 639d7b94906efafcf363519c3698eecc44be46755a6a5cdc9088954329978866cc93fbd57e08b97290599b68d5226243d21de9fa50be416b8a5d3fa8fd42c3a0 - languageName: node - linkType: hard - "elementtree@npm:0.1.7": version: 0.1.7 resolution: "elementtree@npm:0.1.7" @@ -2890,13 +2936,6 @@ __metadata: languageName: node linkType: hard -"esbuild-android-64@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-android-64@npm:0.14.29" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - "esbuild-android-64@npm:0.14.34": version: 0.14.34 resolution: "esbuild-android-64@npm:0.14.34" @@ -2904,10 +2943,10 @@ __metadata: languageName: node linkType: hard -"esbuild-android-arm64@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-android-arm64@npm:0.14.29" - conditions: os=android & cpu=arm64 +"esbuild-android-64@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-android-64@npm:0.14.47" + conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -2918,10 +2957,10 @@ __metadata: languageName: node linkType: hard -"esbuild-darwin-64@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-darwin-64@npm:0.14.29" - conditions: os=darwin & cpu=x64 +"esbuild-android-arm64@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-android-arm64@npm:0.14.47" + conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -2932,10 +2971,10 @@ __metadata: languageName: node linkType: hard -"esbuild-darwin-arm64@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-darwin-arm64@npm:0.14.29" - conditions: os=darwin & cpu=arm64 +"esbuild-darwin-64@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-darwin-64@npm:0.14.47" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -2946,10 +2985,10 @@ __metadata: languageName: node linkType: hard -"esbuild-freebsd-64@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-freebsd-64@npm:0.14.29" - conditions: os=freebsd & cpu=x64 +"esbuild-darwin-arm64@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-darwin-arm64@npm:0.14.47" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -2960,10 +2999,10 @@ __metadata: languageName: node linkType: hard -"esbuild-freebsd-arm64@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-freebsd-arm64@npm:0.14.29" - conditions: os=freebsd & cpu=arm64 +"esbuild-freebsd-64@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-freebsd-64@npm:0.14.47" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -2974,10 +3013,10 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-32@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-linux-32@npm:0.14.29" - conditions: os=linux & cpu=ia32 +"esbuild-freebsd-arm64@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-freebsd-arm64@npm:0.14.47" + conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -2988,10 +3027,10 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-64@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-linux-64@npm:0.14.29" - conditions: os=linux & cpu=x64 +"esbuild-linux-32@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-linux-32@npm:0.14.47" + conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -3002,10 +3041,10 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-arm64@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-linux-arm64@npm:0.14.29" - conditions: os=linux & cpu=arm64 +"esbuild-linux-64@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-linux-64@npm:0.14.47" + conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -3016,10 +3055,10 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-arm@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-linux-arm@npm:0.14.29" - conditions: os=linux & cpu=arm +"esbuild-linux-arm64@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-linux-arm64@npm:0.14.47" + conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -3030,10 +3069,10 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-mips64le@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-linux-mips64le@npm:0.14.29" - conditions: os=linux & cpu=mips64el +"esbuild-linux-arm@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-linux-arm@npm:0.14.47" + conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -3044,10 +3083,10 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-ppc64le@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-linux-ppc64le@npm:0.14.29" - conditions: os=linux & cpu=ppc64 +"esbuild-linux-mips64le@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-linux-mips64le@npm:0.14.47" + conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -3058,10 +3097,10 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-riscv64@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-linux-riscv64@npm:0.14.29" - conditions: os=linux & cpu=riscv64 +"esbuild-linux-ppc64le@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-linux-ppc64le@npm:0.14.47" + conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -3072,10 +3111,10 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-s390x@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-linux-s390x@npm:0.14.29" - conditions: os=linux & cpu=s390x +"esbuild-linux-riscv64@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-linux-riscv64@npm:0.14.47" + conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -3086,10 +3125,10 @@ __metadata: languageName: node linkType: hard -"esbuild-netbsd-64@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-netbsd-64@npm:0.14.29" - conditions: os=netbsd & cpu=x64 +"esbuild-linux-s390x@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-linux-s390x@npm:0.14.47" + conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -3100,10 +3139,10 @@ __metadata: languageName: node linkType: hard -"esbuild-openbsd-64@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-openbsd-64@npm:0.14.29" - conditions: os=openbsd & cpu=x64 +"esbuild-netbsd-64@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-netbsd-64@npm:0.14.47" + conditions: os=netbsd & cpu=x64 languageName: node linkType: hard @@ -3114,10 +3153,10 @@ __metadata: languageName: node linkType: hard -"esbuild-sunos-64@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-sunos-64@npm:0.14.29" - conditions: os=sunos & cpu=x64 +"esbuild-openbsd-64@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-openbsd-64@npm:0.14.47" + conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -3128,10 +3167,10 @@ __metadata: languageName: node linkType: hard -"esbuild-windows-32@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-windows-32@npm:0.14.29" - conditions: os=win32 & cpu=ia32 +"esbuild-sunos-64@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-sunos-64@npm:0.14.47" + conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -3142,10 +3181,10 @@ __metadata: languageName: node linkType: hard -"esbuild-windows-64@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-windows-64@npm:0.14.29" - conditions: os=win32 & cpu=x64 +"esbuild-windows-32@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-windows-32@npm:0.14.47" + conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -3156,10 +3195,10 @@ __metadata: languageName: node linkType: hard -"esbuild-windows-arm64@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild-windows-arm64@npm:0.14.29" - conditions: os=win32 & cpu=arm64 +"esbuild-windows-64@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-windows-64@npm:0.14.47" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -3170,30 +3209,37 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:0.14.29": - version: 0.14.29 - resolution: "esbuild@npm:0.14.29" - dependencies: - esbuild-android-64: 0.14.29 - esbuild-android-arm64: 0.14.29 - esbuild-darwin-64: 0.14.29 - esbuild-darwin-arm64: 0.14.29 - esbuild-freebsd-64: 0.14.29 - esbuild-freebsd-arm64: 0.14.29 - esbuild-linux-32: 0.14.29 - esbuild-linux-64: 0.14.29 - esbuild-linux-arm: 0.14.29 - esbuild-linux-arm64: 0.14.29 - esbuild-linux-mips64le: 0.14.29 - esbuild-linux-ppc64le: 0.14.29 - esbuild-linux-riscv64: 0.14.29 - esbuild-linux-s390x: 0.14.29 - esbuild-netbsd-64: 0.14.29 - esbuild-openbsd-64: 0.14.29 - esbuild-sunos-64: 0.14.29 - esbuild-windows-32: 0.14.29 - esbuild-windows-64: 0.14.29 - esbuild-windows-arm64: 0.14.29 +"esbuild-windows-arm64@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild-windows-arm64@npm:0.14.47" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"esbuild@npm:0.14.47": + version: 0.14.47 + resolution: "esbuild@npm:0.14.47" + dependencies: + esbuild-android-64: 0.14.47 + esbuild-android-arm64: 0.14.47 + esbuild-darwin-64: 0.14.47 + esbuild-darwin-arm64: 0.14.47 + esbuild-freebsd-64: 0.14.47 + esbuild-freebsd-arm64: 0.14.47 + esbuild-linux-32: 0.14.47 + esbuild-linux-64: 0.14.47 + esbuild-linux-arm: 0.14.47 + esbuild-linux-arm64: 0.14.47 + esbuild-linux-mips64le: 0.14.47 + esbuild-linux-ppc64le: 0.14.47 + esbuild-linux-riscv64: 0.14.47 + esbuild-linux-s390x: 0.14.47 + esbuild-netbsd-64: 0.14.47 + esbuild-openbsd-64: 0.14.47 + esbuild-sunos-64: 0.14.47 + esbuild-windows-32: 0.14.47 + esbuild-windows-64: 0.14.47 + esbuild-windows-arm64: 0.14.47 dependenciesMeta: esbuild-android-64: optional: true @@ -3237,7 +3283,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 3066b9f5bc33b56c22fa1b14f6fd6b7cee292858b042d5f9051c87e57472a134045e653526612ea75fa4dfed3ed767b80c35165b819b4f29d92bf2e69c5fe37d + checksum: 77a8bff8c3fe52dc9d2823448843b0f53c9a9f3701e3637a54e396270c9ca04cc46a4b08ef86cbaa8d202854e02c790f61683bfa75ebff540b1e24414f536e91 languageName: node linkType: hard @@ -3502,9 +3548,9 @@ __metadata: languageName: node linkType: hard -"eslint@npm:8.18.0": - version: 8.18.0 - resolution: "eslint@npm:8.18.0" +"eslint@npm:8.19.0": + version: 8.19.0 + resolution: "eslint@npm:8.19.0" dependencies: "@eslint/eslintrc": ^1.3.0 "@humanwhocodes/config-array": ^0.9.2 @@ -3543,7 +3589,7 @@ __metadata: v8-compile-cache: ^2.0.3 bin: eslint: bin/eslint.js - checksum: d9b4b7488a9cee97608343cbb5ac652d3f316436f95ef0800cd9497c1c6f877b655a3275817989c02f1ff0d5dfd1959c5092af9251c7e3fcf60659da37752a10 + checksum: 0bc9df1a3a09dcd5a781ec728f280aa8af3ab19c2d1f14e2668b5ee5b8b1fb0e72dde5c3acf738e7f4281685fb24ec149b6154255470b06cf41de76350bca7a4 languageName: node linkType: hard @@ -3748,10 +3794,10 @@ __metadata: languageName: node linkType: hard -"filesize@npm:9.0.9": - version: 9.0.9 - resolution: "filesize@npm:9.0.9" - checksum: 2901b5eb3abd9d553ca52fafcebb159c60d7c11489d58703feb8850afd3dba7f619cfce61450bab52b846c12f9c4f3cb7be591985eada5af3eea82b04a23faf9 +"filesize@npm:9.0.11": + version: 9.0.11 + resolution: "filesize@npm:9.0.11" + checksum: 7e8a9f9a4089e3ee29de64c241b50db8db4008351ace959873cb950bac0c2e1e09f4b45f42eaed8acd589a895dde978ed199e7a9982902fa06ca0be48e5ea92d languageName: node linkType: hard @@ -3819,13 +3865,6 @@ __metadata: languageName: node linkType: hard -"fraction.js@npm:^4.2.0": - version: 4.2.0 - resolution: "fraction.js@npm:4.2.0" - checksum: 8c76a6e21dedea87109d6171a0ac77afa14205794a565d71cb10d2925f629a3922da61bf45ea52dbc30bce4d8636dc0a27213a88cbd600eab047d82f9a3a94c5 - languageName: node - linkType: hard - "fresh@npm:0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" @@ -4040,6 +4079,13 @@ __metadata: languageName: node linkType: hard +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -4791,7 +4837,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:4.17.21, lodash@npm:^4.17.10, lodash@npm:^4.17.20, lodash@npm:^4.17.21": +"lodash@npm:^4.17.10, lodash@npm:^4.17.20, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -5117,12 +5163,12 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.3": - version: 3.3.3 - resolution: "nanoid@npm:3.3.3" +"nanoid@npm:^3.3.4": + version: 3.3.4 + resolution: "nanoid@npm:3.3.4" bin: nanoid: bin/nanoid.cjs - checksum: ada019402a07464a694553c61d2dca8a4353645a7d92f2830f0d487fedff403678a0bee5323a46522752b2eab95a0bc3da98b6cccaa7c0c55cd9975130e6d6f0 + checksum: 2fddd6dee994b7676f008d3ffa4ab16035a754f4bb586c61df5a22cf8c8c94017aadd360368f47d653829e0569a92b129979152ff97af23a558331e47e37cd9c languageName: node linkType: hard @@ -5169,13 +5215,6 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.3": - version: 2.0.4 - resolution: "node-releases@npm:2.0.4" - checksum: b32d6c2032c7b169ae3938b416fc50f123f5bd577d54a79b2ae201febf27b22846b01c803dd35ac8689afe840f8ba4e5f7154723db629b80f359836b6707b92f - languageName: node - linkType: hard - "nopt@npm:^5.0.0": version: 5.0.0 resolution: "nopt@npm:5.0.0" @@ -5194,13 +5233,6 @@ __metadata: languageName: node linkType: hard -"normalize-range@npm:^0.1.2": - version: 0.1.2 - resolution: "normalize-range@npm:0.1.2" - checksum: 9b2f14f093593f367a7a0834267c24f3cb3e887a2d9809c77d8a7e5fd08738bcd15af46f0ab01cc3a3d660386f015816b5c922cea8bf2ee79777f40874063184 - languageName: node - linkType: hard - "npmlog@npm:^6.0.0": version: 6.0.2 resolution: "npmlog@npm:6.0.2" @@ -5515,32 +5547,25 @@ __metadata: languageName: node linkType: hard -"postcss-value-parser@npm:^4.2.0": - version: 4.2.0 - resolution: "postcss-value-parser@npm:4.2.0" - checksum: 819ffab0c9d51cf0acbabf8996dffbfafbafa57afc0e4c98db88b67f2094cb44488758f06e5da95d7036f19556a4a732525e84289a425f4f6fd8e412a9d7442f - languageName: node - linkType: hard - -"postcss@npm:*": - version: 8.4.13 - resolution: "postcss@npm:8.4.13" +"postcss@npm:^8.1.10, postcss@npm:^8.4.12, postcss@npm:^8.4.4": + version: 8.4.12 + resolution: "postcss@npm:8.4.12" dependencies: - nanoid: ^3.3.3 + nanoid: ^3.3.1 picocolors: ^1.0.0 source-map-js: ^1.0.2 - checksum: 514fb3552805a5d039a2d6b4df3e73f657001716ca93c0d57e6067b0473abdea70276d80afc96005c9aaff82ed5d98062bd97724d3f47ca400fba0b5e9e436ed + checksum: 248e3d0f9bbb8efaafcfda7f91627a29bdc9a19f456896886330beb28c5abea0e14c7901b35191928602e2eccbed496b1e94097d27a0b2a980854cd00c7a835f languageName: node linkType: hard -"postcss@npm:^8.1.10, postcss@npm:^8.4.12, postcss@npm:^8.4.4": - version: 8.4.12 - resolution: "postcss@npm:8.4.12" +"postcss@npm:^8.4.13": + version: 8.4.14 + resolution: "postcss@npm:8.4.14" dependencies: - nanoid: ^3.3.1 + nanoid: ^3.3.4 picocolors: ^1.0.0 source-map-js: ^1.0.2 - checksum: 248e3d0f9bbb8efaafcfda7f91627a29bdc9a19f456896886330beb28c5abea0e14c7901b35191928602e2eccbed496b1e94097d27a0b2a980854cd00c7a835f + checksum: fe58766ff32e4becf65a7d57678995cfd239df6deed2fe0557f038b47c94e4132e7e5f68b5aa820c13adfec32e523b693efaeb65798efb995ce49ccd83953816 languageName: node linkType: hard @@ -5870,10 +5895,10 @@ __metadata: languageName: node linkType: hard -"quasar@npm:2.7.3": - version: 2.7.3 - resolution: "quasar@npm:2.7.3" - checksum: 42ae066c7a7e477731e3063bfa6b097bc89a670dac4781dd3e72d3c16e0db61a909f09eea21ef342592953fd6167f80a4c9add20722d4df0229616d3a86f5810 +"quasar@npm:2.7.4": + version: 2.7.4 + resolution: "quasar@npm:2.7.4" + checksum: f527377c1f789f013a37aa9db023aa5c1680ed31c13eb05baa07f13c74ee2ddf97e5d1dac996cce4ecb9b8e5b4fd3101d115b458f10dede1776b7fc0c7adf7bf languageName: node linkType: hard @@ -6487,6 +6512,15 @@ __metadata: languageName: node linkType: hard +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + languageName: node + linkType: hard + "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -6783,30 +6817,30 @@ __metadata: version: 0.0.0-use.local resolution: "ux@workspace:." dependencies: - "@apollo/client": 3.6.8 + "@apollo/client": 3.6.9 "@codemirror/autocomplete": 6.0.2 "@codemirror/basic-setup": 0.20.0 "@codemirror/closebrackets": 0.19.2 - "@codemirror/commands": 6.0.0 + "@codemirror/commands": 6.0.1 "@codemirror/comment": 0.19.1 "@codemirror/fold": 0.19.4 "@codemirror/gutter": 0.19.9 "@codemirror/highlight": 0.19.8 "@codemirror/history": 0.19.2 "@codemirror/lang-css": 6.0.0 - "@codemirror/lang-html": 6.0.0 - "@codemirror/lang-javascript": 6.0.0 + "@codemirror/lang-html": 6.1.0 + "@codemirror/lang-javascript": 6.0.1 "@codemirror/lang-json": 6.0.0 "@codemirror/lang-markdown": 6.0.0 "@codemirror/matchbrackets": 0.19.4 "@codemirror/search": 6.0.0 "@codemirror/state": 6.0.1 "@codemirror/tooltip": 0.19.16 - "@codemirror/view": 6.0.1 + "@codemirror/view": 6.0.2 "@intlify/vite-plugin-vue-i18n": 3.4.0 "@lezer/common": 1.0.0 - "@quasar/app-vite": 1.0.2 - "@quasar/extras": 1.14.0 + "@quasar/app-vite": 1.0.4 + "@quasar/extras": 1.14.2 "@tiptap/core": 2.0.0-beta.176 "@tiptap/extension-code-block": 2.0.0-beta.37 "@tiptap/extension-code-block-lowlight": 2.0.0-beta.68 @@ -6834,31 +6868,30 @@ __metadata: "@types/lodash": 4.14.182 "@vue/apollo-option": 4.0.0-alpha.17 apollo-upload-client: 17.0.0 - autoprefixer: 10.4.7 - browser-fs-access: 0.29.6 + browser-fs-access: 0.30.2 + browserlist: latest clipboard: 2.0.11 - codemirror: 6.0.0 - eslint: 8.18.0 + codemirror: 6.0.1 + eslint: 8.19.0 eslint-config-standard: 17.0.0 eslint-plugin-import: 2.26.0 eslint-plugin-n: 15.2.3 eslint-plugin-promise: 6.0.0 eslint-plugin-vue: 9.1.1 - filesize: 9.0.9 + filesize: 9.0.11 filesize-parser: 1.5.0 graphql: 16.5.0 graphql-tag: 2.12.6 js-cookie: 3.0.1 jwt-decode: 3.1.2 - lodash: 4.17.21 lodash-es: 4.17.21 luxon: 2.4.0 pinia: 2.0.14 pug: 3.0.2 - quasar: 2.7.3 + quasar: 2.7.4 tippy.js: 6.3.7 uuid: 8.3.2 - v-network-graph: 0.5.19 + v-network-graph: 0.6.3 vue: 3.2.37 vue-codemirror: 6.0.0 vue-i18n: 9.1.10 @@ -6868,16 +6901,16 @@ __metadata: languageName: unknown linkType: soft -"v-network-graph@npm:0.5.19": - version: 0.5.19 - resolution: "v-network-graph@npm:0.5.19" +"v-network-graph@npm:0.6.3": + version: 0.6.3 + resolution: "v-network-graph@npm:0.6.3" dependencies: "@dash14/svg-pan-zoom": ^3.6.8 mitt: ^3.0.0 peerDependencies: d3-force: ^3.0.0 vue: ^3.2.31 - checksum: 98be123d78cd68454bd2d64a13678031c8b7cdea8610698d4211bf5b56e740df5fc367a75c23e823417385e08609c9b48785e4116aff2046208344f636a3f5a1 + checksum: cecae746aaf6fd0f480b0a251b4d50dab89a16e88420c7ffd2de0fe5c5fb32a72cb19f94c3b6a19a4e83110fa0a136635c148b5231988c29e807dadb877f691a languageName: node linkType: hard @@ -6924,13 +6957,13 @@ __metadata: languageName: node linkType: hard -"vite@npm:2.9.1": - version: 2.9.1 - resolution: "vite@npm:2.9.1" +"vite@npm:2.9.13": + version: 2.9.13 + resolution: "vite@npm:2.9.13" dependencies: esbuild: ^0.14.27 fsevents: ~2.3.2 - postcss: ^8.4.12 + postcss: ^8.4.13 resolve: ^1.22.0 rollup: ^2.59.0 peerDependencies: @@ -6949,7 +6982,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 0f0ac9337fa5c17faa4a59831a2df17475563b23a6162e86b2b60b19835ca1277f3249ea7a6608880354b39caf05779e9bad1e3b1f5b27010deced224aae47ea + checksum: a5e501b920a448c352e9b3836019dea56c523535f8e8540160708c2e164d84da6655ae39abbba1e2888092f5c6cd03dd06279852422359b51be601914645f49f languageName: node linkType: hard