global public dir for every server module

This commit is contained in:
mrfry 2023-05-01 08:59:22 +02:00
parent eed99e6f02
commit 0381f6ddab
18 changed files with 55 additions and 225 deletions

View file

@ -140,17 +140,17 @@ The server doesn't require that much maintenance, but you are advised to:
* Watch out for directories that can get big: * Watch out for directories that can get big:
* `./stats`: server statistics and logs * `./stats`: server statistics and logs
* `./data/dbs/backup`: backup of databases * `./data/dbs/backup`: backup of databases
* `./publicDirs/qminingPublic/backs`: backup of question databases * `./public/backs`: backup of question databases
* `./publicDirs/qminingPublic/userFiles`: files shared by users * `./public/userFiles`: files shared by users
* `./publicDirs/qminingPublic/savedQuestions`: unanswered questions saved by the userscript * `./public/savedQuestions`: unanswered questions saved by the userscript
* Make regular backups of important data: * Make regular backups of important data:
* `./data/dbs`: user and messages database * `./data/dbs`: user and messages database
* `./data/p2p`: p2p data, and public/private keys * `./data/p2p`: p2p data, and public/private keys
* `./publicDirs/qminingPublic/questionDbs`: question dbs * `./public/questionDbs`: question dbs
* `./publicDirs/qminingPublic/questionDbs.json`: information about question db-s * `./public/questionDbs.json`: information about question db-s
* `./publicDirs/qminingPublic/userFiles`: files shared by users * `./public/userFiles`: files shared by users
* `./publicDirs/qminingPublic/forum`: forum entries and comments * `./public/forum`: forum entries and comments
* `./publicDirs/qminingPublic/savedQuestions`: unanswered questions saved by the userscript * `./public/savedQuestions`: unanswered questions saved by the userscript
* Most files not tracked by git * Most files not tracked by git
## Server maintenance utils ## Server maintenance utils
@ -300,19 +300,18 @@ https://gitlab.com/MrFry/moodle-test-userscript
│ └── qmining-page qmining frontend │ └── qmining-page qmining frontend
├── testingTools testing tools for the server ├── testingTools testing tools for the server
├── defaultPublicFiles static public files that the frontends use, like images ├── defaultPublicFiles static public files that the frontends use, like images
└── publicDirs/ public directories of the server, mostly available on the domain root └── public/ public directories of the server
└── qminingPublic/ qmining module public path (modules: qmining, dataeditor, api) ├── backs/ question database backups
├── backs/ question database backups ├── chatFiles/ files sent on chat
├── chatFiles/ files sent on chat ├── contacts.json contacts displayed on the /contact page
├── contacts.json contacts displayed on the /contact page ├── forum/ forum contents
├── forum/ forum contents ├── forumFiles/ files uploaded to forums
├── forumFiles/ files uploaded to forums ├── moodle-test-userscript link to the userscript, it fetches updates from this path
├── moodle-test-userscript link to the userscript, it fetches updates from this path ├── motd motto of the day
├── motd motto of the day ├── questionDbs/ directory of the question db-s
├── questionDbs/ directory of the question db-s ├── questionDbs.json question db-s information
├── questionDbs.json question db-s information ├── savedQuestions/ un-answered questions for dataeditor, saved from test pages
├── savedQuestions/ un-answered questions for dataeditor, saved from test pages └── userFiles/ files shared by users
└── userFiles/ files shared by users
``` ```
## Related repositories ## Related repositories

View file

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Before After
Before After

View file

