@highstate/backend 0.19.1 → 0.21.1

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.
Files changed (134) hide show
  1. package/dist/chunk-b05q6fm2.js +37 -0
  2. package/dist/{chunk-V2NILDHS.js → chunk-gxjwa93h.js} +704 -604
  3. package/dist/{chunk-X2WG3WGL.js → chunk-vzdz6chj.js} +18 -15
  4. package/dist/highstate.manifest.json +4 -4
  5. package/dist/index.js +7350 -3514
  6. package/dist/library/package-resolution-worker.js +121 -10
  7. package/dist/library/worker/main.js +31 -17
  8. package/dist/shared/index.js +254 -4
  9. package/package.json +19 -20
  10. package/prisma/backend/_schema/object.prisma +12 -0
  11. package/prisma/backend/sqlite/migrations/20260222113554_add_object_tracking/migration.sql +7 -0
  12. package/prisma/project/artifact.prisma +3 -0
  13. package/prisma/project/entity.prisma +125 -0
  14. package/prisma/project/instance.prisma +6 -0
  15. package/prisma/project/migrations/20260301210131_add_entity_tracking/migration.sql +70 -0
  16. package/prisma/project/migrations/20260302212734_add_resource_hooks_flag/migration.sql +1 -0
  17. package/prisma/project/operation.prisma +3 -0
  18. package/src/artifact/factory.ts +3 -2
  19. package/src/business/artifact.test.ts +22 -2
  20. package/src/business/artifact.ts +7 -1
  21. package/src/business/entity-snapshot.test.ts +684 -0
  22. package/src/business/entity-snapshot.ts +904 -0
  23. package/src/business/evaluation.test.ts +56 -0
  24. package/src/business/evaluation.ts +102 -22
  25. package/src/business/global-search.test.ts +344 -0
  26. package/src/business/global-search.ts +902 -0
  27. package/src/business/index.ts +4 -0
  28. package/src/business/instance-lock.ts +58 -74
  29. package/src/business/instance-state.test.ts +15 -1
  30. package/src/business/instance-state.ts +37 -14
  31. package/src/business/object-ref-index.test.ts +140 -0
  32. package/src/business/object-ref-index.ts +193 -0
  33. package/src/business/operation.test.ts +15 -1
  34. package/src/business/operation.ts +4 -0
  35. package/src/business/project-model.ts +154 -13
  36. package/src/business/project-unlock.ts +25 -2
  37. package/src/business/project.ts +9 -0
  38. package/src/business/secret.test.ts +35 -2
  39. package/src/business/secret.ts +32 -9
  40. package/src/business/settings.ts +761 -0
  41. package/src/business/unit-output.test.ts +477 -0
  42. package/src/business/unit-output.ts +461 -0
  43. package/src/business/worker.ts +55 -4
  44. package/src/database/_generated/backend/postgresql/browser.ts +6 -0
  45. package/src/database/_generated/backend/postgresql/client.ts +6 -0
  46. package/src/database/_generated/backend/postgresql/internal/class.ts +23 -5
  47. package/src/database/_generated/backend/postgresql/internal/prismaNamespace.ts +89 -5
  48. package/src/database/_generated/backend/postgresql/internal/prismaNamespaceBrowser.ts +9 -0
  49. package/src/database/_generated/backend/postgresql/models/Object.ts +1076 -0
  50. package/src/database/_generated/backend/postgresql/models.ts +1 -0
  51. package/src/database/_generated/backend/sqlite/browser.ts +6 -0
  52. package/src/database/_generated/backend/sqlite/client.ts +6 -0
  53. package/src/database/_generated/backend/sqlite/internal/class.ts +23 -5
  54. package/src/database/_generated/backend/sqlite/internal/prismaNamespace.ts +89 -5
  55. package/src/database/_generated/backend/sqlite/internal/prismaNamespaceBrowser.ts +9 -0
  56. package/src/database/_generated/backend/sqlite/models/Object.ts +1074 -0
  57. package/src/database/_generated/backend/sqlite/models.ts +1 -0
  58. package/src/database/_generated/project/browser.ts +23 -0
  59. package/src/database/_generated/project/client.ts +23 -0
  60. package/src/database/_generated/project/commonInputTypes.ts +87 -53
  61. package/src/database/_generated/project/enums.ts +8 -0
  62. package/src/database/_generated/project/internal/class.ts +53 -5
  63. package/src/database/_generated/project/internal/prismaNamespace.ts +367 -13
  64. package/src/database/_generated/project/internal/prismaNamespaceBrowser.ts +48 -1
  65. package/src/database/_generated/project/models/Artifact.ts +199 -11
  66. package/src/database/_generated/project/models/Entity.ts +1274 -0
  67. package/src/database/_generated/project/models/EntitySnapshot.ts +2389 -0
  68. package/src/database/_generated/project/models/EntitySnapshotContent.ts +1260 -0
  69. package/src/database/_generated/project/models/EntitySnapshotReference.ts +1449 -0
  70. package/src/database/_generated/project/models/InstanceState.ts +361 -1
  71. package/src/database/_generated/project/models/Operation.ts +148 -3
  72. package/src/database/_generated/project/models/OperationLog.ts +0 -4
  73. package/src/database/_generated/project/models.ts +4 -0
  74. package/src/database/migration.ts +3 -0
  75. package/src/library/find-package-json.test.ts +77 -0
  76. package/src/library/find-package-json.ts +149 -0
  77. package/src/library/package-resolution-worker.ts +7 -3
  78. package/src/library/worker/evaluator.ts +7 -1
  79. package/src/orchestrator/manager.ts +7 -0
  80. package/src/orchestrator/operation-context.captured-outputs.test.ts +118 -0
  81. package/src/orchestrator/operation-context.ts +154 -16
  82. package/src/orchestrator/operation-plan.destroy.test.md +33 -12
  83. package/src/orchestrator/operation-plan.destroy.test.ts +140 -2
  84. package/src/orchestrator/operation-plan.fixtures.ts +2 -0
  85. package/src/orchestrator/operation-plan.md +4 -1
  86. package/src/orchestrator/operation-plan.ts +286 -92
  87. package/src/orchestrator/operation-plan.update.test.md +286 -11
  88. package/src/orchestrator/operation-plan.update.test.ts +656 -5
  89. package/src/orchestrator/operation-workset.ts +72 -22
  90. package/src/orchestrator/operation.cancel.test.ts +4 -0
  91. package/src/orchestrator/operation.composite.test.ts +341 -0
  92. package/src/orchestrator/operation.destroy.test.ts +4 -0
  93. package/src/orchestrator/operation.output-validation.failure.test.ts +124 -0
  94. package/src/orchestrator/operation.preview.test.ts +4 -0
  95. package/src/orchestrator/operation.refresh.test.ts +4 -0
  96. package/src/orchestrator/operation.test-utils.ts +52 -13
  97. package/src/orchestrator/operation.ts +230 -68
  98. package/src/orchestrator/operation.update.failure.test.ts +4 -0
  99. package/src/orchestrator/operation.update.skip.test.ts +196 -0
  100. package/src/orchestrator/operation.update.test.ts +4 -0
  101. package/src/orchestrator/plan-test-builder.ts +1 -0
  102. package/src/orchestrator/unit-input-values.test.ts +450 -0
  103. package/src/orchestrator/unit-input-values.ts +281 -0
  104. package/src/pubsub/manager.ts +3 -0
  105. package/src/runner/abstractions.ts +23 -54
  106. package/src/runner/factory.ts +3 -3
  107. package/src/runner/force-abort.ts +7 -2
  108. package/src/runner/local.ts +116 -87
  109. package/src/runner/pulumi.ts +3 -5
  110. package/src/services.ts +53 -2
  111. package/src/shared/models/prisma.ts +1 -0
  112. package/src/shared/models/project/entity.ts +121 -0
  113. package/src/shared/models/project/index.ts +1 -0
  114. package/src/shared/models/project/operation.ts +61 -3
  115. package/src/shared/models/project/state.ts +10 -0
  116. package/src/shared/models/project/worker.ts +7 -0
  117. package/src/shared/resolvers/effective-output-type.test.ts +494 -0
  118. package/src/shared/resolvers/effective-output-type.ts +162 -0
  119. package/src/shared/resolvers/index.ts +1 -0
  120. package/src/shared/resolvers/input.ts +59 -9
  121. package/src/shared/utils/index.ts +1 -0
  122. package/src/shared/utils/stable-json.ts +41 -0
  123. package/src/terminal/manager.ts +6 -0
  124. package/src/terminal/run.sh.ts +9 -4
  125. package/src/worker/manager.ts +97 -1
  126. package/LICENSE +0 -21
  127. package/dist/chunk-I7BWSAN6.js +0 -49
  128. package/dist/chunk-I7BWSAN6.js.map +0 -1
  129. package/dist/chunk-V2NILDHS.js.map +0 -1
  130. package/dist/chunk-X2WG3WGL.js.map +0 -1
  131. package/dist/index.js.map +0 -1
  132. package/dist/library/package-resolution-worker.js.map +0 -1
  133. package/dist/library/worker/main.js.map +0 -1
  134. package/dist/shared/index.js.map +0 -1
