1 line
2.2 KiB
JavaScript
1 line
2.2 KiB
JavaScript
|
|
import fs from"node:fs";import module from"node:module";import os from"node:os";import path from"node:path";export default function configurePaths({root:t,messages:a,debug:o}={}){const e=path.dirname(t),s="resources"===path.basename(e)?path.dirname(e):t;process.env.NODE_PATH=t,module.Module._initPaths();const n=_getEnvDataPath(),i=path.join(n,"Config"),r=path.join(i,"options.json"),p=path.join(t,o?"server":"dist");module.paths=[path.join(t,"node_modules"),p];const h={root:t,app:s,public:path.join(t,"public"),code:p,common:path.join(t,"common"),envData:n,envConfig:i,envOptions:r};let c;for(const t of _userDataPaths(h))try{c=_validateUserDataPath(t,h);break}catch(t){a.push({level:"error",message:t.message})}if(!c)throw new Error("No valid user data path was available. Check your application config.");Object.assign(h,{user:c,data:path.join(c,"Data"),config:path.join(c,"Config"),options:path.join(c,"Config","options.json"),logs:path.join(c,"Logs"),backups:path.join(c,"Backups")});for(let[t,a]of Object.entries(h))h[t]=path.posix.normalize(a.split(path.sep).join(path.posix.sep));return h}function*_userDataPaths(t){const a=process.argv.find((t=>t.startsWith("--dataPath")));if(a&&(yield path.resolve(a.split("=")[1])),"FOUNDRY_VTT_DATA_PATH"in process.env&&(yield path.resolve(process.env.FOUNDRY_VTT_DATA_PATH)),fs.existsSync(t.envOptions)){const a=JSON.parse(fs.readFileSync(t.envOptions,"utf8"));a.dataPath&&(yield a.dataPath)}yield t.envData}function _validateUserDataPath(t,a){const o=path.dirname(t);if(!fs.existsSync(o))throw new Error(`The requested data path parent directory "${o}" does not exist.`);const e=path.relative(a.app,t);if(!e.startsWith("..")&&!path.isAbsolute(e))throw new Error(`The data path "${t}" must not be inside the application location "${a.app}".`);return t}function _getEnvDataPath(){const t=os.homedir(),a="FoundryVTT";switch(process.platform){case"win32":return path.join(process.env.LOCALAPPDATA||path.join(t,"AppData","Local"),a);case"darwin":return path.join(t,"Library","Application Support",a);default:let o=process.env.XDG_DATA_HOME||path.join(t,".local","share");if(!fs.existsSync(o))try{fs.mkdirSync(o,{recursive:!0})}catch(t){o="/local"}return path.join(o,a)}}
|