@ -61,11 +61,11 @@ mkdir -pv stats/logs
mkdir -pv stats/vlogs mkdir -pv stats/vlogs
mkdir -pv data mkdir -pv data
mkdir -pv data/dbs mkdir -pv data/dbs
mkdir -p publicDirs/qminingPublic mkdir -pv public
touch publicDirs/qminingPublic/motd touch public/motd
cp -vrn ./defaultPublicFiles/* ./publicDirs/qminingPublic/ cp -vrn ./defaultPublicFiles/* ./public/
# ------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------
# Git submodules # Git submodules
@ -98,8 +98,8 @@ makeNextSubmodule "qmining-data-editor" "dataEditorPublic"
# ------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------
log "Making moodle test userscript" log "Making moodle test userscript"
checkFile "$PWD/submodules/moodle-test-userscript/stable.user.js" checkFile "$PWD/submodules/moodle-test-userscript/stable.user.js"
mkdir -pv "$PWD/publicDirs/qminingPublic/moodle-test-userscript" mkdir -pv "$PWD/public/moodle-test-userscript"
ln -sfv "$PWD/submodules/moodle-test-userscript/stable.user.js" "$PWD/publicDirs/qminingPublic/moodle-test-userscript/" ln -sfv "$PWD/submodules/moodle-test-userscript/stable.user.js" "$PWD/public/moodle-test-userscript/"
# ------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------
# DB-s # DB-s

View file

@ -1,7 +1,6 @@
{ {
"dataEditor": { "dataEditor": {
"path": "./modules/dataEditor/dataEditor.js", "path": "./modules/dataEditor/dataEditor.js",
"publicdirs": ["publicDirs/qminingPublic/"],
"nextdir": "nextStatic/dataEditorPublic", "nextdir": "nextStatic/dataEditorPublic",
"name": "dataeditor", "name": "dataeditor",
"route": "/dataeditor", "route": "/dataeditor",
@ -9,7 +8,6 @@
}, },
"qmining": { "qmining": {
"path": "./modules/qmining/qmining.js", "path": "./modules/qmining/qmining.js",
"publicdirs": ["publicDirs/qminingPublic/"],
"nextdir": "nextStatic/qminingPagePublic", "nextdir": "nextStatic/qminingPagePublic",
"name": "qmining", "name": "qmining",
"route": "/", "route": "/",
@ -17,7 +15,6 @@
}, },
"api": { "api": {
"path": "./modules/api/api.js", "path": "./modules/api/api.js",
"publicdirs": ["publicDirs/qminingPublic/"],
"name": "api", "name": "api",
"route": "/api" "route": "/api"
} }

View file

@ -39,7 +39,7 @@ import {
Submodule, Submodule,
} from '../../types/basicTypes' } from '../../types/basicTypes'
import { loadJSON } from '../../utils/actions' import { loadJSON } from '../../utils/actions'
import { paths } from '../../utils/files' import { paths, publicDir } from '../../utils/files'
import { initWorkerPool } from '../../worker/workerPool' import { initWorkerPool } from '../../worker/workerPool'
// other paths // other paths
@ -48,18 +48,12 @@ const moduleName = 'API'
// stuff gotten from server.js // stuff gotten from server.js
let userDB: Database let userDB: Database
let url: string let url: string
let publicdirs: string[] = []
let httpServer: http.Server let httpServer: http.Server
let httpsServer: https.Server let httpsServer: https.Server
function GetApp(): ModuleType { function GetApp(): ModuleType {
const app = express() const app = express()
const publicDir = publicdirs[0]
if (!publicDir) {
throw new Error(`No public dir! ( API )`)
}
let domain: any = url.split('.') let domain: any = url.split('.')
domain.shift() domain.shift()
domain = domain.join('.') // "qmining.com" domain = domain.join('.') // "qmining.com"
@ -157,9 +151,7 @@ function GetApp(): ModuleType {
// ------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------
publicdirs.forEach((pdir) => { app.use(express.static(publicDir))
app.use(express.static(pdir))
})
// ------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------
@ -206,7 +198,6 @@ function setupSubModules(
app: parentApp, app: parentApp,
userDB: userDB, userDB: userDB,
url: url, // only used by userManagement.ts url: url, // only used by userManagement.ts
publicdirs: publicdirs,
moduleSpecificData: moduleSpecificData, moduleSpecificData: moduleSpecificData,
httpServer: httpServer, httpServer: httpServer,
httpsServer: httpsServer, httpsServer: httpsServer,
@ -227,7 +218,6 @@ export default {
setup: (data: SetupData): void => { setup: (data: SetupData): void => {
userDB = data.userDB userDB = data.userDB
url = data.url url = data.url
publicdirs = data.publicdirs
httpServer = data.httpServer httpServer = data.httpServer
httpsServer = data.httpsServer httpsServer = data.httpsServer
}, },

View file

@ -25,6 +25,7 @@ import dbtools from '../../../utils/dbtools'
import logger from '../../../utils/logger' import logger from '../../../utils/logger'
import { Request, SubmoduleData, User } from '../../../types/basicTypes' import { Request, SubmoduleData, User } from '../../../types/basicTypes'
import socketAuth from '../../../middlewares/socketAuth.middleware' import socketAuth from '../../../middlewares/socketAuth.middleware'
import { publicDir } from '../../../utils/files'
const msgDbPath = './data/dbs/msgs.db' const msgDbPath = './data/dbs/msgs.db'
const msgPaginationLimit = 15 const msgPaginationLimit = 15
@ -44,10 +45,9 @@ interface Message {
} }
function setup(data: SubmoduleData): void { function setup(data: SubmoduleData): void {
const { app, httpServer, httpsServer, userDB, publicdirs } = data const { app, httpServer, httpsServer, userDB } = data
const msgDB = dbtools.GetDB(msgDbPath) const msgDB = dbtools.GetDB(msgDbPath)
const publicDir = publicdirs[0]
const uloadFiles = publicDir + 'chatFiles' const uloadFiles = publicDir + 'chatFiles'
logger.Log( logger.Log(
`Chat: Starting Socket.io Server on ${httpsServer ? 'https' : 'http'}` `Chat: Starting Socket.io Server on ${httpsServer ? 'https' : 'http'}`

View file

@ -23,6 +23,7 @@ import { v4 as uuidv4 } from 'uuid'
import logger from '../../../utils/logger' import logger from '../../../utils/logger'
import utils from '../../../utils/utils' import utils from '../../../utils/utils'
import { Request, SubmoduleData, User } from '../../../types/basicTypes' import { Request, SubmoduleData, User } from '../../../types/basicTypes'
import { publicDir } from '../../../utils/files'
interface Comment { interface Comment {
date: string date: string
@ -184,9 +185,7 @@ function getPostData(
} }
function setup(data: SubmoduleData): void { function setup(data: SubmoduleData): void {
const { app, publicdirs } = data const { app } = data
const publicDir = publicdirs[0]
const forumDir = publicDir + 'forum' const forumDir = publicDir + 'forum'
const forumFiles = publicDir + 'forumFiles' const forumFiles = publicDir + 'forumFiles'

View file

@ -47,7 +47,12 @@ import {
getAvailableQdbIndexes, getAvailableQdbIndexes,
removeCacheFromQuestion, removeCacheFromQuestion,
} from '../../../utils/qdbUtils' } from '../../../utils/qdbUtils'
import { files, paths, readAndValidateFile } from '../../../utils/files' import {
files,
paths,
publicDir,
readAndValidateFile,
} from '../../../utils/files'
import { GetResult, get } from '../../../utils/networkUtils' import { GetResult, get } from '../../../utils/networkUtils'
import { import {
msgAllWorker, msgAllWorker,
@ -294,8 +299,7 @@ async function sendNewDataToWorkers(
function writeNewData( function writeNewData(
newQuestionDbs: QuestionDb[], newQuestionDbs: QuestionDb[],
changedQuestionDbs: QuestionDb[], changedQuestionDbs: QuestionDb[],
dbsFilePath: string, dbsFilePath: string
publicDir: string
) { ) {
const qdbsToWrite = [...changedQuestionDbs, ...newQuestionDbs] const qdbsToWrite = [...changedQuestionDbs, ...newQuestionDbs]
const existingQdbs = utils.ReadJSON<DataFile[]>(dbsFilePath) const existingQdbs = utils.ReadJSON<DataFile[]>(dbsFilePath)
@ -486,11 +490,9 @@ function setup(data: SubmoduleData): Submodule {
const { const {
app, app,
userDB, userDB,
publicdirs,
moduleSpecificData: { setQuestionDbs, getQuestionDbs, dbsFile }, moduleSpecificData: { setQuestionDbs, getQuestionDbs, dbsFile },
} = data } = data
const publicDir = publicdirs[0]
let syncInProgress = false let syncInProgress = false
// --------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------
@ -1063,8 +1065,7 @@ function setup(data: SubmoduleData): Submodule {
getQuestionDbs().filter((qdb) => { getQuestionDbs().filter((qdb) => {
return changedQdbIndexes.includes(qdb.index) return changedQdbIndexes.includes(qdb.index)
}), }),
dbsFile, dbsFile
publicDir
) )
setQuestionDbs([...mergedQuestionDbs, ...newQuestionDbs]) setQuestionDbs([...mergedQuestionDbs, ...newQuestionDbs])

View file

@ -55,7 +55,7 @@ import {
SearchResultQuestion, SearchResultQuestion,
subjectToString, subjectToString,
} from '../../../utils/qdbUtils' } from '../../../utils/qdbUtils'
import { paths } from '../../../utils/files' import { paths, publicDir } from '../../../utils/files'
import constants from '../../../constants' import constants from '../../../constants'
import { import {
isJsonValidAndLogError, isJsonValidAndLogError,
@ -391,7 +391,6 @@ function getNewQdb(
location: string, location: string,
maxIndex: number, maxIndex: number,
dbsFile: string, dbsFile: string,
publicDir: string,
questionDbs: QuestionDb[] questionDbs: QuestionDb[]
) { ) {
logger.Log( logger.Log(
@ -446,11 +445,9 @@ function setup(data: SubmoduleData): Submodule {
const { const {
app, app,
userDB, userDB,
publicdirs,
moduleSpecificData: { getQuestionDbs, setQuestionDbs, dbsFile }, moduleSpecificData: { getQuestionDbs, setQuestionDbs, dbsFile },
} = data } = data
const publicDir = publicdirs[0]
const motdFile = publicDir + 'motd' const motdFile = publicDir + 'motd'
const savedQuestionsDir = publicDir + 'savedQuestions' const savedQuestionsDir = publicDir + 'savedQuestions'
@ -586,13 +583,7 @@ function setup(data: SubmoduleData): Submodule {
if (suitedQuestionDbs.length === 0) { if (suitedQuestionDbs.length === 0) {
if (!dbExists(location, getQuestionDbs())) { if (!dbExists(location, getQuestionDbs())) {
suitedQuestionDbs.push( suitedQuestionDbs.push(
getNewQdb( getNewQdb(location, maxIndex, dbsFile, getQuestionDbs())
location,
maxIndex,
dbsFile,
publicDir,
getQuestionDbs()
)
) )
} else { } else {
logger.Log( logger.Log(

View file

@ -1,134 +0,0 @@
/* ----------------------------------------------------------------------------
Question Server
GitLab: <https://gitlab.com/MrFry/mrfrys-node-server>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
------------------------------------------------------------------------- */
import { Response } from 'express'
import logger from '../../../utils/logger'
import utils from '../../../utils/utils'
import { Request, SubmoduleData } from '../../../types/basicTypes'
interface Categories {
[key: string]: {
name: string
color: string
}
}
enum CardState {
TODO = 'todo',
INPROGRESS = 'inprogress',
TESTING = 'testing',
DONE = 'done',
INPROD = 'inprod',
NOTPOSSIBLE = 'notpossible',
}
interface Card {
id: number
name: string
description: string
category: string
points: number
state: CardState
votes: number[]
}
type Columns = {
[key in CardState]: {
name: string
clickable: boolean
}
}
interface Groups {
[key: string]: {
name: string
description: string
}
}
interface Todos {
categories: Categories
cards: Card[]
columns: Columns
groups: Groups
}
const todosFile = 'data/todos.json'
function setup(data: SubmoduleData): void {
const { app } = data
app.get('/voteTodo', (req: Request, res: Response) => {
logger.LogReq(req)
const userId = req.session.user.id
const id: string = req.query.id
const todos: Todos = utils.ReadJSON(todosFile)
if (!id) {
res.json({
msg: 'id query undefined',
result: 'not ok',
})
}
const cardIndex = todos.cards.findIndex((currcard) => {
return currcard.id === parseInt(id)
})
if (cardIndex === -1) {
res.json({
msg: 'card not found',
result: 'not ok',
})
return
}
const ind = todos.cards[cardIndex].votes.indexOf(userId)
if (ind === -1) {
todos.cards[cardIndex].votes.push(userId)
} else {
todos.cards[cardIndex].votes.splice(ind, 1)
}
utils.WriteFile(JSON.stringify(todos, null, 2), todosFile)
res.json({
todos: todos,
userId: userId,
msg: 'updated',
result: 'ok',
})
})
app.get('/todos', (req: Request, res: Response) => {
logger.LogReq(req)
const userId = req.session.user.id
const todos = utils.ReadJSON(todosFile)
res.json({
todos: todos,
userId: userId,
result: 'ok',
})
})
}
export default {
setup: setup,
}

