@powerlines/engine 0.49.47 → 0.49.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -10
- package/dist/_internal/execution-api-worker.d.cts +3 -2
- package/dist/_internal/execution-api-worker.d.cts.map +1 -1
- package/dist/_internal/execution-api-worker.d.mts +3 -2
- package/dist/_internal/execution-api-worker.d.mts.map +1 -1
- package/dist/_internal/execution-api-worker.mjs.map +1 -1
- package/dist/api/build.mjs.map +1 -1
- package/dist/api/prepare.cjs +2 -1
- package/dist/api/prepare.d.cts.map +1 -1
- package/dist/api/prepare.d.mts.map +1 -1
- package/dist/api/prepare.mjs +2 -1
- package/dist/api/prepare.mjs.map +1 -1
- package/dist/api/types.cjs +2 -1
- package/dist/api/types.d.cts.map +1 -1
- package/dist/api/types.d.mts.map +1 -1
- package/dist/api/types.mjs +2 -1
- package/dist/api/types.mjs.map +1 -1
- package/dist/context/engine-context.cjs +6 -2
- package/dist/context/engine-context.d.cts +2 -1
- package/dist/context/engine-context.d.cts.map +1 -1
- package/dist/context/engine-context.d.mts +2 -1
- package/dist/context/engine-context.d.mts.map +1 -1
- package/dist/context/engine-context.mjs +6 -2
- package/dist/context/engine-context.mjs.map +1 -1
- package/dist/engine.d.cts +11 -10
- package/dist/engine.d.cts.map +1 -1
- package/dist/engine.d.mts +11 -10
- package/dist/engine.d.mts.map +1 -1
- package/dist/engine.mjs.map +1 -1
- package/dist/helpers/create-api.cjs +1 -1
- package/dist/helpers/create-api.mjs +1 -1
- package/dist/helpers/create-api.mjs.map +1 -1
- package/dist/helpers/finalize.mjs.map +1 -1
- package/dist/helpers/stream.mjs.map +1 -1
- package/dist/types/context.d.cts +2 -1
- package/dist/types/context.d.cts.map +1 -1
- package/dist/types/context.d.mts +2 -1
- package/dist/types/context.d.mts.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -27,7 +27,7 @@ This package is part of the <b>🔌 Powerlines</b> monorepo. Powerlines is the "
|
|
|
27
27
|
|
|
28
28
|
<h3 align="center">💻 Visit <a href="https://stormsoftware.com" target="_blank">stormsoftware.com</a> to stay up to date with this developer</h3><br />
|
|
29
29
|
|
|
30
|
-
[](https://stormsoftware.com/projects/powerlines) [](http://commitizen.github.io/cz-cli/)  
|
|
31
31
|
|
|
32
32
|
<!-- prettier-ignore-start -->
|
|
33
33
|
<!-- markdownlint-disable -->
|
|
@@ -276,21 +276,15 @@ one where anyone can create software without years of prior development
|
|
|
276
276
|
experience serving as a barrier to entry. We hope to achieve this via LLMs,
|
|
277
277
|
Generative AI, and intuitive, high-level data modeling/programming languages.
|
|
278
278
|
|
|
279
|
-
Join us on [Discord](https://discord.gg/MQ6YVzakM5) to chat with the team,
|
|
280
|
-
receive release notifications, ask questions, and get involved.
|
|
279
|
+
Join us on [**Discord**](https://discord.gg/MQ6YVzakM5) to chat with the team, receive release notifications, ask questions, and get involved.
|
|
281
280
|
|
|
282
|
-
If this sounds interesting, and you would like to help us in creating the next
|
|
283
|
-
generation of development tools, please reach out on our
|
|
284
|
-
[website](https://stormsoftware.com/contact) or join our
|
|
285
|
-
[Slack channel](https://join.slack.com/t/storm-software/shared_invite/zt-2gsmk04hs-i6yhK_r6urq0dkZYAwq2pA)!
|
|
281
|
+
If this sounds interesting, and you would like to help us in creating the next generation of development tools, please reach out on our [**website**](https://stormsoftware.com/contact) or join our [**Slack**](https://join.slack.com/t/storm-software/shared_invite/zt-2gsmk04hs-i6yhK_r6urq0dkZYAwq2pA) channel! If you plan on publishing content that incorporates the Storm Software brand in anyway, please take a quick look at our [**brand guidelines**](https://github.com/storm-software/media-kit).
|
|
286
282
|
|
|
287
283
|
<br />
|
|
288
284
|
|
|
289
285
|
<div align="center"><a href="https://stormsoftware.com" target="_blank"><img src="https://public.storm-cdn.com/storm-software/icon-circle-fill-dark.png" alt="Storm Software" width="200px"/></a></div>
|
|
290
286
|
<br />
|
|
291
|
-
<div align="center"><a href="https://stormsoftware.com" target="_blank"><img src="https://public.storm-cdn.com/visit-us-
|
|
292
|
-
|
|
293
|
-
<br />
|
|
287
|
+
<div align="center"><a href="https://stormsoftware.com" target="_blank"><picture><source media="(prefers-color-scheme: dark)" srcset="https://public.storm-cdn.com/misc/text/visit-us-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://public.storm-cdn.com/misc/text/visit-us-light.png"><img src="https://public.storm-cdn.com/misc/text/visit-us-dark.png" height="90px" alt="Visit us at stormsoftware.com" /></picture></a></div>
|
|
294
288
|
|
|
295
289
|
<div align="right">[ <a href="#table-of-contents">Back to top ▲</a> ]</div>
|
|
296
290
|
<br />
|
|
@@ -2,6 +2,7 @@ import { EngineExecutionOptions } from "../types/config.cjs";
|
|
|
2
2
|
import { EngineContext } from "../types/context.cjs";
|
|
3
3
|
import { ExecutionApiWorkerInterface } from "../types/api.cjs";
|
|
4
4
|
import { InlineConfig, Mode } from "@powerlines/core";
|
|
5
|
+
import { PartialKeys } from "@stryke/types/base";
|
|
5
6
|
|
|
6
7
|
//#region src/_internal/execution-api-worker.d.ts
|
|
7
8
|
declare const RESTARTED: unique symbol;
|
|
@@ -50,14 +51,14 @@ declare class ExecutionApiWorker implements ExecutionApiWorkerInterface {
|
|
|
50
51
|
* @param options - The options for the worker, including exposed commands, timeout, and hooks for activity and restart.
|
|
51
52
|
*/
|
|
52
53
|
protected constructor(executionApiPath: string, options: ExecutionApiWorkerOptions);
|
|
53
|
-
execute(command: string, options: Omit<EngineExecutionOptions, "channel">, inlineConfig: InlineConfig): Promise<void>;
|
|
54
|
+
execute(command: string, options: Omit<EngineExecutionOptions, "channel">, inlineConfig: PartialKeys<InlineConfig, "command">): Promise<void>;
|
|
54
55
|
/**
|
|
55
56
|
* Closes the worker process, terminating it if it's still running. This method should be called when the worker is no longer needed, to free up system resources and ensure a clean shutdown. If the worker has already been terminated, this method will have no effect.
|
|
56
57
|
*/
|
|
57
58
|
finalize(): Promise<void>;
|
|
58
59
|
protected onHanging(): void;
|
|
59
60
|
protected onActivity(): void;
|
|
60
|
-
protected innerExecute(command: string, options: Omit<EngineExecutionOptions, "channel">, inlineConfig: InlineConfig): Promise<void>;
|
|
61
|
+
protected innerExecute(command: string, options: Omit<EngineExecutionOptions, "channel">, inlineConfig: PartialKeys<InlineConfig, "command">): Promise<void>;
|
|
61
62
|
}
|
|
62
63
|
//#endregion
|
|
63
64
|
export { ExecutionApiWorker };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-api-worker.d.cts","names":[],"sources":["../../src/_internal/execution-api-worker.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"execution-api-worker.d.cts","names":[],"sources":["../../src/_internal/execution-api-worker.ts"],"mappings":";;;;;;;cAyCM,SAAA;AAAA,UA8DW,yBAAA;EA9DX;;;;AAAiD;EA8ErD,OAAA;EAhBwC;;;EAqBxC,cAAA;EAAA;;;EAKA,IAAA,GAAO,IAAA;EAUP;;;EALA,IAAA;EAQW;;;EAHX,OAAA,EAAS,aAAa;AAAA;AAAA,cAGX,kBAAA,YAA8B,2BAAA;EAAA;YAsE7B,gBAAA;EAAA,UACA,OAAA,EAAS,yBAAA;EAAA,cAxDP,cAAA,IAAc,OAAA,QAAA,SAAA;EAAA,UASlB,qBAAA;EAuWC;;;;;;;EAAA,OAxVS,IAAA,CAClB,OAAA,UACA,OAAA,EAAS,yBAAA,GAAyB,OAAA,CAAA,kBAAA;EAqapB;;;;;;EAAA,UAzYP,WAAA,CACG,gBAAA,UACA,OAAA,EAAS,yBAAA;EAsTR,OAAA,CACX,OAAA,UACA,OAAA,EAAS,IAAA,CAAK,sBAAA,cACd,YAAA,EAAc,WAAA,CAAY,YAAA,eAAwB,OAAA;EAzTxC;;;EA4VC,QAAA,IAAY,OAAA;EAAA,UAUf,SAAA;EAAA,UAoBA,UAAA;EAAA,UAUM,YAAA,CACd,OAAA,UACA,OAAA,EAAS,IAAA,CAAK,sBAAA,cACd,YAAA,EAAc,WAAA,CAAY,YAAA,eAAwB,OAAA;AAAA"}
|
|
@@ -2,6 +2,7 @@ import { EngineExecutionOptions } from "../types/config.mjs";
|
|
|
2
2
|
import { EngineContext } from "../types/context.mjs";
|
|
3
3
|
import { ExecutionApiWorkerInterface } from "../types/api.mjs";
|
|
4
4
|
import { InlineConfig, Mode } from "@powerlines/core";
|
|
5
|
+
import { PartialKeys } from "@stryke/types/base";
|
|
5
6
|
|
|
6
7
|
//#region src/_internal/execution-api-worker.d.ts
|
|
7
8
|
declare const RESTARTED: unique symbol;
|
|
@@ -50,14 +51,14 @@ declare class ExecutionApiWorker implements ExecutionApiWorkerInterface {
|
|
|
50
51
|
* @param options - The options for the worker, including exposed commands, timeout, and hooks for activity and restart.
|
|
51
52
|
*/
|
|
52
53
|
protected constructor(executionApiPath: string, options: ExecutionApiWorkerOptions);
|
|
53
|
-
execute(command: string, options: Omit<EngineExecutionOptions, "channel">, inlineConfig: InlineConfig): Promise<void>;
|
|
54
|
+
execute(command: string, options: Omit<EngineExecutionOptions, "channel">, inlineConfig: PartialKeys<InlineConfig, "command">): Promise<void>;
|
|
54
55
|
/**
|
|
55
56
|
* Closes the worker process, terminating it if it's still running. This method should be called when the worker is no longer needed, to free up system resources and ensure a clean shutdown. If the worker has already been terminated, this method will have no effect.
|
|
56
57
|
*/
|
|
57
58
|
finalize(): Promise<void>;
|
|
58
59
|
protected onHanging(): void;
|
|
59
60
|
protected onActivity(): void;
|
|
60
|
-
protected innerExecute(command: string, options: Omit<EngineExecutionOptions, "channel">, inlineConfig: InlineConfig): Promise<void>;
|
|
61
|
+
protected innerExecute(command: string, options: Omit<EngineExecutionOptions, "channel">, inlineConfig: PartialKeys<InlineConfig, "command">): Promise<void>;
|
|
61
62
|
}
|
|
62
63
|
//#endregion
|
|
63
64
|
export { ExecutionApiWorker };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-api-worker.d.mts","names":[],"sources":["../../src/_internal/execution-api-worker.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"execution-api-worker.d.mts","names":[],"sources":["../../src/_internal/execution-api-worker.ts"],"mappings":";;;;;;;cAyCM,SAAA;AAAA,UA8DW,yBAAA;EA9DX;;;;AAAiD;EA8ErD,OAAA;EAhBwC;;;EAqBxC,cAAA;EAAA;;;EAKA,IAAA,GAAO,IAAA;EAUP;;;EALA,IAAA;EAQW;;;EAHX,OAAA,EAAS,aAAa;AAAA;AAAA,cAGX,kBAAA,YAA8B,2BAAA;EAAA;YAsE7B,gBAAA;EAAA,UACA,OAAA,EAAS,yBAAA;EAAA,cAxDP,cAAA,IAAc,OAAA,QAAA,SAAA;EAAA,UASlB,qBAAA;EAuWC;;;;;;;EAAA,OAxVS,IAAA,CAClB,OAAA,UACA,OAAA,EAAS,yBAAA,GAAyB,OAAA,CAAA,kBAAA;EAqapB;;;;;;EAAA,UAzYP,WAAA,CACG,gBAAA,UACA,OAAA,EAAS,yBAAA;EAsTR,OAAA,CACX,OAAA,UACA,OAAA,EAAS,IAAA,CAAK,sBAAA,cACd,YAAA,EAAc,WAAA,CAAY,YAAA,eAAwB,OAAA;EAzTxC;;;EA4VC,QAAA,IAAY,OAAA;EAAA,UAUf,SAAA;EAAA,UAoBA,UAAA;EAAA,UAUM,YAAA,CACd,OAAA,UACA,OAAA,EAAS,IAAA,CAAK,sBAAA,cACd,YAAA,EAAc,WAAA,CAAY,YAAA,eAAwB,OAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-api-worker.mjs","names":["#restartPromise","#resolveRestartPromise","#logger","#worker","#createWorker","#activeTasks","#hangingTimer"],"sources":["../../src/_internal/execution-api-worker.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport type { InlineConfig, Logger, Mode } from \"@powerlines/core\";\nimport { getDefaultMode } from \"@powerlines/core/lib/config\";\nimport { isDebug } from \"@stryke/env/environment-checks\";\nimport { resolve } from \"@stryke/fs/resolve\";\nimport { appendPath } from \"@stryke/path/append\";\nimport { isNumber } from \"@stryke/type-checks/is-number\";\nimport { isSet } from \"@stryke/type-checks/is-set\";\nimport { isSetString } from \"@stryke/type-checks/is-set-string\";\nimport { isString } from \"@stryke/type-checks/is-string\";\nimport { formatDuration } from \"date-fns/formatDuration\";\nimport { pipeline } from \"node:stream\";\nimport { parseArgs } from \"node:util\";\nimport {\n MessageChannel,\n StructuredSerializeOptions\n} from \"node:worker_threads\";\nimport Tinypool from \"tinypool\";\nimport { MessagePortDuplex } from \"../helpers/stream\";\nimport { ExecutionApiWorkerInterface } from \"../types\";\nimport { EngineExecutionOptions } from \"../types/config\";\nimport { EngineContext } from \"../types/context\";\n\nconst RESTARTED = Symbol(\"powerlines-worker:restarted\");\n\n/**\n * The debug address is in the form of `[host:]port`. The host is optional.\n */\ninterface DebugAddress {\n host?: string;\n port: number;\n}\n\n/**\n * Formats the debug address into a string.\n */\nconst formatDebugAddress = ({ host, port }: DebugAddress): string => {\n return host ? `${host}:${port}` : `${port}`;\n};\n\nexport type NodeOptions = Record<string, string | boolean | undefined>;\n\n/**\n * Get's the debug address from the `NODE_OPTIONS` environment variable. If the\n * address is not found, it returns the default host (`undefined`) and port\n * (`9229`).\n *\n * @returns An object with the host and port of the debug address.\n */\nconst getParsedDebugAddress = (\n address: string | boolean | undefined\n): DebugAddress => {\n if (!address || !isString(address)) {\n return { host: undefined, port: 9229 };\n }\n\n // The address is in the form of `[host:]port`. Let's parse the address.\n if (address.includes(\":\")) {\n const [host, port] = address.split(\":\");\n if (!host || !port) {\n throw new Error(`Invalid debug address: ${address}`);\n }\n\n return { host, port: Number.parseInt(port, 10) };\n }\n\n return { host: undefined, port: Number.parseInt(address, 10) };\n};\n\ntype NodeInspectType = \"inspect\" | \"inspect-brk\" | undefined;\n\n/**\n * Get the debug type from the `NODE_OPTIONS` environment variable.\n */\nfunction getNodeDebugType(nodeOptions: NodeOptions): NodeInspectType {\n if (nodeOptions.inspect) {\n return \"inspect\";\n }\n if (nodeOptions[\"inspect-brk\"] || nodeOptions.inspect_brk) {\n return \"inspect-brk\";\n }\n\n return undefined;\n}\n\nexport interface ExecutionApiWorkerOptions {\n // /**\n // * `-1` if not inspectable\n // */\n // debuggerPortOffset?: number;\n\n // /**\n // * Whether to enable source maps support in the worker, which can improve the quality of stack traces at the cost of increased memory usage and slower performance. Defaults to `false`.\n // */\n // enableSourceMaps?: boolean;\n\n /**\n * The maximum time in milliseconds a worker can run before being terminated.\n *\n * @defaultValue 900000 (15 minutes)\n */\n timeout?: number;\n\n /**\n * True if `--max-old-space-size` should not be forwarded to the worker.\n */\n isolatedMemory?: boolean;\n\n /**\n * The mode to run the worker in, which can affect how the worker is initialized and how it behaves. This is determined based on the resolved configuration of the engine, and can be used to optimize the worker for different environments (e.g., development, production, etc.).\n */\n mode?: Mode;\n\n /**\n * An optional root to resolve the execution host path from, which can be used to specify a custom root directory for the worker to use when resolving paths and loading configuration files. If this option is not provided, the worker will use the current working directory as the root directory by default.\n */\n root?: string;\n\n /**\n * The context of the {@link @powerlines/engine#Engine | Engine instance}, which can be used to access the engine's state and services within the worker.\n */\n context: EngineContext;\n}\n\nexport class ExecutionApiWorker implements ExecutionApiWorkerInterface {\n #worker: Tinypool | undefined;\n\n #logger: Logger;\n\n #activeTasks = 0;\n\n #restartPromise: Promise<typeof RESTARTED> | null = null;\n\n #resolveRestartPromise: ((arg: typeof RESTARTED) => void) | null = null;\n\n #hangingTimer: NodeJS.Timeout | false = false;\n\n #createWorker: () => void;\n\n protected get restartPromise() {\n if (!this.#restartPromise) {\n this.#restartPromise = new Promise(resolve => {\n this.#resolveRestartPromise = resolve;\n });\n }\n return this.#restartPromise;\n }\n\n protected resolveRestartPromise() {\n if (this.#resolveRestartPromise) {\n this.#resolveRestartPromise(RESTARTED);\n this.#restartPromise = null;\n this.#resolveRestartPromise = null;\n }\n }\n\n /**\n * Creates a new instance of the Execution API Worker class, which manages a worker process for executing tasks related to the Powerlines Engine. The worker is initialized with the specified options and can be used to run tasks in an isolated environment, with support for automatic restarts and activity monitoring.\n *\n * @param apiPath - The path to the Execution API file.\n * @param options - The options for configuring the worker, including the execution context, exposed methods, timeout, and mode.\n * @returns A promise that resolves to an instance of the ExecutionApiWorker class.\n */\n public static async from(\n apiPath: string,\n options: ExecutionApiWorkerOptions\n ) {\n const mode = await getDefaultMode(options.context.cwd);\n\n const resolvedPath = await resolve(apiPath, {\n paths: [\n options.context.cwd,\n options.root ? appendPath(options.root, options.context.cwd) : undefined\n ].filter(Boolean) as string[]\n });\n if (!resolvedPath) {\n throw new Error(\n `Could not resolve the provided Execution API path: \\`${apiPath}\\`.`\n );\n }\n\n return new ExecutionApiWorker(resolvedPath, {\n mode,\n ...options\n });\n }\n\n /**\n * Create a new API worker instance.\n *\n * @param executionApiPath - The path to the worker file.\n * @param options - The options for the worker, including exposed commands, timeout, and hooks for activity and restart.\n */\n protected constructor(\n protected executionApiPath: string,\n protected options: ExecutionApiWorkerOptions\n ) {\n const {\n isolatedMemory = false,\n mode = \"production\",\n context\n } = this.options;\n\n this.options.timeout ??= 900_000;\n\n this.#logger = context.extendLogger({ category: \"communication\" });\n this.#worker = undefined;\n\n // ensure we end workers if they weren't before exit\n process.on(\"exit\", () => {\n void this.finalize();\n });\n\n let nodeOptions = {} as {\n [longOption: string]: string | boolean | undefined;\n };\n\n const args: string[] = [...process.execArgv];\n if (process.env.NODE_OPTIONS) {\n let isInString = false;\n let willStartNewArg = true;\n\n const stringifiedNodeOptions = process.env.NODE_OPTIONS.split(\" \").filter(\n part =>\n ((part.startsWith('\"') && part.endsWith('\"')) ||\n (part.startsWith(\"'\") && part.endsWith(\"'\"))) &&\n part\n .replace(/^['\"]|['\"]$/g, \"\")\n .split(\" \")\n .filter(isSetString).length > 0 &&\n part\n .replace(/^['\"]|['\"]$/g, \"\")\n .split(\" \")\n .filter(isSetString)\n .every(p => p.startsWith(\"--\"))\n );\n args.push(\n ...stringifiedNodeOptions.map(part => part.replace(/^['\"]|['\"]$/g, \"\"))\n );\n\n const inputNodeModules = stringifiedNodeOptions.reduce((acc, part) => {\n return acc.replace(part, \"\").trim();\n }, process.env.NODE_OPTIONS);\n for (let i = 0; i < inputNodeModules.length; i++) {\n let char = inputNodeModules[i];\n if (char) {\n // Skip any escaped characters in strings.\n if (char === \"\\\\\" && isInString) {\n // Ensure we don't have an escape character at the end.\n if (inputNodeModules.length === i + 1) {\n throw new Error(\"Invalid escape character at the end.\");\n }\n\n // Skip the next character.\n char = inputNodeModules[++i];\n if (!char) {\n continue;\n }\n }\n // If we find a space outside of a string, we should start a new argument.\n else if (char === \" \" && !isInString) {\n willStartNewArg = true;\n continue;\n }\n\n // If we find a quote, we should toggle the string flag.\n else if (char === '\"') {\n isInString = !isInString;\n continue;\n }\n\n // If we're starting a new argument, we should add it to the array.\n if (willStartNewArg) {\n args.push(char);\n willStartNewArg = false;\n }\n // Otherwise, add it to the last argument.\n else {\n args[args.length - 1] += char;\n }\n }\n }\n\n if (isInString) {\n throw new Error(\"Unterminated string\");\n }\n }\n\n if (args.length > 0) {\n const { values, tokens } = parseArgs({\n args,\n strict: false,\n tokens: true\n });\n nodeOptions = values;\n\n // For the `NODE_OPTIONS`, we support arguments with values without the `=`\n // sign. We need to parse them manually.\n let orphan = null;\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n if (!token) continue;\n\n if (token.kind === \"option-terminator\") {\n break;\n }\n\n // When we encounter an option, if it's value is undefined, we should check\n // to see if the following tokens are positional parameters. If they are,\n // then the option is orphaned, and we can assign it.\n if (token.kind === \"option\") {\n orphan = !isSet(token.value) ? token : null;\n continue;\n }\n\n // If the token isn't a positional one, then we can't assign it to the found\n // orphaned option.\n if (token.kind !== \"positional\") {\n orphan = null;\n continue;\n }\n\n // If we don't have an orphan, then we can skip this token.\n if (!orphan) {\n continue;\n }\n\n // If the token is a positional one, and it has a value, so add it to the\n // values object. If it already exists, append it with a space.\n if (orphan.name in nodeOptions && isString(nodeOptions[orphan.name])) {\n nodeOptions[orphan.name] += ` ${token.value}`;\n } else {\n nodeOptions[orphan.name] = token.value;\n }\n }\n }\n\n const originalOptions = { ...nodeOptions };\n\n delete nodeOptions.inspect;\n delete nodeOptions[\"inspect-brk\"];\n delete nodeOptions.inspect_brk;\n\n if (isDebug) {\n const nodeDebugType = getNodeDebugType(originalOptions);\n if (nodeDebugType) {\n const debuggerAddress = getParsedDebugAddress(\n originalOptions[nodeDebugType]\n );\n const address: DebugAddress = {\n host: debuggerAddress.host,\n // current process runs on `address.port`\n port: debuggerAddress.port === 0 ? 0 : debuggerAddress.port + 1 + 1\n };\n nodeOptions[nodeDebugType] = formatDebugAddress(address);\n\n this.#logger.info(\n `Node.js debugger listening on ${nodeOptions[nodeDebugType]}`\n );\n }\n\n nodeOptions[\"enable-source-maps\"] = true;\n }\n\n if (isolatedMemory) {\n delete nodeOptions[\"max-old-space-size\"];\n delete nodeOptions.max_old_space_size;\n }\n\n const execArgv: string[] = [];\n const nodeOptionsParts: string[] = [];\n for (const [key, value] of Object.entries(nodeOptions)) {\n let formatted: string | null = null;\n if (value === true) {\n formatted = `--${key}`;\n } else if (value) {\n formatted = `--${key}=${\n // Values with spaces need to be quoted. We use JSON.stringify to\n // also escape any nested quotes.\n value.includes(\" \") && !value.startsWith('\"')\n ? JSON.stringify(value)\n : value\n }`;\n }\n\n if (formatted === null) {\n continue;\n }\n\n if (\n [\n \"experimental-network-inspection\",\n \"experimental-storage-inspection\",\n \"experimental-worker-inspection\",\n \"experimental-inspector-network-resource\"\n ].includes(key)\n ) {\n execArgv.push(formatted);\n } else {\n nodeOptionsParts.push(formatted);\n }\n }\n\n // // Issue: https://github.com/nodejs/node/issues/59706\n // if (!nodeOptionsParts.includes(\"--no-experimental-strip-types\")) {\n // nodeOptionsParts.push(\"--no-experimental-strip-types\");\n // }\n\n this.#createWorker = () => {\n const env: Record<string, string> = {\n ...process.env,\n NODE_ENV: mode,\n NODE_OPTIONS: nodeOptionsParts.join(\" \"),\n POWERLINES_EXECUTION_WORKER: \"true\"\n };\n\n // Mirror the enablement heuristic from picocolors (see https://github.com/vercel/next.js/blob/6a40da0345939fe4f7b1ae519b296a86dd103432/packages/next/src/lib/picocolors.ts#L21-L24).\n // Picocolors snapshots `process.env`/`stdout.isTTY` at module load time, so when the worker\n // process bootstraps with piped stdio its own check would disable colors. Re-evaluating the\n // same conditions here lets us opt the worker into color output only when the parent would\n // have seen colors, while still respecting explicit opt-outs like NO_COLOR.\n if (\n env.FORCE_COLOR === undefined &&\n !env.NO_COLOR &&\n !env.CI &&\n env.TERM !== \"dumb\" &&\n (process.stdout.isTTY || process.stderr?.isTTY)\n ) {\n env.FORCE_COLOR = \"1\";\n }\n\n this.#logger.debug(\n `Creating worker from file ${\n executionApiPath\n } with execution arguments: ${JSON.stringify(execArgv, null, 2)}`\n );\n\n this.#worker = new Tinypool({\n terminateTimeout: 5000,\n filename: executionApiPath,\n execArgv,\n env\n });\n\n this.#restartPromise = new Promise(resolve => {\n this.#resolveRestartPromise = resolve;\n });\n\n this.#worker.on(\"exit\", (code, signal) => {\n this.#logger.debug(\n `Worker process exited with code ${code} and signal ${signal}`\n );\n\n if ((code || (signal && signal !== \"SIGINT\")) && this.#worker) {\n const error = new Error(\n `Execution Host Worker exited unexpectedly with code ${\n code\n } and signal ${signal}`\n );\n this.#logger.error(error);\n\n void this.finalize().then(() => {\n throw error;\n });\n }\n });\n\n this.#worker.on(\"error\", error => {\n this.#logger.error({\n meta: { category: \"communication\" },\n message: `Worker process emitted an error: ${error.message}`,\n error\n });\n });\n\n // if a child process emits a particular message, we track that as activity\n // so the parent process can keep track of progress\n this.#worker.on(\"message\", data => {\n this.onActivity();\n\n if (Array.isArray(data) && data.length > 1 && isNumber(data[0])) {\n if (data[0] === 0) {\n this.#logger.trace(\n `Received message from worker: ${JSON.stringify(data.slice(1), null, 2)}`\n );\n } else {\n this.#logger.debug(\n `Received error message from worker: ${JSON.stringify(\n data.slice(1),\n null,\n 2\n )}`\n );\n }\n }\n\n this.#logger.trace(\n `Received message from worker: ${JSON.stringify(data, null, 2)}`\n );\n });\n };\n\n this.#createWorker();\n }\n\n public async execute(\n command: string,\n options: Omit<EngineExecutionOptions, \"channel\">,\n inlineConfig: InlineConfig\n ) {\n if (this.options.timeout) {\n this.#activeTasks++;\n try {\n let attempts = 0;\n for (;;) {\n this.onActivity();\n\n const result = await Promise.race([\n this.innerExecute(command, options, inlineConfig),\n this.#restartPromise\n ]);\n if (result !== RESTARTED) {\n return;\n }\n\n this.#logger.warn(\n `Execution Host Worker was restarted while calling method \"${\n command\n }\" (attempt ${attempts++}). Retrying the call...`\n );\n }\n } finally {\n this.#activeTasks--;\n this.onActivity();\n }\n } else {\n await this.innerExecute(command, options, inlineConfig);\n }\n }\n\n /**\n * Closes the worker process, terminating it if it's still running. This method should be called when the worker is no longer needed, to free up system resources and ensure a clean shutdown. If the worker has already been terminated, this method will have no effect.\n */\n public async finalize(): Promise<void> {\n const worker = this.#worker;\n if (!worker) {\n return;\n }\n\n await worker.destroy();\n this.#worker = undefined;\n }\n\n protected onHanging() {\n if (!this.#worker) {\n return;\n }\n\n this.#createWorker();\n\n this.#logger.warn(\n `Sending SIGTERM signal to worker due to timeout${\n this.options.timeout\n ? ` of ${formatDuration({ seconds: this.options.timeout / 1000 })}`\n : \"\"\n }. Subsequent errors may be a result of the worker exiting.`\n );\n\n void this.finalize().then(() => {\n this.#resolveRestartPromise?.(RESTARTED);\n });\n }\n\n protected onActivity() {\n if (this.#hangingTimer) {\n clearTimeout(this.#hangingTimer);\n }\n\n this.#hangingTimer =\n this.#activeTasks > 0 &&\n setTimeout(() => this.onHanging(), this.options.timeout);\n }\n\n protected async innerExecute(\n command: string,\n options: Omit<EngineExecutionOptions, \"channel\">,\n inlineConfig: InlineConfig\n ) {\n if (!this.#worker) {\n throw new Error(\"Execution Host Worker is not initialized\");\n }\n\n const { port1, port2 } = new MessageChannel();\n const promise = this.#worker.run(\n { command, options: { ...options, channel: port2 }, inlineConfig },\n {\n transferList: [port2] as StructuredSerializeOptions\n }\n );\n\n let aborted = false;\n const onActivityAbort = () => {\n if (!aborted) {\n aborted = true;\n }\n };\n const duplex = new MessagePortDuplex(port1, { onActivityAbort });\n\n pipeline(duplex, process.stdout, (err: NodeJS.ErrnoException | null) => {\n if (err) {\n this.#logger.debug(\n `Received exception message from worker: ${JSON.stringify(\n err,\n null,\n 2\n )}`\n );\n\n throw err;\n }\n });\n\n await promise;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"execution-api-worker.mjs","names":["#restartPromise","#resolveRestartPromise","#logger","#worker","#createWorker","#activeTasks","#hangingTimer"],"sources":["../../src/_internal/execution-api-worker.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport type { InlineConfig, Logger, Mode } from \"@powerlines/core\";\nimport { getDefaultMode } from \"@powerlines/core/lib/config\";\nimport { isDebug } from \"@stryke/env/environment-checks\";\nimport { resolve } from \"@stryke/fs/resolve\";\nimport { appendPath } from \"@stryke/path/append\";\nimport { isNumber } from \"@stryke/type-checks/is-number\";\nimport { isSet } from \"@stryke/type-checks/is-set\";\nimport { isSetString } from \"@stryke/type-checks/is-set-string\";\nimport { isString } from \"@stryke/type-checks/is-string\";\nimport { PartialKeys } from \"@stryke/types/base\";\nimport { formatDuration } from \"date-fns/formatDuration\";\nimport { pipeline } from \"node:stream\";\nimport { parseArgs } from \"node:util\";\nimport {\n MessageChannel,\n StructuredSerializeOptions\n} from \"node:worker_threads\";\nimport Tinypool from \"tinypool\";\nimport { MessagePortDuplex } from \"../helpers/stream\";\nimport { ExecutionApiWorkerInterface } from \"../types\";\nimport { EngineExecutionOptions } from \"../types/config\";\nimport { EngineContext } from \"../types/context\";\n\nconst RESTARTED = Symbol(\"powerlines-worker:restarted\");\n\n/**\n * The debug address is in the form of `[host:]port`. The host is optional.\n */\ninterface DebugAddress {\n host?: string;\n port: number;\n}\n\n/**\n * Formats the debug address into a string.\n */\nconst formatDebugAddress = ({ host, port }: DebugAddress): string => {\n return host ? `${host}:${port}` : `${port}`;\n};\n\nexport type NodeOptions = Record<string, string | boolean | undefined>;\n\n/**\n * Get's the debug address from the `NODE_OPTIONS` environment variable. If the\n * address is not found, it returns the default host (`undefined`) and port\n * (`9229`).\n *\n * @returns An object with the host and port of the debug address.\n */\nconst getParsedDebugAddress = (\n address: string | boolean | undefined\n): DebugAddress => {\n if (!address || !isString(address)) {\n return { host: undefined, port: 9229 };\n }\n\n // The address is in the form of `[host:]port`. Let's parse the address.\n if (address.includes(\":\")) {\n const [host, port] = address.split(\":\");\n if (!host || !port) {\n throw new Error(`Invalid debug address: ${address}`);\n }\n\n return { host, port: Number.parseInt(port, 10) };\n }\n\n return { host: undefined, port: Number.parseInt(address, 10) };\n};\n\ntype NodeInspectType = \"inspect\" | \"inspect-brk\" | undefined;\n\n/**\n * Get the debug type from the `NODE_OPTIONS` environment variable.\n */\nfunction getNodeDebugType(nodeOptions: NodeOptions): NodeInspectType {\n if (nodeOptions.inspect) {\n return \"inspect\";\n }\n if (nodeOptions[\"inspect-brk\"] || nodeOptions.inspect_brk) {\n return \"inspect-brk\";\n }\n\n return undefined;\n}\n\nexport interface ExecutionApiWorkerOptions {\n // /**\n // * `-1` if not inspectable\n // */\n // debuggerPortOffset?: number;\n\n // /**\n // * Whether to enable source maps support in the worker, which can improve the quality of stack traces at the cost of increased memory usage and slower performance. Defaults to `false`.\n // */\n // enableSourceMaps?: boolean;\n\n /**\n * The maximum time in milliseconds a worker can run before being terminated.\n *\n * @defaultValue 900000 (15 minutes)\n */\n timeout?: number;\n\n /**\n * True if `--max-old-space-size` should not be forwarded to the worker.\n */\n isolatedMemory?: boolean;\n\n /**\n * The mode to run the worker in, which can affect how the worker is initialized and how it behaves. This is determined based on the resolved configuration of the engine, and can be used to optimize the worker for different environments (e.g., development, production, etc.).\n */\n mode?: Mode;\n\n /**\n * An optional root to resolve the execution host path from, which can be used to specify a custom root directory for the worker to use when resolving paths and loading configuration files. If this option is not provided, the worker will use the current working directory as the root directory by default.\n */\n root?: string;\n\n /**\n * The context of the {@link @powerlines/engine#Engine | Engine instance}, which can be used to access the engine's state and services within the worker.\n */\n context: EngineContext;\n}\n\nexport class ExecutionApiWorker implements ExecutionApiWorkerInterface {\n #worker: Tinypool | undefined;\n\n #logger: Logger;\n\n #activeTasks = 0;\n\n #restartPromise: Promise<typeof RESTARTED> | null = null;\n\n #resolveRestartPromise: ((arg: typeof RESTARTED) => void) | null = null;\n\n #hangingTimer: NodeJS.Timeout | false = false;\n\n #createWorker: () => void;\n\n protected get restartPromise() {\n if (!this.#restartPromise) {\n this.#restartPromise = new Promise(resolve => {\n this.#resolveRestartPromise = resolve;\n });\n }\n return this.#restartPromise;\n }\n\n protected resolveRestartPromise() {\n if (this.#resolveRestartPromise) {\n this.#resolveRestartPromise(RESTARTED);\n this.#restartPromise = null;\n this.#resolveRestartPromise = null;\n }\n }\n\n /**\n * Creates a new instance of the Execution API Worker class, which manages a worker process for executing tasks related to the Powerlines Engine. The worker is initialized with the specified options and can be used to run tasks in an isolated environment, with support for automatic restarts and activity monitoring.\n *\n * @param apiPath - The path to the Execution API file.\n * @param options - The options for configuring the worker, including the execution context, exposed methods, timeout, and mode.\n * @returns A promise that resolves to an instance of the ExecutionApiWorker class.\n */\n public static async from(\n apiPath: string,\n options: ExecutionApiWorkerOptions\n ) {\n const mode = await getDefaultMode(options.context.cwd);\n\n const resolvedPath = await resolve(apiPath, {\n paths: [\n options.context.cwd,\n options.root ? appendPath(options.root, options.context.cwd) : undefined\n ].filter(Boolean) as string[]\n });\n if (!resolvedPath) {\n throw new Error(\n `Could not resolve the provided Execution API path: \\`${apiPath}\\`.`\n );\n }\n\n return new ExecutionApiWorker(resolvedPath, {\n mode,\n ...options\n });\n }\n\n /**\n * Create a new API worker instance.\n *\n * @param executionApiPath - The path to the worker file.\n * @param options - The options for the worker, including exposed commands, timeout, and hooks for activity and restart.\n */\n protected constructor(\n protected executionApiPath: string,\n protected options: ExecutionApiWorkerOptions\n ) {\n const {\n isolatedMemory = false,\n mode = \"production\",\n context\n } = this.options;\n\n this.options.timeout ??= 900_000;\n\n this.#logger = context.extendLogger({ category: \"communication\" });\n this.#worker = undefined;\n\n // ensure we end workers if they weren't before exit\n process.on(\"exit\", () => {\n void this.finalize();\n });\n\n let nodeOptions = {} as {\n [longOption: string]: string | boolean | undefined;\n };\n\n const args: string[] = [...process.execArgv];\n if (process.env.NODE_OPTIONS) {\n let isInString = false;\n let willStartNewArg = true;\n\n const stringifiedNodeOptions = process.env.NODE_OPTIONS.split(\" \").filter(\n part =>\n ((part.startsWith('\"') && part.endsWith('\"')) ||\n (part.startsWith(\"'\") && part.endsWith(\"'\"))) &&\n part\n .replace(/^['\"]|['\"]$/g, \"\")\n .split(\" \")\n .filter(isSetString).length > 0 &&\n part\n .replace(/^['\"]|['\"]$/g, \"\")\n .split(\" \")\n .filter(isSetString)\n .every(p => p.startsWith(\"--\"))\n );\n args.push(\n ...stringifiedNodeOptions.map(part => part.replace(/^['\"]|['\"]$/g, \"\"))\n );\n\n const inputNodeModules = stringifiedNodeOptions.reduce((acc, part) => {\n return acc.replace(part, \"\").trim();\n }, process.env.NODE_OPTIONS);\n for (let i = 0; i < inputNodeModules.length; i++) {\n let char = inputNodeModules[i];\n if (char) {\n // Skip any escaped characters in strings.\n if (char === \"\\\\\" && isInString) {\n // Ensure we don't have an escape character at the end.\n if (inputNodeModules.length === i + 1) {\n throw new Error(\"Invalid escape character at the end.\");\n }\n\n // Skip the next character.\n char = inputNodeModules[++i];\n if (!char) {\n continue;\n }\n }\n // If we find a space outside of a string, we should start a new argument.\n else if (char === \" \" && !isInString) {\n willStartNewArg = true;\n continue;\n }\n\n // If we find a quote, we should toggle the string flag.\n else if (char === '\"') {\n isInString = !isInString;\n continue;\n }\n\n // If we're starting a new argument, we should add it to the array.\n if (willStartNewArg) {\n args.push(char);\n willStartNewArg = false;\n }\n // Otherwise, add it to the last argument.\n else {\n args[args.length - 1] += char;\n }\n }\n }\n\n if (isInString) {\n throw new Error(\"Unterminated string\");\n }\n }\n\n if (args.length > 0) {\n const { values, tokens } = parseArgs({\n args,\n strict: false,\n tokens: true\n });\n nodeOptions = values;\n\n // For the `NODE_OPTIONS`, we support arguments with values without the `=`\n // sign. We need to parse them manually.\n let orphan = null;\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n if (!token) continue;\n\n if (token.kind === \"option-terminator\") {\n break;\n }\n\n // When we encounter an option, if it's value is undefined, we should check\n // to see if the following tokens are positional parameters. If they are,\n // then the option is orphaned, and we can assign it.\n if (token.kind === \"option\") {\n orphan = !isSet(token.value) ? token : null;\n continue;\n }\n\n // If the token isn't a positional one, then we can't assign it to the found\n // orphaned option.\n if (token.kind !== \"positional\") {\n orphan = null;\n continue;\n }\n\n // If we don't have an orphan, then we can skip this token.\n if (!orphan) {\n continue;\n }\n\n // If the token is a positional one, and it has a value, so add it to the\n // values object. If it already exists, append it with a space.\n if (orphan.name in nodeOptions && isString(nodeOptions[orphan.name])) {\n nodeOptions[orphan.name] += ` ${token.value}`;\n } else {\n nodeOptions[orphan.name] = token.value;\n }\n }\n }\n\n const originalOptions = { ...nodeOptions };\n\n delete nodeOptions.inspect;\n delete nodeOptions[\"inspect-brk\"];\n delete nodeOptions.inspect_brk;\n\n if (isDebug) {\n const nodeDebugType = getNodeDebugType(originalOptions);\n if (nodeDebugType) {\n const debuggerAddress = getParsedDebugAddress(\n originalOptions[nodeDebugType]\n );\n const address: DebugAddress = {\n host: debuggerAddress.host,\n // current process runs on `address.port`\n port: debuggerAddress.port === 0 ? 0 : debuggerAddress.port + 1 + 1\n };\n nodeOptions[nodeDebugType] = formatDebugAddress(address);\n\n this.#logger.info(\n `Node.js debugger listening on ${nodeOptions[nodeDebugType]}`\n );\n }\n\n nodeOptions[\"enable-source-maps\"] = true;\n }\n\n if (isolatedMemory) {\n delete nodeOptions[\"max-old-space-size\"];\n delete nodeOptions.max_old_space_size;\n }\n\n const execArgv: string[] = [];\n const nodeOptionsParts: string[] = [];\n for (const [key, value] of Object.entries(nodeOptions)) {\n let formatted: string | null = null;\n if (value === true) {\n formatted = `--${key}`;\n } else if (value) {\n formatted = `--${key}=${\n // Values with spaces need to be quoted. We use JSON.stringify to\n // also escape any nested quotes.\n value.includes(\" \") && !value.startsWith('\"')\n ? JSON.stringify(value)\n : value\n }`;\n }\n\n if (formatted === null) {\n continue;\n }\n\n if (\n [\n \"experimental-network-inspection\",\n \"experimental-storage-inspection\",\n \"experimental-worker-inspection\",\n \"experimental-inspector-network-resource\"\n ].includes(key)\n ) {\n execArgv.push(formatted);\n } else {\n nodeOptionsParts.push(formatted);\n }\n }\n\n // // Issue: https://github.com/nodejs/node/issues/59706\n // if (!nodeOptionsParts.includes(\"--no-experimental-strip-types\")) {\n // nodeOptionsParts.push(\"--no-experimental-strip-types\");\n // }\n\n this.#createWorker = () => {\n const env: Record<string, string> = {\n ...process.env,\n NODE_ENV: mode,\n NODE_OPTIONS: nodeOptionsParts.join(\" \"),\n POWERLINES_EXECUTION_WORKER: \"true\"\n };\n\n // Mirror the enablement heuristic from picocolors (see https://github.com/vercel/next.js/blob/6a40da0345939fe4f7b1ae519b296a86dd103432/packages/next/src/lib/picocolors.ts#L21-L24).\n // Picocolors snapshots `process.env`/`stdout.isTTY` at module load time, so when the worker\n // process bootstraps with piped stdio its own check would disable colors. Re-evaluating the\n // same conditions here lets us opt the worker into color output only when the parent would\n // have seen colors, while still respecting explicit opt-outs like NO_COLOR.\n if (\n env.FORCE_COLOR === undefined &&\n !env.NO_COLOR &&\n !env.CI &&\n env.TERM !== \"dumb\" &&\n (process.stdout.isTTY || process.stderr?.isTTY)\n ) {\n env.FORCE_COLOR = \"1\";\n }\n\n this.#logger.debug(\n `Creating worker from file ${\n executionApiPath\n } with execution arguments: ${JSON.stringify(execArgv, null, 2)}`\n );\n\n this.#worker = new Tinypool({\n terminateTimeout: 5000,\n filename: executionApiPath,\n execArgv,\n env\n });\n\n this.#restartPromise = new Promise(resolve => {\n this.#resolveRestartPromise = resolve;\n });\n\n this.#worker.on(\"exit\", (code, signal) => {\n this.#logger.debug(\n `Worker process exited with code ${code} and signal ${signal}`\n );\n\n if ((code || (signal && signal !== \"SIGINT\")) && this.#worker) {\n const error = new Error(\n `Execution Host Worker exited unexpectedly with code ${\n code\n } and signal ${signal}`\n );\n this.#logger.error(error);\n\n void this.finalize().then(() => {\n throw error;\n });\n }\n });\n\n this.#worker.on(\"error\", error => {\n this.#logger.error({\n meta: { category: \"communication\" },\n message: `Worker process emitted an error: ${error.message}`,\n error\n });\n });\n\n // if a child process emits a particular message, we track that as activity\n // so the parent process can keep track of progress\n this.#worker.on(\"message\", data => {\n this.onActivity();\n\n if (Array.isArray(data) && data.length > 1 && isNumber(data[0])) {\n if (data[0] === 0) {\n this.#logger.trace(\n `Received message from worker: ${JSON.stringify(data.slice(1), null, 2)}`\n );\n } else {\n this.#logger.debug(\n `Received error message from worker: ${JSON.stringify(\n data.slice(1),\n null,\n 2\n )}`\n );\n }\n }\n\n this.#logger.trace(\n `Received message from worker: ${JSON.stringify(data, null, 2)}`\n );\n });\n };\n\n this.#createWorker();\n }\n\n public async execute(\n command: string,\n options: Omit<EngineExecutionOptions, \"channel\">,\n inlineConfig: PartialKeys<InlineConfig, \"command\">\n ) {\n if (this.options.timeout) {\n this.#activeTasks++;\n try {\n let attempts = 0;\n for (;;) {\n this.onActivity();\n\n const result = await Promise.race([\n this.innerExecute(command, options, inlineConfig),\n this.#restartPromise\n ]);\n if (result !== RESTARTED) {\n return;\n }\n\n this.#logger.warn(\n `Execution Host Worker was restarted while calling method \"${\n command\n }\" (attempt ${attempts++}). Retrying the call...`\n );\n }\n } finally {\n this.#activeTasks--;\n this.onActivity();\n }\n } else {\n await this.innerExecute(command, options, inlineConfig);\n }\n }\n\n /**\n * Closes the worker process, terminating it if it's still running. This method should be called when the worker is no longer needed, to free up system resources and ensure a clean shutdown. If the worker has already been terminated, this method will have no effect.\n */\n public async finalize(): Promise<void> {\n const worker = this.#worker;\n if (!worker) {\n return;\n }\n\n await worker.destroy();\n this.#worker = undefined;\n }\n\n protected onHanging() {\n if (!this.#worker) {\n return;\n }\n\n this.#createWorker();\n\n this.#logger.warn(\n `Sending SIGTERM signal to worker due to timeout${\n this.options.timeout\n ? ` of ${formatDuration({ seconds: this.options.timeout / 1000 })}`\n : \"\"\n }. Subsequent errors may be a result of the worker exiting.`\n );\n\n void this.finalize().then(() => {\n this.#resolveRestartPromise?.(RESTARTED);\n });\n }\n\n protected onActivity() {\n if (this.#hangingTimer) {\n clearTimeout(this.#hangingTimer);\n }\n\n this.#hangingTimer =\n this.#activeTasks > 0 &&\n setTimeout(() => this.onHanging(), this.options.timeout);\n }\n\n protected async innerExecute(\n command: string,\n options: Omit<EngineExecutionOptions, \"channel\">,\n inlineConfig: PartialKeys<InlineConfig, \"command\">\n ) {\n if (!this.#worker) {\n throw new Error(\"Execution Host Worker is not initialized\");\n }\n\n const { port1, port2 } = new MessageChannel();\n const promise = this.#worker.run(\n { command, options: { ...options, channel: port2 }, inlineConfig },\n {\n transferList: [port2] as StructuredSerializeOptions\n }\n );\n\n let aborted = false;\n const onActivityAbort = () => {\n if (!aborted) {\n aborted = true;\n }\n };\n const duplex = new MessagePortDuplex(port1, { onActivityAbort });\n\n pipeline(duplex, process.stdout, (err: NodeJS.ErrnoException | null) => {\n if (err) {\n this.#logger.debug(\n `Received exception message from worker: ${JSON.stringify(\n err,\n null,\n 2\n )}`\n );\n\n throw err;\n }\n });\n\n await promise;\n }\n}\n"],"mappings":"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"}
|
package/dist/api/build.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.mjs","names":[],"sources":["../../src/api/build.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport {\n EnvironmentContext,\n ExecutionContext,\n formatFolder\n} from \"@powerlines/core\";\nimport { executeEnvironments } from \"@powerlines/core/lib/environment\";\nimport { copyFiles } from \"@stryke/fs/copy-file\";\nimport { appendPath } from \"@stryke/path/append\";\nimport { relativePath } from \"@stryke/path/file-path-fns\";\nimport { isParentPath } from \"@stryke/path/is-parent-path\";\nimport { joinPaths } from \"@stryke/path/join-paths\";\nimport { replacePath } from \"@stryke/path/replace\";\nimport chalk from \"chalk\";\nimport { existsSync } from \"node:fs\";\nimport { EngineResolvedConfig } from \"../types/config\";\nimport { EngineSystemContext } from \"../types/context\";\nimport { prepare } from \"./prepare\";\n\nasync function handleBuild<\n TResolvedConfig extends EngineResolvedConfig,\n TSystemContext extends EngineSystemContext\n>(\n context: ExecutionContext<TResolvedConfig, TSystemContext>,\n env: EnvironmentContext<TResolvedConfig, TSystemContext>\n) {\n await context.callHook(\"build\", {\n environment: env,\n order: \"pre\"\n });\n\n env.debug(\n \"Formatting the generated entry files before the build process starts.\"\n );\n await formatFolder(env, env.entryPath);\n\n await context.callHook(\"build\", {\n environment: env,\n order: \"normal\"\n });\n\n if (env.config.output.copy) {\n env.debug(\"Copying project's files from build output directory.\");\n\n const destinationPath = isParentPath(\n appendPath(env.config.output.path, env.config.cwd),\n appendPath(env.config.root, env.config.cwd)\n )\n ? joinPaths(\n env.config.output.copy.path,\n relativePath(\n appendPath(env.config.root, env.config.cwd),\n appendPath(env.config.output.path, env.config.cwd)\n )\n )\n : joinPaths(env.config.output.copy.path, \"dist\");\n const sourcePath = env.config.output.path;\n\n if (existsSync(sourcePath) && sourcePath !== destinationPath) {\n env.debug(\n `Copying files from project's build output directory (${replacePath(\n env.config.output.path,\n env.config.cwd\n )}) to the project's copy/publish directory (${replacePath(\n destinationPath,\n env.config.cwd\n )}).`\n );\n\n await copyFiles(sourcePath, destinationPath);\n } else {\n env.warn(\n `The source path for the copy operation ${\n !existsSync(sourcePath)\n ? \"does not exist\"\n : \"is the same as the destination path\"\n }. Source: ${replacePath(\n sourcePath,\n env.config.cwd\n )}, Destination: ${replacePath(\n destinationPath,\n env.config.cwd\n )}. Skipping copying of build output files.`\n );\n }\n\n if (\n env.config.output.copy.assets &&\n Array.isArray(env.config.output.copy.assets)\n ) {\n await Promise.all(\n env.config.output.copy.assets.map(async asset => {\n env.trace(\n `Copying asset(s): ${chalk.redBright(\n env.config.cwd === asset.input\n ? asset.glob\n : appendPath(\n asset.glob,\n replacePath(asset.input, env.config.cwd)\n )\n )} -> ${chalk.greenBright(\n appendPath(asset.glob, replacePath(asset.output, env.config.cwd))\n )} ${\n Array.isArray(asset.ignore) && asset.ignore.length > 0\n ? ` (ignoring: ${asset.ignore\n .map(i => chalk.yellowBright(i))\n .join(\", \")})`\n : \"\"\n }`\n );\n\n await env.fs.copy(asset, asset.output);\n })\n );\n }\n } else {\n env.debug(\n \"No copy configuration found for the project output. Skipping the copying of build output files.\"\n );\n }\n\n await context.callHook(\"build\", {\n environment: env,\n order: \"post\"\n });\n}\n\n/**\n * Build the project\n *\n * @param context - The execution context for the build process, which provides access to the project configuration, environment, and utility functions for performing the build. The context is used to manage the state and behavior of the build process, allowing for hooks to be called at different stages of the build and for environment-specific configurations to be applied.\n */\nexport async function build<\n TResolvedConfig extends EngineResolvedConfig,\n TSystemContext extends EngineSystemContext\n>(context: ExecutionContext<TResolvedConfig, TSystemContext>) {\n const timer = context.timer(\"Building\");\n\n await context.generateChecksum();\n if (\n context.meta.checksum !== context.persistedMeta?.checksum ||\n context.config.skipCache\n ) {\n context.info(\n !context.persistedMeta?.checksum\n ? \"No previous build cache found. Preparing the project for the initial build.\"\n : context.meta.checksum !== context.persistedMeta.checksum\n ? \"The project has been modified since the last time `prepare` was ran. Re-preparing the project.\"\n : \"The project is configured to skip cache. Re-preparing the project.\"\n );\n\n await prepare<TResolvedConfig, TSystemContext>(context);\n }\n\n if (context.config.singleBuild) {\n await handleBuild<TResolvedConfig, TSystemContext>(\n context,\n await context.toEnvironment()\n );\n } else {\n await executeEnvironments(context, async env => {\n await handleBuild<TResolvedConfig, TSystemContext>(context, env);\n });\n }\n\n timer();\n}\n"],"mappings":";;;;;;;;;;;;;AAoCA,eAAe,YAIb,SACA,KACA;CACA,MAAM,QAAQ,SAAS,SAAS;EAC9B,aAAa;EACb,OAAO;CACT,CAAC;CAED,IAAI,MACF,uEACF;CACA,MAAM,aAAa,KAAK,IAAI,SAAS;CAErC,MAAM,QAAQ,SAAS,SAAS;EAC9B,aAAa;EACb,OAAO;CACT,CAAC;CAED,IAAI,IAAI,OAAO,OAAO,MAAM;EAC1B,IAAI,MAAM,sDAAsD;EAEhE,MAAM,kBAAkB,aACtB,WAAW,IAAI,OAAO,OAAO,MAAM,IAAI,OAAO,GAAG,GACjD,WAAW,IAAI,OAAO,MAAM,IAAI,OAAO,GAAG,CAC5C,IACI,UACE,IAAI,OAAO,OAAO,KAAK,MACvB,aACE,WAAW,IAAI,OAAO,MAAM,IAAI,OAAO,GAAG,GAC1C,WAAW,IAAI,OAAO,OAAO,MAAM,IAAI,OAAO,GAAG,CACnD,CACF,IACA,UAAU,IAAI,OAAO,OAAO,KAAK,MAAM,MAAM;EACjD,MAAM,aAAa,IAAI,OAAO,OAAO;EAErC,IAAI,WAAW,UAAU,KAAK,eAAe,iBAAiB;GAC5D,IAAI,MACF,wDAAwD,YACtD,IAAI,OAAO,OAAO,MAClB,IAAI,OAAO,GACb,EAAE,6CAA6C,YAC7C,iBACA,IAAI,OAAO,GACb,EAAE,GACJ;GAEA,MAAM,UAAU,YAAY,eAAe;EAC7C,OACE,IAAI,KACF,0CACE,CAAC,WAAW,UAAU,IAClB,mBACA,sCACL,YAAY,YACX,YACA,IAAI,OAAO,GACb,EAAE,iBAAiB,YACjB,iBACA,IAAI,OAAO,GACb,EAAE,0CACJ;EAGF,IACE,IAAI,OAAO,OAAO,KAAK,UACvB,MAAM,QAAQ,IAAI,OAAO,OAAO,KAAK,MAAM,GAE3C,MAAM,QAAQ,IACZ,IAAI,OAAO,OAAO,KAAK,OAAO,IAAI,OAAM,UAAS;GAC/C,IAAI,MACF,qBAAqB,MAAM,UACzB,IAAI,OAAO,QAAQ,MAAM,QACrB,MAAM,OACN,WACE,MAAM,MACN,YAAY,MAAM,OAAO,IAAI,OAAO,GAAG,CACzC,CACN,EAAE,MAAM,MAAM,YACZ,WAAW,MAAM,MAAM,YAAY,MAAM,QAAQ,IAAI,OAAO,GAAG,CAAC,CAClE,EAAE,GACA,MAAM,QAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,SAAS,IACjD,eAAe,MAAM,OAClB,KAAI,MAAK,MAAM,aAAa,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"build.mjs","names":[],"sources":["../../src/api/build.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport {\n EnvironmentContext,\n ExecutionContext,\n formatFolder\n} from \"@powerlines/core\";\nimport { executeEnvironments } from \"@powerlines/core/lib/environment\";\nimport { copyFiles } from \"@stryke/fs/copy-file\";\nimport { appendPath } from \"@stryke/path/append\";\nimport { relativePath } from \"@stryke/path/file-path-fns\";\nimport { isParentPath } from \"@stryke/path/is-parent-path\";\nimport { joinPaths } from \"@stryke/path/join-paths\";\nimport { replacePath } from \"@stryke/path/replace\";\nimport chalk from \"chalk\";\nimport { existsSync } from \"node:fs\";\nimport { EngineResolvedConfig } from \"../types/config\";\nimport { EngineSystemContext } from \"../types/context\";\nimport { prepare } from \"./prepare\";\n\nasync function handleBuild<\n TResolvedConfig extends EngineResolvedConfig,\n TSystemContext extends EngineSystemContext\n>(\n context: ExecutionContext<TResolvedConfig, TSystemContext>,\n env: EnvironmentContext<TResolvedConfig, TSystemContext>\n) {\n await context.callHook(\"build\", {\n environment: env,\n order: \"pre\"\n });\n\n env.debug(\n \"Formatting the generated entry files before the build process starts.\"\n );\n await formatFolder(env, env.entryPath);\n\n await context.callHook(\"build\", {\n environment: env,\n order: \"normal\"\n });\n\n if (env.config.output.copy) {\n env.debug(\"Copying project's files from build output directory.\");\n\n const destinationPath = isParentPath(\n appendPath(env.config.output.path, env.config.cwd),\n appendPath(env.config.root, env.config.cwd)\n )\n ? joinPaths(\n env.config.output.copy.path,\n relativePath(\n appendPath(env.config.root, env.config.cwd),\n appendPath(env.config.output.path, env.config.cwd)\n )\n )\n : joinPaths(env.config.output.copy.path, \"dist\");\n const sourcePath = env.config.output.path;\n\n if (existsSync(sourcePath) && sourcePath !== destinationPath) {\n env.debug(\n `Copying files from project's build output directory (${replacePath(\n env.config.output.path,\n env.config.cwd\n )}) to the project's copy/publish directory (${replacePath(\n destinationPath,\n env.config.cwd\n )}).`\n );\n\n await copyFiles(sourcePath, destinationPath);\n } else {\n env.warn(\n `The source path for the copy operation ${\n !existsSync(sourcePath)\n ? \"does not exist\"\n : \"is the same as the destination path\"\n }. Source: ${replacePath(\n sourcePath,\n env.config.cwd\n )}, Destination: ${replacePath(\n destinationPath,\n env.config.cwd\n )}. Skipping copying of build output files.`\n );\n }\n\n if (\n env.config.output.copy.assets &&\n Array.isArray(env.config.output.copy.assets)\n ) {\n await Promise.all(\n env.config.output.copy.assets.map(async asset => {\n env.trace(\n `Copying asset(s): ${chalk.redBright(\n env.config.cwd === asset.input\n ? asset.glob\n : appendPath(\n asset.glob,\n replacePath(asset.input, env.config.cwd)\n )\n )} -> ${chalk.greenBright(\n appendPath(asset.glob, replacePath(asset.output, env.config.cwd))\n )} ${\n Array.isArray(asset.ignore) && asset.ignore.length > 0\n ? ` (ignoring: ${asset.ignore\n .map(i => chalk.yellowBright(i))\n .join(\", \")})`\n : \"\"\n }`\n );\n\n await env.fs.copy(asset, asset.output);\n })\n );\n }\n } else {\n env.debug(\n \"No copy configuration found for the project output. Skipping the copying of build output files.\"\n );\n }\n\n await context.callHook(\"build\", {\n environment: env,\n order: \"post\"\n });\n}\n\n/**\n * Build the project\n *\n * @param context - The execution context for the build process, which provides access to the project configuration, environment, and utility functions for performing the build. The context is used to manage the state and behavior of the build process, allowing for hooks to be called at different stages of the build and for environment-specific configurations to be applied.\n */\nexport async function build<\n TResolvedConfig extends EngineResolvedConfig,\n TSystemContext extends EngineSystemContext\n>(context: ExecutionContext<TResolvedConfig, TSystemContext>) {\n const timer = context.timer(\"Building\");\n\n await context.generateChecksum();\n if (\n context.meta.checksum !== context.persistedMeta?.checksum ||\n context.config.skipCache\n ) {\n context.info(\n !context.persistedMeta?.checksum\n ? \"No previous build cache found. Preparing the project for the initial build.\"\n : context.meta.checksum !== context.persistedMeta.checksum\n ? \"The project has been modified since the last time `prepare` was ran. Re-preparing the project.\"\n : \"The project is configured to skip cache. Re-preparing the project.\"\n );\n\n await prepare<TResolvedConfig, TSystemContext>(context);\n }\n\n if (context.config.singleBuild) {\n await handleBuild<TResolvedConfig, TSystemContext>(\n context,\n await context.toEnvironment()\n );\n } else {\n await executeEnvironments(context, async env => {\n await handleBuild<TResolvedConfig, TSystemContext>(context, env);\n });\n }\n\n timer();\n}\n"],"mappings":";;;;;;;;;;;;;AAoCA,eAAe,YAIb,SACA,KACA;CACA,MAAM,QAAQ,SAAS,SAAS;EAC9B,aAAa;EACb,OAAO;CACT,CAAC;CAED,IAAI,MACF,uEACF;CACA,MAAM,aAAa,KAAK,IAAI,SAAS;CAErC,MAAM,QAAQ,SAAS,SAAS;EAC9B,aAAa;EACb,OAAO;CACT,CAAC;CAED,IAAI,IAAI,OAAO,OAAO,MAAM;EAC1B,IAAI,MAAM,sDAAsD;EAEhE,MAAM,kBAAkB,aACtB,WAAW,IAAI,OAAO,OAAO,MAAM,IAAI,OAAO,GAAG,GACjD,WAAW,IAAI,OAAO,MAAM,IAAI,OAAO,GAAG,CAC5C,IACI,UACE,IAAI,OAAO,OAAO,KAAK,MACvB,aACE,WAAW,IAAI,OAAO,MAAM,IAAI,OAAO,GAAG,GAC1C,WAAW,IAAI,OAAO,OAAO,MAAM,IAAI,OAAO,GAAG,CACnD,CACF,IACA,UAAU,IAAI,OAAO,OAAO,KAAK,MAAM,MAAM;EACjD,MAAM,aAAa,IAAI,OAAO,OAAO;EAErC,IAAI,WAAW,UAAU,KAAK,eAAe,iBAAiB;GAC5D,IAAI,MACF,wDAAwD,YACtD,IAAI,OAAO,OAAO,MAClB,IAAI,OAAO,GACb,EAAE,6CAA6C,YAC7C,iBACA,IAAI,OAAO,GACb,EAAE,GACJ;GAEA,MAAM,UAAU,YAAY,eAAe;EAC7C,OACE,IAAI,KACF,0CACE,CAAC,WAAW,UAAU,IAClB,mBACA,sCACL,YAAY,YACX,YACA,IAAI,OAAO,GACb,EAAE,iBAAiB,YACjB,iBACA,IAAI,OAAO,GACb,EAAE,0CACJ;EAGF,IACE,IAAI,OAAO,OAAO,KAAK,UACvB,MAAM,QAAQ,IAAI,OAAO,OAAO,KAAK,MAAM,GAE3C,MAAM,QAAQ,IACZ,IAAI,OAAO,OAAO,KAAK,OAAO,IAAI,OAAM,UAAS;GAC/C,IAAI,MACF,qBAAqB,MAAM,UACzB,IAAI,OAAO,QAAQ,MAAM,QACrB,MAAM,OACN,WACE,MAAM,MACN,YAAY,MAAM,OAAO,IAAI,OAAO,GAAG,CACzC,CACN,EAAE,MAAM,MAAM,YACZ,WAAW,MAAM,MAAM,YAAY,MAAM,QAAQ,IAAI,OAAO,GAAG,CAAC,CAClE,EAAE,GACA,MAAM,QAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,SAAS,IACjD,eAAe,MAAM,OAClB,KAAI,MAAK,MAAM,aAAa,CAAC,CAAC,CAAC,CAC/B,KAAK,IAAI,EAAE,KACd,IAER;GAEA,MAAM,IAAI,GAAG,KAAK,OAAO,MAAM,MAAM;EACvC,CAAC,CACH;CAEJ,OACE,IAAI,MACF,iGACF;CAGF,MAAM,QAAQ,SAAS,SAAS;EAC9B,aAAa;EACb,OAAO;CACT,CAAC;AACH;;;;;;AAOA,eAAsB,MAGpB,SAA4D;CAC5D,MAAM,QAAQ,QAAQ,MAAM,UAAU;CAEtC,MAAM,QAAQ,iBAAiB;CAC/B,IACE,QAAQ,KAAK,aAAa,QAAQ,eAAe,YACjD,QAAQ,OAAO,WACf;EACA,QAAQ,KACN,CAAC,QAAQ,eAAe,WACpB,gFACA,QAAQ,KAAK,aAAa,QAAQ,cAAc,WAC9C,mGACA,oEACR;EAEA,MAAM,QAAyC,OAAO;CACxD;CAEA,IAAI,QAAQ,OAAO,aACjB,MAAM,YACJ,SACA,MAAM,QAAQ,cAAc,CAC9B;MAEA,MAAM,oBAAoB,SAAS,OAAM,QAAO;EAC9C,MAAM,YAA6C,SAAS,GAAG;CACjE,CAAC;CAGH,MAAM;AACR"}
|
package/dist/api/prepare.cjs
CHANGED
|
@@ -9,6 +9,7 @@ let _powerlines_core_lib_utilities_format = require("@powerlines/core/lib/utilit
|
|
|
9
9
|
let _powerlines_core_plugin_utils = require("@powerlines/core/plugin-utils");
|
|
10
10
|
let _stryke_convert_to_array = require("@stryke/convert/to-array");
|
|
11
11
|
let _stryke_fs_helpers = require("@stryke/fs/helpers");
|
|
12
|
+
let _stryke_string_format_title_case = require("@stryke/string-format/title-case");
|
|
12
13
|
let _stryke_type_checks_is_object = require("@stryke/type-checks/is-object");
|
|
13
14
|
|
|
14
15
|
//#region src/api/prepare.ts
|
|
@@ -32,7 +33,7 @@ async function prepare(context, skipTypes = false) {
|
|
|
32
33
|
});
|
|
33
34
|
if (env.entry.length > 0) {
|
|
34
35
|
const entriesLength = (0, _stryke_type_checks_is_object.isObject)(env.config.input) ? Object.keys(env.config.input).length : (0, _stryke_convert_to_array.toArray)(env.config.input).length;
|
|
35
|
-
env.debug(`The configuration provided ${entriesLength} entry point${entriesLength !== 1 ? "s" : ""}, Powerlines has found ${env.entry.length} entry file${env.entry.length !== 1 ? "s" : ""} for the ${env.config.title} project${env.entry.length > 0 && env.entry.length < 10 ? `: \n${env.entry.map((entry) => `- ${(0, _stryke_path_replace.replacePath)(entry.file, context.config.
|
|
36
|
+
env.debug(`The configuration provided ${entriesLength} entry point${entriesLength !== 1 ? "s" : ""}, ${(0, _stryke_string_format_title_case.titleCase)(env.config.framework?.name) || "Powerlines"} has found ${env.entry.length} entry file${env.entry.length !== 1 ? "s" : ""} for the ${env.config.title} project${env.entry.length > 0 && env.entry.length < 10 ? `: \n${env.entry.map((entry) => `- ${(0, _stryke_path_replace.replacePath)(entry.file, context.config.cwd)}${entry.output ? ` -> ${(0, _stryke_path_replace.replacePath)(entry.output, context.config.cwd)}` : ""}`).join(" \n")}` : ""}`);
|
|
36
37
|
} else env.warn(`No entry files were found for the ${env.config.title} project. Please ensure this is correct. Powerlines plugins generally require at least one entry point to function properly.`);
|
|
37
38
|
await (0, _powerlines_core_lib_typescript_tsconfig.resolveTsconfig)(env);
|
|
38
39
|
await (0, _powerlines_core_lib_install_dependencies.installDependencies)(env);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare.d.cts","names":[],"sources":["../../src/api/prepare.ts"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"prepare.d.cts","names":[],"sources":["../../src/api/prepare.ts"],"mappings":";;;;;;;AA0CA;;;iBAAsB,OAAA,yBACI,oBAAA,yBACD,mBAAA,EAEvB,OAAA,EAAS,gBAAA,CAAiB,eAAA,EAAiB,cAAA,GAC3C,SAAA,aAAiB,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare.d.mts","names":[],"sources":["../../src/api/prepare.ts"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"prepare.d.mts","names":[],"sources":["../../src/api/prepare.ts"],"mappings":";;;;;;;AA0CA;;;iBAAsB,OAAA,yBACI,oBAAA,yBACD,mBAAA,EAEvB,OAAA,EAAS,gBAAA,CAAiB,eAAA,EAAiB,cAAA,GAC3C,SAAA,aAAiB,OAAA"}
|
package/dist/api/prepare.mjs
CHANGED
|
@@ -8,6 +8,7 @@ import { formatFolder } from "@powerlines/core/lib/utilities/format";
|
|
|
8
8
|
import { formatConfig } from "@powerlines/core/plugin-utils";
|
|
9
9
|
import { toArray } from "@stryke/convert/to-array";
|
|
10
10
|
import { createDirectory } from "@stryke/fs/helpers";
|
|
11
|
+
import { titleCase } from "@stryke/string-format/title-case";
|
|
11
12
|
import { isObject } from "@stryke/type-checks/is-object";
|
|
12
13
|
|
|
13
14
|
//#region src/api/prepare.ts
|
|
@@ -31,7 +32,7 @@ async function prepare(context, skipTypes = false) {
|
|
|
31
32
|
});
|
|
32
33
|
if (env.entry.length > 0) {
|
|
33
34
|
const entriesLength = isObject(env.config.input) ? Object.keys(env.config.input).length : toArray(env.config.input).length;
|
|
34
|
-
env.debug(`The configuration provided ${entriesLength} entry point${entriesLength !== 1 ? "s" : ""}, Powerlines has found ${env.entry.length} entry file${env.entry.length !== 1 ? "s" : ""} for the ${env.config.title} project${env.entry.length > 0 && env.entry.length < 10 ? `: \n${env.entry.map((entry) => `- ${replacePath(entry.file, context.config.
|
|
35
|
+
env.debug(`The configuration provided ${entriesLength} entry point${entriesLength !== 1 ? "s" : ""}, ${titleCase(env.config.framework?.name) || "Powerlines"} has found ${env.entry.length} entry file${env.entry.length !== 1 ? "s" : ""} for the ${env.config.title} project${env.entry.length > 0 && env.entry.length < 10 ? `: \n${env.entry.map((entry) => `- ${replacePath(entry.file, context.config.cwd)}${entry.output ? ` -> ${replacePath(entry.output, context.config.cwd)}` : ""}`).join(" \n")}` : ""}`);
|
|
35
36
|
} else env.warn(`No entry files were found for the ${env.config.title} project. Please ensure this is correct. Powerlines plugins generally require at least one entry point to function properly.`);
|
|
36
37
|
await resolveTsconfig(env);
|
|
37
38
|
await installDependencies(env);
|
package/dist/api/prepare.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare.mjs","names":[],"sources":["../../src/api/prepare.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport type { ExecutionContext } from \"@powerlines/core\";\nimport { executeEnvironments } from \"@powerlines/core/lib/environment\";\nimport { handleTypes } from \"@powerlines/core/lib/generate-types\";\nimport { installDependencies } from \"@powerlines/core/lib/install-dependencies\";\nimport { writeMetaFile } from \"@powerlines/core/lib/meta\";\nimport {\n initializeTsconfig,\n resolveTsconfig\n} from \"@powerlines/core/lib/typescript/tsconfig\";\nimport { formatFolder } from \"@powerlines/core/lib/utilities/format\";\nimport { formatConfig } from \"@powerlines/core/plugin-utils\";\nimport { toArray } from \"@stryke/convert/to-array\";\nimport { createDirectory } from \"@stryke/fs/helpers\";\nimport { replacePath } from \"@stryke/path/replace\";\nimport { isObject } from \"@stryke/type-checks/is-object\";\nimport { EngineResolvedConfig } from \"../types/config\";\nimport { EngineSystemContext } from \"../types/context\";\n\n/**\n * Prepare the project\n *\n * @param context - The execution context for the build process, which provides access to the project configuration, environment, and utility functions for performing the build. The context is used to manage the state and behavior of the build process, allowing for hooks to be called at different stages of the build and for environment-specific configurations to be applied.\n */\nexport async function prepare<\n TResolvedConfig extends EngineResolvedConfig,\n TSystemContext extends EngineSystemContext\n>(\n context: ExecutionContext<TResolvedConfig, TSystemContext>,\n skipTypes = false\n) {\n const timer = context.timer(\"Preparation\");\n\n await executeEnvironments(context, async env => {\n env.debug(\n `Initializing the processing options for the Powerlines project.`\n );\n\n await context.callHook(\"configResolved\", {\n environment: env,\n order: \"pre\"\n });\n\n await initializeTsconfig<TResolvedConfig, TSystemContext>(env);\n\n await context.callHook(\"configResolved\", {\n environment: env,\n order: \"normal\"\n });\n\n if (env.entry.length > 0) {\n const entriesLength = isObject(env.config.input)\n ? Object.keys(env.config.input).length\n : toArray(env.config.input).length;\n env.debug(\n `The configuration provided ${entriesLength} entry point${\n entriesLength !== 1 ? \"s\" : \"\"\n }, Powerlines has found ${env.entry.length} entry file${\n env.entry.length !== 1 ? \"s\" : \"\"\n } for the ${env.config.title} project${\n env.entry.length > 0 && env.entry.length < 10\n ? `: \\n${env.entry\n .map(\n entry =>\n `- ${replacePath(entry.file, context.config.
|
|
1
|
+
{"version":3,"file":"prepare.mjs","names":[],"sources":["../../src/api/prepare.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport type { ExecutionContext } from \"@powerlines/core\";\nimport { executeEnvironments } from \"@powerlines/core/lib/environment\";\nimport { handleTypes } from \"@powerlines/core/lib/generate-types\";\nimport { installDependencies } from \"@powerlines/core/lib/install-dependencies\";\nimport { writeMetaFile } from \"@powerlines/core/lib/meta\";\nimport {\n initializeTsconfig,\n resolveTsconfig\n} from \"@powerlines/core/lib/typescript/tsconfig\";\nimport { formatFolder } from \"@powerlines/core/lib/utilities/format\";\nimport { formatConfig } from \"@powerlines/core/plugin-utils\";\nimport { toArray } from \"@stryke/convert/to-array\";\nimport { createDirectory } from \"@stryke/fs/helpers\";\nimport { replacePath } from \"@stryke/path/replace\";\nimport { titleCase } from \"@stryke/string-format/title-case\";\nimport { isObject } from \"@stryke/type-checks/is-object\";\nimport { EngineResolvedConfig } from \"../types/config\";\nimport { EngineSystemContext } from \"../types/context\";\n\n/**\n * Prepare the project\n *\n * @param context - The execution context for the build process, which provides access to the project configuration, environment, and utility functions for performing the build. The context is used to manage the state and behavior of the build process, allowing for hooks to be called at different stages of the build and for environment-specific configurations to be applied.\n */\nexport async function prepare<\n TResolvedConfig extends EngineResolvedConfig,\n TSystemContext extends EngineSystemContext\n>(\n context: ExecutionContext<TResolvedConfig, TSystemContext>,\n skipTypes = false\n) {\n const timer = context.timer(\"Preparation\");\n\n await executeEnvironments(context, async env => {\n env.debug(\n `Initializing the processing options for the Powerlines project.`\n );\n\n await context.callHook(\"configResolved\", {\n environment: env,\n order: \"pre\"\n });\n\n await initializeTsconfig<TResolvedConfig, TSystemContext>(env);\n\n await context.callHook(\"configResolved\", {\n environment: env,\n order: \"normal\"\n });\n\n if (env.entry.length > 0) {\n const entriesLength = isObject(env.config.input)\n ? Object.keys(env.config.input).length\n : toArray(env.config.input).length;\n env.debug(\n `The configuration provided ${entriesLength} entry point${\n entriesLength !== 1 ? \"s\" : \"\"\n }, ${titleCase(env.config.framework?.name) || \"Powerlines\"} has found ${env.entry.length} entry file${\n env.entry.length !== 1 ? \"s\" : \"\"\n } for the ${env.config.title} project${\n env.entry.length > 0 && env.entry.length < 10\n ? `: \\n${env.entry\n .map(\n entry =>\n `- ${replacePath(entry.file, context.config.cwd)}${\n entry.output\n ? ` -> ${replacePath(entry.output, context.config.cwd)}`\n : \"\"\n }`\n )\n .join(\" \\n\")}`\n : \"\"\n }`\n );\n } else {\n env.warn(\n `No entry files were found for the ${\n env.config.title\n } project. Please ensure this is correct. Powerlines plugins generally require at least one entry point to function properly.`\n );\n }\n\n await resolveTsconfig<TResolvedConfig, TSystemContext>(env);\n await installDependencies(env);\n\n await context.callHook(\"configResolved\", {\n environment: env,\n order: \"post\"\n });\n\n env.trace({\n meta: {\n category: \"config\"\n },\n message: `Powerlines configuration after configResolved hook: \\n${formatConfig(\n env.config\n )}`\n });\n\n if (!env.fs.existsSync(env.cachePath)) {\n await createDirectory(env.cachePath);\n }\n\n if (!env.fs.existsSync(env.dataPath)) {\n await createDirectory(env.dataPath);\n }\n\n await context.callHook(\"prepare\", {\n environment: env,\n order: \"pre\"\n });\n await context.callHook(\"prepare\", {\n environment: env,\n order: \"normal\"\n });\n\n await context.callHook(\"prepare\", {\n environment: env,\n order: \"post\"\n });\n\n if (!skipTypes && env.config.output.types !== false) {\n await handleTypes(context, env);\n }\n\n context.debug(\"Formatting files generated during the prepare step.\");\n\n await Promise.all([\n formatFolder(env, env.builtinsPath),\n formatFolder(env, env.entryPath)\n ]);\n\n await writeMetaFile(env);\n env.persistedMeta = env.meta;\n });\n\n timer();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA0CA,eAAsB,QAIpB,SACA,YAAY,OACZ;CACA,MAAM,QAAQ,QAAQ,MAAM,aAAa;CAEzC,MAAM,oBAAoB,SAAS,OAAM,QAAO;EAC9C,IAAI,MACF,iEACF;EAEA,MAAM,QAAQ,SAAS,kBAAkB;GACvC,aAAa;GACb,OAAO;EACT,CAAC;EAED,MAAM,mBAAoD,GAAG;EAE7D,MAAM,QAAQ,SAAS,kBAAkB;GACvC,aAAa;GACb,OAAO;EACT,CAAC;EAED,IAAI,IAAI,MAAM,SAAS,GAAG;GACxB,MAAM,gBAAgB,SAAS,IAAI,OAAO,KAAK,IAC3C,OAAO,KAAK,IAAI,OAAO,KAAK,CAAC,CAAC,SAC9B,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC;GAC9B,IAAI,MACF,8BAA8B,cAAc,cAC1C,kBAAkB,IAAI,MAAM,GAC7B,IAAI,UAAU,IAAI,OAAO,WAAW,IAAI,KAAK,aAAa,aAAa,IAAI,MAAM,OAAO,aACvF,IAAI,MAAM,WAAW,IAAI,MAAM,GAChC,WAAW,IAAI,OAAO,MAAM,UAC3B,IAAI,MAAM,SAAS,KAAK,IAAI,MAAM,SAAS,KACvC,OAAO,IAAI,MACR,KACC,UACE,KAAK,YAAY,MAAM,MAAM,QAAQ,OAAO,GAAG,IAC7C,MAAM,SACF,OAAO,YAAY,MAAM,QAAQ,QAAQ,OAAO,GAAG,MACnD,IAEV,CAAC,CACA,KAAK,KAAK,MACb,IAER;EACF,OACE,IAAI,KACF,qCACE,IAAI,OAAO,MACZ,6HACH;EAGF,MAAM,gBAAiD,GAAG;EAC1D,MAAM,oBAAoB,GAAG;EAE7B,MAAM,QAAQ,SAAS,kBAAkB;GACvC,aAAa;GACb,OAAO;EACT,CAAC;EAED,IAAI,MAAM;GACR,MAAM,EACJ,UAAU,SACZ;GACA,SAAS,yDAAyD,aAChE,IAAI,MACN;EACF,CAAC;EAED,IAAI,CAAC,IAAI,GAAG,WAAW,IAAI,SAAS,GAClC,MAAM,gBAAgB,IAAI,SAAS;EAGrC,IAAI,CAAC,IAAI,GAAG,WAAW,IAAI,QAAQ,GACjC,MAAM,gBAAgB,IAAI,QAAQ;EAGpC,MAAM,QAAQ,SAAS,WAAW;GAChC,aAAa;GACb,OAAO;EACT,CAAC;EACD,MAAM,QAAQ,SAAS,WAAW;GAChC,aAAa;GACb,OAAO;EACT,CAAC;EAED,MAAM,QAAQ,SAAS,WAAW;GAChC,aAAa;GACb,OAAO;EACT,CAAC;EAED,IAAI,CAAC,aAAa,IAAI,OAAO,OAAO,UAAU,OAC5C,MAAM,YAAY,SAAS,GAAG;EAGhC,QAAQ,MAAM,qDAAqD;EAEnE,MAAM,QAAQ,IAAI,CAChB,aAAa,KAAK,IAAI,YAAY,GAClC,aAAa,KAAK,IAAI,SAAS,CACjC,CAAC;EAED,MAAM,cAAc,GAAG;EACvB,IAAI,gBAAgB,IAAI;CAC1B,CAAC;CAED,MAAM;AACR"}
|
package/dist/api/types.cjs
CHANGED
|
@@ -9,6 +9,7 @@ let _powerlines_core_lib_typescript_tsconfig = require("@powerlines/core/lib/typ
|
|
|
9
9
|
let _powerlines_core_lib_utilities_format = require("@powerlines/core/lib/utilities/format");
|
|
10
10
|
let _stryke_convert_to_array = require("@stryke/convert/to-array");
|
|
11
11
|
let _stryke_fs_helpers = require("@stryke/fs/helpers");
|
|
12
|
+
let _stryke_string_format_title_case = require("@stryke/string-format/title-case");
|
|
12
13
|
let _stryke_type_checks_is_object = require("@stryke/type-checks/is-object");
|
|
13
14
|
let _storm_software_config_tools_logger = require("@storm-software/config-tools/logger");
|
|
14
15
|
let _stryke_helpers_omit = require("@stryke/helpers/omit");
|
|
@@ -39,7 +40,7 @@ async function types(context) {
|
|
|
39
40
|
});
|
|
40
41
|
if (env.entry.length > 0) {
|
|
41
42
|
const entriesLength = (0, _stryke_type_checks_is_object.isObject)(env.config.input) ? Object.keys(env.config.input).length : (0, _stryke_convert_to_array.toArray)(env.config.input).length;
|
|
42
|
-
env.debug(`The configuration provided ${entriesLength} entry point${entriesLength !== 1 ? "s" : ""}, Powerlines has found ${env.entry.length} entry file${env.entry.length !== 1 ? "s" : ""} for the ${env.config.title} project${env.entry.length > 0 && env.entry.length < 10 ? `: \n${env.entry.map((entry) => `- ${(0, _stryke_path_replace.replacePath)(entry.file, context.config.
|
|
43
|
+
env.debug(`The configuration provided ${entriesLength} entry point${entriesLength !== 1 ? "s" : ""}, ${(0, _stryke_string_format_title_case.titleCase)(env.config.framework?.name) || "Powerlines"} has found ${env.entry.length} entry file${env.entry.length !== 1 ? "s" : ""} for the ${env.config.title} project${env.entry.length > 0 && env.entry.length < 10 ? `: \n${env.entry.map((entry) => `- ${(0, _stryke_path_replace.replacePath)(entry.file, context.config.cwd)}${entry.output ? ` -> ${(0, _stryke_path_replace.replacePath)(entry.output, context.config.cwd)}` : ""}`).join(" \n")}` : ""}`);
|
|
43
44
|
} else env.warn(`No entry files were found for the ${env.config.title} project. Please ensure this is correct. Powerlines plugins generally require at least one entry point to function properly.`);
|
|
44
45
|
await (0, _powerlines_core_lib_typescript_tsconfig.resolveTsconfig)(env);
|
|
45
46
|
await (0, _powerlines_core_lib_install_dependencies.installDependencies)(env);
|
package/dist/api/types.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.cts","names":[],"sources":["../../src/api/types.ts"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../../src/api/types.ts"],"mappings":";;;;;;;AAgDA;;;;;;iBAAsB,KAAA,yBACI,oBAAA,yBACD,mBAAA,EACvB,OAAA,EAAS,gBAAA,CAAiB,eAAA,EAAiB,cAAA,IAAe,OAAA"}
|
package/dist/api/types.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/api/types.ts"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/api/types.ts"],"mappings":";;;;;;;AAgDA;;;;;;iBAAsB,KAAA,yBACI,oBAAA,yBACD,mBAAA,EACvB,OAAA,EAAS,gBAAA,CAAiB,eAAA,EAAiB,cAAA,IAAe,OAAA"}
|
package/dist/api/types.mjs
CHANGED
|
@@ -8,6 +8,7 @@ import { initializeTsconfig, resolveTsconfig } from "@powerlines/core/lib/typesc
|
|
|
8
8
|
import { format } from "@powerlines/core/lib/utilities/format";
|
|
9
9
|
import { toArray } from "@stryke/convert/to-array";
|
|
10
10
|
import { createDirectory } from "@stryke/fs/helpers";
|
|
11
|
+
import { titleCase } from "@stryke/string-format/title-case";
|
|
11
12
|
import { isObject } from "@stryke/type-checks/is-object";
|
|
12
13
|
import { formatLogMessage } from "@storm-software/config-tools/logger";
|
|
13
14
|
import { omit } from "@stryke/helpers/omit";
|
|
@@ -38,7 +39,7 @@ async function types(context) {
|
|
|
38
39
|
});
|
|
39
40
|
if (env.entry.length > 0) {
|
|
40
41
|
const entriesLength = isObject(env.config.input) ? Object.keys(env.config.input).length : toArray(env.config.input).length;
|
|
41
|
-
env.debug(`The configuration provided ${entriesLength} entry point${entriesLength !== 1 ? "s" : ""}, Powerlines has found ${env.entry.length} entry file${env.entry.length !== 1 ? "s" : ""} for the ${env.config.title} project${env.entry.length > 0 && env.entry.length < 10 ? `: \n${env.entry.map((entry) => `- ${replacePath(entry.file, context.config.
|
|
42
|
+
env.debug(`The configuration provided ${entriesLength} entry point${entriesLength !== 1 ? "s" : ""}, ${titleCase(env.config.framework?.name) || "Powerlines"} has found ${env.entry.length} entry file${env.entry.length !== 1 ? "s" : ""} for the ${env.config.title} project${env.entry.length > 0 && env.entry.length < 10 ? `: \n${env.entry.map((entry) => `- ${replacePath(entry.file, context.config.cwd)}${entry.output ? ` -> ${replacePath(entry.output, context.config.cwd)}` : ""}`).join(" \n")}` : ""}`);
|
|
42
43
|
} else env.warn(`No entry files were found for the ${env.config.title} project. Please ensure this is correct. Powerlines plugins generally require at least one entry point to function properly.`);
|
|
43
44
|
await resolveTsconfig(env);
|
|
44
45
|
await installDependencies(env);
|
package/dist/api/types.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.mjs","names":[],"sources":["../../src/api/types.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { executeEnvironments } from \"@powerlines/core/lib/environment\";\nimport { handleTypes } from \"@powerlines/core/lib/generate-types\";\nimport { installDependencies } from \"@powerlines/core/lib/install-dependencies\";\nimport { writeMetaFile } from \"@powerlines/core/lib/meta\";\nimport {\n initializeTsconfig,\n resolveTsconfig\n} from \"@powerlines/core/lib/typescript/tsconfig\";\nimport { format } from \"@powerlines/core/lib/utilities/format\";\nimport { ExecutionContext } from \"@powerlines/core/types/context\";\nimport { formatLogMessage } from \"@storm-software/config-tools/logger\";\nimport { toArray } from \"@stryke/convert/to-array\";\nimport { createDirectory } from \"@stryke/fs/helpers\";\nimport { omit } from \"@stryke/helpers/omit\";\nimport { replacePath } from \"@stryke/path/replace\";\nimport { isObject } from \"@stryke/type-checks/is-object\";\nimport { isSetObject } from \"@stryke/type-checks/is-set-object\";\nimport { EngineResolvedConfig } from \"../types/config\";\nimport { EngineSystemContext } from \"../types/context\";\nimport { prepare } from \"./prepare\";\n\n/**\n * Generate runtime types for the Powerlines project.\n *\n * @remarks\n * This function is responsible for generating TypeScript declaration files based on the project's configuration and environment. It executes hooks at various stages of the type generation process, allowing for customization and extension by plugins. The generated types are formatted and written to the appropriate location in the project's file system, ensuring that they are available for use by other parts of the Powerlines system and by end-users of the project.\n *\n * @param context - The execution context for the build process, which provides access to the project configuration, environment, and utility functions for performing the build. The context is used to manage the state and behavior of the build process, allowing for hooks to be called at different stages of the build and for environment-specific configurations to be applied.\n */\nexport async function types<\n TResolvedConfig extends EngineResolvedConfig,\n TSystemContext extends EngineSystemContext\n>(context: ExecutionContext<TResolvedConfig, TSystemContext>) {\n const timer = context.timer(\"Type Generation\");\n context.debug(\n \" Aggregating configuration options for the Powerlines project\"\n );\n\n await executeEnvironments(context, async env => {\n env.debug(\n `Initializing the processing options for the Powerlines project.`\n );\n\n await context.callHook(\"configResolved\", {\n environment: env,\n order: \"pre\"\n });\n\n await initializeTsconfig<TResolvedConfig, TSystemContext>(env);\n\n await context.callHook(\"configResolved\", {\n environment: env,\n order: \"normal\"\n });\n\n if (env.entry.length > 0) {\n const entriesLength = isObject(env.config.input)\n ? Object.keys(env.config.input).length\n : toArray(env.config.input).length;\n env.debug(\n `The configuration provided ${entriesLength} entry point${\n entriesLength !== 1 ? \"s\" : \"\"\n }, Powerlines has found ${env.entry.length} entry file${\n env.entry.length !== 1 ? \"s\" : \"\"\n } for the ${env.config.title} project${\n env.entry.length > 0 && env.entry.length < 10\n ? `: \\n${env.entry\n .map(\n entry =>\n `- ${replacePath(entry.file, context.config.
|
|
1
|
+
{"version":3,"file":"types.mjs","names":[],"sources":["../../src/api/types.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { executeEnvironments } from \"@powerlines/core/lib/environment\";\nimport { handleTypes } from \"@powerlines/core/lib/generate-types\";\nimport { installDependencies } from \"@powerlines/core/lib/install-dependencies\";\nimport { writeMetaFile } from \"@powerlines/core/lib/meta\";\nimport {\n initializeTsconfig,\n resolveTsconfig\n} from \"@powerlines/core/lib/typescript/tsconfig\";\nimport { format } from \"@powerlines/core/lib/utilities/format\";\nimport { ExecutionContext } from \"@powerlines/core/types/context\";\nimport { formatLogMessage } from \"@storm-software/config-tools/logger\";\nimport { toArray } from \"@stryke/convert/to-array\";\nimport { createDirectory } from \"@stryke/fs/helpers\";\nimport { omit } from \"@stryke/helpers/omit\";\nimport { replacePath } from \"@stryke/path/replace\";\nimport { titleCase } from \"@stryke/string-format/title-case\";\nimport { isObject } from \"@stryke/type-checks/is-object\";\nimport { isSetObject } from \"@stryke/type-checks/is-set-object\";\nimport { EngineResolvedConfig } from \"../types/config\";\nimport { EngineSystemContext } from \"../types/context\";\nimport { prepare } from \"./prepare\";\n\n/**\n * Generate runtime types for the Powerlines project.\n *\n * @remarks\n * This function is responsible for generating TypeScript declaration files based on the project's configuration and environment. It executes hooks at various stages of the type generation process, allowing for customization and extension by plugins. The generated types are formatted and written to the appropriate location in the project's file system, ensuring that they are available for use by other parts of the Powerlines system and by end-users of the project.\n *\n * @param context - The execution context for the build process, which provides access to the project configuration, environment, and utility functions for performing the build. The context is used to manage the state and behavior of the build process, allowing for hooks to be called at different stages of the build and for environment-specific configurations to be applied.\n */\nexport async function types<\n TResolvedConfig extends EngineResolvedConfig,\n TSystemContext extends EngineSystemContext\n>(context: ExecutionContext<TResolvedConfig, TSystemContext>) {\n const timer = context.timer(\"Type Generation\");\n context.debug(\n \" Aggregating configuration options for the Powerlines project\"\n );\n\n await executeEnvironments(context, async env => {\n env.debug(\n `Initializing the processing options for the Powerlines project.`\n );\n\n await context.callHook(\"configResolved\", {\n environment: env,\n order: \"pre\"\n });\n\n await initializeTsconfig<TResolvedConfig, TSystemContext>(env);\n\n await context.callHook(\"configResolved\", {\n environment: env,\n order: \"normal\"\n });\n\n if (env.entry.length > 0) {\n const entriesLength = isObject(env.config.input)\n ? Object.keys(env.config.input).length\n : toArray(env.config.input).length;\n env.debug(\n `The configuration provided ${entriesLength} entry point${\n entriesLength !== 1 ? \"s\" : \"\"\n }, ${titleCase(env.config.framework?.name) || \"Powerlines\"} has found ${env.entry.length} entry file${\n env.entry.length !== 1 ? \"s\" : \"\"\n } for the ${env.config.title} project${\n env.entry.length > 0 && env.entry.length < 10\n ? `: \\n${env.entry\n .map(\n entry =>\n `- ${replacePath(entry.file, context.config.cwd)}${\n entry.output\n ? ` -> ${replacePath(entry.output, context.config.cwd)}`\n : \"\"\n }`\n )\n .join(\" \\n\")}`\n : \"\"\n }`\n );\n } else {\n env.warn(\n `No entry files were found for the ${\n env.config.title\n } project. Please ensure this is correct. Powerlines plugins generally require at least one entry point to function properly.`\n );\n }\n\n await resolveTsconfig<TResolvedConfig, TSystemContext>(env);\n await installDependencies(env);\n\n await context.callHook(\"configResolved\", {\n environment: env,\n order: \"post\"\n });\n\n context.trace(\n `Powerlines configuration has been resolved: \\n\\n${formatLogMessage({\n ...env.config,\n userConfig: isSetObject(env.config.userConfig)\n ? omit(env.config.userConfig, [\"plugins\"])\n : undefined,\n inlineConfig: isSetObject(env.config.inlineConfig)\n ? env.config.inlineConfig\n : undefined,\n plugins: env.plugins.map(plugin => plugin.name)\n })}`\n );\n\n if (!env.fs.existsSync(env.cachePath)) {\n await createDirectory(env.cachePath);\n }\n\n if (!env.fs.existsSync(env.dataPath)) {\n await createDirectory(env.dataPath);\n }\n\n if (\n env.config.skipCache === true ||\n env.persistedMeta?.checksum !== env.meta.checksum\n ) {\n env.debug(\n `Using previously prepared files as the meta checksum has not changed.`\n );\n } else {\n env.info(\n `Running \\`prepare\\` command as the meta checksum has changed since the last run.`\n );\n\n await prepare(context, true);\n }\n\n await handleTypes(context, env);\n\n context.debug(\"Formatting files generated during the types step.\");\n\n await format(env, env.typesPath, (await env.fs.read(env.typesPath)) ?? \"\");\n\n await writeMetaFile(env);\n env.persistedMeta = env.meta;\n });\n\n timer();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAgDA,eAAsB,MAGpB,SAA4D;CAC5D,MAAM,QAAQ,QAAQ,MAAM,iBAAiB;CAC7C,QAAQ,MACN,+DACF;CAEA,MAAM,oBAAoB,SAAS,OAAM,QAAO;EAC9C,IAAI,MACF,iEACF;EAEA,MAAM,QAAQ,SAAS,kBAAkB;GACvC,aAAa;GACb,OAAO;EACT,CAAC;EAED,MAAM,mBAAoD,GAAG;EAE7D,MAAM,QAAQ,SAAS,kBAAkB;GACvC,aAAa;GACb,OAAO;EACT,CAAC;EAED,IAAI,IAAI,MAAM,SAAS,GAAG;GACxB,MAAM,gBAAgB,SAAS,IAAI,OAAO,KAAK,IAC3C,OAAO,KAAK,IAAI,OAAO,KAAK,CAAC,CAAC,SAC9B,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC;GAC9B,IAAI,MACF,8BAA8B,cAAc,cAC1C,kBAAkB,IAAI,MAAM,GAC7B,IAAI,UAAU,IAAI,OAAO,WAAW,IAAI,KAAK,aAAa,aAAa,IAAI,MAAM,OAAO,aACvF,IAAI,MAAM,WAAW,IAAI,MAAM,GAChC,WAAW,IAAI,OAAO,MAAM,UAC3B,IAAI,MAAM,SAAS,KAAK,IAAI,MAAM,SAAS,KACvC,OAAO,IAAI,MACR,KACC,UACE,KAAK,YAAY,MAAM,MAAM,QAAQ,OAAO,GAAG,IAC7C,MAAM,SACF,OAAO,YAAY,MAAM,QAAQ,QAAQ,OAAO,GAAG,MACnD,IAEV,CAAC,CACA,KAAK,KAAK,MACb,IAER;EACF,OACE,IAAI,KACF,qCACE,IAAI,OAAO,MACZ,6HACH;EAGF,MAAM,gBAAiD,GAAG;EAC1D,MAAM,oBAAoB,GAAG;EAE7B,MAAM,QAAQ,SAAS,kBAAkB;GACvC,aAAa;GACb,OAAO;EACT,CAAC;EAED,QAAQ,MACN,mDAAmD,iBAAiB;GAClE,GAAG,IAAI;GACP,YAAY,YAAY,IAAI,OAAO,UAAU,IACzC,KAAK,IAAI,OAAO,YAAY,CAAC,SAAS,CAAC,IACvC;GACJ,cAAc,YAAY,IAAI,OAAO,YAAY,IAC7C,IAAI,OAAO,eACX;GACJ,SAAS,IAAI,QAAQ,KAAI,WAAU,OAAO,IAAI;EAChD,CAAC,GACH;EAEA,IAAI,CAAC,IAAI,GAAG,WAAW,IAAI,SAAS,GAClC,MAAM,gBAAgB,IAAI,SAAS;EAGrC,IAAI,CAAC,IAAI,GAAG,WAAW,IAAI,QAAQ,GACjC,MAAM,gBAAgB,IAAI,QAAQ;EAGpC,IACE,IAAI,OAAO,cAAc,QACzB,IAAI,eAAe,aAAa,IAAI,KAAK,UAEzC,IAAI,MACF,uEACF;OACK;GACL,IAAI,KACF,kFACF;GAEA,MAAM,QAAQ,SAAS,IAAI;EAC7B;EAEA,MAAM,YAAY,SAAS,GAAG;EAE9B,QAAQ,MAAM,mDAAmD;EAEjE,MAAM,OAAO,KAAK,IAAI,WAAY,MAAM,IAAI,GAAG,KAAK,IAAI,SAAS,KAAM,EAAE;EAEzE,MAAM,cAAc,GAAG;EACvB,IAAI,gBAAgB,IAAI;CAC1B,CAAC;CAED,MAAM;AACR"}
|
|
@@ -6,6 +6,7 @@ let _stryke_unique_id_uuid = require("@stryke/unique-id/uuid");
|
|
|
6
6
|
let devframe_node = require("devframe/node");
|
|
7
7
|
let _powerlines_core_lib_config = require("@powerlines/core/lib/config");
|
|
8
8
|
let _powerlines_core_context_base_context = require("@powerlines/core/context/base-context");
|
|
9
|
+
let _powerlines_core_plugin_utils_context_helpers = require("@powerlines/core/plugin-utils/context-helpers");
|
|
9
10
|
let _stryke_env_get_env_paths = require("@stryke/env/get-env-paths");
|
|
10
11
|
let _stryke_string_format_kebab_case = require("@stryke/string-format/kebab-case");
|
|
11
12
|
let valibot = require("valibot");
|
|
@@ -125,11 +126,14 @@ var PowerlinesEngineContext = class PowerlinesEngineContext extends _powerlines_
|
|
|
125
126
|
*/
|
|
126
127
|
async loadExecutions(command, inlineConfig) {
|
|
127
128
|
const root = (0, _powerlines_core_lib_config.resolveRoot)(this.cwd, inlineConfig.root, inlineConfig.configFile);
|
|
128
|
-
const config = await (0, _powerlines_core_lib_config.loadParsedConfig)(this.cwd, root, this.framework?.name, this.orgId,
|
|
129
|
+
const config = await (0, _powerlines_core_lib_config.loadParsedConfig)(this.cwd, root, this.framework?.name, this.orgId, {
|
|
130
|
+
...inlineConfig,
|
|
131
|
+
command
|
|
132
|
+
});
|
|
129
133
|
if (!config) throw new Error("Failed to load configuration");
|
|
130
134
|
const invocationId = (0, _stryke_unique_id_uuid.uuid)();
|
|
131
135
|
const executions = await Promise.all((0, _stryke_convert_to_array.toArray)(config.config).map(async (_, configIndex) => {
|
|
132
|
-
const executionId = (0, _powerlines_core_plugin_utils.formatExecutionId)(config.config.name || inlineConfig.name || root, command, configIndex);
|
|
136
|
+
const executionId = (0, _powerlines_core_plugin_utils.formatExecutionId)(config.config.name || inlineConfig.name || await (0, _powerlines_core_plugin_utils_context_helpers.getName)(this.cwd, root), command, configIndex);
|
|
133
137
|
const options = {
|
|
134
138
|
cwd: this.cwd,
|
|
135
139
|
root,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { EngineOptions } from "../types/config.cjs";
|
|
2
2
|
import { EngineContext, EngineExecutionItem } from "../types/context.cjs";
|
|
3
3
|
import { FrameworkOptions, InlineConfig, LogFn, LoggerOptions } from "@powerlines/core";
|
|
4
|
+
import { PartialKeys } from "@stryke/types/base";
|
|
4
5
|
import { ConnectionMeta, DevToolsHost, DevToolsNodeContext } from "devframe/types";
|
|
5
6
|
import { PowerlinesBaseContext } from "@powerlines/core/context/base-context";
|
|
6
7
|
import { EnvPaths } from "@stryke/env/get-env-paths";
|
|
@@ -39,7 +40,7 @@ declare class PowerlinesEngineContext<TSystemContext = unknown> extends Powerlin
|
|
|
39
40
|
* @param command - The path to the execution configuration to load and run, which can be used to specify different execution configurations for different commands or scenarios.
|
|
40
41
|
* @param inlineConfig - Additional configuration options provided at runtime, which can override or supplement the options defined in the user configuration file.
|
|
41
42
|
*/
|
|
42
|
-
loadExecutions(command: string, inlineConfig: InlineConfig): Promise<EngineExecutionItem[]>;
|
|
43
|
+
loadExecutions(command: string, inlineConfig: PartialKeys<InlineConfig, "command">): Promise<EngineExecutionItem[]>;
|
|
43
44
|
/**
|
|
44
45
|
* Complete an execution by removing it from the list of active executions based on the provided invocation ID and execution ID. This method is typically called when an execution has finished or has been terminated, allowing the context to clean up any resources associated with that execution and update its internal state accordingly.
|
|
45
46
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-context.d.cts","names":[],"sources":["../../src/context/engine-context.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine-context.d.cts","names":[],"sources":["../../src/context/engine-context.ts"],"mappings":";;;;;;;;;cAsDa,uBAAA,mCACH,qBAAA,CAAsB,cAAA,aACnB,aAAA,CAAc,cAAA;EAAA;EAkIP,OAAA,EAAS,aAAA;EAClB,UAAA,EAAY,cAAA;EArIa;;;;;;EAAA,OAgBd,IAAA,2BAClB,OAAA,EAAS,aAAA,EACT,IAAA,EAAM,YAAA,EACN,UAAA,EAAY,cAAA,GACX,OAAA,CAAQ,uBAAA,CAAwB,cAAA;EA8DnB,YAAA,CAAa,OAAA,GAAS,aAAA,EAAoB,KAAA,GAAQ,KAAA,8BAAK,MAAA;EAAA,IAe5D,UAAA,IAAc,mBAAA;EAAA,IAId,QAAA,IAAY,mBAAA;EAAA,IAIZ,QAAA,IAAY,QAAA;EAAA,IAQZ,SAAA,IAAa,gBAAA;EAAA,IAQb,KAAA;EAxBc;;;;;;EAAA,UAkChB,WAAA,CACS,OAAA,EAAS,aAAA,EAClB,UAAA,EAAY,cAAA;EAgBL;;;;;;;;;EAFH,cAAA,CACX,OAAA,UACA,YAAA,EAAc,WAAA,CAAY,YAAA,eACzB,OAAA,CAAQ,mBAAA;EApJA;;;;;;EA+NJ,iBAAA,CAAkB,YAAA,UAAsB,WAAA;AAAA"}
|
|
@@ -3,6 +3,7 @@ import { EngineContext, EngineExecutionItem } from "../types/context.mjs";
|
|
|
3
3
|
import { FrameworkOptions, InlineConfig, LogFn, LoggerOptions } from "@powerlines/core";
|
|
4
4
|
import { PowerlinesBaseContext } from "@powerlines/core/context/base-context";
|
|
5
5
|
import { EnvPaths } from "@stryke/env/get-env-paths";
|
|
6
|
+
import { PartialKeys } from "@stryke/types/base";
|
|
6
7
|
import { ConnectionMeta, DevToolsHost, DevToolsNodeContext } from "devframe/types";
|
|
7
8
|
|
|
8
9
|
//#region src/context/engine-context.d.ts
|
|
@@ -39,7 +40,7 @@ declare class PowerlinesEngineContext<TSystemContext = unknown> extends Powerlin
|
|
|
39
40
|
* @param command - The path to the execution configuration to load and run, which can be used to specify different execution configurations for different commands or scenarios.
|
|
40
41
|
* @param inlineConfig - Additional configuration options provided at runtime, which can override or supplement the options defined in the user configuration file.
|
|
41
42
|
*/
|
|
42
|
-
loadExecutions(command: string, inlineConfig: InlineConfig): Promise<EngineExecutionItem[]>;
|
|
43
|
+
loadExecutions(command: string, inlineConfig: PartialKeys<InlineConfig, "command">): Promise<EngineExecutionItem[]>;
|
|
43
44
|
/**
|
|
44
45
|
* Complete an execution by removing it from the list of active executions based on the provided invocation ID and execution ID. This method is typically called when an execution has finished or has been terminated, allowing the context to clean up any resources associated with that execution and update its internal state accordingly.
|
|
45
46
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-context.d.mts","names":[],"sources":["../../src/context/engine-context.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine-context.d.mts","names":[],"sources":["../../src/context/engine-context.ts"],"mappings":";;;;;;;;;cAsDa,uBAAA,mCACH,qBAAA,CAAsB,cAAA,aACnB,aAAA,CAAc,cAAA;EAAA;EAkIP,OAAA,EAAS,aAAA;EAClB,UAAA,EAAY,cAAA;EArIa;;;;;;EAAA,OAgBd,IAAA,2BAClB,OAAA,EAAS,aAAA,EACT,IAAA,EAAM,YAAA,EACN,UAAA,EAAY,cAAA,GACX,OAAA,CAAQ,uBAAA,CAAwB,cAAA;EA8DnB,YAAA,CAAa,OAAA,GAAS,aAAA,EAAoB,KAAA,GAAQ,KAAA,8BAAK,MAAA;EAAA,IAe5D,UAAA,IAAc,mBAAA;EAAA,IAId,QAAA,IAAY,mBAAA;EAAA,IAIZ,QAAA,IAAY,QAAA;EAAA,IAQZ,SAAA,IAAa,gBAAA;EAAA,IAQb,KAAA;EAxBc;;;;;;EAAA,UAkChB,WAAA,CACS,OAAA,EAAS,aAAA,EAClB,UAAA,EAAY,cAAA;EAgBL;;;;;;;;;EAFH,cAAA,CACX,OAAA,UACA,YAAA,EAAc,WAAA,CAAY,YAAA,eACzB,OAAA,CAAQ,mBAAA;EApJA;;;;;;EA+NJ,iBAAA,CAAkB,YAAA,UAAsB,WAAA;AAAA"}
|
|
@@ -4,6 +4,7 @@ import { uuid } from "@stryke/unique-id/uuid";
|
|
|
4
4
|
import { createHostContext } from "devframe/node";
|
|
5
5
|
import { getDefaultLogLevel, loadParsedConfig, resolveRoot } from "@powerlines/core/lib/config";
|
|
6
6
|
import { PowerlinesBaseContext } from "@powerlines/core/context/base-context";
|
|
7
|
+
import { getName } from "@powerlines/core/plugin-utils/context-helpers";
|
|
7
8
|
import { getEnvPaths } from "@stryke/env/get-env-paths";
|
|
8
9
|
import { kebabCase } from "@stryke/string-format/kebab-case";
|
|
9
10
|
import * as v from "valibot";
|
|
@@ -122,11 +123,14 @@ var PowerlinesEngineContext = class PowerlinesEngineContext extends PowerlinesBa
|
|
|
122
123
|
*/
|
|
123
124
|
async loadExecutions(command, inlineConfig) {
|
|
124
125
|
const root = resolveRoot(this.cwd, inlineConfig.root, inlineConfig.configFile);
|
|
125
|
-
const config = await loadParsedConfig(this.cwd, root, this.framework?.name, this.orgId,
|
|
126
|
+
const config = await loadParsedConfig(this.cwd, root, this.framework?.name, this.orgId, {
|
|
127
|
+
...inlineConfig,
|
|
128
|
+
command
|
|
129
|
+
});
|
|
126
130
|
if (!config) throw new Error("Failed to load configuration");
|
|
127
131
|
const invocationId = uuid();
|
|
128
132
|
const executions = await Promise.all(toArray(config.config).map(async (_, configIndex) => {
|
|
129
|
-
const executionId = formatExecutionId(config.config.name || inlineConfig.name || root, command, configIndex);
|
|
133
|
+
const executionId = formatExecutionId(config.config.name || inlineConfig.name || await getName(this.cwd, root), command, configIndex);
|
|
130
134
|
const options = {
|
|
131
135
|
cwd: this.cwd,
|
|
132
136
|
root,
|