@@ -2,6 +2,7 @@ import type { Logger } from "pino"
2
2
  import type { DatabaseManager, ProjectTransaction } from "../database"
3
3
  import type { LibraryBackend } from "../library"
4
4
  import type { PubSubManager } from "../pubsub"
5
+ import type { ObjectRefIndexService } from "./object-ref-index"
5
6
  import { randomBytes } from "node:crypto"
6
7
  import { type CommonObjectMeta, isUnitModel, parseInstanceId } from "@highstate/contract"
7
8
  import {
@@ -16,6 +17,7 @@ export class SecretService {
16
17
  private readonly database: DatabaseManager,
17
18
  private readonly pubsubManager: PubSubManager,
18
19
  private readonly libraryBackend: LibraryBackend,
20
+ private readonly objectRefIndexService: ObjectRefIndexService,
19
21
  private readonly logger: Logger,
20
22
  ) {}
21
23
 
@@ -34,7 +36,7 @@ export class SecretService {
34
36
  libraryId: string,
35
37
  stateId: string,
36
38
  secretValues: Record<string, unknown>,
37
- ): Promise<string[]> {
39
+ ): Promise<{ secretNames: string[]; secretIds: string[] }> {
38
40
  // verify instance exists and is a unit
39
41
  const state = await tx.instanceState.findUnique({
40
42
  where: { id: stateId },
@@ -62,6 +64,8 @@ export class SecretService {
62
64
  throw new Error(`Component type "${componentType}" is not a unit model`)
63
65
  }
64
66
 
67
+ const secretIds: string[] = []
68
+
65
69
  // upsert provided secrets
66
70
  for (const [secretName, value] of Object.entries(secretValues)) {
67
71
  const componentSecret = component.secrets[secretName]
@@ -77,7 +81,7 @@ export class SecretService {
77
81
  iconColor: componentSecret.meta.iconColor || component.meta.iconColor,
78
82
  }
79
83
 
80
- await tx.secret.upsert({
84
+ const secret = await tx.secret.upsert({
81
85
  where: {
82
86
  stateId_name: {
83
87
  stateId,
@@ -94,10 +98,15 @@ export class SecretService {
94
98
  meta,
95
99
  content: value,
96
100
  },
101
+ select: {
102
+ id: true,
103
+ },
97
104
  })
105
+
106
+ secretIds.push(secret.id)
98
107
  }
99
108
 
100
- return Object.keys(secretValues)
109
+ return { secretNames: Object.keys(secretValues), secretIds }
101
110
  }
102
111
 
103
112
  /**
@@ -125,7 +134,12 @@ export class SecretService {
125
134
  }
126
135
 
127
136
  const statePatch = await database.$transaction(async tx => {
128
- await this.updateInstanceSecretsCore(tx, project.libraryId, stateId, secretValues)
137
+ const { secretNames } = await this.updateInstanceSecretsCore(
138
+ tx,
139
+ project.libraryId,
140
+ stateId,
141
+ secretValues,
142
+ )
129
143
 
130
144
  // invalidate instance state
131
145
  const state = await tx.instanceState.update({
@@ -134,7 +148,7 @@ export class SecretService {
134
148
  select: { inputHashNonce: true },
135
149
  })
136
150
 
137
- return { ...state, secretNames: Object.keys(secretValues) }
151
+ return { ...state, secretNames }
138
152
  })
139
153
 
140
154
  this.pubsubManager.publish(["instance-state", projectId], {
@@ -209,7 +223,7 @@ export class SecretService {
209
223
  async getPulumiPassword(projectId: string): Promise<string> {
210
224
  const database = await this.database.forProject(projectId)
211
225
 
212
- return await database.$transaction(async tx => {
226
+ const result = await database.$transaction(async tx => {
213
227
  const existingSecret = await tx.secret.findUnique({
214
228
  where: {
215
229
  systemName: SystemSecretNames.PulumiPassword,
@@ -217,12 +231,12 @@ export class SecretService {
217
231
  })
218
232
 
219
233
  if (existingSecret) {
220
- return existingSecret.content as string
234
+ return { password: existingSecret.content as string, secretId: null as string | null }
221
235
  }
222
236
 
223
237
  const newPassword = randomBytes(32).toString("hex")
224
238
 
225
- await tx.secret.create({
239
+ const createdSecret = await tx.secret.create({
226
240
  data: {
227
241
  systemName: SystemSecretNames.PulumiPassword,
228
242
  meta: {
@@ -232,10 +246,19 @@ export class SecretService {
232
246
  },
233
247
  content: newPassword,
234
248
  },
249
+ select: {
250
+ id: true,
251
+ },
235
252
  })
236
253
 
237
254
  this.logger.info({ projectId }, "created new Pulumi password")
238
- return newPassword
255
+ return { password: newPassword, secretId: createdSecret.id }
239
256
  })
257
+
258
+ if (result.secretId) {
259
+ await this.objectRefIndexService.track(projectId, [result.secretId])
260
+ }
261
+
262
+ return result.password
240
263
  }
241
264
  }