@expo/steps 1.0.21 → 1.0.25

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 (76) hide show
  1. package/bin/set-env +23 -0
  2. package/dist_commonjs/BuildConfig.cjs +62 -15
  3. package/dist_commonjs/BuildConfig.d.ts +7 -3
  4. package/dist_commonjs/BuildConfig.js.map +1 -1
  5. package/dist_commonjs/BuildConfigParser.cjs +7 -1
  6. package/dist_commonjs/BuildConfigParser.d.ts +2 -2
  7. package/dist_commonjs/BuildConfigParser.js.map +1 -1
  8. package/dist_commonjs/BuildFunction.cjs +2 -1
  9. package/dist_commonjs/BuildFunction.d.ts +6 -4
  10. package/dist_commonjs/BuildFunction.js.map +1 -1
  11. package/dist_commonjs/BuildStep.cjs +49 -22
  12. package/dist_commonjs/BuildStep.d.ts +7 -4
  13. package/dist_commonjs/BuildStep.js.map +1 -1
  14. package/dist_commonjs/BuildStepContext.cjs +50 -13
  15. package/dist_commonjs/BuildStepContext.d.ts +35 -10
  16. package/dist_commonjs/BuildStepContext.js.map +1 -1
  17. package/dist_commonjs/BuildStepInput.cjs +72 -4
  18. package/dist_commonjs/BuildStepInput.d.ts +24 -9
  19. package/dist_commonjs/BuildStepInput.js.map +1 -1
  20. package/dist_commonjs/BuildStepOutput.d.ts +3 -3
  21. package/dist_commonjs/BuildStepOutput.js.map +1 -1
  22. package/dist_commonjs/BuildTemporaryFiles.cjs +11 -2
  23. package/dist_commonjs/BuildTemporaryFiles.d.ts +5 -4
  24. package/dist_commonjs/BuildTemporaryFiles.js.map +1 -1
  25. package/dist_commonjs/BuildWorkflow.cjs +2 -2
  26. package/dist_commonjs/BuildWorkflow.d.ts +3 -4
  27. package/dist_commonjs/BuildWorkflow.js.map +1 -1
  28. package/dist_commonjs/BuildWorkflowValidator.cjs +18 -2
  29. package/dist_commonjs/BuildWorkflowValidator.js.map +1 -1
  30. package/dist_commonjs/cli/cli.cjs +22 -3
  31. package/dist_commonjs/cli/cli.d.ts +16 -1
  32. package/dist_commonjs/cli/cli.js.map +1 -1
  33. package/dist_commonjs/index.cjs +3 -2
  34. package/dist_commonjs/index.d.ts +3 -2
  35. package/dist_commonjs/index.js.map +1 -1
  36. package/dist_commonjs/utils/template.cjs +40 -8
  37. package/dist_commonjs/utils/template.d.ts +5 -1
  38. package/dist_commonjs/utils/template.js.map +1 -1
  39. package/dist_esm/BuildConfig.d.ts +7 -3
  40. package/dist_esm/BuildConfig.js +62 -15
  41. package/dist_esm/BuildConfig.js.map +1 -1
  42. package/dist_esm/BuildConfigParser.d.ts +2 -2
  43. package/dist_esm/BuildConfigParser.js +8 -2
  44. package/dist_esm/BuildConfigParser.js.map +1 -1
  45. package/dist_esm/BuildFunction.d.ts +6 -4
  46. package/dist_esm/BuildFunction.js +2 -1
  47. package/dist_esm/BuildFunction.js.map +1 -1
  48. package/dist_esm/BuildStep.d.ts +7 -4
  49. package/dist_esm/BuildStep.js +50 -23
  50. package/dist_esm/BuildStep.js.map +1 -1
  51. package/dist_esm/BuildStepContext.d.ts +35 -10
  52. package/dist_esm/BuildStepContext.js +49 -13
  53. package/dist_esm/BuildStepContext.js.map +1 -1
  54. package/dist_esm/BuildStepInput.d.ts +24 -9
  55. package/dist_esm/BuildStepInput.js +72 -4
  56. package/dist_esm/BuildStepInput.js.map +1 -1
  57. package/dist_esm/BuildStepOutput.d.ts +3 -3
  58. package/dist_esm/BuildStepOutput.js.map +1 -1
  59. package/dist_esm/BuildTemporaryFiles.d.ts +5 -4
  60. package/dist_esm/BuildTemporaryFiles.js +9 -1
  61. package/dist_esm/BuildTemporaryFiles.js.map +1 -1
  62. package/dist_esm/BuildWorkflow.d.ts +3 -4
  63. package/dist_esm/BuildWorkflow.js +2 -2
  64. package/dist_esm/BuildWorkflow.js.map +1 -1
  65. package/dist_esm/BuildWorkflowValidator.js +18 -2
  66. package/dist_esm/BuildWorkflowValidator.js.map +1 -1
  67. package/dist_esm/cli/cli.d.ts +16 -1
  68. package/dist_esm/cli/cli.js +21 -4
  69. package/dist_esm/cli/cli.js.map +1 -1
  70. package/dist_esm/index.d.ts +3 -2
  71. package/dist_esm/index.js +2 -2
  72. package/dist_esm/index.js.map +1 -1
  73. package/dist_esm/utils/template.d.ts +5 -1
  74. package/dist_esm/utils/template.js +35 -8
  75. package/dist_esm/utils/template.js.map +1 -1
  76. package/package.json +4 -2
