@live-change/frontend-template 0.1.5 → 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Dockerfile ADDED
@@ -0,0 +1,52 @@
1
+ FROM --platform=amd64 debian:buster
2
+
3
+ # SYSTEM
4
+ RUN echo no cache 3
5
+ RUN apt-get -qq update
6
+ RUN apt-get install -qq -y wget curl apt-utils git openssh-server locales gnupg2 make cmake gcc g++ unzip nano \
7
+ alpine-pico fish rsync
8
+
9
+ ENV LANG en_US.UTF-8
10
+ ENV LANGUAGE en_US.UTF-8
11
+ ENV LC_ALL en_US.UTF-8
12
+ RUN echo "LC_ALL=en_US.UTF-8" >> /etc/environment
13
+ RUN echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
14
+ RUN echo "LANG=en_US.UTF-8" > /etc/locale.conf
15
+ RUN locale-gen en_US.UTF-8
16
+
17
+ # NODE
18
+ RUN curl -sL https://deb.nodesource.com/setup_20.x | bash -
19
+ RUN apt-get install -y nodejs
20
+
21
+ #NPM, PM2
22
+ RUN npm install cross-env yarn -g
23
+
24
+ # APP
25
+ RUN mkdir -p /app
26
+ WORKDIR /app
27
+ COPY package-deps.json package.json
28
+ RUN --mount=type=secret,id=npmrc,target=/root/.npmrc yarn install
29
+
30
+ RUN mkdir -p /app/docker
31
+ COPY docker/restore-backup-with-service.sh /app/docker/restore-backup-with-service.sh
32
+ COPY docker/restore-backup.sh /app/docker/restore-backup.sh
33
+ COPY /front front
34
+ COPY /server server
35
+ COPY package.json package.json
36
+
37
+ ARG VERSION='unknown'
38
+
39
+ ENV VERSION=$VERSION
40
+
41
+ RUN echo "VERSION=$VERSION" >> /etc/environment
42
+
43
+ RUN npm run build
44
+
45
+ # START
46
+ EXPOSE 8001
47
+ EXPOSE 8007
48
+ COPY docker/start-service.sh /start-service.sh
49
+ COPY docker/app.initd.sh /etc/init.d/app
50
+
51
+ #CMD /start-service.sh
52
+ CMD node server/start.js ssrServer --withApi --withServices --updateServices --enableSessions --createDb
@@ -0,0 +1,73 @@
1
+ #!/bin/bash -e
2
+
3
+ # Quick start-stop-daemon example, derived from Debian /etc/init.d/ssh
4
+
5
+ NAME=app
6
+ DIR=/app
7
+ PIDFILE=/var/run/$NAME.pid
8
+ DAEMON=/usr/bin/node
9
+ DAEMON_ARGS="server/start.js server ssrServer --withApi --withServices --updateServices --enableSessions --createDb"
10
+ STOP_SIGNAL=INT
11
+ USER=root
12
+ LOG=/var/log/$NAME.log
13
+
14
+ export NODE_ENV=production
15
+ export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"
16
+
17
+ common_opts="--quiet --chuid $USER --pidfile $PIDFILE"
18
+
19
+ do_start(){
20
+ start-stop-daemon --start $common_opts --chdir $DIR --make-pidfile --background --startas \
21
+ /bin/bash -- -c "exec $DAEMON $DAEMON_ARGS > $LOG 2>&1"
22
+ }
23
+
24
+ do_stop(){
25
+ opt=${@:-}
26
+ start-stop-daemon --stop $common_opts --signal $STOP_SIGNAL --oknodo $opt --remove-pidfile
27
+ }
28
+
29
+ do_status(){
30
+ start-stop-daemon --status $common_opts && exit_status=$? || exit_status=$?
31
+ echo asdf $exit_status
32
+ case "$exit_status" in
33
+ 0)
34
+ echo "Program '$NAME' is running."
35
+ ;;
36
+ 1)
37
+ echo "Program '$NAME' is not running and the pid file exists."
38
+ ;;
39
+ 3)
40
+ echo "Program '$NAME' is not running."
41
+ ;;
42
+ 4)
43
+ echo "Unable to determine program '$NAME' status."
44
+ ;;
45
+ esac
46
+ }
47
+
48
+ case "$1" in
49
+ status)
50
+ do_status
51
+ ;;
52
+ start)
53
+ echo -n "Starting daemon: "$NAME
54
+ do_start
55
+ echo "."
56
+ ;;
57
+ stop)
58
+ echo -n "Stopping daemon: "$NAME
59
+ do_stop
60
+ echo "."
61
+ ;;
62
+ restart)
63
+ echo -n "Restarting daemon: "$NAME
64
+ do_stop --retry 30
65
+ do_start
66
+ echo "."
67
+ ;;
68
+ *)
69
+ echo "Usage: "$1" {status|start|stop|restart}"
70
+ exit 1
71
+ esac
72
+
73
+ exit 0
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env bash
2
+
3
+ DIR="$( dirname -- "$( readlink -f -- "$0"; )"; )"
4
+ pushd "$DIR/.."
5
+
6
+ source ./docker/parse-args-and-config.sh
7
+
8
+ POD_NAME="${POD_NAME="$DEPLOYMENT-$PROJECT_NAME"}"
9
+ echo POD_NAME=$POD_NAME
10
+
11
+ echo Compiling
12
+
13
+ npm run build
14
+
15
+ echo Uploading
16
+
17
+ rsync -av --progress --stats --delete -e 'docker/k8s-rsync-helper.sh' \
18
+ front server package.json package-lock.json \
19
+ $POD_NAME:/app
20
+
21
+ echo Updating deps
22
+ kubectl exec $POD_NAME -- yarn install
23
+
24
+ echo Restarting
25
+
26
+ kubectl exec $POD_NAME -- /etc/init.d/app restart
27
+
28
+ echo Done
29
+
30
+ popd
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ DIR="$( dirname -- "$( readlink -f -- "$0"; )"; )"
5
+
6
+ pushd "$DIR/.."
7
+
8
+ source ./docker/parse-args-and-config.sh
9
+
10
+ echo "Building ${NAME}:${VERSION}-${DEPLOYMENT}"
11
+
12
+ set -ex
13
+
14
+ ./docker/onlyDependencies.js > package-deps.json
15
+
16
+ docker build \
17
+ -t ${NAME}:${VERSION}-${DEPLOYMENT}\
18
+ -t ${NAME}:${DEPLOYMENT}\
19
+ -t ${REPO}/${NAME}:${VERSION}-${DEPLOYMENT}\
20
+ -t ${REPO}/${NAME}:${DEPLOYMENT}\
21
+ --secret id=npmrc,src=$HOME/.npmrc\
22
+ --build-arg VERSION=${VERSION}-${DEPLOYMENT}\
23
+ --build-arg BASE_HREF=${BASE_HREF}\
24
+ .
25
+
26
+ docker push ${REPO}/${NAME}:${VERSION}-${DEPLOYMENT}
27
+ docker push ${REPO}/${NAME}:${DEPLOYMENT}
28
+
29
+ set +x
30
+
31
+ echo "Done building ${NAME}:${VERSION}-${DEPLOYMENT}"
32
+
33
+ popd
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env bash
2
+
3
+ DIR="$( dirname -- "$( readlink -f -- "$0"; )"; )"
4
+ pushd "$DIR/.."
5
+
6
+ source ./scripts/parse-args-and-config.sh
7
+
8
+ set +ex
9
+
10
+ git commit -a
11
+ npm version patch
12
+ git push
13
+ ./docker/build-docker-and-upload.sh $DEPLOYMENT
14
+
15
+ set -e
16
+
17
+ popd
@@ -0,0 +1,4 @@
1
+ #!/bin/bash
2
+ pod=$1
3
+ shift
4
+ kubectl exec -i $pod -- "$@"
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+
3
+ import fs from "fs/promises"
4
+
5
+ const packageData = JSON.parse(await fs.readFile(process.argv[2] || "package.json"))
6
+
7
+ const { dependencies, devDependencies } = packageData
8
+
9
+ console.log(JSON.stringify({
10
+ dependencies,
11
+ devDependencies
12
+ }, null, 2))
@@ -0,0 +1,19 @@
1
+ REPO=docker.chaosu.pl
2
+
3
+ VERSION=`echo "console.log(require('./package.json').version)" | node`
4
+ NAME=`echo "console.log(require('./package.json').name.split('/').pop())" | node`
5
+
6
+ DEPLOYMENT=${1:-dev}
7
+ echo "DEPLOYMENT=${DEPLOYMENT}"
8
+
9
+ #BASE_HREF="https://$DEPLOYMENT.example.com/"
10
+
11
+ #if [ "$DEPLOYMENT" == "master" ]; then
12
+ BASE_HREF='https://www.example.com/'
13
+ #fi
14
+
15
+ PROJECT_NAME=${NAME}
16
+
17
+ if [ "$DEPLOYMENT" == "master" ]; then
18
+ echo ok
19
+ fi
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bash
2
+
3
+ BACKUP_PATH=${1:-../backup.tar.gz}
4
+
5
+ DIR="$( dirname -- "$( readlink -f -- "$0"; )"; )"
6
+ pushd "$DIR/.."
7
+
8
+ /etc/init.d/app stop
9
+ sleep 1
10
+ ./docker/restore-backup.sh $BACKUP_PATH
11
+ sleep 1
12
+ /etc/init.d/app start
13
+
14
+ popd
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env bash
2
+
3
+ BACKUP_PATH=${1:-../backup.tar.gz}
4
+ DB_NAME=${DB_NAME:-laszczewski-pl}
5
+
6
+ DIR="$( dirname -- "$( readlink -f -- "$0"; )"; )"
7
+ pushd "$DIR/.."
8
+
9
+ rm -rf backup
10
+ mkdir -p backup
11
+ pushd backup
12
+ tar -zxf $BACKUP_PATH
13
+ ../node_modules/.bin/lcdbc --serverUrl $DB_URL --verbose request database.deleteDatabase $DB_NAME
14
+ echo uploading data to database...
15
+ ../node_modules/.bin/lcdbc --serverUrl $DB_URL --verbose exec --targetDb $DB_NAME db.json
16
+ echo data uploaded
17
+ rm -rf ../storage/*
18
+ mv storage/* ../storage
19
+ echo backup restored
20
+ popd
21
+
22
+ popd
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env bash
2
+ touch /var/log/app.log
3
+ /etc/init.d/app start
4
+ tail -f /var/log/app.log
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env bash
2
+
3
+ POD_NAME=$1
4
+ BACKUP_PATH=${2:-../backup.tar.gz}
5
+
6
+ DIR="$( dirname -- "$( readlink -f -- "$0"; )"; )"
7
+ pushd "$DIR/.."
8
+
9
+ kubectl cp $BACKUP_PATH $POD_NAME:/app/backup.tar.gz
10
+ kubectl exec -it $POD_NAME -- /app/docker/restore-backup-with-service.sh /app/backup.tar.gz
11
+
12
+ popd
package/front/index.html CHANGED
@@ -4,8 +4,62 @@
4
4
  <!--head-->
5
5
  </head>
6
6
  <body>
7
+ <!--body-tags-open-->
7
8
  <div id="app"><!--app-html--></div>
8
9
  <!--app-data-->
10
+ <!--body-tags-->
9
11
  <script type="module" src="/src/entry-client.js"></script>
12
+
13
+ <div>
14
+ <div id="not-supported" style="display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0;
15
+ z-index: 1000; background-color: black; color: white; font-size: 20px; font-family: sans-serif;
16
+ align-items: center; justify-content: center; overflow-y: auto">
17
+ <div style=" padding: 2em;">
18
+ <h1 style="margin-bottom: 1.23em">Your browser is not supported.</h1>
19
+ <p>We apologize for the inconvenience, but it seems that your current web browser version does not support our web application.</p>
20
+ <p>In order to use our service, you would need to upgrade to, or install, one of the following browsers:</p>
21
+ <ul>
22
+ <li>Microsoft Edge 88 or later</li>
23
+ <li>Mozilla Firefox 78 or later</li>
24
+ <li>Google Chrome 87 or later</li>
25
+ <li>Apple Safari 14 or later</li>
26
+ </ul>
27
+ <p>Please note that our application does not function with older browser versions. We've optimized our service for the above-mentioned browsers to ensure robust functionality and a smooth user experience.</p>
28
+ <p>If you need assistance with updating your browser or installing a new one, please consult your browser's help documentation or contact your IT support.</p>
29
+ <p>Thank you for your understanding and cooperation. We're eager to deliver a great experience with our web application.</p>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ <script>
34
+ const oses = ['Windows', 'Android', 'Linux', 'iPhone', 'iPad', 'iPod', 'Mac OS']
35
+ const browsers = ['Edg', 'Edge', 'CriOS', 'OPR', 'Chrome', 'SamsungBrowser', 'Firefox', 'Opera', 'Safari']
36
+ const ua = window.navigator.userAgent
37
+ const detected = {}
38
+ for(const browser of browsers) {
39
+ const match = ua.match(new RegExp(`(${browser})/([^ ;)]*)`,'i'))
40
+ if(match) {
41
+ detected.browser = match[1]
42
+ detected.browserVersion = match[2]
43
+ break
44
+ }
45
+ }
46
+ for(const os of oses) {
47
+ const match = ua.match(new RegExp(`(${os}) ?([^;)]*)`,'i'))
48
+ if(match) {
49
+ detected.os = match[1]
50
+ detected.osVersion = match[2]
51
+ break
52
+ }
53
+ }
54
+ document.body.classList.add('on-browser-' + detected.browser.toLowerCase())
55
+ document.body.classList.add('on-os-' + detected.os.replace(' ','-').toLowerCase())
56
+ window.onload = function() { setTimeout(function() {
57
+ if(!window.appStarted) {
58
+ document.getElementById('not-supported').style.display = 'flex'
59
+ console.error("App not started")
60
+ }
61
+ }, 1000) }
62
+ </script>
63
+
10
64
  </body>
11
65
  </html>
@@ -0,0 +1,36 @@
1
+ import messages from "./en.json"
2
+ export { messages }
3
+
4
+ export const numberFormats ={
5
+ "ipi": {
6
+ "style": "currency",
7
+ "currency": "ipi",
8
+ "notation": "standard"
9
+ },
10
+ "btc": {
11
+ "style": "currency",
12
+ "currency": "btc",
13
+ "notation": "standard"
14
+ },
15
+ "usd": {
16
+ "style": "currency",
17
+ "currency": "USD",
18
+ "notation": "standard"
19
+ }
20
+ }
21
+
22
+ export const datetimeFormats = {
23
+ "short": {
24
+ "year": "numeric", "month": "short", "day": "numeric"
25
+ },
26
+ "shortTime": {
27
+ "dateStyle": "short", "timeStyle": "short", "hour12": false
28
+ },
29
+ "shortestTime": {
30
+ "month": "numeric", "day": "numeric", "hour": "numeric", "minute": "numeric", "hour12": false
31
+ },
32
+ "long": {
33
+ "year": "numeric", "month": "short", "day": "numeric",
34
+ "weekday": "short", "hour": "numeric", "minute": "numeric"
35
+ }
36
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "app": {
3
+ "updateAvailable": "Update available!",
4
+ "newVersions": "New version of wallet available!",
5
+ "reload": "Reload"
6
+ }
7
+ }
package/front/src/App.vue CHANGED
@@ -2,6 +2,7 @@
2
2
  <view-root>
3
3
  <template #navbar>
4
4
  <NavBar />
5
+ <UpdateBanner />
5
6
  </template>
6
7
  </view-root>
7
8
  </template>
@@ -10,16 +11,27 @@
10
11
  import 'primevue/resources/themes/saga-green/theme.css'
11
12
  import "@fortawesome/fontawesome-free/css/all.min.css"
12
13
 
13
- import { ViewRoot, NavBar } from "@live-change/frontend-base"
14
+ import { ViewRoot, NavBar, UpdateBanner } from "@live-change/frontend-base"
14
15
 
15
- import { useMeta } from 'vue-meta'
16
- const { meta } = useMeta({
17
- title: 'Title',
16
+ import { computed } from 'vue'
17
+ import { useHead } from '@vueuse/head'
18
+
19
+ import { useI18n } from 'vue-i18n'
20
+ const i18n = useI18n()
21
+
22
+ useHead(computed(() => ({
23
+ title: ENV_BRAND_NAME,
24
+ meta: [
25
+ { charset: 'utf-8' },
26
+ { name: 'viewport',
27
+ content: "user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1," +
28
+ " width=device-width, viewport-fit=cover" }
29
+ ],
18
30
  htmlAttrs: {
19
- lang: 'en',
31
+ lang: i18n.locale.value,
20
32
  amp: true
21
- }
22
- })
33
+ },
34
+ })))
23
35
 
24
36
  import { watch } from 'vue'
25
37
  import { client as useClient, useApi } from '@live-change/vue3-ssr'
@@ -34,4 +46,10 @@
34
46
  api.validators.email = emailValidator
35
47
  api.validators.password = passwordValidator
36
48
 
49
+ import { defaultHighlightStyle } from "@codemirror/language"
50
+ import { StyleModule } from "style-mod"
51
+ if(typeof window != 'undefined') {
52
+ StyleModule.mount(window.document, defaultHighlightStyle.module)
53
+ }
54
+
37
55
  </script>
@@ -1,8 +1,13 @@
1
1
  <template>
2
- <h1>Hello world!</h1>
2
+ <div>
3
+ <h1>Hello world!</h1>
4
+ <p>{{ currentTime }}</p>
5
+ <Clock :time="currentTime" />
6
+ </div>
3
7
  </template>
4
8
 
5
9
  <script setup>
10
+ import { currentTime } from "@live-change/frontend-base";
6
11
 
7
12
  </script>
8
13
 
@@ -0,0 +1,22 @@
1
+
2
+ <template>
3
+ <div class="surface-card p-3 shadow-2 border-round">
4
+ {{ d(new Date(), 'long') }}
5
+ </div>
6
+ </template>
7
+
8
+ <script setup lang="ts">
9
+ import { defineProps, toRefs } from 'vue'
10
+ import { useI18n } from 'vue-i18n'
11
+ const { t, d, n } = useI18n()
12
+
13
+ const props = defineProps<{
14
+ time: number
15
+ }>()
16
+
17
+ const { time } = toRefs(props)
18
+ </script>
19
+
20
+ <style scoped>
21
+
22
+ </style>
@@ -1,13 +1,25 @@
1
1
  import deepmerge from 'deepmerge';
2
2
 
3
- import contentEn from "../locales/en.json"
3
+ import * as exchangeEn from "../locales/en.js"
4
4
  import { locales as autoFormLocales } from "@live-change/frontend-auto-form"
5
5
 
6
6
  export default {
7
- i18nMessages: {
8
- en: deepmerge.all([
9
- contentEn,
10
- autoFormLocales.en
11
- ])
7
+ i18n: {
8
+ messages: {
9
+ en: deepmerge.all([
10
+ autoFormLocales.en,
11
+ exchangeEn.messages
12
+ ])
13
+ },
14
+ numberFormats: {
15
+ en: deepmerge.all([
16
+ exchangeEn.numberFormats
17
+ ])
18
+ },
19
+ datetimeFormats: {
20
+ en: deepmerge.all([
21
+ exchangeEn.datetimeFormats
22
+ ])
23
+ }
12
24
  }
13
25
  }
@@ -3,4 +3,6 @@ import App from './App.vue'
3
3
  import { createRouter } from './router'
4
4
  import config from './config.js'
5
5
 
6
- clientEntry(App, createRouter)
6
+ clientEntry(App, createRouter, config)
7
+
8
+ window.appStarted = true
@@ -12,7 +12,9 @@ import { dbAdminRoutes } from "@live-change/db-admin"
12
12
  import { userRoutes } from "@live-change/user-frontend"
13
13
  import { catchAllPagesRoute, contentEditRoutes, pagesSitemap } from "@live-change/content-frontend"
14
14
 
15
- export function wysiwygRoutes(config = {}) {
15
+ import pagesRoutes from '~pages'
16
+
17
+ export function routes(config = {}) {
16
18
  const { prefix = '/', route = (r) => r } = config
17
19
  return [
18
20
  ...userRoutes({ ...config, prefix: prefix + 'user/' }),
@@ -22,6 +24,8 @@ export function wysiwygRoutes(config = {}) {
22
24
  component: () => import("./Index.vue")
23
25
  }),
24
26
 
27
+ ...pagesRoutes,
28
+
25
29
  ...contentEditRoutes({ ...config }),
26
30
 
27
31
  ...dbAdminRoutes({ prefix: '/_db', route: r => ({ ...r, meta: { ...r.meta, raw: true }}) }),
@@ -0,0 +1,26 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "useDefineForClassFields": true,
5
+ "module": "ESNext",
6
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
7
+ "skipLibCheck": true,
8
+
9
+ /* Bundler mode */
10
+ "moduleResolution": "bundler",
11
+ "allowImportingTsExtensions": true,
12
+ "resolveJsonModule": true,
13
+ "isolatedModules": true,
14
+ "noEmit": true,
15
+ "jsx": "preserve",
16
+
17
+ /* Linting */
18
+ "strict": true,
19
+ "noUnusedLocals": true,
20
+ "noUnusedParameters": true,
21
+ "noFallthroughCasesInSwitch": true
22
+ },
23
+ "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"],
24
+ "references": [{ "path": "./tsconfig.node.json" }]
25
+ }
26
+
@@ -0,0 +1,11 @@
1
+ {
2
+ "compilerOptions": {
3
+ "composite": true,
4
+ "skipLibCheck": true,
5
+ "module": "ESNext",
6
+ "moduleResolution": "bundler",
7
+ "allowSyntheticDefaultImports": true,
8
+ "strict": true
9
+ },
10
+ "include": ["vite.config.ts"]
11
+ }
@@ -0,0 +1,40 @@
1
+ import { defineConfig } from 'vite'
2
+ import Pages from 'vite-plugin-pages'
3
+
4
+ let version = process.env.VERSION ?? 'unknown'
5
+
6
+ import baseViteConfig from '@live-change/frontend-base/vite-config.js'
7
+
8
+ export default defineConfig(async ({ command, mode }) => {
9
+ const baseConfig = (await baseViteConfig({ command, mode }))
10
+ return {
11
+ ...baseConfig,
12
+
13
+ define: {
14
+ ...baseConfig.define,
15
+ ENV_VERSION: JSON.stringify(version),
16
+ ENV_BRAND_NAME: JSON.stringify("Example"),
17
+ ENV_BRAND_DOMAIN: JSON.stringify("example.com"),
18
+ },
19
+
20
+ plugins: [
21
+ ...baseConfig.plugins,
22
+ Pages({
23
+ dirs: [
24
+ // basic
25
+ { dir: 'src/pages', baseRoute: '' },
26
+ // blog
27
+ // { dir: 'src/blog', baseRoute: 'blog' },
28
+ ],
29
+ extensions: ['vue', 'md'],
30
+ }),
31
+ ],
32
+
33
+ resolve: {
34
+ ...baseConfig.resolve,
35
+ alias: [
36
+ ...baseConfig.resolve.alias,
37
+ ]
38
+ }
39
+ }
40
+ })
package/package.json CHANGED
@@ -1,86 +1,99 @@
1
1
  {
2
2
  "name": "@live-change/frontend-template",
3
- "version": "0.1.5",
3
+ "version": "0.8.3",
4
4
  "scripts": {
5
- "memDev": "lcli memDev --enableSessions --initScript ./init.js --dbAccess",
6
- "localDevInit": "rm tmp.db; lcli localDev --enableSessions --initScript ./init.js",
7
- "localDev": "lcli localDev --enableSessions",
8
- "dev": "lcli dev --enableSessions",
9
- "ssrDev": "lcli ssrDev --enableSessions",
10
- "serveAllMem": "cross-env NODE_ENV=production lcli ssrServer --withApi --withServices --updateServices --enableSessions --withDb --dbBackend mem --createDb",
11
- "serveAll": "cross-env NODE_ENV=production lcli ssrServer --withApi --withServices --updateServices --enableSessions",
12
- "serve": "cross-env NODE_ENV=production lcli ssrServer --enableSessions",
13
- "apiServer": "lcli apiServer --enableSessions",
14
- "devApiServer": "lcli devApiServer --enableSessions",
15
- "memApiServer": "lcli memApiServer --enableSessions",
5
+ "memDev": "node server/start.js memDev --enableSessions --initScript ./init.js --dbAccess",
6
+ "localDevInit": "rm tmp.db; node server/start.js localDev --enableSessions --initScript ./init.js",
7
+ "localDev": "node server/start.js localDev --enableSessions",
8
+ "dev": "node server/start.js dev --enableSessions",
9
+ "ssrDev": "node server/start.js ssrDev --enableSessions",
10
+ "serveAllMem": "cross-env NODE_ENV=production node server/start.js ssrServer --withApi --withServices --updateServices --enableSessions --withDb --dbBackend mem --createDb",
11
+ "serveAll": "cross-env NODE_ENV=production node server/start.js ssrServer --withApi --withServices --updateServices --enableSessions",
12
+ "serve": "cross-env NODE_ENV=production node server/start.js ssrServer --enableSessions",
13
+ "memDev:spa": "node server/start.js memDev --enableSessions --initScript ./init.js --dbAccess --spa",
14
+ "localDevInit:spa": "rm tmp.db; node server/start.js localDev --enableSessions --initScript ./init.js --spa",
15
+ "localDev:spa": "node server/start.js localDev --enableSessions --spa",
16
+ "dev:spa": "node server/start.js dev --enableSessions --spa",
17
+ "ssrDev:spa": "node server/start.js ssrDev --enableSessions --spa",
18
+ "serveAllMem:spa": "cross-env NODE_ENV=production node server/start.js server --withApi --withServices --updateServices --enableSessions --withDb --dbBackend mem --createDb --spa",
19
+ "serveAll:spa": "cross-env NODE_ENV=production node server/start.js server --withApi --withServices --updateServices --enableSessions --spa",
20
+ "serve:spa": "cross-env NODE_ENV=production node server/start.js server --enableSessions --spa",
21
+ "apiServer": "node server/start.js apiServer --enableSessions",
22
+ "devApiServer": "node server/start.js devApiServer --enableSessions",
23
+ "memApiServer": "node server/start.js memApiServer --enableSessions",
16
24
  "build": "cd front; yarn build:client && yarn build:server",
17
25
  "build:client": "cd front; vite build --ssrManifest --outDir dist/client",
18
26
  "build:server": "cd front; vite build --ssr src/entry-server.js --outDir dist/server",
27
+ "build:spa": "cd front; vite build --outDir dist/spa",
19
28
  "generate": "vite build --ssrManifest --outDir dist/static && yarn build:server && node prerender",
20
29
  "debug": "node --inspect-brk server"
21
30
  },
31
+ "type": "module",
22
32
  "dependencies": {
23
- "@fortawesome/fontawesome-free": "^6.1.1",
24
- "@live-change/cli": "0.7.8",
25
- "@live-change/framework": "0.7.8",
26
- "@live-change/dao": "0.5.8",
27
- "@live-change/dao-vue3": "0.5.8",
28
- "@live-change/dao-websocket": "0.5.8",
29
- "@live-change/vue3-components": "0.2.16",
30
- "@live-change/vue3-ssr": "0.2.16",
31
- "@live-change/email-service": "0.3.10",
32
- "@live-change/access-control-service": "0.3.10",
33
- "@live-change/password-authentication-service": "0.3.10",
34
- "@live-change/secret-code-service": "0.3.10",
35
- "@live-change/secret-link-service": "0.3.10",
36
- "@live-change/session-service": "0.3.10",
37
- "@live-change/user-service": "0.3.10",
38
- "@live-change/user-identification-service": "0.3.10",
39
- "@live-change/prosemirror-service": "0.3.10",
40
- "@live-change/url-service": "0.3.10",
41
- "@live-change/content-service": "0.3.10",
42
- "@live-change/blog-service": "0.3.10",
43
- "@live-change/frontend-base": "0.2.24",
44
- "@live-change/frontend-auto-form": "0.2.24",
45
- "@live-change/user-frontend": "0.2.24",
46
- "@live-change/image-frontend": "0.2.24",
47
- "@live-change/upload-frontend": "0.2.24",
48
- "@live-change/access-control-frontend": "0.2.24",
49
- "@live-change/wysiwyg-frontend": "0.2.24",
50
- "@live-change/content-frontend": "0.2.24",
51
- "@live-change/blog-frontend": "0.2.24",
52
- "@live-change/url-frontend": "0.2.24",
53
- "@live-change/frontend-utils": "^0.2.24",
54
- "@vueuse/core": "^9.1.0",
33
+ "@codemirror/language": "6.10.1",
34
+ "@fortawesome/fontawesome-free": "^6.4.2",
35
+ "@live-change/access-control-frontend": "^0.8.3",
36
+ "@live-change/access-control-service": "0.8.2",
37
+ "@live-change/backup-service": "0.4.4",
38
+ "@live-change/blog-frontend": "^0.8.3",
39
+ "@live-change/blog-service": "0.8.2",
40
+ "@live-change/cli": "^0.8.3",
41
+ "@live-change/content-frontend": "^0.8.3",
42
+ "@live-change/content-service": "0.8.2",
43
+ "@live-change/dao": "0.6.0",
44
+ "@live-change/dao-vue3": "0.8.2",
45
+ "@live-change/dao-websocket": "0.8.2",
46
+ "@live-change/db-client": "0.8.2",
47
+ "@live-change/email-service": "0.8.2",
48
+ "@live-change/framework": "0.8.2",
49
+ "@live-change/frontend-auto-form": "^0.8.3",
50
+ "@live-change/frontend-base": "^0.8.3",
51
+ "@live-change/image-frontend": "^0.8.3",
52
+ "@live-change/password-authentication-service": "0.8.2",
53
+ "@live-change/prosemirror-service": "0.8.2",
54
+ "@live-change/secret-code-service": "0.8.2",
55
+ "@live-change/secret-link-service": "0.8.2",
56
+ "@live-change/session-service": "0.8.2",
57
+ "@live-change/upload-frontend": "^0.8.3",
58
+ "@live-change/url-frontend": "^0.8.3",
59
+ "@live-change/url-service": "0.8.2",
60
+ "@live-change/user-frontend": "^0.8.3",
61
+ "@live-change/user-identification-service": "0.8.2",
62
+ "@live-change/user-service": "0.8.2",
63
+ "@live-change/vue3-components": "0.8.2",
64
+ "@live-change/vue3-ssr": "0.8.2",
65
+ "@live-change/wysiwyg-frontend": "^0.8.3",
66
+ "@vueuse/core": "^10.7.2",
55
67
  "codeceptjs-assert": "^0.0.5",
56
68
  "compression": "^1.7.4",
57
69
  "cross-env": "^7.0.3",
58
70
  "get-port-sync": "1.0.1",
59
71
  "pica": "^9.0.1",
60
- "pretty-bytes": "^6.0.0",
61
- "primeflex": "^3.2.1",
62
- "primeicons": "^5.0.0",
63
- "primevue": "^3.15.0",
72
+ "pretty-bytes": "^6.1.1",
73
+ "primeflex": "^3.3.1",
74
+ "primeicons": "^6.0.1",
75
+ "primevue": "^3.49.1",
64
76
  "rollup-plugin-node-builtins": "^2.1.2",
65
- "rollup-plugin-visualizer": "5.6.0",
66
- "serialize-javascript": "^6.0.0",
77
+ "rollup-plugin-visualizer": "5.12.0",
78
+ "serialize-javascript": "^6.0.2",
67
79
  "serve-static": "^1.15.0",
68
- "v-shared-element": "3.1.0",
69
- "vue-meta": "^3.0.0-alpha.9",
70
- "vue-router": "^4.1.3",
71
- "vue3-scroll-border": "0.1.2"
80
+ "v-shared-element": "3.1.1",
81
+ "vue": "^3.4.19",
82
+ "vue-i18n": "^9.10.1",
83
+ "vue-router": "^4.2.5",
84
+ "vue3-scroll-border": "0.1.6"
72
85
  },
73
86
  "devDependencies": {
74
- "@live-change/codeceptjs-helper": "0.7.8",
75
- "@wdio/selenium-standalone-service": "^7.20.8",
76
- "codeceptjs": "^3.3.4",
77
- "generate-password": "1.7.0",
78
- "playwright": "^1.24.2",
87
+ "@live-change/codeceptjs-helper": "0.8.2",
88
+ "codeceptjs": "^3.5.12",
89
+ "generate-password": "1.7.1",
90
+ "playwright": "^1.41.2",
79
91
  "random-profile-generator": "^2.3.0",
80
- "txtgen": "^3.0.2",
81
- "webdriverio": "^7.20.9"
92
+ "txtgen": "^3.0.6",
93
+ "webdriverio": "^8.31.1"
82
94
  },
83
95
  "author": "",
84
96
  "license": "ISC",
85
- "description": ""
97
+ "description": "",
98
+ "gitHead": "81b4ac5a36ab1abdf9d521e3c4fbea6d194bb892"
86
99
  }
