From e84e921bec8dfa97cce736ed24780b4f0b03dcae Mon Sep 17 00:00:00 2001 From: Eldritch-Oliver Date: Sun, 28 Sep 2025 00:45:48 -0600 Subject: [PATCH] Add scripts and infra required to get Foundry intellisense working --- .env.template | 2 ++ .gitignore | 2 ++ augments.d.ts | 14 ++++++++++++ jsconfig.json | 16 ++++++++++++-- scripts/linkFoundry.mjs | 47 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 .env.template create mode 100644 augments.d.ts create mode 100644 scripts/linkFoundry.mjs diff --git a/.env.template b/.env.template new file mode 100644 index 0000000..180dbd6 --- /dev/null +++ b/.env.template @@ -0,0 +1,2 @@ +# The absolute path to the Foundry installation to create symlinks to +FOUNDRY_ROOT="" diff --git a/.gitignore b/.gitignore index 8878028..ff8974d 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,8 @@ lerna-debug.log* node_modules /*.dist *.local +.env +/foundry # Editor directories and files .vscode/* diff --git a/augments.d.ts b/augments.d.ts new file mode 100644 index 0000000..a08bb60 --- /dev/null +++ b/augments.d.ts @@ -0,0 +1,14 @@ +declare global { + class Hooks extends foundry.helpers.Hooks {}; + const fromUuid = foundry.utils.fromUuid; +} + +interface Actor { + /** The system-specific data */ + system: any; +}; + +interface Item { + /** The system-specific data */ + system: any; +}; diff --git a/jsconfig.json b/jsconfig.json index 8b97154..27f6e7c 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,10 +1,22 @@ { "compilerOptions": { "module": "ES2020", - "target": "ES2020" + "target": "ES2020", + "types": [ + "./augments.d.ts" + ], + "paths": { + "@client/*": ["./foundry/client/*"], + "@common/*": ["./foundry/common/*"], + } }, "exclude": ["node_modules", "**/node_modules/*"], - "include": ["module/**/*"], + "include": [ + "module/**/*", + "foundry/client/client.mjs", + "foundry/client/global.d.mts", + "foundry/common/primitives/global.d.mts" + ], "typeAcquisition": { "include": ["joi"] } diff --git a/scripts/linkFoundry.mjs b/scripts/linkFoundry.mjs new file mode 100644 index 0000000..1cbb71a --- /dev/null +++ b/scripts/linkFoundry.mjs @@ -0,0 +1,47 @@ +import { existsSync } from "fs"; +import { symlink, unlink } from "fs/promises"; +import { join } from "path"; +import { config } from "dotenv"; + +config({ quiet: true }); + +const root = process.env.FOUNDRY_ROOT; + +// Early exit +if (!root) { + console.error(`Must provide a FOUNDRY_ROOT environment variable`); + process.exit(1); +}; + +// Assert Foundry exists +if (!existsSync(root)) { + console.error(`Foundry root not found.`); + process.exit(1); +}; + +// Removing existing symlink +if (existsSync(`foundry`)) { + console.log(`Attempting to unlink foundry instance`); + try { + await unlink(`foundry`); + } catch { + console.error(`Failed to unlink foundry folder.`); + process.exit(1); + }; +}; + +// Account for if the root is pointing at an Electron install +let targetRoot = root; +if (existsSync(join(root, `resources`, `app`))) { + console.log(`Switching to use the "${root}/resources/app" directory`); + targetRoot = join(root, `resources`, `app`); +}; + +// Create symlink +console.log(`Linking foundry source into folder`) +try { + await symlink(targetRoot, `foundry`); +} catch (e) { + console.error(e); + process.exit(1); +};