@@ -1 +1 @@
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 { BuildFunction } from './BuildFunction.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 | BuildStepBareFunctionCall;\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 BuildStepBareFunctionCall = string;\n\nexport type BuildFunctionCallConfig = {\n id?: string;\n inputs?: BuildStepInputs;\n name?: string;\n workingDirectory?: string;\n shell?: string;\n};\n\nexport type BuildStepInputs = Record<string, string | boolean>;\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}\n\nexport type BuildFunctionInputs = (\n | string\n | {\n name: string;\n defaultValue?: string | boolean;\n allowedValues?: (string | boolean)[];\n required?: boolean;\n }\n)[];\nexport type BuildFunctionOutputs = BuildStepOutputs;\n\nconst BuildFunctionInputsSchema = Joi.array().items(\n Joi.alternatives().try(\n Joi.string().required(),\n Joi.object({\n name: Joi.string().required(),\n defaultValue: Joi.alternatives().conditional('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 otherwise: Joi.alternatives().try(Joi.string(), Joi.boolean()),\n }),\n allowedValues: Joi.array().items(Joi.string(), Joi.boolean()),\n required: Joi.boolean(),\n })\n .rename('allowed_values', 'allowedValues')\n .rename('default_value', 'defaultValue')\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(Joi.string(), Joi.alternatives().try(Joi.string(), Joi.boolean())),\n name: Joi.string(),\n workingDirectory: Joi.string(),\n shell: Joi.string(),\n}).rename('working_directory', 'workingDirectory');\n\nconst BuildStepConfigSchema = Joi.any<BuildStepConfig>()\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().required(),\n shell: Joi.string(),\n}).rename('supported_platforms', 'supportedRuntimePlatforms');\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 skipNamespacedFunctionsCheck?: boolean;\n}\n\nexport async function readAndValidateBuildConfigAsync(\n configPath: string,\n params: BuildConfigValidationParams = {}\n): Promise<BuildConfig> {\n const rawConfig = await readRawBuildConfigAsync(configPath);\n\n const config = validateConfig(BuildConfigSchema, rawConfig);\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 for (const functionName in childConfig.functions) {\n if (!(functionName in importedFunctions)) {\n importedFunctions[functionName] = childConfig.functions[functionName];\n }\n }\n if (childConfig.configFilesToImport) {\n const childDir = path.dirname(childConfigPath);\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 typeof step === 'object' && typeof step.run === 'object';\n}\n\nexport function isBuildStepBareCommandRun(step: BuildStepConfig): step is BuildStepBareCommandRun {\n return typeof step === 'object' && typeof step.run === 'string';\n}\n\nexport function isBuildStepFunctionCall(step: BuildStepConfig): step is BuildStepFunctionCall {\n return typeof step === 'object' && !('run' in step);\n}\n\nexport function isBuildStepBareFunctionCall(\n step: BuildStepConfig\n): step is BuildStepBareFunctionCall {\n return typeof step === 'string';\n}\n\nexport function validateAllFunctionsExist(\n config: BuildConfig,\n { externalFunctionIds = [], skipNamespacedFunctionsCheck }: BuildConfigValidationParams\n): void {\n const calledFunctionsSet = new Set<string>();\n for (const step of config.build.steps) {\n if (typeof step === 'string') {\n calledFunctionsSet.add(step);\n } else if (!('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 calledFunctionsSet.add(keys[0]);\n }\n }\n const calledFunctions = Array.from(calledFunctionsSet);\n const externalFunctionIdsSet = new Set(externalFunctionIds);\n const nonExistentFunctions = calledFunctions.filter((calledFunction) => {\n if (BuildFunction.isFulldIdNamespaced(calledFunction) && skipNamespacedFunctionsCheck) {\n return false;\n }\n return (\n !(calledFunction in (config.functions ?? {})) && !externalFunctionIdsSet.has(calledFunction)\n );\n });\n if (nonExistentFunctions.length > 0) {\n throw new BuildConfigError(\n `Calling non-existent functions: ${nonExistentFunctions.map((f) => `\"${f}\"`).join(', ')}.`\n );\n }\n}\n"]}
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 { BuildFunction } from './BuildFunction.js';\nimport { BuildStepInputValueType, BuildStepInputValueTypeName } 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 | BuildStepBareFunctionCall;\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 BuildStepBareFunctionCall = string;\n\nexport type BuildFunctionCallConfig = {\n id?: string;\n inputs?: BuildStepInputs;\n name?: string;\n workingDirectory?: string;\n shell?: string;\n env?: BuildStepEnv;\n};\n\nexport type BuildStepInputs = Record<string, BuildStepInputValueType>;\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}\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}).rename('working_directory', 'workingDirectory');\n\nconst BuildStepConfigSchema = Joi.any<BuildStepConfig>()\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().required(),\n shell: Joi.string(),\n}).rename('supported_platforms', 'supportedRuntimePlatforms');\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 skipNamespacedFunctionsCheck?: boolean;\n}\n\nexport async function readAndValidateBuildConfigAsync(\n configPath: string,\n params: BuildConfigValidationParams = {}\n): Promise<BuildConfig> {\n const rawConfig = await readRawBuildConfigAsync(configPath);\n\n const config = validateConfig(BuildConfigSchema, rawConfig);\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 for (const functionName in childConfig.functions) {\n if (!(functionName in importedFunctions)) {\n importedFunctions[functionName] = childConfig.functions[functionName];\n }\n }\n if (childConfig.configFilesToImport) {\n const childDir = path.dirname(childConfigPath);\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 typeof step === 'object' && typeof step.run === 'object';\n}\n\nexport function isBuildStepBareCommandRun(step: BuildStepConfig): step is BuildStepBareCommandRun {\n return typeof step === 'object' && typeof step.run === 'string';\n}\n\nexport function isBuildStepFunctionCall(step: BuildStepConfig): step is BuildStepFunctionCall {\n return typeof step === 'object' && !('run' in step);\n}\n\nexport function isBuildStepBareFunctionCall(\n step: BuildStepConfig\n): step is BuildStepBareFunctionCall {\n return typeof step === 'string';\n}\n\nexport function validateAllFunctionsExist(\n config: BuildConfig,\n { externalFunctionIds = [], skipNamespacedFunctionsCheck }: BuildConfigValidationParams\n): void {\n const calledFunctionsSet = new Set<string>();\n for (const step of config.build.steps) {\n if (typeof step === 'string') {\n calledFunctionsSet.add(step);\n } else if (!('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 calledFunctionsSet.add(keys[0]);\n }\n }\n const calledFunctions = Array.from(calledFunctionsSet);\n const externalFunctionIdsSet = new Set(externalFunctionIds);\n const nonExistentFunctions = calledFunctions.filter((calledFunction) => {\n if (BuildFunction.isFulldIdNamespaced(calledFunction) && skipNamespacedFunctionsCheck) {\n return false;\n }\n return (\n !(calledFunction in (config.functions ?? {})) && !externalFunctionIdsSet.has(calledFunction)\n );\n });\n if (nonExistentFunctions.length > 0) {\n throw new BuildConfigError(\n `Calling non-existent functions: ${nonExistentFunctions.map((f) => `\"${f}\"`).join(', ')}.`\n );\n }\n}\n"]}
@@ -1,11 +1,11 @@
1
1
  import { BuildFunction } from './BuildFunction.js';
2
- import { BuildStepContext } from './BuildStepContext.js';
2
+ import { BuildStepGlobalContext } from './BuildStepContext.js';
3
3
  import { BuildWorkflow } from './BuildWorkflow.js';
4
4
  export declare class BuildConfigParser {
5
5
  private readonly ctx;
6
6
  private readonly configPath;
7
7
  private readonly externalFunctions?;
8
- constructor(ctx: BuildStepContext, { configPath, externalFunctions }: {
8
+ constructor(ctx: BuildStepGlobalContext, { configPath, externalFunctions }: {
9
9
  configPath: string;
10
10
  externalFunctions?: BuildFunction[];
11
11
  });
@@ -2,7 +2,7 @@ import assert from 'assert';
2
2
  import { isBuildStepBareCommandRun, isBuildStepBareFunctionCall, isBuildStepCommandRun, readAndValidateBuildConfigAsync, } from './BuildConfig.js';
3
3
  import { BuildFunction } from './BuildFunction.js';
4
4
  import { BuildStep } from './BuildStep.js';
5
- import { BuildStepInput } from './BuildStepInput.js';
5
+ import { BuildStepInput, BuildStepInputValueTypeName, } from './BuildStepInput.js';
6
6
  import { BuildStepOutput } from './BuildStepOutput.js';
7
7
  import { BuildWorkflow } from './BuildWorkflow.js';
8
8
  import { BuildWorkflowValidator } from './BuildWorkflowValidator.js';
@@ -42,7 +42,7 @@ export class BuildConfigParser {
42
42
  }
43
43
  }
44
44
  createBuildStepFromBuildStepCommandRun({ run }) {
45
- const { id: maybeId, inputs: inputsConfig, outputs: outputsConfig, name, workingDirectory, shell, command, } = run;
45
+ const { id: maybeId, inputs: inputsConfig, outputs: outputsConfig, name, workingDirectory, shell, command, env, } = run;
46
46
  const id = BuildStep.getNewId(maybeId);
47
47
  const displayName = BuildStep.getDisplayName({ id, name, command });
48
48
  const inputs = inputsConfig && this.createBuildStepInputsFromDefinition(inputsConfig, displayName);
@@ -56,6 +56,7 @@ export class BuildConfigParser {
56
56
  workingDirectory,
57
57
  shell,
58
58
  command,
59
+ env,
59
60
  });
60
61
  }
61
62
  createBuildStepFromBuildStepBareCommandRun({ run: command, }) {
@@ -83,6 +84,7 @@ export class BuildConfigParser {
83
84
  callInputs: buildFunctionCallConfig.inputs,
84
85
  workingDirectory: buildFunctionCallConfig.workingDirectory,
85
86
  shell: buildFunctionCallConfig.shell,
87
+ env: buildFunctionCallConfig.env,
86
88
  });
87
89
  }
88
90
  createBuildFunctionsFromConfig(buildFunctionsConfig) {
@@ -118,6 +120,9 @@ export class BuildConfigParser {
118
120
  stepDisplayName,
119
121
  defaultValue: value,
120
122
  required: true,
123
+ allowedValueTypeName: typeof value === 'object'
124
+ ? BuildStepInputValueTypeName.JSON
125
+ : typeof value,
121
126
  }));
122
127
  }
123
128
  createBuildStepInputProvidersFromBuildFunctionInputs(buildFunctionInputs) {
@@ -130,6 +135,7 @@ export class BuildConfigParser {
130
135
  required: (_a = entry.required) !== null && _a !== void 0 ? _a : true,
131
136
  defaultValue: entry.defaultValue,
132
137
  allowedValues: entry.allowedValues,
138
+ allowedValueTypeName: entry.allowedValueType,
133
139
  });
134
140
  });
135
141
  }
