@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.
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "sourceHashes": {
3
- "./dist/index.js": 2152865667
3
+ "./dist/index.js": 938090806
4
4
  }
5
5
  }
package/dist/index.js CHANGED
@@ -1,25 +1,31 @@
1
- import { getStack, secret, Config, output, all, StackReference } from '@pulumi/pulumi';
1
+ import { getStack, secret, output, Config, all, StackReference } from '@pulumi/pulumi';
2
2
  export * from '@pulumi/pulumi';
3
- import { getInstanceId, camelCaseToHumanReadable, HighstateSignature, parseInstanceId } from '@highstate/contract';
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 createdSecrets = {};
10
- function getOrCreateSecret(secrets, key, create) {
11
- return secrets[key].apply((value) => {
12
- if (value !== void 0) {
13
- createdSecrets[key] = value;
14
- return value;
15
- }
16
- const secretValue = createdSecrets[key] ?? secret(create());
17
- createdSecrets[key] = secretValue;
18
- return secretValue;
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 storeSecret(_secrets, key, value) {
22
- createdSecrets[key] = value;
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 secrets = output(
163
- mapValues(unit.model.secrets, (secret3, secretName) => {
164
- switch (true) {
165
- case isStringSchema(secret3.schema): {
166
- return secret3.required ? config.requireSecret(secretName) : config.getSecret(secretName);
167
- }
168
- case isNumberSchema(secret3.schema): {
169
- return secret3.required ? config.requireSecretNumber(secretName) : config.getSecretNumber(secretName);
170
- }
171
- case isBooleanSchema(secret3.schema): {
172
- return secret3.required ? config.requireSecretBoolean(secretName) : config.getSecretBoolean(secretName);
173
- }
174
- default: {
175
- const value = secret3.required ? config.requireSecretObject(secretName) : config.getSecretObject(secretName);
176
- if (!ajv.validate(secret3.schema, value)) {
177
- throw new Error(`Invalid secret for '${secretName}': ${ajv.errorsText()}`);
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 ? Type.Array(entity.schema) : entity.schema;
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
- if (Object.keys(createdSecrets).length > 0) {
247
- result.$secrets = createdSecrets;
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 = extractArtifactsFromValue(resolvedValue);
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.$artifacts = artifactsMap;
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 extractArtifactsFromValue(data) {
397
- const artifacts = [];
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 record = obj;
409
- if (HighstateSignature.Artifact in record) {
410
- const artifactData = record[HighstateSignature.Artifact];
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(record)) {
438
+ for (const value of Object.values(obj)) {
416
439
  traverse(value);
417
440
  }
418
441
  }
419
442
  traverse(data);
420
- return artifacts;
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, getOrCreateSecret, getResourceComment, getUnitInstanceId, getUnitInstanceName, mapInputs, mapOptional, mergeInputObjects, normalize, providerFactory, singleton, storeSecret, toPromise };
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.16",
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.16",
23
- "@pulumi/pulumi": "^3.181.0",
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.16"
30
+ "@highstate/cli": "^0.9.18"
31
31
  },
32
- "gitHead": "458d6f1f9f6d4aec0ba75a2b2c4c01408cb9c8df"
32
+ "gitHead": "9ebcd7da56b00b8ca08bf52cc8438f527338cd64"
33
33
  }
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export * from "@pulumi/pulumi"
2
2
  export * from "./unit"
3
3
  export * from "./utils"
4
- export { getOrCreateSecret, storeSecret } from "./secret"
4
+ export { ensureSecretValue, updateSecretValue, type UnitSecret } from "./secret"
package/src/secret.ts CHANGED
@@ -1,30 +1,61 @@
1
- import { secret, type Input, type Output } from "@pulumi/pulumi"
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 const createdSecrets: Record<string, Output<unknown>> = {}
4
+ export type UnitSecret<TValue> = Omit<UnitSecretModel, "value"> & {
5
+ value: Output<TValue>
6
+ }
4
7
 
5
- export function getOrCreateSecret<
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
- const secretValue = createdSecrets[key as string] ?? secret(create())
19
- createdSecrets[key as string] = secretValue
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
- return secretValue
22
- }) as Output<TResult>
33
+ updatedSecretValues[secret.id] = pulumiSecret(create())
34
+ return updatedSecretValues[secret.id]
35
+ }) as Output<NonNullable<TValue>>,
36
+ }
23
37
  }
24
38
 
25
- export function storeSecret<
26
- TSecrets extends Record<string, unknown>,
27
- TResult extends TSecrets[keyof TSecrets],
28
- >(_secrets: Output<TSecrets>, key: keyof TSecrets, value: Input<TResult>): void {
29
- createdSecrets[key as string] = value as Output<unknown>
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 Entity,
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 { createdSecrets } from "./secret"
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, ArgumentValue>,
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, ArgumentValue>,
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: Output<TSecrets>
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
- ? Static<T[0]["schema"]>[]
190
+ ? z.infer<T[0]["schema"]>[]
175
191
  : T[1] extends true
176
- ? Static<T[0]["schema"]>
177
- : Static<T[0]["schema"]> | undefined
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: ArgumentValueSchema, itemType: string): boolean {
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: ArgumentValueSchema): boolean {
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: ArgumentValueSchema): boolean {
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: ArgumentValueSchema): boolean {
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 secrets = output(
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
- if (!ajv.validate(secret.schema, value)) {
396
- throw new Error(`Invalid secret for '${secretName}': ${ajv.errorsText()}`)
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
- return value
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
- ) as unknown as Output<ComponentArgumentSpecToStatic<TSecrets>>
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 ? Type.Array(entity.schema) : entity.schema
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
- if (Object.keys(createdSecrets).length > 0) {
489
- result.$secrets = createdSecrets
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 = extractArtifactsFromValue(resolvedValue)
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.$artifacts = artifactsMap
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 Entity> = Static<T["schema"]>
514
- export type EntityInput<T extends Entity> = Output<EntityValue<T>>
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 artifact objects from a value by traversing the object tree
695
- * looking for properties with HighstateSignature.Artifact.
740
+ * Extracts all objects with the specified schema from a value.
696
741
  */
697
- function extractArtifactsFromValue(data: unknown): UnitArtifact[] {
698
- const artifacts: UnitArtifact[] = []
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 record = obj as Record<string, unknown>
713
-
714
- // check if this object has an artifact signature
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(record)) {
767
+ for (const value of Object.values(obj)) {
726
768
  traverse(value)
727
769
  }
728
770
  }
729
771
 
730
772
  traverse(data)
731
- return artifacts
773
+ return result
732
774
  }