@highstate/pulumi 0.18.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +206 -117
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/entity.ts +108 -0
- package/src/file.ts +87 -49
- package/src/index.ts +2 -0
- package/src/resource-hooks.ts +14 -0
- package/src/unit.ts +150 -110
package/dist/index.js
CHANGED
|
@@ -1,40 +1,12 @@
|
|
|
1
|
-
import { output,
|
|
1
|
+
import { output, Config, secret } from '@pulumi/pulumi';
|
|
2
2
|
export * from '@pulumi/pulumi';
|
|
3
|
+
import { HighstateSignature, getEntityId, HighstateConfigKey, unitConfigSchema, parseArgumentValue, runtimeSchema, z, parseInstanceId, camelCaseToHumanReadable, unitArtifactSchema } from '@highstate/contract';
|
|
4
|
+
import { crc32 } from 'node:zlib';
|
|
5
|
+
import { join } from 'node:path';
|
|
3
6
|
import { pathToFileURL } from 'node:url';
|
|
4
|
-
import {
|
|
5
|
-
import { mapValues } from 'remeda';
|
|
7
|
+
import { mapValues, isPlainObject } from 'remeda';
|
|
6
8
|
|
|
7
9
|
// src/index.ts
|
|
8
|
-
function fileFromString(name, content, { contentType = "text/plain", isSecret = false, mode } = {}) {
|
|
9
|
-
return output({
|
|
10
|
-
meta: {
|
|
11
|
-
name,
|
|
12
|
-
contentType,
|
|
13
|
-
size: output(content).apply((content2) => Buffer.byteLength(content2, "utf8")),
|
|
14
|
-
mode
|
|
15
|
-
},
|
|
16
|
-
content: {
|
|
17
|
-
type: "embedded",
|
|
18
|
-
value: isSecret ? secret(content) : content
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
function fileFromBuffer(name, content, { contentType = "application/octet-stream", isSecret = false, mode } = {}) {
|
|
23
|
-
const base64Content = content.toString("base64");
|
|
24
|
-
return output({
|
|
25
|
-
meta: {
|
|
26
|
-
name,
|
|
27
|
-
contentType,
|
|
28
|
-
size: output(content).apply((content2) => content2.byteLength),
|
|
29
|
-
mode
|
|
30
|
-
},
|
|
31
|
-
content: {
|
|
32
|
-
type: "embedded",
|
|
33
|
-
isBinary: true,
|
|
34
|
-
value: isSecret ? secret(base64Content) : base64Content
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
10
|
function toPromise(input) {
|
|
39
11
|
return new Promise((resolve) => output(input).apply(resolve));
|
|
40
12
|
}
|
|
@@ -57,9 +29,107 @@ function apply(fn) {
|
|
|
57
29
|
return (input) => output(input).apply(fn);
|
|
58
30
|
}
|
|
59
31
|
|
|
60
|
-
// src/
|
|
61
|
-
|
|
32
|
+
// src/entity.ts
|
|
33
|
+
function makeEntity({
|
|
34
|
+
entity,
|
|
35
|
+
identity,
|
|
36
|
+
meta,
|
|
37
|
+
value
|
|
38
|
+
}) {
|
|
39
|
+
const built = {
|
|
40
|
+
...value,
|
|
41
|
+
$meta: {
|
|
42
|
+
type: entity.type,
|
|
43
|
+
identity,
|
|
44
|
+
...meta
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
return entity.schema.parse(built);
|
|
48
|
+
}
|
|
49
|
+
function makeSecret(value) {
|
|
50
|
+
return {
|
|
51
|
+
[HighstateSignature.Secret]: true,
|
|
52
|
+
value
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function makeSecretOutput(value) {
|
|
56
|
+
return output(value).apply(makeSecret);
|
|
57
|
+
}
|
|
58
|
+
function makeSecretAsync(value) {
|
|
59
|
+
return toPromise(makeSecretOutput(value));
|
|
60
|
+
}
|
|
61
|
+
function makeEntityOutput({
|
|
62
|
+
entity,
|
|
63
|
+
identity,
|
|
64
|
+
meta,
|
|
65
|
+
value
|
|
66
|
+
}) {
|
|
67
|
+
return output({
|
|
68
|
+
...value,
|
|
69
|
+
$meta: {
|
|
70
|
+
type: entity.type,
|
|
71
|
+
identity,
|
|
72
|
+
...meta
|
|
73
|
+
}
|
|
74
|
+
}).apply((built) => entity.schema.parse(built));
|
|
75
|
+
}
|
|
76
|
+
function makeEntityAsync(options) {
|
|
77
|
+
return toPromise(makeEntityOutput(options));
|
|
78
|
+
}
|
|
79
|
+
function getCombinedIdentity(entities) {
|
|
80
|
+
const sortedIds = entities.map((source) => typeof source === "string" ? source : getEntityId(source)).sort();
|
|
81
|
+
return sortedIds.join(":");
|
|
82
|
+
}
|
|
83
|
+
function getCombinedIdentityOutput(entities) {
|
|
84
|
+
return output(entities).apply(getCombinedIdentity);
|
|
85
|
+
}
|
|
86
|
+
function getCombinedIdentityAsync(entities) {
|
|
87
|
+
return toPromise(getCombinedIdentityOutput(entities));
|
|
88
|
+
}
|
|
89
|
+
function makeFile({
|
|
90
|
+
name,
|
|
91
|
+
content,
|
|
92
|
+
contentType,
|
|
93
|
+
identity,
|
|
94
|
+
isSecret,
|
|
95
|
+
mode
|
|
96
|
+
}) {
|
|
97
|
+
const stringContent = typeof content === "string" ? content : content.toString("base64");
|
|
98
|
+
const isBinary = typeof content !== "string";
|
|
99
|
+
const inferredContentType = contentType ?? (typeof content === "string" ? "text/plain" : "application/octet-stream");
|
|
100
|
+
const size = typeof content === "string" ? Buffer.byteLength(content, "utf-8") : content.byteLength;
|
|
101
|
+
return {
|
|
102
|
+
$meta: {
|
|
103
|
+
type: "common.file.v1",
|
|
104
|
+
identity: identity ?? crc32(stringContent).toString(16)
|
|
105
|
+
// use crc32 hash of the content as the default identity
|
|
106
|
+
},
|
|
107
|
+
meta: {
|
|
108
|
+
name,
|
|
109
|
+
contentType: inferredContentType,
|
|
110
|
+
size,
|
|
111
|
+
mode
|
|
112
|
+
},
|
|
113
|
+
content: isSecret ? { type: "embedded-secret", value: makeSecret(stringContent), isBinary } : { type: "embedded", value: stringContent, isBinary }
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function makeFileOutput(options) {
|
|
117
|
+
return output(options).apply((opts) => makeFile(opts));
|
|
118
|
+
}
|
|
119
|
+
function makeFileAsync(options) {
|
|
120
|
+
return toPromise(makeFileOutput(options));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// src/resource-hooks.ts
|
|
124
|
+
var hasResourceHooks = false;
|
|
125
|
+
function setResourceHooks() {
|
|
126
|
+
hasResourceHooks = true;
|
|
127
|
+
}
|
|
128
|
+
function getHasResourceHooks() {
|
|
129
|
+
return hasResourceHooks;
|
|
130
|
+
}
|
|
62
131
|
var instanceId;
|
|
132
|
+
var stateId;
|
|
63
133
|
var instanceName;
|
|
64
134
|
var importBaseUrl;
|
|
65
135
|
function getUnitInstanceId() {
|
|
@@ -68,6 +138,12 @@ function getUnitInstanceId() {
|
|
|
68
138
|
}
|
|
69
139
|
return instanceId;
|
|
70
140
|
}
|
|
141
|
+
function getUnitStateId() {
|
|
142
|
+
if (!stateId) {
|
|
143
|
+
throw new Error(`State id is not set. Did you call "forUnit" function?`);
|
|
144
|
+
}
|
|
145
|
+
return stateId;
|
|
146
|
+
}
|
|
71
147
|
function getUnitInstanceName() {
|
|
72
148
|
if (!instanceName) {
|
|
73
149
|
throw new Error(`Instance name is not set. Did you call "forUnit" function?`);
|
|
@@ -81,57 +157,27 @@ function getImportBaseUrl() {
|
|
|
81
157
|
return importBaseUrl;
|
|
82
158
|
}
|
|
83
159
|
function getResourceComment() {
|
|
84
|
-
return `Managed by Highstate
|
|
160
|
+
return `Managed by Highstate [${getUnitStateId()}]`;
|
|
85
161
|
}
|
|
86
|
-
function
|
|
87
|
-
const [instanceType] = parseInstanceId(input.instanceId);
|
|
88
|
-
const stateId = config.stateIdMap[input.instanceId];
|
|
89
|
-
if (!stateId) {
|
|
90
|
-
throw new Error(`State ID for instance "${input.instanceId}" not found in the unit config.`);
|
|
91
|
-
}
|
|
92
|
-
const key = `organization/${instanceType}/${stateId}`;
|
|
93
|
-
let stackRef = stackRefMap.get(key);
|
|
94
|
-
if (!stackRef) {
|
|
95
|
-
stackRef = new StackReference(key);
|
|
96
|
-
stackRefMap.set(key, stackRef);
|
|
97
|
-
}
|
|
98
|
-
return stackRef;
|
|
99
|
-
}
|
|
100
|
-
function getOutput(config, unit, inputName, input, refs) {
|
|
162
|
+
function getInputValue(unit, inputName, input, entries) {
|
|
101
163
|
const entity = unit.entities.get(input.type);
|
|
102
164
|
if (!entity) {
|
|
103
165
|
throw new Error(`Entity "${input.type}" not found in the unit "${unit.model.type}".`);
|
|
104
166
|
}
|
|
105
|
-
const
|
|
106
|
-
const value =
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
const result = schema.safeParse(value2);
|
|
118
|
-
if (!result.success) {
|
|
119
|
-
throw new Error(
|
|
120
|
-
`Invalid output "${ref.output}" from "${ref.instanceId}" for input "${inputName}": ${result.error.message}`
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
if (Array.isArray(value2)) {
|
|
124
|
-
return value2;
|
|
125
|
-
}
|
|
126
|
-
return input.multiple ? [value2] : value2;
|
|
127
|
-
});
|
|
128
|
-
};
|
|
129
|
-
const _getDecompactedOutput = (ref) => {
|
|
130
|
-
return _getOutput(ref).apply(decompact);
|
|
131
|
-
};
|
|
132
|
-
const values = output(refs.map(_getDecompactedOutput)).apply((values2) => values2.flat());
|
|
167
|
+
const values = entries.flatMap((entry) => {
|
|
168
|
+
const value = parseArgumentValue(entry.value);
|
|
169
|
+
const schema = Array.isArray(value) ? entity.schema.array() : entity.schema;
|
|
170
|
+
const result = schema.safeParse(value);
|
|
171
|
+
if (!result.success) {
|
|
172
|
+
throw new Error(`Invalid value for input "${inputName}": ${z.prettifyError(result.error)}`);
|
|
173
|
+
}
|
|
174
|
+
if (Array.isArray(result.data)) {
|
|
175
|
+
return result.data;
|
|
176
|
+
}
|
|
177
|
+
return input.multiple ? [result.data] : [result.data];
|
|
178
|
+
});
|
|
133
179
|
if (!input.multiple) {
|
|
134
|
-
return values
|
|
180
|
+
return values[0];
|
|
135
181
|
}
|
|
136
182
|
return values;
|
|
137
183
|
}
|
|
@@ -139,7 +185,6 @@ function forUnit(unit) {
|
|
|
139
185
|
const config = new Config();
|
|
140
186
|
const rawHSConfig = config.requireObject(HighstateConfigKey.Config);
|
|
141
187
|
const hsConfig = unitConfigSchema.parse(rawHSConfig);
|
|
142
|
-
const rawHsSecrets = config.requireSecretObject(HighstateConfigKey.Secrets).apply((secrets2) => z.record(z.string(), z.unknown()).parse(secrets2));
|
|
143
188
|
const args = mapValues(unit.model.args, (arg, argName) => {
|
|
144
189
|
const value = parseArgumentValue(hsConfig.args[argName]);
|
|
145
190
|
const result = arg[runtimeSchema].safeParse(value);
|
|
@@ -148,39 +193,40 @@ function forUnit(unit) {
|
|
|
148
193
|
}
|
|
149
194
|
return result.data;
|
|
150
195
|
});
|
|
151
|
-
const secrets = mapValues(unit.model.secrets, (
|
|
152
|
-
const hasValue = hsConfig.
|
|
153
|
-
if (!hasValue && !
|
|
154
|
-
return
|
|
196
|
+
const secrets = mapValues(unit.model.secrets, (secret$1, secretName) => {
|
|
197
|
+
const hasValue = secretName in hsConfig.secretValues;
|
|
198
|
+
if (!hasValue && !secret$1.required) {
|
|
199
|
+
return secret$1.schema.default ? secret(secret$1.schema.default) : void 0;
|
|
155
200
|
}
|
|
156
|
-
if (!hasValue &&
|
|
201
|
+
if (!hasValue && secret$1.required) {
|
|
157
202
|
throw new Error(`Secret "${secretName}" is required but not provided.`);
|
|
158
203
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
});
|
|
204
|
+
const rawValue = hsConfig.secretValues[secretName];
|
|
205
|
+
const value = parseArgumentValue(rawValue);
|
|
206
|
+
const result = secret$1[runtimeSchema].safeParse(value);
|
|
207
|
+
if (!result.success) {
|
|
208
|
+
throw new Error(`Invalid secret "${secretName}": ${z.prettifyError(result.error)}`);
|
|
209
|
+
}
|
|
210
|
+
return secret(result.data);
|
|
167
211
|
});
|
|
168
212
|
const inputs = mapValues(unit.model.inputs, (input, inputName) => {
|
|
169
213
|
const value = hsConfig.inputs[inputName];
|
|
170
214
|
if (!value) {
|
|
171
215
|
if (input.multiple) {
|
|
172
|
-
return
|
|
216
|
+
return [];
|
|
173
217
|
}
|
|
174
218
|
return void 0;
|
|
175
219
|
}
|
|
176
|
-
return
|
|
220
|
+
return getInputValue(unit, inputName, input, value);
|
|
177
221
|
});
|
|
178
222
|
const [type, name] = parseInstanceId(hsConfig.instanceId);
|
|
179
223
|
instanceId = hsConfig.instanceId;
|
|
224
|
+
stateId = hsConfig.stateId;
|
|
180
225
|
instanceName = name;
|
|
181
226
|
importBaseUrl = pathToFileURL(hsConfig.importBasePath);
|
|
182
227
|
return {
|
|
183
228
|
instanceId: hsConfig.instanceId,
|
|
229
|
+
stateId: hsConfig.stateId,
|
|
184
230
|
type,
|
|
185
231
|
name,
|
|
186
232
|
args,
|
|
@@ -195,22 +241,26 @@ function forUnit(unit) {
|
|
|
195
241
|
secrets[name2] = value;
|
|
196
242
|
return value;
|
|
197
243
|
}),
|
|
244
|
+
setSecret: ((name2, value) => {
|
|
245
|
+
secrets[name2] = secret(value);
|
|
246
|
+
}),
|
|
198
247
|
outputs: async (outputs = {}) => {
|
|
199
|
-
const
|
|
248
|
+
const resolvedOutputs = await toPromise(outputs);
|
|
249
|
+
const result = mapValues(resolvedOutputs, (outputValue, outputName) => {
|
|
200
250
|
if (outputName === "$statusFields") {
|
|
201
|
-
return
|
|
251
|
+
return mapStatusFields(outputValue);
|
|
202
252
|
}
|
|
203
253
|
if (outputName === "$pages") {
|
|
204
|
-
return
|
|
254
|
+
return mapPages(outputValue);
|
|
205
255
|
}
|
|
206
256
|
if (outputName === "$terminals") {
|
|
207
|
-
return
|
|
257
|
+
return mapTerminals(outputValue);
|
|
208
258
|
}
|
|
209
259
|
if (outputName === "$triggers") {
|
|
210
|
-
return
|
|
260
|
+
return mapTriggers(outputValue);
|
|
211
261
|
}
|
|
212
262
|
if (outputName === "$workers") {
|
|
213
|
-
return
|
|
263
|
+
return mapWorkers(outputValue);
|
|
214
264
|
}
|
|
215
265
|
if (outputName.startsWith("$")) {
|
|
216
266
|
throw new Error(`Unknown extra output "${outputName}".`);
|
|
@@ -227,20 +277,17 @@ function forUnit(unit) {
|
|
|
227
277
|
`Entity "${outputModel.type}" not found in the unit "${unit.model.type}". It looks like a bug in the unit definition.`
|
|
228
278
|
);
|
|
229
279
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
return compact(result2.data);
|
|
241
|
-
});
|
|
280
|
+
const schema = outputModel.multiple ? entity.schema.array() : entity.schema;
|
|
281
|
+
const result2 = schema.safeParse(outputValue);
|
|
282
|
+
if (!result2.success) {
|
|
283
|
+
throw new Error(
|
|
284
|
+
`Invalid value for output "${outputName}" of type "${outputModel.type}": ${z.prettifyError(
|
|
285
|
+
result2.error
|
|
286
|
+
)}`
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
return result2.data;
|
|
242
290
|
});
|
|
243
|
-
await Promise.all(Object.values(result).map((o) => toPromise(o)));
|
|
244
291
|
result.$secrets = secrets;
|
|
245
292
|
const artifactsMap = {};
|
|
246
293
|
for (const [outputName, outputValue] of Object.entries(outputs)) {
|
|
@@ -253,10 +300,49 @@ function forUnit(unit) {
|
|
|
253
300
|
if (Object.keys(artifactsMap).length > 0) {
|
|
254
301
|
result.$artifacts = artifactsMap;
|
|
255
302
|
}
|
|
256
|
-
|
|
303
|
+
result.$hasResourceHooks = getHasResourceHooks();
|
|
304
|
+
return wrapHighstateSecretValues(result);
|
|
257
305
|
}
|
|
258
306
|
};
|
|
259
307
|
}
|
|
308
|
+
function wrapHighstateSecretValues(data) {
|
|
309
|
+
const cache = /* @__PURE__ */ new WeakMap();
|
|
310
|
+
const traverse = (value) => {
|
|
311
|
+
if (value === null || value === void 0 || typeof value !== "object") {
|
|
312
|
+
return value;
|
|
313
|
+
}
|
|
314
|
+
if (Array.isArray(value)) {
|
|
315
|
+
const cached2 = cache.get(value);
|
|
316
|
+
if (cached2) {
|
|
317
|
+
return cached2;
|
|
318
|
+
}
|
|
319
|
+
const mapped2 = [];
|
|
320
|
+
cache.set(value, mapped2);
|
|
321
|
+
for (const item of value) {
|
|
322
|
+
mapped2.push(traverse(item));
|
|
323
|
+
}
|
|
324
|
+
return mapped2;
|
|
325
|
+
}
|
|
326
|
+
if (!isPlainObject(value)) {
|
|
327
|
+
return value;
|
|
328
|
+
}
|
|
329
|
+
const cached = cache.get(value);
|
|
330
|
+
if (cached) {
|
|
331
|
+
return cached;
|
|
332
|
+
}
|
|
333
|
+
const record = value;
|
|
334
|
+
const mapped = {};
|
|
335
|
+
cache.set(value, mapped);
|
|
336
|
+
for (const [key, nestedValue] of Object.entries(record)) {
|
|
337
|
+
mapped[key] = traverse(nestedValue);
|
|
338
|
+
}
|
|
339
|
+
if (record[HighstateSignature.Secret] === true && "value" in record) {
|
|
340
|
+
return secret(mapped);
|
|
341
|
+
}
|
|
342
|
+
return mapped;
|
|
343
|
+
};
|
|
344
|
+
return traverse(data);
|
|
345
|
+
}
|
|
260
346
|
function mapStatusFields(status) {
|
|
261
347
|
if (!status) {
|
|
262
348
|
return [];
|
|
@@ -375,7 +461,10 @@ function extractObjectsFromValue(schema, data) {
|
|
|
375
461
|
traverse(data);
|
|
376
462
|
return result;
|
|
377
463
|
}
|
|
464
|
+
function getUnitTempPath() {
|
|
465
|
+
return join("/tmp/highstate", getUnitStateId());
|
|
466
|
+
}
|
|
378
467
|
|
|
379
|
-
export { apply,
|
|
468
|
+
export { apply, forUnit, getCombinedIdentity, getCombinedIdentityAsync, getCombinedIdentityOutput, getHasResourceHooks, getImportBaseUrl, getResourceComment, getUnitInstanceId, getUnitInstanceName, getUnitStateId, getUnitTempPath, makeEntity, makeEntityAsync, makeEntityOutput, makeFile, makeFileAsync, makeFileOutput, makeSecret, makeSecretAsync, makeSecretOutput, normalize, normalizeInputs, normalizeInputsAndMap, setResourceHooks, toPromise };
|
|
380
469
|
//# sourceMappingURL=index.js.map
|
|
381
470
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/file.ts","../src/utils.ts","../src/unit.ts"],"names":["content","output","item","collection","value","values","secrets","secret","pulumiSecret","name","result"],"mappings":";;;;;;;AAiBO,SAAS,cAAA,CACd,IAAA,EACA,OAAA,EACA,EAAE,WAAA,GAAc,YAAA,EAAc,QAAA,GAAW,KAAA,EAAO,IAAA,EAAK,GAAiB,EAAC,EACzD;AACd,EAAA,OAAO,MAAA,CAAO;AAAA,IACZ,IAAA,EAAM;AAAA,MACJ,IAAA;AAAA,MACA,WAAA;AAAA,MACA,IAAA,EAAM,MAAA,CAAO,OAAO,CAAA,CAAE,KAAA,CAAM,CAAAA,QAAAA,KAAW,MAAA,CAAO,UAAA,CAAWA,QAAAA,EAAS,MAAM,CAAC,CAAA;AAAA,MACzE;AAAA,KACF;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO,QAAA,GAAW,MAAA,CAAO,OAAO,CAAA,GAAI;AAAA;AACtC,GACD,CAAA;AACH;AAUO,SAAS,cAAA,CACd,IAAA,EACA,OAAA,EACA,EAAE,WAAA,GAAc,0BAAA,EAA4B,QAAA,GAAW,KAAA,EAAO,IAAA,EAAK,GAAiB,EAAC,EACvE;AAId,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA;AAE/C,EAAA,OAAO,MAAA,CAAO;AAAA,IACZ,IAAA,EAAM;AAAA,MACJ,IAAA;AAAA,MACA,WAAA;AAAA,MACA,IAAA,EAAM,OAAO,OAAO,CAAA,CAAE,MAAM,CAAAA,QAAAA,KAAWA,SAAQ,UAAU,CAAA;AAAA,MACzD;AAAA,KACF;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,KAAA,EAAO,QAAA,GAAW,MAAA,CAAO,aAAa,CAAA,GAAI;AAAA;AAC5C,GACD,CAAA;AACH;AC9BO,SAAS,UAAa,KAAA,EAAqC;AAChE,EAAA,OAAO,IAAI,QAAQ,CAAA,OAAA,KAAWC,MAAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,OAAO,CAAC,CAAA;AAC5D;AAUO,SAAS,SAAA,CAAa,MAAqB,UAAA,EAAkC;AAClF,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,OAAO,CAAC,IAAA,EAAM,GAAG,UAAU,CAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAO,CAAC,IAAI,CAAA;AAAA,EACd;AAEA,EAAA,OAAO,cAAc,EAAC;AACxB;AAQO,SAAS,eAAA,CACd,MACA,UAAA,EACqB;AACrB,EAAA,OACEA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,EAExB,KAAA,CAAM,CAAC,EAAE,IAAA,EAAAC,OAAM,UAAA,EAAAC,WAAAA,OAAiB,SAAA,CAAUD,KAAAA,EAAMC,WAAU,CAAC,CAAA;AAElE;AASO,SAAS,qBAAA,CACd,IAAA,EACA,UAAA,EACA,KAAA,EACa;AACb,EAAA,OAAO,eAAA,CAAgB,MAAM,UAAU,CAAA,CAAE,MAAM,CAAA,MAAA,KAAU,MAAA,CAAO,GAAA,CAAI,KAAK,CAAC,CAAA;AAC5E;AASO,SAAS,MAAY,EAAA,EAA6D;AACvF,EAAA,OAAO,CAAA,KAAA,KAASF,MAAAA,CAAO,KAAK,CAAA,CAAE,MAAM,EAAE,CAAA;AACxC;;;ACsCA,IAAM,WAAA,uBAAkB,GAAA,EAA4B;AAEpD,IAAI,UAAA;AACJ,IAAI,YAAA;AACJ,IAAI,aAAA;AAOG,SAAS,iBAAA,GAA4B;AAC1C,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,MAAM,CAAA,wDAAA,CAA0D,CAAA;AAAA,EAC5E;AAEA,EAAA,OAAO,UAAA;AACT;AAKO,SAAS,mBAAA,GAA8B;AAC5C,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,MAAM,CAAA,0DAAA,CAA4D,CAAA;AAAA,EAC9E;AAEA,EAAA,OAAO,YAAA;AACT;AAKO,SAAS,gBAAA,GAAwB;AACtC,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,MAAM,IAAI,MAAM,CAAA,4DAAA,CAA8D,CAAA;AAAA,EAChF;AAEA,EAAA,OAAO,aAAA;AACT;AAKO,SAAS,kBAAA,GAA6B;AAC3C,EAAA,OAAO,CAAA,sBAAA,EAAyB,mBAAmB,CAAA,CAAA,CAAA;AACrD;AAEA,SAAS,WAAA,CAAY,QAAoB,KAAA,EAAsB;AAC7D,EAAA,MAAM,CAAC,YAAY,CAAA,GAAI,eAAA,CAAgB,MAAM,UAAU,CAAA;AACvD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,UAAU,CAAA;AAClD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAA,CAAM,UAAU,CAAA,+BAAA,CAAiC,CAAA;AAAA,EAC7F;AAEA,EAAA,MAAM,GAAA,GAAM,CAAA,aAAA,EAAgB,YAAY,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AACnD,EAAA,IAAI,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAElC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,QAAA,GAAW,IAAI,eAAe,GAAG,CAAA;AACjC,IAAA,WAAA,CAAY,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,SAAA,CACP,MAAA,EACA,IAAA,EACA,SAAA,EACA,OACA,IAAA,EACA;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,IAAI,CAAA;AAC3C,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,MAAM,CAAA,QAAA,EAAW,KAAA,CAAM,IAAI,CAAA,yBAAA,EAA4B,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAA,CAAI,CAAA;AAAA,EACtF;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAA4B;AAC9C,IAAA,MAAM,QAAQ,WAAA,CAAY,MAAA,EAAQ,GAAG,CAAA,CAAE,aAAA,CAAc,IAAI,MAAM,CAAA;AAE/D,IAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAAG,MAAAA,KAAS;AAC1B,MAAA,IAAI,IAAI,SAAA,EAAW;AACjB,QAAA,IAAIA,WAAU,IAAA,IAAQA,MAAAA,KAAU,MAAA,IAAa,OAAOA,WAAU,QAAA,EAAU;AACtE,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,sBAAA,EAAyB,IAAI,SAAA,CAAU,KAAK,6BAA6B,GAAA,CAAI,MAAM,CAAA,eAAA,EAAkB,GAAA,CAAI,UAAU,CAAA,EAAA;AAAA,WACrH;AAAA,QACF;AAEA,QAAAA,MAAAA,GAASA,MAAAA,CAAkC,GAAA,CAAI,SAAA,CAAU,KAAK,CAAA;AAAA,MAChE;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQA,MAAK,IAAI,MAAA,CAAO,MAAA,CAAO,KAAA,EAAM,GAAI,MAAA,CAAO,MAAA;AACrE,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,CAAUA,MAAK,CAAA;AAErC,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,gBAAA,EAAmB,GAAA,CAAI,MAAM,CAAA,QAAA,EAAW,GAAA,CAAI,UAAU,CAAA,aAAA,EAAgB,SAAS,CAAA,GAAA,EAAM,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA;AAAA,SAC3G;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQA,MAAK,CAAA,EAAG;AACxB,QAAA,OAAOA,MAAAA;AAAA,MACT;AAEA,MAAA,OAAO,KAAA,CAAM,QAAA,GAAW,CAACA,MAAK,CAAA,GAAIA,MAAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,CAAC,GAAA,KAA4B;AACzD,IAAA,OAAO,UAAA,CAAW,GAAG,CAAA,CAAE,KAAA,CAAM,SAAS,CAAA;AAAA,EACxC,CAAA;AAEA,EAAA,MAAM,MAAA,GAASH,MAAAA,CAAO,IAAA,CAAK,GAAA,CAAI,qBAAqB,CAAC,CAAA,CAAE,KAAA,CAAM,CAAAI,OAAAA,KAAUA,OAAAA,CAAO,IAAA,EAAM,CAAA;AAEpF,EAAA,IAAI,CAAC,MAAM,QAAA,EAAU;AACnB,IAAA,OAAO,OAAO,KAAA,CAAM,CAAAA,OAAAA,KAAUA,OAAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,QAOd,IAAA,EAMA;AACA,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,EAAO;AAC1B,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,aAAA,CAAc,kBAAA,CAAmB,MAAM,CAAA;AAClE,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,KAAA,CAAM,WAAW,CAAA;AAEnD,EAAA,MAAM,YAAA,GAAe,OAClB,mBAAA,CAAoB,kBAAA,CAAmB,OAAO,CAAA,CAC9C,KAAA,CAAM,CAAAC,QAAAA,KAAW,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,KAAA,CAAMA,QAAO,CAAC,CAAA;AAEpE,EAAA,MAAM,OAAO,SAAA,CAAU,IAAA,CAAK,MAAM,IAAA,EAAM,CAAC,KAAK,OAAA,KAAY;AACxD,IAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA;AACvD,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,aAAa,CAAA,CAAG,UAAU,KAAK,CAAA;AAElD,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,OAAO,CAAA,GAAA,EAAM,EAAE,aAAA,CAAc,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IACnF;AAEA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB,CAAC,CAAA;AAED,EAAA,MAAM,UAAU,SAAA,CAAU,IAAA,CAAK,MAAM,OAAA,EAAS,CAACC,SAAQ,UAAA,KAAe;AACpE,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA;AAEzD,IAAA,IAAI,CAAC,QAAA,IAAY,CAACA,OAAAA,CAAO,QAAA,EAAU;AACjC,MAAA,OAAOA,QAAO,MAAA,CAAO,OAAA,GAAUC,OAAaD,OAAAA,CAAO,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA;AAAA,IACvE;AAEA,IAAA,IAAI,CAAC,QAAA,IAAYA,OAAAA,CAAO,QAAA,EAAU;AAChC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,UAAU,CAAA,+BAAA,CAAiC,CAAA;AAAA,IACxE;AAEA,IAAA,OAAO,YAAA,CAAa,UAAU,CAAA,CAAE,KAAA,CAAM,CAAA,QAAA,KAAY;AAChD,MAAA,MAAM,KAAA,GAAQ,mBAAmB,QAAQ,CAAA;AACzC,MAAA,MAAM,MAAA,GAASA,OAAAA,CAAO,aAAa,CAAA,CAAG,UAAU,KAAK,CAAA;AAErD,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,UAAU,CAAA,GAAA,EAAM,EAAE,aAAA,CAAc,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MACpF;AAEA,MAAA,OAAOC,MAAA,CAAa,OAAO,IAAI,CAAA;AAAA,IACjC,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,MAAM,SAAS,SAAA,CAAU,IAAA,CAAK,MAAM,MAAA,EAAQ,CAAC,OAAO,SAAA,KAAc;AAChE,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,MAAA,CAAO,SAAS,CAAA;AAEvC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,IAAI,MAAM,QAAA,EAAU;AAClB,QAAA,OAAOP,MAAAA,CAAO,EAAE,CAAA;AAAA,MAClB;AAEA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,SAAA,CAAU,QAAA,EAAU,IAAA,EAAyB,SAAA,EAAW,OAAO,KAAK,CAAA;AAAA,EAC7E,CAAC,CAAA;AAED,EAAA,MAAM,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI,eAAA,CAAgB,SAAS,UAAU,CAAA;AAExD,EAAA,UAAA,GAAa,QAAA,CAAS,UAAA;AACtB,EAAA,YAAA,GAAe,IAAA;AACf,EAAA,aAAA,GAAgB,aAAA,CAAc,SAAS,cAAc,CAAA;AAErD,EAAA,OAAO;AAAA,IACL,YAAY,QAAA,CAAS,UAAA;AAAA,IACrB,IAAA;AAAA,IACA,IAAA;AAAA,IAEA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,iBAAiB,QAAA,CAAS,eAAA;AAAA,IAE1B,SAAA,GAAY,CACVQ,KAAAA,EACA,OAAA,KACG;AACH,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,QAAQA,KAAc,CAAA;AAAA,MAC/B;AAEA,MAAA,MAAM,QAAQ,OAAA,CAAQA,KAAc,CAAA,IAAKD,MAAA,CAAa,SAAS,CAAA;AAC/D,MAAA,OAAA,CAAQC,KAAc,CAAA,GAAI,KAAA;AAE1B,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,CAAA;AAAA,IAEA,OAAA,EAAS,OAAO,OAAA,GAAe,EAAC,KAAM;AACpC,MAAA,MAAM,MAAA,GAAc,SAAA,CAAU,OAAA,EAAS,CAAC,aAAa,UAAA,KAAe;AAClE,QAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,UAAA,OAAOR,MAAAA,CAAO,WAAW,CAAA,CAAE,KAAA,CAAM,eAAe,CAAA;AAAA,QAClD;AAEA,QAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,UAAA,OAAOA,MAAAA,CAAO,WAAW,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA;AAAA,QAC3C;AAEA,QAAA,IAAI,eAAe,YAAA,EAAc;AAC/B,UAAA,OAAOA,MAAAA,CAAO,WAAW,CAAA,CAAE,KAAA,CAAM,YAAY,CAAA;AAAA,QAC/C;AAEA,QAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,UAAA,OAAOA,MAAAA,CAAO,WAAW,CAAA,CAAE,KAAA,CAAM,WAAW,CAAA;AAAA,QAC9C;AAEA,QAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,UAAA,OAAOA,MAAAA,CAAO,WAAW,CAAA,CAAE,KAAA,CAAM,UAAU,CAAA;AAAA,QAC7C;AAEA,QAAA,IAAI,UAAA,CAAW,UAAA,CAAW,GAAG,CAAA,EAAG;AAC9B,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,UAAU,CAAA,EAAA,CAAI,CAAA;AAAA,QACzD;AAEA,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA;AACjD,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,QAAA,EAAW,UAAU,CAAA,yBAAA,EAA4B,IAAA,CAAK,MAAM,IAAI,CAAA,kCAAA;AAAA,WAClE;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,YAAY,IAAI,CAAA;AACjD,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,WAAW,WAAA,CAAY,IAAI,CAAA,yBAAA,EAA4B,IAAA,CAAK,MAAM,IAAI,CAAA,8CAAA;AAAA,WACxE;AAAA,QACF;AAEA,QAAA,OAAOA,MAAAA,CAAO,WAAW,CAAA,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AACxC,UAAA,MAAM,SAAS,WAAA,CAAY,QAAA,GAAW,OAAO,MAAA,CAAO,KAAA,KAAU,MAAA,CAAO,MAAA;AACrE,UAAA,MAAMS,OAAAA,GAAS,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA;AAErC,UAAA,IAAI,CAACA,QAAO,OAAA,EAAS;AACnB,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,6BAA6B,UAAU,CAAA,WAAA,EAAc,WAAA,CAAY,IAAI,MAAM,CAAA,CAAE,aAAA;AAAA,gBAC3EA,OAAAA,CAAO;AAAA,eACR,CAAA;AAAA,aACH;AAAA,UACF;AAEA,UAAA,OAAO,OAAA,CAAQA,QAAO,IAAI,CAAA;AAAA,QAC5B,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AAGD,MAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,SAAA,CAAU,CAAC,CAAC,CAAC,CAAA;AAE9D,MAAA,MAAA,CAAO,QAAA,GAAW,OAAA;AAGlB,MAAA,MAAM,eAA+C,EAAC;AACtD,MAAA,KAAA,MAAW,CAAC,UAAA,EAAY,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC/D,QAAA,MAAM,aAAA,GAAgB,MAAM,SAAA,CAAU,WAAW,CAAA;AACjD,QAAA,MAAM,SAAA,GAAY,uBAAA,CAAwB,kBAAA,EAAoB,aAAa,CAAA;AAC3E,QAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,UAAA,YAAA,CAAa,UAAU,CAAA,GAAI,SAAA;AAAA,QAC7B;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,SAAS,CAAA,EAAG;AACxC,QAAA,MAAA,CAAO,UAAA,GAAa,YAAA;AAAA,MACtB;AAEA,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AACF;AAEA,SAAS,gBAAgB,MAAA,EAAsE;AAC7F,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,IAAA,OAAO,MAAA,CACJ,OAAO,CAAC,KAAA,KAA6C,OAAO,KAAA,KAAU,MAAS,CAAA,CAC/E,GAAA,CAAI,CAAA,KAAA,KAAS;AACZ,MAAA,OAAO;AAAA,QACL,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,IAAA,EAAM;AAAA,UACJ,OAAO,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,wBAAA,CAAyB,MAAM,IAAI;AAAA,SACjE;AAAA,QACA,OAAO,KAAA,CAAM;AAAA,OACf;AAAA,IACF,CAAC,CAAA;AAAA,EACL;AAEA,EAAA,OAAO,MAAA,CAAO,QAAQ,MAAM,CAAA,CACzB,IAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,KAAM;AACtB,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IACE,OAAO,KAAA,KAAU,QAAA,IACjB,OAAO,KAAA,KAAU,QAAA,IACjB,OAAO,KAAA,KAAU,SAAA,IACjB,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EACnB;AACA,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,KAAA,EAAO,yBAAyB,IAAI;AAAA,SACtC;AAAA,QACA,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,KAAA;AAAA,MACH,IAAA,EAAM;AAAA,QACJ,GAAG,KAAA,CAAM,IAAA;AAAA,QACT,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,yBAAyB,IAAI;AAAA,OAC3D;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,KAAA,KAAwC,KAAA,EAAO,UAAU,MAAS,CAAA;AAC/E;AAEA,SAAS,SAAS,KAAA,EAA2D;AAC3E,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAOT,MAAAA,CAAO,EAAE,CAAA;AAAA,EAClB;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,IAAA,KAAA,GAAQ,MAAA,CAAO,QAAQ,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,IAAA,EAAM,IAAI,CAAA,KAAM;AAClD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,IAAA,EAAK;AAAA,IACzB,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAOA,MAAAA,CAAO,MAAM,MAAA,CAAO,CAAC,SAAwC,CAAC,CAAC,IAAI,CAAC,CAAA;AAC7E;AAEA,SAAS,aAAa,SAAA,EAAuE;AAC3F,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAOA,MAAAA,CAAO,EAAE,CAAA;AAAA,EAClB;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC7B,IAAA,SAAA,GAAY,MAAA,CAAO,QAAQ,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,IAAA,EAAM,QAAQ,CAAA,KAAM;AAC9D,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,OAAO,EAAE,GAAG,QAAA,EAAU,IAAA,EAAK;AAAA,IAC7B,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAOA,MAAAA,CAAO,UAAU,MAAA,CAAO,CAAC,aAAoD,CAAC,CAAC,QAAQ,CAAC,CAAA;AACjG;AAEA,SAAS,YAAY,QAAA,EAAoE;AACvF,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAOA,MAAAA,CAAO,EAAE,CAAA;AAAA,EAClB;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC5B,IAAA,QAAA,GAAW,MAAA,CAAO,QAAQ,QAAQ,CAAA,CAAE,IAAI,CAAC,CAAC,IAAA,EAAM,OAAO,CAAA,KAAM;AAC3D,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,OAAO,EAAE,GAAG,OAAA,EAAS,IAAA,EAAK;AAAA,IAC5B,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAOA,MAAAA,CAAO,SAAS,MAAA,CAAO,CAAC,YAAiD,CAAC,CAAC,OAAO,CAAC,CAAA;AAC5F;AAEA,SAAS,WAAW,OAAA,EAAyE;AAC3F,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAOA,MAAAA,CAAO,EAAE,CAAA;AAAA,EAClB;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC3B,IAAA,OAAA,GAAU,MAAA,CAAO,QAAQ,OAAO,CAAA,CAAE,IAAI,CAAC,CAAC,IAAA,EAAM,MAAM,CAAA,KAAM;AACxD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAK;AAAA,IAC3B,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAOA,MAAAA,CAAO,QAAQ,MAAA,CAAO,CAAC,WAAsD,CAAC,CAAC,MAAM,CAAC,CAAA;AAC/F;AAKA,SAAS,uBAAA,CACP,QACA,IAAA,EACoB;AACpB,EAAA,MAAM,SAA6B,EAAC;AAEpC,EAAA,SAAS,SAAS,GAAA,EAAoB;AACpC,IAAA,IAAI,QAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,IAAa,OAAO,QAAQ,QAAA,EAAU;AAChE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,MAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACf;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,SAAA,CAAU,GAAG,CAAA;AACxC,IAAA,IAAI,YAAY,OAAA,EAAS;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,YAAY,IAAI,CAAA;AAC5B,MAAA;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,EAAG;AACtC,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,QAAA,CAAS,IAAI,CAAA;AACb,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["import type { File } from \"@highstate/contract\"\nimport { type Input, type Output, output, secret } from \"@pulumi/pulumi\"\n\nexport type FileOptions = {\n isSecret?: boolean\n contentType?: Input<string>\n mode?: Input<number>\n}\n\n/**\n * Creates a file from a string input.\n * This file can then be passed to terminals/pages or other components.\n *\n * @param name The name of the file.\n * @param content The content of the file.\n * @param options Additional options for the file.\n */\nexport function fileFromString(\n name: Input<string>,\n content: Input<string>,\n { contentType = \"text/plain\", isSecret = false, mode }: FileOptions = {},\n): Output<File> {\n return output({\n meta: {\n name,\n contentType,\n size: output(content).apply(content => Buffer.byteLength(content, \"utf8\")),\n mode,\n },\n content: {\n type: \"embedded\",\n value: isSecret ? secret(content) : content,\n },\n })\n}\n\n/**\n * Creates a file from a buffer input.\n * This file can then be passed to terminals/pages or other components.\n *\n * @param name The name of the file.\n * @param content The content of the file as a Buffer.\n * @param options Additional options for the file.\n */\nexport function fileFromBuffer(\n name: Input<string>,\n content: Buffer,\n { contentType = \"application/octet-stream\", isSecret = false, mode }: FileOptions = {},\n): Output<File> {\n // const base64Content = output(content).apply(\n // c => (console.log(\"fileFromBuffer\", c), c.toString(\"base64\")),\n // )\n const base64Content = content.toString(\"base64\")\n\n return output({\n meta: {\n name,\n contentType,\n size: output(content).apply(content => content.byteLength),\n mode,\n },\n content: {\n type: \"embedded\",\n isBinary: true,\n value: isSecret ? secret(base64Content) : base64Content,\n },\n })\n}\n","import { type Input, type Output, output, type Unwrap } 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 record of inputs.\n * The same as `Input<Record<string, Input<T>>>`, but more readable.\n */\nexport type InputRecord<T> = Input<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\ntype LeafValue = string | number | boolean | null | undefined\ntype IsUnknown<T> = unknown extends T ? (T extends unknown ? true : false) : false\n\n/**\n * The recursive input type for a value.\n */\nexport type DeepInput<T> = [T] extends [LeafValue]\n ? Input<T>\n : IsUnknown<T> extends true\n ? Input<unknown>\n : Input<{ [K in keyof T]: DeepInput<T[K]> }>\n\n/**\n * Transforms an input value to a promise that resolves to the unwrapped value.\n *\n * @param input The input value to transform.\n * @returns A promise that resolves to the unwrapped value.\n */\nexport function toPromise<T>(input: Input<T>): Promise<Unwrap<T>> {\n return new Promise(resolve => output(input).apply(resolve))\n}\n\n/**\n * Receives an item and a collection, and returns an array containing the item and the collection.\n *\n * Excludes the item if it is undefined.\n *\n * @param item The single item input.\n * @param collection The collection of items input.\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\n/**\n * The same as `normalize`, but accepts inputs and returns output.\n *\n * @param item The single item input.\n * @param collection The collection of items input.\n */\nexport function normalizeInputs<T>(\n item: Input<T> | undefined,\n collection: InputArray<T> | undefined,\n): Output<Unwrap<T>[]> {\n return (\n output({ item, collection })\n //\n .apply(({ item, collection }) => normalize(item, collection)) as Output<Unwrap<T>[]>\n )\n}\n\n/**\n * The convenience function to normalize inputs and map them to a new type.\n *\n * @param item The single item input.\n * @param collection The collection of items input.\n * @param mapFn The function to map each item to a new type.\n */\nexport function normalizeInputsAndMap<T, U>(\n item: Input<T> | undefined,\n collection: InputArray<T> | undefined,\n mapFn: (value: Unwrap<T>) => U,\n): Output<U[]> {\n return normalizeInputs(item, collection).apply(values => values.map(mapFn))\n}\n\n/**\n * Applies a function to the input and returns an output.\n *\n * Can be used in `remeda` pipelines.\n *\n * @param fn The function to apply to the input.\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","/** biome-ignore-all lint/suspicious/noExplicitAny: здесь орать запрещено */\n\nimport type { IsEmptyObject } from \"type-fest\"\nimport { pathToFileURL } from \"node:url\"\nimport {\n type ComponentInput,\n type ComponentInputSpec,\n camelCaseToHumanReadable,\n compact,\n decompact,\n HighstateConfigKey,\n type InstanceInput,\n type InstanceStatusField,\n type InstanceStatusFieldValue,\n type PartialKeys,\n parseArgumentValue,\n parseInstanceId,\n runtimeSchema,\n type TriggerInvocation,\n type Unit,\n type UnitArtifact,\n type UnitConfig,\n type UnitInputReference,\n type UnitPage,\n type UnitTerminal,\n type UnitTrigger,\n type UnitWorker,\n unitArtifactSchema,\n unitConfigSchema,\n type VersionedName,\n z,\n} from \"@highstate/contract\"\nimport {\n Config,\n type Input,\n type Output,\n output,\n secret as pulumiSecret,\n StackReference,\n type Unwrap,\n} from \"@pulumi/pulumi\"\nimport { mapValues } from \"remeda\"\nimport { type DeepInput, toPromise } from \"./utils\"\n\ntype StatusField<TArgName extends string = string> = Omit<\n InstanceStatusField,\n \"complementaryTo\" | \"meta\"\n> & {\n meta?: PartialKeys<InstanceStatusField[\"meta\"], \"title\">\n complementaryTo?: TArgName\n}\n\ntype ExtraOutputs<TArgName extends string = string> = {\n $statusFields?:\n | Input<\n Record<\n string,\n DeepInput<Omit<StatusField<TArgName>, \"name\"> | InstanceStatusFieldValue | undefined>\n >\n >\n | Input<DeepInput<StatusField<TArgName> | undefined>[]>\n\n $terminals?:\n | Input<Record<string, DeepInput<Omit<UnitTerminal, \"name\"> | undefined>>>\n | Input<DeepInput<UnitTerminal | undefined>[]>\n\n $pages?:\n | Input<Record<string, DeepInput<Omit<UnitPage, \"name\"> | undefined>>>\n | Input<DeepInput<UnitPage | undefined>[]>\n\n $triggers?:\n | Input<Record<string, DeepInput<Omit<UnitTrigger, \"name\"> | undefined>>>\n | Input<DeepInput<UnitTrigger | undefined>[]>\n\n $workers?:\n | Input<Record<string, DeepInput<Omit<UnitWorker, \"name\"> | undefined>>>\n | Input<DeepInput<UnitWorker | undefined>[]>\n}\n\ntype OutputMapToDeepInputMap<\n T extends Record<string, unknown>,\n TArgName extends string,\n> = IsEmptyObject<T> extends true\n ? ExtraOutputs\n : { [K in keyof T]: DeepInput<T[K]> } & ExtraOutputs<TArgName>\n\ninterface 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\n secrets: {\n [K in keyof TSecrets]: undefined extends TSecrets[K]\n ? Output<NonNullable<TSecrets[K]>> | undefined\n : Output<TSecrets[K]>\n }\n\n getSecret<K extends keyof TSecrets>(\n this: void,\n name: K,\n ): Output<NonNullable<TSecrets[K]> | undefined>\n\n getSecret<K extends keyof TSecrets>(\n this: void,\n name: K,\n factory: () => Input<NonNullable<TSecrets[K]>>,\n ): Output<NonNullable<TSecrets[K]>>\n\n inputs: TInputs\n invokedTriggers: TriggerInvocation[]\n\n outputs(\n this: void,\n outputs?: OutputMapToDeepInputMap<TOutputs, keyof TArgs & string>,\n ): Promise<unknown>\n}\n\n// z.output since the values are validated/transformed and passed to the user\ntype InputSpecToWrappedValue<T extends ComponentInputSpec> = T[2] extends true\n ? // we have to wrap the array in Output since we don't know how many items will be returned by each multiple input\n Output<NonNullable<z.output<T[0][\"schema\"]>>[]>\n : T[1] extends true\n ? Output<NonNullable<z.output<T[0][\"schema\"]>>>\n : Output<NonNullable<z.output<T[0][\"schema\"]>>> | undefined\n\n// z.input since the values are passed from the user and should be validated/transformed before returning from the unit\ntype OutputSpecToValue<T extends ComponentInputSpec> = T[2] extends true\n ? T[1] extends true\n ? NonNullable<z.input<T[0][\"schema\"]>>[]\n : NonNullable<z.input<T[0][\"schema\"]>>[] | undefined\n : T[1] extends true\n ? NonNullable<z.input<T[0][\"schema\"]>>\n : NonNullable<z.input<T[0][\"schema\"]>> | undefined\n\nconst stackRefMap = new Map<string, StackReference>()\n\nlet instanceId: string | undefined\nlet instanceName: string | undefined\nlet importBaseUrl: URL | undefined\n\n/**\n * Returns the current unit instance id.\n *\n * Only available after calling `forUnit` function.\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\n/**\n * Returns the current unit instance name.\n */\nexport function getUnitInstanceName(): string {\n if (!instanceName) {\n throw new Error(`Instance name is not set. Did you call \"forUnit\" function?`)\n }\n\n return instanceName\n}\n\n/**\n * Returns the base URL for dynamic imports.\n */\nexport function getImportBaseUrl(): URL {\n if (!importBaseUrl) {\n throw new Error(`Import base URL is not set. Did you call \"forUnit\" function?`)\n }\n\n return importBaseUrl\n}\n\n/**\n * Returns a comment that can be used in resources to indicate that they are managed by Highstate.\n */\nexport function getResourceComment(): string {\n return `Managed by Highstate (${getUnitInstanceId()})`\n}\n\nfunction getStackRef(config: UnitConfig, input: InstanceInput) {\n const [instanceType] = parseInstanceId(input.instanceId)\n const stateId = config.stateIdMap[input.instanceId]\n if (!stateId) {\n throw new Error(`State ID for instance \"${input.instanceId}\" not found in the unit config.`)\n }\n\n const key = `organization/${instanceType}/${stateId}`\n let stackRef = stackRefMap.get(key)\n\n if (!stackRef) {\n stackRef = new StackReference(key)\n stackRefMap.set(key, stackRef)\n }\n\n return stackRef\n}\n\nfunction getOutput(\n config: UnitConfig,\n unit: Unit,\n inputName: string,\n input: ComponentInput,\n refs: UnitInputReference[],\n) {\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: UnitInputReference) => {\n const value = getStackRef(config, ref).requireOutput(ref.output)\n\n return value.apply(value => {\n if (ref.inclusion) {\n if (value === null || value === undefined || typeof value !== \"object\") {\n throw new Error(\n `Cannot extract field \"${ref.inclusion.field}\" from non-object output \"${ref.output}\" of instance \"${ref.instanceId}\".`,\n )\n }\n\n value = (value as Record<string, unknown>)[ref.inclusion.field]\n }\n\n const schema = Array.isArray(value) ? entity.schema.array() : entity.schema\n const result = schema.safeParse(value)\n\n if (!result.success) {\n throw new Error(\n `Invalid output \"${ref.output}\" from \"${ref.instanceId}\" for input \"${inputName}\": ${result.error.message}`,\n )\n }\n\n if (Array.isArray(value)) {\n return value\n }\n\n return input.multiple ? [value] : value\n })\n }\n\n const _getDecompactedOutput = (ref: UnitInputReference) => {\n return _getOutput(ref).apply(decompact)\n }\n\n const values = output(refs.map(_getDecompactedOutput)).apply(values => values.flat())\n\n if (!input.multiple) {\n return values.apply(values => values[0])\n }\n\n return values\n}\n\nexport function forUnit<\n TType extends VersionedName,\n TArgs extends Record<string, z.ZodType>,\n TInputs extends Record<string, ComponentInputSpec>,\n TOutputs extends Record<string, ComponentInputSpec>,\n TSecrets extends Record<string, z.ZodType>,\n>(\n unit: Unit<TType, TArgs, TInputs, TOutputs, TSecrets>,\n): UnitContext<\n { [K in keyof TArgs]: z.output<TArgs[K]> },\n { [K in keyof TInputs]: InputSpecToWrappedValue<TInputs[K]> },\n { [K in keyof TOutputs]: OutputSpecToValue<TOutputs[K]> },\n { [K in keyof TSecrets]: z.output<TSecrets[K]> }\n> {\n const config = new Config()\n const rawHSConfig = config.requireObject(HighstateConfigKey.Config)\n const hsConfig = unitConfigSchema.parse(rawHSConfig)\n\n const rawHsSecrets = config\n .requireSecretObject(HighstateConfigKey.Secrets)\n .apply(secrets => z.record(z.string(), z.unknown()).parse(secrets))\n\n const args = mapValues(unit.model.args, (arg, argName) => {\n const value = parseArgumentValue(hsConfig.args[argName])\n const result = arg[runtimeSchema]!.safeParse(value)\n\n if (!result.success) {\n throw new Error(`Invalid argument \"${argName}\": ${z.prettifyError(result.error)}`)\n }\n\n return result.data\n })\n\n const secrets = mapValues(unit.model.secrets, (secret, secretName) => {\n const hasValue = hsConfig.secretNames.includes(secretName)\n\n if (!hasValue && !secret.required) {\n return secret.schema.default ? pulumiSecret(secret.schema.default) : undefined\n }\n\n if (!hasValue && secret.required) {\n throw new Error(`Secret \"${secretName}\" is required but not provided.`)\n }\n\n return rawHsSecrets[secretName].apply(rawValue => {\n const value = parseArgumentValue(rawValue)\n const result = secret[runtimeSchema]!.safeParse(value)\n\n if (!result.success) {\n throw new Error(`Invalid secret \"${secretName}\": ${z.prettifyError(result.error)}`)\n }\n\n return pulumiSecret(result.data)\n })\n })\n\n const inputs = mapValues(unit.model.inputs, (input, inputName) => {\n const value = hsConfig.inputs[inputName]\n\n if (!value) {\n if (input.multiple) {\n return output([])\n }\n\n return undefined\n }\n\n return getOutput(hsConfig, unit as unknown as Unit, inputName, input, value)\n })\n\n const [type, name] = parseInstanceId(hsConfig.instanceId)\n\n instanceId = hsConfig.instanceId\n instanceName = name\n importBaseUrl = pathToFileURL(hsConfig.importBasePath)\n\n return {\n instanceId: hsConfig.instanceId,\n type,\n name,\n\n args: args as any,\n secrets: secrets as any,\n inputs: inputs as any,\n invokedTriggers: hsConfig.invokedTriggers,\n\n getSecret: (<K extends keyof TSecrets>(\n name: K,\n factory?: () => Input<NonNullable<TSecrets[K]>>,\n ) => {\n if (!factory) {\n return secrets[name as string]\n }\n\n const value = secrets[name as string] ?? pulumiSecret(factory())\n secrets[name as string] = value\n\n return value\n }) as any,\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 === \"$workers\") {\n return output(outputValue).apply(mapWorkers)\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(\n `Output \"${outputName}\" not found in the unit \"${unit.model.type}\", but was passed to outputs(...).`,\n )\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}\". It looks like a bug in the unit definition.`,\n )\n }\n\n return output(outputValue).apply(value => {\n const schema = outputModel.multiple ? entity.schema.array() : entity.schema\n const result = schema.safeParse(value)\n\n if (!result.success) {\n throw new Error(\n `Invalid value for output \"${outputName}\" of type \"${outputModel.type}\": ${z.prettifyError(\n result.error,\n )}`,\n )\n }\n\n return compact(result.data)\n })\n })\n\n // wait for all outputs to resolve before collecting secrets and artifacts\n await Promise.all(Object.values(result).map(o => toPromise(o)))\n\n result.$secrets = secrets\n\n // collect artifacts from all outputs\n const artifactsMap: Record<string, UnitArtifact[]> = {}\n for (const [outputName, outputValue] of Object.entries(outputs)) {\n const resolvedValue = await toPromise(outputValue)\n const artifacts = extractObjectsFromValue(unitArtifactSchema, resolvedValue)\n if (artifacts.length > 0) {\n artifactsMap[outputName] = artifacts\n }\n }\n\n if (Object.keys(artifactsMap).length > 0) {\n result.$artifacts = artifactsMap\n }\n\n return result\n },\n }\n}\n\nfunction mapStatusFields(status: Unwrap<ExtraOutputs[\"$statusFields\"]>): InstanceStatusField[] {\n if (!status) {\n return []\n }\n\n if (Array.isArray(status)) {\n return status\n .filter((field): field is NonNullable<StatusField> => field?.value !== undefined)\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 }\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,\n meta: {\n ...field.meta,\n title: field.meta?.title ?? camelCaseToHumanReadable(name),\n },\n name,\n }\n })\n .filter((field): field is InstanceStatusField => field?.value !== undefined)\n}\n\nfunction mapPages(pages: Unwrap<ExtraOutputs[\"$pages\"]>): Output<UnitPage[]> {\n if (!pages) {\n return output([])\n }\n\n if (!Array.isArray(pages)) {\n pages = Object.entries(pages).map(([name, page]) => {\n if (!page) {\n return undefined\n }\n\n return { ...page, name }\n })\n }\n\n return output(pages.filter((page): page is NonNullable<UnitPage> => !!page))\n}\n\nfunction mapTerminals(terminals: Unwrap<ExtraOutputs[\"$terminals\"]>): Output<UnitTerminal[]> {\n if (!terminals) {\n return output([])\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 output(terminals.filter((terminal): terminal is NonNullable<UnitTerminal> => !!terminal))\n}\n\nfunction mapTriggers(triggers: Unwrap<ExtraOutputs[\"$triggers\"]>): Output<UnitTrigger[]> {\n if (!triggers) {\n return output([])\n }\n\n if (!Array.isArray(triggers)) {\n triggers = Object.entries(triggers).map(([name, trigger]) => {\n if (!trigger) {\n return undefined\n }\n\n return { ...trigger, name }\n })\n }\n\n return output(triggers.filter((trigger): trigger is NonNullable<UnitTrigger> => !!trigger))\n}\n\nfunction mapWorkers(workers: Unwrap<ExtraOutputs[\"$workers\"]>): Output<Unwrap<UnitWorker>[]> {\n if (!workers) {\n return output([])\n }\n\n if (!Array.isArray(workers)) {\n workers = Object.entries(workers).map(([name, worker]) => {\n if (!worker) {\n return undefined\n }\n\n return { ...worker, name }\n })\n }\n\n return output(workers.filter((worker): worker is NonNullable<Unwrap<UnitWorker>> => !!worker))\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/entity.ts","../src/file.ts","../src/resource-hooks.ts","../src/unit.ts"],"names":["item","collection","output","secret","pulumiSecret","name","result","cached","mapped","HighstateSignature"],"mappings":"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","file":"index.js","sourcesContent":["import { type Input, type Output, output, type Unwrap } 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 record of inputs.\n * The same as `Input<Record<string, Input<T>>>`, but more readable.\n */\nexport type InputRecord<T> = Input<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\ntype LeafValue = string | number | boolean | null | undefined\ntype IsUnknown<T> = unknown extends T ? (T extends unknown ? true : false) : false\n\n/**\n * The recursive input type for a value.\n */\nexport type DeepInput<T> = [T] extends [LeafValue]\n ? Input<T>\n : IsUnknown<T> extends true\n ? Input<unknown>\n : Input<{ [K in keyof T]: DeepInput<T[K]> }>\n\n/**\n * Transforms an input value to a promise that resolves to the unwrapped value.\n *\n * @param input The input value to transform.\n * @returns A promise that resolves to the unwrapped value.\n */\nexport function toPromise<T>(input: Input<T>): Promise<Unwrap<T>> {\n return new Promise(resolve => output(input).apply(resolve))\n}\n\n/**\n * Receives an item and a collection, and returns an array containing the item and the collection.\n *\n * Excludes the item if it is undefined.\n *\n * @param item The single item input.\n * @param collection The collection of items input.\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\n/**\n * The same as `normalize`, but accepts inputs and returns output.\n *\n * @param item The single item input.\n * @param collection The collection of items input.\n */\nexport function normalizeInputs<T>(\n item: Input<T> | undefined,\n collection: InputArray<T> | undefined,\n): Output<Unwrap<T>[]> {\n return (\n output({ item, collection })\n //\n .apply(({ item, collection }) => normalize(item, collection)) as Output<Unwrap<T>[]>\n )\n}\n\n/**\n * The convenience function to normalize inputs and map them to a new type.\n *\n * @param item The single item input.\n * @param collection The collection of items input.\n * @param mapFn The function to map each item to a new type.\n */\nexport function normalizeInputsAndMap<T, U>(\n item: Input<T> | undefined,\n collection: InputArray<T> | undefined,\n mapFn: (value: Unwrap<T>) => U,\n): Output<U[]> {\n return normalizeInputs(item, collection).apply(values => values.map(mapFn))\n}\n\n/**\n * Applies a function to the input and returns an output.\n *\n * Can be used in `remeda` pipelines.\n *\n * @param fn The function to apply to the input.\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","import {\n type Entity,\n type EntityMeta,\n type EntityValue,\n type EntityValueInput,\n type EntityWithMeta,\n getEntityId,\n HighstateSignature,\n type Secret,\n} from \"@highstate/contract\"\nimport { type Input, type Output, output, type Unwrap } from \"@pulumi/pulumi\"\nimport { type DeepInput, type InputArray, toPromise } from \"./utils\"\n\nexport type MakeEntityOptions<TEntity extends Entity> = {\n entity: TEntity\n identity: string\n meta?: Omit<EntityMeta, \"type\" | \"identity\">\n value: Omit<EntityValueInput<TEntity>, \"$meta\">\n}\n\nexport function makeEntity<TEntity extends Entity>({\n entity,\n identity,\n meta,\n value,\n}: MakeEntityOptions<TEntity>): EntityValue<TEntity> {\n const built = {\n ...(value as Record<string, unknown>),\n $meta: {\n type: entity.type,\n identity,\n ...meta,\n },\n }\n\n return entity.schema.parse(built) as EntityValue<TEntity>\n}\n\ntype CommonEntityMeta = Omit<EntityMeta, \"type\" | \"identity\">\n\nexport type MakeEntityAsyncOptions<TEntity extends Entity> = {\n entity: TEntity\n identity: Input<string>\n meta?: { [K in keyof CommonEntityMeta]?: Input<CommonEntityMeta[K]> }\n value: {\n [K in keyof Omit<EntityValueInput<TEntity>, \"$meta\">]: DeepInput<EntityValueInput<TEntity>[K]>\n }\n}\n\nexport function makeSecret<TValue>(value: TValue): Secret<TValue> {\n return {\n [HighstateSignature.Secret]: true,\n value,\n }\n}\n\nexport function makeSecretOutput<TValue>(value: Input<TValue>): Output<Secret<Unwrap<TValue>>> {\n return output(value).apply(makeSecret)\n}\n\nexport function makeSecretAsync<TValue>(value: Input<TValue>): Promise<Secret<Unwrap<TValue>>> {\n return toPromise(makeSecretOutput(value)) as Promise<Secret<Unwrap<TValue>>>\n}\n\nexport function makeEntityOutput<TEntity extends Entity>({\n entity,\n identity,\n meta,\n value,\n}: MakeEntityAsyncOptions<TEntity>): Output<EntityValue<TEntity>> {\n return output({\n ...value,\n $meta: {\n type: entity.type,\n identity,\n ...meta,\n },\n }).apply(built => entity.schema.parse(built)) as Output<EntityValue<TEntity>>\n}\n\nexport function makeEntityAsync<TEntity extends Entity>(\n options: MakeEntityAsyncOptions<TEntity>,\n): Promise<EntityValue<TEntity>> {\n return toPromise(makeEntityOutput(options)) as Promise<EntityValue<TEntity>>\n}\n\nexport type IdentitySource = EntityWithMeta | string\n\n/**\n * Get the combined identity based on the ids of the given entities.\n *\n * This function can be used for entities that do not have their own identity but are defined by the combination of other entities (e.g. a server defined by its network endpoints).\n */\nexport function getCombinedIdentity(entities: IdentitySource[]): string {\n const sortedIds = entities\n .map(source => (typeof source === \"string\" ? source : getEntityId(source)))\n .sort() // sort to ensure consistent identity regardless of the order of entities\n\n return sortedIds.join(\":\")\n}\n\nexport function getCombinedIdentityOutput(entities: InputArray<IdentitySource>): Output<string> {\n return output(entities).apply(getCombinedIdentity)\n}\n\nexport function getCombinedIdentityAsync(entities: IdentitySource[]): Promise<string> {\n return toPromise(getCombinedIdentityOutput(entities))\n}\n","import type { EntityWithMeta, FileContent, FileMeta } from \"@highstate/contract\"\nimport { crc32 } from \"node:zlib\"\nimport { type Input, type Output, output, type Unwrap } from \"@pulumi/pulumi\"\nimport { makeSecret } from \"./entity\"\nimport { toPromise } from \"./utils\"\n\n/**\n * The BaseFile is type that compatible with both the contract's File type and the file entity used in the library.\n *\n * It should be used in most places instead of the contract's File type to avoid unnecessary conversions, and it can be safely cast to the contract's File type when needed.\n */\nexport type BaseFile = EntityWithMeta & {\n meta: FileMeta\n content: FileContent\n}\n\nexport type FileOptions = {\n /**\n * The name of the file.\n */\n name: Input<string>\n\n /**\n * The content of the file as a string or a buffer.\n */\n content: Input<string | Buffer>\n\n /**\n * The identity to use for the file entity.\n *\n * If not provided, defaults to the hash of the content.\n */\n identity?: Input<string>\n\n /**\n * Whether the content should be treated as a secret or not.\n */\n isSecret?: Input<boolean>\n\n /**\n * The content type of the file.\n *\n * Defaults to \"text/plain\" if the content is a string and \"application/octet-stream\" if the content is a buffer.\n */\n contentType?: Input<string>\n\n /**\n * The file mode (permissions) to set on the file when materialized.\n *\n * Defaults to 0o644.\n */\n mode?: Input<number>\n}\n\n/**\n * Creates a file entity from the given options.\n *\n * This file can also be used for both:\n * - core Highstate capabilities like terminals and pages;\n * - as inputs for other units requiring files.\n */\nexport function makeFile({\n name,\n content,\n contentType,\n identity,\n isSecret,\n mode,\n}: Unwrap<FileOptions>): BaseFile {\n const stringContent = typeof content === \"string\" ? content : content.toString(\"base64\")\n const isBinary = typeof content !== \"string\"\n const inferredContentType =\n contentType ?? (typeof content === \"string\" ? \"text/plain\" : \"application/octet-stream\")\n const size =\n typeof content === \"string\" ? Buffer.byteLength(content, \"utf-8\") : content.byteLength\n\n return {\n $meta: {\n type: \"common.file.v1\",\n identity: identity ?? crc32(stringContent).toString(16), // use crc32 hash of the content as the default identity\n },\n meta: {\n name,\n contentType: inferredContentType,\n size,\n mode,\n },\n content: isSecret\n ? { type: \"embedded-secret\", value: makeSecret(stringContent), isBinary }\n : { type: \"embedded\", value: stringContent, isBinary },\n }\n}\n\n/**\n * Similar to `makeFile`, but returns a Pulumi Output that resolves to a file entity.\n */\nexport function makeFileOutput(options: FileOptions): Output<BaseFile> {\n return output(options).apply(opts => makeFile(opts))\n}\n\n/**\n * Similar to `makeFile`, but returns a Promise that resolves to a file entity.\n */\nexport function makeFileAsync(options: FileOptions): Promise<BaseFile> {\n return toPromise(makeFileOutput(options))\n}\n","let hasResourceHooks = false\n\n/**\n * Marks the current Pulumi program as using resource hooks.\n *\n * The backend uses `$hasResourceHooks` output to decide whether it should run the Pulumi program on destroy.\n */\nexport function setResourceHooks(): void {\n hasResourceHooks = true\n}\n\nexport function getHasResourceHooks(): boolean {\n return hasResourceHooks\n}\n","/** biome-ignore-all lint/suspicious/noExplicitAny: здесь орать запрещено */\n\nimport type { IsEmptyObject } from \"type-fest\"\nimport { join } from \"node:path\"\nimport { pathToFileURL } from \"node:url\"\nimport {\n type ComponentInput,\n type ComponentInputSpec,\n camelCaseToHumanReadable,\n type EntityValue,\n type EntityValueInput,\n HighstateConfigKey,\n HighstateSignature,\n type InstanceStatusField,\n type InstanceStatusFieldValue,\n type PartialKeys,\n parseArgumentValue,\n parseInstanceId,\n runtimeSchema,\n type TriggerInvocation,\n type Unit,\n type UnitArtifact,\n type UnitInputValue,\n type UnitPage,\n type UnitTerminal,\n type UnitTrigger,\n type UnitWorker,\n unitArtifactSchema,\n unitConfigSchema,\n type VersionedName,\n z,\n} from \"@highstate/contract\"\nimport {\n Config,\n type Input,\n type Output,\n output,\n secret as pulumiSecret,\n type Unwrap,\n} from \"@pulumi/pulumi\"\nimport { isPlainObject, mapValues } from \"remeda\"\nimport { getHasResourceHooks } from \"./resource-hooks\"\nimport { type DeepInput, toPromise } from \"./utils\"\n\ntype StatusField<TArgName extends string = string> = Omit<\n InstanceStatusField,\n \"complementaryTo\" | \"meta\"\n> & {\n meta?: PartialKeys<InstanceStatusField[\"meta\"], \"title\">\n complementaryTo?: TArgName\n}\n\ntype ExtraOutputs<TArgName extends string = string> = {\n $statusFields?:\n | Input<\n Record<\n string,\n DeepInput<Omit<StatusField<TArgName>, \"name\"> | InstanceStatusFieldValue | undefined>\n >\n >\n | Input<DeepInput<StatusField<TArgName> | undefined>[]>\n\n $terminals?:\n | Input<Record<string, DeepInput<Omit<UnitTerminal, \"name\"> | undefined>>>\n | Input<DeepInput<UnitTerminal | undefined>[]>\n\n $pages?:\n | Input<Record<string, DeepInput<Omit<UnitPage, \"name\"> | undefined>>>\n | Input<DeepInput<UnitPage | undefined>[]>\n\n $triggers?:\n | Input<Record<string, DeepInput<Omit<UnitTrigger, \"name\"> | undefined>>>\n | Input<DeepInput<UnitTrigger | undefined>[]>\n\n $workers?:\n | Input<Record<string, DeepInput<Omit<UnitWorker, \"name\"> | undefined>>>\n | Input<DeepInput<UnitWorker | undefined>[]>\n}\n\ntype OutputMapToDeepInputMap<\n T extends Record<string, unknown>,\n TArgName extends string,\n> = IsEmptyObject<T> extends true\n ? ExtraOutputs\n : { [K in keyof T]: DeepInput<T[K]> } & ExtraOutputs<TArgName>\n\ninterface 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 stateId: string\n type: string\n name: string\n\n secrets: {\n [K in keyof TSecrets]: undefined extends TSecrets[K]\n ? Output<NonNullable<TSecrets[K]>> | undefined\n : Output<TSecrets[K]>\n }\n\n getSecret<K extends keyof TSecrets>(\n this: void,\n name: K,\n ): Output<NonNullable<TSecrets[K]> | undefined>\n\n getSecret<K extends keyof TSecrets>(\n this: void,\n name: K,\n factory: () => Input<NonNullable<TSecrets[K]>>,\n ): Output<NonNullable<TSecrets[K]>>\n\n setSecret<K extends keyof TSecrets>(\n this: void,\n name: K,\n value: Input<NonNullable<TSecrets[K]>>,\n ): void\n\n inputs: TInputs\n invokedTriggers: TriggerInvocation[]\n\n outputs(\n this: void,\n outputs?: OutputMapToDeepInputMap<TOutputs, keyof TArgs & string>,\n ): Promise<unknown>\n}\n\n// z.output since the values are validated/transformed and passed to the user\ntype InputSpecToWrappedValue<T extends ComponentInputSpec> = T[2] extends true\n ? NonNullable<EntityValue<T[0]>>[]\n : T[1] extends true\n ? NonNullable<EntityValue<T[0]>>\n : NonNullable<EntityValue<T[0]>> | undefined\n\n// z.input since the values are passed from the user and should be validated/transformed before returning from the unit\ntype OutputSpecToValue<T extends ComponentInputSpec> = T[2] extends true\n ? T[1] extends true\n ? NonNullable<EntityValueInput<T[0]>>[]\n : NonNullable<EntityValueInput<T[0]>>[] | undefined\n : T[1] extends true\n ? NonNullable<EntityValueInput<T[0]>>\n : NonNullable<EntityValueInput<T[0]>> | undefined\n\nlet instanceId: string | undefined\nlet stateId: string | undefined\nlet instanceName: string | undefined\nlet importBaseUrl: URL | undefined\n\n/**\n * Returns the current unit instance id.\n *\n * Only available after calling `forUnit` function.\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\n/**\n * Returns the current unit instance state id.\n *\n * The state id is provided by the runner via Pulumi config.\n * Only available after calling `forUnit` function.\n */\nexport function getUnitStateId(): string {\n if (!stateId) {\n throw new Error(`State id is not set. Did you call \"forUnit\" function?`)\n }\n\n return stateId\n}\n\n/**\n * Returns the current unit instance name.\n */\nexport function getUnitInstanceName(): string {\n if (!instanceName) {\n throw new Error(`Instance name is not set. Did you call \"forUnit\" function?`)\n }\n\n return instanceName\n}\n\n/**\n * Returns the base URL for dynamic imports.\n */\nexport function getImportBaseUrl(): URL {\n if (!importBaseUrl) {\n throw new Error(`Import base URL is not set. Did you call \"forUnit\" function?`)\n }\n\n return importBaseUrl\n}\n\n/**\n * Returns a comment that can be used in resources to indicate that they are managed by Highstate.\n */\nexport function getResourceComment(): string {\n return `Managed by Highstate [${getUnitStateId()}]`\n}\n\nfunction getInputValue(\n unit: Unit,\n inputName: string,\n input: ComponentInput,\n entries: UnitInputValue[],\n) {\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 values = entries.flatMap(entry => {\n const value = parseArgumentValue(entry.value)\n const schema = Array.isArray(value) ? entity.schema.array() : entity.schema\n const result = schema.safeParse(value)\n\n if (!result.success) {\n throw new Error(`Invalid value for input \"${inputName}\": ${z.prettifyError(result.error)}`)\n }\n\n if (Array.isArray(result.data)) {\n return result.data\n }\n\n return input.multiple ? [result.data] : [result.data]\n })\n\n if (!input.multiple) {\n return values[0]\n }\n\n return values\n}\n\nexport function forUnit<\n TType extends VersionedName,\n TArgs extends Record<string, z.ZodType>,\n TInputs extends Record<string, ComponentInputSpec>,\n TOutputs extends Record<string, ComponentInputSpec>,\n TSecrets extends Record<string, z.ZodType>,\n>(\n unit: Unit<TType, TArgs, TInputs, TOutputs, TSecrets>,\n): UnitContext<\n { [K in keyof TArgs]: z.output<TArgs[K]> },\n { [K in keyof TInputs]: InputSpecToWrappedValue<TInputs[K]> },\n { [K in keyof TOutputs]: OutputSpecToValue<TOutputs[K]> },\n { [K in keyof TSecrets]: z.output<TSecrets[K]> }\n> {\n const config = new Config()\n const rawHSConfig = config.requireObject(HighstateConfigKey.Config)\n const hsConfig = unitConfigSchema.parse(rawHSConfig)\n\n const args = mapValues(unit.model.args, (arg, argName) => {\n const value = parseArgumentValue(hsConfig.args[argName])\n const result = arg[runtimeSchema]!.safeParse(value)\n\n if (!result.success) {\n throw new Error(`Invalid argument \"${argName}\": ${z.prettifyError(result.error)}`)\n }\n\n return result.data\n })\n\n const secrets = mapValues(unit.model.secrets, (secret, secretName) => {\n const hasValue = secretName in hsConfig.secretValues\n\n if (!hasValue && !secret.required) {\n return secret.schema.default ? pulumiSecret(secret.schema.default) : undefined\n }\n\n if (!hasValue && secret.required) {\n throw new Error(`Secret \"${secretName}\" is required but not provided.`)\n }\n\n const rawValue = hsConfig.secretValues[secretName]\n const value = parseArgumentValue(rawValue)\n const result = secret[runtimeSchema]!.safeParse(value)\n\n if (!result.success) {\n throw new Error(`Invalid secret \"${secretName}\": ${z.prettifyError(result.error)}`)\n }\n\n return pulumiSecret(result.data)\n })\n\n const inputs = mapValues(unit.model.inputs, (input, inputName) => {\n const value = hsConfig.inputs[inputName]\n\n if (!value) {\n if (input.multiple) {\n return []\n }\n\n return undefined\n }\n\n return getInputValue(unit as unknown as Unit, inputName, input, value)\n })\n\n const [type, name] = parseInstanceId(hsConfig.instanceId)\n\n instanceId = hsConfig.instanceId\n stateId = hsConfig.stateId\n instanceName = name\n importBaseUrl = pathToFileURL(hsConfig.importBasePath)\n\n return {\n instanceId: hsConfig.instanceId,\n stateId: hsConfig.stateId,\n type,\n name,\n\n args: args as any,\n secrets: secrets as any,\n inputs: inputs as any,\n invokedTriggers: hsConfig.invokedTriggers,\n\n getSecret: (<K extends keyof TSecrets>(\n name: K,\n factory?: () => Input<NonNullable<TSecrets[K]>>,\n ) => {\n if (!factory) {\n return secrets[name as string]\n }\n\n const value = secrets[name as string] ?? pulumiSecret(factory())\n secrets[name as string] = value\n\n return value\n }) as any,\n\n setSecret: ((name: keyof TSecrets, value: Input<NonNullable<TSecrets[keyof TSecrets]>>) => {\n secrets[name as string] = pulumiSecret(value)\n }) as any,\n\n outputs: async (outputs: any = {}) => {\n const resolvedOutputs = await toPromise(outputs)\n\n const result: any = mapValues(resolvedOutputs, (outputValue, outputName) => {\n if (outputName === \"$statusFields\") {\n return mapStatusFields(outputValue)\n }\n\n if (outputName === \"$pages\") {\n return mapPages(outputValue)\n }\n\n if (outputName === \"$terminals\") {\n return mapTerminals(outputValue)\n }\n\n if (outputName === \"$triggers\") {\n return mapTriggers(outputValue)\n }\n\n if (outputName === \"$workers\") {\n return mapWorkers(outputValue)\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(\n `Output \"${outputName}\" not found in the unit \"${unit.model.type}\", but was passed to outputs(...).`,\n )\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}\". It looks like a bug in the unit definition.`,\n )\n }\n\n const schema = outputModel.multiple ? entity.schema.array() : entity.schema\n const result = schema.safeParse(outputValue)\n\n if (!result.success) {\n throw new Error(\n `Invalid value for output \"${outputName}\" of type \"${outputModel.type}\": ${z.prettifyError(\n result.error,\n )}`,\n )\n }\n\n return result.data\n })\n\n result.$secrets = secrets\n\n // collect artifacts from all outputs\n const artifactsMap: Record<string, UnitArtifact[]> = {}\n for (const [outputName, outputValue] of Object.entries(outputs)) {\n const resolvedValue = await toPromise(outputValue)\n const artifacts = extractObjectsFromValue(unitArtifactSchema, resolvedValue)\n if (artifacts.length > 0) {\n artifactsMap[outputName] = artifacts\n }\n }\n\n if (Object.keys(artifactsMap).length > 0) {\n result.$artifacts = artifactsMap\n }\n\n result.$hasResourceHooks = getHasResourceHooks()\n\n return wrapHighstateSecretValues(result)\n },\n }\n}\n\nfunction wrapHighstateSecretValues<T>(data: T): T {\n const cache = new WeakMap<object, unknown>()\n\n const traverse = (value: unknown): unknown => {\n if (value === null || value === undefined || typeof value !== \"object\") {\n return value\n }\n\n if (Array.isArray(value)) {\n const cached = cache.get(value)\n if (cached) {\n return cached\n }\n\n const mapped: unknown[] = []\n cache.set(value, mapped)\n\n for (const item of value) {\n mapped.push(traverse(item))\n }\n\n return mapped\n }\n\n if (!isPlainObject(value)) {\n return value\n }\n\n const cached = cache.get(value)\n if (cached) {\n return cached\n }\n\n const record = value as Record<string, unknown>\n const mapped: Record<string, unknown> = {}\n cache.set(value, mapped)\n\n for (const [key, nestedValue] of Object.entries(record)) {\n mapped[key] = traverse(nestedValue)\n }\n\n if (record[HighstateSignature.Secret] === true && \"value\" in record) {\n return pulumiSecret(mapped)\n }\n\n return mapped\n }\n\n return traverse(data) as T\n}\n\nfunction mapStatusFields(status: Unwrap<ExtraOutputs[\"$statusFields\"]>): InstanceStatusField[] {\n if (!status) {\n return []\n }\n\n if (Array.isArray(status)) {\n return status\n .filter((field): field is NonNullable<StatusField> => field?.value !== undefined)\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 }\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,\n meta: {\n ...field.meta,\n title: field.meta?.title ?? camelCaseToHumanReadable(name),\n },\n name,\n }\n })\n .filter((field): field is InstanceStatusField => field?.value !== undefined)\n}\n\nfunction mapPages(pages: Unwrap<ExtraOutputs[\"$pages\"]>): Output<UnitPage[]> {\n if (!pages) {\n return output([])\n }\n\n if (!Array.isArray(pages)) {\n pages = Object.entries(pages).map(([name, page]) => {\n if (!page) {\n return undefined\n }\n\n return { ...page, name }\n })\n }\n\n return output(pages.filter((page): page is NonNullable<UnitPage> => !!page))\n}\n\nfunction mapTerminals(terminals: Unwrap<ExtraOutputs[\"$terminals\"]>): Output<UnitTerminal[]> {\n if (!terminals) {\n return output([])\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 output(terminals.filter((terminal): terminal is NonNullable<UnitTerminal> => !!terminal))\n}\n\nfunction mapTriggers(triggers: Unwrap<ExtraOutputs[\"$triggers\"]>): Output<UnitTrigger[]> {\n if (!triggers) {\n return output([])\n }\n\n if (!Array.isArray(triggers)) {\n triggers = Object.entries(triggers).map(([name, trigger]) => {\n if (!trigger) {\n return undefined\n }\n\n return { ...trigger, name }\n })\n }\n\n return output(triggers.filter((trigger): trigger is NonNullable<UnitTrigger> => !!trigger))\n}\n\nfunction mapWorkers(workers: Unwrap<ExtraOutputs[\"$workers\"]>): Output<Unwrap<UnitWorker>[]> {\n if (!workers) {\n return output([])\n }\n\n if (!Array.isArray(workers)) {\n workers = Object.entries(workers).map(([name, worker]) => {\n if (!worker) {\n return undefined\n }\n\n return { ...worker, name }\n })\n }\n\n return output(workers.filter((worker): worker is NonNullable<Unwrap<UnitWorker>> => !!worker))\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\n/**\n * Returns a temporary file path for the current unit instance.\n *\n * The format is `/tmp/highstate/{stateId}`.\n * This directory does not change between different runs of the same unit instance.\n */\nexport function getUnitTempPath(): string {\n return join(\"/tmp/highstate\", getUnitStateId())\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@highstate/pulumi",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
@@ -29,16 +29,16 @@
|
|
|
29
29
|
]
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@pulumi/pulumi": "3.
|
|
32
|
+
"@pulumi/pulumi": "3.220.0",
|
|
33
33
|
"deepmerge-ts": "^7.1.5",
|
|
34
34
|
"remeda": "^2.21.0",
|
|
35
35
|
"type-fest": "^4.41.0",
|
|
36
|
-
"@highstate/contract": "0.
|
|
36
|
+
"@highstate/contract": "0.20.0"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@biomejs/biome": "2.2.0",
|
|
40
40
|
"@typescript/native-preview": "^7.0.0-dev.20250920.1",
|
|
41
|
-
"@highstate/cli": "0.
|
|
41
|
+
"@highstate/cli": "0.20.0"
|
|
42
42
|
},
|
|
43
43
|
"repository": {
|
|
44
44
|
"url": "https://github.com/highstate-io/highstate"
|