mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-28 07:38:05 +01:00
# Conflicts: # .github/CODEOWNERS # .github/workflows/compile_changelogs.yml # .github/workflows/stale.yml # SQL/database_changelog.md # _maps/map_files/CatwalkStation/CatwalkStation_2023.dmm # code/__DEFINES/atom_hud.dm # code/__DEFINES/inventory.dm # code/__DEFINES/mobs.dm # code/__DEFINES/species_clothing_paths.dm # code/__DEFINES/subsystems.dm # code/__DEFINES/surgery.dm # code/__HELPERS/global_lists.dm # code/_globalvars/lists/maintenance_loot.dm # code/_globalvars/traits/_traits.dm # code/controllers/subsystem/minor_mapping.dm # code/controllers/subsystem/processing/quirks.dm # code/controllers/subsystem/shuttle.dm # code/datums/components/palette.dm # code/datums/components/surgery_initiator.dm # code/datums/diseases/advance/advance.dm # code/datums/hud.dm # code/datums/mood.dm # code/datums/mutations/chameleon.dm # code/datums/quirks/negative_quirks/nyctophobia.dm # code/datums/status_effects/debuffs/debuffs.dm # code/datums/status_effects/debuffs/drunk.dm # code/datums/status_effects/debuffs/slime/slime_leech.dm # code/datums/weather/weather.dm # code/game/data_huds.dm # code/game/objects/items.dm # code/game/objects/items/devices/scanners/health_analyzer.dm # code/game/objects/items/frog_statue.dm # code/game/objects/items/rcd/RLD.dm # code/game/objects/items/robot/items/hypo.dm # code/game/objects/items/stacks/medical.dm # code/game/objects/items/stacks/wrap.dm # code/game/objects/items/storage/garment.dm # code/game/objects/items/tools/medical/defib.dm # code/game/objects/items/weaponry.dm # code/game/objects/items/weaponry/melee/misc.dm # code/game/objects/structures/crates_lockers/closets/secure/security.dm # code/game/objects/structures/curtains.dm # code/game/objects/structures/dresser.dm # code/game/objects/structures/girders.dm # code/game/objects/structures/maintenance.dm # code/game/objects/structures/mirror.dm # code/modules/admin/greyscale_modify_menu.dm # code/modules/admin/verbs/light_debug.dm # code/modules/antagonists/ashwalker/ashwalker.dm # code/modules/antagonists/heretic/knowledge/starting_lore.dm # code/modules/antagonists/ninja/ninjaDrainAct.dm # code/modules/art/paintings.dm # code/modules/client/preferences.dm # code/modules/client/verbs/ooc.dm # code/modules/clothing/head/wig.dm # code/modules/events/disease_outbreak.dm # code/modules/holodeck/holo_effect.dm # code/modules/jobs/job_types/head_of_security.dm # code/modules/jobs/job_types/security_officer.dm # code/modules/library/skill_learning/generic_skillchips/point.dm # code/modules/mining/lavaland/ash_flora.dm # code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm # code/modules/mob/dead/new_player/new_player.dm # code/modules/mob/living/basic/guardian/guardian.dm # code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm # code/modules/mob/living/carbon/carbon.dm # code/modules/mob/living/carbon/human/human.dm # code/modules/mob/living/carbon/human/human_defines.dm # code/modules/mob/living/carbon/life.dm # code/modules/mob/living/living.dm # code/modules/mob/living/living_defines.dm # code/modules/mob/mob.dm # code/modules/mob_spawn/ghost_roles/mining_roles.dm # code/modules/mod/mod_control.dm # code/modules/mod/modules/modules_general.dm # code/modules/modular_computers/computers/item/computer_ui.dm # code/modules/paperwork/paper.dm # code/modules/paperwork/paperbin.dm # code/modules/power/lighting/light.dm # code/modules/projectiles/guns/energy/kinetic_accelerator.dm # code/modules/projectiles/projectile.dm # code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm # code/modules/reagents/chemistry/reagents/food_reagents.dm # code/modules/reagents/chemistry/reagents/other_reagents.dm # code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm # code/modules/research/xenobiology/crossbreeding/_clothing.dm # code/modules/research/xenobiology/crossbreeding/prismatic.dm # code/modules/surgery/advanced/brainwashing.dm # code/modules/surgery/advanced/lobotomy.dm # code/modules/surgery/amputation.dm # code/modules/surgery/blood_filter.dm # code/modules/surgery/bodyparts/_bodyparts.dm # code/modules/surgery/brain_surgery.dm # code/modules/surgery/cavity_implant.dm # code/modules/surgery/coronary_bypass.dm # code/modules/surgery/gastrectomy.dm # code/modules/surgery/healing.dm # code/modules/surgery/limb_augmentation.dm # code/modules/surgery/organ_manipulation.dm # code/modules/surgery/revival.dm # code/modules/surgery/sleeper_protocol.dm # code/modules/surgery/surgery_helpers.dm # code/modules/surgery/surgery_step.dm # code/modules/unit_tests/_unit_tests.dm # code/modules/unit_tests/designs.dm # code/modules/unit_tests/icon_state_worn.dm # code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png # code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png # code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png # code/modules/unit_tests/screenshots/screenshot_husk_body.png # code/modules/unit_tests/screenshots/screenshot_husk_body_missing_limbs.png # icons/map_icons/clothing/head/_head.dmi # icons/map_icons/clothing/shoes.dmi # icons/map_icons/items/_item.dmi # icons/mob/huds/hud.dmi # icons/mob/inhands/64x64_lefthand.dmi # icons/mob/inhands/64x64_righthand.dmi # icons/obj/machines/computer.dmi # tgui/packages/tgui/interfaces/OperatingComputer.jsx # tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx # tgui/packages/tgui/interfaces/PreferencesMenu/types.ts # tgui/packages/tgui/interfaces/SurgeryInitiator.tsx # tools/icon_cutter/check.py
488 lines
14 KiB
JavaScript
488 lines
14 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Build script for /tg/station 13 codebase.
|
|
*
|
|
* This script uses Juke Build, read the docs here:
|
|
* https://github.com/stylemistake/juke-build
|
|
*/
|
|
|
|
import fs from 'node:fs';
|
|
import Bun from 'bun';
|
|
import Juke from './juke/index.js';
|
|
import { bun, bunRoot } from './lib/bun';
|
|
import { DreamDaemon, DreamMaker, NamedVersionFile } from './lib/byond';
|
|
import { downloadFile } from './lib/download';
|
|
import { formatDeps } from './lib/helpers';
|
|
import { prependDefines } from './lib/tgs';
|
|
|
|
export const TGS_MODE = process.env.CBT_BUILD_MODE === 'TGS';
|
|
|
|
export const DME_NAME = 'tgstation';
|
|
|
|
Juke.chdir('../..', import.meta.url);
|
|
|
|
const dependencies: Record<string, string> = await Bun.file('dependencies.sh')
|
|
.text()
|
|
.then(formatDeps)
|
|
.catch((err) => {
|
|
Juke.logger.error(
|
|
'Failed to read dependencies.sh, please ensure it exists and is formatted correctly.',
|
|
);
|
|
Juke.logger.error(err);
|
|
throw new Juke.ExitCode(1);
|
|
});
|
|
|
|
// Canonical path for the cutter exe at this moment
|
|
function getCutterPath() {
|
|
const ver = dependencies.CUTTER_VERSION;
|
|
const suffix = process.platform === 'win32' ? '.exe' : '';
|
|
const file_ver = ver.split('.').join('-');
|
|
|
|
return `tools/icon_cutter/cache/hypnagogic${file_ver}${suffix}`;
|
|
}
|
|
|
|
const cutter_path = getCutterPath();
|
|
|
|
export const DefineParameter = new Juke.Parameter({
|
|
type: 'string[]',
|
|
alias: 'D',
|
|
});
|
|
|
|
export const PortParameter = new Juke.Parameter({
|
|
type: 'string',
|
|
alias: 'p',
|
|
});
|
|
|
|
export const DmVersionParameter = new Juke.Parameter({
|
|
type: 'string',
|
|
});
|
|
|
|
export const CiParameter = new Juke.Parameter({ type: 'boolean' });
|
|
|
|
export const ForceRecutParameter = new Juke.Parameter({
|
|
type: 'boolean',
|
|
name: 'force-recut',
|
|
});
|
|
|
|
export const SkipIconCutter = new Juke.Parameter({
|
|
type: 'boolean',
|
|
name: 'skip-icon-cutter',
|
|
});
|
|
|
|
export const WarningParameter = new Juke.Parameter({
|
|
type: 'string[]',
|
|
alias: 'W',
|
|
});
|
|
|
|
export const NoWarningParameter = new Juke.Parameter({
|
|
type: 'string[]',
|
|
alias: 'I',
|
|
});
|
|
|
|
export const CutterTarget = new Juke.Target({
|
|
onlyWhen: () => {
|
|
const files = Juke.glob(cutter_path);
|
|
return files.length === 0;
|
|
},
|
|
executes: async () => {
|
|
const repo = dependencies.CUTTER_REPO;
|
|
const ver = dependencies.CUTTER_VERSION;
|
|
const suffix = process.platform === 'win32' ? '.exe' : '';
|
|
const download_from = `https://github.com/${repo}/releases/download/${ver}/hypnagogic${suffix}`;
|
|
// We're delaying "comitting" to the final filename here in case downloading fails/is interrupted
|
|
const temp_path = `${cutter_path}_temp`; // yes this means its file extension is .exe_temp I don't really care
|
|
await downloadFile(download_from, temp_path);
|
|
fs.copyFileSync(temp_path, cutter_path);
|
|
fs.rmSync(temp_path)
|
|
if (process.platform !== 'win32') {
|
|
await Juke.exec('chmod', ['+x', cutter_path]);
|
|
}
|
|
},
|
|
});
|
|
|
|
export const IconCutterTarget = new Juke.Target({
|
|
parameters: [ForceRecutParameter],
|
|
dependsOn: () => [CutterTarget],
|
|
inputs: () => {
|
|
const standard_inputs = [
|
|
`icons/**/*.png.toml`,
|
|
`icons/**/*.dmi.toml`,
|
|
`cutter_templates/**/*.toml`,
|
|
// BUBBER EDIT ADDITION START: Modular iconcutter
|
|
`modular_zubbers/icons/**/*.png.toml`,
|
|
`modular_zubbers/icons/**/*.dmi.toml`,
|
|
// BUBBER EDIT END
|
|
cutter_path,
|
|
];
|
|
// Alright we're gonna search out any existing toml files and convert
|
|
// them to their matching .dmi or .png file
|
|
const existing_configs = [
|
|
...Juke.glob(`icons/**/*.png.toml`),
|
|
...Juke.glob(`icons/**/*.dmi.toml`),
|
|
// BUBBER EDIT ADDITION START: Modular iconcutter
|
|
...Juke.glob(`modular_zubbers/icons/**/*.png.toml`),
|
|
...Juke.glob(`modular_zubbers/icons/**/*.dmi.toml`),
|
|
// BUBBER EDIT END
|
|
];
|
|
return [
|
|
...standard_inputs,
|
|
...existing_configs.map((file) => file.replace('.toml', '')),
|
|
];
|
|
},
|
|
outputs: ({ get }) => {
|
|
if (get(ForceRecutParameter)) return [];
|
|
const folders = [
|
|
...Juke.glob(`icons/**/*.png.toml`),
|
|
...Juke.glob(`icons/**/*.dmi.toml`),
|
|
// BUBBER EDIT ADDITION START: Modular iconcutter
|
|
...Juke.glob(`modular_zubbers/icons/**/*.png.toml`),
|
|
...Juke.glob(`modular_zubbers/icons/**/*.dmi.toml`),
|
|
// BUBBER EDIT END
|
|
];
|
|
return folders
|
|
.map((file) => file.replace(`.png.toml`, '.dmi'))
|
|
.map((file) => file.replace(`.dmi.toml`, '.png'));
|
|
},
|
|
executes: async () => {
|
|
await Juke.exec(cutter_path, [
|
|
'--dont-wait',
|
|
'--templates',
|
|
'cutter_templates',
|
|
'icons',
|
|
]);
|
|
// BUBBER EDIT ADDITION START: Modular iconcutter
|
|
await Juke.exec(cutter_path, [
|
|
'--dont-wait',
|
|
'--templates',
|
|
'cutter_templates',
|
|
'modular_zubbers/icons',
|
|
]);
|
|
// BUBBER EDIT END
|
|
},
|
|
});
|
|
|
|
export const DmMapsIncludeTarget = new Juke.Target({
|
|
executes: async () => {
|
|
const folders = [
|
|
...Juke.glob('_maps/bubber/**/*.dmm'), // BUBBER EDIT ADDITION - Include our templates
|
|
...Juke.glob('_maps/map_files/**/modular_pieces/*.dmm'),
|
|
...Juke.glob('_maps/RandomRuins/**/*.dmm'),
|
|
...Juke.glob('_maps/RandomZLevels/**/*.dmm'),
|
|
...Juke.glob('_maps/shuttles/**/*.dmm'),
|
|
...Juke.glob('_maps/templates/**/*.dmm'),
|
|
];
|
|
const content = `${folders
|
|
.map((file) => file.replace('_maps/', ''))
|
|
.map((file) => `#include "${file}"`)
|
|
.join('\n')}\n`;
|
|
fs.writeFileSync('_maps/templates.dm', content);
|
|
},
|
|
});
|
|
|
|
export const DmTarget = new Juke.Target({
|
|
parameters: [
|
|
DefineParameter,
|
|
DmVersionParameter,
|
|
WarningParameter,
|
|
NoWarningParameter,
|
|
SkipIconCutter,
|
|
],
|
|
dependsOn: ({ get }) => [
|
|
get(DefineParameter).includes('ALL_TEMPLATES') && DmMapsIncludeTarget,
|
|
!get(SkipIconCutter) && IconCutterTarget,
|
|
],
|
|
inputs: [
|
|
'_maps/map_files/generic/**',
|
|
'maps/**/*.dm',
|
|
'code/**',
|
|
'html/**',
|
|
'icons/**',
|
|
'interface/**',
|
|
'modular_skyrat/**', ///SKYRAT EDIT ADDITION - Making the CBT work
|
|
'modular_zubbers/**', ///BUBBER EDIT ADDITION - Making the CBT work
|
|
'sound/**',
|
|
'tgui/public/tgui.html',
|
|
`${DME_NAME}.dme`,
|
|
NamedVersionFile,
|
|
],
|
|
outputs: ({ get }) => {
|
|
if (get(DmVersionParameter)) {
|
|
return []; // Always rebuild when dm version is provided
|
|
}
|
|
return [`${DME_NAME}.dmb`, `${DME_NAME}.rsc`];
|
|
},
|
|
executes: async ({ get }) => {
|
|
await DreamMaker(`${DME_NAME}.dme`, {
|
|
defines: ['CBT', ...get(DefineParameter)],
|
|
warningsAsErrors: get(WarningParameter).includes('error'),
|
|
ignoreWarningCodes: get(NoWarningParameter),
|
|
namedDmVersion: get(DmVersionParameter),
|
|
});
|
|
},
|
|
});
|
|
|
|
export const DmTestTarget = new Juke.Target({
|
|
parameters: [
|
|
DefineParameter,
|
|
DmVersionParameter,
|
|
WarningParameter,
|
|
NoWarningParameter,
|
|
],
|
|
dependsOn: ({ get }) => [
|
|
get(DefineParameter).includes('ALL_MAPS') && DmMapsIncludeTarget,
|
|
IconCutterTarget,
|
|
],
|
|
executes: async ({ get }) => {
|
|
fs.copyFileSync(`${DME_NAME}.dme`, `${DME_NAME}.test.dme`);
|
|
await DreamMaker(`${DME_NAME}.test.dme`, {
|
|
defines: ['CBT', 'CIBUILDING', ...get(DefineParameter)],
|
|
warningsAsErrors: get(WarningParameter).includes('error'),
|
|
ignoreWarningCodes: get(NoWarningParameter),
|
|
namedDmVersion: get(DmVersionParameter),
|
|
});
|
|
Juke.rm('data/logs/ci', { recursive: true });
|
|
const options = {
|
|
dmbFile: `${DME_NAME}.test.dmb`,
|
|
namedDmVersion: get(DmVersionParameter),
|
|
};
|
|
await DreamDaemon(
|
|
options,
|
|
'-close',
|
|
'-trusted',
|
|
'-verbose',
|
|
'-params',
|
|
'log-directory=ci',
|
|
);
|
|
Juke.rm('*.test.*');
|
|
try {
|
|
const cleanRun = fs.readFileSync('data/logs/ci/clean_run.lk', 'utf-8');
|
|
console.log(cleanRun);
|
|
} catch (err) {
|
|
Juke.logger.error('Test run was not clean, exiting');
|
|
throw new Juke.ExitCode(1);
|
|
}
|
|
},
|
|
});
|
|
|
|
export const AutowikiTarget = new Juke.Target({
|
|
parameters: [
|
|
DefineParameter,
|
|
DmVersionParameter,
|
|
WarningParameter,
|
|
NoWarningParameter,
|
|
],
|
|
dependsOn: ({ get }) => [
|
|
get(DefineParameter).includes('ALL_TEMPLATES') && DmMapsIncludeTarget,
|
|
IconCutterTarget,
|
|
],
|
|
outputs: ['data/autowiki_edits.txt'],
|
|
executes: async ({ get }) => {
|
|
fs.copyFileSync(`${DME_NAME}.dme`, `${DME_NAME}.test.dme`);
|
|
await DreamMaker(`${DME_NAME}.test.dme`, {
|
|
defines: ['CBT', 'AUTOWIKI', ...get(DefineParameter)],
|
|
warningsAsErrors: get(WarningParameter).includes('error'),
|
|
ignoreWarningCodes: get(NoWarningParameter),
|
|
namedDmVersion: get(DmVersionParameter),
|
|
});
|
|
Juke.rm('data/autowiki_edits.txt');
|
|
Juke.rm('data/autowiki_files', { recursive: true });
|
|
Juke.rm('data/logs/ci', { recursive: true });
|
|
|
|
const options = {
|
|
dmbFile: `${DME_NAME}.test.dmb`,
|
|
namedDmVersion: get(DmVersionParameter),
|
|
};
|
|
await DreamDaemon(
|
|
options,
|
|
'-close',
|
|
'-trusted',
|
|
'-verbose',
|
|
'-params',
|
|
'log-directory=ci',
|
|
);
|
|
Juke.rm('*.test.*');
|
|
if (!fs.existsSync('data/autowiki_edits.txt')) {
|
|
Juke.logger.error('Autowiki did not generate an output, exiting');
|
|
throw new Juke.ExitCode(1);
|
|
}
|
|
},
|
|
});
|
|
|
|
export const BunTarget = new Juke.Target({
|
|
parameters: [CiParameter],
|
|
inputs: ['tgui/**/package.json'],
|
|
executes: () => {
|
|
return bun('install', '--frozen-lockfile', '--ignore-scripts');
|
|
},
|
|
});
|
|
|
|
export const BiomeInstallTarget = new Juke.Target({
|
|
dependsOn: [BunTarget],
|
|
inputs: ['package.json', 'bun.lock'],
|
|
onlyWhen: () => {
|
|
return Juke.glob('node_modules/@biomejs/**').length === 0;
|
|
},
|
|
executes: () => {
|
|
return bunRoot('install');
|
|
},
|
|
});
|
|
|
|
export const TgFontTarget = new Juke.Target({
|
|
dependsOn: [BunTarget],
|
|
inputs: [
|
|
'tgui/packages/tgfont/**/*.+(js|mjs|svg)',
|
|
'tgui/packages/tgfont/package.json',
|
|
],
|
|
outputs: [
|
|
'tgui/packages/tgfont/dist/tgfont.css',
|
|
'tgui/packages/tgfont/dist/tgfont.woff2',
|
|
],
|
|
executes: async () => {
|
|
await bun('tgfont:build');
|
|
fs.mkdirSync('tgui/packages/tgfont/static', { recursive: true });
|
|
fs.copyFileSync(
|
|
'tgui/packages/tgfont/dist/tgfont.css',
|
|
'tgui/packages/tgfont/static/tgfont.css',
|
|
);
|
|
fs.copyFileSync(
|
|
'tgui/packages/tgfont/dist/tgfont.woff2',
|
|
'tgui/packages/tgfont/static/tgfont.woff2',
|
|
);
|
|
},
|
|
});
|
|
|
|
export const TguiTarget = new Juke.Target({
|
|
dependsOn: [BunTarget, BiomeInstallTarget],
|
|
inputs: [
|
|
'tgui/rspack.config.ts',
|
|
'tgui/**/package.json',
|
|
'tgui/packages/**/*.+(js|cjs|ts|tsx|jsx|scss)',
|
|
],
|
|
outputs: [
|
|
'tgui/public/tgui.bundle.css',
|
|
'tgui/public/tgui.bundle.js',
|
|
'tgui/public/tgui-panel.bundle.css',
|
|
'tgui/public/tgui-panel.bundle.js',
|
|
'tgui/public/tgui-say.bundle.css',
|
|
'tgui/public/tgui-say.bundle.js',
|
|
],
|
|
executes: () => bun('tgui:build'),
|
|
});
|
|
|
|
export const TguiTscTarget = new Juke.Target({
|
|
dependsOn: [BunTarget],
|
|
executes: () => bun('tgui:tsc'),
|
|
});
|
|
|
|
export const TguiTestTarget = new Juke.Target({
|
|
parameters: [CiParameter],
|
|
dependsOn: [BunTarget],
|
|
executes: () => bun('tgui:test'),
|
|
});
|
|
|
|
export const BiomeCheckTarget = new Juke.Target({
|
|
dependsOn: [BunTarget, BiomeInstallTarget],
|
|
executes: () => bunRoot('tgui:lint'),
|
|
});
|
|
|
|
export const TguiLintTarget = new Juke.Target({
|
|
dependsOn: [BunTarget, BiomeCheckTarget, TguiTscTarget],
|
|
});
|
|
|
|
export const TguiDevTarget = new Juke.Target({
|
|
dependsOn: [BunTarget],
|
|
executes: ({ args }) => bun('tgui:dev', ...args),
|
|
});
|
|
|
|
export const TguiAnalyzeTarget = new Juke.Target({
|
|
dependsOn: [BunTarget],
|
|
executes: () => bun('tgui:analyze'),
|
|
});
|
|
|
|
export const TestTarget = new Juke.Target({
|
|
dependsOn: [DmTestTarget, TguiTestTarget],
|
|
});
|
|
|
|
export const LintTarget = new Juke.Target({
|
|
dependsOn: [TguiLintTarget],
|
|
});
|
|
|
|
export const BuildTarget = new Juke.Target({
|
|
dependsOn: [TguiTarget, DmTarget],
|
|
});
|
|
|
|
export const ServerTarget = new Juke.Target({
|
|
parameters: [DmVersionParameter, PortParameter],
|
|
dependsOn: [BuildTarget],
|
|
executes: async ({ get }) => {
|
|
const port = get(PortParameter) || '1337';
|
|
const options = {
|
|
dmbFile: `${DME_NAME}.dmb`,
|
|
namedDmVersion: get(DmVersionParameter),
|
|
};
|
|
await DreamDaemon(options, port, '-trusted');
|
|
},
|
|
});
|
|
|
|
export const AllTarget = new Juke.Target({
|
|
dependsOn: [TestTarget, LintTarget, BuildTarget],
|
|
});
|
|
|
|
export const TguiCleanTarget = new Juke.Target({
|
|
executes: async () => {
|
|
Juke.rm('tgui/public/.tmp', { recursive: true });
|
|
Juke.rm('tgui/public/*.map');
|
|
Juke.rm('tgui/public/*.{chunk,bundle,hot-update}.*');
|
|
Juke.rm('tgui/packages/tgfont/dist', { recursive: true });
|
|
Juke.rm('tgui/node_modules', { recursive: true });
|
|
Juke.rm('tgui/packages/*/node_modules', { recursive: true });
|
|
},
|
|
});
|
|
|
|
export const CleanTarget = new Juke.Target({
|
|
dependsOn: [TguiCleanTarget],
|
|
executes: async () => {
|
|
Juke.rm('*.{dmb,rsc}');
|
|
Juke.rm('_maps/templates.dm');
|
|
},
|
|
});
|
|
|
|
/**
|
|
* Removes more junk at the expense of much slower initial builds.
|
|
*/
|
|
export const CleanAllTarget = new Juke.Target({
|
|
dependsOn: [CleanTarget],
|
|
executes: async () => {
|
|
Juke.logger.info('Cleaning up data/logs');
|
|
Juke.rm('data/logs', { recursive: true });
|
|
},
|
|
});
|
|
|
|
export const TgsTarget = new Juke.Target({
|
|
dependsOn: [TguiTarget],
|
|
executes: async () => {
|
|
Juke.logger.info('Prepending TGS define');
|
|
prependDefines('TGS');
|
|
},
|
|
});
|
|
|
|
Juke.setup({ file: import.meta.url }).then((code) => {
|
|
// We're using the currently available quirk in Juke Build, which
|
|
// prevents it from exiting on Windows, to wait on errors.
|
|
if (code !== 0 && process.argv.includes('--wait-on-error')) {
|
|
Juke.logger.error('Please inspect the error and close the window.');
|
|
return;
|
|
}
|
|
|
|
if (TGS_MODE) {
|
|
// workaround for ESBuild process lingering
|
|
// Once https://github.com/privatenumber/esbuild-loader/pull/354 is merged and updated to, this can be removed
|
|
setTimeout(() => process.exit(code), 10000);
|
|
} else {
|
|
process.exit(code);
|
|
}
|
|
});
|
|
|
|
export default TGS_MODE ? TgsTarget : BuildTarget;
|