mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
* TGUI Preferences Menu + total rewrite of the preferences backend (#17368) * It compiles * It opens * Sync 1 * Add asset caching * Sync 2 * It opens without dev now * Update a few packages * Sync 3 * Sync 4 keybind fix * start of dehardcoded species * Small fixes * Add more individual preferences * ASS sync * Automatic changelog generation #17368 [ci skip] * AHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH * e * Fix some TS stuff * Sort quirks starting from good * Fix skin tone selector * Jamie Fixes * Update moth.dm * Fix latejoin menu + tweaks * Some fixes * Finally fix job selection * e * Ling * MORE * config * Convert pref: ooccolor * Convert pref: asay color * Convert pref: tooltips * Convert pref: ui style * Convert pref: buttons locked * Convert pref: hotkeys * Convert pref: tgui stuff * Convert pref: windowflashing * Convert pref: ghost stuff * Convert pref: map & antag * Convert pref: PDA stuff * Convert pref: credits & glasses 1 * Convert pref: name * Convert pref: appearances 1 * Convert pref: appearances 2 * Convert pref: jobless role * Convert pref: runechat * Convert pref: yogtoggles + tail wagging 1 * Convert pref: client fps * Convert pref: graphic settings * Convert pref: pda uplink & menuoptions * Convert pref: map & flare * Convert pref: Bar choice * Fix setup character button * Convert pref: alt announcer * Fix * Add cycle background button * Convert pref: disable balloon alert * fix * Clean savefile * Fix backpack pref * Fix underwear selection * Fixes some shit * Updates * Fix computer runtime * Fix pref names * Convert pref: donor item & hat * More computer fixes * Convert pref: borg hat * Convert pref: donor pda (broken) * Convert pref: purrbation * Convert pref: afreeze * Convert pref: accent * Various savefile improvements * Convert pref: persistent scars 1 * A few pref fixes * Some more fixes * Various SSoverlays improvements * Add IPC appearances * Add polysmorph appearances * No icons for ipc and polysmorph * Podpeople deserve death * Add plasmaman appearance * h * fix * fix2 * asdf * fsdf * aaaaa * FUCK MOTHS * Preternis color * e * e * Update human.dmi * icon fix * un snowflake * fix underwear icon * remove color from here * donor ree * aa * maybe * Restore a bunch of TGUI files * More TGUI fixes * test * Fix more errors * a * test * e? * a;lso this * maybe * Fix * Revert "maybe" This reverts commit14d044a7e3. * fuck off m8 * e * fak off m8 * e2? * AHHH * AHA * AHHH * fix linter 2 * debug * fix runtime * Update dynamic.json * Revert "debug" This reverts commit18681432bd. * 2 * who sleeps in an async? * Hack * e * Fix a few blocking calls * Oh bother * Stay dead * fuck * Update jobs.dm * move debugging * Update jobs.dm * Test * YEET * Revert "YEET" This reverts commit4082e3b133. * Update jobs.dm * Update jobs.dm * e * Fix sechailer runtime * Fix human hair color * d * Ports part of that job refactor * Convert latejoin to new departments * Fix ghost form * Quirk validation * Hopefully pod color fix * oops * Prayge job fix * test * Better unit test asset loading * Remove print * Add error just in case * Remove brief outfit and bypass centcom deadmin * Remove broadcast login/logout * Remove darkened flash * Remove fov darkness * Remove ghost lighting * Remove some tgui prefs * Typo fix * Small fixes * IPC name fix * IPC and pod colors * Jobless fix * Donor item fix * Oopsie * Quirk bandaid * Misc * Move new prefs to Preferences tab for now * Add skillcape * FUCK THIS SHIT * Remove /tg/ gamer cloak * Restrict some job related preferences to clean up UI * Remove useless client var * e * Small tweaks * Dont allow selecting mood quirks if mood is disabled * AHHH * Filter ckey-locked donor items * stupid jamie * AI core display fix * Move donor stuff back to the top * Remove TODOs * Clean up perks * Linter fixes * e * WORKS * LORE * Fix skillcape list * Backpack why * Fixes * Fix cargo console * Remove these * Add horns, frills and mark * Fix not applying all features * Add some missing mutant bodyparts * Update numberinput * Makes animatednumber cooler * Oops * Add default ghost orbit * Default to normal backpack * Fixes skillcapes not being filtered * Donor fix prayge * yep * Adds fallback latejoin menu * Rework donor stuff a bit * Fix donor tgui logic * Delete unused proc * Update FA * Un-yogify quirks * Better checking of quirks * Update tgfont * Fix quirk icons * Fix backup name * Fix donor stuff * A few runtime fixes * Fix another runtime * Give fallback latejoin verb upon connecting * Update AirAlarm interface * maybe this works * Test * Sentient * Remove AI core display preview icons * Fix resetting plasmaman helmet style * Equip plasman in preview * Fix plasmaman preview icon * fuck keybind fix * Extra keybind sanity --------- Co-authored-by: Yogbot-13 <admin@yogstation.net> Co-authored-by: Jamie D <993128+JamieD1@users.noreply.github.com> Co-authored-by: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Co-authored-by: adamsong <adamsong@users.noreply.github.com>
356 lines
10 KiB
JavaScript
356 lines
10 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 'fs';
|
|
import { get } from 'http';
|
|
import { env } from 'process';
|
|
import Juke from './juke/index.js';
|
|
import { DreamDaemon, DreamMaker, NamedVersionFile } from './lib/byond.js';
|
|
import { yarn } from './lib/yarn.js';
|
|
|
|
Juke.chdir('../..', import.meta.url);
|
|
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;
|
|
}
|
|
process.exit(code);
|
|
});
|
|
|
|
const DME_NAME = 'yogstation';
|
|
|
|
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 WarningParameter = new Juke.Parameter({
|
|
type: 'string[]',
|
|
alias: 'W',
|
|
});
|
|
|
|
export const DmMapsIncludeTarget = new Juke.Target({
|
|
executes: async () => {
|
|
const folders = [
|
|
...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],
|
|
dependsOn: ({ get }) => [
|
|
get(DefineParameter).includes('ALL_MAPS') && DmMapsIncludeTarget,
|
|
],
|
|
inputs: [
|
|
'_maps/map_files/generic/**',
|
|
'code/**',
|
|
'html/**',
|
|
'icons/**',
|
|
'interface/**',
|
|
'yogstation/**',
|
|
`${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'),
|
|
namedDmVersion: get(DmVersionParameter),
|
|
});
|
|
},
|
|
});
|
|
|
|
export const DmTestTarget = new Juke.Target({
|
|
parameters: [DefineParameter, DmVersionParameter],
|
|
dependsOn: ({ get }) => [
|
|
get(DefineParameter).includes('ALL_MAPS') && DmMapsIncludeTarget,
|
|
],
|
|
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'),
|
|
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],
|
|
dependsOn: ({ get }) => [
|
|
get(DefineParameter).includes('ALL_MAPS') && DmMapsIncludeTarget,
|
|
],
|
|
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'),
|
|
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 YarnTarget = new Juke.Target({
|
|
parameters: [CiParameter],
|
|
inputs: [
|
|
'tgui/.yarn/+(cache|releases|plugins|sdks)/**/*',
|
|
'tgui/**/package.json',
|
|
'tgui/yarn.lock',
|
|
],
|
|
outputs: [
|
|
'tgui/.yarn/install-target',
|
|
],
|
|
executes: ({ get }) => yarn('install', get(CiParameter) && '--immutable'),
|
|
});
|
|
|
|
export const TgFontTarget = new Juke.Target({
|
|
dependsOn: [YarnTarget],
|
|
inputs: [
|
|
'tgui/.yarn/install-target',
|
|
'tgui/packages/tgfont/**/*.+(js|cjs|svg)',
|
|
'tgui/packages/tgfont/package.json',
|
|
],
|
|
outputs: [
|
|
'tgui/packages/tgfont/dist/tgfont.css',
|
|
'tgui/packages/tgfont/dist/tgfont.eot',
|
|
'tgui/packages/tgfont/dist/tgfont.woff2',
|
|
],
|
|
executes: async () => {
|
|
await yarn('tgfont:build');
|
|
fs.copyFileSync('tgui/packages/tgfont/dist/tgfont.css', 'tgui/packages/tgfont/static/tgfont.css');
|
|
fs.copyFileSync('tgui/packages/tgfont/dist/tgfont.eot', 'tgui/packages/tgfont/static/tgfont.eot');
|
|
fs.copyFileSync('tgui/packages/tgfont/dist/tgfont.woff2', 'tgui/packages/tgfont/static/tgfont.woff2');
|
|
}
|
|
});
|
|
|
|
export const TguiTarget = new Juke.Target({
|
|
dependsOn: [YarnTarget],
|
|
inputs: [
|
|
'tgui/.yarn/install-target',
|
|
'tgui/webpack.config.js',
|
|
'tgui/**/package.json',
|
|
'tgui/packages/**/*.+(js|cjs|ts|tsx|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: () => yarn('tgui:build'),
|
|
});
|
|
|
|
export const TguiEslintTarget = new Juke.Target({
|
|
parameters: [CiParameter],
|
|
dependsOn: [YarnTarget],
|
|
executes: ({ get }) => yarn('tgui:lint', !get(CiParameter) && '--fix'),
|
|
});
|
|
|
|
export const TguiPrettierTarget = new Juke.Target({
|
|
dependsOn: [YarnTarget],
|
|
executes: () => yarn('tgui:prettier'),
|
|
});
|
|
|
|
export const TguiSonarTarget = new Juke.Target({
|
|
dependsOn: [YarnTarget],
|
|
executes: () => yarn('tgui:sonar'),
|
|
});
|
|
|
|
export const TguiTscTarget = new Juke.Target({
|
|
dependsOn: [YarnTarget],
|
|
executes: () => yarn('tgui:tsc'),
|
|
});
|
|
|
|
export const TguiTestTarget = new Juke.Target({
|
|
parameters: [CiParameter],
|
|
dependsOn: [YarnTarget],
|
|
executes: ({ get }) => yarn(`tgui:test-${get(CiParameter) ? 'ci' : 'simple'}`),
|
|
});
|
|
|
|
export const TguiLintTarget = new Juke.Target({
|
|
dependsOn: [YarnTarget, TguiPrettierTarget, TguiEslintTarget, TguiTscTarget],
|
|
});
|
|
|
|
export const TguiDevTarget = new Juke.Target({
|
|
dependsOn: [YarnTarget],
|
|
executes: ({ args }) => yarn('tgui:dev', ...args),
|
|
});
|
|
|
|
export const TguiAnalyzeTarget = new Juke.Target({
|
|
dependsOn: [YarnTarget],
|
|
executes: () => yarn('tgui:analyze'),
|
|
});
|
|
|
|
export const TguiBenchTarget = new Juke.Target({
|
|
dependsOn: [YarnTarget],
|
|
executes: () => yarn('tgui:bench'),
|
|
});
|
|
|
|
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/.yarn/{cache,unplugged,webpack}', { recursive: true });
|
|
Juke.rm('tgui/.yarn/build-state.yml');
|
|
Juke.rm('tgui/.yarn/install-state.gz');
|
|
Juke.rm('tgui/.yarn/install-target');
|
|
Juke.rm('tgui/.pnp.*');
|
|
},
|
|
});
|
|
|
|
export const CleanTarget = new Juke.Target({
|
|
dependsOn: [TguiCleanTarget],
|
|
executes: async () => {
|
|
Juke.rm('*.{dmb,rsc}');
|
|
Juke.rm('*.mdme*');
|
|
Juke.rm('*.m.*');
|
|
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 });
|
|
Juke.logger.info('Cleaning up global yarn cache');
|
|
await yarn('cache', 'clean', '--all');
|
|
},
|
|
});
|
|
|
|
/**
|
|
* Prepends the defines to the .dme.
|
|
* Does not clean them up, as this is intended for TGS which
|
|
* clones new copies anyway.
|
|
*/
|
|
const prependDefines = (...defines) => {
|
|
const dmeContents = fs.readFileSync(`${DME_NAME}.dme`);
|
|
const textToWrite = defines.map(define => `#define ${define}\n`);
|
|
fs.writeFileSync(`${DME_NAME}.dme`, `${textToWrite}\n${dmeContents}`);
|
|
};
|
|
|
|
export const TgsTarget = new Juke.Target({
|
|
dependsOn: [TguiTarget],
|
|
executes: async () => {
|
|
Juke.logger.info('Prepending TGS define');
|
|
prependDefines('TGS');
|
|
},
|
|
});
|
|
|
|
const TGS_MODE = process.env.CBT_BUILD_MODE === 'TGS';
|
|
|
|
export default TGS_MODE ? TgsTarget : BuildTarget;
|