@expo/steps 1.0.265 → 1.0.271

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 (207) hide show
  1. package/{dist_commonjs → dist}/AbstractConfigParser.d.ts +5 -5
  2. package/{dist_commonjs/AbstractConfigParser.cjs → dist/AbstractConfigParser.js} +13 -13
  3. package/dist/AbstractConfigParser.js.map +1 -0
  4. package/{dist_commonjs → dist}/BuildConfig.d.ts +3 -3
  5. package/{dist_commonjs/BuildConfig.cjs → dist/BuildConfig.js} +22 -22
  6. package/dist/BuildConfig.js.map +1 -0
  7. package/{dist_esm → dist}/BuildConfigParser.d.ts +5 -5
  8. package/{dist_commonjs/BuildConfigParser.cjs → dist/BuildConfigParser.js} +31 -31
  9. package/dist/BuildConfigParser.js.map +1 -0
  10. package/{dist_esm → dist}/BuildFunction.d.ts +6 -6
  11. package/{dist_commonjs/BuildFunction.cjs → dist/BuildFunction.js} +6 -6
  12. package/dist/BuildFunction.js.map +1 -0
  13. package/{dist_commonjs → dist}/BuildFunctionGroup.d.ts +4 -4
  14. package/{dist_commonjs/BuildFunctionGroup.cjs → dist/BuildFunctionGroup.js} +4 -4
  15. package/dist/BuildFunctionGroup.js.map +1 -0
  16. package/{dist_esm → dist}/BuildStep.d.ts +5 -5
  17. package/{dist_commonjs/BuildStep.cjs → dist/BuildStep.js} +29 -29
  18. package/dist/BuildStep.js.map +1 -0
  19. package/{dist_commonjs → dist}/BuildStepContext.d.ts +4 -4
  20. package/{dist_commonjs/BuildStepContext.cjs → dist/BuildStepContext.js} +10 -10
  21. package/dist/BuildStepContext.js.map +1 -0
  22. package/{dist_esm → dist}/BuildStepInput.d.ts +1 -1
  23. package/{dist_commonjs/BuildStepInput.cjs → dist/BuildStepInput.js} +12 -12
  24. package/dist/BuildStepInput.js.map +1 -0
  25. package/{dist_commonjs → dist}/BuildStepOutput.d.ts +1 -1
  26. package/{dist_commonjs/BuildStepOutput.cjs → dist/BuildStepOutput.js} +3 -3
  27. package/dist/BuildStepOutput.js.map +1 -0
  28. package/{dist_commonjs → dist}/BuildTemporaryFiles.d.ts +1 -1
  29. package/{dist_commonjs → dist}/BuildTemporaryFiles.js.map +1 -1
  30. package/{dist_commonjs → dist}/BuildWorkflow.d.ts +3 -3
  31. package/dist/BuildWorkflow.js.map +1 -0
  32. package/{dist_commonjs → dist}/BuildWorkflowValidator.d.ts +1 -1
  33. package/{dist_commonjs/BuildWorkflowValidator.cjs → dist/BuildWorkflowValidator.js} +19 -19
  34. package/dist/BuildWorkflowValidator.js.map +1 -0
  35. package/{dist_commonjs → dist}/StepsConfigParser.d.ts +5 -5
  36. package/{dist_commonjs/StepsConfigParser.cjs → dist/StepsConfigParser.js} +13 -13
  37. package/dist/StepsConfigParser.js.map +1 -0
  38. package/{dist_esm → dist}/cli/cli.d.ts +3 -3
  39. package/{dist_commonjs/cli/cli.cjs → dist/cli/cli.js} +6 -6
  40. package/dist/cli/cli.js.map +1 -0
  41. package/dist/index.d.ts +19 -0
  42. package/{dist_commonjs/index.cjs → dist/index.js} +30 -30
  43. package/dist/index.js.map +1 -0
  44. package/{dist_commonjs/interpolation.cjs → dist/interpolation.js} +3 -3
  45. package/dist/interpolation.js.map +1 -0
  46. package/{dist_commonjs/scripts/runCustomFunction.cjs → dist/scripts/runCustomFunction.js} +9 -9
  47. package/dist/scripts/runCustomFunction.js.map +1 -0
  48. package/{dist_commonjs → dist}/utils/customFunction.d.ts +4 -4
  49. package/{dist_commonjs/utils/customFunction.cjs → dist/utils/customFunction.js} +4 -6
  50. package/dist/utils/customFunction.js.map +1 -0
  51. package/{dist_commonjs/utils/shell/bin.cjs → dist/utils/shell/bin.js} +1 -3
  52. package/dist/utils/shell/bin.js.map +1 -0
  53. package/{dist_commonjs/utils/template.cjs → dist/utils/template.js} +7 -7
  54. package/dist/utils/template.js.map +1 -0
  55. package/package.json +11 -23
  56. package/dist_commonjs/AbstractConfigParser.js.map +0 -1
  57. package/dist_commonjs/BuildConfig.js.map +0 -1
  58. package/dist_commonjs/BuildConfigParser.d.ts +0 -33
  59. package/dist_commonjs/BuildConfigParser.js.map +0 -1
  60. package/dist_commonjs/BuildFunction.d.ts +0 -45
  61. package/dist_commonjs/BuildFunction.js.map +0 -1
  62. package/dist_commonjs/BuildFunctionGroup.js.map +0 -1
  63. package/dist_commonjs/BuildStep.d.ts +0 -100
  64. package/dist_commonjs/BuildStep.js.map +0 -1
  65. package/dist_commonjs/BuildStepContext.js.map +0 -1
  66. package/dist_commonjs/BuildStepInput.d.ts +0 -47
  67. package/dist_commonjs/BuildStepInput.js.map +0 -1
  68. package/dist_commonjs/BuildStepOutput.js.map +0 -1
  69. package/dist_commonjs/BuildWorkflow.js.map +0 -1
  70. package/dist_commonjs/BuildWorkflowValidator.js.map +0 -1
  71. package/dist_commonjs/StepsConfigParser.js.map +0 -1
  72. package/dist_commonjs/cli/cli.d.ts +0 -18
  73. package/dist_commonjs/cli/cli.js.map +0 -1
  74. package/dist_commonjs/index.d.ts +0 -19
  75. package/dist_commonjs/index.js.map +0 -1
  76. package/dist_commonjs/interpolation.js.map +0 -1
  77. package/dist_commonjs/scripts/runCustomFunction.js.map +0 -1
  78. package/dist_commonjs/utils/customFunction.js.map +0 -1
  79. package/dist_commonjs/utils/shell/bin.js.map +0 -1
  80. package/dist_commonjs/utils/template.js.map +0 -1
  81. package/dist_esm/AbstractConfigParser.d.ts +0 -23
  82. package/dist_esm/AbstractConfigParser.js +0 -61
  83. package/dist_esm/AbstractConfigParser.js.map +0 -1
  84. package/dist_esm/BuildConfig.d.ts +0 -80
  85. package/dist_esm/BuildConfig.js +0 -281
  86. package/dist_esm/BuildConfig.js.map +0 -1
  87. package/dist_esm/BuildConfigParser.js +0 -233
  88. package/dist_esm/BuildConfigParser.js.map +0 -1
  89. package/dist_esm/BuildFunction.js +0 -62
  90. package/dist_esm/BuildFunction.js.map +0 -1
  91. package/dist_esm/BuildFunctionGroup.d.ts +0 -23
  92. package/dist_esm/BuildFunctionGroup.js +0 -36
  93. package/dist_esm/BuildFunctionGroup.js.map +0 -1
  94. package/dist_esm/BuildRuntimePlatform.d.ts +0 -4
  95. package/dist_esm/BuildRuntimePlatform.js +0 -6
  96. package/dist_esm/BuildRuntimePlatform.js.map +0 -1
  97. package/dist_esm/BuildStep.js +0 -354
  98. package/dist_esm/BuildStep.js.map +0 -1
  99. package/dist_esm/BuildStepContext.d.ts +0 -86
  100. package/dist_esm/BuildStepContext.js +0 -207
  101. package/dist_esm/BuildStepContext.js.map +0 -1
  102. package/dist_esm/BuildStepEnv.d.ts +0 -1
  103. package/dist_esm/BuildStepEnv.js +0 -2
  104. package/dist_esm/BuildStepEnv.js.map +0 -1
  105. package/dist_esm/BuildStepInput.js +0 -150
  106. package/dist_esm/BuildStepInput.js.map +0 -1
  107. package/dist_esm/BuildStepOutput.d.ts +0 -33
  108. package/dist_esm/BuildStepOutput.js +0 -57
  109. package/dist_esm/BuildStepOutput.js.map +0 -1
  110. package/dist_esm/BuildTemporaryFiles.d.ts +0 -5
  111. package/dist_esm/BuildTemporaryFiles.js +0 -31
  112. package/dist_esm/BuildTemporaryFiles.js.map +0 -1
  113. package/dist_esm/BuildWorkflow.d.ts +0 -14
  114. package/dist_esm/BuildWorkflow.js +0 -55
  115. package/dist_esm/BuildWorkflow.js.map +0 -1
  116. package/dist_esm/BuildWorkflowValidator.d.ts +0 -10
  117. package/dist_esm/BuildWorkflowValidator.js +0 -121
  118. package/dist_esm/BuildWorkflowValidator.js.map +0 -1
  119. package/dist_esm/StepMetrics.d.ts +0 -10
  120. package/dist_esm/StepMetrics.js +0 -2
  121. package/dist_esm/StepMetrics.js.map +0 -1
  122. package/dist_esm/StepsConfigParser.d.ts +0 -24
  123. package/dist_esm/StepsConfigParser.js +0 -133
  124. package/dist_esm/StepsConfigParser.js.map +0 -1
  125. package/dist_esm/cli/cli.js +0 -61
  126. package/dist_esm/cli/cli.js.map +0 -1
  127. package/dist_esm/errors.d.ts +0 -24
  128. package/dist_esm/errors.js +0 -24
  129. package/dist_esm/errors.js.map +0 -1
  130. package/dist_esm/index.d.ts +0 -19
  131. package/dist_esm/index.js +0 -18
  132. package/dist_esm/index.js.map +0 -1
  133. package/dist_esm/interpolation.d.ts +0 -5
  134. package/dist_esm/interpolation.js +0 -26
  135. package/dist_esm/interpolation.js.map +0 -1
  136. package/dist_esm/scripts/runCustomFunction.d.ts +0 -1
  137. package/dist_esm/scripts/runCustomFunction.js +0 -100
  138. package/dist_esm/scripts/runCustomFunction.js.map +0 -1
  139. package/dist_esm/utils/customFunction.d.ts +0 -18
  140. package/dist_esm/utils/customFunction.js +0 -49
  141. package/dist_esm/utils/customFunction.js.map +0 -1
  142. package/dist_esm/utils/expodash/duplicates.d.ts +0 -1
  143. package/dist_esm/utils/expodash/duplicates.js +0 -14
  144. package/dist_esm/utils/expodash/duplicates.js.map +0 -1
  145. package/dist_esm/utils/expodash/uniq.d.ts +0 -1
  146. package/dist_esm/utils/expodash/uniq.js +0 -5
  147. package/dist_esm/utils/expodash/uniq.js.map +0 -1
  148. package/dist_esm/utils/hashFiles.d.ts +0 -6
  149. package/dist_esm/utils/hashFiles.js +0 -31
  150. package/dist_esm/utils/hashFiles.js.map +0 -1
  151. package/dist_esm/utils/jsepEval.d.ts +0 -1
  152. package/dist_esm/utils/jsepEval.js +0 -169
  153. package/dist_esm/utils/jsepEval.js.map +0 -1
  154. package/dist_esm/utils/nullthrows.d.ts +0 -1
  155. package/dist_esm/utils/nullthrows.js +0 -7
  156. package/dist_esm/utils/nullthrows.js.map +0 -1
  157. package/dist_esm/utils/shell/bin.d.ts +0 -1
  158. package/dist_esm/utils/shell/bin.js +0 -5
  159. package/dist_esm/utils/shell/bin.js.map +0 -1
  160. package/dist_esm/utils/shell/command.d.ts +0 -4
  161. package/dist_esm/utils/shell/command.js +0 -13
  162. package/dist_esm/utils/shell/command.js.map +0 -1
  163. package/dist_esm/utils/shell/spawn.d.ts +0 -15
  164. package/dist_esm/utils/shell/spawn.js +0 -16
  165. package/dist_esm/utils/shell/spawn.js.map +0 -1
  166. package/dist_esm/utils/template.d.ts +0 -19
  167. package/dist_esm/utils/template.js +0 -106
  168. package/dist_esm/utils/template.js.map +0 -1
  169. /package/{dist_commonjs → dist}/BuildRuntimePlatform.d.ts +0 -0
  170. /package/{dist_commonjs/BuildRuntimePlatform.cjs → dist/BuildRuntimePlatform.js} +0 -0
  171. /package/{dist_commonjs → dist}/BuildRuntimePlatform.js.map +0 -0
  172. /package/{dist_commonjs → dist}/BuildStepEnv.d.ts +0 -0
  173. /package/{dist_commonjs/BuildStepEnv.cjs → dist/BuildStepEnv.js} +0 -0
  174. /package/{dist_commonjs → dist}/BuildStepEnv.js.map +0 -0
  175. /package/{dist_commonjs/BuildTemporaryFiles.cjs → dist/BuildTemporaryFiles.js} +0 -0
  176. /package/{dist_commonjs/BuildWorkflow.cjs → dist/BuildWorkflow.js} +0 -0
  177. /package/{dist_commonjs → dist}/StepMetrics.d.ts +0 -0
  178. /package/{dist_commonjs/StepMetrics.cjs → dist/StepMetrics.js} +0 -0
  179. /package/{dist_commonjs → dist}/StepMetrics.js.map +0 -0
  180. /package/{dist_commonjs → dist}/errors.d.ts +0 -0
  181. /package/{dist_commonjs/errors.cjs → dist/errors.js} +0 -0
  182. /package/{dist_commonjs → dist}/errors.js.map +0 -0
  183. /package/{dist_commonjs → dist}/interpolation.d.ts +0 -0
  184. /package/{dist_commonjs → dist}/scripts/runCustomFunction.d.ts +0 -0
  185. /package/{dist_commonjs → dist}/utils/expodash/duplicates.d.ts +0 -0
  186. /package/{dist_commonjs/utils/expodash/duplicates.cjs → dist/utils/expodash/duplicates.js} +0 -0
  187. /package/{dist_commonjs → dist}/utils/expodash/duplicates.js.map +0 -0
  188. /package/{dist_commonjs → dist}/utils/expodash/uniq.d.ts +0 -0
  189. /package/{dist_commonjs/utils/expodash/uniq.cjs → dist/utils/expodash/uniq.js} +0 -0
  190. /package/{dist_commonjs → dist}/utils/expodash/uniq.js.map +0 -0
  191. /package/{dist_commonjs → dist}/utils/hashFiles.d.ts +0 -0
  192. /package/{dist_commonjs/utils/hashFiles.cjs → dist/utils/hashFiles.js} +0 -0
  193. /package/{dist_commonjs → dist}/utils/hashFiles.js.map +0 -0
  194. /package/{dist_commonjs → dist}/utils/jsepEval.d.ts +0 -0
  195. /package/{dist_commonjs/utils/jsepEval.cjs → dist/utils/jsepEval.js} +0 -0
  196. /package/{dist_commonjs → dist}/utils/jsepEval.js.map +0 -0
  197. /package/{dist_commonjs → dist}/utils/nullthrows.d.ts +0 -0
  198. /package/{dist_commonjs/utils/nullthrows.cjs → dist/utils/nullthrows.js} +0 -0
  199. /package/{dist_commonjs → dist}/utils/nullthrows.js.map +0 -0
  200. /package/{dist_commonjs → dist}/utils/shell/bin.d.ts +0 -0
  201. /package/{dist_commonjs → dist}/utils/shell/command.d.ts +0 -0
  202. /package/{dist_commonjs/utils/shell/command.cjs → dist/utils/shell/command.js} +0 -0
  203. /package/{dist_commonjs → dist}/utils/shell/command.js.map +0 -0
  204. /package/{dist_commonjs → dist}/utils/shell/spawn.d.ts +0 -0
  205. /package/{dist_commonjs/utils/shell/spawn.cjs → dist/utils/shell/spawn.js} +0 -0
  206. /package/{dist_commonjs → dist}/utils/shell/spawn.js.map +0 -0
  207. /package/{dist_commonjs → dist}/utils/template.d.ts +0 -0