View file

@ -23,10 +23,11 @@ import fs from 'fs'
import logger from '../../../utils/logger' import logger from '../../../utils/logger'
import utils from '../../../utils/utils' import utils from '../../../utils/utils'
import { Request, SubmoduleData, User } from '../../../types/basicTypes' import { Request, SubmoduleData, User } from '../../../types/basicTypes'
import { publicDir } from '../../../utils/files'
const dataFileName = '.data.json' const dataFileName = '.data.json'
function listDir(publicDir: string, subdir: string, userFilesDir: string) { function listDir(subdir: string, userFilesDir: string) {
const safeSubdir = subdir.replace(/\.+/g, '').replace(/\/+/g, '') const safeSubdir = subdir.replace(/\.+/g, '').replace(/\/+/g, '')
const dir = userFilesDir + '/' + safeSubdir const dir = userFilesDir + '/' + safeSubdir
const usersFile = dir + '/' + dataFileName const usersFile = dir + '/' + dataFileName
@ -83,7 +84,7 @@ function listDir(publicDir: string, subdir: string, userFilesDir: string) {
} }
function setup(data: SubmoduleData): void { function setup(data: SubmoduleData): void {
const { app, publicdirs } = data const { app } = data
app.use((req: Request, _res, next) => { app.use((req: Request, _res, next) => {
// /userFiles/test/2021-04-28_10-59.png // /userFiles/test/2021-04-28_10-59.png
@ -121,8 +122,6 @@ function setup(data: SubmoduleData): void {
next() next()
}) })
const publicDir = publicdirs[0]
const userFilesDir = publicDir + 'userFiles' const userFilesDir = publicDir + 'userFiles'
if (!utils.FileExists(userFilesDir)) { if (!utils.FileExists(userFilesDir)) {
utils.CreatePath(userFilesDir, true) utils.CreatePath(userFilesDir, true)
@ -138,7 +137,7 @@ function setup(data: SubmoduleData): void {
const subdir: string = req.query.subdir const subdir: string = req.query.subdir
if (subdir) { if (subdir) {
const result = listDir(publicDir, subdir, userFilesDir) const result = listDir(subdir, userFilesDir)
res.json(result) res.json(result)
} else { } else {
res.json({ res.json({
@ -315,7 +314,7 @@ function setup(data: SubmoduleData): void {
utils.WriteFile(JSON.stringify(data), dataFilePath) utils.WriteFile(JSON.stringify(data), dataFilePath)
} }
const result = listDir(publicDir, dir, userFilesDir) const result = listDir(dir, userFilesDir)
res.json(result) res.json(result)
}) })
@ -333,7 +332,7 @@ function setup(data: SubmoduleData): void {
return return
} }
utils.CreatePath(userFilesDir + '/' + safeName, true) utils.CreatePath(userFilesDir + '/' + safeName, true)
const result = listDir(publicDir, name, userFilesDir) const result = listDir(name, userFilesDir)
if (result.files.length === 0) { if (result.files.length === 0) {
utils.deleteDir(userFilesDir + '/' + safeName) utils.deleteDir(userFilesDir + '/' + safeName)
} else { } else {

View file

@ -29,10 +29,10 @@ import logger from '../../utils/logger'
import auth from '../../middlewares/auth.middleware' import auth from '../../middlewares/auth.middleware'
import { SetupData } from '../../server' import { SetupData } from '../../server'
import { ModuleType, Request } from '../../types/basicTypes' import { ModuleType, Request } from '../../types/basicTypes'
import { publicDir } from '../../utils/files'
// stuff gotten from server.js // stuff gotten from server.js
let userDB: Database let userDB: Database
let publicdirs: string[] = []
let nextdir = '' let nextdir = ''
function GetApp(): ModuleType { function GetApp(): ModuleType {
@ -61,9 +61,7 @@ function GetApp(): ModuleType {
} }
next() next()
}) })
publicdirs.forEach((pdir) => { app.use(express.static(publicDir))
app.use(express.static(pdir))
})
app.use(express.static(nextdir)) app.use(express.static(nextdir))
// -------------------------------------------------------------- // --------------------------------------------------------------
@ -103,7 +101,6 @@ export default {
getApp: GetApp, getApp: GetApp,
setup: (data: SetupData): void => { setup: (data: SetupData): void => {
userDB = data.userDB userDB = data.userDB
publicdirs = data.publicdirs
nextdir = data.nextdir nextdir = data.nextdir
}, },
} }

View file

@ -30,9 +30,9 @@ import auth from '../../middlewares/auth.middleware'
import { SetupData } from '../../server' import { SetupData } from '../../server'
import { ModuleType, Request } from '../../types/basicTypes' import { ModuleType, Request } from '../../types/basicTypes'
import { LinksSchema, validateJSON } from '../../types/typeSchemas' import { LinksSchema, validateJSON } from '../../types/typeSchemas'
import { publicDir } from '../../utils/files'
// stuff gotten from server.js // stuff gotten from server.js
let publicdirs: string[] = []
let userDB: Database let userDB: Database
let nextdir = '' let nextdir = ''
@ -62,9 +62,7 @@ function GetApp(): ModuleType {
} }
next() next()
}) })
publicdirs.forEach((pdir) => { app.use(express.static(publicDir))
app.use(express.static(pdir))
})
app.use(express.static(nextdir)) app.use(express.static(nextdir))
const linksFile = 'data/links.json' const linksFile = 'data/links.json'
let links: { [key: string]: string } = {} let links: { [key: string]: string } = {}
@ -243,7 +241,6 @@ export default {
getApp: GetApp, getApp: GetApp,
setup: (data: SetupData): void => { setup: (data: SetupData): void => {
userDB = data.userDB userDB = data.userDB
publicdirs = data.publicdirs
nextdir = data.nextdir nextdir = data.nextdir
}, },
} }

