@ticatec/omniflow-core 0.1.0
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 +264 -0
- package/README_CN.md +265 -0
- package/dist/context/index.d.ts +27 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +62 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/storage.d.ts +8 -0
- package/dist/context/storage.d.ts.map +1 -0
- package/dist/context/storage.js +7 -0
- package/dist/context/storage.js.map +1 -0
- package/dist/context/types.d.ts +64 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +5 -0
- package/dist/context/types.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives/docker.d.ts +41 -0
- package/dist/primitives/docker.d.ts.map +1 -0
- package/dist/primitives/docker.js +109 -0
- package/dist/primitives/docker.js.map +1 -0
- package/dist/primitives/git.d.ts +19 -0
- package/dist/primitives/git.d.ts.map +1 -0
- package/dist/primitives/git.js +84 -0
- package/dist/primitives/git.js.map +1 -0
- package/dist/primitives/index.d.ts +5 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +5 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/shell.d.ts +42 -0
- package/dist/primitives/shell.d.ts.map +1 -0
- package/dist/primitives/shell.js +141 -0
- package/dist/primitives/shell.js.map +1 -0
- package/dist/primitives/ssh.d.ts +41 -0
- package/dist/primitives/ssh.d.ts.map +1 -0
- package/dist/primitives/ssh.js +128 -0
- package/dist/primitives/ssh.js.map +1 -0
- package/dist/toolchain/index.d.ts +7 -0
- package/dist/toolchain/index.d.ts.map +1 -0
- package/dist/toolchain/index.js +7 -0
- package/dist/toolchain/index.js.map +1 -0
- package/dist/toolchain/providers/GradleToolchain.d.ts +15 -0
- package/dist/toolchain/providers/GradleToolchain.d.ts.map +1 -0
- package/dist/toolchain/providers/GradleToolchain.js +130 -0
- package/dist/toolchain/providers/GradleToolchain.js.map +1 -0
- package/dist/toolchain/providers/MavenToolchain.d.ts +12 -0
- package/dist/toolchain/providers/MavenToolchain.d.ts.map +1 -0
- package/dist/toolchain/providers/MavenToolchain.js +57 -0
- package/dist/toolchain/providers/MavenToolchain.js.map +1 -0
- package/dist/toolchain/providers/NodeToolchain.d.ts +15 -0
- package/dist/toolchain/providers/NodeToolchain.d.ts.map +1 -0
- package/dist/toolchain/providers/NodeToolchain.js +93 -0
- package/dist/toolchain/providers/NodeToolchain.js.map +1 -0
- package/dist/toolchain/providers/pom.d.ts +18 -0
- package/dist/toolchain/providers/pom.d.ts.map +1 -0
- package/dist/toolchain/providers/pom.js +112 -0
- package/dist/toolchain/providers/pom.js.map +1 -0
- package/dist/toolchain/registry.d.ts +48 -0
- package/dist/toolchain/registry.d.ts.map +1 -0
- package/dist/toolchain/registry.js +97 -0
- package/dist/toolchain/registry.js.map +1 -0
- package/dist/toolchain/types.d.ts +33 -0
- package/dist/toolchain/types.d.ts.map +1 -0
- package/dist/toolchain/types.js +5 -0
- package/dist/toolchain/types.js.map +1 -0
- package/dist/utils/mask.d.ts +15 -0
- package/dist/utils/mask.d.ts.map +1 -0
- package/dist/utils/mask.js +50 -0
- package/dist/utils/mask.js.map +1 -0
- package/dist/utils/template.d.ts +12 -0
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/utils/template.js +55 -0
- package/dist/utils/template.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core execution context and command result contracts for OmniFlow.
|
|
3
|
+
*/
|
|
4
|
+
export interface GitMetadata {
|
|
5
|
+
branch?: string;
|
|
6
|
+
commit?: string;
|
|
7
|
+
tag?: string;
|
|
8
|
+
dirty?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface Logger {
|
|
11
|
+
info(msg: string): void;
|
|
12
|
+
warn(msg: string): void;
|
|
13
|
+
error(msg: string): void;
|
|
14
|
+
debug?(msg: string): void;
|
|
15
|
+
}
|
|
16
|
+
export interface Artifact {
|
|
17
|
+
type: string;
|
|
18
|
+
ref: string;
|
|
19
|
+
name?: string;
|
|
20
|
+
digest?: string;
|
|
21
|
+
path?: string;
|
|
22
|
+
metadata?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
export interface CommandResult {
|
|
25
|
+
success: boolean;
|
|
26
|
+
message?: string;
|
|
27
|
+
artifacts?: Artifact[];
|
|
28
|
+
outputs?: Record<string, unknown>;
|
|
29
|
+
error?: Error | string;
|
|
30
|
+
}
|
|
31
|
+
export type SourceMode = 'local' | 'ref' | 'managed';
|
|
32
|
+
/**
|
|
33
|
+
* Pure read-only execution context representing the active run state.
|
|
34
|
+
* Bound to the current async execution chain via AsyncLocalStorage.
|
|
35
|
+
*/
|
|
36
|
+
export interface ExecutionContext {
|
|
37
|
+
/** Unique run identifier */
|
|
38
|
+
runId: string;
|
|
39
|
+
/** Physical directory path for workspace */
|
|
40
|
+
workspace: string;
|
|
41
|
+
/** Physical project root directory */
|
|
42
|
+
projectRoot: string;
|
|
43
|
+
/** Project key/name */
|
|
44
|
+
project: string;
|
|
45
|
+
/** Module name currently executing, if applicable */
|
|
46
|
+
module?: string;
|
|
47
|
+
/** Relative subdirectory of the active module */
|
|
48
|
+
moduleFolder?: string;
|
|
49
|
+
/** Target deployment environment name (test, prod, etc.) */
|
|
50
|
+
environment: string;
|
|
51
|
+
/** Git repository state at execution time */
|
|
52
|
+
git: GitMetadata;
|
|
53
|
+
/** Resolved and merged environment variables */
|
|
54
|
+
env: Record<string, string>;
|
|
55
|
+
/** Structured logger directing output to terminal and run record */
|
|
56
|
+
logger: Logger;
|
|
57
|
+
/** Whether the execution is running in dry-run mode */
|
|
58
|
+
dryRun: boolean;
|
|
59
|
+
/** Active source resolution mode */
|
|
60
|
+
sourceMode?: SourceMode;
|
|
61
|
+
/** Path to the log file receiving all process and command output */
|
|
62
|
+
logFile?: string;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/context/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,KAAK,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;CACvB;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,CAAA;AAEpD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAA;IACjB,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAA;IACnB,6CAA6C;IAC7C,GAAG,EAAE,WAAW,CAAA;IAChB,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3B,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAA;IACd,uDAAuD;IACvD,MAAM,EAAE,OAAO,CAAA;IACf,oCAAoC;IACpC,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/context/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @omniflow/core
|
|
3
|
+
*
|
|
4
|
+
* Foundational execution context, primitives, and toolchain SPI
|
|
5
|
+
* for OmniFlow CI/CD orchestrator and its plugins.
|
|
6
|
+
*/
|
|
7
|
+
export { getContext, tryGetContext, hasContext, runWithContext, createMockContext, executionLocalStorage, type ExecutionContext, type CommandResult, type Artifact, type Logger, type GitMetadata, type SourceMode } from './context/index.js';
|
|
8
|
+
export { shell, run, sh, output, type RunOptions, type ShellOutputResult, type TemplateRunner } from './primitives/shell.js';
|
|
9
|
+
export { ssh, SshClient, type SshServerConfig, type SshConnectionConfig, type SshTarget, type SshResult } from './primitives/ssh.js';
|
|
10
|
+
export { git } from './primitives/git.js';
|
|
11
|
+
export { docker, type DockerBuildOptions, type ComposeOptions } from './primitives/docker.js';
|
|
12
|
+
export { registerToolchain, resolveToolchain, ToolchainRegistry, defaultToolchainRegistry, MavenToolchain, GradleToolchain, NodeToolchain, readPom, parseXml, type ToolchainProvider, type DetectionResult, type ProjectInfo } from './toolchain/index.js';
|
|
13
|
+
export { maskString, maskObject, isSecretKey, MASK } from './utils/mask.js';
|
|
14
|
+
export { templateToArgv } from './utils/template.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,UAAU,EACV,aAAa,EACb,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EACL,KAAK,EACL,GAAG,EACH,EAAE,EACF,MAAM,EACN,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,GAAG,EACH,SAAS,EACT,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AAEzC,OAAO,EACL,MAAM,EACN,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAA;AAG/B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,wBAAwB,EACxB,cAAc,EACd,eAAe,EACf,aAAa,EACb,OAAO,EACP,QAAQ,EACR,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EACL,UAAU,EACV,UAAU,EACV,WAAW,EACX,IAAI,EACL,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,cAAc,EACf,MAAM,qBAAqB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @omniflow/core
|
|
3
|
+
*
|
|
4
|
+
* Foundational execution context, primitives, and toolchain SPI
|
|
5
|
+
* for OmniFlow CI/CD orchestrator and its plugins.
|
|
6
|
+
*/
|
|
7
|
+
// Context
|
|
8
|
+
export { getContext, tryGetContext, hasContext, runWithContext, createMockContext, executionLocalStorage } from './context/index.js';
|
|
9
|
+
// Primitives
|
|
10
|
+
export { shell, run, sh, output } from './primitives/shell.js';
|
|
11
|
+
export { ssh, SshClient } from './primitives/ssh.js';
|
|
12
|
+
export { git } from './primitives/git.js';
|
|
13
|
+
export { docker } from './primitives/docker.js';
|
|
14
|
+
// Toolchains
|
|
15
|
+
export { registerToolchain, resolveToolchain, ToolchainRegistry, defaultToolchainRegistry, MavenToolchain, GradleToolchain, NodeToolchain, readPom, parseXml } from './toolchain/index.js';
|
|
16
|
+
// Utilities
|
|
17
|
+
export { maskString, maskObject, isSecretKey, MASK } from './utils/mask.js';
|
|
18
|
+
export { templateToArgv } from './utils/template.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,UAAU;AACV,OAAO,EACL,UAAU,EACV,aAAa,EACb,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,qBAAqB,EAOtB,MAAM,oBAAoB,CAAA;AAE3B,aAAa;AACb,OAAO,EACL,KAAK,EACL,GAAG,EACH,EAAE,EACF,MAAM,EAIP,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,GAAG,EACH,SAAS,EAKV,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AAEzC,OAAO,EACL,MAAM,EAGP,MAAM,wBAAwB,CAAA;AAE/B,aAAa;AACb,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,wBAAwB,EACxB,cAAc,EACd,eAAe,EACf,aAAa,EACb,OAAO,EACP,QAAQ,EAIT,MAAM,sBAAsB,CAAA;AAE7B,YAAY;AACZ,OAAO,EACL,UAAU,EACV,UAAU,EACV,WAAW,EACX,IAAI,EACL,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,cAAc,EACf,MAAM,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Artifact } from '../context/types.js';
|
|
2
|
+
export interface DockerBuildOptions {
|
|
3
|
+
image: string;
|
|
4
|
+
dockerfile?: string;
|
|
5
|
+
target?: string;
|
|
6
|
+
buildArgs?: Record<string, string>;
|
|
7
|
+
cwd?: string;
|
|
8
|
+
flags?: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface ComposeOptions {
|
|
11
|
+
files?: string | string[];
|
|
12
|
+
services?: string[];
|
|
13
|
+
detach?: boolean;
|
|
14
|
+
build?: boolean;
|
|
15
|
+
envFile?: string;
|
|
16
|
+
cwd?: string;
|
|
17
|
+
flags?: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare const docker: {
|
|
20
|
+
/**
|
|
21
|
+
* Build a Docker image.
|
|
22
|
+
*/
|
|
23
|
+
build(options: DockerBuildOptions): Promise<Artifact>;
|
|
24
|
+
/**
|
|
25
|
+
* Tag an existing Docker image.
|
|
26
|
+
*/
|
|
27
|
+
tag(sourceImage: string, targetImage: string): Promise<Artifact>;
|
|
28
|
+
/**
|
|
29
|
+
* Push a Docker image to a registry.
|
|
30
|
+
*/
|
|
31
|
+
push(image: string): Promise<Artifact>;
|
|
32
|
+
/**
|
|
33
|
+
* Launch services using Docker Compose.
|
|
34
|
+
*/
|
|
35
|
+
composeUp(options?: ComposeOptions): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Stop and remove containers using Docker Compose.
|
|
38
|
+
*/
|
|
39
|
+
composeDown(options?: ComposeOptions): Promise<void>;
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=docker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/primitives/docker.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEnD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,eAAO,MAAM,MAAM;IACjB;;OAEG;mBACkB,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAgC3D;;OAEG;qBACoB,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAUtE;;OAEG;gBACe,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAU5C;;OAEG;wBACsB,cAAc,GAAQ,OAAO,CAAC,IAAI,CAAC;IAsC5D;;OAEG;0BACwB,cAAc,GAAQ,OAAO,CAAC,IAAI,CAAC;CAqB/D,CAAA"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { shell } from './shell.js';
|
|
3
|
+
import { tryGetContext } from '../context/index.js';
|
|
4
|
+
export const docker = {
|
|
5
|
+
/**
|
|
6
|
+
* Build a Docker image.
|
|
7
|
+
*/
|
|
8
|
+
async build(options) {
|
|
9
|
+
const ctx = tryGetContext();
|
|
10
|
+
const cwd = options.cwd ?? (ctx?.moduleFolder ? path.resolve(ctx.workspace, ctx.moduleFolder) : ctx?.workspace ?? process.cwd());
|
|
11
|
+
const dockerfile = options.dockerfile ?? 'Dockerfile';
|
|
12
|
+
const args = ['build', '-f', dockerfile, '-t', options.image];
|
|
13
|
+
if (options.target) {
|
|
14
|
+
args.push('--target', options.target);
|
|
15
|
+
}
|
|
16
|
+
if (options.buildArgs) {
|
|
17
|
+
for (const [k, v] of Object.entries(options.buildArgs)) {
|
|
18
|
+
args.push('--build-arg', `${k}=${v}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (options.flags) {
|
|
22
|
+
args.push(...options.flags);
|
|
23
|
+
}
|
|
24
|
+
args.push('.');
|
|
25
|
+
ctx?.logger.info(`Building Docker image: ${options.image} (file: ${dockerfile})`);
|
|
26
|
+
await shell.run({ cwd }) `docker ${args}`;
|
|
27
|
+
return {
|
|
28
|
+
type: 'docker-image',
|
|
29
|
+
ref: options.image
|
|
30
|
+
};
|
|
31
|
+
},
|
|
32
|
+
/**
|
|
33
|
+
* Tag an existing Docker image.
|
|
34
|
+
*/
|
|
35
|
+
async tag(sourceImage, targetImage) {
|
|
36
|
+
const ctx = tryGetContext();
|
|
37
|
+
ctx?.logger.info(`Tagging Docker image: ${sourceImage} -> ${targetImage}`);
|
|
38
|
+
await shell.run `docker tag ${sourceImage} ${targetImage}`;
|
|
39
|
+
return {
|
|
40
|
+
type: 'docker-image',
|
|
41
|
+
ref: targetImage
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
/**
|
|
45
|
+
* Push a Docker image to a registry.
|
|
46
|
+
*/
|
|
47
|
+
async push(image) {
|
|
48
|
+
const ctx = tryGetContext();
|
|
49
|
+
ctx?.logger.info(`Pushing Docker image: ${image}`);
|
|
50
|
+
await shell.run `docker push ${image}`;
|
|
51
|
+
return {
|
|
52
|
+
type: 'docker-image',
|
|
53
|
+
ref: image
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
/**
|
|
57
|
+
* Launch services using Docker Compose.
|
|
58
|
+
*/
|
|
59
|
+
async composeUp(options = {}) {
|
|
60
|
+
const ctx = tryGetContext();
|
|
61
|
+
const cwd = options.cwd ?? (ctx?.moduleFolder ? path.resolve(ctx.workspace, ctx.moduleFolder) : ctx?.workspace ?? process.cwd());
|
|
62
|
+
const args = ['compose'];
|
|
63
|
+
if (options.files) {
|
|
64
|
+
const files = Array.isArray(options.files) ? options.files : [options.files];
|
|
65
|
+
for (const f of files) {
|
|
66
|
+
args.push('-f', f);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (options.envFile) {
|
|
70
|
+
args.push('--env-file', options.envFile);
|
|
71
|
+
}
|
|
72
|
+
args.push('up');
|
|
73
|
+
if (options.detach !== false) {
|
|
74
|
+
args.push('-d');
|
|
75
|
+
}
|
|
76
|
+
if (options.build) {
|
|
77
|
+
args.push('--build');
|
|
78
|
+
}
|
|
79
|
+
if (options.flags) {
|
|
80
|
+
args.push(...options.flags);
|
|
81
|
+
}
|
|
82
|
+
if (options.services && options.services.length > 0) {
|
|
83
|
+
args.push(...options.services);
|
|
84
|
+
}
|
|
85
|
+
ctx?.logger.info(`Docker Compose up (services: ${options.services?.join(', ') ?? 'all'})`);
|
|
86
|
+
await shell.run({ cwd }) `docker ${args}`;
|
|
87
|
+
},
|
|
88
|
+
/**
|
|
89
|
+
* Stop and remove containers using Docker Compose.
|
|
90
|
+
*/
|
|
91
|
+
async composeDown(options = {}) {
|
|
92
|
+
const ctx = tryGetContext();
|
|
93
|
+
const cwd = options.cwd ?? (ctx?.moduleFolder ? path.resolve(ctx.workspace, ctx.moduleFolder) : ctx?.workspace ?? process.cwd());
|
|
94
|
+
const args = ['compose'];
|
|
95
|
+
if (options.files) {
|
|
96
|
+
const files = Array.isArray(options.files) ? options.files : [options.files];
|
|
97
|
+
for (const f of files) {
|
|
98
|
+
args.push('-f', f);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
args.push('down');
|
|
102
|
+
if (options.flags) {
|
|
103
|
+
args.push(...options.flags);
|
|
104
|
+
}
|
|
105
|
+
ctx?.logger.info('Docker Compose down');
|
|
106
|
+
await shell.run({ cwd }) `docker ${args}`;
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=docker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/primitives/docker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const git: {
|
|
2
|
+
/** Return full SHA of current commit */
|
|
3
|
+
currentCommit(dir?: string): Promise<string>;
|
|
4
|
+
/** Return short SHA of current commit */
|
|
5
|
+
shortCommit(dir?: string): Promise<string>;
|
|
6
|
+
/** Return current checked-out branch name, or empty string if detached HEAD */
|
|
7
|
+
currentBranch(dir?: string): Promise<string>;
|
|
8
|
+
/** Check if working tree has untracked or uncommitted changes */
|
|
9
|
+
isDirty(dir?: string): Promise<boolean>;
|
|
10
|
+
/** Fetch latest changes from remote */
|
|
11
|
+
fetch(dir?: string, remote?: string, branch?: string): Promise<void>;
|
|
12
|
+
/** Hard reset to target (defaults to HEAD) */
|
|
13
|
+
resetHard(dir?: string, target?: string): Promise<void>;
|
|
14
|
+
/** Clean working tree */
|
|
15
|
+
clean(dir?: string, forceIgnored?: boolean): Promise<void>;
|
|
16
|
+
/** Switch or checkout a ref */
|
|
17
|
+
checkout(dir?: string, ref?: string): Promise<void>;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/primitives/git.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,GAAG;IACd,wCAAwC;wBACd,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMlD,yCAAyC;sBACjB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMhD,+EAA+E;wBACrD,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUlD,iEAAiE;kBAC7C,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM7C,uCAAuC;gBACrB,MAAM,4BAA8B,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5E,8CAA8C;oBACxB,MAAM,oBAAoB,OAAO,CAAC,IAAI,CAAC;IAU7D,yBAAyB;gBACP,MAAM,2BAAyB,OAAO,CAAC,IAAI,CAAC;IAW9D,+BAA+B;mBACV,MAAM,iBAAiB,OAAO,CAAC,IAAI,CAAC;CAS1D,CAAA"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
2
|
+
import { tryGetContext } from '../context/index.js';
|
|
3
|
+
function resolveDir(dir) {
|
|
4
|
+
if (dir)
|
|
5
|
+
return dir;
|
|
6
|
+
const ctx = tryGetContext();
|
|
7
|
+
return ctx?.workspace ?? process.cwd();
|
|
8
|
+
}
|
|
9
|
+
export const git = {
|
|
10
|
+
/** Return full SHA of current commit */
|
|
11
|
+
async currentCommit(dir) {
|
|
12
|
+
const cwd = resolveDir(dir);
|
|
13
|
+
const { stdout } = await execa('git', ['rev-parse', 'HEAD'], { cwd });
|
|
14
|
+
return stdout.trim();
|
|
15
|
+
},
|
|
16
|
+
/** Return short SHA of current commit */
|
|
17
|
+
async shortCommit(dir) {
|
|
18
|
+
const cwd = resolveDir(dir);
|
|
19
|
+
const { stdout } = await execa('git', ['rev-parse', '--short', 'HEAD'], { cwd });
|
|
20
|
+
return stdout.trim();
|
|
21
|
+
},
|
|
22
|
+
/** Return current checked-out branch name, or empty string if detached HEAD */
|
|
23
|
+
async currentBranch(dir) {
|
|
24
|
+
const cwd = resolveDir(dir);
|
|
25
|
+
try {
|
|
26
|
+
const { stdout } = await execa('git', ['symbolic-ref', '--short', 'HEAD'], { cwd });
|
|
27
|
+
return stdout.trim();
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return '';
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
/** Check if working tree has untracked or uncommitted changes */
|
|
34
|
+
async isDirty(dir) {
|
|
35
|
+
const cwd = resolveDir(dir);
|
|
36
|
+
const { stdout } = await execa('git', ['status', '--porcelain'], { cwd });
|
|
37
|
+
return stdout.trim().length > 0;
|
|
38
|
+
},
|
|
39
|
+
/** Fetch latest changes from remote */
|
|
40
|
+
async fetch(dir, remote = 'origin', branch) {
|
|
41
|
+
const cwd = resolveDir(dir);
|
|
42
|
+
const ctx = tryGetContext();
|
|
43
|
+
if (ctx?.dryRun) {
|
|
44
|
+
ctx.logger.info(`[DRY-RUN] git fetch ${remote} ${branch ?? ''}`);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const args = ['fetch', remote];
|
|
48
|
+
if (branch)
|
|
49
|
+
args.push(branch);
|
|
50
|
+
await execa('git', args, { cwd });
|
|
51
|
+
},
|
|
52
|
+
/** Hard reset to target (defaults to HEAD) */
|
|
53
|
+
async resetHard(dir, target = 'HEAD') {
|
|
54
|
+
const cwd = resolveDir(dir);
|
|
55
|
+
const ctx = tryGetContext();
|
|
56
|
+
if (ctx?.dryRun) {
|
|
57
|
+
ctx.logger.info(`[DRY-RUN] git reset --hard ${target}`);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
await execa('git', ['reset', '--hard', target], { cwd });
|
|
61
|
+
},
|
|
62
|
+
/** Clean working tree */
|
|
63
|
+
async clean(dir, forceIgnored = false) {
|
|
64
|
+
const cwd = resolveDir(dir);
|
|
65
|
+
const ctx = tryGetContext();
|
|
66
|
+
if (ctx?.dryRun) {
|
|
67
|
+
ctx.logger.info(`[DRY-RUN] git clean -fd${forceIgnored ? 'x' : ''}`);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const flags = forceIgnored ? ['clean', '-fdx'] : ['clean', '-fd'];
|
|
71
|
+
await execa('git', flags, { cwd });
|
|
72
|
+
},
|
|
73
|
+
/** Switch or checkout a ref */
|
|
74
|
+
async checkout(dir, ref = 'main') {
|
|
75
|
+
const cwd = resolveDir(dir);
|
|
76
|
+
const ctx = tryGetContext();
|
|
77
|
+
if (ctx?.dryRun) {
|
|
78
|
+
ctx.logger.info(`[DRY-RUN] git checkout ${ref}`);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
await execa('git', ['checkout', ref], { cwd });
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/primitives/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/primitives/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/primitives/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface RunOptions {
|
|
2
|
+
/** Working directory (defaults to context's active module or workspace) */
|
|
3
|
+
cwd?: string;
|
|
4
|
+
/** Extra environment variables merged over process and context env */
|
|
5
|
+
env?: Record<string, string>;
|
|
6
|
+
/** Reject promise on non-zero exit code (default: true) */
|
|
7
|
+
reject?: boolean;
|
|
8
|
+
/** Capture and return stdout / stderr */
|
|
9
|
+
capture?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface ShellOutputResult {
|
|
12
|
+
stdout: string;
|
|
13
|
+
stderr: string;
|
|
14
|
+
exitCode: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Tagged template runner signature.
|
|
18
|
+
*/
|
|
19
|
+
export interface TemplateRunner {
|
|
20
|
+
(template: TemplateStringsArray, ...values: unknown[]): Promise<ShellOutputResult>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* `shell.run` runner function supporting:
|
|
24
|
+
* 1. `shell.run`docker build -t ${img} .``
|
|
25
|
+
* 2. `shell.run({ cwd: '/app' })`docker build -t ${img} .``
|
|
26
|
+
*/
|
|
27
|
+
export declare function run(options: RunOptions): TemplateRunner;
|
|
28
|
+
export declare function run(template: TemplateStringsArray, ...values: unknown[]): Promise<ShellOutputResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Run a command string via the shell (supports pipes, redirects, &&, ||).
|
|
31
|
+
*/
|
|
32
|
+
export declare function sh(cmd: string, options?: RunOptions): Promise<ShellOutputResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Run a command and capture its stdout, stderr and exitCode without throwing on failure.
|
|
35
|
+
*/
|
|
36
|
+
export declare function output(cmd: string, options?: RunOptions): Promise<ShellOutputResult>;
|
|
37
|
+
export declare const shell: {
|
|
38
|
+
run: typeof run;
|
|
39
|
+
sh: typeof sh;
|
|
40
|
+
output: typeof output;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/primitives/shell.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,UAAU;IACzB,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,2DAA2D;IAC3D,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,yCAAyC;IACzC,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AA4GD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;CACnF;AAED;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,cAAc,CAAA;AACxD,wBAAgB,GAAG,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AA4BrG;;GAEG;AACH,wBAAsB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAE1F;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAE9F;AAED,eAAO,MAAM,KAAK;;;;CAIjB,CAAA"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import { execa } from 'execa';
|
|
4
|
+
import { tryGetContext } from '../context/index.js';
|
|
5
|
+
import { templateToArgv } from '../utils/template.js';
|
|
6
|
+
import { isSecretKey, maskString } from '../utils/mask.js';
|
|
7
|
+
function resolveCwd(explicitCwd) {
|
|
8
|
+
if (explicitCwd)
|
|
9
|
+
return explicitCwd;
|
|
10
|
+
const ctx = tryGetContext();
|
|
11
|
+
if (ctx) {
|
|
12
|
+
if (ctx.moduleFolder) {
|
|
13
|
+
return path.resolve(ctx.workspace, ctx.moduleFolder);
|
|
14
|
+
}
|
|
15
|
+
if (ctx.workspace) {
|
|
16
|
+
return ctx.workspace;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return process.cwd();
|
|
20
|
+
}
|
|
21
|
+
function resolveEnv(explicitEnv) {
|
|
22
|
+
const ctx = tryGetContext();
|
|
23
|
+
const base = { ...process.env };
|
|
24
|
+
if (ctx?.env) {
|
|
25
|
+
Object.assign(base, ctx.env);
|
|
26
|
+
}
|
|
27
|
+
if (explicitEnv) {
|
|
28
|
+
Object.assign(base, explicitEnv);
|
|
29
|
+
}
|
|
30
|
+
return base;
|
|
31
|
+
}
|
|
32
|
+
function getSecretValues() {
|
|
33
|
+
const ctx = tryGetContext();
|
|
34
|
+
if (!ctx?.env)
|
|
35
|
+
return [];
|
|
36
|
+
const secrets = [];
|
|
37
|
+
for (const [k, v] of Object.entries(ctx.env)) {
|
|
38
|
+
if (isSecretKey(k) && typeof v === 'string' && v.length >= 3) {
|
|
39
|
+
secrets.push(v);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return secrets;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Execute command via execa, piping output and handling dryRun.
|
|
46
|
+
*/
|
|
47
|
+
async function executeInternal(fileOrCmd, args, options) {
|
|
48
|
+
const ctx = tryGetContext();
|
|
49
|
+
const cwd = resolveCwd(options.cwd);
|
|
50
|
+
const env = resolveEnv(options.env);
|
|
51
|
+
const secrets = getSecretValues();
|
|
52
|
+
const cmdDisplay = args ? [fileOrCmd, ...args].join(' ') : fileOrCmd;
|
|
53
|
+
// Dry-run interception
|
|
54
|
+
if (ctx?.dryRun) {
|
|
55
|
+
const maskedCmd = maskString(cmdDisplay, secrets);
|
|
56
|
+
ctx.logger.info(`[DRY-RUN] Executing: ${maskedCmd} (cwd: ${cwd})`);
|
|
57
|
+
return {
|
|
58
|
+
stdout: `[DRY-RUN] ${maskedCmd}`,
|
|
59
|
+
stderr: '',
|
|
60
|
+
exitCode: 0
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const execaOpts = {
|
|
64
|
+
cwd,
|
|
65
|
+
env,
|
|
66
|
+
reject: options.reject ?? true,
|
|
67
|
+
shell: options.isShell ?? false
|
|
68
|
+
};
|
|
69
|
+
// If a log file is defined in the context, write to it
|
|
70
|
+
let logStream;
|
|
71
|
+
if (ctx?.logFile) {
|
|
72
|
+
try {
|
|
73
|
+
logStream = fs.createWriteStream(ctx.logFile, { flags: 'a' });
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Ignored if unable to open log file
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const subprocess = args
|
|
81
|
+
? execa(fileOrCmd, args, execaOpts)
|
|
82
|
+
: execa(fileOrCmd, execaOpts);
|
|
83
|
+
if (subprocess.stdout && logStream) {
|
|
84
|
+
subprocess.stdout.pipe(logStream, { end: false });
|
|
85
|
+
}
|
|
86
|
+
if (subprocess.stderr && logStream) {
|
|
87
|
+
subprocess.stderr.pipe(logStream, { end: false });
|
|
88
|
+
}
|
|
89
|
+
const result = await subprocess;
|
|
90
|
+
return {
|
|
91
|
+
stdout: typeof result.stdout === 'string' ? result.stdout : (result.stdout ? String(result.stdout) : ''),
|
|
92
|
+
stderr: typeof result.stderr === 'string' ? result.stderr : (result.stderr ? String(result.stderr) : ''),
|
|
93
|
+
exitCode: result.exitCode ?? 0
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
if (logStream) {
|
|
98
|
+
logStream.end();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export function run(templateOrOptions, ...values) {
|
|
103
|
+
// Overload 2: options passed first, returns a TemplateRunner
|
|
104
|
+
if (!Array.isArray(templateOrOptions) || !('raw' in templateOrOptions)) {
|
|
105
|
+
const options = templateOrOptions ?? {};
|
|
106
|
+
return async (template, ...innerValues) => {
|
|
107
|
+
const argv = templateToArgv(template, innerValues);
|
|
108
|
+
if (argv.length === 0) {
|
|
109
|
+
throw new Error('Command is empty');
|
|
110
|
+
}
|
|
111
|
+
const [cmd, ...args] = argv;
|
|
112
|
+
return executeInternal(cmd, args, options);
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// Overload 1: direct tagged template
|
|
116
|
+
const template = templateOrOptions;
|
|
117
|
+
const argv = templateToArgv(template, values);
|
|
118
|
+
if (argv.length === 0) {
|
|
119
|
+
throw new Error('Command is empty');
|
|
120
|
+
}
|
|
121
|
+
const [cmd, ...args] = argv;
|
|
122
|
+
return executeInternal(cmd, args, {});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Run a command string via the shell (supports pipes, redirects, &&, ||).
|
|
126
|
+
*/
|
|
127
|
+
export async function sh(cmd, options = {}) {
|
|
128
|
+
return executeInternal(cmd, undefined, { ...options, isShell: true });
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Run a command and capture its stdout, stderr and exitCode without throwing on failure.
|
|
132
|
+
*/
|
|
133
|
+
export async function output(cmd, options = {}) {
|
|
134
|
+
return executeInternal(cmd, undefined, { ...options, isShell: true, reject: false, capture: true });
|
|
135
|
+
}
|
|
136
|
+
export const shell = {
|
|
137
|
+
run,
|
|
138
|
+
sh,
|
|
139
|
+
output
|
|
140
|
+
};
|
|
141
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/primitives/shell.ts"],"names":[],"mappings":"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"}
|