@pulumix/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/dist/dev/env-builder.d.ts +9 -0
- package/dist/dev/env-builder.d.ts.map +1 -0
- package/dist/dev/env-builder.js +67 -0
- package/dist/dev/env-builder.js.map +1 -0
- package/dist/dev/index.d.ts +20 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/index.js +272 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/local-runner.d.ts +13 -0
- package/dist/dev/local-runner.d.ts.map +1 -0
- package/dist/dev/local-runner.js +100 -0
- package/dist/dev/local-runner.js.map +1 -0
- package/dist/dev/port-forward.d.ts +10 -0
- package/dist/dev/port-forward.d.ts.map +1 -0
- package/dist/dev/port-forward.js +146 -0
- package/dist/dev/port-forward.js.map +1 -0
- package/dist/dev/service-swap.d.ts +27 -0
- package/dist/dev/service-swap.d.ts.map +1 -0
- package/dist/dev/service-swap.js +272 -0
- package/dist/dev/service-swap.js.map +1 -0
- package/dist/dev/types.d.ts +60 -0
- package/dist/dev/types.d.ts.map +1 -0
- package/dist/dev/types.js +28 -0
- package/dist/dev/types.js.map +1 -0
- package/dist/docker.d.ts +55 -0
- package/dist/docker.d.ts.map +1 -0
- package/dist/docker.js +331 -0
- package/dist/docker.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/events.d.ts +28 -0
- package/dist/orchestrator/events.d.ts.map +1 -0
- package/dist/orchestrator/events.js +142 -0
- package/dist/orchestrator/events.js.map +1 -0
- package/dist/orchestrator/index.d.ts +32 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +722 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/types/errors.d.ts +76 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +271 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/events.d.ts +100 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +40 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/manifest.d.ts +121 -0
- package/dist/types/manifest.d.ts.map +1 -0
- package/dist/types/manifest.js +3 -0
- package/dist/types/manifest.js.map +1 -0
- package/dist/types/service.d.ts +35 -0
- package/dist/types/service.d.ts.map +1 -0
- package/dist/types/service.js +3 -0
- package/dist/types/service.js.map +1 -0
- package/dist/utils/kubernetes.d.ts +10 -0
- package/dist/utils/kubernetes.d.ts.map +1 -0
- package/dist/utils/kubernetes.js +38 -0
- package/dist/utils/kubernetes.js.map +1 -0
- package/dist/validation/manifest.d.ts +5 -0
- package/dist/validation/manifest.d.ts.map +1 -0
- package/dist/validation/manifest.js +114 -0
- package/dist/validation/manifest.js.map +1 -0
- package/package.json +49 -0
- package/src/schemas/service-manifest.schema.json +267 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
export interface ServiceMetadata {
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
team?: string;
|
|
6
|
+
owner?: string;
|
|
7
|
+
repository?: string;
|
|
8
|
+
documentation?: string;
|
|
9
|
+
tags?: Record<string, string>;
|
|
10
|
+
sla?: ServiceSLA;
|
|
11
|
+
support?: SupportInfo;
|
|
12
|
+
contract?: ContractInfo;
|
|
13
|
+
}
|
|
14
|
+
export interface ServiceSLA {
|
|
15
|
+
availability?: string;
|
|
16
|
+
responseTime?: string;
|
|
17
|
+
errorRate?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface SupportInfo {
|
|
20
|
+
email?: string;
|
|
21
|
+
slack?: string;
|
|
22
|
+
pagerduty?: string;
|
|
23
|
+
oncall?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ContractInfo {
|
|
26
|
+
version: string;
|
|
27
|
+
breaking?: string[];
|
|
28
|
+
deprecated?: DeprecatedField[];
|
|
29
|
+
}
|
|
30
|
+
export interface DeprecatedField {
|
|
31
|
+
field: string;
|
|
32
|
+
since: string;
|
|
33
|
+
removeIn?: string;
|
|
34
|
+
replacement?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface ObservabilityConfig {
|
|
37
|
+
health?: HealthConfig;
|
|
38
|
+
metrics?: MetricsConfig;
|
|
39
|
+
logs?: LogsConfig;
|
|
40
|
+
}
|
|
41
|
+
export interface HealthConfig {
|
|
42
|
+
endpoint?: string;
|
|
43
|
+
port?: number;
|
|
44
|
+
scheme?: 'http' | 'https';
|
|
45
|
+
}
|
|
46
|
+
export interface MetricsConfig {
|
|
47
|
+
endpoint?: string;
|
|
48
|
+
port?: number;
|
|
49
|
+
format?: 'prometheus' | 'opentelemetry';
|
|
50
|
+
}
|
|
51
|
+
export interface LogsConfig {
|
|
52
|
+
format?: 'json' | 'text';
|
|
53
|
+
level?: 'debug' | 'info' | 'warn' | 'error';
|
|
54
|
+
}
|
|
55
|
+
export interface SecurityConfig {
|
|
56
|
+
networkPolicy?: NetworkPolicyConfig;
|
|
57
|
+
rbac?: RBACConfig;
|
|
58
|
+
secrets?: SecretsConfig;
|
|
59
|
+
}
|
|
60
|
+
export interface NetworkPolicyConfig {
|
|
61
|
+
enabled?: boolean;
|
|
62
|
+
ingress?: NetworkPolicyRule[];
|
|
63
|
+
egress?: NetworkPolicyRule[];
|
|
64
|
+
}
|
|
65
|
+
export interface NetworkPolicyRule {
|
|
66
|
+
from?: any[];
|
|
67
|
+
ports?: number[];
|
|
68
|
+
}
|
|
69
|
+
export interface RBACConfig {
|
|
70
|
+
serviceAccount?: string;
|
|
71
|
+
roles?: string[];
|
|
72
|
+
}
|
|
73
|
+
export interface SecretsConfig {
|
|
74
|
+
provider?: 'kubernetes' | 'vault' | 'aws-secrets-manager' | 'azure-keyvault';
|
|
75
|
+
path?: string;
|
|
76
|
+
}
|
|
77
|
+
export interface FileBackendConfig {
|
|
78
|
+
type: 'file';
|
|
79
|
+
path?: string;
|
|
80
|
+
}
|
|
81
|
+
export interface S3BackendConfig {
|
|
82
|
+
type: 's3';
|
|
83
|
+
bucket: string;
|
|
84
|
+
region?: string;
|
|
85
|
+
prefix?: string;
|
|
86
|
+
}
|
|
87
|
+
export interface GCSBackendConfig {
|
|
88
|
+
type: 'gcs';
|
|
89
|
+
bucket: string;
|
|
90
|
+
prefix?: string;
|
|
91
|
+
}
|
|
92
|
+
export interface AzBlobBackendConfig {
|
|
93
|
+
type: 'azblob';
|
|
94
|
+
container: string;
|
|
95
|
+
prefix?: string;
|
|
96
|
+
}
|
|
97
|
+
export interface PulumiCloudBackendConfig {
|
|
98
|
+
type: 'pulumi';
|
|
99
|
+
org?: string;
|
|
100
|
+
}
|
|
101
|
+
export type BackendConfig = FileBackendConfig | S3BackendConfig | GCSBackendConfig | AzBlobBackendConfig | PulumiCloudBackendConfig;
|
|
102
|
+
export interface StackConfig {
|
|
103
|
+
namespace?: string;
|
|
104
|
+
backend?: BackendConfig;
|
|
105
|
+
[key: string]: unknown;
|
|
106
|
+
}
|
|
107
|
+
export interface ProjectConfig {
|
|
108
|
+
name?: string;
|
|
109
|
+
backend?: BackendConfig;
|
|
110
|
+
services?: {
|
|
111
|
+
allowed?: string[];
|
|
112
|
+
};
|
|
113
|
+
stacks?: Record<string, StackConfig>;
|
|
114
|
+
}
|
|
115
|
+
export interface ServiceManifest {
|
|
116
|
+
metadata: ServiceMetadata;
|
|
117
|
+
observability?: ObservabilityConfig;
|
|
118
|
+
security?: SecurityConfig;
|
|
119
|
+
stacks: Record<string, Record<string, unknown>>;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/types/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/types/manifest.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as pulumi from '@pulumi/pulumi';
|
|
2
|
+
import type { ServiceMetadata, ObservabilityConfig, SecurityConfig } from './manifest';
|
|
3
|
+
export interface ServiceContext<TDeps = Record<string, Record<string, unknown>>> {
|
|
4
|
+
readonly stackName: string;
|
|
5
|
+
readonly serviceName: string;
|
|
6
|
+
readonly metadata: ServiceMetadata;
|
|
7
|
+
readonly observability?: ObservabilityConfig;
|
|
8
|
+
readonly security?: SecurityConfig;
|
|
9
|
+
readonly config: Record<string, unknown>;
|
|
10
|
+
readonly globalConfig: Record<string, unknown>;
|
|
11
|
+
readonly namespace: string;
|
|
12
|
+
readonly dependencies: TDeps;
|
|
13
|
+
readonly image?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ServiceResult<TOutputs = Record<string, unknown>> {
|
|
16
|
+
readonly outputs?: TOutputs;
|
|
17
|
+
readonly resources?: pulumi.Resource[];
|
|
18
|
+
}
|
|
19
|
+
export type ServiceDeployFn<TDeps = Record<string, Record<string, unknown>>, TOutputs = Record<string, unknown>> = (ctx: ServiceContext<TDeps>) => Promise<ServiceResult<TOutputs> | void>;
|
|
20
|
+
export interface DiscoveredService {
|
|
21
|
+
readonly name: string;
|
|
22
|
+
readonly path: string;
|
|
23
|
+
readonly deployPath: string;
|
|
24
|
+
readonly configPath: string;
|
|
25
|
+
readonly dependencies: string[];
|
|
26
|
+
readonly hasDockerfile: boolean;
|
|
27
|
+
readonly rawConfig: Record<string, unknown>;
|
|
28
|
+
readonly metadata: ServiceMetadata;
|
|
29
|
+
readonly observability?: ObservabilityConfig;
|
|
30
|
+
readonly security?: SecurityConfig;
|
|
31
|
+
}
|
|
32
|
+
export interface ResolvedService extends DiscoveredService {
|
|
33
|
+
readonly stackConfig: Record<string, unknown>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/types/service.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAA;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAsDtF,MAAM,WAAW,cAAc,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE7E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAE1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAE5B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAA;IAElC,QAAQ,CAAC,aAAa,CAAC,EAAE,mBAAmB,CAAA;IAE5C,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAA;IAElC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAExC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAE1B,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAA;IAE5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB;AA0CD,MAAM,WAAW,aAAa,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE/D,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAA;IAE3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAA;CACvC;AAgCD,MAAM,MAAM,eAAe,CACzB,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAC/C,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAChC,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAA;AAwB3E,MAAM,WAAW,iBAAiB;IAEhC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAE3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAE3B,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAA;IAE/B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAE/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE3C,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAA;IAElC,QAAQ,CAAC,aAAa,CAAC,EAAE,mBAAmB,CAAA;IAE5C,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAA;CACnC;AA0BD,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IAExD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/types/service.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ServiceContext } from '../types/service';
|
|
2
|
+
export interface StandardLabelsOptions {
|
|
3
|
+
version?: string;
|
|
4
|
+
component?: string;
|
|
5
|
+
partOf?: string;
|
|
6
|
+
customLabels?: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
export declare const getStandardLabels: <TDeps = any>(ctx: ServiceContext<TDeps>, options?: StandardLabelsOptions) => Record<string, string>;
|
|
9
|
+
export declare const isValidKubernetesLabel: (key: string, value: string) => boolean;
|
|
10
|
+
//# sourceMappingURL=kubernetes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kubernetes.d.ts","sourceRoot":"","sources":["../../src/utils/kubernetes.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAKtD,MAAM,WAAW,qBAAqB;IAEpC,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACtC;AA+BD,eAAO,MAAM,iBAAiB,GAAI,KAAK,GAAG,GAAG,EAC3C,KAAK,cAAc,CAAC,KAAK,CAAC,EAC1B,UAAU,qBAAqB,KAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CA8BvB,CAAA;AASD,eAAO,MAAM,sBAAsB,GAAI,KAAK,MAAM,EAAE,OAAO,MAAM,KAAG,OAcnE,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isValidKubernetesLabel = exports.getStandardLabels = void 0;
|
|
4
|
+
const getStandardLabels = (ctx, options) => {
|
|
5
|
+
const baseLabels = {
|
|
6
|
+
'app.kubernetes.io/name': ctx.serviceName,
|
|
7
|
+
'app.kubernetes.io/instance': `${ctx.serviceName}-${ctx.stackName}`,
|
|
8
|
+
'app.kubernetes.io/managed-by': 'pulumix',
|
|
9
|
+
environment: ctx.stackName
|
|
10
|
+
};
|
|
11
|
+
if (options?.version) {
|
|
12
|
+
baseLabels['app.kubernetes.io/version'] = options.version;
|
|
13
|
+
}
|
|
14
|
+
if (options?.component) {
|
|
15
|
+
baseLabels['app.kubernetes.io/component'] = options.component;
|
|
16
|
+
}
|
|
17
|
+
if (options?.partOf) {
|
|
18
|
+
baseLabels['app.kubernetes.io/part-of'] = options.partOf;
|
|
19
|
+
}
|
|
20
|
+
if (options?.customLabels) {
|
|
21
|
+
return { ...baseLabels, ...options.customLabels };
|
|
22
|
+
}
|
|
23
|
+
return baseLabels;
|
|
24
|
+
};
|
|
25
|
+
exports.getStandardLabels = getStandardLabels;
|
|
26
|
+
const isValidKubernetesLabel = (key, value) => {
|
|
27
|
+
const keyRegex = /^([a-z0-9A-Z]([a-z0-9A-Z\-_.]*[a-z0-9A-Z])?\/)?[a-z0-9A-Z]([a-z0-9A-Z\-_.]*[a-z0-9A-Z])?$/;
|
|
28
|
+
if (key.length > 253 || !keyRegex.test(key)) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
if (value === '') {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
const valueRegex = /^[a-z0-9A-Z]([a-z0-9A-Z\-_.]*[a-z0-9A-Z])?$/;
|
|
35
|
+
return value.length <= 63 && valueRegex.test(value);
|
|
36
|
+
};
|
|
37
|
+
exports.isValidKubernetesLabel = isValidKubernetesLabel;
|
|
38
|
+
//# sourceMappingURL=kubernetes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kubernetes.js","sourceRoot":"","sources":["../../src/utils/kubernetes.ts"],"names":[],"mappings":";;;AAmDO,MAAM,iBAAiB,GAAG,CAC/B,GAA0B,EAC1B,OAA+B,EACP,EAAE;IAC1B,MAAM,UAAU,GAA2B;QAEzC,wBAAwB,EAAE,GAAG,CAAC,WAAW;QACzC,4BAA4B,EAAE,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS,EAAE;QACnE,8BAA8B,EAAE,SAAS;QAGzC,WAAW,EAAE,GAAG,CAAC,SAAS;KAC3B,CAAA;IAGD,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,UAAU,CAAC,2BAA2B,CAAC,GAAG,OAAO,CAAC,OAAO,CAAA;IAC3D,CAAC;IAED,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;QACvB,UAAU,CAAC,6BAA6B,CAAC,GAAG,OAAO,CAAC,SAAS,CAAA;IAC/D,CAAC;IAED,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,UAAU,CAAC,2BAA2B,CAAC,GAAG,OAAO,CAAC,MAAM,CAAA;IAC1D,CAAC;IAGD,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;QAC1B,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAA;IACnD,CAAC;IAED,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA;AAjCY,QAAA,iBAAiB,qBAiC7B;AASM,MAAM,sBAAsB,GAAG,CAAC,GAAW,EAAE,KAAa,EAAW,EAAE;IAE5E,MAAM,QAAQ,GAAG,2FAA2F,CAAA;IAC5G,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAA;IACd,CAAC;IAGD,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACjB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,UAAU,GAAG,6CAA6C,CAAA;IAChE,OAAO,KAAK,CAAC,MAAM,IAAI,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACrD,CAAC,CAAA;AAdY,QAAA,sBAAsB,0BAclC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { DeployError } from '../types/errors';
|
|
2
|
+
import { Either } from 'purify-ts/Either';
|
|
3
|
+
export declare function validateServiceManifest(manifest: unknown, configPath: string): Either<DeployError, Record<string, unknown>>;
|
|
4
|
+
export declare function validateServiceManifestOrThrow(manifest: unknown, configPath: string): void;
|
|
5
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/validation/manifest.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqB,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,MAAM,EAAe,MAAM,kBAAkB,CAAA;AAmGtD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAkB9C;AAsBD,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,MAAM,GACjB,IAAI,CAMN"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.validateServiceManifest = validateServiceManifest;
|
|
40
|
+
exports.validateServiceManifestOrThrow = validateServiceManifestOrThrow;
|
|
41
|
+
const ajv_1 = __importDefault(require("ajv"));
|
|
42
|
+
const ajv_formats_1 = __importDefault(require("ajv-formats"));
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const errors_1 = require("../types/errors");
|
|
46
|
+
const Either_1 = require("purify-ts/Either");
|
|
47
|
+
let schemaPath = path.join(__dirname, '../schemas/service-manifest.schema.json');
|
|
48
|
+
if (!fs.existsSync(schemaPath)) {
|
|
49
|
+
schemaPath = path.join(__dirname, '../../src/schemas/service-manifest.schema.json');
|
|
50
|
+
}
|
|
51
|
+
const schema = JSON.parse(fs.readFileSync(schemaPath, 'utf-8'));
|
|
52
|
+
const ajv = new ajv_1.default({
|
|
53
|
+
allErrors: true,
|
|
54
|
+
verbose: true,
|
|
55
|
+
strict: false,
|
|
56
|
+
$data: true
|
|
57
|
+
});
|
|
58
|
+
(0, ajv_formats_1.default)(ajv);
|
|
59
|
+
const validateManifest = ajv.compile(schema);
|
|
60
|
+
function formatValidationErrors(errors) {
|
|
61
|
+
const messages = ['Service manifest validation failed:'];
|
|
62
|
+
for (const error of errors) {
|
|
63
|
+
const path = error.instancePath || 'root';
|
|
64
|
+
const field = path.replace(/^\//, '').replace(/\//g, '.');
|
|
65
|
+
switch (error.keyword) {
|
|
66
|
+
case 'required':
|
|
67
|
+
messages.push(` • Missing required field: ${error.params.missingProperty}`);
|
|
68
|
+
break;
|
|
69
|
+
case 'type':
|
|
70
|
+
messages.push(` • Field '${field}' should be ${error.params.type}`);
|
|
71
|
+
break;
|
|
72
|
+
case 'pattern':
|
|
73
|
+
messages.push(` • Field '${field}' does not match required pattern`);
|
|
74
|
+
if (field === 'metadata.name') {
|
|
75
|
+
messages.push(` Must be lowercase alphanumeric with hyphens: [a-z0-9-]+`);
|
|
76
|
+
}
|
|
77
|
+
if (field === 'metadata.version') {
|
|
78
|
+
messages.push(` Must be valid semver: 1.2.3 or 1.2.3-beta.1`);
|
|
79
|
+
}
|
|
80
|
+
break;
|
|
81
|
+
case 'format':
|
|
82
|
+
messages.push(` • Field '${field}' should be valid ${error.params.format}`);
|
|
83
|
+
break;
|
|
84
|
+
case 'additionalProperties':
|
|
85
|
+
messages.push(` • Unknown field: ${error.params.additionalProperty}`);
|
|
86
|
+
break;
|
|
87
|
+
case 'enum':
|
|
88
|
+
messages.push(` • Field '${field}' must be one of: ${error.params.allowedValues.join(', ')}`);
|
|
89
|
+
break;
|
|
90
|
+
case 'minimum':
|
|
91
|
+
case 'maximum':
|
|
92
|
+
messages.push(` • Field '${field}' is out of range`);
|
|
93
|
+
break;
|
|
94
|
+
default:
|
|
95
|
+
messages.push(` • Validation error at ${field}: ${error.message}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return messages.join('\n');
|
|
99
|
+
}
|
|
100
|
+
function validateServiceManifest(manifest, configPath) {
|
|
101
|
+
const valid = validateManifest(manifest);
|
|
102
|
+
if (!valid && validateManifest.errors) {
|
|
103
|
+
const errorMessage = formatValidationErrors(validateManifest.errors);
|
|
104
|
+
return (0, Either_1.Left)((0, errors_1.createConfigError)('InvalidConfigFormat', errorMessage, undefined, undefined, { configPath, validationErrors: validateManifest.errors }));
|
|
105
|
+
}
|
|
106
|
+
return (0, Either_1.Right)(manifest);
|
|
107
|
+
}
|
|
108
|
+
function validateServiceManifestOrThrow(manifest, configPath) {
|
|
109
|
+
const result = validateServiceManifest(manifest, configPath);
|
|
110
|
+
if (result.isLeft()) {
|
|
111
|
+
throw result.extract();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/validation/manifest.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pulumix/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Core types, managers, and orchestrator for Pulumix",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"require": "./dist/index.js",
|
|
11
|
+
"import": "./dist/index.mjs"
|
|
12
|
+
},
|
|
13
|
+
"./schema": {
|
|
14
|
+
"default": "./src/schemas/service-manifest.schema.json"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"src/schemas"
|
|
20
|
+
],
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@pulumi/pulumi": "^3.142.0",
|
|
23
|
+
"@types/dockerode": "^3.3.47",
|
|
24
|
+
"ajv": "^8.17.1",
|
|
25
|
+
"ajv-formats": "^3.0.1",
|
|
26
|
+
"dockerode": "^4.0.9",
|
|
27
|
+
"fast-glob": "^3.3.3",
|
|
28
|
+
"jiti": "^2.6.1",
|
|
29
|
+
"purify-ts": "^2.1.0",
|
|
30
|
+
"tar-fs": "^3.1.1",
|
|
31
|
+
"yaml": "^2.6.1"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "^22.10.2",
|
|
35
|
+
"@types/tar-fs": "^2.0.4",
|
|
36
|
+
"typescript": "^5.7.2",
|
|
37
|
+
"vitest": "^2.1.8"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsc --build",
|
|
44
|
+
"typecheck": "tsc --noEmit",
|
|
45
|
+
"test": "vitest run",
|
|
46
|
+
"test:watch": "vitest",
|
|
47
|
+
"clean": "rm -rf dist tsconfig.tsbuildinfo"
|
|
48
|
+
}
|
|
49
|
+
}
|