@@ -1,281 +0,0 @@
1
- import assert from 'assert';
2
- import fs from 'fs/promises';
3
- import path from 'path';
4
- import Joi from 'joi';
5
- import YAML from 'yaml';
6
- import { BuildConfigError, BuildWorkflowError } from './errors.js';
7
- import { BuildRuntimePlatform } from './BuildRuntimePlatform.js';
8
- import { BuildStepInputValueTypeName } from './BuildStepInput.js';
9
- import { BUILD_STEP_OR_BUILD_GLOBAL_CONTEXT_REFERENCE_REGEX } from './utils/template.js';
10
- const BuildFunctionInputsSchema = Joi.array().items(Joi.alternatives().conditional(Joi.ref('.'), {
11
- is: Joi.string(),
12
- then: Joi.string().required(),
13
- otherwise: Joi.object({
14
- name: Joi.string().required(),
15
- defaultValue: Joi.when('allowedValues', {
16
- is: Joi.exist(),
17
- then: Joi.valid(Joi.in('allowedValues')).messages({
18
- 'any.only': '{{#label}} must be one of allowed values',
19
- }),
20
- })
21
- .when('allowedValueType', {
22
- is: BuildStepInputValueTypeName.STRING,
23
- then: Joi.string().allow(''),
24
- })
25
- .when('allowedValueType', {
26
- is: BuildStepInputValueTypeName.BOOLEAN,
27
- then: Joi.alternatives(Joi.boolean(), Joi.string().pattern(BUILD_STEP_OR_BUILD_GLOBAL_CONTEXT_REFERENCE_REGEX, 'context or output reference regex pattern')).messages({
28
- 'alternatives.types': '{{#label}} must be a boolean or reference to output or context value',
29
- }),
30
- })
31
- .when('allowedValueType', {
32
- is: BuildStepInputValueTypeName.NUMBER,
33
- then: Joi.alternatives(Joi.number(), Joi.string().pattern(BUILD_STEP_OR_BUILD_GLOBAL_CONTEXT_REFERENCE_REGEX, 'context or output reference regex pattern')).messages({
34
- 'alternatives.types': '{{#label}} must be a number or reference to output or context value',
35
- }),
36
- })
37
- .when('allowedValueType', {
38
- is: BuildStepInputValueTypeName.JSON,
39
- then: Joi.alternatives(Joi.object(), Joi.string().pattern(BUILD_STEP_OR_BUILD_GLOBAL_CONTEXT_REFERENCE_REGEX, 'context or output reference regex pattern')).messages({
40
- 'alternatives.types': '{{#label}} must be a object or reference to output or context value',
41
- }),
42
- }),
43
- allowedValues: Joi.when('allowedValueType', {
44
- is: BuildStepInputValueTypeName.STRING,
45
- then: Joi.array().items(Joi.string().allow('')),
46
- })
47
- .when('allowedValueType', {
48
- is: BuildStepInputValueTypeName.BOOLEAN,
49
- then: Joi.array().items(Joi.boolean()),
50
- })
51
- .when('allowedValueType', {
52
- is: BuildStepInputValueTypeName.NUMBER,
53
- then: Joi.array().items(Joi.number()),
54
- })
55
- .when('allowedValueType', {
56
- is: BuildStepInputValueTypeName.JSON,
57
- then: Joi.array().items(Joi.object()),
58
- }),
59
- allowedValueType: Joi.string()
60
- .valid(...Object.values(BuildStepInputValueTypeName))
61
- .default(BuildStepInputValueTypeName.STRING),
62
- required: Joi.boolean(),
63
- })
64
- .rename('allowed_values', 'allowedValues')
65
- .rename('default_value', 'defaultValue')
66
- .rename('type', 'allowedValueType')
67
- .required(),
68
- }));
69
- const BuildStepOutputsSchema = Joi.array().items(Joi.alternatives().try(Joi.string().required(), Joi.object({
70
- name: Joi.string().required(),
71
- required: Joi.boolean(),
72
- }).required()));
73
- const BuildFunctionCallSchema = Joi.object({
74
- id: Joi.string(),
75
- inputs: Joi.object().pattern(Joi.string(), Joi.alternatives().try(Joi.string().allow(''), Joi.boolean(), Joi.number(), Joi.object())),
76
- name: Joi.string(),
77
- workingDirectory: Joi.string(),
78
- shell: Joi.string(),
79
- env: Joi.object().pattern(Joi.string(), Joi.string().allow('')),
80
- if: Joi.string(),
81
- timeout_minutes: Joi.number().positive(),
82
- // Internal field for metrics collection. Not documented publicly.
83
- __metrics_id: Joi.string(),
84
- }).rename('working_directory', 'workingDirectory');
85
- const BuildStepConfigSchema = Joi.any()
86
- .invalid(null)
87
- .when(Joi.object().pattern(Joi.string().disallow('run').required(), Joi.object().unknown().required()), {
88
- then: Joi.object().pattern(Joi.string().disallow('run').min(1).required(), BuildFunctionCallSchema.required(), { matches: Joi.array().length(1) }),
89
- })
90
- .when(Joi.object({ run: Joi.object().unknown().required() }), {
91
- then: Joi.object({
92
- run: BuildFunctionCallSchema.keys({
93
- outputs: BuildStepOutputsSchema,
94
- command: Joi.string().required(),
95
- }),
96
- }),
97
- })
98
- .when(Joi.object({ run: Joi.string().required() }), {
99
- then: Joi.object({
100
- run: Joi.string().min(1).required(),
101
- }),
102
- })
103
- .when(Joi.string(), {
104
- then: Joi.string().min(1),
105
- });
106
- const BuildFunctionConfigSchema = Joi.object({
107
- name: Joi.string(),
108
- supportedRuntimePlatforms: Joi.array().items(...Object.values(BuildRuntimePlatform)),
109
- inputs: BuildFunctionInputsSchema,
110
- outputs: BuildStepOutputsSchema,
111
- command: Joi.string(),
112
- path: Joi.string(),
113
- shell: Joi.string(),
114
- })
115
- .rename('supported_platforms', 'supportedRuntimePlatforms')
116
- .xor('command', 'path')
117
- .nand('command', 'path');
118
- export const BuildFunctionsConfigFileSchema = Joi.object({
119
- configFilesToImport: Joi.array().items(Joi.string().pattern(/\.y(a)?ml$/)),
120
- functions: Joi.object().pattern(Joi.string()
121
- .pattern(/^[\w-]+$/, 'function names')
122
- .min(1)
123
- .required()
124
- .disallow('run'), BuildFunctionConfigSchema.required()),
125
- })
126
- .rename('import', 'configFilesToImport')
127
- .required();
128
- export const BuildConfigSchema = BuildFunctionsConfigFileSchema.append({
129
- build: Joi.object({
130
- name: Joi.string(),
131
- steps: Joi.array().items(BuildStepConfigSchema.required()).required(),
132
- }).required(),
133
- }).required();
134
- export async function readAndValidateBuildConfigFromPathAsync(configPath, params = {}) {
135
- const rawConfig = await readRawBuildConfigAsync(configPath);
136
- const config = validateConfig(BuildConfigSchema, rawConfig);
137
- for (const functionName in config.functions) {
138
- const customFunctionPath = config.functions[functionName].path;
139
- if (customFunctionPath) {
140
- config.functions[functionName].path = maybeResolveCustomFunctionRelativePath(path.dirname(configPath), customFunctionPath);
141
- }
142
- }
143
- const importedFunctions = await importFunctionsAsync(configPath, config.configFilesToImport);
144
- mergeConfigWithImportedFunctions(config, importedFunctions);
145
- validateAllFunctionsExist(config, params);
146
- return config;
147
- }
148
- async function importFunctionsAsync(baseConfigPath, configPathsToImport) {
149
- if (!configPathsToImport) {
150
- return {};
151
- }
152
- const baseConfigDir = path.dirname(baseConfigPath);
153
- const errors = [];
154
- const importedFunctions = {};
155
- // this is a set of visited files identified by ABSOLUTE paths
156
- const visitedFiles = new Set([baseConfigPath]);
157
- const configFilesToVisit = (configPathsToImport !== null && configPathsToImport !== void 0 ? configPathsToImport : []).map((childConfigRelativePath) => path.resolve(baseConfigDir, childConfigRelativePath));
158
- while (configFilesToVisit.length > 0) {
159
- const childConfigPath = configFilesToVisit.shift();
160
- assert(childConfigPath, 'Guaranteed by loop condition');
161
- if (visitedFiles.has(childConfigPath)) {
162
- continue;
163
- }
164
- visitedFiles.add(childConfigPath);
165
- try {
166
- const childConfig = await readAndValidateBuildFunctionsConfigFileAsync(childConfigPath);
167
- const childDir = path.dirname(childConfigPath);
168
- for (const functionName in childConfig.functions) {
169
- if (!(functionName in importedFunctions)) {
170
- const f = childConfig.functions[functionName];
171
- if (f.path) {
172
- f.path = maybeResolveCustomFunctionRelativePath(childDir, f.path);
173
- }
174
- importedFunctions[functionName] = f;
175
- }
176
- }
177
- if (childConfig.configFilesToImport) {
178
- configFilesToVisit.push(...childConfig.configFilesToImport.map((relativePath) => path.resolve(childDir, relativePath)));
179
- }
180
- }
181
- catch (err) {
182
- if (err instanceof BuildConfigError) {
183
- errors.push(err);
184
- }
185
- else {
186
- throw err;
187
- }
188
- }
189
- }
190
- if (errors.length > 0) {
191
- throw new BuildWorkflowError(`Detected build config errors in imported files.`, errors);
192
- }
193
- return importedFunctions;
194
- }
195
- export async function readAndValidateBuildFunctionsConfigFileAsync(configPath) {
196
- const rawConfig = await readRawBuildConfigAsync(configPath);
197
- return validateConfig(BuildFunctionsConfigFileSchema, rawConfig);
198
- }
199
- export async function readRawBuildConfigAsync(configPath) {
200
- const contents = await fs.readFile(configPath, 'utf-8');
201
- return YAML.parse(contents);
202
- }
203
- export function validateConfig(schema, config, configFilePath) {
204
- const { error, value } = schema.validate(config, {
205
- allowUnknown: false,
206
- abortEarly: false,
207
- });
208
- if (error) {
209
- const errorMessage = error.details.map(({ message }) => message).join(', ');
210
- throw new BuildConfigError(errorMessage, {
211
- cause: error,
212
- ...(configFilePath && { metadata: { configFilePath } }),
213
- });
214
- }
215
- return value;
216
- }
217
- export function mergeConfigWithImportedFunctions(config, importedFunctions) {
218
- var _a;
219
- if (Object.keys(importedFunctions).length === 0) {
220
- return;
221
- }
222
- config.functions = (_a = config.functions) !== null && _a !== void 0 ? _a : {};
223
- for (const functionName in importedFunctions) {
224
- if (!(functionName in config.functions)) {
225
- config.functions[functionName] = importedFunctions[functionName];
226
- }
227
- }
228
- }
229
- export function isBuildStepCommandRun(step) {
230
- return Boolean(step) && typeof step === 'object' && typeof step.run === 'object';
231
- }
232
- export function isBuildStepBareCommandRun(step) {
233
- return Boolean(step) && typeof step === 'object' && typeof step.run === 'string';
234
- }
235
- export function isBuildStepFunctionCall(step) {
236
- return Boolean(step) && typeof step === 'object' && !('run' in step);
237
- }
238
- export function isBuildStepBareFunctionOrFunctionGroupCall(step) {
239
- return typeof step === 'string';
240
- }
241
- export function validateAllFunctionsExist(config, { externalFunctionIds = [], externalFunctionGroupsIds = [], skipNamespacedFunctionsOrFunctionGroupsCheck, }) {
242
- const calledFunctionsOrFunctionGroupsSet = new Set();
243
- for (const step of config.build.steps) {
244
- if (typeof step === 'string') {
245
- calledFunctionsOrFunctionGroupsSet.add(step);
246
- }
247
- else if (step !== null && !('run' in step)) {
248
- const keys = Object.keys(step);
249
- assert(keys.length === 1, 'There must be at most one function call in the step (enforced by joi).');
250
- calledFunctionsOrFunctionGroupsSet.add(keys[0]);
251
- }
252
- }
253
- const calledFunctionsOrFunctionGroup = Array.from(calledFunctionsOrFunctionGroupsSet);
254
- const externalFunctionIdsSet = new Set(externalFunctionIds);
255
- const externalFunctionGroupsIdsSet = new Set(externalFunctionGroupsIds);
256
- const nonExistentFunctionsOrFunctionGroups = calledFunctionsOrFunctionGroup.filter((calledFunctionOrFunctionGroup) => {
257
- var _a;
258
- if (isFullIdNamespaced(calledFunctionOrFunctionGroup) &&
259
- skipNamespacedFunctionsOrFunctionGroupsCheck) {
260
- return false;
261
- }
262
- return (!(calledFunctionOrFunctionGroup in ((_a = config.functions) !== null && _a !== void 0 ? _a : {})) &&
263
- !externalFunctionIdsSet.has(calledFunctionOrFunctionGroup) &&
264
- !externalFunctionGroupsIdsSet.has(calledFunctionOrFunctionGroup));
265
- });
266
- if (nonExistentFunctionsOrFunctionGroups.length > 0) {
267
- throw new BuildConfigError(`Calling non-existent functions: ${nonExistentFunctionsOrFunctionGroups
268
- .map((f) => `"${f}"`)
269
- .join(', ')}.`);
270
- }
271
- }
272
- function maybeResolveCustomFunctionRelativePath(dir, customFunctionPath) {
273
- if (!path.isAbsolute(customFunctionPath)) {
274
- return path.resolve(dir, customFunctionPath);
275
- }
276
- return customFunctionPath;
277
- }
278
- function isFullIdNamespaced(fullId) {
279
- return fullId.includes('/');
280
- }
281
- //# sourceMappingURL=BuildConfig.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BuildConfig.js","sourceRoot":"","sources":["../src/BuildConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert';\nimport fs from 'fs/promises';\nimport path from 'path';\n\nimport Joi from 'joi';\nimport YAML from 'yaml';\n\nimport { BuildConfigError, BuildWorkflowError } from './errors.js';\nimport { BuildRuntimePlatform } from './BuildRuntimePlatform.js';\nimport { BuildStepInputValueTypeName, BuildStepInputValueType } from './BuildStepInput.js';\nimport { BuildStepEnv } from './BuildStepEnv.js';\nimport { BUILD_STEP_OR_BUILD_GLOBAL_CONTEXT_REFERENCE_REGEX } from './utils/template.js';\n\nexport type BuildFunctions = Record<string, BuildFunctionConfig>;\n\ninterface BuildFunctionsConfigFile {\n configFilesToImport?: string[];\n functions?: BuildFunctions;\n}\n\nexport interface BuildConfig extends BuildFunctionsConfigFile {\n build: {\n name?: string;\n steps: BuildStepConfig[];\n };\n}\n\nexport type BuildStepConfig =\n | BuildStepCommandRun\n | BuildStepBareCommandRun\n | BuildStepFunctionCall\n | BuildStepBareFunctionOrFunctionGroupCall;\n\nexport type BuildStepCommandRun = {\n run: BuildFunctionCallConfig & {\n outputs?: BuildStepOutputs;\n command: string;\n };\n};\nexport type BuildStepBareCommandRun = { run: string };\nexport type BuildStepFunctionCall = {\n [functionId: string]: BuildFunctionCallConfig;\n};\nexport type BuildStepBareFunctionOrFunctionGroupCall = string;\n\nexport type BuildFunctionCallConfig = {\n id?: string;\n inputs?: BuildStepInputs;\n name?: string;\n workingDirectory?: string;\n shell?: string;\n env?: BuildStepEnv;\n if?: string;\n timeout_minutes?: number;\n // Internal field for metrics collection. Not documented publicly.\n __metrics_id?: string;\n};\n\nexport type BuildStepInputs = Record<string, unknown>;\nexport type BuildStepOutputs = (\n | string\n | {\n name: string;\n required?: boolean;\n }\n)[];\n\nexport interface BuildFunctionConfig {\n inputs?: BuildFunctionInputs;\n outputs?: BuildFunctionOutputs;\n name?: string;\n supportedRuntimePlatforms?: BuildRuntimePlatform[];\n shell?: string;\n command?: string;\n path?: string;\n}\n\nexport type BuildFunctionInputs = (\n | string\n | {\n name: string;\n defaultValue?: BuildStepInputValueType;\n allowedValues?: BuildStepInputValueType[];\n required?: boolean;\n allowedValueType: BuildStepInputValueTypeName;\n }\n)[];\nexport type BuildFunctionOutputs = BuildStepOutputs;\n\nconst BuildFunctionInputsSchema = Joi.array().items(\n Joi.alternatives().conditional(Joi.ref('.'), {\n is: Joi.string(),\n then: Joi.string().required(),\n otherwise: Joi.object({\n name: Joi.string().required(),\n defaultValue: Joi.when('allowedValues', {\n is: Joi.exist(),\n then: Joi.valid(Joi.in('allowedValues')).messages({\n 'any.only': '{{#label}} must be one of allowed values',\n }),\n })\n .when('allowedValueType', {\n is: BuildStepInputValueTypeName.STRING,\n then: Joi.string().allow(''),\n })\n .when('allowedValueType', {\n is: BuildStepInputValueTypeName.BOOLEAN,\n then: Joi.alternatives(\n Joi.boolean(),\n Joi.string().pattern(\n BUILD_STEP_OR_BUILD_GLOBAL_CONTEXT_REFERENCE_REGEX,\n 'context or output reference regex pattern'\n )\n ).messages({\n 'alternatives.types':\n '{{#label}} must be a boolean or reference to output or context value',\n }),\n })\n .when('allowedValueType', {\n is: BuildStepInputValueTypeName.NUMBER,\n then: Joi.alternatives(\n Joi.number(),\n Joi.string().pattern(\n BUILD_STEP_OR_BUILD_GLOBAL_CONTEXT_REFERENCE_REGEX,\n 'context or output reference regex pattern'\n )\n ).messages({\n 'alternatives.types':\n '{{#label}} must be a number or reference to output or context value',\n }),\n })\n .when('allowedValueType', {\n is: BuildStepInputValueTypeName.JSON,\n then: Joi.alternatives(\n Joi.object(),\n Joi.string().pattern(\n BUILD_STEP_OR_BUILD_GLOBAL_CONTEXT_REFERENCE_REGEX,\n 'context or output reference regex pattern'\n )\n ).messages({\n 'alternatives.types':\n '{{#label}} must be a object or reference to output or context value',\n }),\n }),\n allowedValues: Joi.when('allowedValueType', {\n is: BuildStepInputValueTypeName.STRING,\n then: Joi.array().items(Joi.string().allow('')),\n })\n .when('allowedValueType', {\n is: BuildStepInputValueTypeName.BOOLEAN,\n then: Joi.array().items(Joi.boolean()),\n })\n .when('allowedValueType', {\n is: BuildStepInputValueTypeName.NUMBER,\n then: Joi.array().items(Joi.number()),\n })\n .when('allowedValueType', {\n is: BuildStepInputValueTypeName.JSON,\n then: Joi.array().items(Joi.object()),\n }),\n allowedValueType: Joi.string()\n .valid(...Object.values(BuildStepInputValueTypeName))\n .default(BuildStepInputValueTypeName.STRING),\n required: Joi.boolean(),\n })\n .rename('allowed_values', 'allowedValues')\n .rename('default_value', 'defaultValue')\n .rename('type', 'allowedValueType')\n .required(),\n })\n);\n\nconst BuildStepOutputsSchema = Joi.array().items(\n Joi.alternatives().try(\n Joi.string().required(),\n Joi.object({\n name: Joi.string().required(),\n required: Joi.boolean(),\n }).required()\n )\n);\n\nconst BuildFunctionCallSchema = Joi.object({\n id: Joi.string(),\n inputs: Joi.object().pattern(\n Joi.string(),\n Joi.alternatives().try(Joi.string().allow(''), Joi.boolean(), Joi.number(), Joi.object())\n ),\n name: Joi.string(),\n workingDirectory: Joi.string(),\n shell: Joi.string(),\n env: Joi.object().pattern(Joi.string(), Joi.string().allow('')),\n if: Joi.string(),\n timeout_minutes: Joi.number().positive(),\n // Internal field for metrics collection. Not documented publicly.\n __metrics_id: Joi.string(),\n}).rename('working_directory', 'workingDirectory');\n\nconst BuildStepConfigSchema = Joi.any<BuildStepConfig>()\n .invalid(null)\n .when(\n Joi.object().pattern(\n Joi.string().disallow('run').required(),\n Joi.object().unknown().required()\n ),\n {\n then: Joi.object().pattern(\n Joi.string().disallow('run').min(1).required(),\n BuildFunctionCallSchema.required(),\n { matches: Joi.array().length(1) }\n ),\n }\n )\n .when(Joi.object({ run: Joi.object().unknown().required() }), {\n then: Joi.object({\n run: BuildFunctionCallSchema.keys({\n outputs: BuildStepOutputsSchema,\n command: Joi.string().required(),\n }),\n }),\n })\n .when(Joi.object({ run: Joi.string().required() }), {\n then: Joi.object({\n run: Joi.string().min(1).required(),\n }),\n })\n .when(Joi.string(), {\n then: Joi.string().min(1),\n });\n\nconst BuildFunctionConfigSchema = Joi.object({\n name: Joi.string(),\n supportedRuntimePlatforms: Joi.array().items(...Object.values(BuildRuntimePlatform)),\n inputs: BuildFunctionInputsSchema,\n outputs: BuildStepOutputsSchema,\n command: Joi.string(),\n path: Joi.string(),\n shell: Joi.string(),\n})\n .rename('supported_platforms', 'supportedRuntimePlatforms')\n .xor('command', 'path')\n .nand('command', 'path');\n\nexport const BuildFunctionsConfigFileSchema = Joi.object<BuildFunctionsConfigFile>({\n configFilesToImport: Joi.array().items(Joi.string().pattern(/\\.y(a)?ml$/)),\n functions: Joi.object().pattern(\n Joi.string()\n .pattern(/^[\\w-]+$/, 'function names')\n .min(1)\n .required()\n .disallow('run'),\n BuildFunctionConfigSchema.required()\n ),\n})\n .rename('import', 'configFilesToImport')\n .required();\n\nexport const BuildConfigSchema = BuildFunctionsConfigFileSchema.append<BuildConfig>({\n build: Joi.object({\n name: Joi.string(),\n steps: Joi.array().items(BuildStepConfigSchema.required()).required(),\n }).required(),\n}).required();\n\ninterface BuildConfigValidationParams {\n externalFunctionIds?: string[];\n externalFunctionGroupsIds?: string[];\n skipNamespacedFunctionsOrFunctionGroupsCheck?: boolean;\n}\n\nexport async function readAndValidateBuildConfigFromPathAsync(\n configPath: string,\n params: BuildConfigValidationParams = {}\n): Promise<BuildConfig> {\n const rawConfig = await readRawBuildConfigAsync(configPath);\n\n const config = validateConfig(BuildConfigSchema, rawConfig);\n for (const functionName in config.functions) {\n const customFunctionPath = config.functions[functionName].path;\n if (customFunctionPath) {\n config.functions[functionName].path = maybeResolveCustomFunctionRelativePath(\n path.dirname(configPath),\n customFunctionPath\n );\n }\n }\n\n const importedFunctions = await importFunctionsAsync(configPath, config.configFilesToImport);\n mergeConfigWithImportedFunctions(config, importedFunctions);\n validateAllFunctionsExist(config, params);\n return config;\n}\n\nasync function importFunctionsAsync(\n baseConfigPath: string,\n configPathsToImport?: string[]\n): Promise<BuildFunctions> {\n if (!configPathsToImport) {\n return {};\n }\n\n const baseConfigDir = path.dirname(baseConfigPath);\n\n const errors: BuildConfigError[] = [];\n const importedFunctions: BuildFunctions = {};\n // this is a set of visited files identified by ABSOLUTE paths\n const visitedFiles = new Set<string>([baseConfigPath]);\n const configFilesToVisit = (configPathsToImport ?? []).map((childConfigRelativePath) =>\n path.resolve(baseConfigDir, childConfigRelativePath)\n );\n while (configFilesToVisit.length > 0) {\n const childConfigPath = configFilesToVisit.shift();\n assert(childConfigPath, 'Guaranteed by loop condition');\n if (visitedFiles.has(childConfigPath)) {\n continue;\n }\n visitedFiles.add(childConfigPath);\n try {\n const childConfig = await readAndValidateBuildFunctionsConfigFileAsync(childConfigPath);\n const childDir = path.dirname(childConfigPath);\n for (const functionName in childConfig.functions) {\n if (!(functionName in importedFunctions)) {\n const f = childConfig.functions[functionName];\n if (f.path) {\n f.path = maybeResolveCustomFunctionRelativePath(childDir, f.path);\n }\n importedFunctions[functionName] = f;\n }\n }\n if (childConfig.configFilesToImport) {\n configFilesToVisit.push(\n ...childConfig.configFilesToImport.map((relativePath) =>\n path.resolve(childDir, relativePath)\n )\n );\n }\n } catch (err) {\n if (err instanceof BuildConfigError) {\n errors.push(err);\n } else {\n throw err;\n }\n }\n }\n if (errors.length > 0) {\n throw new BuildWorkflowError(`Detected build config errors in imported files.`, errors);\n }\n return importedFunctions;\n}\n\nexport async function readAndValidateBuildFunctionsConfigFileAsync(\n configPath: string\n): Promise<BuildFunctionsConfigFile> {\n const rawConfig = await readRawBuildConfigAsync(configPath);\n return validateConfig(BuildFunctionsConfigFileSchema, rawConfig);\n}\n\nexport async function readRawBuildConfigAsync(configPath: string): Promise<any> {\n const contents = await fs.readFile(configPath, 'utf-8');\n return YAML.parse(contents);\n}\n\nexport function validateConfig<T>(\n schema: Joi.ObjectSchema<T>,\n config: object,\n configFilePath?: string\n): T {\n const { error, value } = schema.validate(config, {\n allowUnknown: false,\n abortEarly: false,\n });\n if (error) {\n const errorMessage = error.details.map(({ message }) => message).join(', ');\n throw new BuildConfigError(errorMessage, {\n cause: error,\n ...(configFilePath && { metadata: { configFilePath } }),\n });\n }\n return value;\n}\n\nexport function mergeConfigWithImportedFunctions(\n config: BuildConfig,\n importedFunctions: BuildFunctions\n): void {\n if (Object.keys(importedFunctions).length === 0) {\n return;\n }\n config.functions = config.functions ?? {};\n for (const functionName in importedFunctions) {\n if (!(functionName in config.functions)) {\n config.functions[functionName] = importedFunctions[functionName];\n }\n }\n}\n\nexport function isBuildStepCommandRun(step: BuildStepConfig): step is BuildStepCommandRun {\n return Boolean(step) && typeof step === 'object' && typeof step.run === 'object';\n}\n\nexport function isBuildStepBareCommandRun(step: BuildStepConfig): step is BuildStepBareCommandRun {\n return Boolean(step) && typeof step === 'object' && typeof step.run === 'string';\n}\n\nexport function isBuildStepFunctionCall(step: BuildStepConfig): step is BuildStepFunctionCall {\n return Boolean(step) && typeof step === 'object' && !('run' in step);\n}\n\nexport function isBuildStepBareFunctionOrFunctionGroupCall(\n step: BuildStepConfig\n): step is BuildStepBareFunctionOrFunctionGroupCall {\n return typeof step === 'string';\n}\n\nexport function validateAllFunctionsExist(\n config: BuildConfig,\n {\n externalFunctionIds = [],\n externalFunctionGroupsIds = [],\n skipNamespacedFunctionsOrFunctionGroupsCheck,\n }: BuildConfigValidationParams\n): void {\n const calledFunctionsOrFunctionGroupsSet = new Set<string>();\n for (const step of config.build.steps) {\n if (typeof step === 'string') {\n calledFunctionsOrFunctionGroupsSet.add(step);\n } else if (step !== null && !('run' in step)) {\n const keys = Object.keys(step);\n assert(\n keys.length === 1,\n 'There must be at most one function call in the step (enforced by joi).'\n );\n calledFunctionsOrFunctionGroupsSet.add(keys[0]);\n }\n }\n const calledFunctionsOrFunctionGroup = Array.from(calledFunctionsOrFunctionGroupsSet);\n const externalFunctionIdsSet = new Set(externalFunctionIds);\n const externalFunctionGroupsIdsSet = new Set(externalFunctionGroupsIds);\n const nonExistentFunctionsOrFunctionGroups = calledFunctionsOrFunctionGroup.filter(\n (calledFunctionOrFunctionGroup) => {\n if (\n isFullIdNamespaced(calledFunctionOrFunctionGroup) &&\n skipNamespacedFunctionsOrFunctionGroupsCheck\n ) {\n return false;\n }\n return (\n !(calledFunctionOrFunctionGroup in (config.functions ?? {})) &&\n !externalFunctionIdsSet.has(calledFunctionOrFunctionGroup) &&\n !externalFunctionGroupsIdsSet.has(calledFunctionOrFunctionGroup)\n );\n }\n );\n if (nonExistentFunctionsOrFunctionGroups.length > 0) {\n throw new BuildConfigError(\n `Calling non-existent functions: ${nonExistentFunctionsOrFunctionGroups\n .map((f) => `\"${f}\"`)\n .join(', ')}.`\n );\n }\n}\n\nfunction maybeResolveCustomFunctionRelativePath(dir: string, customFunctionPath: string): string {\n if (!path.isAbsolute(customFunctionPath)) {\n return path.resolve(dir, customFunctionPath);\n }\n return customFunctionPath;\n}\n\nfunction isFullIdNamespaced(fullId: string): boolean {\n return fullId.includes('/');\n}\n"]}
@@ -1,233 +0,0 @@
1
- import assert from 'assert';
2
- import { isBuildStepBareCommandRun, isBuildStepBareFunctionOrFunctionGroupCall, isBuildStepCommandRun, readAndValidateBuildConfigFromPathAsync, } from './BuildConfig.js';
3
- import { BuildFunction } from './BuildFunction.js';
4
- import { BuildStep } from './BuildStep.js';
5
- import { BuildStepInput, BuildStepInputValueTypeName, } from './BuildStepInput.js';
6
- import { BuildStepOutput } from './BuildStepOutput.js';
7
- import { BuildConfigError } from './errors.js';
8
- import { createBuildFunctionGroupByIdMapping, } from './BuildFunctionGroup.js';
9
- import { AbstractConfigParser } from './AbstractConfigParser.js';
10
- export class BuildConfigParser extends AbstractConfigParser {
11
- constructor(ctx, { configPath, externalFunctions, externalFunctionGroups, }) {
12
- super(ctx, {
13
- externalFunctions,
14
- externalFunctionGroups,
15
- });
16
- this.configPath = configPath;
17
- }
18
- async parseConfigToBuildStepsAndBuildFunctionByIdMappingAsync() {
19
- var _a;
20
- const config = await readAndValidateBuildConfigFromPathAsync(this.configPath, {
21
- externalFunctionIds: this.getExternalFunctionFullIds(),
22
- externalFunctionGroupsIds: this.getExternalFunctionGroupFullIds(),
23
- });
24
- const configBuildFunctions = this.createBuildFunctionsFromConfig(config.functions);
25
- const buildFunctions = this.mergeBuildFunctionsWithExternal(configBuildFunctions, this.externalFunctions);
26
- const buildFunctionGroups = createBuildFunctionGroupByIdMapping((_a = this.externalFunctionGroups) !== null && _a !== void 0 ? _a : []);
27
- const buildSteps = [];
28
- for (const stepConfig of config.build.steps) {
29
- buildSteps.push(...this.createBuildStepFromConfig(stepConfig, buildFunctions, buildFunctionGroups));
30
- }
31
- return {
32
- buildSteps,
33
- buildFunctionById: buildFunctions,
34
- };
35
- }
36
- createBuildStepFromConfig(buildStepConfig, buildFunctions, buildFunctionGroups) {
37
- if (isBuildStepCommandRun(buildStepConfig)) {
38
- return [this.createBuildStepFromBuildStepCommandRun(buildStepConfig)];
39
- }
40
- else if (isBuildStepBareCommandRun(buildStepConfig)) {
41
- return [this.createBuildStepFromBuildStepBareCommandRun(buildStepConfig)];
42
- }
43
- else if (isBuildStepBareFunctionOrFunctionGroupCall(buildStepConfig)) {
44
- return this.createBuildStepsFromBareBuildStepFunctionOrBareBuildStepFunctionGroupCall(buildFunctions, buildFunctionGroups, buildStepConfig);
45
- }
46
- else if (buildStepConfig !== null) {
47
- return this.createBuildStepsFromBuildStepFunctionOrBuildStepFunctionGroupCall(buildFunctions, buildFunctionGroups, buildStepConfig);
48
- }
49
- else {
50
- throw new BuildConfigError('Invalid build step configuration detected. Build step cannot be empty.');
51
- }
52
- }
53
- createBuildStepFromBuildStepCommandRun({ run }) {
54
- const { id: maybeId, inputs: inputsConfig, outputs: outputsConfig, name, workingDirectory, shell, command, env, if: ifCondition, timeout_minutes, __metrics_id, } = run;
55
- const id = BuildStep.getNewId(maybeId);
56
- const displayName = BuildStep.getDisplayName({ id, name, command });
57
- const inputs = inputsConfig && this.createBuildStepInputsFromDefinition(inputsConfig, displayName);
58
- const outputs = outputsConfig && this.createBuildStepOutputsFromDefinition(outputsConfig, displayName);
59
- const timeoutMs = timeout_minutes !== undefined ? timeout_minutes * 60 * 1000 : undefined;
60
- return new BuildStep(this.ctx, {
61
- id,
62
- inputs,
63
- outputs,
64
- name,
65
- displayName,
66
- workingDirectory,
67
- shell,
68
- command,
69
- env,
70
- ifCondition,
71
- timeoutMs,
72
- __metricsId: __metrics_id,
73
- });
74
- }
75
- createBuildStepFromBuildStepBareCommandRun({ run: command, }) {
76
- const id = BuildStep.getNewId();
77
- const displayName = BuildStep.getDisplayName({ id, command });
78
- return new BuildStep(this.ctx, {
79
- id,
80
- displayName,
81
- command,
82
- });
83
- }
84
- createBuildStepsFromBuildStepFunctionGroupCall(buildFunctionGroups, buildStepFunctionCall) {
85
- const functionId = getFunctionIdFromBuildStepFunctionCall(buildStepFunctionCall);
86
- const buildFunctionGroup = buildFunctionGroups[functionId];
87
- assert(buildFunctionGroup, `Build function group with id "${functionId}" is not defined.`);
88
- return buildFunctionGroup.createBuildStepsFromFunctionGroupCall(this.ctx, {
89
- callInputs: buildStepFunctionCall[functionId].inputs,
90
- });
91
- }
92
- createBuildStepsFromBuildStepBareFunctionGroupCall(buildFunctionGroups, functionGroupId) {
93
- const buildFunctionGroup = buildFunctionGroups[functionGroupId];
94
- assert(buildFunctionGroup, `Build function group with id "${functionGroupId}" is not defined.`);
95
- return buildFunctionGroup.createBuildStepsFromFunctionGroupCall(this.ctx);
96
- }
97
- createBuildStepFromBuildStepBareFunctionCall(buildFunctions, functionId) {
98
- const buildFunction = buildFunctions[functionId];
99
- return buildFunction.createBuildStepFromFunctionCall(this.ctx);
100
- }
101
- createBuildStepsFromBareBuildStepFunctionOrBareBuildStepFunctionGroupCall(buildFunctions, buildFunctionGroups, functionOrFunctionGroupId) {
102
- const maybeFunctionGroup = buildFunctionGroups[functionOrFunctionGroupId];
103
- if (maybeFunctionGroup) {
104
- return this.createBuildStepsFromBuildStepBareFunctionGroupCall(buildFunctionGroups, functionOrFunctionGroupId);
105
- }
106
- return [
107
- this.createBuildStepFromBuildStepBareFunctionCall(buildFunctions, functionOrFunctionGroupId),
108
- ];
109
- }
110
- createBuildStepsFromBuildStepFunctionOrBuildStepFunctionGroupCall(buildFunctions, buildFunctionGroups, buildStepFunctionCall) {
111
- const functionId = getFunctionIdFromBuildStepFunctionCall(buildStepFunctionCall);
112
- const maybeFunctionGroup = buildFunctionGroups[functionId];
113
- if (maybeFunctionGroup) {
114
- return this.createBuildStepsFromBuildStepFunctionGroupCall(buildFunctionGroups, buildStepFunctionCall);
115
- }
116
- return [this.createBuildStepFromBuildStepFunctionCall(buildFunctions, buildStepFunctionCall)];
117
- }
118
- createBuildStepFromBuildStepFunctionCall(buildFunctions, buildStepFunctionCall) {
119
- const functionId = getFunctionIdFromBuildStepFunctionCall(buildStepFunctionCall);
120
- const buildFunctionCallConfig = buildStepFunctionCall[functionId];
121
- const buildFunction = buildFunctions[functionId];
122
- const timeoutMs = buildFunctionCallConfig.timeout_minutes !== undefined
123
- ? buildFunctionCallConfig.timeout_minutes * 60 * 1000
124
- : undefined;
125
- return buildFunction.createBuildStepFromFunctionCall(this.ctx, {
126
- id: buildFunctionCallConfig.id,
127
- name: buildFunctionCallConfig.name,
128
- callInputs: buildFunctionCallConfig.inputs,
129
- workingDirectory: buildFunctionCallConfig.workingDirectory,
130
- shell: buildFunctionCallConfig.shell,
131
- env: buildFunctionCallConfig.env,
132
- ifCondition: buildFunctionCallConfig.if,
133
- timeoutMs,
134
- });
135
- }
136
- createBuildFunctionsFromConfig(buildFunctionsConfig) {
137
- if (!buildFunctionsConfig) {
138
- return {};
139
- }
140
- const result = {};
141
- for (const [functionId, buildFunctionConfig] of Object.entries(buildFunctionsConfig)) {
142
- const buildFunction = this.createBuildFunctionFromConfig({
143
- id: functionId,
144
- ...buildFunctionConfig,
145
- });
146
- result[buildFunction.getFullId()] = buildFunction;
147
- }
148
- return result;
149
- }
150
- createBuildFunctionFromConfig({ id, name, inputs: inputsConfig, outputs: outputsConfig, shell, command, supportedRuntimePlatforms, path: customFunctionModulePath, }) {
151
- const inputProviders = inputsConfig && this.createBuildStepInputProvidersFromBuildFunctionInputs(inputsConfig);
152
- const outputProviders = outputsConfig && this.createBuildStepOutputProvidersFromBuildFunctionOutputs(outputsConfig);
153
- return new BuildFunction({
154
- id,
155
- name,
156
- inputProviders,
157
- outputProviders,
158
- shell,
159
- command,
160
- customFunctionModulePath,
161
- supportedRuntimePlatforms,
162
- });
163
- }
164
- createBuildStepInputsFromDefinition(buildStepInputs, stepDisplayName) {
165
- return Object.entries(buildStepInputs).map(([key, value]) => new BuildStepInput(this.ctx, {
166
- id: key,
167
- stepDisplayName,
168
- defaultValue: value,
169
- required: true,
170
- allowedValueTypeName: typeof value === 'object'
171
- ? BuildStepInputValueTypeName.JSON
172
- : typeof value,
173
- }));
174
- }
175
- createBuildStepInputProvidersFromBuildFunctionInputs(buildFunctionInputs) {
176
- return buildFunctionInputs.map((entry) => {
177
- var _a;
178
- return typeof entry === 'string'
179
- ? BuildStepInput.createProvider({
180
- id: entry,
181
- required: true,
182
- allowedValueTypeName: BuildStepInputValueTypeName.STRING,
183
- })
184
- : BuildStepInput.createProvider({
185
- id: entry.name,
186
- required: (_a = entry.required) !== null && _a !== void 0 ? _a : true,
187
- defaultValue: entry.defaultValue,
188
- allowedValues: entry.allowedValues,
189
- allowedValueTypeName: entry.allowedValueType,
190
- });
191
- });
192
- }
193
- createBuildStepOutputsFromDefinition(buildStepOutputs, stepDisplayName) {
194
- return buildStepOutputs.map((entry) => {
195
- var _a;
196
- return typeof entry === 'string'
197
- ? new BuildStepOutput(this.ctx, { id: entry, stepDisplayName, required: true })
198
- : new BuildStepOutput(this.ctx, {
199
- id: entry.name,
200
- stepDisplayName,
201
- required: (_a = entry.required) !== null && _a !== void 0 ? _a : true,
202
- });
203
- });
204
- }
205
- createBuildStepOutputProvidersFromBuildFunctionOutputs(buildFunctionOutputs) {
206
- return buildFunctionOutputs.map((entry) => {
207
- var _a;
208
- return typeof entry === 'string'
209
- ? BuildStepOutput.createProvider({ id: entry, required: true })
210
- : BuildStepOutput.createProvider({ id: entry.name, required: (_a = entry.required) !== null && _a !== void 0 ? _a : true });
211
- });
212
- }
213
- mergeBuildFunctionsWithExternal(configFunctions, externalFunctions) {
214
- const result = { ...configFunctions };
215
- if (externalFunctions === undefined) {
216
- return result;
217
- }
218
- for (const buildFunction of externalFunctions) {
219
- // functions defined in config shadow the external ones
220
- const fullId = buildFunction.getFullId();
221
- if (!(fullId in result)) {
222
- result[fullId] = buildFunction;
223
- }
224
- }
225
- return result;
226
- }
227
- }
228
- function getFunctionIdFromBuildStepFunctionCall(buildStepFunctionCall) {
229
- const keys = Object.keys(buildStepFunctionCall);
230
- assert(keys.length === 1, 'There must be at most one function call in the step (enforced by joi).');
231
- return keys[0];
232
- }
233
- //# sourceMappingURL=BuildConfigParser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BuildConfigParser.js","sourceRoot":"","sources":["../src/BuildConfigParser.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert';\n\nimport {\n BuildConfig,\n BuildFunctionConfig,\n BuildFunctionInputs,\n BuildFunctionOutputs,\n BuildStepBareCommandRun,\n BuildStepBareFunctionOrFunctionGroupCall,\n BuildStepCommandRun,\n BuildStepConfig,\n BuildStepFunctionCall,\n BuildStepInputs,\n BuildStepOutputs,\n isBuildStepBareCommandRun,\n isBuildStepBareFunctionOrFunctionGroupCall,\n isBuildStepCommandRun,\n readAndValidateBuildConfigFromPathAsync,\n} from './BuildConfig.js';\nimport { BuildFunction, BuildFunctionById } from './BuildFunction.js';\nimport { BuildStep } from './BuildStep.js';\nimport {\n BuildStepInput,\n BuildStepInputProvider,\n BuildStepInputValueTypeName,\n} from './BuildStepInput.js';\nimport { BuildStepGlobalContext } from './BuildStepContext.js';\nimport { BuildStepOutput, BuildStepOutputProvider } from './BuildStepOutput.js';\nimport { BuildConfigError } from './errors.js';\nimport {\n BuildFunctionGroup,\n BuildFunctionGroupById,\n createBuildFunctionGroupByIdMapping,\n} from './BuildFunctionGroup.js';\nimport { AbstractConfigParser } from './AbstractConfigParser.js';\n\nexport class BuildConfigParser extends AbstractConfigParser {\n private readonly configPath: string;\n constructor(\n ctx: BuildStepGlobalContext,\n {\n configPath,\n externalFunctions,\n externalFunctionGroups,\n }: {\n configPath: string;\n externalFunctions?: BuildFunction[];\n externalFunctionGroups?: BuildFunctionGroup[];\n }\n ) {\n super(ctx, {\n externalFunctions,\n externalFunctionGroups,\n });\n\n this.configPath = configPath;\n }\n\n protected async parseConfigToBuildStepsAndBuildFunctionByIdMappingAsync(): Promise<{\n buildSteps: BuildStep[];\n buildFunctionById: BuildFunctionById;\n }> {\n const config = await readAndValidateBuildConfigFromPathAsync(this.configPath, {\n externalFunctionIds: this.getExternalFunctionFullIds(),\n externalFunctionGroupsIds: this.getExternalFunctionGroupFullIds(),\n });\n const configBuildFunctions = this.createBuildFunctionsFromConfig(config.functions);\n const buildFunctions = this.mergeBuildFunctionsWithExternal(\n configBuildFunctions,\n this.externalFunctions\n );\n const buildFunctionGroups = createBuildFunctionGroupByIdMapping(\n this.externalFunctionGroups ?? []\n );\n const buildSteps: BuildStep[] = [];\n for (const stepConfig of config.build.steps) {\n buildSteps.push(\n ...this.createBuildStepFromConfig(stepConfig, buildFunctions, buildFunctionGroups)\n );\n }\n return {\n buildSteps,\n buildFunctionById: buildFunctions,\n };\n }\n\n private createBuildStepFromConfig(\n buildStepConfig: BuildStepConfig,\n buildFunctions: BuildFunctionById,\n buildFunctionGroups: BuildFunctionGroupById\n ): BuildStep[] {\n if (isBuildStepCommandRun(buildStepConfig)) {\n return [this.createBuildStepFromBuildStepCommandRun(buildStepConfig)];\n } else if (isBuildStepBareCommandRun(buildStepConfig)) {\n return [this.createBuildStepFromBuildStepBareCommandRun(buildStepConfig)];\n } else if (isBuildStepBareFunctionOrFunctionGroupCall(buildStepConfig)) {\n return this.createBuildStepsFromBareBuildStepFunctionOrBareBuildStepFunctionGroupCall(\n buildFunctions,\n buildFunctionGroups,\n buildStepConfig\n );\n } else if (buildStepConfig !== null) {\n return this.createBuildStepsFromBuildStepFunctionOrBuildStepFunctionGroupCall(\n buildFunctions,\n buildFunctionGroups,\n buildStepConfig\n );\n } else {\n throw new BuildConfigError(\n 'Invalid build step configuration detected. Build step cannot be empty.'\n );\n }\n }\n\n private createBuildStepFromBuildStepCommandRun({ run }: BuildStepCommandRun): BuildStep {\n const {\n id: maybeId,\n inputs: inputsConfig,\n outputs: outputsConfig,\n name,\n workingDirectory,\n shell,\n command,\n env,\n if: ifCondition,\n timeout_minutes,\n __metrics_id,\n } = run;\n const id = BuildStep.getNewId(maybeId);\n const displayName = BuildStep.getDisplayName({ id, name, command });\n const inputs =\n inputsConfig && this.createBuildStepInputsFromDefinition(inputsConfig, displayName);\n const outputs =\n outputsConfig && this.createBuildStepOutputsFromDefinition(outputsConfig, displayName);\n const timeoutMs = timeout_minutes !== undefined ? timeout_minutes * 60 * 1000 : undefined;\n return new BuildStep(this.ctx, {\n id,\n inputs,\n outputs,\n name,\n displayName,\n workingDirectory,\n shell,\n command,\n env,\n ifCondition,\n timeoutMs,\n __metricsId: __metrics_id,\n });\n }\n\n private createBuildStepFromBuildStepBareCommandRun({\n run: command,\n }: BuildStepBareCommandRun): BuildStep {\n const id = BuildStep.getNewId();\n const displayName = BuildStep.getDisplayName({ id, command });\n return new BuildStep(this.ctx, {\n id,\n displayName,\n command,\n });\n }\n\n private createBuildStepsFromBuildStepFunctionGroupCall(\n buildFunctionGroups: BuildFunctionGroupById,\n buildStepFunctionCall: BuildStepFunctionCall\n ): BuildStep[] {\n const functionId = getFunctionIdFromBuildStepFunctionCall(buildStepFunctionCall);\n const buildFunctionGroup = buildFunctionGroups[functionId];\n assert(buildFunctionGroup, `Build function group with id \"${functionId}\" is not defined.`);\n return buildFunctionGroup.createBuildStepsFromFunctionGroupCall(this.ctx, {\n callInputs: buildStepFunctionCall[functionId].inputs,\n });\n }\n\n private createBuildStepsFromBuildStepBareFunctionGroupCall(\n buildFunctionGroups: BuildFunctionGroupById,\n functionGroupId: string\n ): BuildStep[] {\n const buildFunctionGroup = buildFunctionGroups[functionGroupId];\n assert(buildFunctionGroup, `Build function group with id \"${functionGroupId}\" is not defined.`);\n return buildFunctionGroup.createBuildStepsFromFunctionGroupCall(this.ctx);\n }\n\n private createBuildStepFromBuildStepBareFunctionCall(\n buildFunctions: BuildFunctionById,\n functionId: BuildStepBareFunctionOrFunctionGroupCall\n ): BuildStep {\n const buildFunction = buildFunctions[functionId];\n return buildFunction.createBuildStepFromFunctionCall(this.ctx);\n }\n\n private createBuildStepsFromBareBuildStepFunctionOrBareBuildStepFunctionGroupCall(\n buildFunctions: BuildFunctionById,\n buildFunctionGroups: BuildFunctionGroupById,\n functionOrFunctionGroupId: string\n ): BuildStep[] {\n const maybeFunctionGroup = buildFunctionGroups[functionOrFunctionGroupId];\n if (maybeFunctionGroup) {\n return this.createBuildStepsFromBuildStepBareFunctionGroupCall(\n buildFunctionGroups,\n functionOrFunctionGroupId\n );\n }\n return [\n this.createBuildStepFromBuildStepBareFunctionCall(buildFunctions, functionOrFunctionGroupId),\n ];\n }\n\n private createBuildStepsFromBuildStepFunctionOrBuildStepFunctionGroupCall(\n buildFunctions: BuildFunctionById,\n buildFunctionGroups: BuildFunctionGroupById,\n buildStepFunctionCall: BuildStepFunctionCall\n ): BuildStep[] {\n const functionId = getFunctionIdFromBuildStepFunctionCall(buildStepFunctionCall);\n\n const maybeFunctionGroup = buildFunctionGroups[functionId];\n if (maybeFunctionGroup) {\n return this.createBuildStepsFromBuildStepFunctionGroupCall(\n buildFunctionGroups,\n buildStepFunctionCall\n );\n }\n return [this.createBuildStepFromBuildStepFunctionCall(buildFunctions, buildStepFunctionCall)];\n }\n\n private createBuildStepFromBuildStepFunctionCall(\n buildFunctions: BuildFunctionById,\n buildStepFunctionCall: BuildStepFunctionCall\n ): BuildStep {\n const functionId = getFunctionIdFromBuildStepFunctionCall(buildStepFunctionCall);\n const buildFunctionCallConfig = buildStepFunctionCall[functionId];\n const buildFunction = buildFunctions[functionId];\n const timeoutMs =\n buildFunctionCallConfig.timeout_minutes !== undefined\n ? buildFunctionCallConfig.timeout_minutes * 60 * 1000\n : undefined;\n return buildFunction.createBuildStepFromFunctionCall(this.ctx, {\n id: buildFunctionCallConfig.id,\n name: buildFunctionCallConfig.name,\n callInputs: buildFunctionCallConfig.inputs,\n workingDirectory: buildFunctionCallConfig.workingDirectory,\n shell: buildFunctionCallConfig.shell,\n env: buildFunctionCallConfig.env,\n ifCondition: buildFunctionCallConfig.if,\n timeoutMs,\n });\n }\n\n private createBuildFunctionsFromConfig(\n buildFunctionsConfig: BuildConfig['functions']\n ): BuildFunctionById {\n if (!buildFunctionsConfig) {\n return {};\n }\n const result: BuildFunctionById = {};\n for (const [functionId, buildFunctionConfig] of Object.entries(buildFunctionsConfig)) {\n const buildFunction = this.createBuildFunctionFromConfig({\n id: functionId,\n ...buildFunctionConfig,\n });\n result[buildFunction.getFullId()] = buildFunction;\n }\n return result;\n }\n\n private createBuildFunctionFromConfig({\n id,\n name,\n inputs: inputsConfig,\n outputs: outputsConfig,\n shell,\n command,\n supportedRuntimePlatforms,\n path: customFunctionModulePath,\n }: BuildFunctionConfig & { id: string }): BuildFunction {\n const inputProviders =\n inputsConfig && this.createBuildStepInputProvidersFromBuildFunctionInputs(inputsConfig);\n const outputProviders =\n outputsConfig && this.createBuildStepOutputProvidersFromBuildFunctionOutputs(outputsConfig);\n return new BuildFunction({\n id,\n name,\n inputProviders,\n outputProviders,\n shell,\n command,\n customFunctionModulePath,\n supportedRuntimePlatforms,\n });\n }\n\n private createBuildStepInputsFromDefinition(\n buildStepInputs: BuildStepInputs,\n stepDisplayName: string\n ): BuildStepInput[] {\n return Object.entries(buildStepInputs).map(\n ([key, value]) =>\n new BuildStepInput(this.ctx, {\n id: key,\n stepDisplayName,\n defaultValue: value,\n required: true,\n allowedValueTypeName:\n typeof value === 'object'\n ? BuildStepInputValueTypeName.JSON\n : (typeof value as BuildStepInputValueTypeName),\n })\n );\n }\n\n private createBuildStepInputProvidersFromBuildFunctionInputs(\n buildFunctionInputs: BuildFunctionInputs\n ): BuildStepInputProvider[] {\n return buildFunctionInputs.map((entry) => {\n return typeof entry === 'string'\n ? BuildStepInput.createProvider({\n id: entry,\n required: true,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n })\n : BuildStepInput.createProvider({\n id: entry.name,\n required: entry.required ?? true,\n defaultValue: entry.defaultValue,\n allowedValues: entry.allowedValues,\n allowedValueTypeName: entry.allowedValueType,\n });\n });\n }\n\n private createBuildStepOutputsFromDefinition(\n buildStepOutputs: BuildStepOutputs,\n stepDisplayName: string\n ): BuildStepOutput[] {\n return buildStepOutputs.map((entry) =>\n typeof entry === 'string'\n ? new BuildStepOutput(this.ctx, { id: entry, stepDisplayName, required: true })\n : new BuildStepOutput(this.ctx, {\n id: entry.name,\n stepDisplayName,\n required: entry.required ?? true,\n })\n );\n }\n\n private createBuildStepOutputProvidersFromBuildFunctionOutputs(\n buildFunctionOutputs: BuildFunctionOutputs\n ): BuildStepOutputProvider[] {\n return buildFunctionOutputs.map((entry) =>\n typeof entry === 'string'\n ? BuildStepOutput.createProvider({ id: entry, required: true })\n : BuildStepOutput.createProvider({ id: entry.name, required: entry.required ?? true })\n );\n }\n\n private mergeBuildFunctionsWithExternal(\n configFunctions: BuildFunctionById,\n externalFunctions?: BuildFunction[]\n ): BuildFunctionById {\n const result: BuildFunctionById = { ...configFunctions };\n if (externalFunctions === undefined) {\n return result;\n }\n for (const buildFunction of externalFunctions) {\n // functions defined in config shadow the external ones\n const fullId = buildFunction.getFullId();\n if (!(fullId in result)) {\n result[fullId] = buildFunction;\n }\n }\n return result;\n }\n}\n\nfunction getFunctionIdFromBuildStepFunctionCall(\n buildStepFunctionCall: BuildStepFunctionCall\n): string {\n const keys = Object.keys(buildStepFunctionCall);\n assert(\n keys.length === 1,\n 'There must be at most one function call in the step (enforced by joi).'\n );\n return keys[0];\n}\n"]}