diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ccd4d3e8ccb..740aafc78b8 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -53,7 +53,6 @@ /code/controllers/subsystem/timer.dm @MrStonedOne /code/controllers/configuration/entries @MrStonedOne /config/ @MrStonedOne -/tools/build/ @MrStonedOne # ninjanomnom @@ -84,6 +83,7 @@ /icons/ @Twaticus @ShizCalev @Krysonism /code/controllers/subsystem/air.dm @LemonInTheDark @MrStonedOne /_maps/ @EOBGames @ShizCalev @Maurukas +/tools/build/ @MrStonedOne @stylemistake /tools/LinuxOneShot/ @Cyberboss @MrStonedOne /tools/tgs4_scripts/ @Cyberboss @MrStonedOne diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 90bb6f179ea..3068e66f642 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -90,7 +90,7 @@ #define MAX_ATOM_OVERLAYS 100 #if !defined(CBT) && !defined(SPACEMAN_DMM) -#warn "Building with Dream Maker is no longer supported and will result in errors." -#warn "In order to build, run BUILD.bat in the root directory." -#warn "Consider switching to VSCode editor instead, where you can press Ctrl+Shift+B to build." +#warn Building with Dream Maker is no longer supported and will result in errors. +#warn In order to build, run BUILD.bat in the root directory. +#warn Consider switching to VSCode editor instead, where you can press Ctrl+Shift+B to build. #endif diff --git a/tools/build/build.js b/tools/build/build.js index 78bcccd76bd..a174bfd8aed 100755 --- a/tools/build/build.js +++ b/tools/build/build.js @@ -127,7 +127,7 @@ const DefaultTarget = Juke.createTarget({ * Does not clean them up, as this is intended for TGS which * clones new copies anyway. */ - const prependDefines = (...defines) => { +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}`); diff --git a/tools/build/cbt/dm.js b/tools/build/cbt/dm.js index b6e8e3089e5..64a3d90c7b1 100644 --- a/tools/build/cbt/dm.js +++ b/tools/build/cbt/dm.js @@ -1,4 +1,4 @@ -const { exec } = require('../juke'); +const Juke = require('../juke'); const { stat } = require('./fs'); const { regQuery } = require('./winreg'); const fs = require('fs'); @@ -15,6 +15,7 @@ let dmPath; * @param {{ defines?: string[] }} options */ const dm = async (dmeFile, options = {}) => { + // Get path to DM compiler if (!dmPath) { dmPath = await (async () => { // Search in array of paths @@ -60,22 +61,45 @@ const dm = async (dmeFile, options = {}) => { ); })(); } - const { defines } = options; + // Get project basename const dmeBaseName = dmeFile.replace(/\.dme$/, ''); + // Make sure output files are writable + const testOutputFile = (name) => { + try { + fs.closeSync(fs.openSync(name, 'r+')); + } + catch (err) { + if (err && err.code === 'ENOENT') { + return; + } + if (err && err.code === 'EBUSY') { + Juke.logger.error(`File '${name}' is locked by the DreamDaemon process.`); + Juke.logger.error(`Stop the currently running server and try again.`); + throw new Juke.ExitCode(1); + } + throw err; + } + }; + testOutputFile(`${dmeBaseName}.dmb`); + testOutputFile(`${dmeBaseName}.rsc`); + // Compile + const { defines } = options; if (defines && defines.length > 0) { const injectedContent = defines .map(x => `#define ${x}\n`) .join(''); - fs.writeFileSync(`${dmeBaseName}.mdme`, injectedContent) - const dmeContent = fs.readFileSync(`${dmeBaseName}.dme`) - fs.appendFileSync(`${dmeBaseName}.mdme`, dmeContent) - await exec(dmPath, [`${dmeBaseName}.mdme`]); - fs.renameSync(`${dmeBaseName}.mdme.dmb`, `${dmeBaseName}.dmb`) - fs.renameSync(`${dmeBaseName}.mdme.rsc`, `${dmeBaseName}.rsc`) - fs.unlinkSync(`${dmeBaseName}.mdme`) + fs.writeFileSync(`${dmeBaseName}.mdme`, injectedContent); + const dmeContent = fs.readFileSync(`${dmeBaseName}.dme`); + fs.appendFileSync(`${dmeBaseName}.mdme`, dmeContent); + await Juke.exec(dmPath, [`${dmeBaseName}.mdme`]); + fs.writeFileSync(`${dmeBaseName}.dmb`, fs.readFileSync(`${dmeBaseName}.mdme.dmb`)); + fs.writeFileSync(`${dmeBaseName}.rsc`, fs.readFileSync(`${dmeBaseName}.mdme.rsc`)); + fs.unlinkSync(`${dmeBaseName}.mdme.dmb`); + fs.unlinkSync(`${dmeBaseName}.mdme.rsc`); + fs.unlinkSync(`${dmeBaseName}.mdme`); } else { - await exec(dmPath, dmeFile); + await Juke.exec(dmPath, [dmeFile]); } }; diff --git a/tools/build/juke/argparse.d.ts b/tools/build/juke/argparse.d.ts deleted file mode 100644 index adf662dac82..00000000000 --- a/tools/build/juke/argparse.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Parameter, ParameterMap } from './parameter'; -declare type TaskArgs = [ - /** Task name */ - string, - /** Task arguments */ - ...string[] -]; -/** - * Returns global flags and tasks, which is an array of this format: - * `[[taskName, ...taskArgs], ...]` - * @param args List of command line arguments - */ -export declare const prepareArgs: (args: string[]) => { - globalFlags: string[]; - taskArgs: TaskArgs[]; -}; -export declare const parseArgs: (args: string[], parameters: Parameter[]) => ParameterMap; -export {}; diff --git a/tools/build/juke/exec.d.ts b/tools/build/juke/exec.d.ts deleted file mode 100644 index 5373a0343bd..00000000000 --- a/tools/build/juke/exec.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { SpawnOptionsWithoutStdio } from 'child_process'; -export declare class ExitError extends Error { - code: number | null; - signal: string | null; -} -export declare const exec: (executable: string, args?: string[], options?: SpawnOptionsWithoutStdio) => Promise; diff --git a/tools/build/juke/fs.d.ts b/tools/build/juke/fs.d.ts deleted file mode 100644 index 4785243b2d1..00000000000 --- a/tools/build/juke/fs.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -/// -import fs from 'fs'; -export declare class File { - readonly path: string; - private _stat?; - constructor(path: string); - get stat(): fs.Stats | null; - exists(): boolean; - get mtime(): Date | null; - touch(): void; -} -export declare class Glob { - readonly path: string; - constructor(path: string); - toFiles(): File[]; -} -/** - * If true, source is newer than target. - */ -export declare const compareFiles: (sources: File[], targets: File[]) => string | false; -/** - * Returns file stats for the provided path, or null if file is - * not accessible. - */ -export declare const stat: (path: string) => fs.Stats | null; -/** - * Resolves a glob pattern and returns files that are safe - * to call `stat` on. - */ -export declare const resolveGlob: (globPath: string) => string[]; diff --git a/tools/build/juke/index.d.ts b/tools/build/juke/index.d.ts index a32f6083efd..0a3d5dcfc66 100644 --- a/tools/build/juke/index.d.ts +++ b/tools/build/juke/index.d.ts @@ -1,11 +1,166 @@ -import chalk from 'chalk'; -import glob from 'glob'; -import { exec } from './exec'; -import { logger } from './logger'; -import { createParameter as _createParameter } from './parameter'; -import { RunnerConfig } from './runner'; -import { createTarget as _createTarget } from './target'; -export { exec, chalk, glob, logger }; +// Generated by dts-bundle-generator v5.9.0 + +/// + +import _chalk from 'chalk'; +import { SpawnOptionsWithoutStdio } from 'child_process'; + +export declare class ExitCode extends Error { + code: number | null; + signal: string | null; + constructor(code: number | null, signal?: string | null); +} +export declare type ExecOptions = SpawnOptionsWithoutStdio & { + /** + * If `true`, this exec call will not pipe its output to stdio. + * @default false + */ + silent?: boolean; + /** + * Throw an exception on non-zero exit code. + * @default true + */ + throw?: boolean; +}; +export declare type ExecReturn = { + /** Exit code of the program. */ + code: number | null; + /** Signal received by the program which caused it to exit. */ + signal: NodeJS.Signals | null; + /** Output collected from `stdout` */ + stdout: string; + /** Output collected from `stderr` */ + stderr: string; + /** A combined output collected from `stdout` and `stderr`. */ + combined: string; +}; +export declare const exec: (executable: string, args?: string[], options?: ExecOptions) => Promise; +export declare const logger: { + log: (...args: unknown[]) => void; + error: (...args: unknown[]) => void; + action: (...args: unknown[]) => void; + warn: (...args: unknown[]) => void; + info: (...args: unknown[]) => void; + debug: (...args: unknown[]) => void; +}; +export declare type ParameterType = (string | string[] | number | number[] | boolean | boolean[]); +export declare type ParameterStringType = ("string" | "string[]" | "number" | "number[]" | "boolean" | "boolean[]"); +export declare type ParameterTypeByString = (T extends "string" ? string : T extends "string[]" ? string[] : T extends "number" ? number : T extends "number[]" ? number[] : T extends "boolean" ? boolean : T extends "boolean[]" ? boolean[] : never); +export declare type ParameterConfig = { + /** + * Parameter name, in "camelCase". + */ + readonly name: string; + /** + * Parameter type, one of: + * - `string` + * - `string[]` + * - `number` + * - `number[]` + * - `boolean` + * - `boolean[]` + */ + readonly type: T; + /** + * Short flag for use in CLI, can only be a single character. + */ + readonly alias?: string; +}; +export declare type ParameterCreator = (config: ParameterConfig) => Parameter>; +declare class Parameter { + readonly name: string; + readonly type: ParameterStringType; + readonly alias?: string | undefined; + constructor(name: string, type: ParameterStringType, alias?: string | undefined); + isString(): T extends string | string[] ? true : false; + isNumber(): T extends number | number[] ? true : false; + isBoolean(): T extends boolean | boolean[] ? true : false; + isArray(): T extends Array ? true : false; + toKebabCase(): string; + toConstCase(): string; + toCamelCase(): string; +} +export declare type ExecutionContext = { + /** Get parameter value. */ + get: (parameter: Parameter) => (T extends Array ? T : T | null); +}; +export declare type BooleanLike = boolean | null | undefined; +export declare type WithExecutionContext = (context: ExecutionContext) => R | Promise; +export declare type WithOptionalExecutionContext = R | WithExecutionContext; +export declare type DependsOn = WithOptionalExecutionContext<(Target | BooleanLike)[]>; +export declare type ExecutesFn = WithExecutionContext; +export declare type OnlyWhenFn = WithExecutionContext; +export declare type FileIo = WithOptionalExecutionContext<(string | BooleanLike)[]>; +export declare type Target = { + name: string; + dependsOn: DependsOn; + executes?: ExecutesFn; + inputs: FileIo; + outputs: FileIo; + parameters: Parameter[]; + onlyWhen?: OnlyWhenFn; +}; +export declare type TargetConfig = { + /** + * Target name. This parameter is required. + */ + name: string; + /** + * Dependencies for this target. They will be ran before executing this + * target, and may run in parallel. + */ + dependsOn?: DependsOn; + /** + * Function that is delegated to the execution engine for building this + * target. It is normally an async function, which accepts a single + * argument - execution context (contains `get` for interacting with + * parameters). + * + * @example + * executes: async ({ get }) => { + * console.log(get(Parameter)); + * }, + */ + executes?: ExecutesFn; + /** + * Files that are consumed by this target. + */ + inputs?: FileIo; + /** + * Files that are produced by this target. Additionally, they are also + * touched every time target finishes executing in order to stop + * this target from re-running. + */ + outputs?: FileIo; + /** + * Parameters that are local to this task. Can be retrieved via `get` + * in the executor function. + */ + parameters?: Parameter[]; + /** + * Target will run only when this function returns true. It accepts a + * single argument - execution context. + */ + onlyWhen?: OnlyWhenFn; +}; +export declare type TargetCreator = (target: TargetConfig) => Target; +export declare type RunnerConfig = { + targets?: Target[]; + default?: Target; + parameters?: Parameter[]; +}; +export declare const chalk: _chalk.Chalk & _chalk.ChalkFunction & { + supportsColor: false | _chalk.ColorSupport; + Level: _chalk.Level; + Color: ("black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white" | "gray" | "grey" | "blackBright" | "redBright" | "greenBright" | "yellowBright" | "blueBright" | "magentaBright" | "cyanBright" | "whiteBright") | ("bgBlack" | "bgRed" | "bgGreen" | "bgYellow" | "bgBlue" | "bgMagenta" | "bgCyan" | "bgWhite" | "bgGray" | "bgGrey" | "bgBlackBright" | "bgRedBright" | "bgGreenBright" | "bgYellowBright" | "bgBlueBright" | "bgMagentaBright" | "bgCyanBright" | "bgWhiteBright"); + ForegroundColor: "black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white" | "gray" | "grey" | "blackBright" | "redBright" | "greenBright" | "yellowBright" | "blueBright" | "magentaBright" | "cyanBright" | "whiteBright"; + BackgroundColor: "bgBlack" | "bgRed" | "bgGreen" | "bgYellow" | "bgBlue" | "bgMagenta" | "bgCyan" | "bgWhite" | "bgGray" | "bgGrey" | "bgBlackBright" | "bgRedBright" | "bgGreenBright" | "bgYellowBright" | "bgBlueBright" | "bgMagentaBright" | "bgCyanBright" | "bgWhiteBright"; + Modifiers: "bold" | "reset" | "dim" | "italic" | "underline" | "inverse" | "hidden" | "strikethrough" | "visible"; + stderr: _chalk.Chalk & { + supportsColor: false | _chalk.ColorSupport; + }; +}; +export declare const glob: typeof import("glob"); /** * Configures Juke Build and starts executing targets. * @@ -13,11 +168,13 @@ export { exec, chalk, glob, logger }; * @returns Exit code of the whole runner process. */ export declare const setup: (config?: RunnerConfig) => Promise; -export declare const createTarget: typeof _createTarget; -export declare const createParameter: typeof _createParameter; +export declare const createTarget: TargetCreator; +export declare const createParameter: ParameterCreator; export declare const sleep: (time: number) => Promise; /** * Resolves a glob pattern and returns files that are safe * to call `stat` on. */ export declare const resolveGlob: (globPath: string) => string[]; + +export {}; diff --git a/tools/build/juke/index.js b/tools/build/juke/index.js index 49e2322fe85..ffc01fa1ae2 100644 --- a/tools/build/juke/index.js +++ b/tools/build/juke/index.js @@ -6173,7 +6173,9 @@ exports.parseArgs = parseArgs; exports.__esModule = true; -exports.exec = exports.ExitError = void 0; +exports.exec = exports.ExitCode = void 0; + +var _chalk = _interopRequireDefault(__webpack_require__(/*! chalk */ "./.yarn/cache/chalk-npm-4.1.1-f1ce6bae57-445c12db7a.zip/node_modules/chalk/source/index.js")); var _child_process = __webpack_require__(/*! child_process */ "child_process"); @@ -6181,6 +6183,8 @@ var _path = __webpack_require__(/*! path */ "path"); var _fs = __webpack_require__(/*! ./fs */ "./src/fs.ts"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + const children = new Set(); const killChildren = () => { @@ -6238,18 +6242,25 @@ const exceptionHandler = err => { process.on('unhandledRejection', exceptionHandler); process.on('uncaughtException', exceptionHandler); -class ExitError extends Error { - constructor(...args) { - super(...args); +class ExitCode extends Error { + constructor(code, signal) { + super('Process exited with code: ' + code); this.code = null; this.signal = null; + this.code = code; + this.signal = signal != null ? signal : null; } } -exports.ExitError = ExitError; +exports.ExitCode = ExitCode; const exec = (executable, args = [], options = {}) => { + const { + silent = false, + throw: canThrow = true, + ...spawnOptions + } = options; return new Promise((resolve, reject) => { // If executable exists relative to the current directory, // use that executable, otherwise spawn should fall back to @@ -6258,27 +6269,50 @@ const exec = (executable, args = [], options = {}) => { executable = (0, _path.resolve)(executable); } - const child = (0, _child_process.spawn)(executable, args, options); + if (process.env.JUKE_DEBUG) { + console.log(_chalk.default.grey('$', executable, ...args)); + } + + const child = (0, _child_process.spawn)(executable, args, spawnOptions); children.add(child); - child.stdout.pipe(process.stdout, { - end: false + let stdout = ''; + let stderr = ''; + let combined = ''; + child.stdout.on('data', data => { + if (!silent) { + process.stdout.write(data); + } + + stdout += data; + combined += data; }); - child.stderr.pipe(process.stderr, { - end: false + child.stderr.on('data', data => { + if (!silent) { + process.stderr.write(data); + } + + stderr += data; + combined += data; }); - child.stdin.end(); child.on('error', err => reject(err)); child.on('exit', (code, signal) => { children.delete(child); - if (code !== 0) { - const error = new ExitError('Process exited with code: ' + code); + if (code !== 0 && canThrow) { + const error = new ExitCode(code); error.code = code; error.signal = signal; reject(error); - } else { - resolve(); + return; } + + resolve({ + code, + signal, + stdout, + stderr, + combined + }); }); }); }; @@ -6503,7 +6537,7 @@ exports.Parameter = exports.createParameter = void 0; var _stringcase = __webpack_require__(/*! stringcase */ "./.yarn/cache/stringcase-npm-4.3.1-2f1c329337-c81a3a4ab4.zip/node_modules/stringcase/lib/index.js"); -const createParameter = options => new Parameter(options.name, options.type, options.alias); +const createParameter = config => new Parameter(config.name, config.type, config.alias); exports.createParameter = createParameter; @@ -6863,7 +6897,7 @@ class Worker { const timeStr = _chalk.default.magenta(time); - if (err instanceof _exec.ExitError) { + if (err instanceof _exec.ExitCode) { const codeStr = _chalk.default.red(err.code); _logger.logger.error(`Target '${nameStr}' failed in ${timeStr}, exit code: ${codeStr}`); @@ -7021,7 +7055,7 @@ module.exports = require("util");; /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; -/******/ +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache @@ -7035,17 +7069,17 @@ module.exports = require("util");; /******/ loaded: false, /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ +/******/ /******/ // Flag the module as loaded /******/ module.loaded = true; -/******/ +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ +/******/ /************************************************************************/ /******/ /* webpack/runtime/node module decorator */ /******/ (() => { @@ -7055,7 +7089,7 @@ module.exports = require("util");; /******/ return module; /******/ }; /******/ })(); -/******/ +/******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. @@ -7067,21 +7101,18 @@ var exports = __webpack_exports__; exports.__esModule = true; -exports.resolveGlob = exports.sleep = exports.createParameter = exports.createTarget = exports.setup = void 0; +exports.resolveGlob = exports.sleep = exports.createParameter = exports.createTarget = exports.setup = exports.glob = exports.chalk = void 0; -var _chalk = _interopRequireDefault(__webpack_require__(/*! chalk */ "./.yarn/cache/chalk-npm-4.1.1-f1ce6bae57-445c12db7a.zip/node_modules/chalk/source/index.js")); - -exports.chalk = _chalk.default; +var _chalk2 = _interopRequireDefault(__webpack_require__(/*! chalk */ "./.yarn/cache/chalk-npm-4.1.1-f1ce6bae57-445c12db7a.zip/node_modules/chalk/source/index.js")); var _fs = _interopRequireDefault(__webpack_require__(/*! fs */ "fs")); -var _glob = _interopRequireDefault(__webpack_require__(/*! glob */ "./.yarn/cache/glob-npm-7.1.7-5698ad9c48-352f74f082.zip/node_modules/glob/glob.js")); - -exports.glob = _glob.default; +var _glob2 = __webpack_require__(/*! glob */ "./.yarn/cache/glob-npm-7.1.7-5698ad9c48-352f74f082.zip/node_modules/glob/glob.js"); var _exec = __webpack_require__(/*! ./exec */ "./src/exec.ts"); exports.exec = _exec.exec; +exports.ExitCode = _exec.ExitCode; var _logger = __webpack_require__(/*! ./logger */ "./src/logger.ts"); @@ -7095,6 +7126,10 @@ var _target = __webpack_require__(/*! ./target */ "./src/target.ts"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +const chalk = _chalk2.default; +exports.chalk = chalk; +const glob = _glob2.glob; +exports.glob = glob; const autoParameters = []; const autoTargets = []; /** @@ -7149,11 +7184,10 @@ const sleep = time => new Promise(resolve => setTimeout(resolve, time)); exports.sleep = sleep; const resolveGlob = globPath => { - const unsafePaths = _glob.default.sync(globPath, { + const unsafePaths = glob.sync(globPath, { strict: false, silent: true }); - const safePaths = []; for (let path of unsafePaths) { @@ -7173,4 +7207,4 @@ exports.resolveGlob = resolveGlob; /******/ return __webpack_exports__; /******/ })() ; -}); \ No newline at end of file +}); diff --git a/tools/build/juke/logger.d.ts b/tools/build/juke/logger.d.ts deleted file mode 100644 index ed1b23be41a..00000000000 --- a/tools/build/juke/logger.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export declare const logger: { - log: (...args: unknown[]) => void; - error: (...args: unknown[]) => void; - action: (...args: unknown[]) => void; - warn: (...args: unknown[]) => void; - info: (...args: unknown[]) => void; - debug: (...args: unknown[]) => void; -}; diff --git a/tools/build/juke/parameter.d.ts b/tools/build/juke/parameter.d.ts deleted file mode 100644 index 1e45f3c6bf2..00000000000 --- a/tools/build/juke/parameter.d.ts +++ /dev/null @@ -1,39 +0,0 @@ -export declare type ParameterType = (string | string[] | number | number[] | boolean | boolean[]); -export declare type ParameterStringType = ('string' | 'string[]' | 'number' | 'number[]' | 'boolean' | 'boolean[]'); -declare type ParameterTypeByString = (T extends 'string' ? string : T extends 'string[]' ? string[] : T extends 'number' ? number : T extends 'number[]' ? number[] : T extends 'boolean' ? boolean : T extends 'boolean[]' ? boolean[] : never); -export declare type ParameterMap = Map; -declare type ParameterOptions = { - /** - * Parameter name, in "camelCase". - */ - readonly name: string; - /** - * Parameter type, one of: - * - `string` - * - `string[]` - * - `number` - * - `number[]` - * - `boolean` - * - `boolean[]` - */ - readonly type: T; - /** - * Short flag for use in CLI, can only be a single character. - */ - readonly alias?: string; -}; -export declare const createParameter: (options: ParameterOptions) => Parameter>; -export declare class Parameter { - readonly name: string; - readonly type: ParameterStringType; - readonly alias?: string | undefined; - constructor(name: string, type: ParameterStringType, alias?: string | undefined); - isString(): T extends string | string[] ? true : false; - isNumber(): T extends number | number[] ? true : false; - isBoolean(): T extends boolean | boolean[] ? true : false; - isArray(): T extends Array ? true : false; - toKebabCase(): string; - toConstCase(): string; - toCamelCase(): string; -} -export {}; diff --git a/tools/build/juke/runner.d.ts b/tools/build/juke/runner.d.ts deleted file mode 100644 index 8fccebae7de..00000000000 --- a/tools/build/juke/runner.d.ts +++ /dev/null @@ -1,35 +0,0 @@ -/// -import EventEmitter from 'events'; -import { Parameter } from './parameter'; -import { ExecutionContext, Target } from './target'; -export declare type RunnerConfig = { - targets?: Target[]; - default?: Target; - parameters?: Parameter[]; -}; -export declare const runner: { - defaultTarget?: Target | undefined; - targets: Target[]; - parameters: Parameter[]; - workers: Worker[]; - configure(config: RunnerConfig): void; - start(): Promise; -}; -declare class Worker { - readonly target: Target; - readonly context: ExecutionContext; - readonly dependsOn: Target[]; - dependencies: Set; - generator?: AsyncGenerator; - emitter: EventEmitter; - hasFailed: boolean; - constructor(target: Target, context: ExecutionContext, dependsOn: Target[]); - resolveDependency(target: Target): void; - rejectDependency(target: Target): void; - start(): void; - onFinish(fn: () => void): void; - onFail(fn: () => void): void; - private debugLog; - private process; -} -export {}; diff --git a/tools/build/juke/target.d.ts b/tools/build/juke/target.d.ts deleted file mode 100644 index 892f13ce345..00000000000 --- a/tools/build/juke/target.d.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Parameter, ParameterType } from './parameter'; -export declare type ExecutionContext = { - /** Get parameter value. */ - get: (parameter: Parameter) => (T extends Array ? T : T | null); -}; -declare type BooleanLike = boolean | null | undefined; -declare type WithExecutionContext = (context: ExecutionContext) => R | Promise; -declare type WithOptionalExecutionContext = R | WithExecutionContext; -declare type DependsOn = WithOptionalExecutionContext<(Target | BooleanLike)[]>; -declare type ExecutesFn = WithExecutionContext; -declare type OnlyWhenFn = WithExecutionContext; -export declare type FileIo = WithOptionalExecutionContext<(string | BooleanLike)[]>; -export declare type Target = { - name: string; - dependsOn: DependsOn; - executes?: ExecutesFn; - inputs: FileIo; - outputs: FileIo; - parameters: Parameter[]; - onlyWhen?: OnlyWhenFn; -}; -declare type TargetConfig = { - /** - * Target name. This parameter is required. - */ - name: string; - /** - * Dependencies for this target. They will be ran before executing this - * target, and may run in parallel. - */ - dependsOn?: DependsOn; - /** - * Function that is delegated to the execution engine for building this - * target. It is normally an async function, which accepts a single - * argument - execution context (contains `get` for interacting with - * parameters). - * - * @example - * executes: async ({ get }) => { - * console.log(get(Parameter)); - * }, - */ - executes?: ExecutesFn; - /** - * Files that are consumed by this target. - */ - inputs?: FileIo; - /** - * Files that are produced by this target. Additionally, they are also - * touched every time target finishes executing in order to stop - * this target from re-running. - */ - outputs?: FileIo; - /** - * Parameters that are local to this task. Can be retrieved via `get` - * in the executor function. - */ - parameters?: Parameter[]; - /** - * Target will run only when this function returns true. It accepts a - * single argument - execution context. - */ - onlyWhen?: OnlyWhenFn; -}; -export declare const createTarget: (target: TargetConfig) => Target; -export {};