@generacy-ai/generacy-plugin-cloud-build 0.0.0-preview-20260304013206
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/LICENSE +191 -0
- package/README.md +228 -0
- package/dist/auth/auth-provider.d.ts +26 -0
- package/dist/auth/auth-provider.d.ts.map +1 -0
- package/dist/auth/auth-provider.js +72 -0
- package/dist/auth/auth-provider.js.map +1 -0
- package/dist/auth/types.d.ts +26 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +5 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/client.d.ts +43 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +87 -0
- package/dist/client.js.map +1 -0
- package/dist/config/schema.d.ts +73 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +32 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/types.d.ts +30 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +11 -0
- package/dist/config/types.js.map +1 -0
- package/dist/errors.d.ts +75 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +144 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/operations/artifacts.d.ts +35 -0
- package/dist/operations/artifacts.d.ts.map +1 -0
- package/dist/operations/artifacts.js +168 -0
- package/dist/operations/artifacts.js.map +1 -0
- package/dist/operations/builds.d.ts +91 -0
- package/dist/operations/builds.d.ts.map +1 -0
- package/dist/operations/builds.js +397 -0
- package/dist/operations/builds.js.map +1 -0
- package/dist/operations/logs.d.ts +56 -0
- package/dist/operations/logs.d.ts.map +1 -0
- package/dist/operations/logs.js +207 -0
- package/dist/operations/logs.js.map +1 -0
- package/dist/operations/triggers.d.ts +76 -0
- package/dist/operations/triggers.d.ts.map +1 -0
- package/dist/operations/triggers.js +308 -0
- package/dist/operations/triggers.js.map +1 -0
- package/dist/plugin.d.ts +156 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +270 -0
- package/dist/plugin.js.map +1 -0
- package/dist/streaming/log-stream.d.ts +34 -0
- package/dist/streaming/log-stream.d.ts.map +1 -0
- package/dist/streaming/log-stream.js +89 -0
- package/dist/streaming/log-stream.js.map +1 -0
- package/dist/streaming/types.d.ts +27 -0
- package/dist/streaming/types.d.ts.map +1 -0
- package/dist/streaming/types.js +6 -0
- package/dist/streaming/types.js.map +1 -0
- package/dist/types/artifacts.d.ts +46 -0
- package/dist/types/artifacts.d.ts.map +1 -0
- package/dist/types/artifacts.js +6 -0
- package/dist/types/artifacts.js.map +1 -0
- package/dist/types/builds.d.ts +134 -0
- package/dist/types/builds.d.ts.map +1 -0
- package/dist/types/builds.js +5 -0
- package/dist/types/builds.js.map +1 -0
- package/dist/types/logs.d.ts +18 -0
- package/dist/types/logs.d.ts.map +1 -0
- package/dist/types/logs.js +5 -0
- package/dist/types/logs.js.map +1 -0
- package/dist/types/triggers.d.ts +71 -0
- package/dist/types/triggers.d.ts.map +1 -0
- package/dist/types/triggers.js +5 -0
- package/dist/types/triggers.js.map +1 -0
- package/dist/utils/retry.d.ts +41 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +107 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/validation.d.ts +53 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +75 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builds.js","sourceRoot":"","sources":["../../src/types/builds.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Log-related types for the Cloud Build plugin.
|
|
3
|
+
*/
|
|
4
|
+
export type LogSeverity = 'DEFAULT' | 'DEBUG' | 'INFO' | 'NOTICE' | 'WARNING' | 'ERROR' | 'CRITICAL' | 'ALERT' | 'EMERGENCY';
|
|
5
|
+
export interface LogEntry {
|
|
6
|
+
timestamp: Date;
|
|
7
|
+
severity: LogSeverity;
|
|
8
|
+
message: string;
|
|
9
|
+
stepId?: string;
|
|
10
|
+
textPayload?: string;
|
|
11
|
+
jsonPayload?: Record<string, unknown>;
|
|
12
|
+
insertId?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface LogStreamOptions {
|
|
15
|
+
pollingIntervalMs?: number;
|
|
16
|
+
startOffset?: number;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=logs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/types/logs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,WAAW,GACnB,SAAS,GACT,OAAO,GACP,MAAM,GACN,QAAQ,GACR,SAAS,GACT,OAAO,GACP,UAAU,GACV,OAAO,GACP,WAAW,CAAC;AAEhB,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,WAAW,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/types/logs.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trigger-related types for the Cloud Build plugin.
|
|
3
|
+
*/
|
|
4
|
+
import type { BuildConfig, RepoSource } from './builds.js';
|
|
5
|
+
export interface PullRequestFilter {
|
|
6
|
+
branch: string;
|
|
7
|
+
commentControl?: 'COMMENTS_DISABLED' | 'COMMENTS_ENABLED' | 'COMMENTS_ENABLED_FOR_EXTERNAL_CONTRIBUTORS_ONLY';
|
|
8
|
+
invertRegex?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface PushFilter {
|
|
11
|
+
branch?: string;
|
|
12
|
+
tag?: string;
|
|
13
|
+
invertRegex?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface GitHubConfig {
|
|
16
|
+
owner: string;
|
|
17
|
+
name: string;
|
|
18
|
+
pullRequest?: PullRequestFilter;
|
|
19
|
+
push?: PushFilter;
|
|
20
|
+
installationId?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface PubsubConfig {
|
|
23
|
+
subscription: string;
|
|
24
|
+
topic?: string;
|
|
25
|
+
serviceAccountEmail?: string;
|
|
26
|
+
state?: 'STATE_UNSPECIFIED' | 'OK' | 'SUBSCRIPTION_DELETED' | 'TOPIC_DELETED' | 'SUBSCRIPTION_MISCONFIGURED';
|
|
27
|
+
}
|
|
28
|
+
export interface WebhookConfig {
|
|
29
|
+
secret: string;
|
|
30
|
+
state?: 'STATE_UNSPECIFIED' | 'OK' | 'SECRET_DELETED';
|
|
31
|
+
}
|
|
32
|
+
export interface GitRepoSource {
|
|
33
|
+
uri: string;
|
|
34
|
+
ref?: string;
|
|
35
|
+
repoType?: 'UNKNOWN' | 'CLOUD_SOURCE_REPOSITORIES' | 'GITHUB' | 'BITBUCKET_SERVER' | 'GITLAB';
|
|
36
|
+
}
|
|
37
|
+
export interface BuildTrigger {
|
|
38
|
+
id: string;
|
|
39
|
+
name: string;
|
|
40
|
+
description?: string;
|
|
41
|
+
disabled: boolean;
|
|
42
|
+
createTime: Date;
|
|
43
|
+
tags?: string[];
|
|
44
|
+
triggerTemplate?: RepoSource;
|
|
45
|
+
github?: GitHubConfig;
|
|
46
|
+
pubsubConfig?: PubsubConfig;
|
|
47
|
+
webhookConfig?: WebhookConfig;
|
|
48
|
+
autodetect?: boolean;
|
|
49
|
+
build?: BuildConfig;
|
|
50
|
+
filename?: string;
|
|
51
|
+
filter?: string;
|
|
52
|
+
sourceToBuild?: GitRepoSource;
|
|
53
|
+
serviceAccount?: string;
|
|
54
|
+
includeBuildLogs?: 'INCLUDE_BUILD_LOGS_UNSPECIFIED' | 'INCLUDE_BUILD_LOGS_WITH_STATUS';
|
|
55
|
+
}
|
|
56
|
+
export interface TriggerConfig {
|
|
57
|
+
name: string;
|
|
58
|
+
description?: string;
|
|
59
|
+
disabled?: boolean;
|
|
60
|
+
tags?: string[];
|
|
61
|
+
triggerTemplate?: RepoSource;
|
|
62
|
+
github?: GitHubConfig;
|
|
63
|
+
includedFiles?: string[];
|
|
64
|
+
ignoredFiles?: string[];
|
|
65
|
+
substitutions?: Record<string, string>;
|
|
66
|
+
build?: BuildConfig;
|
|
67
|
+
filename?: string;
|
|
68
|
+
filter?: string;
|
|
69
|
+
serviceAccount?: string;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=triggers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../src/types/triggers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,mBAAmB,GAAG,kBAAkB,GAAG,iDAAiD,CAAC;IAC9G,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,mBAAmB,GAAG,IAAI,GAAG,sBAAsB,GAAG,eAAe,GAAG,4BAA4B,CAAC;CAC9G;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,mBAAmB,GAAG,IAAI,GAAG,gBAAgB,CAAC;CACvD;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,SAAS,GAAG,2BAA2B,GAAG,QAAQ,GAAG,kBAAkB,GAAG,QAAQ,CAAC;CAC/F;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,IAAI,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,CAAC,EAAE,UAAU,CAAC;IAC7B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,gCAAgC,GAAG,gCAAgC,CAAC;CACxF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,CAAC,EAAE,UAAU,CAAC;IAC7B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggers.js","sourceRoot":"","sources":["../../src/types/triggers.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry utility with exponential backoff and jitter.
|
|
3
|
+
*
|
|
4
|
+
* Parameters:
|
|
5
|
+
* - Initial delay: 1000ms
|
|
6
|
+
* - Max delay: 30000ms
|
|
7
|
+
* - Max attempts: 3
|
|
8
|
+
* - Jitter: ±20%
|
|
9
|
+
*
|
|
10
|
+
* Formula: delay = min(maxDelay, initialDelay * 2^attempt) * (0.8 + random() * 0.4)
|
|
11
|
+
*/
|
|
12
|
+
import type { RetryConfig } from '../config/types.js';
|
|
13
|
+
export interface RetryOptions extends RetryConfig {
|
|
14
|
+
shouldRetry?: (error: unknown) => boolean;
|
|
15
|
+
onRetry?: (error: unknown, attempt: number, delayMs: number) => void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Calculate delay with exponential backoff and jitter.
|
|
19
|
+
*/
|
|
20
|
+
export declare function calculateDelay(attempt: number, initialDelayMs: number, maxDelayMs: number): number;
|
|
21
|
+
/**
|
|
22
|
+
* Sleep for a specified duration.
|
|
23
|
+
*/
|
|
24
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Execute a function with retry logic.
|
|
27
|
+
*/
|
|
28
|
+
export declare function withRetry<T>(fn: () => Promise<T>, options?: Partial<RetryOptions>): Promise<T>;
|
|
29
|
+
/**
|
|
30
|
+
* Create a retry wrapper with pre-configured options.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createRetryWrapper(config: RetryConfig): <T>(fn: () => Promise<T>) => Promise<T>;
|
|
33
|
+
/**
|
|
34
|
+
* Check if an error is retryable based on HTTP/gRPC status codes.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isRetryableStatusCode(statusCode: number): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Enhanced retry check that considers both CloudBuildError and status codes.
|
|
39
|
+
*/
|
|
40
|
+
export declare function shouldRetryError(error: unknown): boolean;
|
|
41
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAC1C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtE;AAUD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,GACjB,MAAM,CAWR;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GAClC,OAAO,CAAC,CAAC,CAAC,CAiCZ;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAE/F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAYjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAcxD"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry utility with exponential backoff and jitter.
|
|
3
|
+
*
|
|
4
|
+
* Parameters:
|
|
5
|
+
* - Initial delay: 1000ms
|
|
6
|
+
* - Max delay: 30000ms
|
|
7
|
+
* - Max attempts: 3
|
|
8
|
+
* - Jitter: ±20%
|
|
9
|
+
*
|
|
10
|
+
* Formula: delay = min(maxDelay, initialDelay * 2^attempt) * (0.8 + random() * 0.4)
|
|
11
|
+
*/
|
|
12
|
+
import { isTransientError, CloudBuildError } from '../errors.js';
|
|
13
|
+
const DEFAULT_RETRY_OPTIONS = {
|
|
14
|
+
maxAttempts: 3,
|
|
15
|
+
initialDelayMs: 1000,
|
|
16
|
+
maxDelayMs: 30000,
|
|
17
|
+
shouldRetry: isTransientError,
|
|
18
|
+
onRetry: () => { },
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Calculate delay with exponential backoff and jitter.
|
|
22
|
+
*/
|
|
23
|
+
export function calculateDelay(attempt, initialDelayMs, maxDelayMs) {
|
|
24
|
+
// Exponential backoff: initialDelay * 2^attempt
|
|
25
|
+
const exponentialDelay = initialDelayMs * Math.pow(2, attempt);
|
|
26
|
+
// Cap at maxDelay
|
|
27
|
+
const cappedDelay = Math.min(maxDelayMs, exponentialDelay);
|
|
28
|
+
// Add jitter: ±20% (multiply by 0.8 to 1.2)
|
|
29
|
+
const jitter = 0.8 + Math.random() * 0.4;
|
|
30
|
+
return Math.round(cappedDelay * jitter);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Sleep for a specified duration.
|
|
34
|
+
*/
|
|
35
|
+
export function sleep(ms) {
|
|
36
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Execute a function with retry logic.
|
|
40
|
+
*/
|
|
41
|
+
export async function withRetry(fn, options = {}) {
|
|
42
|
+
const config = {
|
|
43
|
+
...DEFAULT_RETRY_OPTIONS,
|
|
44
|
+
...options,
|
|
45
|
+
};
|
|
46
|
+
let lastError;
|
|
47
|
+
for (let attempt = 0; attempt < config.maxAttempts; attempt++) {
|
|
48
|
+
try {
|
|
49
|
+
return await fn();
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
lastError = error;
|
|
53
|
+
// Check if we should retry
|
|
54
|
+
if (!config.shouldRetry(error)) {
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
// Check if we have more attempts left
|
|
58
|
+
if (attempt + 1 >= config.maxAttempts) {
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
// Calculate delay and wait
|
|
62
|
+
const delayMs = calculateDelay(attempt, config.initialDelayMs, config.maxDelayMs);
|
|
63
|
+
config.onRetry(error, attempt + 1, delayMs);
|
|
64
|
+
await sleep(delayMs);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// This should never be reached, but TypeScript needs it
|
|
68
|
+
throw lastError;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Create a retry wrapper with pre-configured options.
|
|
72
|
+
*/
|
|
73
|
+
export function createRetryWrapper(config) {
|
|
74
|
+
return (fn) => withRetry(fn, config);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Check if an error is retryable based on HTTP/gRPC status codes.
|
|
78
|
+
*/
|
|
79
|
+
export function isRetryableStatusCode(statusCode) {
|
|
80
|
+
// Retryable HTTP status codes
|
|
81
|
+
const retryableCodes = [
|
|
82
|
+
408, // Request Timeout
|
|
83
|
+
429, // Too Many Requests
|
|
84
|
+
500, // Internal Server Error
|
|
85
|
+
502, // Bad Gateway
|
|
86
|
+
503, // Service Unavailable
|
|
87
|
+
504, // Gateway Timeout
|
|
88
|
+
];
|
|
89
|
+
return retryableCodes.includes(statusCode);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Enhanced retry check that considers both CloudBuildError and status codes.
|
|
93
|
+
*/
|
|
94
|
+
export function shouldRetryError(error) {
|
|
95
|
+
if (error instanceof CloudBuildError) {
|
|
96
|
+
return error.isTransient;
|
|
97
|
+
}
|
|
98
|
+
// Check for status code in error object
|
|
99
|
+
if (error && typeof error === 'object' && 'code' in error) {
|
|
100
|
+
const code = error.code;
|
|
101
|
+
if (typeof code === 'number') {
|
|
102
|
+
return isRetryableStatusCode(code);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation utilities using Zod schemas.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
/**
|
|
6
|
+
* Validate a build ID format.
|
|
7
|
+
*/
|
|
8
|
+
export declare const BuildIdSchema: z.ZodString;
|
|
9
|
+
/**
|
|
10
|
+
* Validate a trigger ID format.
|
|
11
|
+
*/
|
|
12
|
+
export declare const TriggerIdSchema: z.ZodString;
|
|
13
|
+
/**
|
|
14
|
+
* Validate a trigger name format (lowercase, alphanumeric with hyphens).
|
|
15
|
+
*/
|
|
16
|
+
export declare const TriggerNameSchema: z.ZodString;
|
|
17
|
+
/**
|
|
18
|
+
* Validate substitution keys (must start with _ and be uppercase).
|
|
19
|
+
*/
|
|
20
|
+
export declare const SubstitutionKeySchema: z.ZodString;
|
|
21
|
+
/**
|
|
22
|
+
* Validate a timeout duration string (e.g., "3600s").
|
|
23
|
+
*/
|
|
24
|
+
export declare const TimeoutSchema: z.ZodString;
|
|
25
|
+
/**
|
|
26
|
+
* Validate page size for pagination.
|
|
27
|
+
*/
|
|
28
|
+
export declare const PageSizeSchema: z.ZodOptional<z.ZodNumber>;
|
|
29
|
+
/**
|
|
30
|
+
* Validate artifact path.
|
|
31
|
+
*/
|
|
32
|
+
export declare const ArtifactPathSchema: z.ZodString;
|
|
33
|
+
/**
|
|
34
|
+
* Validate GCS bucket name.
|
|
35
|
+
*/
|
|
36
|
+
export declare const BucketNameSchema: z.ZodString;
|
|
37
|
+
/**
|
|
38
|
+
* Schema for validating substitutions record.
|
|
39
|
+
*/
|
|
40
|
+
export declare const SubstitutionsSchema: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
41
|
+
/**
|
|
42
|
+
* Validate a value and throw if invalid.
|
|
43
|
+
*/
|
|
44
|
+
export declare function validate<T>(schema: z.ZodSchema<T>, value: unknown): T;
|
|
45
|
+
/**
|
|
46
|
+
* Safely validate a value, returning the result.
|
|
47
|
+
*/
|
|
48
|
+
export declare function safeValidate<T>(schema: z.ZodSchema<T>, value: unknown): z.SafeParseReturnType<unknown, T>;
|
|
49
|
+
/**
|
|
50
|
+
* Check if substitutions record has valid keys.
|
|
51
|
+
*/
|
|
52
|
+
export declare function validateSubstitutions(substitutions: Record<string, string> | undefined): boolean;
|
|
53
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,aAAa,aAA4C,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,eAAe,aAA8C,CAAC;AAE3E;;GAEG;AACH,eAAO,MAAM,iBAAiB,aAEiG,CAAC;AAEhI;;GAEG;AACH,eAAO,MAAM,qBAAqB,aAC0F,CAAC;AAE7H;;GAEG;AACH,eAAO,MAAM,aAAa,aAC6C,CAAC;AAExE;;GAEG;AACH,eAAO,MAAM,cAAc,4BAId,CAAC;AAEd;;GAEG;AACH,eAAO,MAAM,kBAAkB,aAAiD,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,gBAAgB,aAG2C,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,mBAAmB,sDAGpB,CAAC;AAEb;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,CAErE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC,CAAC,CAEzG;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAAG,OAAO,CAOhG"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation utilities using Zod schemas.
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
/**
|
|
6
|
+
* Validate a build ID format.
|
|
7
|
+
*/
|
|
8
|
+
export const BuildIdSchema = z.string().min(1, 'Build ID is required');
|
|
9
|
+
/**
|
|
10
|
+
* Validate a trigger ID format.
|
|
11
|
+
*/
|
|
12
|
+
export const TriggerIdSchema = z.string().min(1, 'Trigger ID is required');
|
|
13
|
+
/**
|
|
14
|
+
* Validate a trigger name format (lowercase, alphanumeric with hyphens).
|
|
15
|
+
*/
|
|
16
|
+
export const TriggerNameSchema = z.string()
|
|
17
|
+
.min(1, 'Trigger name is required')
|
|
18
|
+
.regex(/^[a-z][a-z0-9-]*$/, 'Trigger name must start with a letter and contain only lowercase letters, numbers, and hyphens');
|
|
19
|
+
/**
|
|
20
|
+
* Validate substitution keys (must start with _ and be uppercase).
|
|
21
|
+
*/
|
|
22
|
+
export const SubstitutionKeySchema = z.string()
|
|
23
|
+
.regex(/^_[A-Z0-9_]+$/, 'Substitution key must start with _ and contain only uppercase letters, numbers, and underscores');
|
|
24
|
+
/**
|
|
25
|
+
* Validate a timeout duration string (e.g., "3600s").
|
|
26
|
+
*/
|
|
27
|
+
export const TimeoutSchema = z.string()
|
|
28
|
+
.regex(/^\d+s$/, 'Timeout must be a duration string (e.g., "3600s")');
|
|
29
|
+
/**
|
|
30
|
+
* Validate page size for pagination.
|
|
31
|
+
*/
|
|
32
|
+
export const PageSizeSchema = z.number()
|
|
33
|
+
.int()
|
|
34
|
+
.min(1)
|
|
35
|
+
.max(1000)
|
|
36
|
+
.optional();
|
|
37
|
+
/**
|
|
38
|
+
* Validate artifact path.
|
|
39
|
+
*/
|
|
40
|
+
export const ArtifactPathSchema = z.string().min(1, 'Artifact path is required');
|
|
41
|
+
/**
|
|
42
|
+
* Validate GCS bucket name.
|
|
43
|
+
*/
|
|
44
|
+
export const BucketNameSchema = z.string()
|
|
45
|
+
.min(3, 'Bucket name must be at least 3 characters')
|
|
46
|
+
.max(63, 'Bucket name must be at most 63 characters')
|
|
47
|
+
.regex(/^[a-z0-9][a-z0-9._-]*[a-z0-9]$/, 'Invalid bucket name format');
|
|
48
|
+
/**
|
|
49
|
+
* Schema for validating substitutions record.
|
|
50
|
+
*/
|
|
51
|
+
export const SubstitutionsSchema = z.record(SubstitutionKeySchema, z.string()).optional();
|
|
52
|
+
/**
|
|
53
|
+
* Validate a value and throw if invalid.
|
|
54
|
+
*/
|
|
55
|
+
export function validate(schema, value) {
|
|
56
|
+
return schema.parse(value);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Safely validate a value, returning the result.
|
|
60
|
+
*/
|
|
61
|
+
export function safeValidate(schema, value) {
|
|
62
|
+
return schema.safeParse(value);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if substitutions record has valid keys.
|
|
66
|
+
*/
|
|
67
|
+
export function validateSubstitutions(substitutions) {
|
|
68
|
+
if (!substitutions)
|
|
69
|
+
return true;
|
|
70
|
+
return Object.keys(substitutions).every(key => {
|
|
71
|
+
const result = SubstitutionKeySchema.safeParse(key);
|
|
72
|
+
return result.success;
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;AAE3E;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,EAAE;KACxC,GAAG,CAAC,CAAC,EAAE,0BAA0B,CAAC;KAClC,KAAK,CAAC,mBAAmB,EAAE,gGAAgG,CAAC,CAAC;AAEhI;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,EAAE;KAC5C,KAAK,CAAC,eAAe,EAAE,iGAAiG,CAAC,CAAC;AAE7H;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,EAAE;KACpC,KAAK,CAAC,QAAQ,EAAE,mDAAmD,CAAC,CAAC;AAExE;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,EAAE;KACrC,GAAG,EAAE;KACL,GAAG,CAAC,CAAC,CAAC;KACN,GAAG,CAAC,IAAI,CAAC;KACT,QAAQ,EAAE,CAAC;AAEd;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAC;AAEjF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,EAAE;KACvC,GAAG,CAAC,CAAC,EAAE,2CAA2C,CAAC;KACnD,GAAG,CAAC,EAAE,EAAE,2CAA2C,CAAC;KACpD,KAAK,CAAC,gCAAgC,EAAE,4BAA4B,CAAC,CAAC;AAEzE;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CACzC,qBAAqB,EACrB,CAAC,CAAC,MAAM,EAAE,CACX,CAAC,QAAQ,EAAE,CAAC;AAEb;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAI,MAAsB,EAAE,KAAc;IAChE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAI,MAAsB,EAAE,KAAc;IACpE,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,aAAiD;IACrF,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAEhC,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QAC5C,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@generacy-ai/generacy-plugin-cloud-build",
|
|
3
|
+
"version": "0.0.0-preview-20260304013206",
|
|
4
|
+
"description": "Google Cloud Build integration plugin for Generacy - enables triggering builds, monitoring status, streaming logs, and managing triggers",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@generacy-ai/latency": "^0.1.0",
|
|
16
|
+
"@generacy-ai/latency-plugin-ci-cd": "^0.1.0",
|
|
17
|
+
"@google-cloud/cloudbuild": "^4.7.0",
|
|
18
|
+
"@google-cloud/storage": "^7.14.0",
|
|
19
|
+
"pino": "^9.0.0",
|
|
20
|
+
"zod": "^3.23.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "^20.0.0",
|
|
24
|
+
"typescript": "^5.6.0",
|
|
25
|
+
"vitest": "^3.2.4",
|
|
26
|
+
"tsx": "^4.0.0"
|
|
27
|
+
},
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=20.0.0"
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"dist"
|
|
33
|
+
],
|
|
34
|
+
"keywords": [
|
|
35
|
+
"cloud-build",
|
|
36
|
+
"gcp",
|
|
37
|
+
"ci-cd",
|
|
38
|
+
"plugin",
|
|
39
|
+
"generacy"
|
|
40
|
+
],
|
|
41
|
+
"license": "Apache-2.0",
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "git+https://github.com/generacy-ai/generacy.git",
|
|
45
|
+
"directory": "packages/generacy-plugin-cloud-build"
|
|
46
|
+
},
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public"
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "tsc",
|
|
52
|
+
"dev": "tsx watch src/index.ts",
|
|
53
|
+
"test": "vitest run",
|
|
54
|
+
"test:watch": "vitest",
|
|
55
|
+
"lint": "eslint src tests --ext .ts",
|
|
56
|
+
"typecheck": "tsc --noEmit"
|
|
57
|
+
}
|
|
58
|
+
}
|