@highstate/pulumi 0.9.16 → 0.9.18
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/highstate.manifest.json +1 -1
- package/dist/index.js +77 -54
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
- package/src/index.ts +1 -1
- package/src/secret.ts +54 -23
- package/src/unit.ts +109 -67
package/dist/index.js
CHANGED
@@ -1,25 +1,31 @@
|
|
1
|
-
import { getStack, secret,
|
1
|
+
import { getStack, secret, output, Config, all, StackReference } from '@pulumi/pulumi';
|
2
2
|
export * from '@pulumi/pulumi';
|
3
|
-
import { getInstanceId, camelCaseToHumanReadable,
|
4
|
-
import { Type } from '@sinclair/typebox';
|
3
|
+
import { HighstateSignature, getInstanceId, camelCaseToHumanReadable, unitArtifactSchema, unitSecretSchema, parseInstanceId } from '@highstate/contract';
|
5
4
|
import { mapValues, pipe, pickBy } from 'remeda';
|
6
5
|
import { Ajv } from 'ajv';
|
7
6
|
|
8
7
|
// src/index.ts
|
9
|
-
var
|
10
|
-
function
|
11
|
-
return
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
8
|
+
var updatedSecretValues = {};
|
9
|
+
function ensureSecretValue(secret2, create) {
|
10
|
+
return {
|
11
|
+
[HighstateSignature.Secret]: true,
|
12
|
+
id: secret2.id,
|
13
|
+
value: secret2.value.apply((value) => {
|
14
|
+
if (value !== void 0) {
|
15
|
+
return value;
|
16
|
+
}
|
17
|
+
updatedSecretValues[secret2.id] = secret(create());
|
18
|
+
return updatedSecretValues[secret2.id];
|
19
|
+
})
|
20
|
+
};
|
20
21
|
}
|
21
|
-
function
|
22
|
-
|
22
|
+
function updateSecretValue(secret2, value) {
|
23
|
+
updatedSecretValues[secret2.id] = secret(value);
|
24
|
+
return {
|
25
|
+
[HighstateSignature.Secret]: true,
|
26
|
+
id: secret2.id,
|
27
|
+
value: output(updatedSecretValues[secret2.id])
|
28
|
+
};
|
23
29
|
}
|
24
30
|
|
25
31
|
// src/unit.ts
|
@@ -80,9 +86,7 @@ function getOutput(unit, input, refs) {
|
|
80
86
|
}
|
81
87
|
function isAnyOfSchema(schema, itemType) {
|
82
88
|
if (schema.anyOf) {
|
83
|
-
return Object.values(schema.anyOf).every(
|
84
|
-
(schema2) => isAnyOfSchema(schema2, itemType)
|
85
|
-
);
|
89
|
+
return Object.values(schema.anyOf).every((schema2) => isAnyOfSchema(schema2, itemType));
|
86
90
|
}
|
87
91
|
return schema.type === itemType;
|
88
92
|
}
|
@@ -159,28 +163,38 @@ function forUnit(unit) {
|
|
159
163
|
}
|
160
164
|
}
|
161
165
|
});
|
162
|
-
const
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
}
|
179
|
-
return value;
|
166
|
+
const secretIds = config.requireObject("$secretIds");
|
167
|
+
const getSecretValue = (secretName, secret2) => {
|
168
|
+
switch (true) {
|
169
|
+
case isStringSchema(secret2.schema): {
|
170
|
+
return secret2.required ? config.requireSecret(secretName) : config.getSecret(secretName);
|
171
|
+
}
|
172
|
+
case isNumberSchema(secret2.schema): {
|
173
|
+
return secret2.required ? config.requireSecretNumber(secretName) : config.getSecretNumber(secretName);
|
174
|
+
}
|
175
|
+
case isBooleanSchema(secret2.schema): {
|
176
|
+
return secret2.required ? config.requireSecretBoolean(secretName) : config.getSecretBoolean(secretName);
|
177
|
+
}
|
178
|
+
default: {
|
179
|
+
const value = secret2.required ? config.requireSecretObject(secretName) : config.getSecretObject(secretName);
|
180
|
+
if (!ajv.validate(secret2.schema, value)) {
|
181
|
+
throw new Error(`Invalid secret for '${secretName}': ${ajv.errorsText()}`);
|
180
182
|
}
|
183
|
+
return value;
|
181
184
|
}
|
182
|
-
}
|
183
|
-
|
185
|
+
}
|
186
|
+
};
|
187
|
+
const secrets = mapValues(unit.model.secrets, (secret2, secretName) => {
|
188
|
+
const secretId = secretIds[secretName];
|
189
|
+
if (!secretId) {
|
190
|
+
throw new Error(`Secret '${secretName}' not found in the config.`);
|
191
|
+
}
|
192
|
+
return {
|
193
|
+
[HighstateSignature.Secret]: true,
|
194
|
+
id: secretId,
|
195
|
+
value: secret2.required ? config.requireSecret(secretName) : output(getSecretValue(secretName, secret2))
|
196
|
+
};
|
197
|
+
});
|
184
198
|
const inputs = mapValues(unit.model.inputs, (input, inputName) => {
|
185
199
|
const value = input.required ? config.requireObject(`input.${inputName}`) : config.getObject(`input.${inputName}`);
|
186
200
|
if (!value) {
|
@@ -235,7 +249,7 @@ function forUnit(unit) {
|
|
235
249
|
}
|
236
250
|
return void 0;
|
237
251
|
}
|
238
|
-
const schema = outputModel.multiple ?
|
252
|
+
const schema = outputModel.multiple ? entity.schema.array() : entity.schema;
|
239
253
|
if (!ajv.validate(schema, value)) {
|
240
254
|
throw new Error(`Invalid output for '${outputName}': ${ajv.errorsText()}`);
|
241
255
|
}
|
@@ -243,21 +257,32 @@ function forUnit(unit) {
|
|
243
257
|
});
|
244
258
|
});
|
245
259
|
await Promise.all(Object.values(result).map((o) => outputToPromise(o)));
|
246
|
-
|
247
|
-
|
260
|
+
result.$secrets = updatedSecretValues;
|
261
|
+
const secretsMap = {};
|
262
|
+
for (const [outputName, outputValue] of Object.entries(outputs)) {
|
263
|
+
if (!outputName.startsWith("$")) {
|
264
|
+
const resolvedValue = await outputToPromise(outputValue);
|
265
|
+
const secrets2 = extractObjectsFromValue(unitSecretSchema, resolvedValue);
|
266
|
+
if (secrets2.length > 0) {
|
267
|
+
secretsMap[outputName] = secrets2;
|
268
|
+
}
|
269
|
+
}
|
248
270
|
}
|
249
271
|
const artifactsMap = {};
|
250
272
|
for (const [outputName, outputValue] of Object.entries(outputs)) {
|
251
273
|
if (!outputName.startsWith("$")) {
|
252
274
|
const resolvedValue = await outputToPromise(outputValue);
|
253
|
-
const artifacts =
|
275
|
+
const artifacts = extractObjectsFromValue(unitArtifactSchema, resolvedValue);
|
254
276
|
if (artifacts.length > 0) {
|
255
277
|
artifactsMap[outputName] = artifacts;
|
256
278
|
}
|
257
279
|
}
|
258
280
|
}
|
259
281
|
if (Object.keys(artifactsMap).length > 0) {
|
260
|
-
result.$
|
282
|
+
result.$exportedArtifacts = artifactsMap;
|
283
|
+
}
|
284
|
+
if (Object.keys(secretsMap).length > 0) {
|
285
|
+
result.$exportedSecretIds = mapValues(secretsMap, (v) => v.map((secret2) => secret2.id));
|
261
286
|
}
|
262
287
|
return result;
|
263
288
|
}
|
@@ -393,8 +418,8 @@ function mapTriggers(triggers) {
|
|
393
418
|
}
|
394
419
|
return Object.entries(triggers).filter(([, trigger]) => !!trigger).map(([name, trigger]) => ({ ...trigger, name }));
|
395
420
|
}
|
396
|
-
function
|
397
|
-
const
|
421
|
+
function extractObjectsFromValue(schema, data) {
|
422
|
+
const result = [];
|
398
423
|
function traverse(obj) {
|
399
424
|
if (obj === null || obj === void 0 || typeof obj !== "object") {
|
400
425
|
return;
|
@@ -405,19 +430,17 @@ function extractArtifactsFromValue(data) {
|
|
405
430
|
}
|
406
431
|
return;
|
407
432
|
}
|
408
|
-
const
|
409
|
-
if (
|
410
|
-
|
411
|
-
artifacts.push(artifactData);
|
412
|
-
record[HighstateSignature.Artifact] = { hash: artifactData.hash };
|
433
|
+
const parseResult = schema.safeParse(obj);
|
434
|
+
if (parseResult.success) {
|
435
|
+
result.push(parseResult.data);
|
413
436
|
return;
|
414
437
|
}
|
415
|
-
for (const value of Object.values(
|
438
|
+
for (const value of Object.values(obj)) {
|
416
439
|
traverse(value);
|
417
440
|
}
|
418
441
|
}
|
419
442
|
traverse(data);
|
420
|
-
return
|
443
|
+
return result;
|
421
444
|
}
|
422
445
|
function flattenInputs(...values) {
|
423
446
|
return all(values).apply((allValues) => {
|
@@ -490,6 +513,6 @@ function applyMap(fn) {
|
|
490
513
|
return (input) => output(input).apply((array) => array.map(fn));
|
491
514
|
}
|
492
515
|
|
493
|
-
export { apply, applyMap, fileFromBuffer, fileFromString, flatMapInput, flattenInputs, forUnit,
|
516
|
+
export { apply, applyMap, ensureSecretValue, fileFromBuffer, fileFromString, flatMapInput, flattenInputs, forUnit, getResourceComment, getUnitInstanceId, getUnitInstanceName, mapInputs, mapOptional, mergeInputObjects, normalize, providerFactory, singleton, toPromise, updateSecretValue };
|
494
517
|
//# sourceMappingURL=index.js.map
|
495
518
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/secret.ts","../src/unit.ts","../src/utils.ts"],"names":["instanceName","value","values","schema","secret","output","array"],"mappings":"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","file":"index.js","sourcesContent":["import { secret, type Input, type Output } from \"@pulumi/pulumi\"\n\nexport const createdSecrets: Record<string, Output<unknown>> = {}\n\nexport function getOrCreateSecret<\n TSecrets extends Record<string, unknown>,\n TResult extends TSecrets[keyof TSecrets],\n>(secrets: Output<TSecrets>, key: keyof TSecrets, create: () => Input<TResult>): Output<TResult> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n return secrets[key as any].apply(value => {\n if (value !== undefined) {\n // if the secret is accessed via \"getOrCreateSecret\" with assume it automatically created (even if it was not)\n // in order to provide stable stack outputs\n createdSecrets[key as string] = value as Output<unknown>\n return value as TResult\n }\n\n const secretValue = createdSecrets[key as string] ?? secret(create())\n createdSecrets[key as string] = secretValue\n\n return secretValue\n }) as Output<TResult>\n}\n\nexport function storeSecret<\n TSecrets extends Record<string, unknown>,\n TResult extends TSecrets[keyof TSecrets],\n>(_secrets: Output<TSecrets>, key: keyof TSecrets, value: Input<TResult>): void {\n createdSecrets[key as string] = value as Output<unknown>\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { DeepInput, InputArray, InputMap } from \"./utils\"\nimport {\n type ArgumentValue,\n type ComponentInputSpec,\n type Entity,\n type Unit,\n type ComponentInput,\n type InstanceInput,\n parseInstanceId,\n type ArgumentValueSchema,\n getInstanceId,\n type ComponentArgumentSpec,\n type ComponentArgumentSpecToStatic,\n HighstateSignature,\n camelCaseToHumanReadable,\n} from \"@highstate/contract\"\nimport { Type, type Static } from \"@sinclair/typebox\"\nimport { mapValues, pickBy, pipe } from \"remeda\"\nimport {\n Config,\n getStack,\n Output,\n output,\n secret,\n StackReference,\n type Input,\n type Unwrap,\n} from \"@pulumi/pulumi\"\nimport { Ajv } from \"ajv\"\nimport { createdSecrets } from \"./secret\"\n\nconst ajv = new Ajv({ strict: false })\n\nexport type ObjectMeta = {\n title?: Input<string | undefined>\n description?: Input<string | undefined>\n icon?: Input<string | undefined>\n iconColor?: Input<string | undefined>\n}\n\nexport type InstanceFileMeta = {\n name: Input<string>\n contentType?: Input<string>\n size?: Input<number>\n isBinary?: Input<boolean>\n mode?: Input<number>\n}\n\nexport type UnitArtifact = {\n hash: Input<string>\n meta?: Input<ObjectMeta>\n}\n\nexport type InstanceFile = {\n meta: Input<InstanceFileMeta>\n content:\n | { type: \"embedded\"; value: Input<string> }\n | {\n type: \"artifact\"\n [HighstateSignature.Artifact]: UnitArtifact\n }\n}\n\nexport type InstanceTerminalSpec = {\n image: Input<string>\n command: InputArray<string>\n cwd?: Input<string | undefined>\n env?: InputMap<string | undefined>\n files?: InputMap<InstanceFile | string | undefined>\n}\n\nexport type InstanceTerminal = {\n name: Input<string>\n meta: Input<ObjectMeta>\n spec: Input<InstanceTerminalSpec>\n}\n\nexport type StatusFieldValue = string | number | boolean | string[]\n\nexport type StatusField<TArgName extends string = string> = {\n name: Input<string>\n meta?: Input<ObjectMeta>\n complementaryTo?: Input<TArgName | undefined>\n value?: Input<StatusFieldValue | undefined>\n}\n\nexport type InstancePageBlock =\n | { type: \"markdown\"; content: Input<string> }\n | { type: \"qr\"; content: Input<string>; showContent?: boolean; language?: string }\n | ({ type: \"file\" } & InstanceFile)\n\nexport type InstancePage = {\n name: Input<string>\n meta: Input<ObjectMeta>\n content: InputArray<InstancePageBlock>\n}\n\nexport type InstanceTriggerSpec =\n | {\n type: \"before-destroy\"\n }\n | {\n type: \"schedule\"\n schedule: string\n }\n\nexport type InstanceTrigger = {\n name: Input<string>\n title: Input<string>\n description?: Input<string>\n spec: Input<InstanceTriggerSpec>\n}\n\nexport type ExtraOutputs<TArgName extends string = string> = {\n $statusFields?:\n | InputMap<Omit<StatusField<TArgName>, \"name\"> | StatusFieldValue | undefined>\n | InputArray<StatusField<TArgName> | undefined>\n\n $terminals?:\n | InputMap<Omit<InstanceTerminal, \"name\"> | undefined>\n | InputArray<InstanceTerminal | undefined>\n\n $pages?: InputMap<Omit<InstancePage, \"name\"> | undefined> | InputArray<InstancePage | undefined>\n\n $triggers?:\n | InputMap<Omit<InstanceTrigger, \"name\"> | undefined>\n | InputArray<InstanceTrigger | undefined>\n}\n\nexport type InstanceTriggerInvocation = {\n name: string\n}\n\ntype OutputMapToDeepInputMap<T extends Record<string, unknown>, TArgName extends string> =\n T extends Record<string, never>\n ? ExtraOutputs\n : { [K in keyof T]: DeepInput<T[K]> } & ExtraOutputs<TArgName>\n\nexport interface UnitContext<\n TArgs extends Record<string, ArgumentValue>,\n TInputs extends Record<string, unknown>,\n TOutputs extends Record<string, unknown>,\n TSecrets extends Record<string, ArgumentValue>,\n> {\n args: TArgs\n instanceId: string\n type: string\n name: string\n secrets: Output<TSecrets>\n\n inputs: TInputs extends Record<string, never>\n ? never\n : {\n [K in keyof TInputs]: undefined extends TInputs[K]\n ? Output<NonNullable<TInputs[K]>> | undefined\n : Output<TInputs[K]>\n }\n\n invokedTriggers: InstanceTriggerInvocation[]\n\n outputs(\n this: void,\n outputs?: OutputMapToDeepInputMap<TOutputs, keyof TArgs & string>,\n ): Promise<unknown>\n}\n\ntype InputSpecToValue<T extends ComponentInputSpec> = T[2] extends true\n ? Static<T[0][\"schema\"]>[]\n : T[1] extends true\n ? Static<T[0][\"schema\"]>\n : Static<T[0][\"schema\"]> | undefined\n\ntype InputSpecMapToValueMap<T extends Record<string, ComponentInputSpec>> =\n T extends Record<string, never>\n ? Record<string, never>\n : { [K in keyof T]: InputSpecToValue<T[K]> }\n\nconst stackRefMap = new Map<string, StackReference>()\nconst [projectId, instanceName] = getStack().split(\"_\")\n\nlet instanceId: string | undefined\n\nexport function getUnitInstanceId(): string {\n if (!instanceId) {\n throw new Error(\"Instance id is not set. Did you call 'forUnit' function?\")\n }\n\n return instanceId\n}\n\nexport function getResourceComment(): string {\n return `Managed by Highstate Unit (${getUnitInstanceId()})`\n}\n\nexport function getUnitInstanceName(): string {\n return instanceName\n}\n\nfunction getStackRef(input: InstanceInput) {\n const [instanceType, instanceName] = parseInstanceId(input.instanceId)\n const key = `organization/${instanceType}/${projectId}_${instanceName}`\n\n if (!stackRefMap.has(key)) {\n stackRefMap.set(key, new StackReference(key))\n }\n\n return stackRefMap.get(key)!\n}\n\nfunction getOutput(unit: Unit, input: ComponentInput, refs: InstanceInput[]) {\n const entity = unit.entities.get(input.type)\n if (!entity) {\n throw new Error(`Entity '${input.type}' not found in the unit '${unit.model.type}'.`)\n }\n\n const _getOutput = (ref: InstanceInput) => {\n const value = getStackRef(ref).requireOutput(ref.output)\n\n return value.apply(value => {\n if (Array.isArray(value)) {\n for (const [index, item] of value.entries()) {\n if (!ajv.validate(entity.schema, item)) {\n throw new Error(`Invalid output for '${input.type}[${index}]': ${ajv.errorsText()}`)\n }\n }\n } else {\n if (!ajv.validate(entity.schema, value)) {\n throw new Error(`Invalid output for '${input.type}': ${ajv.errorsText()}`)\n }\n }\n\n if (Array.isArray(value)) {\n return value\n }\n\n return input.multiple ? [value] : value\n })\n }\n\n const values = output(refs.map(ref => _getOutput(ref))).apply(values => values.flat())\n\n if (!input.multiple) {\n return values.apply(values => values[0])\n }\n\n return values\n}\n\nfunction isAnyOfSchema(schema: ArgumentValueSchema, itemType: string): boolean {\n if (schema.anyOf) {\n return Object.values(schema.anyOf).every(schema =>\n isAnyOfSchema(schema as ArgumentValueSchema, itemType),\n )\n }\n\n return schema.type === itemType\n}\n\nfunction isStringSchema(schema: ArgumentValueSchema): boolean {\n if (schema.type === \"string\") {\n return true\n }\n\n if (isAnyOfSchema(schema, \"string\")) {\n return true\n }\n\n return false\n}\n\nfunction isNumberSchema(schema: ArgumentValueSchema): boolean {\n if (schema.type === \"number\") {\n return true\n }\n\n if (isAnyOfSchema(schema, \"number\")) {\n return true\n }\n\n return false\n}\n\nfunction isBooleanSchema(schema: ArgumentValueSchema): boolean {\n if (schema.type === \"boolean\") {\n return true\n }\n\n if (isAnyOfSchema(schema, \"boolean\")) {\n return true\n }\n\n return false\n}\n\nexport function forUnit<\n TArgs extends Record<string, ComponentArgumentSpec>,\n TInputs extends Record<string, ComponentInputSpec>,\n TOutputs extends Record<string, ComponentInputSpec>,\n TSecrets extends Record<string, ComponentArgumentSpec>,\n>(\n unit: Unit<TArgs, TInputs, TOutputs, TSecrets>,\n): UnitContext<\n //\n ComponentArgumentSpecToStatic<TArgs>,\n InputSpecMapToValueMap<TInputs>,\n InputSpecMapToValueMap<TOutputs>,\n ComponentArgumentSpecToStatic<TSecrets>\n> {\n const config = new Config()\n\n const args = mapValues(unit.model.args, (arg, argName) => {\n switch (true) {\n case isStringSchema(arg.schema): {\n if (arg.required) {\n return config.require(argName)\n }\n\n // handle empty strings as undefined\n return config.get(argName) || arg.schema.default\n }\n case isNumberSchema(arg.schema): {\n if (arg.required) {\n return config.requireNumber(argName)\n }\n\n // handle empty strings as undefined\n const value = config.get(argName)\n if (!value) {\n return arg.schema.default\n }\n\n return config.getNumber(argName) ?? arg.schema.default\n }\n case isBooleanSchema(arg.schema): {\n if (arg.required) {\n return config.requireBoolean(argName)\n }\n\n // handle empty strings as undefined\n const value = config.get(argName)\n if (!value) {\n return arg.schema.default\n }\n\n return config.getBoolean(argName) ?? arg.schema.default\n }\n default: {\n if (!arg.required) {\n const value = config.get(argName)\n // handle empty strings as undefined\n if (!value) {\n return arg.schema.default\n }\n }\n\n const value = arg.required ? config.requireObject(argName) : config.getObject(argName)\n if (value === undefined) return arg.schema.default\n\n if (!ajv.validate(arg.schema, value)) {\n throw new Error(`Invalid config for '${argName}': ${ajv.errorsText()}`)\n }\n\n return value\n }\n }\n }) as ComponentArgumentSpecToStatic<TArgs>\n\n const secrets = output(\n mapValues(unit.model.secrets, (secret, secretName) => {\n switch (true) {\n case isStringSchema(secret.schema): {\n return secret.required ? config.requireSecret(secretName) : config.getSecret(secretName)\n }\n case isNumberSchema(secret.schema): {\n return secret.required\n ? config.requireSecretNumber(secretName)\n : config.getSecretNumber(secretName)\n }\n case isBooleanSchema(secret.schema): {\n return secret.required\n ? config.requireSecretBoolean(secretName)\n : config.getSecretBoolean(secretName)\n }\n default: {\n const value = secret.required\n ? config.requireSecretObject(secretName)\n : config.getSecretObject(secretName)\n\n if (!ajv.validate(secret.schema, value)) {\n throw new Error(`Invalid secret for '${secretName}': ${ajv.errorsText()}`)\n }\n\n return value\n }\n }\n }),\n ) as unknown as Output<ComponentArgumentSpecToStatic<TSecrets>>\n\n const inputs = mapValues(unit.model.inputs, (input, inputName) => {\n const value = input.required\n ? config.requireObject<InstanceInput[]>(`input.${inputName}`)\n : config.getObject<InstanceInput[]>(`input.${inputName}`)\n\n if (!value) {\n if (input.multiple) {\n return output([])\n }\n\n return undefined\n }\n\n return getOutput(unit as unknown as Unit, input, value)\n })\n\n const type = unit.model.type\n instanceId = getInstanceId(type, instanceName)\n\n return {\n args,\n instanceId,\n type,\n name: instanceName,\n secrets,\n inputs: inputs as any,\n invokedTriggers: config.getObject<InstanceTriggerInvocation[]>(\"$invokedTriggers\") ?? [],\n\n outputs: async (outputs: any = {}) => {\n const result: any = mapValues(outputs, (outputValue, outputName) => {\n if (outputName === \"$statusFields\") {\n return output(outputValue).apply(mapStatusFields)\n }\n\n if (outputName === \"$pages\") {\n return output(outputValue).apply(mapPages)\n }\n\n if (outputName === \"$terminals\") {\n return output(outputValue).apply(mapTerminals)\n }\n\n if (outputName === \"$triggers\") {\n return output(outputValue).apply(mapTriggers)\n }\n\n if (outputName.startsWith(\"$\")) {\n throw new Error(`Unknown extra output '${outputName}'.`)\n }\n\n const outputModel = unit.model.outputs[outputName]\n if (!outputModel) {\n throw new Error(`Output '${outputName}' not found in the unit '${unit.model.type}'.`)\n }\n\n const entity = unit.entities.get(outputModel.type)\n if (!entity) {\n throw new Error(\n `Entity '${outputModel.type}' not found in the unit '${unit.model.type}'.`,\n )\n }\n\n return output(outputValue).apply(value => {\n if (value === undefined) {\n if (outputModel.required) {\n throw new Error(`Output '${outputName}' is required.`)\n }\n\n return undefined\n }\n\n const schema = outputModel.multiple ? Type.Array(entity.schema) : entity.schema\n\n if (!ajv.validate(schema, value)) {\n throw new Error(`Invalid output for '${outputName}': ${ajv.errorsText()}`)\n }\n\n return value\n })\n }) as Record<string, Output<unknown>> & ExtraOutputs\n\n await Promise.all(Object.values(result).map(o => outputToPromise(o)))\n\n if (Object.keys(createdSecrets).length > 0) {\n result.$secrets = createdSecrets\n }\n\n // collect artifacts from all outputs\n const artifactsMap: Record<string, UnitArtifact[]> = {}\n for (const [outputName, outputValue] of Object.entries(outputs)) {\n if (!outputName.startsWith(\"$\")) {\n const resolvedValue = await outputToPromise(outputValue)\n const artifacts = extractArtifactsFromValue(resolvedValue)\n if (artifacts.length > 0) {\n artifactsMap[outputName] = artifacts\n }\n }\n }\n\n if (Object.keys(artifactsMap).length > 0) {\n result.$artifacts = artifactsMap\n }\n\n return result\n },\n }\n}\n\nexport type EntityValue<T extends Entity> = Static<T[\"schema\"]>\nexport type EntityInput<T extends Entity> = Output<EntityValue<T>>\n\nfunction outputToPromise(o: unknown): Promise<unknown> {\n return new Promise(resolve => (output(o) as Output<unknown>).apply(resolve))\n}\n\nfunction mapStatusFields(status: Unwrap<ExtraOutputs[\"$statusFields\"]>): StatusField[] {\n if (!status) {\n return []\n }\n\n if (Array.isArray(status)) {\n return status\n .filter(field => !!field?.value)\n .map(field => {\n return {\n name: field!.name,\n meta: {\n title: field!.meta?.title ?? camelCaseToHumanReadable(field!.name),\n },\n value: field!.value,\n } as StatusField\n })\n }\n\n return Object.entries(status)\n .map(([name, field]) => {\n if (!field) {\n return undefined\n }\n\n if (\n typeof field === \"string\" ||\n typeof field === \"number\" ||\n typeof field === \"boolean\" ||\n Array.isArray(field)\n ) {\n return {\n name,\n meta: {\n title: camelCaseToHumanReadable(name),\n },\n value: field,\n }\n }\n\n return {\n ...(field as StatusField),\n meta: {\n ...field.meta,\n title: field.meta?.title ?? camelCaseToHumanReadable(name),\n },\n name,\n }\n })\n .filter(field => !!field?.value) as StatusField[]\n}\n\nfunction mapPages(pages: Unwrap<ExtraOutputs[\"$pages\"]>): InstancePage[] {\n if (!pages) {\n return []\n }\n\n if (Array.isArray(pages)) {\n return pages.filter(page => !!page)\n }\n\n return Object.entries(pages)\n .filter(([, page]) => !!page)\n .map(([name, page]) => ({ ...page!, name }))\n}\n\nexport function fileFromString(\n name: string,\n content: string,\n contentType = \"text/plain\",\n isSecret = false,\n): InstanceFile {\n return {\n meta: {\n name,\n contentType,\n size: Buffer.byteLength(content, \"utf8\"),\n },\n content: {\n type: \"embedded\",\n value: isSecret ? secret(content) : content,\n },\n }\n}\n\nexport function fileFromBuffer(\n name: string,\n content: Buffer,\n contentType = \"application/octet-stream\",\n isSecret = false,\n): InstanceFile {\n return {\n meta: {\n name,\n contentType,\n size: content.byteLength,\n isBinary: true,\n },\n content: {\n type: \"embedded\",\n value: isSecret ? secret(content.toString(\"base64\")) : content.toString(\"base64\"),\n },\n }\n}\n\nfunction mapTerminals(terminals: Unwrap<ExtraOutputs[\"$terminals\"]>): InstanceTerminal[] {\n if (!terminals) {\n return []\n }\n\n if (!Array.isArray(terminals)) {\n terminals = Object.entries(terminals).map(([name, terminal]) => {\n if (!terminal) {\n return undefined\n }\n\n return { ...terminal, name }\n })\n }\n\n return terminals\n .filter(terminal => !!terminal)\n .map(terminal => {\n if (!terminal.spec.files) {\n return terminal\n }\n\n return {\n ...terminal,\n\n spec: {\n ...terminal.spec,\n\n files: pipe(\n terminal.spec.files,\n mapValues(file => {\n if (typeof file === \"string\") {\n return {\n meta: {\n name: \"content\",\n contentType: \"text/plain\",\n size: Buffer.byteLength(file, \"utf8\"),\n },\n content: {\n type: \"embedded\" as const,\n value: file,\n },\n }\n }\n\n return file\n }),\n pickBy(value => !!value),\n ),\n },\n }\n })\n}\n\nfunction mapTriggers(triggers: Unwrap<ExtraOutputs[\"$triggers\"]>): InstanceTrigger[] {\n if (!triggers) {\n return []\n }\n\n if (Array.isArray(triggers)) {\n return triggers.filter(trigger => !!trigger)\n }\n\n return Object.entries(triggers)\n .filter(([, trigger]) => !!trigger)\n .map(([name, trigger]) => ({ ...(trigger as InstanceTrigger), name }))\n}\n\n/**\n * Extracts artifact objects from a value by traversing the object tree\n * looking for properties with HighstateSignature.Artifact.\n */\nfunction extractArtifactsFromValue(data: unknown): UnitArtifact[] {\n const artifacts: UnitArtifact[] = []\n\n function traverse(obj: unknown): void {\n if (obj === null || obj === undefined || typeof obj !== \"object\") {\n return\n }\n\n if (Array.isArray(obj)) {\n for (const item of obj) {\n traverse(item)\n }\n return\n }\n\n const record = obj as Record<string, unknown>\n\n // check if this object has an artifact signature\n if (HighstateSignature.Artifact in record) {\n const artifactData = record[HighstateSignature.Artifact] as UnitArtifact\n artifacts.push(artifactData)\n\n // strip all other properties except the artifact hash\n record[HighstateSignature.Artifact] = { hash: artifactData.hash }\n return\n }\n\n // recursively traverse all properties\n for (const value of Object.values(record)) {\n traverse(value)\n }\n }\n\n traverse(data)\n return artifacts\n}\n","import { type Input, type Unwrap, type Output, output, all } from \"@pulumi/pulumi\"\n\n/**\n * The input type for an array of inputs.\n * The same as `Input<Input<T>[]>`, but more readable.\n */\nexport type InputArray<T> = Input<Input<T>[]>\n\n/**\n * The input type for a map of inputs.\n * The same as `Input<Record<string, Input<T>>>`, but more readable.\n */\nexport type InputMap<T> = Input<Readonly<Record<string, Input<T>>>>\n\n/**\n * The input or input array type for a value.\n */\nexport type InputOrArray<T> = Input<T> | InputArray<T>\n\n/**\n * The input of inputs of inputs of inputs, so you got the idea.\n */\nexport type DeepInput<T> = [T] extends [Record<string, unknown> | undefined]\n ? [T] extends [infer U | undefined]\n ? Input<{ [K in keyof U]: DeepInput<U[K]> } | undefined>\n : Input<{ [K in keyof T]: DeepInput<T[K]> }>\n : [T] extends [Array<unknown> | undefined]\n ? [T] extends [(infer U)[] | undefined]\n ? Input<DeepInput<U>[] | undefined>\n : Input<DeepInput<T>[]>\n : Input<T>\n\n/**\n * Merges the given array of `InputOrArray` values into a single flat output array.\n *\n * @param values The values to merge.\n * @returns The merged output array.\n */\nexport function flattenInputs<T>(...values: (InputOrArray<T> | undefined)[]): Output<T[]> {\n return all(values).apply(allValues => {\n const result: T[] = []\n for (const value of allValues) {\n if (Array.isArray(value)) {\n result.push(...(value as T[]))\n } else if (value) {\n result.push(value as T)\n }\n }\n return result\n })\n}\n\n/**\n * Maps each element of an input array to a new value.\n * Produces an output array with the same length.\n *\n * @param array The input array.\n * @param fn The mapping function.\n * @returns The output array.\n */\nexport function mapInputs<T, U>(\n array: InputArray<T>,\n fn: (v: Unwrap<T>, index: number, all: Unwrap<T>[]) => U,\n): Output<U[]> {\n return output(array).apply(array => {\n return array?.map((v, index) => fn(v as Unwrap<T>, index, array as Unwrap<T>[])) ?? []\n })\n}\n\nexport function flatMapInput<T, U>(\n v1: InputOrArray<T>,\n v2: InputOrArray<T>,\n fn: (v: Unwrap<T>, index: number, all: Unwrap<T>[]) => U,\n): Output<U[]>\n\nexport function flatMapInput<T, U>(\n v1: InputOrArray<T>,\n v2: InputOrArray<T>,\n v3: InputOrArray<T>,\n fn: (v: Unwrap<T>, index: number, all: Unwrap<T>[]) => U,\n): Output<U[]>\n\n/**\n * Merges the given array of `InputOrArray` values into a single flat output array and maps each element to a new value.\n *\n * @param values The values to merge.\n * @param fn The mapping function.\n */\nexport function flatMapInput<T, U>(\n ...args: (InputOrArray<T> | ((v: Unwrap<T>, index: number, all: Unwrap<T>[]) => U))[]\n): Output<U[]> {\n const fn = args.pop() as (v: Unwrap<T>, index: number, all: Unwrap<T>[]) => U\n const values = args as InputOrArray<T>[]\n\n return mapInputs(flattenInputs(...values), fn)\n}\n\n/**\n * Map an optional value to another optional value.\n *\n * @param input The input value.\n * @param func The function to apply to the input value.\n * @returns The output value, or `undefined` if the input value is `undefined`.\n */\nexport function mapOptional<T, U>(input: T | undefined, func: (value: T) => U): U | undefined {\n if (input === undefined) {\n return undefined\n }\n\n return func(input)\n}\n\nexport function toPromise<T>(input: Input<T>): Promise<Unwrap<T>> {\n return new Promise(resolve => output(input).apply(resolve))\n}\n\nexport function singleton<T>(factory: () => T): () => T {\n let instance: T | undefined\n return () => {\n if (instance === undefined) {\n instance = factory()\n }\n\n return instance\n }\n}\n\nexport function providerFactory<TInput>(\n factory: (name: string) => TInput,\n): (name: string) => TInput {\n const instances = new Map<string, TInput>()\n return name => {\n if (!instances.has(name)) {\n instances.set(name, factory(name))\n }\n\n return instances.get(name)!\n }\n}\n\nexport function mergeInputObjects<\n T1 extends Record<string, unknown>,\n T2 extends Record<string, unknown>,\n>(obj1: Input<T1 | undefined> | undefined, obj2: Input<T2 | undefined> | undefined): Output<T1 & T2>\n\nexport function mergeInputObjects<\n T1 extends Record<string, unknown>,\n T2 extends Record<string, unknown>,\n T3 extends Record<string, unknown>,\n>(\n obj1: Input<T1 | undefined> | undefined,\n obj2: Input<T2 | undefined> | undefined,\n obj3: Input<T3 | undefined> | undefined,\n): Output<T1 & T2 & T3>\n\n/**\n * Merges the given input objects into a single output object.\n *\n * @param objects The input objects.\n * @returns The output object.\n */\nexport function mergeInputObjects(\n ...objects: Input<Record<string, unknown>>[]\n): Output<Record<string, unknown>> {\n return output(objects).apply(array => {\n return Object.assign({}, ...array) as Record<string, unknown>\n })\n}\n\nexport function normalize<T>(item: T | undefined, collection: T[] | undefined): T[] {\n if (item && collection) {\n return [item, ...collection]\n }\n\n if (item) {\n return [item]\n }\n\n return collection ?? []\n}\n\nexport function apply<T, U>(fn: (value: Unwrap<T>) => U): (input: Input<T>) => Output<U> {\n return input => output(input).apply(fn)\n}\n\nexport function applyMap<T, U>(fn: (value: Unwrap<T>) => U): (input: Input<T[]>) => Output<U[]> {\n return input => output(input).apply(array => array.map(fn))\n}\n"]}
|
1
|
+
{"version":3,"sources":["../src/secret.ts","../src/unit.ts","../src/utils.ts"],"names":["secret","pulumiSecret","instanceName","value","output","values","schema","HighstateSignature","secrets","array"],"mappings":"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","file":"index.js","sourcesContent":["import { HighstateSignature, type UnitSecretModel } from \"@highstate/contract\"\nimport { type Input, output, type Output, secret as pulumiSecret } from \"@pulumi/pulumi\"\n\nexport type UnitSecret<TValue> = Omit<UnitSecretModel, \"value\"> & {\n value: Output<TValue>\n}\n\nexport const updatedSecretValues: Record<string, unknown> = {}\n\n/**\n * Ensures that the provided secret contains a value.\n * If the secret value is undefined, it will create a new secret value using the provided create function.\n *\n * NOTE: This function mutates the internal state and affects the output of the unit.\n * Avoid calling this function multiple times for the same secret in a single unit execution.\n *\n * @param secret The secret to ensure a value for.\n * @param create The function to create a new secret value if the current value is undefined.\n * @return The secret with a guaranteed value.\n */\nexport function ensureSecretValue<TValue>(\n secret: UnitSecret<TValue>,\n create: () => Input<TValue>,\n): UnitSecret<NonNullable<TValue>> {\n return {\n [HighstateSignature.Secret]: true,\n id: secret.id,\n value: secret.value.apply(value => {\n if (value !== undefined) {\n return value\n }\n\n updatedSecretValues[secret.id] = pulumiSecret(create())\n return updatedSecretValues[secret.id]\n }) as Output<NonNullable<TValue>>,\n }\n}\n\n/**\n * Updates the value of the provided secret.\n * This function is used to store a new value for the secret regardless of its current value.\n *\n * NOTE: This function mutates the internal state and affects the output of the unit.\n * Avoid calling this function multiple times for the same secret in a single unit execution.\n *\n * @param secret The secret to update.\n * @param value The new value to store in the secret.\n * @returns The updated secret with the new value.\n */\nexport function updateSecretValue<TValue>(\n secret: UnitSecret<TValue>,\n value: Input<TValue>,\n): UnitSecret<TValue> {\n updatedSecretValues[secret.id] = pulumiSecret(value)\n\n return {\n [HighstateSignature.Secret]: true,\n id: secret.id,\n value: output(updatedSecretValues[secret.id]),\n }\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { DeepInput, InputArray, InputMap } from \"./utils\"\nimport type { ComponentSecret } from \"../../contract/src/unit\"\nimport {\n type ComponentInputSpec,\n type EntityModel,\n type Unit,\n type ComponentInput,\n type InstanceInput,\n parseInstanceId,\n getInstanceId,\n type ComponentArgumentSpec,\n type ComponentArgumentSpecToStatic,\n HighstateSignature,\n camelCaseToHumanReadable,\n z,\n type UnitSecretModel,\n unitSecretSchema,\n unitArtifactSchema,\n} from \"@highstate/contract\"\nimport { mapValues, pickBy, pipe } from \"remeda\"\nimport {\n Config,\n getStack,\n Output,\n output,\n secret,\n StackReference,\n type Input,\n type Unwrap,\n} from \"@pulumi/pulumi\"\nimport { Ajv } from \"ajv\"\nimport { updatedSecretValues, type UnitSecret } from \"./secret\"\n\nconst ajv = new Ajv({ strict: false })\n\nexport type ObjectMeta = {\n title?: Input<string | undefined>\n description?: Input<string | undefined>\n icon?: Input<string | undefined>\n iconColor?: Input<string | undefined>\n}\n\nexport type InstanceFileMeta = {\n name: Input<string>\n contentType?: Input<string>\n size?: Input<number>\n isBinary?: Input<boolean>\n mode?: Input<number>\n}\n\nexport type UnitArtifact = {\n hash: Input<string>\n meta?: Input<ObjectMeta>\n}\n\nexport type InstanceFile = {\n meta: Input<InstanceFileMeta>\n content:\n | { type: \"embedded\"; value: Input<string> }\n | {\n type: \"artifact\"\n [HighstateSignature.Artifact]: UnitArtifact\n }\n}\n\nexport type InstanceTerminalSpec = {\n image: Input<string>\n command: InputArray<string>\n cwd?: Input<string | undefined>\n env?: InputMap<string | undefined>\n files?: InputMap<InstanceFile | string | undefined>\n}\n\nexport type InstanceTerminal = {\n name: Input<string>\n meta: Input<ObjectMeta>\n spec: Input<InstanceTerminalSpec>\n}\n\nexport type StatusFieldValue = string | number | boolean | string[]\n\nexport type StatusField<TArgName extends string = string> = {\n name: Input<string>\n meta?: Input<ObjectMeta>\n complementaryTo?: Input<TArgName | undefined>\n value?: Input<StatusFieldValue | undefined>\n}\n\nexport type InstancePageBlock =\n | { type: \"markdown\"; content: Input<string> }\n | { type: \"qr\"; content: Input<string>; showContent?: boolean; language?: string }\n | ({ type: \"file\" } & InstanceFile)\n\nexport type InstancePage = {\n name: Input<string>\n meta: Input<ObjectMeta>\n content: InputArray<InstancePageBlock>\n}\n\nexport type InstanceTriggerSpec =\n | {\n type: \"before-destroy\"\n }\n | {\n type: \"schedule\"\n schedule: string\n }\n\nexport type InstanceTrigger = {\n name: Input<string>\n title: Input<string>\n description?: Input<string>\n spec: Input<InstanceTriggerSpec>\n}\n\nexport type InstanceWorker = {\n name: Input<string>\n image: Input<string>\n params?: InputMap<unknown>\n}\n\nexport type ExtraOutputs<TArgName extends string = string> = {\n $statusFields?:\n | InputMap<Omit<StatusField<TArgName>, \"name\"> | StatusFieldValue | undefined>\n | InputArray<StatusField<TArgName> | undefined>\n\n $terminals?:\n | InputMap<Omit<InstanceTerminal, \"name\"> | undefined>\n | InputArray<InstanceTerminal | undefined>\n\n $pages?: InputMap<Omit<InstancePage, \"name\"> | undefined> | InputArray<InstancePage | undefined>\n\n $triggers?:\n | InputMap<Omit<InstanceTrigger, \"name\"> | undefined>\n | InputArray<InstanceTrigger | undefined>\n\n $workers?:\n | InputMap<Omit<InstanceWorker, \"name\"> | undefined>\n | InputArray<InstanceWorker | undefined>\n}\n\nexport type InstanceTriggerInvocation = {\n name: string\n}\n\ntype OutputMapToDeepInputMap<T extends Record<string, unknown>, TArgName extends string> =\n T extends Record<string, never>\n ? ExtraOutputs\n : { [K in keyof T]: DeepInput<T[K]> } & ExtraOutputs<TArgName>\n\nexport type SecretValueMapToSecretMap<T extends Record<string, unknown>> = {\n [K in keyof T]-?: UnitSecret<T[K]>\n}\n\nexport interface UnitContext<\n TArgs extends Record<string, unknown>,\n TInputs extends Record<string, unknown>,\n TOutputs extends Record<string, unknown>,\n TSecrets extends Record<string, unknown>,\n> {\n args: TArgs\n instanceId: string\n type: string\n name: string\n secrets: SecretValueMapToSecretMap<TSecrets>\n\n inputs: TInputs extends Record<string, never>\n ? never\n : {\n [K in keyof TInputs]: undefined extends TInputs[K]\n ? Output<NonNullable<TInputs[K]>> | undefined\n : Output<TInputs[K]>\n }\n\n invokedTriggers: InstanceTriggerInvocation[]\n\n outputs(\n this: void,\n outputs?: OutputMapToDeepInputMap<TOutputs, keyof TArgs & string>,\n ): Promise<unknown>\n}\n\ntype InputSpecToValue<T extends ComponentInputSpec> = T[2] extends true\n ? z.infer<T[0][\"schema\"]>[]\n : T[1] extends true\n ? z.infer<T[0][\"schema\"]>\n : z.infer<T[0][\"schema\"]> | undefined\n\ntype InputSpecMapToValueMap<T extends Record<string, ComponentInputSpec>> =\n T extends Record<string, never>\n ? Record<string, never>\n : { [K in keyof T]: InputSpecToValue<T[K]> }\n\nconst stackRefMap = new Map<string, StackReference>()\nconst [projectId, instanceName] = getStack().split(\"_\")\n\nlet instanceId: string | undefined\n\nexport function getUnitInstanceId(): string {\n if (!instanceId) {\n throw new Error(\"Instance id is not set. Did you call 'forUnit' function?\")\n }\n\n return instanceId\n}\n\nexport function getResourceComment(): string {\n return `Managed by Highstate Unit (${getUnitInstanceId()})`\n}\n\nexport function getUnitInstanceName(): string {\n return instanceName\n}\n\nfunction getStackRef(input: InstanceInput) {\n const [instanceType, instanceName] = parseInstanceId(input.instanceId)\n const key = `organization/${instanceType}/${projectId}_${instanceName}`\n\n if (!stackRefMap.has(key)) {\n stackRefMap.set(key, new StackReference(key))\n }\n\n return stackRefMap.get(key)!\n}\n\nfunction getOutput(unit: Unit, input: ComponentInput, refs: InstanceInput[]) {\n const entity = unit.entities.get(input.type)\n if (!entity) {\n throw new Error(`Entity '${input.type}' not found in the unit '${unit.model.type}'.`)\n }\n\n const _getOutput = (ref: InstanceInput) => {\n const value = getStackRef(ref).requireOutput(ref.output)\n\n return value.apply(value => {\n if (Array.isArray(value)) {\n for (const [index, item] of value.entries()) {\n if (!ajv.validate(entity.schema, item)) {\n throw new Error(`Invalid output for '${input.type}[${index}]': ${ajv.errorsText()}`)\n }\n }\n } else {\n if (!ajv.validate(entity.schema, value)) {\n throw new Error(`Invalid output for '${input.type}': ${ajv.errorsText()}`)\n }\n }\n\n if (Array.isArray(value)) {\n return value\n }\n\n return input.multiple ? [value] : value\n })\n }\n\n const values = output(refs.map(ref => _getOutput(ref))).apply(values => values.flat())\n\n if (!input.multiple) {\n return values.apply(values => values[0])\n }\n\n return values\n}\n\nfunction isAnyOfSchema(schema: z.core.JSONSchema.BaseSchema, itemType: string): boolean {\n if (schema.anyOf) {\n return Object.values(schema.anyOf).every(schema => isAnyOfSchema(schema, itemType))\n }\n\n return schema.type === itemType\n}\n\nfunction isStringSchema(schema: z.core.JSONSchema.BaseSchema): boolean {\n if (schema.type === \"string\") {\n return true\n }\n\n if (isAnyOfSchema(schema, \"string\")) {\n return true\n }\n\n return false\n}\n\nfunction isNumberSchema(schema: z.core.JSONSchema.BaseSchema): boolean {\n if (schema.type === \"number\") {\n return true\n }\n\n if (isAnyOfSchema(schema, \"number\")) {\n return true\n }\n\n return false\n}\n\nfunction isBooleanSchema(schema: z.core.JSONSchema.BaseSchema): boolean {\n if (schema.type === \"boolean\") {\n return true\n }\n\n if (isAnyOfSchema(schema, \"boolean\")) {\n return true\n }\n\n return false\n}\n\nexport function forUnit<\n TArgs extends Record<string, ComponentArgumentSpec>,\n TInputs extends Record<string, ComponentInputSpec>,\n TOutputs extends Record<string, ComponentInputSpec>,\n TSecrets extends Record<string, ComponentArgumentSpec>,\n>(\n unit: Unit<TArgs, TInputs, TOutputs, TSecrets>,\n): UnitContext<\n //\n ComponentArgumentSpecToStatic<TArgs>,\n InputSpecMapToValueMap<TInputs>,\n InputSpecMapToValueMap<TOutputs>,\n ComponentArgumentSpecToStatic<TSecrets>\n> {\n const config = new Config()\n\n const args = mapValues(unit.model.args, (arg, argName) => {\n switch (true) {\n case isStringSchema(arg.schema): {\n if (arg.required) {\n return config.require(argName)\n }\n\n // handle empty strings as undefined\n return config.get(argName) || arg.schema.default\n }\n case isNumberSchema(arg.schema): {\n if (arg.required) {\n return config.requireNumber(argName)\n }\n\n // handle empty strings as undefined\n const value = config.get(argName)\n if (!value) {\n return arg.schema.default\n }\n\n return config.getNumber(argName) ?? arg.schema.default\n }\n case isBooleanSchema(arg.schema): {\n if (arg.required) {\n return config.requireBoolean(argName)\n }\n\n // handle empty strings as undefined\n const value = config.get(argName)\n if (!value) {\n return arg.schema.default\n }\n\n return config.getBoolean(argName) ?? arg.schema.default\n }\n default: {\n if (!arg.required) {\n const value = config.get(argName)\n // handle empty strings as undefined\n if (!value) {\n return arg.schema.default\n }\n }\n\n const value = arg.required ? config.requireObject(argName) : config.getObject(argName)\n if (value === undefined) return arg.schema.default\n\n if (!ajv.validate(arg.schema, value)) {\n throw new Error(`Invalid config for '${argName}': ${ajv.errorsText()}`)\n }\n\n return value\n }\n }\n }) as ComponentArgumentSpecToStatic<TArgs>\n\n const secretIds = config.requireObject<Record<string, string>>(\"$secretIds\")\n\n const getSecretValue = (\n secretName: string,\n secret: ComponentSecret,\n ): Output<unknown> | undefined => {\n switch (true) {\n case isStringSchema(secret.schema): {\n return secret.required ? config.requireSecret(secretName) : config.getSecret(secretName)\n }\n case isNumberSchema(secret.schema): {\n return secret.required\n ? config.requireSecretNumber(secretName)\n : config.getSecretNumber(secretName)\n }\n case isBooleanSchema(secret.schema): {\n return secret.required\n ? config.requireSecretBoolean(secretName)\n : config.getSecretBoolean(secretName)\n }\n default: {\n const value = secret.required\n ? config.requireSecretObject(secretName)\n : config.getSecretObject(secretName)\n\n if (!ajv.validate(secret.schema, value)) {\n throw new Error(`Invalid secret for '${secretName}': ${ajv.errorsText()}`)\n }\n\n return value\n }\n }\n }\n\n const secrets = mapValues(unit.model.secrets, (secret, secretName): UnitSecret<unknown> => {\n const secretId = secretIds[secretName]\n if (!secretId) {\n throw new Error(`Secret '${secretName}' not found in the config.`)\n }\n\n return {\n [HighstateSignature.Secret]: true,\n id: secretId,\n value: secret.required\n ? config.requireSecret(secretName)\n : output(getSecretValue(secretName, secret)),\n }\n })\n\n const inputs = mapValues(unit.model.inputs, (input, inputName) => {\n const value = input.required\n ? config.requireObject<InstanceInput[]>(`input.${inputName}`)\n : config.getObject<InstanceInput[]>(`input.${inputName}`)\n\n if (!value) {\n if (input.multiple) {\n return output([])\n }\n\n return undefined\n }\n\n return getOutput(unit as unknown as Unit, input, value)\n })\n\n const type = unit.model.type\n instanceId = getInstanceId(type, instanceName)\n\n return {\n args,\n instanceId,\n type,\n name: instanceName,\n secrets: secrets as SecretValueMapToSecretMap<ComponentArgumentSpecToStatic<TSecrets>>,\n inputs: inputs as any,\n invokedTriggers: config.getObject<InstanceTriggerInvocation[]>(\"$invokedTriggers\") ?? [],\n\n outputs: async (outputs: any = {}) => {\n const result: any = mapValues(outputs, (outputValue, outputName) => {\n if (outputName === \"$statusFields\") {\n return output(outputValue).apply(mapStatusFields)\n }\n\n if (outputName === \"$pages\") {\n return output(outputValue).apply(mapPages)\n }\n\n if (outputName === \"$terminals\") {\n return output(outputValue).apply(mapTerminals)\n }\n\n if (outputName === \"$triggers\") {\n return output(outputValue).apply(mapTriggers)\n }\n\n if (outputName.startsWith(\"$\")) {\n throw new Error(`Unknown extra output '${outputName}'.`)\n }\n\n const outputModel = unit.model.outputs[outputName]\n if (!outputModel) {\n throw new Error(`Output '${outputName}' not found in the unit '${unit.model.type}'.`)\n }\n\n const entity = unit.entities.get(outputModel.type)\n if (!entity) {\n throw new Error(\n `Entity '${outputModel.type}' not found in the unit '${unit.model.type}'.`,\n )\n }\n\n return output(outputValue).apply(value => {\n if (value === undefined) {\n if (outputModel.required) {\n throw new Error(`Output '${outputName}' is required.`)\n }\n\n return undefined\n }\n\n const schema = outputModel.multiple ? entity.schema.array() : entity.schema\n\n if (!ajv.validate(schema, value)) {\n throw new Error(`Invalid output for '${outputName}': ${ajv.errorsText()}`)\n }\n\n return value\n })\n }) as Record<string, Output<unknown>> & ExtraOutputs\n\n await Promise.all(Object.values(result).map(o => outputToPromise(o)))\n\n result.$secrets = updatedSecretValues\n\n // collect secrets from all outputs\n const secretsMap: Record<string, UnitSecretModel[]> = {}\n for (const [outputName, outputValue] of Object.entries(outputs)) {\n if (!outputName.startsWith(\"$\")) {\n const resolvedValue = await outputToPromise(outputValue)\n const secrets = extractObjectsFromValue(unitSecretSchema, resolvedValue)\n if (secrets.length > 0) {\n secretsMap[outputName] = secrets\n }\n }\n }\n\n // collect artifacts from all outputs\n const artifactsMap: Record<string, UnitArtifact[]> = {}\n for (const [outputName, outputValue] of Object.entries(outputs)) {\n if (!outputName.startsWith(\"$\")) {\n const resolvedValue = await outputToPromise(outputValue)\n const artifacts = extractObjectsFromValue(unitArtifactSchema, resolvedValue)\n if (artifacts.length > 0) {\n artifactsMap[outputName] = artifacts\n }\n }\n }\n\n if (Object.keys(artifactsMap).length > 0) {\n result.$exportedArtifacts = artifactsMap\n }\n\n if (Object.keys(secretsMap).length > 0) {\n result.$exportedSecretIds = mapValues(secretsMap, v => v.map(secret => secret.id))\n }\n\n return result\n },\n }\n}\n\nexport type EntityValue<T extends EntityModel> = z.infer<T[\"schema\"]>\nexport type EntityInput<T extends EntityModel> = Output<EntityValue<T>>\n\nfunction outputToPromise(o: unknown): Promise<unknown> {\n return new Promise(resolve => (output(o) as Output<unknown>).apply(resolve))\n}\n\nfunction mapStatusFields(status: Unwrap<ExtraOutputs[\"$statusFields\"]>): StatusField[] {\n if (!status) {\n return []\n }\n\n if (Array.isArray(status)) {\n return status\n .filter(field => !!field?.value)\n .map(field => {\n return {\n name: field!.name,\n meta: {\n title: field!.meta?.title ?? camelCaseToHumanReadable(field!.name),\n },\n value: field!.value,\n } as StatusField\n })\n }\n\n return Object.entries(status)\n .map(([name, field]) => {\n if (!field) {\n return undefined\n }\n\n if (\n typeof field === \"string\" ||\n typeof field === \"number\" ||\n typeof field === \"boolean\" ||\n Array.isArray(field)\n ) {\n return {\n name,\n meta: {\n title: camelCaseToHumanReadable(name),\n },\n value: field,\n }\n }\n\n return {\n ...(field as StatusField),\n meta: {\n ...field.meta,\n title: field.meta?.title ?? camelCaseToHumanReadable(name),\n },\n name,\n }\n })\n .filter(field => !!field?.value) as StatusField[]\n}\n\nfunction mapPages(pages: Unwrap<ExtraOutputs[\"$pages\"]>): InstancePage[] {\n if (!pages) {\n return []\n }\n\n if (Array.isArray(pages)) {\n return pages.filter(page => !!page)\n }\n\n return Object.entries(pages)\n .filter(([, page]) => !!page)\n .map(([name, page]) => ({ ...page!, name }))\n}\n\nexport function fileFromString(\n name: string,\n content: string,\n contentType = \"text/plain\",\n isSecret = false,\n): InstanceFile {\n return {\n meta: {\n name,\n contentType,\n size: Buffer.byteLength(content, \"utf8\"),\n },\n content: {\n type: \"embedded\",\n value: isSecret ? secret(content) : content,\n },\n }\n}\n\nexport function fileFromBuffer(\n name: string,\n content: Buffer,\n contentType = \"application/octet-stream\",\n isSecret = false,\n): InstanceFile {\n return {\n meta: {\n name,\n contentType,\n size: content.byteLength,\n isBinary: true,\n },\n content: {\n type: \"embedded\",\n value: isSecret ? secret(content.toString(\"base64\")) : content.toString(\"base64\"),\n },\n }\n}\n\nfunction mapTerminals(terminals: Unwrap<ExtraOutputs[\"$terminals\"]>): InstanceTerminal[] {\n if (!terminals) {\n return []\n }\n\n if (!Array.isArray(terminals)) {\n terminals = Object.entries(terminals).map(([name, terminal]) => {\n if (!terminal) {\n return undefined\n }\n\n return { ...terminal, name }\n })\n }\n\n return terminals\n .filter(terminal => !!terminal)\n .map(terminal => {\n if (!terminal.spec.files) {\n return terminal\n }\n\n return {\n ...terminal,\n\n spec: {\n ...terminal.spec,\n\n files: pipe(\n terminal.spec.files,\n mapValues(file => {\n if (typeof file === \"string\") {\n return {\n meta: {\n name: \"content\",\n contentType: \"text/plain\",\n size: Buffer.byteLength(file, \"utf8\"),\n },\n content: {\n type: \"embedded\" as const,\n value: file,\n },\n }\n }\n\n return file\n }),\n pickBy(value => !!value),\n ),\n },\n }\n })\n}\n\nfunction mapTriggers(triggers: Unwrap<ExtraOutputs[\"$triggers\"]>): InstanceTrigger[] {\n if (!triggers) {\n return []\n }\n\n if (Array.isArray(triggers)) {\n return triggers.filter(trigger => !!trigger)\n }\n\n return Object.entries(triggers)\n .filter(([, trigger]) => !!trigger)\n .map(([name, trigger]) => ({ ...(trigger as InstanceTrigger), name }))\n}\n\n/**\n * Extracts all objects with the specified schema from a value.\n */\nfunction extractObjectsFromValue<TSchema extends z.ZodType>(\n schema: TSchema,\n data: unknown,\n): z.infer<TSchema>[] {\n const result: z.infer<TSchema>[] = []\n\n function traverse(obj: unknown): void {\n if (obj === null || obj === undefined || typeof obj !== \"object\") {\n return\n }\n\n if (Array.isArray(obj)) {\n for (const item of obj) {\n traverse(item)\n }\n return\n }\n\n const parseResult = schema.safeParse(obj)\n if (parseResult.success) {\n result.push(parseResult.data)\n return\n }\n\n // recursively traverse all properties\n for (const value of Object.values(obj)) {\n traverse(value)\n }\n }\n\n traverse(data)\n return result\n}\n","import { type Input, type Unwrap, type Output, output, all } from \"@pulumi/pulumi\"\n\n/**\n * The input type for an array of inputs.\n * The same as `Input<Input<T>[]>`, but more readable.\n */\nexport type InputArray<T> = Input<Input<T>[]>\n\n/**\n * The input type for a map of inputs.\n * The same as `Input<Record<string, Input<T>>>`, but more readable.\n */\nexport type InputMap<T> = Input<Readonly<Record<string, Input<T>>>>\n\n/**\n * The input or input array type for a value.\n */\nexport type InputOrArray<T> = Input<T> | InputArray<T>\n\n/**\n * The input of inputs of inputs of inputs, so you got the idea.\n */\nexport type DeepInput<T> = [T] extends [Record<string, unknown> | undefined]\n ? [T] extends [infer U | undefined]\n ? Input<{ [K in keyof U]: DeepInput<U[K]> } | undefined>\n : Input<{ [K in keyof T]: DeepInput<T[K]> }>\n : [T] extends [Array<unknown> | undefined]\n ? [T] extends [(infer U)[] | undefined]\n ? Input<DeepInput<U>[] | undefined>\n : Input<DeepInput<T>[]>\n : Input<T>\n\n/**\n * Merges the given array of `InputOrArray` values into a single flat output array.\n *\n * @param values The values to merge.\n * @returns The merged output array.\n */\nexport function flattenInputs<T>(...values: (InputOrArray<T> | undefined)[]): Output<T[]> {\n return all(values).apply(allValues => {\n const result: T[] = []\n for (const value of allValues) {\n if (Array.isArray(value)) {\n result.push(...(value as T[]))\n } else if (value) {\n result.push(value as T)\n }\n }\n return result\n })\n}\n\n/**\n * Maps each element of an input array to a new value.\n * Produces an output array with the same length.\n *\n * @param array The input array.\n * @param fn The mapping function.\n * @returns The output array.\n */\nexport function mapInputs<T, U>(\n array: InputArray<T>,\n fn: (v: Unwrap<T>, index: number, all: Unwrap<T>[]) => U,\n): Output<U[]> {\n return output(array).apply(array => {\n return array?.map((v, index) => fn(v as Unwrap<T>, index, array as Unwrap<T>[])) ?? []\n })\n}\n\nexport function flatMapInput<T, U>(\n v1: InputOrArray<T>,\n v2: InputOrArray<T>,\n fn: (v: Unwrap<T>, index: number, all: Unwrap<T>[]) => U,\n): Output<U[]>\n\nexport function flatMapInput<T, U>(\n v1: InputOrArray<T>,\n v2: InputOrArray<T>,\n v3: InputOrArray<T>,\n fn: (v: Unwrap<T>, index: number, all: Unwrap<T>[]) => U,\n): Output<U[]>\n\n/**\n * Merges the given array of `InputOrArray` values into a single flat output array and maps each element to a new value.\n *\n * @param values The values to merge.\n * @param fn The mapping function.\n */\nexport function flatMapInput<T, U>(\n ...args: (InputOrArray<T> | ((v: Unwrap<T>, index: number, all: Unwrap<T>[]) => U))[]\n): Output<U[]> {\n const fn = args.pop() as (v: Unwrap<T>, index: number, all: Unwrap<T>[]) => U\n const values = args as InputOrArray<T>[]\n\n return mapInputs(flattenInputs(...values), fn)\n}\n\n/**\n * Map an optional value to another optional value.\n *\n * @param input The input value.\n * @param func The function to apply to the input value.\n * @returns The output value, or `undefined` if the input value is `undefined`.\n */\nexport function mapOptional<T, U>(input: T | undefined, func: (value: T) => U): U | undefined {\n if (input === undefined) {\n return undefined\n }\n\n return func(input)\n}\n\nexport function toPromise<T>(input: Input<T>): Promise<Unwrap<T>> {\n return new Promise(resolve => output(input).apply(resolve))\n}\n\nexport function singleton<T>(factory: () => T): () => T {\n let instance: T | undefined\n return () => {\n if (instance === undefined) {\n instance = factory()\n }\n\n return instance\n }\n}\n\nexport function providerFactory<TInput>(\n factory: (name: string) => TInput,\n): (name: string) => TInput {\n const instances = new Map<string, TInput>()\n return name => {\n if (!instances.has(name)) {\n instances.set(name, factory(name))\n }\n\n return instances.get(name)!\n }\n}\n\nexport function mergeInputObjects<\n T1 extends Record<string, unknown>,\n T2 extends Record<string, unknown>,\n>(obj1: Input<T1 | undefined> | undefined, obj2: Input<T2 | undefined> | undefined): Output<T1 & T2>\n\nexport function mergeInputObjects<\n T1 extends Record<string, unknown>,\n T2 extends Record<string, unknown>,\n T3 extends Record<string, unknown>,\n>(\n obj1: Input<T1 | undefined> | undefined,\n obj2: Input<T2 | undefined> | undefined,\n obj3: Input<T3 | undefined> | undefined,\n): Output<T1 & T2 & T3>\n\n/**\n * Merges the given input objects into a single output object.\n *\n * @param objects The input objects.\n * @returns The output object.\n */\nexport function mergeInputObjects(\n ...objects: Input<Record<string, unknown>>[]\n): Output<Record<string, unknown>> {\n return output(objects).apply(array => {\n return Object.assign({}, ...array) as Record<string, unknown>\n })\n}\n\nexport function normalize<T>(item: T | undefined, collection: T[] | undefined): T[] {\n if (item && collection) {\n return [item, ...collection]\n }\n\n if (item) {\n return [item]\n }\n\n return collection ?? []\n}\n\nexport function apply<T, U>(fn: (value: Unwrap<T>) => U): (input: Input<T>) => Output<U> {\n return input => output(input).apply(fn)\n}\n\nexport function applyMap<T, U>(fn: (value: Unwrap<T>) => U): (input: Input<T[]>) => Output<U[]> {\n return input => output(input).apply(array => array.map(fn))\n}\n"]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@highstate/pulumi",
|
3
|
-
"version": "0.9.
|
3
|
+
"version": "0.9.18",
|
4
4
|
"type": "module",
|
5
5
|
"files": [
|
6
6
|
"dist",
|
@@ -19,15 +19,15 @@
|
|
19
19
|
"build": "highstate build"
|
20
20
|
},
|
21
21
|
"dependencies": {
|
22
|
-
"@highstate/contract": "^0.9.
|
23
|
-
"@pulumi/pulumi": "^3.
|
22
|
+
"@highstate/contract": "^0.9.18",
|
23
|
+
"@pulumi/pulumi": "^3.184.0",
|
24
24
|
"@sinclair/typebox": "^0.34.11",
|
25
25
|
"ajv": "^8.17.1",
|
26
26
|
"import-meta-resolve": "^4.1.0",
|
27
27
|
"remeda": "^2.21.0"
|
28
28
|
},
|
29
29
|
"devDependencies": {
|
30
|
-
"@highstate/cli": "^0.9.
|
30
|
+
"@highstate/cli": "^0.9.18"
|
31
31
|
},
|
32
|
-
"gitHead": "
|
32
|
+
"gitHead": "9ebcd7da56b00b8ca08bf52cc8438f527338cd64"
|
33
33
|
}
|
package/src/index.ts
CHANGED
package/src/secret.ts
CHANGED
@@ -1,30 +1,61 @@
|
|
1
|
-
import {
|
1
|
+
import { HighstateSignature, type UnitSecretModel } from "@highstate/contract"
|
2
|
+
import { type Input, output, type Output, secret as pulumiSecret } from "@pulumi/pulumi"
|
2
3
|
|
3
|
-
export
|
4
|
+
export type UnitSecret<TValue> = Omit<UnitSecretModel, "value"> & {
|
5
|
+
value: Output<TValue>
|
6
|
+
}
|
4
7
|
|
5
|
-
export
|
6
|
-
TSecrets extends Record<string, unknown>,
|
7
|
-
TResult extends TSecrets[keyof TSecrets],
|
8
|
-
>(secrets: Output<TSecrets>, key: keyof TSecrets, create: () => Input<TResult>): Output<TResult> {
|
9
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
|
10
|
-
return secrets[key as any].apply(value => {
|
11
|
-
if (value !== undefined) {
|
12
|
-
// if the secret is accessed via "getOrCreateSecret" with assume it automatically created (even if it was not)
|
13
|
-
// in order to provide stable stack outputs
|
14
|
-
createdSecrets[key as string] = value as Output<unknown>
|
15
|
-
return value as TResult
|
16
|
-
}
|
8
|
+
export const updatedSecretValues: Record<string, unknown> = {}
|
17
9
|
|
18
|
-
|
19
|
-
|
10
|
+
/**
|
11
|
+
* Ensures that the provided secret contains a value.
|
12
|
+
* If the secret value is undefined, it will create a new secret value using the provided create function.
|
13
|
+
*
|
14
|
+
* NOTE: This function mutates the internal state and affects the output of the unit.
|
15
|
+
* Avoid calling this function multiple times for the same secret in a single unit execution.
|
16
|
+
*
|
17
|
+
* @param secret The secret to ensure a value for.
|
18
|
+
* @param create The function to create a new secret value if the current value is undefined.
|
19
|
+
* @return The secret with a guaranteed value.
|
20
|
+
*/
|
21
|
+
export function ensureSecretValue<TValue>(
|
22
|
+
secret: UnitSecret<TValue>,
|
23
|
+
create: () => Input<TValue>,
|
24
|
+
): UnitSecret<NonNullable<TValue>> {
|
25
|
+
return {
|
26
|
+
[HighstateSignature.Secret]: true,
|
27
|
+
id: secret.id,
|
28
|
+
value: secret.value.apply(value => {
|
29
|
+
if (value !== undefined) {
|
30
|
+
return value
|
31
|
+
}
|
20
32
|
|
21
|
-
|
22
|
-
|
33
|
+
updatedSecretValues[secret.id] = pulumiSecret(create())
|
34
|
+
return updatedSecretValues[secret.id]
|
35
|
+
}) as Output<NonNullable<TValue>>,
|
36
|
+
}
|
23
37
|
}
|
24
38
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
39
|
+
/**
|
40
|
+
* Updates the value of the provided secret.
|
41
|
+
* This function is used to store a new value for the secret regardless of its current value.
|
42
|
+
*
|
43
|
+
* NOTE: This function mutates the internal state and affects the output of the unit.
|
44
|
+
* Avoid calling this function multiple times for the same secret in a single unit execution.
|
45
|
+
*
|
46
|
+
* @param secret The secret to update.
|
47
|
+
* @param value The new value to store in the secret.
|
48
|
+
* @returns The updated secret with the new value.
|
49
|
+
*/
|
50
|
+
export function updateSecretValue<TValue>(
|
51
|
+
secret: UnitSecret<TValue>,
|
52
|
+
value: Input<TValue>,
|
53
|
+
): UnitSecret<TValue> {
|
54
|
+
updatedSecretValues[secret.id] = pulumiSecret(value)
|
55
|
+
|
56
|
+
return {
|
57
|
+
[HighstateSignature.Secret]: true,
|
58
|
+
id: secret.id,
|
59
|
+
value: output(updatedSecretValues[secret.id]),
|
60
|
+
}
|
30
61
|
}
|
package/src/unit.ts
CHANGED
@@ -5,22 +5,24 @@
|
|
5
5
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
6
6
|
|
7
7
|
import type { DeepInput, InputArray, InputMap } from "./utils"
|
8
|
+
import type { ComponentSecret } from "../../contract/src/unit"
|
8
9
|
import {
|
9
|
-
type ArgumentValue,
|
10
10
|
type ComponentInputSpec,
|
11
|
-
type
|
11
|
+
type EntityModel,
|
12
12
|
type Unit,
|
13
13
|
type ComponentInput,
|
14
14
|
type InstanceInput,
|
15
15
|
parseInstanceId,
|
16
|
-
type ArgumentValueSchema,
|
17
16
|
getInstanceId,
|
18
17
|
type ComponentArgumentSpec,
|
19
18
|
type ComponentArgumentSpecToStatic,
|
20
19
|
HighstateSignature,
|
21
20
|
camelCaseToHumanReadable,
|
21
|
+
z,
|
22
|
+
type UnitSecretModel,
|
23
|
+
unitSecretSchema,
|
24
|
+
unitArtifactSchema,
|
22
25
|
} from "@highstate/contract"
|
23
|
-
import { Type, type Static } from "@sinclair/typebox"
|
24
26
|
import { mapValues, pickBy, pipe } from "remeda"
|
25
27
|
import {
|
26
28
|
Config,
|
@@ -33,7 +35,7 @@ import {
|
|
33
35
|
type Unwrap,
|
34
36
|
} from "@pulumi/pulumi"
|
35
37
|
import { Ajv } from "ajv"
|
36
|
-
import {
|
38
|
+
import { updatedSecretValues, type UnitSecret } from "./secret"
|
37
39
|
|
38
40
|
const ajv = new Ajv({ strict: false })
|
39
41
|
|
@@ -117,6 +119,12 @@ export type InstanceTrigger = {
|
|
117
119
|
spec: Input<InstanceTriggerSpec>
|
118
120
|
}
|
119
121
|
|
122
|
+
export type InstanceWorker = {
|
123
|
+
name: Input<string>
|
124
|
+
image: Input<string>
|
125
|
+
params?: InputMap<unknown>
|
126
|
+
}
|
127
|
+
|
120
128
|
export type ExtraOutputs<TArgName extends string = string> = {
|
121
129
|
$statusFields?:
|
122
130
|
| InputMap<Omit<StatusField<TArgName>, "name"> | StatusFieldValue | undefined>
|
@@ -131,6 +139,10 @@ export type ExtraOutputs<TArgName extends string = string> = {
|
|
131
139
|
$triggers?:
|
132
140
|
| InputMap<Omit<InstanceTrigger, "name"> | undefined>
|
133
141
|
| InputArray<InstanceTrigger | undefined>
|
142
|
+
|
143
|
+
$workers?:
|
144
|
+
| InputMap<Omit<InstanceWorker, "name"> | undefined>
|
145
|
+
| InputArray<InstanceWorker | undefined>
|
134
146
|
}
|
135
147
|
|
136
148
|
export type InstanceTriggerInvocation = {
|
@@ -142,17 +154,21 @@ type OutputMapToDeepInputMap<T extends Record<string, unknown>, TArgName extends
|
|
142
154
|
? ExtraOutputs
|
143
155
|
: { [K in keyof T]: DeepInput<T[K]> } & ExtraOutputs<TArgName>
|
144
156
|
|
157
|
+
export type SecretValueMapToSecretMap<T extends Record<string, unknown>> = {
|
158
|
+
[K in keyof T]-?: UnitSecret<T[K]>
|
159
|
+
}
|
160
|
+
|
145
161
|
export interface UnitContext<
|
146
|
-
TArgs extends Record<string,
|
162
|
+
TArgs extends Record<string, unknown>,
|
147
163
|
TInputs extends Record<string, unknown>,
|
148
164
|
TOutputs extends Record<string, unknown>,
|
149
|
-
TSecrets extends Record<string,
|
165
|
+
TSecrets extends Record<string, unknown>,
|
150
166
|
> {
|
151
167
|
args: TArgs
|
152
168
|
instanceId: string
|
153
169
|
type: string
|
154
170
|
name: string
|
155
|
-
secrets:
|
171
|
+
secrets: SecretValueMapToSecretMap<TSecrets>
|
156
172
|
|
157
173
|
inputs: TInputs extends Record<string, never>
|
158
174
|
? never
|
@@ -171,10 +187,10 @@ export interface UnitContext<
|
|
171
187
|
}
|
172
188
|
|
173
189
|
type InputSpecToValue<T extends ComponentInputSpec> = T[2] extends true
|
174
|
-
?
|
190
|
+
? z.infer<T[0]["schema"]>[]
|
175
191
|
: T[1] extends true
|
176
|
-
?
|
177
|
-
:
|
192
|
+
? z.infer<T[0]["schema"]>
|
193
|
+
: z.infer<T[0]["schema"]> | undefined
|
178
194
|
|
179
195
|
type InputSpecMapToValueMap<T extends Record<string, ComponentInputSpec>> =
|
180
196
|
T extends Record<string, never>
|
@@ -252,17 +268,15 @@ function getOutput(unit: Unit, input: ComponentInput, refs: InstanceInput[]) {
|
|
252
268
|
return values
|
253
269
|
}
|
254
270
|
|
255
|
-
function isAnyOfSchema(schema:
|
271
|
+
function isAnyOfSchema(schema: z.core.JSONSchema.BaseSchema, itemType: string): boolean {
|
256
272
|
if (schema.anyOf) {
|
257
|
-
return Object.values(schema.anyOf).every(schema =>
|
258
|
-
isAnyOfSchema(schema as ArgumentValueSchema, itemType),
|
259
|
-
)
|
273
|
+
return Object.values(schema.anyOf).every(schema => isAnyOfSchema(schema, itemType))
|
260
274
|
}
|
261
275
|
|
262
276
|
return schema.type === itemType
|
263
277
|
}
|
264
278
|
|
265
|
-
function isStringSchema(schema:
|
279
|
+
function isStringSchema(schema: z.core.JSONSchema.BaseSchema): boolean {
|
266
280
|
if (schema.type === "string") {
|
267
281
|
return true
|
268
282
|
}
|
@@ -274,7 +288,7 @@ function isStringSchema(schema: ArgumentValueSchema): boolean {
|
|
274
288
|
return false
|
275
289
|
}
|
276
290
|
|
277
|
-
function isNumberSchema(schema:
|
291
|
+
function isNumberSchema(schema: z.core.JSONSchema.BaseSchema): boolean {
|
278
292
|
if (schema.type === "number") {
|
279
293
|
return true
|
280
294
|
}
|
@@ -286,7 +300,7 @@ function isNumberSchema(schema: ArgumentValueSchema): boolean {
|
|
286
300
|
return false
|
287
301
|
}
|
288
302
|
|
289
|
-
function isBooleanSchema(schema:
|
303
|
+
function isBooleanSchema(schema: z.core.JSONSchema.BaseSchema): boolean {
|
290
304
|
if (schema.type === "boolean") {
|
291
305
|
return true
|
292
306
|
}
|
@@ -371,36 +385,54 @@ export function forUnit<
|
|
371
385
|
}
|
372
386
|
}) as ComponentArgumentSpecToStatic<TArgs>
|
373
387
|
|
374
|
-
const
|
375
|
-
mapValues(unit.model.secrets, (secret, secretName) => {
|
376
|
-
switch (true) {
|
377
|
-
case isStringSchema(secret.schema): {
|
378
|
-
return secret.required ? config.requireSecret(secretName) : config.getSecret(secretName)
|
379
|
-
}
|
380
|
-
case isNumberSchema(secret.schema): {
|
381
|
-
return secret.required
|
382
|
-
? config.requireSecretNumber(secretName)
|
383
|
-
: config.getSecretNumber(secretName)
|
384
|
-
}
|
385
|
-
case isBooleanSchema(secret.schema): {
|
386
|
-
return secret.required
|
387
|
-
? config.requireSecretBoolean(secretName)
|
388
|
-
: config.getSecretBoolean(secretName)
|
389
|
-
}
|
390
|
-
default: {
|
391
|
-
const value = secret.required
|
392
|
-
? config.requireSecretObject(secretName)
|
393
|
-
: config.getSecretObject(secretName)
|
388
|
+
const secretIds = config.requireObject<Record<string, string>>("$secretIds")
|
394
389
|
|
395
|
-
|
396
|
-
|
397
|
-
|
390
|
+
const getSecretValue = (
|
391
|
+
secretName: string,
|
392
|
+
secret: ComponentSecret,
|
393
|
+
): Output<unknown> | undefined => {
|
394
|
+
switch (true) {
|
395
|
+
case isStringSchema(secret.schema): {
|
396
|
+
return secret.required ? config.requireSecret(secretName) : config.getSecret(secretName)
|
397
|
+
}
|
398
|
+
case isNumberSchema(secret.schema): {
|
399
|
+
return secret.required
|
400
|
+
? config.requireSecretNumber(secretName)
|
401
|
+
: config.getSecretNumber(secretName)
|
402
|
+
}
|
403
|
+
case isBooleanSchema(secret.schema): {
|
404
|
+
return secret.required
|
405
|
+
? config.requireSecretBoolean(secretName)
|
406
|
+
: config.getSecretBoolean(secretName)
|
407
|
+
}
|
408
|
+
default: {
|
409
|
+
const value = secret.required
|
410
|
+
? config.requireSecretObject(secretName)
|
411
|
+
: config.getSecretObject(secretName)
|
398
412
|
|
399
|
-
|
413
|
+
if (!ajv.validate(secret.schema, value)) {
|
414
|
+
throw new Error(`Invalid secret for '${secretName}': ${ajv.errorsText()}`)
|
400
415
|
}
|
416
|
+
|
417
|
+
return value
|
401
418
|
}
|
402
|
-
}
|
403
|
-
|
419
|
+
}
|
420
|
+
}
|
421
|
+
|
422
|
+
const secrets = mapValues(unit.model.secrets, (secret, secretName): UnitSecret<unknown> => {
|
423
|
+
const secretId = secretIds[secretName]
|
424
|
+
if (!secretId) {
|
425
|
+
throw new Error(`Secret '${secretName}' not found in the config.`)
|
426
|
+
}
|
427
|
+
|
428
|
+
return {
|
429
|
+
[HighstateSignature.Secret]: true,
|
430
|
+
id: secretId,
|
431
|
+
value: secret.required
|
432
|
+
? config.requireSecret(secretName)
|
433
|
+
: output(getSecretValue(secretName, secret)),
|
434
|
+
}
|
435
|
+
})
|
404
436
|
|
405
437
|
const inputs = mapValues(unit.model.inputs, (input, inputName) => {
|
406
438
|
const value = input.required
|
@@ -426,7 +458,7 @@ export function forUnit<
|
|
426
458
|
instanceId,
|
427
459
|
type,
|
428
460
|
name: instanceName,
|
429
|
-
secrets
|
461
|
+
secrets: secrets as SecretValueMapToSecretMap<ComponentArgumentSpecToStatic<TSecrets>>,
|
430
462
|
inputs: inputs as any,
|
431
463
|
invokedTriggers: config.getObject<InstanceTriggerInvocation[]>("$invokedTriggers") ?? [],
|
432
464
|
|
@@ -473,7 +505,7 @@ export function forUnit<
|
|
473
505
|
return undefined
|
474
506
|
}
|
475
507
|
|
476
|
-
const schema = outputModel.multiple ?
|
508
|
+
const schema = outputModel.multiple ? entity.schema.array() : entity.schema
|
477
509
|
|
478
510
|
if (!ajv.validate(schema, value)) {
|
479
511
|
throw new Error(`Invalid output for '${outputName}': ${ajv.errorsText()}`)
|
@@ -485,8 +517,18 @@ export function forUnit<
|
|
485
517
|
|
486
518
|
await Promise.all(Object.values(result).map(o => outputToPromise(o)))
|
487
519
|
|
488
|
-
|
489
|
-
|
520
|
+
result.$secrets = updatedSecretValues
|
521
|
+
|
522
|
+
// collect secrets from all outputs
|
523
|
+
const secretsMap: Record<string, UnitSecretModel[]> = {}
|
524
|
+
for (const [outputName, outputValue] of Object.entries(outputs)) {
|
525
|
+
if (!outputName.startsWith("$")) {
|
526
|
+
const resolvedValue = await outputToPromise(outputValue)
|
527
|
+
const secrets = extractObjectsFromValue(unitSecretSchema, resolvedValue)
|
528
|
+
if (secrets.length > 0) {
|
529
|
+
secretsMap[outputName] = secrets
|
530
|
+
}
|
531
|
+
}
|
490
532
|
}
|
491
533
|
|
492
534
|
// collect artifacts from all outputs
|
@@ -494,7 +536,7 @@ export function forUnit<
|
|
494
536
|
for (const [outputName, outputValue] of Object.entries(outputs)) {
|
495
537
|
if (!outputName.startsWith("$")) {
|
496
538
|
const resolvedValue = await outputToPromise(outputValue)
|
497
|
-
const artifacts =
|
539
|
+
const artifacts = extractObjectsFromValue(unitArtifactSchema, resolvedValue)
|
498
540
|
if (artifacts.length > 0) {
|
499
541
|
artifactsMap[outputName] = artifacts
|
500
542
|
}
|
@@ -502,7 +544,11 @@ export function forUnit<
|
|
502
544
|
}
|
503
545
|
|
504
546
|
if (Object.keys(artifactsMap).length > 0) {
|
505
|
-
result.$
|
547
|
+
result.$exportedArtifacts = artifactsMap
|
548
|
+
}
|
549
|
+
|
550
|
+
if (Object.keys(secretsMap).length > 0) {
|
551
|
+
result.$exportedSecretIds = mapValues(secretsMap, v => v.map(secret => secret.id))
|
506
552
|
}
|
507
553
|
|
508
554
|
return result
|
@@ -510,8 +556,8 @@ export function forUnit<
|
|
510
556
|
}
|
511
557
|
}
|
512
558
|
|
513
|
-
export type EntityValue<T extends
|
514
|
-
export type EntityInput<T extends
|
559
|
+
export type EntityValue<T extends EntityModel> = z.infer<T["schema"]>
|
560
|
+
export type EntityInput<T extends EntityModel> = Output<EntityValue<T>>
|
515
561
|
|
516
562
|
function outputToPromise(o: unknown): Promise<unknown> {
|
517
563
|
return new Promise(resolve => (output(o) as Output<unknown>).apply(resolve))
|
@@ -691,11 +737,13 @@ function mapTriggers(triggers: Unwrap<ExtraOutputs["$triggers"]>): InstanceTrigg
|
|
691
737
|
}
|
692
738
|
|
693
739
|
/**
|
694
|
-
* Extracts
|
695
|
-
* looking for properties with HighstateSignature.Artifact.
|
740
|
+
* Extracts all objects with the specified schema from a value.
|
696
741
|
*/
|
697
|
-
function
|
698
|
-
|
742
|
+
function extractObjectsFromValue<TSchema extends z.ZodType>(
|
743
|
+
schema: TSchema,
|
744
|
+
data: unknown,
|
745
|
+
): z.infer<TSchema>[] {
|
746
|
+
const result: z.infer<TSchema>[] = []
|
699
747
|
|
700
748
|
function traverse(obj: unknown): void {
|
701
749
|
if (obj === null || obj === undefined || typeof obj !== "object") {
|
@@ -709,24 +757,18 @@ function extractArtifactsFromValue(data: unknown): UnitArtifact[] {
|
|
709
757
|
return
|
710
758
|
}
|
711
759
|
|
712
|
-
const
|
713
|
-
|
714
|
-
|
715
|
-
if (HighstateSignature.Artifact in record) {
|
716
|
-
const artifactData = record[HighstateSignature.Artifact] as UnitArtifact
|
717
|
-
artifacts.push(artifactData)
|
718
|
-
|
719
|
-
// strip all other properties except the artifact hash
|
720
|
-
record[HighstateSignature.Artifact] = { hash: artifactData.hash }
|
760
|
+
const parseResult = schema.safeParse(obj)
|
761
|
+
if (parseResult.success) {
|
762
|
+
result.push(parseResult.data)
|
721
763
|
return
|
722
764
|
}
|
723
765
|
|
724
766
|
// recursively traverse all properties
|
725
|
-
for (const value of Object.values(
|
767
|
+
for (const value of Object.values(obj)) {
|
726
768
|
traverse(value)
|
727
769
|
}
|
728
770
|
}
|
729
771
|
|
730
772
|
traverse(data)
|
731
|
-
return
|
773
|
+
return result
|
732
774
|
}
|