@@ -1,69 +1,86 @@
1
+ import App from "@live-change/framework"
2
+ const app = App.app()
3
+
1
4
  const contactTypes = ['email']
2
5
 
3
- module.exports = {
6
+ import securityConfig from './security.config.js'
7
+ import documentTypePage from './page.documentType.js'
8
+
9
+ app.config = {
4
10
  services: [
5
11
  {
6
12
  name: 'session',
7
- path: '@live-change/session-service',
8
13
  createSessionOnUpdate: true
9
14
  },
10
15
  {
11
16
  name: 'user',
12
- path: '@live-change/user-service'
13
17
  },
14
18
  {
15
19
  name: 'email',
16
- path: '@live-change/email-service'
17
20
  },
18
21
  {
19
22
  name: 'passwordAuthentication',
20
- path: '@live-change/password-authentication-service',
21
23
  contactTypes,
22
24
  signInWithoutPassword: true
23
25
  },
24
26
  {
25
27
  name: 'userIdentification',
26
- path: '@live-change/user-identification-service'
27
28
  },
28
29
  {
29
30
  name: 'identicon',
30
- path: '@live-change/identicon-service'
31
31
  },
32
32
  {
33
33
  name: 'accessControl',
34
- path: '@live-change/access-control-service',
35
34
  createSessionOnUpdate: true,
36
35
  contactTypes,
37
36
  },
38
37
  {
39
38
  name: 'security',
40
- path: '@live-change/security-service',
41
- ...require('./security.config.js')
39
+ ...securityConfig,
42
40
  },
43
41
  {
44
42
  name: 'notification',
45
- path: '@live-change/notification-service',
46
43
  contactTypes,
47
44
  notificationTypes: ['example_TestNotification']
48
45
  },
49
46
  {
50
47
  name: 'upload',
51
- path: '@live-change/upload-service'
52
48
  },
53
49
  {
54
50
  name: 'image',
55
- path: '@live-change/image-service'
56
51
  },
57
52
  {
58
53
  name: 'secretCode',
59
- path: '@live-change/secret-code-service'
60
54
  },
61
55
  {
62
56
  name: 'secretLink',
63
- path: '@live-change/secret-link-service'
64
- }
65
-
66
- /// TODO: add cms when ready
67
-
57
+ },
58
+ {
59
+ name: 'messageAuthentication',
60
+ contactTypes,
61
+ signUp: true,
62
+ signIn: true,
63
+ connect: true
64
+ },
65
+ {
66
+ name: 'url',
67
+ },
68
+ {
69
+ name: 'prosemirror',
70
+ documentTypes: {
71
+ page: documentTypePage,
72
+ /*rich: require('./rich.documentType.js'),*/
73
+ },
74
+ testLatency: 2000
75
+ },
76
+ {
77
+ name: 'content',
78
+ },
79
+ {
80
+ name: 'backup',
81
+ port: 8007
82
+ },
68
83
  ]
69
84
  }
