@highstate/backend 0.7.11 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -265,6 +265,13 @@ var operationOptionsSchema = z3.object({
265
265
  * By default, `false`.
266
266
  */
267
267
  deleteUnreachableResources: z3.boolean().default(false),
268
+ /**
269
+ * Whether to delete the stack state even if the destroy operation fails.
270
+ * This is very dangerous and should be used only when the stack is unrecoverable.
271
+ *
272
+ * By default, `false`.
273
+ */
274
+ forceDeleteState: z3.boolean().default(false),
268
275
  /**
269
276
  * Whether to refresh the state before running the operation.
270
277
  *
@@ -417,7 +424,7 @@ var createInputResolver = defineGraphResolver({
417
424
  return {
418
425
  component: output.component,
419
426
  resolvedInputs: output.resolvedInputs[input.output] ?? [],
420
- resolvedOutputs: output.resolvedOutputs[input.output] ?? []
427
+ resolvedOutputs: output.resolvedOutputs?.[input.output]
421
428
  };
422
429
  };
423
430
  if (node.kind === "hub") {
@@ -490,8 +497,12 @@ var createInputResolver = defineGraphResolver({
490
497
  addInstanceResult(inputName, { input, type: componentInput.type });
491
498
  return;
492
499
  }
493
- for (const output of resolvedOutputs) {
494
- addInstanceResult(inputName, { input: output, type: componentInput.type });
500
+ if (resolvedOutputs) {
501
+ for (const output of resolvedOutputs) {
502
+ addInstanceResult(inputName, { input: output, type: componentInput.type });
503
+ }
504
+ } else {
505
+ addInstanceResult(inputName, { input, type: componentInput.type });
495
506
  }
496
507
  };
497
508
  for (const [inputName, inputs] of Object.entries(node.instance.inputs ?? {})) {
@@ -536,7 +547,7 @@ var createInputResolver = defineGraphResolver({
536
547
  kind: "instance",
537
548
  component: node.component,
538
549
  resolvedInputs,
539
- resolvedOutputs: node.instance.resolvedOutputs ?? {},
550
+ resolvedOutputs: node.instance.resolvedOutputs,
540
551
  resolvedInjectionInputs: Array.from(injectionInputs.values()),
541
552
  matchedInjectionInputs: Array.from(matchedInjectionInputs.values())
542
553
  };
@@ -776,4 +787,4 @@ export {
776
787
  diffLibraries,
777
788
  applyLibraryUpdate
778
789
  };
779
- //# sourceMappingURL=chunk-JEOPTUKC.js.map
790
+ //# sourceMappingURL=chunk-I7NLZ54E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/project.ts","../src/shared/state.ts","../src/shared/operation.ts","../src/shared/resolvers/graph-resolver.ts","../src/shared/resolvers/input.ts","../src/shared/resolvers/input-hash.ts","../src/shared/resolvers/validation.ts","../src/shared/resolvers/registry.ts","../src/shared/terminal.ts","../src/shared/library.ts"],"sourcesContent":["import { z } from \"zod\"\n\nexport const positionSchema = z.object({\n x: z.number(),\n y: z.number(),\n})\n\nexport const instanceInputSchema = z.object({\n instanceId: z.string(),\n output: z.string(),\n})\n\nexport const hubInstanceInputSchema = z.object({\n hubId: z.string(),\n})\n\nexport const instanceModelPatchSchema = z.object({\n args: z.record(z.unknown()).optional(),\n inputs: z.record(z.array(instanceInputSchema)).optional(),\n hubInputs: z.record(z.array(hubInstanceInputSchema)).optional(),\n injectionInputs: z.array(hubInstanceInputSchema).optional(),\n position: positionSchema.optional(),\n})\n\nexport const instanceModelSchema = z.object({\n id: z.string(),\n type: z.string(),\n name: z.string(),\n\n ...instanceModelPatchSchema.shape,\n resolvedInputs: z.record(z.array(instanceInputSchema)).optional(),\n\n parentId: z.string().optional(),\n outputs: z.record(z.array(instanceInputSchema)).optional(),\n resolvedOutputs: z.record(z.array(instanceInputSchema)).optional(),\n})\n\nexport const compositeInstanceSchema = z.object({\n instance: instanceModelSchema,\n children: z.array(instanceModelSchema),\n inputHash: z.string().optional(),\n})\n\nexport type CompositeInstance = z.infer<typeof compositeInstanceSchema>\n\nexport const hubModelPatchSchema = z.object({\n position: positionSchema.optional(),\n inputs: z.array(instanceInputSchema).optional(),\n injectionInputs: z.array(hubInstanceInputSchema).optional(),\n})\n\nexport const hubModelSchema = z.object({\n id: z.string().nanoid(),\n position: positionSchema,\n\n inputs: z.array(instanceInputSchema).optional(),\n injectionInputs: z.array(hubInstanceInputSchema).optional(),\n})\n\nexport type InstanceModelPatch = z.infer<typeof instanceModelPatchSchema>\nexport type HubModel = z.infer<typeof hubModelSchema>\nexport type HubModelPatch = z.infer<typeof hubModelPatchSchema>\n","import { omit } from \"remeda\"\nimport { z } from \"zod\"\n\nexport const instanceStatusSchema = z.enum([\n \"not_created\",\n \"updating\",\n \"previewing\",\n \"destroying\",\n \"refreshing\",\n \"created\",\n \"error\",\n \"pending\",\n \"unknown\",\n])\n\nexport const instanceStatusFieldSchema = z.object({\n name: z.string(),\n value: z.string().optional(),\n displayName: z.string().optional(),\n sensitive: z.boolean().optional(),\n url: z.string().optional(),\n complementaryTo: z.string().optional(),\n})\n\nexport const instanceFileMetaSchema = z.object({\n name: z.string(),\n contentType: z.string(),\n size: z.number(),\n isBinary: z.boolean().optional(),\n})\n\nexport const instanceFileSchema = z.object({\n meta: instanceFileMetaSchema,\n content: z.string(),\n})\n\nexport const instancePageBlockSchema = z.union([\n z.object({\n type: z.literal(\"markdown\"),\n content: z.string(),\n }),\n z.object({\n type: z.literal(\"qr\"),\n content: z.string(),\n showContent: z.coerce.boolean(),\n language: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"file\"),\n fileMeta: instanceFileMetaSchema,\n }),\n])\n\nexport const instancePageMetaSchema = z.object({\n name: z.string(),\n title: z.string(),\n})\n\nexport const instancePageSchema = z.object({\n ...instancePageMetaSchema.shape,\n content: z.array(instancePageBlockSchema),\n})\n\nexport const instanceTerminalMetaSchema = z.object({\n name: z.string(),\n title: z.string(),\n description: z.string().optional(),\n})\n\nexport const instanceTerminalFileSchema = z.object({\n content: z.string().optional(),\n isBinary: z.boolean().optional(),\n mode: z.number().optional(),\n})\n\nexport const instanceTerminalSchema = z.object({\n ...instanceTerminalMetaSchema.shape,\n image: z.string(),\n command: z.string().array(),\n cwd: z.string().optional(),\n env: z.record(z.string()).optional(),\n files: z.record(instanceTerminalFileSchema).optional(),\n})\n\nexport const instanceTriggerSpecSchema = z.union([\n z.object({\n type: z.literal(\"before-destroy\"),\n }),\n z.object({\n type: z.literal(\"schedule\"),\n schedule: z.string(),\n }),\n])\n\nexport const instanceTriggerSchema = z.object({\n name: z.string(),\n title: z.string(),\n description: z.string().optional(),\n spec: instanceTriggerSpecSchema,\n})\n\nexport const instanceTriggerInvocationSchema = z.object({\n name: z.string(),\n})\n\nexport const instanceStateSchema = z.object({\n id: z.string(),\n parentId: z.string().nullable().default(null),\n status: instanceStatusSchema,\n dependencyIds: z.array(z.string()).default(() => []),\n\n latestOperationId: z.string().nullable().default(null),\n\n currentResourceCount: z.number().nullable().default(null),\n totalResourceCount: z.number().nullable().default(null),\n inputHash: z.string().nullable().default(null),\n outputHash: z.string().nullable().default(null),\n\n error: z.string().nullable().default(null),\n evaluationError: z.string().nullable().default(null),\n\n statusFields: z.array(instanceStatusFieldSchema).default(() => []),\n files: z.array(instanceFileMetaSchema).default(() => []),\n pages: z.array(instancePageMetaSchema).default(() => []),\n terminals: z.array(instanceTerminalMetaSchema).default(() => []),\n triggers: z.array(instanceTriggerSchema).default(() => []),\n})\n\nexport const instanceStateUpdateSchema = z\n .object({\n ...instanceStateSchema.shape,\n\n // secrets updated by the unit\n secrets: z.record(z.string()).nullable(),\n\n // log line emitted by the unit\n logLine: z.string().nullable(),\n })\n .partial()\n\nexport type InstanceStatusField = z.infer<typeof instanceStatusFieldSchema>\nexport type InstanceTerminal = z.infer<typeof instanceTerminalSchema>\n\nexport type InstanceStatus = z.infer<typeof instanceStatusSchema>\nexport type InstanceState = z.infer<typeof instanceStateSchema>\n\nexport type InstanceStateUpdate = z.infer<typeof instanceStateUpdateSchema>\n\nexport type InstancePageBlock = z.infer<typeof instancePageBlockSchema>\nexport type InstancePageMeta = z.infer<typeof instancePageMetaSchema>\nexport type InstanceFileMeta = z.infer<typeof instanceFileMetaSchema>\n\nexport type InstanceTriggerSpec = z.infer<typeof instanceTriggerSpecSchema>\nexport type InstanceTrigger = z.infer<typeof instanceTriggerSchema>\nexport type InstanceTriggerInvocation = z.infer<typeof instanceTriggerInvocationSchema>\n\nexport function createInstanceState(\n id: string,\n status: InstanceStatus = \"not_created\",\n fields: Partial<InstanceState> = {},\n): InstanceState {\n return {\n id,\n parentId: null,\n dependencyIds: [],\n status: status,\n\n latestOperationId: null,\n\n currentResourceCount: null,\n totalResourceCount: null,\n inputHash: null,\n outputHash: null,\n\n error: null,\n evaluationError: null,\n\n statusFields: [],\n files: [],\n pages: [],\n terminals: [],\n triggers: [],\n\n ...fields,\n }\n}\n\nexport function applyPartialInstanceState(\n states: Map<string, InstanceState>,\n patch: Partial<InstanceState>,\n): InstanceState {\n if (!patch.id) {\n throw new Error(\"The ID of the instance state is required.\")\n }\n\n let state = states.get(patch.id) ?? createInstanceState(patch.id, \"unknown\")\n state = { ...state, ...patch }\n\n states.set(state.id, state)\n return state\n}\n\nexport function createInstanceStatePatch(update: InstanceStateUpdate): Partial<InstanceState> {\n return omit(update, [\"secrets\", \"logLine\"])\n}\n\n/**\n * Builds a map where instance id -> instance state ids that directly depend on the instance.\n *\n * @param instanceStates The instance states to build the map from.\n */\nexport function buildDependentInstanceStateMap(\n instanceStates: Map<string, InstanceState>,\n): Map<string, string[]> {\n const dependentMap = new Map<string, string[]>()\n\n for (const state of instanceStates.values()) {\n for (const dependency of state.dependencyIds) {\n let dependents = dependentMap.get(dependency)\n if (!dependents) {\n dependents = []\n dependentMap.set(dependency, dependents)\n }\n\n dependents.push(state.id)\n }\n }\n\n return dependentMap\n}\n\n/**\n * Gets all instance ids that depend on the given instance id (including recursively).\n * The instance id itself is not included in the result.\n *\n * @param dependentMap The dependent map.\n * @param instanceId The instance id to get all dependent instance ids.\n */\nexport function getAllDependentInstanceIds(\n dependentMap: Map<string, string[]>,\n instanceId: string,\n): string[] {\n const result = new Set<string>()\n const visited = new Set<string>()\n\n const traverse = (id: string) => {\n if (visited.has(id)) return\n visited.add(id)\n\n const dependents = dependentMap.get(id)\n if (!dependents) return\n\n for (const dependent of dependents) {\n result.add(dependent)\n traverse(dependent)\n }\n }\n\n traverse(instanceId)\n\n return Array.from(result)\n}\n","import { z } from \"zod\"\n\nexport const operationTypeSchema = z.enum([\"update\", \"preview\", \"destroy\", \"recreate\", \"refresh\"])\n\nexport const operationStatusSchema = z.enum([\n \"pending\",\n \"running\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n])\n\nexport const operationOptionsSchema = z.object({\n /**\n * Whether to force update all dependencies of the instances even if they are not changed.\n *\n * Only applicable for `update`, `preview`, `recreate`, and `refresh` operations.\n * By default, `false`.\n */\n forceUpdateDependencies: z.boolean().default(false),\n\n /**\n * Whether to destroy all dependents of the instances when destroying them.\n *\n * Only applicable for `destroy`.\n * By default, `true`.\n */\n destroyDependentInstances: z.boolean().default(true),\n\n /**\n * Whether to invoke destroy triggers when destroying the instances.\n *\n * Only applicable for `destroy`.\n * By default, `true`.\n */\n invokeDestroyTriggers: z.boolean().default(true),\n\n /**\n * Whether to delete unreachable resources when updating or destroying the instances.\n * This is potentially dangerous and should be used with caution.\n *\n * By default, `false`.\n */\n deleteUnreachableResources: z.boolean().default(false),\n\n /**\n * Whether to delete the stack state even if the destroy operation fails.\n * This is very dangerous and should be used only when the stack is unrecoverable.\n *\n * By default, `false`.\n */\n forceDeleteState: z.boolean().default(false),\n\n /**\n * Whether to refresh the state before running the operation.\n *\n * By default, `false`.\n */\n refresh: z.boolean().default(false),\n})\n\nexport const projectOperationRequestSchema = z.object({\n projectId: z.string(),\n type: operationTypeSchema,\n instanceIds: z.array(z.string()),\n options: operationOptionsSchema.partial().optional(),\n})\n\nexport const projectOperationSchema = z.object({\n id: z.string().uuid(),\n status: operationStatusSchema,\n\n projectId: z.string(),\n type: operationTypeSchema,\n instanceIds: z.array(z.string()),\n affectedInstanceIds: z.array(z.string()).default(() => []),\n\n options: operationOptionsSchema.default(() => ({})),\n\n error: z.string().nullable(),\n startedAt: z.number(),\n completedAt: z.number().nullable(),\n})\n\nexport type OperationType = z.infer<typeof operationTypeSchema>\nexport type OperationStatus = z.infer<typeof operationStatusSchema>\nexport type ProjectOperation = z.infer<typeof projectOperationSchema>\nexport type ProjectOperationRequest = z.infer<typeof projectOperationRequestSchema>\nexport type OperationOptions = z.infer<typeof operationOptionsSchema>\n\nexport function isFinalOperationStatus(status: OperationStatus): boolean {\n return status === \"completed\" || status === \"failed\" || status === \"cancelled\"\n}\n","import type { Logger } from \"pino\"\nimport { unique } from \"remeda\"\n\nexport type GraphResolverOptions<TNode, TOutput> = {\n name: string\n\n getNodeId(input: TNode): string\n\n getNodeDependencies(input: TNode): string[]\n\n process(\n node: TNode,\n dependencies: ReadonlyMap<string, TOutput>,\n logger: Logger,\n ): TOutput | Promise<TOutput>\n}\n\nexport interface GraphResolverBackend<TOutput> {\n promiseCache: Map<string, Promise<TOutput>>\n\n setOutput?(id: string, value: TOutput): void\n setDependencies?(id: string, dependencies: string[]): void\n}\n\nexport type GraphResolverFactory<TNode, TOutput> = {\n factoryName: string\n} & ((\n nodes: ReadonlyMap<string, TNode>,\n logger: Logger,\n backend?: GraphResolverBackend<TOutput>,\n) => GraphResolver<TOutput>)\n\nexport type GraphResolver<TOutput> = (id: string) => Promise<TOutput>\n\nexport class CircularDependencyError extends Error {\n constructor(path: string[]) {\n super(`Circular dependency detected: ${path.join(\" -> \")}`)\n this.name = \"CircularDependencyError\"\n }\n}\n\nexport function createDefaultGraphResolverBackend<TOutput>(): GraphResolverBackend<TOutput> {\n const promiseCache = new Map<string, Promise<TOutput>>()\n\n return {\n promiseCache,\n }\n}\n\nexport function defineGraphResolver<TInput, TOutput>(\n options: GraphResolverOptions<TInput, TOutput>,\n): GraphResolverFactory<TInput, TOutput> {\n const factory: GraphResolverFactory<TInput, TOutput> = (nodes, logger, backend) => {\n backend ??= createDefaultGraphResolverBackend<TOutput>()\n logger = logger.child({ resolver: options.name })\n\n const outputs = new Map<string, TOutput>()\n\n const resolver = (itemId: string, dependencyChain: string[]) => {\n logger.trace({ itemId }, \"resolving item\")\n\n const existingPromise = backend.promiseCache.get(itemId)\n if (existingPromise) {\n return existingPromise\n }\n\n if (dependencyChain.includes(itemId)) {\n throw new CircularDependencyError([...dependencyChain, itemId])\n }\n\n const item = nodes.get(itemId)\n if (!item) {\n return Promise.resolve(undefined!)\n }\n\n const resolve = async () => {\n const dependencies = unique(options.getNodeDependencies(item))\n\n backend.setDependencies?.(itemId, dependencies)\n logger.trace({ itemId, dependencies }, \"resolving item dependencies\")\n\n const newChain = [...dependencyChain, itemId]\n\n for (const depId of dependencies) {\n await resolver(depId, newChain)\n }\n\n return await options.process(item, outputs, logger)\n }\n\n const promise = resolve().then(result => {\n if (backend.promiseCache.get(itemId) === promise) {\n // persist the result to the state if provided\n // ignore if the promise has been replaced (which means this calculation was invalidated)\n backend.setOutput?.(itemId, result)\n outputs.set(itemId, result)\n }\n\n return result\n })\n\n backend.promiseCache.set(itemId, promise)\n return promise\n }\n\n return id => resolver(id, [])\n }\n\n factory.factoryName = options.name\n return factory\n}\n","import type { HubModel } from \"../project\"\nimport {\n isUnitModel,\n type ComponentModel,\n type HubInput,\n type InstanceInput,\n type InstanceModel,\n} from \"@highstate/contract\"\nimport { fromEntries, mapValues } from \"remeda\"\nimport { defineGraphResolver } from \"./graph-resolver\"\n\nexport type InputResolverInput =\n | {\n kind: \"instance\"\n instance: InstanceModel\n component: ComponentModel\n }\n | {\n kind: \"hub\"\n hub: HubModel\n }\n\nexport type ResolvedInstanceInput = {\n input: InstanceInput\n type: string\n}\n\nexport type InputResolverOutput =\n | {\n kind: \"instance\"\n component: ComponentModel\n resolvedInputs: Record<string, ResolvedInstanceInput[]>\n resolvedOutputs: Record<string, InstanceInput[]> | undefined\n resolvedInjectionInputs: ResolvedInstanceInput[]\n matchedInjectionInputs: ResolvedInstanceInput[]\n }\n | {\n kind: \"hub\"\n resolvedInputs: ResolvedInstanceInput[]\n }\n\n/**\n * Resolves the all recursive instance and hub inputs based on its direct inputs and injected inputs.\n */\nexport const createInputResolver = defineGraphResolver<InputResolverInput, InputResolverOutput>({\n name: \"input-resolver\",\n getNodeId(node) {\n if (node.kind === \"hub\") {\n return `hub:${node.hub.id}`\n }\n\n return `instance:${node.instance.id}`\n },\n\n getNodeDependencies(node) {\n const dependencies: string[] = []\n\n if (node.kind === \"hub\") {\n for (const input of node.hub.inputs ?? []) {\n dependencies.push(`instance:${input.instanceId}`)\n }\n\n for (const input of node.hub.injectionInputs ?? []) {\n dependencies.push(`hub:${input.hubId}`)\n }\n\n return dependencies\n }\n\n for (const inputs of Object.values(node.instance.inputs ?? {})) {\n for (const input of inputs) {\n dependencies.push(`instance:${input.instanceId}`)\n }\n }\n\n for (const inputs of Object.values(node.instance.hubInputs ?? {})) {\n for (const input of inputs) {\n dependencies.push(`hub:${input.hubId}`)\n }\n }\n\n for (const input of node.instance.injectionInputs ?? []) {\n dependencies.push(`hub:${input.hubId}`)\n }\n\n return dependencies\n },\n\n process(node, dependencies, logger) {\n const getHubOutput = (input: HubInput) => {\n const output = dependencies.get(`hub:${input.hubId}`)\n if (!output) {\n return { resolvedInputs: [] }\n }\n\n if (output.kind !== \"hub\") {\n throw new Error(\"Expected hub node\")\n }\n\n return output\n }\n\n const getInstanceOutput = (input: InstanceInput) => {\n const output = dependencies.get(`instance:${input.instanceId}`)\n if (!output) {\n return {\n component: null,\n resolvedInputs: [] as ResolvedInstanceInput[],\n resolvedOutputs: [] as InstanceInput[],\n }\n }\n\n if (output.kind !== \"instance\") {\n throw new Error(\"Expected instance node\")\n }\n\n return {\n component: output.component,\n resolvedInputs: output.resolvedInputs[input.output] ?? [],\n resolvedOutputs: output.resolvedOutputs?.[input.output],\n }\n }\n\n // resolve inputs for hub\n\n if (node.kind === \"hub\") {\n const hubResult: Map<string, ResolvedInstanceInput> = new Map()\n\n const addHubResult = (input: ResolvedInstanceInput) => {\n hubResult.set(`${input.input.instanceId}:${input.input.output}`, input)\n }\n\n for (const input of node.hub.inputs ?? []) {\n const { component } = getInstanceOutput(input)\n const componentInput = component?.outputs[input.output]\n\n if (!componentInput) {\n logger.warn({ msg: \"output not found in the component\", input, component })\n continue\n }\n\n addHubResult({ input, type: componentInput.type })\n }\n\n for (const injectionInput of node.hub.injectionInputs ?? []) {\n const { resolvedInputs } = getHubOutput(injectionInput)\n\n for (const input of resolvedInputs) {\n addHubResult(input)\n }\n }\n\n return {\n kind: \"hub\",\n resolvedInputs: Array.from(hubResult.values()),\n }\n }\n\n // хуяк (which translates as \"lets reuse resolved inputs of level 2+ composite instances provided by the evaluator\")\n if (node.instance.resolvedInputs) {\n return {\n kind: \"instance\",\n component: node.component,\n resolvedInputs: mapValues(node.instance.resolvedInputs, (inputs, inputName) => {\n const componentInput = node.component.inputs[inputName]\n if (!componentInput) {\n logger.warn({\n msg: \"input not found in the component\",\n inputName,\n component: node.component,\n })\n return []\n }\n\n return inputs.map(input => ({ input, type: componentInput.type }))\n }),\n resolvedOutputs: node.instance.resolvedOutputs ?? {},\n resolvedInjectionInputs: [],\n matchedInjectionInputs: [],\n }\n }\n\n // resolve inputs for instance\n\n const resolvedInputsMap: Map<string, Map<string, ResolvedInstanceInput>> = new Map()\n\n const addInstanceResult = (inputName: string, input: ResolvedInstanceInput) => {\n let inputs = resolvedInputsMap.get(inputName)\n if (!inputs) {\n inputs = new Map()\n resolvedInputsMap.set(inputName, inputs)\n }\n\n inputs.set(`${input.input.instanceId}:${input.input.output}`, input)\n }\n\n const addInstanceInput = (inputName: string, input: InstanceInput) => {\n const componentInput = node.component.inputs[inputName]\n if (!componentInput) {\n logger.warn({ msg: \"input not found in the component\", input, component: node.component })\n return\n }\n\n const { component, resolvedOutputs } = getInstanceOutput(input)\n\n if (!component) {\n logger.warn({ instanceId: node.instance.id, input }, \"no output found for the input\")\n return\n }\n\n if (isUnitModel(component)) {\n addInstanceResult(inputName, { input, type: componentInput.type })\n return\n }\n\n if (resolvedOutputs) {\n for (const output of resolvedOutputs) {\n addInstanceResult(inputName, { input: output, type: componentInput.type })\n }\n } else {\n // if the instance is not evaluated, we a forced to use the input as is\n\n addInstanceResult(inputName, { input, type: componentInput.type })\n }\n }\n\n for (const [inputName, inputs] of Object.entries(node.instance.inputs ?? {})) {\n for (const input of inputs) {\n addInstanceInput(inputName, input)\n }\n }\n\n const injectionInputs: Map<string, ResolvedInstanceInput> = new Map()\n const matchedInjectionInputs: Map<string, ResolvedInstanceInput> = new Map()\n\n for (const injectionInput of node.instance.injectionInputs ?? []) {\n const { resolvedInputs } = getHubOutput(injectionInput)\n for (const input of resolvedInputs) {\n injectionInputs.set(`${input.input.instanceId}:${input.input.output}`, input)\n }\n }\n\n for (const [inputName, componentInput] of Object.entries(node.component.inputs ?? {})) {\n const allInputs = new Map<string, ResolvedInstanceInput>(injectionInputs)\n const hubInputs = node.instance.hubInputs?.[inputName] ?? []\n\n for (const hubInput of hubInputs) {\n const { resolvedInputs } = getHubOutput(hubInput)\n for (const input of resolvedInputs) {\n allInputs.set(`${input.input.instanceId}:${input.input.output}`, input)\n }\n }\n\n for (const input of allInputs.values()) {\n if (input.type === componentInput.type) {\n addInstanceInput(inputName, input.input)\n\n const key = `${input.input.instanceId}:${input.input.output}`\n if (injectionInputs.has(key)) {\n matchedInjectionInputs.set(key, input)\n }\n }\n }\n }\n\n const resolvedInputs = fromEntries(\n Array.from(resolvedInputsMap.entries()).map(([inputName, inputs]) => [\n inputName,\n Array.from(inputs.values()),\n ]),\n )\n\n return {\n kind: \"instance\",\n component: node.component,\n resolvedInputs,\n resolvedOutputs: node.instance.resolvedOutputs,\n resolvedInjectionInputs: Array.from(injectionInputs.values()),\n matchedInjectionInputs: Array.from(matchedInjectionInputs.values()),\n }\n },\n})\n\nexport function getResolvedHubInputs(output: InputResolverOutput): ResolvedInstanceInput[] {\n if (output.kind !== \"hub\") {\n throw new Error(\"Expected hub node\")\n }\n\n return output.resolvedInputs\n}\n\nexport function getResolvedInstanceInputs(\n output: InputResolverOutput,\n): Record<string, ResolvedInstanceInput[]> {\n if (output.kind !== \"instance\") {\n throw new Error(\"Expected instance node\")\n }\n\n return output.resolvedInputs\n}\n\nexport function getResolvedInjectionInstanceInputs(\n output: InputResolverOutput,\n): ResolvedInstanceInput[] {\n if (output.kind !== \"instance\") {\n throw new Error(\"Expected instance node\")\n }\n\n return output.resolvedInjectionInputs\n}\n\nexport function getMatchedInjectionInstanceInputs(\n output: InputResolverOutput,\n): ResolvedInstanceInput[] {\n if (output.kind !== \"instance\") {\n throw new Error(\"Expected instance node\")\n }\n\n return output.matchedInjectionInputs\n}\n","import type { ComponentModel, InstanceModel } from \"@highstate/contract\"\nimport type { InstanceState } from \"../state\"\nimport type { ResolvedInstanceInput } from \"./input\"\nimport { sha256 } from \"crypto-hash\"\nimport { defineGraphResolver } from \"./graph-resolver\"\n\nexport type InputHashResolverInput = {\n instance: InstanceModel\n component: ComponentModel\n resolvedInputs: Record<string, ResolvedInstanceInput[]>\n state: InstanceState | undefined\n sourceHash: string | undefined\n}\n\nexport type InputHashResolverOutput = {\n inputHash: string\n outputHash: string\n}\n\n/**\n * Resolves the hash of the instance based on its args, resolved input hashes, source hash, and the output hash.\n */\nexport const createInputHashResolver = defineGraphResolver<\n InputHashResolverInput,\n InputHashResolverOutput\n>({\n name: \"input-hash-resolver\",\n getNodeId: node => node.instance.id,\n\n getNodeDependencies({ resolvedInputs }) {\n const dependencies: string[] = []\n\n for (const inputs of Object.values(resolvedInputs ?? {})) {\n for (const input of inputs) {\n dependencies.push(input.input.instanceId)\n }\n }\n\n return dependencies\n },\n\n async process({ instance, component, resolvedInputs, sourceHash, state }, dependencies) {\n let sink = component.definitionHash + JSON.stringify(instance.args ?? {})\n\n if (sourceHash) {\n sink += sourceHash\n }\n\n const sortedInputs = Object.entries(resolvedInputs)\n //\n .sort(([a], [b]) => a.localeCompare(b))\n\n for (const [inputKey, inputs] of sortedInputs) {\n if (Object.keys(inputs).length === 0) {\n continue\n }\n\n sink += inputKey\n\n const instanceIds = inputs.map(input => input.input.instanceId)\n instanceIds.sort()\n\n for (const instanceId of instanceIds) {\n const dependency = dependencies.get(instanceId)\n if (!dependency) continue\n\n sink += dependency.inputHash\n sink += dependency.outputHash\n }\n }\n\n return {\n inputHash: await sha256(sink),\n outputHash: state?.outputHash ?? \"\",\n }\n },\n})\n","import type { ComponentModel, InstanceModel } from \"@highstate/contract\"\nimport type { ResolvedInstanceInput } from \"./input\"\nimport { Ajv } from \"ajv\"\nimport { defineGraphResolver } from \"./graph-resolver\"\n\nexport type ValidationResolverInput = {\n instance: InstanceModel\n component: ComponentModel\n resolvedInputs: Record<string, ResolvedInstanceInput[]>\n}\n\nexport type ValidationResolverOutput =\n | {\n status: \"ok\"\n }\n | {\n status: \"invalid-args\"\n errorText: string\n }\n | {\n status: \"invalid-inputs\" | \"missing-inputs\"\n errorText: string\n }\n\n/**\n * Validates the instance based on its arguments and inputs.\n */\nexport const createValidationResolver = defineGraphResolver<\n ValidationResolverInput,\n ValidationResolverOutput\n>({\n name: \"validation-resolver\",\n getNodeId: node => node.instance.id,\n\n getNodeDependencies({ resolvedInputs }) {\n const dependencies: string[] = []\n\n for (const inputs of Object.values(resolvedInputs)) {\n for (const input of inputs) {\n dependencies.push(input.input.instanceId)\n }\n }\n\n return dependencies\n },\n\n process({ instance, component, resolvedInputs }, dependencies, logger) {\n const ajv = new Ajv({ strict: false })\n\n logger.debug({ instanceId: instance.id }, \"validating instance\")\n\n for (const [name, argument] of Object.entries(component.args)) {\n if (!argument.required && !instance.args?.[name]) {\n continue\n }\n\n if (!ajv.validate(argument.schema, instance.args?.[name])) {\n logger.debug({ instanceId: instance.id, argumentName: name }, \"invalid argument\")\n\n return {\n status: \"invalid-args\",\n errorText: ajv.errorsText(),\n }\n }\n }\n\n for (const inputs of Object.values(resolvedInputs)) {\n for (const input of inputs) {\n const inputInstance = dependencies.get(input.input.instanceId)\n if (inputInstance?.status !== \"ok\") {\n return {\n status: \"invalid-inputs\",\n errorText: `instance \"${input.input.instanceId}\" is invalid`,\n }\n }\n }\n }\n\n for (const [name, input] of Object.entries(component.inputs)) {\n if (!input.required || input.multiple) {\n continue\n }\n\n if (!resolvedInputs[name] || !resolvedInputs[name].length) {\n return {\n status: \"missing-inputs\",\n errorText: `input \"${name}\" is missing`,\n }\n }\n }\n\n return { status: \"ok\" }\n },\n})\n","import type { GraphResolverFactory } from \"./graph-resolver\"\nimport { createInputResolver } from \"./input\"\nimport { createInputHashResolver } from \"./input-hash\"\nimport { createValidationResolver } from \"./validation\"\n\nexport const resolverFactories: Record<string, GraphResolverFactory<any, any>> = {\n [createInputResolver.factoryName]: createInputResolver,\n [createInputHashResolver.factoryName]: createInputHashResolver,\n [createValidationResolver.factoryName]: createValidationResolver,\n}\n","import { z } from \"zod\"\n\nexport const terminalSessionSchema = z.object({\n id: z.string().nanoid(),\n projectId: z.string(),\n instanceId: z.string(),\n terminalName: z.string(),\n terminalTitle: z.string(),\n createdAt: z.coerce.date(),\n finishedAt: z.coerce.date().optional(),\n})\n\nexport type TerminalSession = z.infer<typeof terminalSessionSchema>\n","import type { ComponentModel, Entity } from \"@highstate/contract\"\n\nexport type LibraryModel = {\n components: Record<string, ComponentModel>\n entities: Record<string, Entity>\n}\n\nexport type LibraryUpdate =\n | {\n type: \"component-updated\"\n component: ComponentModel\n }\n | {\n type: \"entity-updated\"\n entity: Entity\n }\n | {\n type: \"component-removed\"\n componentType: string\n }\n | {\n type: \"entity-removed\"\n entityType: string\n }\n\nexport function diffLibraries(oldLibrary: LibraryModel, newLibrary: LibraryModel): LibraryUpdate[] {\n const updates: LibraryUpdate[] = []\n\n for (const [componentType, newComponent] of Object.entries(newLibrary.components)) {\n const existingComponent = oldLibrary.components[componentType]\n if (existingComponent?.definitionHash !== newComponent.definitionHash) {\n updates.push({ type: \"component-updated\", component: newComponent })\n }\n }\n\n for (const componentType of Object.keys(oldLibrary.components)) {\n if (!newLibrary.components[componentType]) {\n updates.push({ type: \"component-removed\", componentType })\n }\n }\n\n for (const [entityType, newEntity] of Object.entries(newLibrary.entities)) {\n const existingEntity = oldLibrary.entities[entityType]\n if (existingEntity?.definitionHash !== newEntity.definitionHash) {\n updates.push({ type: \"entity-updated\", entity: newEntity })\n }\n }\n\n for (const entityType of Object.keys(oldLibrary.entities)) {\n if (!newLibrary.entities[entityType]) {\n updates.push({ type: \"entity-removed\", entityType })\n }\n }\n\n return updates\n}\n\nexport function applyLibraryUpdate(\n components: Record<string, ComponentModel>,\n entities: Record<string, Entity>,\n update: LibraryUpdate,\n): void {\n switch (update.type) {\n case \"component-updated\":\n components[update.component.type] = update.component\n break\n case \"entity-updated\":\n entities[update.entity.type] = update.entity\n break\n case \"component-removed\":\n delete components[update.componentType]\n break\n case \"entity-removed\":\n delete entities[update.entityType]\n break\n }\n}\n"],"mappings":"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","names":["z","z","resolvedInputs","z"]}
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "sourceHashes": {
3
- "./dist/index.js": "7b8b86976ec2a652f27959ce4c55c600a186046b6ab359f7f6e9e25dd8199278",
4
- "./dist/shared/index.js": "c5d5a981d63ee27bc5569db1378311cd165b816e77ad440d54168c5bfef43dbb",
5
- "./dist/library/worker/main.js": "11bbed95f67a1756408bcbea93b87af1ed913ebbf7dbd35978027b0b3e219c05",
3
+ "./dist/index.js": "f10c5caae65e223b7b0894fff43bda7cac518c90e310a5c7b12ed26a9428c878",
4
+ "./dist/shared/index.js": "8e01764586b8b1549485be8a04bc241790cefb90f4a7b995cba13ab2ad4784ce",
5
+ "./dist/library/worker/main.js": "171e65f2b0853e71101237e74cdadf6fcdb48f79bfe8bf759c7047a6090f1635",
6
6
  "./dist/library/package-resolution-worker.js": "4bfa368ad35a64c109df9e5a468c057791164760fe166c4eb5d9a889dee4d7bc"
7
7
  }