@@ -1 +1 @@
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 BuildStepBareFunctionCall,\n BuildStepCommandRun,\n BuildStepConfig,\n BuildStepFunctionCall,\n BuildStepInputs,\n BuildStepOutputs,\n isBuildStepBareCommandRun,\n isBuildStepBareFunctionCall,\n isBuildStepCommandRun,\n readAndValidateBuildConfigAsync,\n} from './BuildConfig.js';\nimport { BuildFunction, BuildFunctionById } from './BuildFunction.js';\nimport { BuildStep } from './BuildStep.js';\nimport { BuildStepContext } from './BuildStepContext.js';\nimport { BuildStepInput, BuildStepInputProvider } from './BuildStepInput.js';\nimport { BuildStepOutput, BuildStepOutputProvider } from './BuildStepOutput.js';\nimport { BuildWorkflow } from './BuildWorkflow.js';\nimport { BuildWorkflowValidator } from './BuildWorkflowValidator.js';\nimport { BuildStepRuntimeError } from './errors.js';\nimport { duplicates } from './utils/expodash/duplicates.js';\nimport { uniq } from './utils/expodash/uniq.js';\n\nexport class BuildConfigParser {\n private readonly configPath: string;\n private readonly externalFunctions?: BuildFunction[];\n\n constructor(\n private readonly ctx: BuildStepContext,\n { configPath, externalFunctions }: { configPath: string; externalFunctions?: BuildFunction[] }\n ) {\n this.validateExternalFunctions(externalFunctions);\n\n this.configPath = configPath;\n this.externalFunctions = externalFunctions;\n }\n\n public async parseAsync(): Promise<BuildWorkflow> {\n const config = await readAndValidateBuildConfigAsync(this.configPath, {\n externalFunctionIds: this.getExternalFunctionFullIds(),\n });\n const configBuildFunctions = this.createBuildFunctionsFromConfig(config.functions);\n const buildFunctions = this.mergeBuildFunctionsWithExternal(\n configBuildFunctions,\n this.externalFunctions\n );\n const buildSteps = config.build.steps.map((stepConfig) =>\n this.createBuildStepFromConfig(stepConfig, buildFunctions)\n );\n const workflow = new BuildWorkflow(this.ctx, { buildSteps, buildFunctions });\n new BuildWorkflowValidator(workflow).validate();\n return workflow;\n }\n\n private createBuildStepFromConfig(\n buildStepConfig: BuildStepConfig,\n buildFunctions: BuildFunctionById\n ): BuildStep {\n if (isBuildStepCommandRun(buildStepConfig)) {\n return this.createBuildStepFromBuildStepCommandRun(buildStepConfig);\n } else if (isBuildStepBareCommandRun(buildStepConfig)) {\n return this.createBuildStepFromBuildStepBareCommandRun(buildStepConfig);\n } else if (isBuildStepBareFunctionCall(buildStepConfig)) {\n return this.createBuildStepFromBuildStepBareFunctionCall(buildFunctions, buildStepConfig);\n } else {\n return this.createBuildStepFromBuildStepFunctionCall(buildFunctions, buildStepConfig);\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 } = 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 return new BuildStep(this.ctx, {\n id,\n inputs,\n outputs,\n name,\n displayName,\n workingDirectory,\n shell,\n command,\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 createBuildStepFromBuildStepBareFunctionCall(\n buildFunctions: BuildFunctionById,\n functionId: BuildStepBareFunctionCall\n ): BuildStep {\n const buildFunction = buildFunctions[functionId];\n return buildFunction.createBuildStepFromFunctionCall(this.ctx);\n }\n\n private createBuildStepFromBuildStepFunctionCall(\n buildFunctions: BuildFunctionById,\n buildStepFunctionCall: BuildStepFunctionCall\n ): BuildStep {\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 const functionId = keys[0];\n const buildFunctionCallConfig = buildStepFunctionCall[functionId];\n const buildFunction = buildFunctions[functionId];\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 });\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 }: 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 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 })\n );\n }\n\n private createBuildStepInputProvidersFromBuildFunctionInputs(\n buildFunctionInputs: BuildFunctionInputs\n ): BuildStepInputProvider[] {\n return buildFunctionInputs.map((entry) => {\n return typeof entry === 'string'\n ? BuildStepInput.createProvider({ id: entry })\n : BuildStepInput.createProvider({\n id: entry.name,\n required: entry.required ?? true,\n defaultValue: entry.defaultValue,\n allowedValues: entry.allowedValues,\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 private validateExternalFunctions(externalFunctions?: BuildFunction[]): void {\n if (externalFunctions === undefined) {\n return;\n }\n const externalFunctionIds = externalFunctions.map((f) => f.getFullId());\n const duplicatedExternalFunctionIds = duplicates(externalFunctionIds);\n if (duplicatedExternalFunctionIds.length === 0) {\n return;\n }\n throw new BuildStepRuntimeError(\n `Provided external functions with duplicated IDs: ${duplicatedExternalFunctionIds\n .map((id) => `\"${id}\"`)\n .join(', ')}`\n );\n }\n\n private getExternalFunctionFullIds(): string[] {\n if (this.externalFunctions === undefined) {\n return [];\n }\n const ids = this.externalFunctions.map((f) => f.getFullId());\n return uniq(ids);\n }\n}\n"]}
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 BuildStepBareFunctionCall,\n BuildStepCommandRun,\n BuildStepConfig,\n BuildStepFunctionCall,\n BuildStepInputs,\n BuildStepOutputs,\n isBuildStepBareCommandRun,\n isBuildStepBareFunctionCall,\n isBuildStepCommandRun,\n readAndValidateBuildConfigAsync,\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 { BuildWorkflow } from './BuildWorkflow.js';\nimport { BuildWorkflowValidator } from './BuildWorkflowValidator.js';\nimport { BuildStepRuntimeError } from './errors.js';\nimport { duplicates } from './utils/expodash/duplicates.js';\nimport { uniq } from './utils/expodash/uniq.js';\n\nexport class BuildConfigParser {\n private readonly configPath: string;\n private readonly externalFunctions?: BuildFunction[];\n\n constructor(\n private readonly ctx: BuildStepGlobalContext,\n { configPath, externalFunctions }: { configPath: string; externalFunctions?: BuildFunction[] }\n ) {\n this.validateExternalFunctions(externalFunctions);\n\n this.configPath = configPath;\n this.externalFunctions = externalFunctions;\n }\n\n public async parseAsync(): Promise<BuildWorkflow> {\n const config = await readAndValidateBuildConfigAsync(this.configPath, {\n externalFunctionIds: this.getExternalFunctionFullIds(),\n });\n const configBuildFunctions = this.createBuildFunctionsFromConfig(config.functions);\n const buildFunctions = this.mergeBuildFunctionsWithExternal(\n configBuildFunctions,\n this.externalFunctions\n );\n const buildSteps = config.build.steps.map((stepConfig) =>\n this.createBuildStepFromConfig(stepConfig, buildFunctions)\n );\n const workflow = new BuildWorkflow(this.ctx, { buildSteps, buildFunctions });\n new BuildWorkflowValidator(workflow).validate();\n return workflow;\n }\n\n private createBuildStepFromConfig(\n buildStepConfig: BuildStepConfig,\n buildFunctions: BuildFunctionById\n ): BuildStep {\n if (isBuildStepCommandRun(buildStepConfig)) {\n return this.createBuildStepFromBuildStepCommandRun(buildStepConfig);\n } else if (isBuildStepBareCommandRun(buildStepConfig)) {\n return this.createBuildStepFromBuildStepBareCommandRun(buildStepConfig);\n } else if (isBuildStepBareFunctionCall(buildStepConfig)) {\n return this.createBuildStepFromBuildStepBareFunctionCall(buildFunctions, buildStepConfig);\n } else {\n return this.createBuildStepFromBuildStepFunctionCall(buildFunctions, buildStepConfig);\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 } = 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 return new BuildStep(this.ctx, {\n id,\n inputs,\n outputs,\n name,\n displayName,\n workingDirectory,\n shell,\n command,\n env,\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 createBuildStepFromBuildStepBareFunctionCall(\n buildFunctions: BuildFunctionById,\n functionId: BuildStepBareFunctionCall\n ): BuildStep {\n const buildFunction = buildFunctions[functionId];\n return buildFunction.createBuildStepFromFunctionCall(this.ctx);\n }\n\n private createBuildStepFromBuildStepFunctionCall(\n buildFunctions: BuildFunctionById,\n buildStepFunctionCall: BuildStepFunctionCall\n ): BuildStep {\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 const functionId = keys[0];\n const buildFunctionCallConfig = buildStepFunctionCall[functionId];\n const buildFunction = buildFunctions[functionId];\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 });\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 }: 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 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({ id: entry })\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 private validateExternalFunctions(externalFunctions?: BuildFunction[]): void {\n if (externalFunctions === undefined) {\n return;\n }\n const externalFunctionIds = externalFunctions.map((f) => f.getFullId());\n const duplicatedExternalFunctionIds = duplicates(externalFunctionIds);\n if (duplicatedExternalFunctionIds.length === 0) {\n return;\n }\n throw new BuildStepRuntimeError(\n `Provided external functions with duplicated IDs: ${duplicatedExternalFunctionIds\n .map((id) => `\"${id}\"`)\n .join(', ')}`\n );\n }\n\n private getExternalFunctionFullIds(): string[] {\n if (this.externalFunctions === undefined) {\n return [];\n }\n const ids = this.externalFunctions.map((f) => f.getFullId());\n return uniq(ids);\n }\n}\n"]}
@@ -1,10 +1,11 @@
1
1
  import { BuildRuntimePlatform } from './BuildRuntimePlatform.js';
2
2
  import { BuildStep, BuildStepFunction } from './BuildStep.js';
3
- import { BuildStepContext } from './BuildStepContext.js';
4
- import { BuildStepInputProvider } from './BuildStepInput.js';
3
+ import { BuildStepGlobalContext } from './BuildStepContext.js';
4
+ import { BuildStepInputProvider, BuildStepInputValueType } from './BuildStepInput.js';
5
5
  import { BuildStepOutputProvider } from './BuildStepOutput.js';
6
+ import { BuildStepEnv } from './BuildStepEnv.js';
6
7
  export type BuildFunctionById = Record<string, BuildFunction>;
7
- export type BuildFunctionCallInputs = Record<string, string | boolean>;
8
+ export type BuildFunctionCallInputs = Record<string, BuildStepInputValueType>;
8
9
  export declare class BuildFunction {
9
10
  readonly namespace?: string;
10
11
  readonly id: string;
@@ -28,11 +29,12 @@ export declare class BuildFunction {
28
29
  shell?: string;
29
30
  });
30
31
  getFullId(): string;
31
- createBuildStepFromFunctionCall(ctx: BuildStepContext, { id, name, callInputs, workingDirectory, shell, }?: {
32
+ createBuildStepFromFunctionCall(ctx: BuildStepGlobalContext, { id, name, callInputs, workingDirectory, shell, env, }?: {
32
33
  id?: string;
33
34
  name?: string;
34
35
  callInputs?: BuildFunctionCallInputs;
35
36
  workingDirectory?: string;
36
37
  shell?: string;
38
+ env?: BuildStepEnv;
37
39
  }): BuildStep;
38
40
  }
@@ -20,7 +20,7 @@ export class BuildFunction {
20
20
  getFullId() {
21
21
  return this.namespace === undefined ? this.id : `${this.namespace}/${this.id}`;
22
22
  }
23
- createBuildStepFromFunctionCall(ctx, { id, name, callInputs = {}, workingDirectory, shell, } = {}) {
23
+ createBuildStepFromFunctionCall(ctx, { id, name, callInputs = {}, workingDirectory, shell, env, } = {}) {
24
24
  var _a, _b;
25
25
  const buildStepId = BuildStep.getNewId(id);
26
26
  const buildStepName = name !== null && name !== void 0 ? name : this.name;
@@ -48,6 +48,7 @@ export class BuildFunction {
48
48
  outputs,
49
49
  shell,
50
50
  supportedRuntimePlatforms: this.supportedRuntimePlatforms,
51
+ env,
51
52
  });
52
53
  }
53
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BuildFunction.js","sourceRoot":"","sources":["../src/BuildFunction.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,OAAO,EAAE,SAAS,EAAqB,MAAM,gBAAgB,CAAC;AAQ9D,MAAM,OAAO,aAAa;IAWjB,MAAM,CAAC,mBAAmB,CAAC,MAAc;QAC9C,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,YAAY,EACV,SAAS,EACT,EAAE,EACF,IAAI,EACJ,yBAAyB,EACzB,cAAc,EACd,eAAe,EACf,OAAO,EACP,EAAE,EACF,KAAK,GAWN;QACC,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,EAAE,uCAAuC,CAAC,CAAC;QAC3F,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,CAAC,EAAE,oCAAoC,CAAC,CAAC;QAE3F,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,yBAAyB,GAAG,yBAAyB,CAAC;QAC3D,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;IACjF,CAAC;IAEM,+BAA+B,CACpC,GAAqB,EACrB,EACE,EAAE,EACF,IAAI,EACJ,UAAU,GAAG,EAAE,EACf,gBAAgB,EAChB,KAAK,MAOH,EAAE;;QAEN,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,IAAI,CAAC,IAAI,CAAC;QACxC,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC;YACpD,EAAE,EAAE,WAAW;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,aAAa;SACpB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAA,IAAI,CAAC,cAAc,0CAAE,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE;YACxD,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAC9C,IAAI,KAAK,CAAC,EAAE,IAAI,UAAU,EAAE;gBAC1B,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;aACjC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAA,IAAI,CAAC,eAAe,0CAAE,GAAG,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;QAEhG,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE;YACxB,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,oBAAoB;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,gBAAgB;YAChB,MAAM;YACN,OAAO;YACP,KAAK;YACL,yBAAyB,EAAE,IAAI,CAAC,yBAAyB;SAC1D,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import assert from 'assert';\n\nimport { BuildRuntimePlatform } from './BuildRuntimePlatform.js';\nimport { BuildStep, BuildStepFunction } from './BuildStep.js';\nimport { BuildStepContext } from './BuildStepContext.js';\nimport { BuildStepInputProvider } from './BuildStepInput.js';\nimport { BuildStepOutputProvider } from './BuildStepOutput.js';\n\nexport type BuildFunctionById = Record<string, BuildFunction>;\nexport type BuildFunctionCallInputs = Record<string, string | boolean>;\n\nexport class BuildFunction {\n public readonly namespace?: string;\n public readonly id: string;\n public readonly name?: string;\n public readonly supportedRuntimePlatforms?: BuildRuntimePlatform[];\n public readonly inputProviders?: BuildStepInputProvider[];\n public readonly outputProviders?: BuildStepOutputProvider[];\n public readonly command?: string;\n public readonly fn?: BuildStepFunction;\n public readonly shell?: string;\n\n public static isFulldIdNamespaced(fullId: string): boolean {\n return fullId.includes('/');\n }\n\n constructor({\n namespace,\n id,\n name,\n supportedRuntimePlatforms,\n inputProviders,\n outputProviders,\n command,\n fn,\n shell,\n }: {\n namespace?: string;\n id: string;\n name?: string;\n supportedRuntimePlatforms?: BuildRuntimePlatform[];\n inputProviders?: BuildStepInputProvider[];\n outputProviders?: BuildStepOutputProvider[];\n command?: string;\n fn?: BuildStepFunction;\n shell?: string;\n }) {\n assert(command !== undefined || fn !== undefined, 'Either command or fn must be defined.');\n assert(!(command !== undefined && fn !== undefined), 'Command and fn cannot be both set.');\n\n this.namespace = namespace;\n this.id = id;\n this.name = name;\n this.supportedRuntimePlatforms = supportedRuntimePlatforms;\n this.inputProviders = inputProviders;\n this.outputProviders = outputProviders;\n this.command = command;\n this.fn = fn;\n this.shell = shell;\n }\n\n public getFullId(): string {\n return this.namespace === undefined ? this.id : `${this.namespace}/${this.id}`;\n }\n\n public createBuildStepFromFunctionCall(\n ctx: BuildStepContext,\n {\n id,\n name,\n callInputs = {},\n workingDirectory,\n shell,\n }: {\n id?: string;\n name?: string;\n callInputs?: BuildFunctionCallInputs;\n workingDirectory?: string;\n shell?: string;\n } = {}\n ): BuildStep {\n const buildStepId = BuildStep.getNewId(id);\n const buildStepName = name ?? this.name;\n const buildStepDisplayName = BuildStep.getDisplayName({\n id: buildStepId,\n command: this.command,\n name: buildStepName,\n });\n\n const inputs = this.inputProviders?.map((inputProvider) => {\n const input = inputProvider(ctx, buildStepId);\n if (input.id in callInputs) {\n input.set(callInputs[input.id]);\n }\n return input;\n });\n const outputs = this.outputProviders?.map((outputProvider) => outputProvider(ctx, buildStepId));\n\n return new BuildStep(ctx, {\n id: buildStepId,\n name: buildStepName,\n displayName: buildStepDisplayName,\n command: this.command,\n fn: this.fn,\n workingDirectory,\n inputs,\n outputs,\n shell,\n supportedRuntimePlatforms: this.supportedRuntimePlatforms,\n });\n }\n}\n"]}
1
+ {"version":3,"file":"BuildFunction.js","sourceRoot":"","sources":["../src/BuildFunction.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,OAAO,EAAE,SAAS,EAAqB,MAAM,gBAAgB,CAAC;AAS9D,MAAM,OAAO,aAAa;IAWjB,MAAM,CAAC,mBAAmB,CAAC,MAAc;QAC9C,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,YAAY,EACV,SAAS,EACT,EAAE,EACF,IAAI,EACJ,yBAAyB,EACzB,cAAc,EACd,eAAe,EACf,OAAO,EACP,EAAE,EACF,KAAK,GAWN;QACC,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,EAAE,uCAAuC,CAAC,CAAC;QAC3F,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,CAAC,EAAE,oCAAoC,CAAC,CAAC;QAE3F,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,yBAAyB,GAAG,yBAAyB,CAAC;QAC3D,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;IACjF,CAAC;IAEM,+BAA+B,CACpC,GAA2B,EAC3B,EACE,EAAE,EACF,IAAI,EACJ,UAAU,GAAG,EAAE,EACf,gBAAgB,EAChB,KAAK,EACL,GAAG,MAQD,EAAE;;QAEN,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,IAAI,CAAC,IAAI,CAAC;QACxC,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC;YACpD,EAAE,EAAE,WAAW;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,aAAa;SACpB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAA,IAAI,CAAC,cAAc,0CAAE,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE;YACxD,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAC9C,IAAI,KAAK,CAAC,EAAE,IAAI,UAAU,EAAE;gBAC1B,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;aACjC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAA,IAAI,CAAC,eAAe,0CAAE,GAAG,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;QAEhG,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE;YACxB,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,oBAAoB;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,gBAAgB;YAChB,MAAM;YACN,OAAO;YACP,KAAK;YACL,yBAAyB,EAAE,IAAI,CAAC,yBAAyB;YACzD,GAAG;SACJ,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import assert from 'assert';\n\nimport { BuildRuntimePlatform } from './BuildRuntimePlatform.js';\nimport { BuildStep, BuildStepFunction } from './BuildStep.js';\nimport { BuildStepGlobalContext } from './BuildStepContext.js';\nimport { BuildStepInputProvider, BuildStepInputValueType } from './BuildStepInput.js';\nimport { BuildStepOutputProvider } from './BuildStepOutput.js';\nimport { BuildStepEnv } from './BuildStepEnv.js';\n\nexport type BuildFunctionById = Record<string, BuildFunction>;\nexport type BuildFunctionCallInputs = Record<string, BuildStepInputValueType>;\n\nexport class BuildFunction {\n public readonly namespace?: string;\n public readonly id: string;\n public readonly name?: string;\n public readonly supportedRuntimePlatforms?: BuildRuntimePlatform[];\n public readonly inputProviders?: BuildStepInputProvider[];\n public readonly outputProviders?: BuildStepOutputProvider[];\n public readonly command?: string;\n public readonly fn?: BuildStepFunction;\n public readonly shell?: string;\n\n public static isFulldIdNamespaced(fullId: string): boolean {\n return fullId.includes('/');\n }\n\n constructor({\n namespace,\n id,\n name,\n supportedRuntimePlatforms,\n inputProviders,\n outputProviders,\n command,\n fn,\n shell,\n }: {\n namespace?: string;\n id: string;\n name?: string;\n supportedRuntimePlatforms?: BuildRuntimePlatform[];\n inputProviders?: BuildStepInputProvider[];\n outputProviders?: BuildStepOutputProvider[];\n command?: string;\n fn?: BuildStepFunction;\n shell?: string;\n }) {\n assert(command !== undefined || fn !== undefined, 'Either command or fn must be defined.');\n assert(!(command !== undefined && fn !== undefined), 'Command and fn cannot be both set.');\n\n this.namespace = namespace;\n this.id = id;\n this.name = name;\n this.supportedRuntimePlatforms = supportedRuntimePlatforms;\n this.inputProviders = inputProviders;\n this.outputProviders = outputProviders;\n this.command = command;\n this.fn = fn;\n this.shell = shell;\n }\n\n public getFullId(): string {\n return this.namespace === undefined ? this.id : `${this.namespace}/${this.id}`;\n }\n\n public createBuildStepFromFunctionCall(\n ctx: BuildStepGlobalContext,\n {\n id,\n name,\n callInputs = {},\n workingDirectory,\n shell,\n env,\n }: {\n id?: string;\n name?: string;\n callInputs?: BuildFunctionCallInputs;\n workingDirectory?: string;\n shell?: string;\n env?: BuildStepEnv;\n } = {}\n ): BuildStep {\n const buildStepId = BuildStep.getNewId(id);\n const buildStepName = name ?? this.name;\n const buildStepDisplayName = BuildStep.getDisplayName({\n id: buildStepId,\n command: this.command,\n name: buildStepName,\n });\n\n const inputs = this.inputProviders?.map((inputProvider) => {\n const input = inputProvider(ctx, buildStepId);\n if (input.id in callInputs) {\n input.set(callInputs[input.id]);\n }\n return input;\n });\n const outputs = this.outputProviders?.map((outputProvider) => outputProvider(ctx, buildStepId));\n\n return new BuildStep(ctx, {\n id: buildStepId,\n name: buildStepName,\n displayName: buildStepDisplayName,\n command: this.command,\n fn: this.fn,\n workingDirectory,\n inputs,\n outputs,\n shell,\n supportedRuntimePlatforms: this.supportedRuntimePlatforms,\n env,\n });\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { BuildStepContext } from './BuildStepContext.js';
1
+ import { BuildStepContext, BuildStepGlobalContext } from './BuildStepContext.js';
2
2
  import { BuildStepInput, BuildStepInputById } from './BuildStepInput.js';
3
3
  import { BuildStepOutput, BuildStepOutputById } from './BuildStepOutput.js';
4
4
  import { BuildStepEnv } from './BuildStepEnv.js';
@@ -31,6 +31,7 @@ export declare class BuildStep {
31
31
  readonly fn?: BuildStepFunction;
32
32
  readonly shell: string;
33
33
  readonly ctx: BuildStepContext;
34
+ readonly env: BuildStepEnv;
34
35
  status: BuildStepStatus;
35
36
  private readonly internalId;
36
37
  private readonly inputById;
@@ -42,7 +43,7 @@ export declare class BuildStep {
42
43
  name?: string;
43
44
  command?: string;
44
45
  }): string;
45
- constructor(ctx: BuildStepContext, { id, name, displayName, inputs, outputs, command, fn, workingDirectory: maybeWorkingDirectory, shell, supportedRuntimePlatforms: maybeSupportedRuntimePlatforms, }: {
46
+ constructor(ctx: BuildStepGlobalContext, { id, name, displayName, inputs, outputs, command, fn, workingDirectory: maybeWorkingDirectory, shell, supportedRuntimePlatforms: maybeSupportedRuntimePlatforms, env, }: {
46
47
  id: string;
47
48
  name?: string;
48
49
  displayName: string;
@@ -53,14 +54,16 @@ export declare class BuildStep {
53
54
  workingDirectory?: string;
54
55
  shell?: string;
55
56
  supportedRuntimePlatforms?: BuildRuntimePlatform[];
57
+ env?: BuildStepEnv;
56
58
  });
57
- executeAsync(env?: BuildStepEnv): Promise<void>;
59
+ executeAsync(): Promise<void>;
58
60
  hasOutputParameter(name: string): boolean;
59
61
  getOutputValueByName(name: string): string | undefined;
60
62
  canBeRunOnRuntimePlatform(): boolean;
61
63
  private executeCommandAsync;
62
64
  private exectuteFnAsync;
63
- private interpolateInputsInCommand;
65
+ private interpolateInputsAndGlobalContextInCommand;
64
66
  private collectAndValidateOutputsAsync;
67
+ private collectAndUpdateEnvsAsync;
65
68
  private getScriptEnv;
66
69
  }
@@ -6,7 +6,7 @@ import { makeBuildStepInputByIdMap } from './BuildStepInput.js';
6
6
  import { makeBuildStepOutputByIdMap, } from './BuildStepOutput.js';
7
7
  import { BIN_PATH } from './utils/shell/bin.js';
8
8
  import { getDefaultShell, getShellCommandAndArgs } from './utils/shell/command.js';
9
- import { cleanUpStepTemporaryDirectoriesAsync, createTemporaryOutputsDirectoryAsync, saveScriptToTemporaryFileAsync, } from './BuildTemporaryFiles.js';
9
+ import { cleanUpStepTemporaryDirectoriesAsync, createTemporaryEnvsDirectoryAsync, createTemporaryOutputsDirectoryAsync, saveScriptToTemporaryFileAsync, } from './BuildTemporaryFiles.js';
10
10
  import { spawnAsync } from './utils/shell/spawn.js';
11
11
  import { interpolateWithInputs } from './utils/template.js';
12
12
  import { BuildStepRuntimeError } from './errors.js';
@@ -48,7 +48,7 @@ export class BuildStep {
48
48
  }
49
49
  return id;
50
50
  }
51
- constructor(ctx, { id, name, displayName, inputs, outputs, command, fn, workingDirectory: maybeWorkingDirectory, shell, supportedRuntimePlatforms: maybeSupportedRuntimePlatforms, }) {
51
+ constructor(ctx, { id, name, displayName, inputs, outputs, command, fn, workingDirectory: maybeWorkingDirectory, shell, supportedRuntimePlatforms: maybeSupportedRuntimePlatforms, env, }) {
52
52
  this.executed = false;
53
53
  assert(command !== undefined || fn !== undefined, 'Either command or fn must be defined.');
54
54
  assert(!(command !== undefined && fn !== undefined), 'Command and fn cannot be both set.');
@@ -65,26 +65,27 @@ export class BuildStep {
65
65
  this.shell = shell !== null && shell !== void 0 ? shell : getDefaultShell();
66
66
  this.status = BuildStepStatus.NEW;
67
67
  this.internalId = uuidv4();
68
- const logger = ctx.logger.child({
68
+ const logger = ctx.baseLogger.child({
69
69
  buildStepInternalId: this.internalId,
70
70
  buildStepId: this.id,
71
71
  buildStepDisplayName: this.displayName,
72
72
  });
73
73
  const workingDirectory = maybeWorkingDirectory !== undefined
74
- ? path.resolve(ctx.workingDirectory, maybeWorkingDirectory)
75
- : ctx.workingDirectory;
76
- this.ctx = ctx.child({ logger, workingDirectory });
74
+ ? path.resolve(ctx.defaultWorkingDirectory, maybeWorkingDirectory)
75
+ : ctx.defaultWorkingDirectory;
76
+ this.ctx = ctx.stepCtx({ logger, workingDirectory });
77
+ this.env = env !== null && env !== void 0 ? env : {};
77
78
  ctx.registerStep(this);
78
79
  }
79
- async executeAsync(env = process.env) {
80
+ async executeAsync() {
80
81
  try {
81
82
  this.ctx.logger.info({ marker: BuildStepLogMarker.START_STEP }, `Executing build step "${this.displayName}"`);
82
83
  this.status = BuildStepStatus.IN_PROGRESS;
83
84
  if (this.command !== undefined) {
84
- await this.executeCommandAsync(env);
85
+ await this.executeCommandAsync();
85
86
  }
86
87
  else {
87
- await this.exectuteFnAsync(env);
88
+ await this.exectuteFnAsync();
88
89
  }
89
90
  this.ctx.logger.info({ marker: BuildStepLogMarker.END_STEP, result: BuildStepStatus.SUCCESS }, `Finished build step "${this.displayName}" successfully`);
90
91
  this.status = BuildStepStatus.SUCCESS;
@@ -113,46 +114,60 @@ export class BuildStep {
113
114
  }
114
115
  canBeRunOnRuntimePlatform() {
115
116
  return (!this.supportedRuntimePlatforms ||
116
- this.supportedRuntimePlatforms.includes(this.ctx.runtimePlatform));
117
+ this.supportedRuntimePlatforms.includes(this.ctx.global.runtimePlatform));
117
118
  }
118
- async executeCommandAsync(env) {
119
+ async executeCommandAsync() {
119
120
  assert(this.command, 'Command must be defined.');
120
121
  try {
121
- const command = this.interpolateInputsInCommand(this.command, this.inputs);
122
+ const command = this.interpolateInputsAndGlobalContextInCommand(this.command, this.inputs);
122
123
  this.ctx.logger.debug(`Interpolated inputs in the command template`);
123
- const outputsDir = await createTemporaryOutputsDirectoryAsync(this.ctx, this.id);
124
+ const outputsDir = await createTemporaryOutputsDirectoryAsync(this.ctx.global, this.id);
124
125
  this.ctx.logger.debug(`Created temporary directory for step outputs: ${outputsDir}`);
125
- const scriptPath = await saveScriptToTemporaryFileAsync(this.ctx, this.id, command);
126
+ const envsDir = await createTemporaryEnvsDirectoryAsync(this.ctx.global, this.id);
127
+ this.ctx.logger.debug(`Created temporary directory for step environment variables: ${outputsDir}`);
128
+ const scriptPath = await saveScriptToTemporaryFileAsync(this.ctx.global, this.id, command);
126
129
  this.ctx.logger.debug(`Saved script to ${scriptPath}`);
127
130
  const { command: shellCommand, args } = getShellCommandAndArgs(this.shell, scriptPath);
128
131
  this.ctx.logger.debug(`Executing script: ${shellCommand}${args !== undefined ? ` ${args.join(' ')}` : ''}`);
129
132
  await spawnAsync(shellCommand, args !== null && args !== void 0 ? args : [], {
130
133
  cwd: this.ctx.workingDirectory,
131
134
  logger: this.ctx.logger,
132
- env: this.getScriptEnv(env, outputsDir),
135
+ env: this.getScriptEnv({ outputsDir, envsDir }),
133
136
  });
134
137
  this.ctx.logger.debug(`Script completed successfully`);
135
138
  await this.collectAndValidateOutputsAsync(outputsDir);
139
+ await this.collectAndUpdateEnvsAsync(envsDir);
136
140
  this.ctx.logger.debug('Finished collecting output paramters');
137
141
  }
138
142
  finally {
139
- await cleanUpStepTemporaryDirectoriesAsync(this.ctx, this.id);
143
+ await cleanUpStepTemporaryDirectoriesAsync(this.ctx.global, this.id);
140
144
  }
141
145
  }
142
- async exectuteFnAsync(env) {
146
+ async exectuteFnAsync() {
143
147
  assert(this.fn, 'Function (fn) must be defined');
144
- await this.fn(this.ctx, { inputs: this.inputById, outputs: this.outputById, env });
148
+ await this.fn(this.ctx, {
149
+ inputs: this.inputById,
150
+ outputs: this.outputById,
151
+ env: {
152
+ ...this.ctx.global.env,
153
+ ...this.env,
154
+ },
155
+ });
145
156
  }
146
- interpolateInputsInCommand(command, inputs) {
157
+ interpolateInputsAndGlobalContextInCommand(command, inputs) {
147
158
  if (!inputs) {
148
159
  return command;
149
160
  }
150
161
  const vars = inputs.reduce((acc, input) => {
151
162
  var _a, _b;
152
- acc[input.id] = (_b = (_a = input.value) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '';
163
+ acc[input.id] =
164
+ typeof input.value === 'object'
165
+ ? JSON.stringify(input.value)
166
+ : (_b = (_a = input.value) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '';
153
167
  return acc;
154
168
  }, {});
155
- return interpolateWithInputs(command, vars);
169
+ const valueInterpolatedWithGlobalContext = this.ctx.global.interpolate(command);
170
+ return interpolateWithInputs(valueInterpolatedWithGlobalContext, vars);
156
171
  }
157
172
  async collectAndValidateOutputsAsync(outputsDir) {
158
173
  var _a;
@@ -191,14 +206,26 @@ export class BuildStep {
191
206
  });
192
207
  }
193
208
  }
194
- getScriptEnv(env, outputsDir) {
209
+ async collectAndUpdateEnvsAsync(envsDir) {
210
+ const filenames = await fs.readdir(envsDir);
211
+ const entries = await Promise.all(filenames.map(async (basename) => {
212
+ const rawContents = await fs.readFile(path.join(envsDir, basename), 'utf-8');
213
+ return [basename, rawContents];
214
+ }));
215
+ this.ctx.global.updateEnv({
216
+ ...this.ctx.global.env,
217
+ ...Object.fromEntries(entries),
218
+ });
219
+ }
220
+ getScriptEnv({ envsDir, outputsDir, }) {
195
221
  var _a;
222
+ const env = { ...this.ctx.global.env, ...this.env };
196
223
  const currentPath = (_a = env.PATH) !== null && _a !== void 0 ? _a : process.env.PATH;
197
224
  const newPath = currentPath ? `${BIN_PATH}:${currentPath}` : BIN_PATH;
198
225
  return {
199
226
  ...env,
200
- __EXPO_STEPS_BUILD_ID: this.ctx.buildId,
201
227
  __EXPO_STEPS_OUTPUTS_DIR: outputsDir,
228
+ __EXPO_STEPS_ENVS_DIR: envsDir,
202
229
  __EXPO_STEPS_WORKING_DIRECTORY: this.ctx.workingDirectory,
203
230
  PATH: newPath,
204
231
  };