85
+
86
+ export default app.config
package/server/init.js CHANGED
@@ -1,8 +1,8 @@
1
- const {createUser} = require("@live-change/user-frontend/server/init-functions.js");
2
- const App = require('@live-change/framework')
1
+ import { createUser } from "@live-change/user-frontend/server/init-functions.js"
2
+ import App from '@live-change/framework'
3
3
  const app = App.app()
4
4
 
5
- module.exports = async function(services) {
5
+ export default async function(services) {
6
6
 
7
7
  const testUser = await createUser(services,
8
8
  'Test User', 'test@test.com', 'Testy123', 'u1', ['writer'])
@@ -0,0 +1,103 @@
1
+ export default {
2
+ "marks": {
3
+ "bold": {},
4
+ "italic": {},
5
+ "underline": {},
6
+ "strike": {}
7
+ },
8
+ "nodes": {
9
+ "paragraph": {
10
+ "content": "inline*",
11
+ "group": "block"
12
+ },
13
+ "horizontalRule": {
14
+ "group": "block"
15
+ },
16
+ "heading": {
17
+ "content": "inline*",
18
+ "group": "block",
19
+ "defining": true,
20
+ "attrs": {
21
+ "level": {
22
+ "default": 1
23
+ }
24
+ }
25
+ },
26
+ "blockquote": {
27
+ "content": "block+",
28
+ "group": "block",
29
+ "defining": true
30
+ },
31
+ "codeBlock": {
32
+ "content": "text*",
33
+ "marks": "",
34
+ "group": "block",
35
+ "code": true,
36
+ "defining": true,
37
+ "attrs": {
38
+ "language": {
39
+ "default": null
40
+ }
41
+ }
42
+ },
43
+ "bulletList": {
44
+ "content": "listItem+",
45
+ "group": "block list"
46
+ },
47
+ "orderedList": {
48
+ "content": "listItem+",
49
+ "group": "block list",
50
+ "attrs": {
51
+ "start": {
52
+ "default": 1
53
+ }
54
+ }
55
+ },
56
+ "listItem": {
57
+ "content": "paragraph block*",
58
+ "defining": true
59
+ },
60
+ "image": {
61
+ "content": "",
62
+ "marks": "",
63
+ "group": "block",
64
+ "inline": false,
65
+ "atom": true,
66
+ "selectable": true,
67
+ "draggable": true,
68
+ "attrs": {
69
+ "image": {
70
+ "default": null
71
+ }
72
+ }
73
+ },
74
+ "doc": {
75
+ "content": "block+"
76
+ },
77
+ "text": {
78
+ "group": "inline"
79
+ },
80
+ "hardBreak": {
81
+ "group": "inline",
82
+ "inline": true,
83
+ "selectable": false
84
+ },
85
+ "component": {
86
+ "content": "block*",
87
+ "marks": "",
88
+ "group": "block",
89
+ "inline": false,
90
+ "selectable": true,
91
+ "draggable": true,
92
+ "attrs": {
93
+ "is": {
94
+ "default": "card"
95
+ },
96
+ "attrs": {
97
+ "default": {}
98
+ }
99
+ }
100
+ }
101
+ },
102
+ "topNode": "doc"
103
+ }
@@ -1,4 +1,4 @@
1
- const lcp = require("@live-change/pattern")
1
+ import lcp from "@live-change/pattern"
2
2
 
3
3
  const clientKeys = (client) => [
4
4
  { key: 'user', value: client.user },
@@ -46,7 +46,7 @@ const counters = [
46
46
  }
47
47
  ]
48
48
 
49
- module.exports = {
49
+ export default {
50
50
  clientKeys,
51
51
  patterns,
52
52
  counters
@@ -0,0 +1,43 @@
1
+ import session from '@live-change/session-service'
2
+ import user from '@live-change/user-service'
3
+ import email from '@live-change/email-service'
4
+ import passwordAuthentication from '@live-change/password-authentication-service'
5
+ import userIdentification from '@live-change/user-identification-service'
6
+ import identicon from '@live-change/identicon-service'
7
+ import accessControl from '@live-change/access-control-service'
8
+ import acceessControl from '@live-change/access-control-service'
9
+ import security from '@live-change/security-service'
10
+ import notification from '@live-change/notification-service'
11
+ import upload from '@live-change/upload-service'
12
+ import image from '@live-change/image-service'
13
+ import secretCode from '@live-change/secret-code-service'
14
+ import secretLink from '@live-change/secret-link-service'
15
+ import messageAuthentication from '@live-change/message-authentication-service'
16
+ import url from '@live-change/url-service'
17
+ import prosemirror from '@live-change/prosemirror-service'
18
+ import content from '@live-change/content-service'
19
+ import backup from '@live-change/backup-service'
20
+ import init from './init.js'
21
+
22
+ export {
23
+ session,
24
+ user,
25
+ email,
26
+ passwordAuthentication,
27
+ userIdentification,
28
+ identicon,
29
+ accessControl,
30
+ acceessControl,
31
+ security,
32
+ notification,
33
+ upload,
34
+ image,
35
+ secretCode,
36
+ secretLink,
37
+ messageAuthentication,
38
+ url,
39
+ prosemirror,
40
+ content,
41
+ backup,
42
+ init
43
+ }
@@ -0,0 +1,11 @@
1
+ import appConfig from './app.config.js'
2
+
3
+ import * as services from './services.list.js'
4
+ for(const serviceConfig of appConfig.services) {
5
+ serviceConfig.module = services[serviceConfig.name]
6
+ }
7
+ appConfig.init = services['init']
8
+
9
+ import { starter } from '@live-change/cli'
10
+
11
+ starter(appConfig)
@@ -1,18 +0,0 @@
1
- import { defineConfig } from 'vite'
2
-
3
- import baseViteConfig from '@live-change/frontend-base/vite-config.js'
4
-
5
- export default defineConfig(async ({ command, mode }) => {
6
- const baseConfig = (await baseViteConfig({ command, mode }))
7
- return {
8
- ...baseConfig,
9
-
10
- resolve: {
11
- alias: [
12
- ...baseConfig.resolve.alias,
13
- /* { find: 'vue', replacement: 'vue/dist/vue.esm-bundler.js' },
14
- { find: 'vue/server-renderer', replacement: 'vue/server-renderer' },*/
15
- ]
16
- }
17
- }
18
- })
package/locales/en.json DELETED
@@ -1,3 +0,0 @@
1
- {
2
-
3
- }