8
8
  }
package/dist/index.js CHANGED
@@ -17,7 +17,7 @@ import {
17
17
  isFinalOperationStatus,
18
18
  projectOperationSchema,
19
19
  terminalSessionSchema
20
- } from "./chunk-JEOPTUKC.js";
20
+ } from "./chunk-I7NLZ54E.js";
21
21
  import {
22
22
  LocalPulumiHost,
23
23
  createAsyncBatcher,
@@ -302,6 +302,7 @@ var LocalLibraryBackend = class _LocalLibraryBackend {
302
302
  }
303
303
  async reloadLibrary() {
304
304
  this.logger.info("reloading library");
305
+ await this.ensureLibraryPackagesLoaded(this.libraryPackages, true);
305
306
  this.worker = this.createLibraryWorker({
306
307
  modulePaths: this.libraryPackages,
307
308
  logLevel: "silent"
@@ -987,6 +988,7 @@ var ProjectManager = class _ProjectManager {
987
988
  }
988
989
  async evaluateCompositeInstances(projectId, instanceIds) {
989
990
  await this.projectLockManager.getLock(projectId).lockInstances(instanceIds, async () => {
991
+ this.logger.debug({ instanceIds }, "evaluating composite instances");
990
992
  const [
991
993
  { instances, resolvedInputs, stateMap, resolveInputHash },
992
994
  topLevelCompositeChildrenIds
@@ -1059,6 +1061,10 @@ var ProjectManager = class _ProjectManager {
1059
1061
  "instance evaluation completed, %d instances persisted",
1060
1062
  compositeInstances.length
1061
1063
  );
1064
+ this.logger.debug(
1065
+ { compositeInstanceIds: compositeInstances.map((instance) => instance.instance.id) },
1066
+ "persisted composite instances"
1067
+ );
1062
1068
  await Promise.all(promises);
1063
1069
  });
1064
1070
  }
@@ -1091,10 +1097,12 @@ var ProjectManager = class _ProjectManager {
1091
1097
  if (isUnitModel2(library.components[instance.type])) {
1092
1098
  const resolvedUnits = await this.libraryBackend.getResolvedUnitSources([instance.type]);
1093
1099
  const resolvedUnit = resolvedUnits.find((unit) => unit.unitType === instance.type);
1094
- if (!resolvedUnit) {
1095
- throw new Error(`Resolved unit not found for type "${instance.type}"`);
1100
+ if (resolvedUnit) {
1101
+ sourceHash = resolvedUnit.sourceHash;
1102
+ } else {
1103
+ this.logger.warn(`resolved unit source not found for type "%s"`, instance.type);
1104
+ sourceHash = void 0;
1096
1105
  }
1097
- sourceHash = resolvedUnit.sourceHash;
1098
1106
  }
1099
1107
  inputHashInputs.set(instance.id, {
1100
1108
  instance,
@@ -1748,13 +1756,15 @@ var LocalRunnerBackend = class _LocalRunnerBackend {
1748
1756
  },
1749
1757
  async (stack) => {
1750
1758
  await this.setStackConfig(stack, configMap);
1759
+ const summary = await stack.workspace.stack();
1760
+ let currentResourceCount = 0;
1761
+ const initialTotalResourceCount = summary?.resourceCount ?? 0;
1751
1762
  this.updateState({
1752
1763
  id: instanceId,
1753
1764
  status: preview ? "previewing" : "updating",
1754
- currentResourceCount: 0,
1755
- totalResourceCount: 0
1765
+ currentResourceCount,
1766
+ totalResourceCount: initialTotalResourceCount
1756
1767
  });
1757
- let currentResourceCount = 0;
1758
1768
  let totalResourceCount = 0;
1759
1769
  await runWithRetryOnError(
1760
1770
  async () => {
@@ -1769,7 +1779,9 @@ var LocalRunnerBackend = class _LocalRunnerBackend {
1769
1779
  event.resourcePreEvent.metadata.op,
1770
1780
  totalResourceCount
1771
1781
  );
1772
- this.updateState({ id: instanceId, totalResourceCount });
1782
+ if (totalResourceCount > initialTotalResourceCount) {
1783
+ this.updateState({ id: instanceId, totalResourceCount });
1784
+ }
1773
1785
  return;
1774
1786
  }
1775
1787
  if (event.resOutputsEvent) {
@@ -1862,40 +1874,59 @@ var LocalRunnerBackend = class _LocalRunnerBackend {
1862
1874
  currentResourceCount,
1863
1875
  totalResourceCount: currentResourceCount
1864
1876
  });
1865
- await runWithRetryOnError(
1866
- async () => {
1867
- await stack.destroy({
1868
- color: "always",
1869
- refresh: options.refresh,
1870
- remove: true,
1871
- signal: options.signal,
1872
- onEvent: (event) => {
1873
- if (event.resOutputsEvent) {
1874
- currentResourceCount = updateResourceCount(
1875
- event.resOutputsEvent.metadata.op,
1876
- currentResourceCount
1877
- );
1878
- this.updateState({ id: instanceId, currentResourceCount });
1879
- return;
1877
+ try {
1878
+ await runWithRetryOnError(
1879
+ async () => {
1880
+ await stack.destroy({
1881
+ color: "always",
1882
+ refresh: options.refresh,
1883
+ remove: true,
1884
+ signal: options.signal,
1885
+ onEvent: (event) => {
1886
+ if (event.resOutputsEvent) {
1887
+ currentResourceCount = updateResourceCount(
1888
+ event.resOutputsEvent.metadata.op,
1889
+ currentResourceCount
1890
+ );
1891
+ this.updateState({ id: instanceId, currentResourceCount });
1892
+ return;
1893
+ }
1894
+ },
1895
+ onOutput: (message) => {
1896
+ this.updateState({ id: instanceId, logLine: message });
1897
+ if (this.printOutput) {
1898
+ console.log(message);
1899
+ }
1880
1900
  }
1881
- },
1882
- onOutput: (message) => {
1883
- this.updateState({ id: instanceId, logLine: message });
1884
- if (this.printOutput) {
1885
- console.log(message);
1886
- }
1887
- }
1888
- });
1889
- const extraOutputs = await this.getExtraOutputsStatePatch(stack);
1901
+ });
1902
+ const extraOutputs = await this.getExtraOutputsStatePatch(stack);
1903
+ this.updateState({
1904
+ id: instanceId,
1905
+ status: "not_created",
1906
+ totalResourceCount: currentResourceCount,
1907
+ ...extraOutputs
1908
+ });
1909
+ },
1910
+ (error) => this.pulumiProjectHost.tryUnlockStack(stack, error)
1911
+ );
1912
+ } catch (error) {
1913
+ if (options.forceDeleteState) {
1914
+ await stack.workspace.removeStack(stack.name, { force: true });
1890
1915
  this.updateState({
1891
1916
  id: instanceId,
1892
1917
  status: "not_created",
1893
- totalResourceCount: currentResourceCount,
1894
- ...extraOutputs
1918
+ totalResourceCount: 0,
1919
+ currentResourceCount: 0,
1920
+ statusFields: [],
1921
+ pages: [],
1922
+ files: [],
1923
+ terminals: [],
1924
+ triggers: []
1895
1925
  });
1896
- },
1897
- (error) => this.pulumiProjectHost.tryUnlockStack(stack, error)
1898
- );
1926
+ } else {
1927
+ throw error;
1928
+ }
1929
+ }
1899
1930
  }
1900
1931
  );
1901
1932
  } catch (error) {
@@ -2660,7 +2691,7 @@ var OperationWorkset = class _OperationWorkset {
2660
2691
  instanceChildrenMap = /* @__PURE__ */ new Map();
2661
2692
  initialStateMap = /* @__PURE__ */ new Map();
2662
2693
  stateMap = /* @__PURE__ */ new Map();
2663
- dependentStateMap = /* @__PURE__ */ new Map();
2694
+ dependentStateIdMap = /* @__PURE__ */ new Map();
2664
2695
  stateChildIdMap = /* @__PURE__ */ new Map();
2665
2696
  unitSourceHashMap = /* @__PURE__ */ new Map();
2666
2697
  inputResolver;
@@ -2699,6 +2730,17 @@ var OperationWorkset = class _OperationWorkset {
2699
2730
  }
2700
2731
  children.push(state.id);
2701
2732
  }
2733
+ for (const dependencyId of state.dependencyIds) {
2734
+ this.addDependentState(state.id, dependencyId);
2735
+ }
2736
+ }
2737
+ addDependentState(instanceId, dependencyId) {
2738
+ let dependentStates = this.dependentStateIdMap.get(dependencyId);
2739
+ if (!dependentStates) {
2740
+ dependentStates = /* @__PURE__ */ new Set();
2741
+ this.dependentStateIdMap.set(dependencyId, dependentStates);
2742
+ }
2743
+ dependentStates.add(instanceId);
2702
2744
  }
2703
2745
  restoreInitialStatus(instanceId) {
2704
2746
  const state = this.stateMap.get(instanceId);
@@ -2729,7 +2771,11 @@ var OperationWorkset = class _OperationWorkset {
2729
2771
  return this.stateMap.get(instanceId);
2730
2772
  }
2731
2773
  getDependentStates(instanceId) {
2732
- return this.dependentStateMap.get(instanceId) ?? [];
2774
+ const dependentStateIds = this.dependentStateIdMap.get(instanceId);
2775
+ if (!dependentStateIds) {
2776
+ return [];
2777
+ }
2778
+ return Array.from(dependentStateIds).map((id) => this.stateMap.get(id)).filter((state) => !!state);
2733
2779
  }
2734
2780
  recalculateCompositeState(instanceId) {
2735
2781
  const state = this.stateMap.get(instanceId) ?? createInstanceState(instanceId);
@@ -2834,9 +2880,9 @@ var OperationWorkset = class _OperationWorkset {
2834
2880
  if (!state || state.status === "not_created") {
2835
2881
  return;
2836
2882
  }
2837
- const dependents = this.dependentStateMap.get(instanceKey) ?? [];
2838
- for (const dependent of dependents) {
2839
- traverse(dependent.id);
2883
+ const dependentIds = this.dependentStateIdMap.get(instanceKey) ?? [];
2884
+ for (const dependentId of dependentIds) {
2885
+ traverse(dependentId);
2840
2886
  this.affectedInstanceIdSet.add(instanceKey);
2841
2887
  }
2842
2888
  };
@@ -2928,7 +2974,9 @@ var OperationWorkset = class _OperationWorkset {
2928
2974
  workset.addInstance(instance.instance);
2929
2975
  }
2930
2976
  for (const child of instance.children) {
2931
- workset.addInstance(child);
2977
+ if (!workset.instanceMap.has(child.id)) {
2978
+ workset.addInstance(child);
2979
+ }
2932
2980
  }
2933
2981
  }
2934
2982
  for (const state of states) {
@@ -3309,7 +3357,8 @@ var RuntimeOperation = class {
3309
3357
  instanceName: name,
3310
3358
  refresh: this.operation.options.refresh,
3311
3359
  signal: this.abortController.signal,
3312
- deleteUnreachable: this.operation.options.deleteUnreachableResources
3360
+ deleteUnreachable: this.operation.options.deleteUnreachableResources,
3361
+ forceDeleteState: this.operation.options.forceDeleteState
3313
3362
  });
3314
3363
  this.logger.debug("destroy request sent");
3315
3364
  const stream = this.runnerBackend.watch({
@@ -3524,6 +3573,7 @@ var OperationManager = class _OperationManager {
3524
3573
  destroyDependentInstances: request.options?.destroyDependentInstances ?? true,
3525
3574
  invokeDestroyTriggers: request.options?.invokeDestroyTriggers ?? false,
3526
3575
  deleteUnreachableResources: request.options?.deleteUnreachableResources ?? false,
3576
+ forceDeleteState: request.options?.forceDeleteState ?? false,
3527
3577
  refresh: request.options?.refresh ?? false
3528
3578
  },
3529
3579
  error: null,