@sidekick-coder/zenith-kit 0.0.4 → 0.0.6
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/commands/release.js +1 -1
- package/dist/server/index.d.mts +154 -0
- package/dist/server/index.mjs +47 -11
- package/dist/shared/index.d.mts +110 -0
- package/package.json +1 -1
package/commands/release.js
CHANGED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { ChildProcess } from "node:child_process";
|
|
2
|
+
|
|
3
|
+
//#region src/server/gateways/GitGateway.d.ts
|
|
4
|
+
interface GitRepoInfo {
|
|
5
|
+
directory: string;
|
|
6
|
+
head: string | null;
|
|
7
|
+
shortHash: string;
|
|
8
|
+
isDetachedHead: boolean;
|
|
9
|
+
remotes: string[];
|
|
10
|
+
}
|
|
11
|
+
interface GitGatewayOptions {
|
|
12
|
+
cwd: string;
|
|
13
|
+
sshKey?: string;
|
|
14
|
+
sshKeyFile?: string;
|
|
15
|
+
sshKeyTmpFileName?: string;
|
|
16
|
+
}
|
|
17
|
+
declare class GitGateway {
|
|
18
|
+
private readonly cwd;
|
|
19
|
+
private readonly sshKey?;
|
|
20
|
+
private readonly sshKeyFile?;
|
|
21
|
+
private readonly sshKeyTmpFileName?;
|
|
22
|
+
constructor({
|
|
23
|
+
cwd,
|
|
24
|
+
sshKey,
|
|
25
|
+
sshKeyFile,
|
|
26
|
+
sshKeyTmpFileName
|
|
27
|
+
}: GitGatewayOptions);
|
|
28
|
+
private buildEnv;
|
|
29
|
+
run(args: string): Promise<string>;
|
|
30
|
+
tryRun(args: string): Promise<string | null>;
|
|
31
|
+
checkout(ref: string): Promise<void>;
|
|
32
|
+
fetch(): Promise<void>;
|
|
33
|
+
pull(): Promise<void>;
|
|
34
|
+
getInfo(): Promise<GitRepoInfo>;
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
//#region src/server/services/GitBranchRepository.d.ts
|
|
38
|
+
interface GitBranch {
|
|
39
|
+
name: string;
|
|
40
|
+
remote: string | null;
|
|
41
|
+
isCurrent: boolean;
|
|
42
|
+
isRemote: boolean;
|
|
43
|
+
}
|
|
44
|
+
interface GitBranchFetchOptions {
|
|
45
|
+
remote: string;
|
|
46
|
+
branch: string;
|
|
47
|
+
localName?: string;
|
|
48
|
+
}
|
|
49
|
+
declare class GitBranchRepository {
|
|
50
|
+
private readonly gateway;
|
|
51
|
+
constructor(gateway: GitGateway);
|
|
52
|
+
list(): Promise<GitBranch[]>;
|
|
53
|
+
fetch(options: GitBranchFetchOptions): Promise<void>;
|
|
54
|
+
}
|
|
55
|
+
//#endregion
|
|
56
|
+
//#region src/server/services/GitCommitRepository.d.ts
|
|
57
|
+
interface GitCommitRef {
|
|
58
|
+
name: string;
|
|
59
|
+
shortName: string;
|
|
60
|
+
type: 'branch' | 'tag' | 'remote' | 'other';
|
|
61
|
+
}
|
|
62
|
+
interface GitCommit {
|
|
63
|
+
hash: string;
|
|
64
|
+
shortHash: string;
|
|
65
|
+
authorName: string;
|
|
66
|
+
authorEmail: string;
|
|
67
|
+
date: string;
|
|
68
|
+
message: string;
|
|
69
|
+
refs: GitCommitRef[];
|
|
70
|
+
}
|
|
71
|
+
interface GitCommitListOptions {
|
|
72
|
+
branch?: string;
|
|
73
|
+
page?: number;
|
|
74
|
+
perPage?: number;
|
|
75
|
+
}
|
|
76
|
+
interface PaginatedCommits {
|
|
77
|
+
items: GitCommit[];
|
|
78
|
+
total: number;
|
|
79
|
+
page: number;
|
|
80
|
+
perPage: number;
|
|
81
|
+
totalPages: number;
|
|
82
|
+
}
|
|
83
|
+
declare class GitCommitRepository {
|
|
84
|
+
private readonly gateway;
|
|
85
|
+
constructor(gateway: GitGateway);
|
|
86
|
+
list(options?: GitCommitListOptions): Promise<PaginatedCommits>;
|
|
87
|
+
}
|
|
88
|
+
//#endregion
|
|
89
|
+
//#region src/server/services/PluginIpcClient.d.ts
|
|
90
|
+
type IpcMessage<T = any> = {
|
|
91
|
+
id: string;
|
|
92
|
+
event: string;
|
|
93
|
+
data: T;
|
|
94
|
+
};
|
|
95
|
+
type IpcListener$1<T = any> = (data: T) => void;
|
|
96
|
+
declare class PluginIpcClient {
|
|
97
|
+
private listeners;
|
|
98
|
+
constructor();
|
|
99
|
+
on<T = any>(event: string, callback: IpcListener$1<T>): void;
|
|
100
|
+
off<T = any>(event: string, callback: IpcListener$1<T>): void;
|
|
101
|
+
emit<T = any>(event: string, data?: T): string;
|
|
102
|
+
}
|
|
103
|
+
//#endregion
|
|
104
|
+
//#region src/server/services/PluginIpcHost.d.ts
|
|
105
|
+
type IpcListener<T = any> = (data: T) => void;
|
|
106
|
+
declare class PluginIpcHost {
|
|
107
|
+
private readonly child;
|
|
108
|
+
private listeners;
|
|
109
|
+
constructor(child: ChildProcess);
|
|
110
|
+
on<T = any>(event: string, callback: IpcListener<T>): void;
|
|
111
|
+
off<T = any>(event: string, callback: IpcListener<T>): void;
|
|
112
|
+
emit<T = any>(event: string, data?: T): string;
|
|
113
|
+
}
|
|
114
|
+
//#endregion
|
|
115
|
+
//#region src/server/services/PluginRouter.d.ts
|
|
116
|
+
type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
117
|
+
interface RouteDefinition {
|
|
118
|
+
method: HttpMethod;
|
|
119
|
+
path: string;
|
|
120
|
+
}
|
|
121
|
+
interface RouteRequest {
|
|
122
|
+
requestId: string;
|
|
123
|
+
method: HttpMethod;
|
|
124
|
+
path: string;
|
|
125
|
+
body?: any;
|
|
126
|
+
headers?: Record<string, string>;
|
|
127
|
+
query?: Record<string, string>;
|
|
128
|
+
params?: Record<string, string>;
|
|
129
|
+
}
|
|
130
|
+
interface RouteResponsePayload {
|
|
131
|
+
requestId: string;
|
|
132
|
+
status: number;
|
|
133
|
+
body?: any;
|
|
134
|
+
headers?: Record<string, string>;
|
|
135
|
+
}
|
|
136
|
+
interface RouteReply {
|
|
137
|
+
status(code: number): RouteReply;
|
|
138
|
+
send(body?: any): void;
|
|
139
|
+
}
|
|
140
|
+
type RouteHandler = (req: RouteRequest, reply: RouteReply) => void | Promise<void>;
|
|
141
|
+
declare class PluginRouter {
|
|
142
|
+
private readonly client;
|
|
143
|
+
private routes;
|
|
144
|
+
constructor(client: PluginIpcClient);
|
|
145
|
+
private dispatch;
|
|
146
|
+
private register;
|
|
147
|
+
get(path: string, handler: RouteHandler): void;
|
|
148
|
+
post(path: string, handler: RouteHandler): void;
|
|
149
|
+
put(path: string, handler: RouteHandler): void;
|
|
150
|
+
patch(path: string, handler: RouteHandler): void;
|
|
151
|
+
delete(path: string, handler: RouteHandler): void;
|
|
152
|
+
}
|
|
153
|
+
//#endregion
|
|
154
|
+
export { GitBranch, GitBranchFetchOptions, GitBranchRepository, GitCommit, GitCommitListOptions, GitCommitRef, GitCommitRepository, GitGateway, GitGatewayOptions, GitRepoInfo, HttpMethod, IpcMessage, PaginatedCommits, PluginIpcClient, PluginIpcHost, PluginRouter, RouteDefinition, RouteHandler, RouteReply, RouteRequest, RouteResponsePayload };
|
package/dist/server/index.mjs
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { exec } from "node:child_process";
|
|
2
2
|
import { promisify } from "node:util";
|
|
3
|
+
import { unlink, writeFile } from "node:fs/promises";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { randomUUID } from "node:crypto";
|
|
3
7
|
//#region src/server/services/GitBranchRepository.ts
|
|
4
8
|
var GitBranchRepository = class {
|
|
5
9
|
constructor(gateway) {
|
|
@@ -280,20 +284,52 @@ function escapeShellArgument(value) {
|
|
|
280
284
|
}
|
|
281
285
|
var GitGateway = class {
|
|
282
286
|
cwd;
|
|
283
|
-
|
|
284
|
-
|
|
287
|
+
sshKey;
|
|
288
|
+
sshKeyFile;
|
|
289
|
+
sshKeyTmpFileName;
|
|
290
|
+
constructor({ cwd, sshKey, sshKeyFile, sshKeyTmpFileName }) {
|
|
285
291
|
this.cwd = cwd;
|
|
286
|
-
this.
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
292
|
+
this.sshKey = sshKey;
|
|
293
|
+
this.sshKeyFile = sshKeyFile;
|
|
294
|
+
this.sshKeyTmpFileName = sshKeyTmpFileName;
|
|
295
|
+
}
|
|
296
|
+
async buildEnv() {
|
|
297
|
+
if (this.sshKeyFile) return {
|
|
298
|
+
env: {
|
|
299
|
+
...process.env,
|
|
300
|
+
GIT_SSH_COMMAND: `ssh -i ${escapeShellArgument(this.sshKeyFile)} -o StrictHostKeyChecking=no`
|
|
301
|
+
},
|
|
302
|
+
cleanup: async () => {}
|
|
303
|
+
};
|
|
304
|
+
if (this.sshKey) {
|
|
305
|
+
const tempFile = this.sshKeyTmpFileName ?? join(tmpdir(), `git-ssh-key-${randomUUID()}`);
|
|
306
|
+
await writeFile(tempFile, this.sshKey, { mode: 384 });
|
|
307
|
+
return {
|
|
308
|
+
env: {
|
|
309
|
+
...process.env,
|
|
310
|
+
GIT_SSH_COMMAND: `ssh -i ${escapeShellArgument(tempFile)} -o StrictHostKeyChecking=no`
|
|
311
|
+
},
|
|
312
|
+
cleanup: async () => {
|
|
313
|
+
await unlink(tempFile).catch(() => {});
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
return {
|
|
318
|
+
env: process.env,
|
|
319
|
+
cleanup: async () => {}
|
|
320
|
+
};
|
|
290
321
|
}
|
|
291
322
|
async run(args) {
|
|
292
|
-
const {
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
323
|
+
const { env, cleanup } = await this.buildEnv();
|
|
324
|
+
try {
|
|
325
|
+
const { stdout } = await execAsync(`git ${args}`, {
|
|
326
|
+
cwd: this.cwd,
|
|
327
|
+
env
|
|
328
|
+
});
|
|
329
|
+
return stdout.trim();
|
|
330
|
+
} finally {
|
|
331
|
+
await cleanup();
|
|
332
|
+
}
|
|
297
333
|
}
|
|
298
334
|
async tryRun(args) {
|
|
299
335
|
try {
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
|
|
3
|
+
//#region src/shared/services/LoggerService.d.ts
|
|
4
|
+
declare class LoggerService {
|
|
5
|
+
info(message: string, meta?: any): void;
|
|
6
|
+
debug(message: string, meta?: any): void;
|
|
7
|
+
warn(message: string, meta?: any): void;
|
|
8
|
+
error(message: string, meta?: any): void;
|
|
9
|
+
child(options: any): LoggerService;
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
//#region src/shared/services/EmmitterService.d.ts
|
|
13
|
+
interface EmmitterServiceOptions {
|
|
14
|
+
debug?: boolean;
|
|
15
|
+
logger?: LoggerService;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
//#region src/shared/utils/typing.d.ts
|
|
19
|
+
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
|
|
20
|
+
type PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
|
|
21
|
+
type PublicData<T> = { [K in keyof T as T[K] extends Function ? never : K]: T[K] };
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/shared/utils/compose.d.ts
|
|
24
|
+
type AnyClass = new (...args: any[]) => any;
|
|
25
|
+
type Constructor<T = {}> = new (...args: any[]) => T;
|
|
26
|
+
type Mixin<T> = (base: Constructor) => Constructor<T>;
|
|
27
|
+
/**
|
|
28
|
+
* Composes multiple mixins into a single class that can be extended.
|
|
29
|
+
* Allows for multiple inheritance-like behavior by applying mixins sequentially.
|
|
30
|
+
*
|
|
31
|
+
* @param mixins - Array of mixin functions to compose
|
|
32
|
+
* @returns A class constructor that includes all mixin functionality
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* class User extends compose(Timestamp, SoftDelete) {
|
|
37
|
+
* constructor(public name: string) {
|
|
38
|
+
* super()
|
|
39
|
+
* }
|
|
40
|
+
* }
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
declare function compose<M extends Array<(base: Constructor<any>) => Constructor<any>>>(...mixins: M): UnionToIntersection<ReturnType<M[number]>>;
|
|
44
|
+
/**
|
|
45
|
+
* Alternative compose function that starts with a base class
|
|
46
|
+
*
|
|
47
|
+
* @param baseClass - The base class to start with
|
|
48
|
+
* @param mixins - Array of mixin functions to apply
|
|
49
|
+
* @returns A class constructor that extends the base class with all mixin functionality
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* class User extends composeWith(BaseEntity, Timestamp, SoftDelete) {
|
|
54
|
+
* constructor(public name: string) {
|
|
55
|
+
* super()
|
|
56
|
+
* }
|
|
57
|
+
* }
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
declare function composeWith<TBase extends Constructor, M extends Array<(base: Constructor) => Constructor<any>>>(baseClass: TBase, ...mixins: M): TBase & UnionToIntersection<ReturnType<M[number]>>;
|
|
61
|
+
declare function mixin<TBase extends Constructor>(Source: TBase): <TTarget extends Constructor>(Target: TTarget) => TTarget & TBase;
|
|
62
|
+
//#endregion
|
|
63
|
+
//#region src/shared/services/ValidatorService.d.ts
|
|
64
|
+
type Valibot = typeof v;
|
|
65
|
+
type ValibotSchema = v.BaseSchema<unknown, unknown, v.BaseIssue<unknown>>;
|
|
66
|
+
type ValibotSchemaAsync = v.BaseSchemaAsync<unknown, unknown, v.BaseIssue<unknown>>;
|
|
67
|
+
interface ValidatorCallback<T extends ValibotSchema> {
|
|
68
|
+
(_v: typeof v): T;
|
|
69
|
+
}
|
|
70
|
+
type ValidatorCallbackAsync<T extends ValibotSchemaAsync> = {
|
|
71
|
+
(_v: typeof v): T;
|
|
72
|
+
};
|
|
73
|
+
type ValidatorResult<T extends v.ObjectEntries> = v.InferOutput<v.ObjectSchema<T, undefined>>;
|
|
74
|
+
type ValidatePayload<T extends ValibotSchema = ValibotSchema> = ValidatorCallback<T> | T;
|
|
75
|
+
type ValidateResult<T extends ValidatePayload> = T extends ValibotSchema ? v.InferOutput<T> : T extends ValidatorCallback<infer U> ? v.InferOutput<U> : unknown;
|
|
76
|
+
declare class ValidatorService {
|
|
77
|
+
create<T extends ValibotSchema>(cb: ValidatorCallback<T>): T;
|
|
78
|
+
validate<T extends ValibotSchema>(payload: any, cb: ValidatePayload<T>): v.InferOutput<T>;
|
|
79
|
+
validateAsync<T extends ValibotSchemaAsync>(payload: any, cb: ValidatorCallbackAsync<T> | T): Promise<v.InferOutput<T>>;
|
|
80
|
+
isValid<T extends ValibotSchema>(payload: any, cb: ValidatePayload<T>): boolean;
|
|
81
|
+
}
|
|
82
|
+
//#endregion
|
|
83
|
+
//#region src/shared/utils/createId.d.ts
|
|
84
|
+
declare function createId(prefix?: string): string;
|
|
85
|
+
//#endregion
|
|
86
|
+
//#region src/shared/utils/flatten.d.ts
|
|
87
|
+
declare function flatten(obj: any, prefix?: string, res?: any): Record<string, any>;
|
|
88
|
+
declare function unflatten(obj: any): Record<string, any>;
|
|
89
|
+
//#endregion
|
|
90
|
+
//#region src/shared/utils/formatBytes.d.ts
|
|
91
|
+
declare function formatBytes(bytes: number, decimals?: number): string;
|
|
92
|
+
//#endregion
|
|
93
|
+
//#region src/shared/utils/generateIndexFile.d.ts
|
|
94
|
+
declare function generateIndexFile(options: any): void;
|
|
95
|
+
//#endregion
|
|
96
|
+
//#region src/shared/utils/tryCatch.d.ts
|
|
97
|
+
interface Tryer {
|
|
98
|
+
(...args: any[]): any;
|
|
99
|
+
}
|
|
100
|
+
interface TryerAsync {
|
|
101
|
+
(...args: any[]): Promise<any> | any;
|
|
102
|
+
}
|
|
103
|
+
type TryCatchResult<T extends Tryer> = [null, ReturnType<T>] | [Error, null];
|
|
104
|
+
type TryCatchAsyncResult<T extends TryerAsync> = [null, Awaited<ReturnType<T>>] | [Error, null];
|
|
105
|
+
declare function tryCatch<T extends TryerAsync>(tryer: T): Promise<TryCatchAsyncResult<T>>;
|
|
106
|
+
declare namespace tryCatch {
|
|
107
|
+
var sync: <T extends Tryer>(tryer: T) => TryCatchResult<T>;
|
|
108
|
+
}
|
|
109
|
+
//#endregion
|
|
110
|
+
export { AnyClass, Constructor, EmmitterServiceOptions, Mixin, PartialBy, PublicData, UnionToIntersection, Valibot, ValibotSchema, ValibotSchemaAsync, ValidatePayload, ValidateResult, ValidatorCallback, ValidatorCallbackAsync, ValidatorResult, ValidatorService, compose, composeWith, createId, flatten, formatBytes, generateIndexFile, mixin, tryCatch, unflatten };
|