View file

@ -69,7 +69,6 @@ interface Modules {
interface Module { interface Module {
path: string path: string
publicdirs: Array<string>
name: string name: string
route: string route: string
nextdir?: string nextdir?: string
@ -81,7 +80,6 @@ interface Module {
export interface SetupData { export interface SetupData {
url: string url: string
publicdirs: Array<string>
userDB?: Database userDB?: Database
nextdir?: string nextdir?: string
httpServer: http.Server httpServer: http.Server
@ -233,15 +231,10 @@ Object.keys(modules).forEach(function (key) {
const mod = require(module.path).default // eslint-disable-line const mod = require(module.path).default // eslint-disable-line
// const mod = require(module.path) // const mod = require(module.path)
module.publicdirs.forEach((pdir) => {
utils.CreatePath(pdir)
})
if (mod.setup) { if (mod.setup) {
mod.setup({ mod.setup({
url: constants.domain, // used by api.ts -> userManagement.ts -> cookies url: constants.domain, // used by api.ts -> userManagement.ts -> cookies
userDB: userDB, userDB: userDB,
publicdirs: module.publicdirs,
nextdir: module.nextdir, nextdir: module.nextdir,
httpServer: httpServer, httpServer: httpServer,
httpsServer: httpsServer, httpsServer: httpsServer,

View file

@ -122,7 +122,6 @@ export interface ModuleSpecificData {
export interface SubmoduleData { export interface SubmoduleData {
app: express.Application app: express.Application
url: string url: string
publicdirs: Array<string>
userDB?: Database userDB?: Database
nextdir?: string nextdir?: string
moduleSpecificData: ModuleSpecificData moduleSpecificData: ModuleSpecificData

View file

@ -65,6 +65,8 @@ export const validateAndSetupFiles = (): boolean => {
return everythingValid return everythingValid
} }
export const publicDir = './public'
export const readAndValidateFile = <T>(file: FileDescriptor): T => { export const readAndValidateFile = <T>(file: FileDescriptor): T => {
if (!file.schema) return null if (!file.schema) return null
const fileExists = utils.FileExists(file.path) const fileExists = utils.FileExists(file.path)

@ -1 +1 @@
Subproject commit 55f7efc6d4388519ed127068d5ec12b109c9c5ab Subproject commit e6e1ccaeb8da8cf4c6fe8624697e15fdc3ce9c41

@ -1 +1 @@
Subproject commit 2e12f3275d47334acb97437ecb9f72af4261d334 Subproject commit 055a732733b05d4579fa8e9a85da6b97c29957de