@expo/steps 1.0.8 → 1.0.11

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.
@@ -3,9 +3,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.isBuildStepBareFunctionCall = exports.isBuildStepFunctionCall = exports.isBuildStepBareCommandRun = exports.isBuildStepCommandRun = exports.validateBuildConfig = exports.readRawBuildConfigAsync = exports.readAndValidateBuildConfigAsync = exports.BuildConfigSchema = void 0;
6
+ exports.validateAllFunctionsExist = exports.isBuildStepBareFunctionCall = exports.isBuildStepFunctionCall = exports.isBuildStepBareCommandRun = exports.isBuildStepCommandRun = exports.mergeConfigWithImportedFunctions = exports.validateConfig = exports.readRawBuildConfigAsync = exports.readAndValidateBuildFunctionsConfigFileAsync = exports.readAndValidateBuildConfigAsync = exports.BuildConfigSchema = exports.BuildFunctionsConfigFileSchema = void 0;
7
7
  const assert_1 = __importDefault(require("assert"));
8
8
  const promises_1 = __importDefault(require("fs/promises"));
9
+ const path_1 = __importDefault(require("path"));
9
10
  const joi_1 = __importDefault(require("joi"));
10
11
  const yaml_1 = __importDefault(require("yaml"));
11
12
  const errors_js_1 = require("./errors.cjs");
@@ -65,40 +66,112 @@ const BuildFunctionConfigSchema = joi_1.default.object({
65
66
  command: joi_1.default.string().required(),
66
67
  shell: joi_1.default.string(),
67
68
  });
68
- exports.BuildConfigSchema = joi_1.default.object({
69
- build: joi_1.default.object({
70
- name: joi_1.default.string(),
71
- steps: joi_1.default.array().items(BuildStepConfigSchema.required()).required(),
72
- }).required(),
69
+ exports.BuildFunctionsConfigFileSchema = joi_1.default.object({
70
+ configFilesToImport: joi_1.default.array().items(joi_1.default.string().pattern(/\.y(a)?ml$/)),
73
71
  functions: joi_1.default.object().pattern(joi_1.default.string()
74
72
  .pattern(/^[\w-]+$/, 'function names')
75
73
  .min(1)
76
74
  .required()
77
75
  .disallow('run'), BuildFunctionConfigSchema.required()),
76
+ })
77
+ .rename('import', 'configFilesToImport')
78
+ .required();
79
+ exports.BuildConfigSchema = exports.BuildFunctionsConfigFileSchema.append({
80
+ build: joi_1.default.object({
81
+ name: joi_1.default.string(),
82
+ steps: joi_1.default.array().items(BuildStepConfigSchema.required()).required(),
83
+ }).required(),
78
84
  }).required();
79
85
  async function readAndValidateBuildConfigAsync(configPath, params = {}) {
80
86
  const rawConfig = await readRawBuildConfigAsync(configPath);
81
- return validateBuildConfig(rawConfig, params);
87
+ const config = validateConfig(exports.BuildConfigSchema, rawConfig);
88
+ const importedFunctions = await importFunctionsAsync(configPath, config.configFilesToImport);
89
+ mergeConfigWithImportedFunctions(config, importedFunctions);
90
+ validateAllFunctionsExist(config, params);
91
+ return config;
82
92
  }
83
93
  exports.readAndValidateBuildConfigAsync = readAndValidateBuildConfigAsync;
94
+ async function importFunctionsAsync(baseConfigPath, configPathsToImport) {
95
+ if (!configPathsToImport) {
96
+ return {};
97
+ }
98
+ const baseConfigDir = path_1.default.dirname(baseConfigPath);
99
+ const errors = [];
100
+ const importedFunctions = {};
101
+ // this is a set of visited files identified by ABSOLUTE paths
102
+ const visitedFiles = new Set([baseConfigPath]);
103
+ const configFilesToVisit = (configPathsToImport !== null && configPathsToImport !== void 0 ? configPathsToImport : []).map((childConfigRelativePath) => path_1.default.resolve(baseConfigDir, childConfigRelativePath));
104
+ while (configFilesToVisit.length > 0) {
105
+ const childConfigPath = configFilesToVisit.shift();
106
+ (0, assert_1.default)(childConfigPath, 'Guaranteed by loop condition');
107
+ if (visitedFiles.has(childConfigPath)) {
108
+ continue;
109
+ }
110
+ visitedFiles.add(childConfigPath);
111
+ try {
112
+ const childConfig = await readAndValidateBuildFunctionsConfigFileAsync(childConfigPath);
113
+ for (const functionName in childConfig.functions) {
114
+ if (!(functionName in importedFunctions)) {
115
+ importedFunctions[functionName] = childConfig.functions[functionName];
116
+ }
117
+ }
118
+ if (childConfig.configFilesToImport) {
119
+ const childDir = path_1.default.dirname(childConfigPath);
120
+ configFilesToVisit.push(...childConfig.configFilesToImport.map((relativePath) => path_1.default.resolve(childDir, relativePath)));
121
+ }
122
+ }
123
+ catch (err) {
124
+ if (err instanceof errors_js_1.BuildConfigError) {
125
+ errors.push(err);
126
+ }
127
+ else {
128
+ throw err;
129
+ }
130
+ }
131
+ }
132
+ if (errors.length > 0) {
133
+ throw new errors_js_1.BuildWorkflowError(`Detected build config errors in imported files.`, errors);
134
+ }
135
+ return importedFunctions;
136
+ }
137
+ async function readAndValidateBuildFunctionsConfigFileAsync(configPath) {
138
+ const rawConfig = await readRawBuildConfigAsync(configPath);
139
+ return validateConfig(exports.BuildFunctionsConfigFileSchema, rawConfig);
140
+ }
141
+ exports.readAndValidateBuildFunctionsConfigFileAsync = readAndValidateBuildFunctionsConfigFileAsync;
84
142
  async function readRawBuildConfigAsync(configPath) {
85
143
  const contents = await promises_1.default.readFile(configPath, 'utf-8');
86
144
  return yaml_1.default.parse(contents);
87
145
  }
88
146
  exports.readRawBuildConfigAsync = readRawBuildConfigAsync;
89
- function validateBuildConfig(rawConfig, params) {
90
- const { error, value: buildConfig } = exports.BuildConfigSchema.validate(rawConfig, {
147
+ function validateConfig(schema, config, configFilePath) {
148
+ const { error, value } = schema.validate(config, {
91
149
  allowUnknown: false,
92
150
  abortEarly: false,
93
151
  });
94
152
  if (error) {
95
153
  const errorMessage = error.details.map(({ message }) => message).join(', ');
96
- throw new errors_js_1.BuildConfigError(errorMessage, { cause: error });
154
+ throw new errors_js_1.BuildConfigError(errorMessage, {
155
+ cause: error,
156
+ ...(configFilePath && { metadata: { configFilePath } }),
157
+ });
158
+ }
159
+ return value;
160
+ }
161
+ exports.validateConfig = validateConfig;
162
+ function mergeConfigWithImportedFunctions(config, importedFunctions) {
163
+ var _a;
164
+ if (Object.keys(importedFunctions).length === 0) {
165
+ return;
166
+ }
167
+ config.functions = (_a = config.functions) !== null && _a !== void 0 ? _a : {};
168
+ for (const functionName in importedFunctions) {
169
+ if (!(functionName in config.functions)) {
170
+ config.functions[functionName] = importedFunctions[functionName];
171
+ }
97
172
  }
98
- validateAllFunctionsExist(buildConfig, params);
99
- return buildConfig;
100
173
  }
101
- exports.validateBuildConfig = validateBuildConfig;
174
+ exports.mergeConfigWithImportedFunctions = mergeConfigWithImportedFunctions;
102
175
  function isBuildStepCommandRun(step) {
103
176
  return typeof step === 'object' && typeof step.run === 'object';
104
177
  }
@@ -115,7 +188,7 @@ function isBuildStepBareFunctionCall(step) {
115
188
  return typeof step === 'string';
116
189
  }
117
190
  exports.isBuildStepBareFunctionCall = isBuildStepBareFunctionCall;
118
- function validateAllFunctionsExist(config, { externalFunctionIds = [], skipNamespacedFunctionsCheck } = {}) {
191
+ function validateAllFunctionsExist(config, { externalFunctionIds = [], skipNamespacedFunctionsCheck }) {
119
192
  const calledFunctionsSet = new Set();
120
193
  for (const step of config.build.steps) {
121
194
  if (typeof step === 'string') {
@@ -140,4 +213,5 @@ function validateAllFunctionsExist(config, { externalFunctionIds = [], skipNames
140
213
  throw new errors_js_1.BuildConfigError(`Calling non-existent functions: ${nonExistentFunctions.map((f) => `"${f}"`).join(', ')}.`);
141
214
  }
142
215
  }
216
+ exports.validateAllFunctionsExist = validateAllFunctionsExist;
143
217
  //# sourceMappingURL=BuildConfig.js.map
@@ -1,11 +1,15 @@
1
1
  import Joi from 'joi';
2
2
  import { BuildPlatform } from './BuildPlatform.js';
3
- export interface BuildConfig {
3
+ export type BuildFunctions = Record<string, BuildFunctionConfig>;
4
+ interface BuildFunctionsConfigFile {
5
+ configFilesToImport?: string[];
6
+ functions?: BuildFunctions;
7
+ }
8
+ export interface BuildConfig extends BuildFunctionsConfigFile {
4
9
  build: {
5
10
  name?: string;
6
11
  steps: BuildStepConfig[];
7
12
  };
8
- functions?: Record<string, BuildFunctionConfig>;
9
13
  }
10
14
  export type BuildStepConfig = BuildStepCommandRun | BuildStepBareCommandRun | BuildStepFunctionCall | BuildStepBareFunctionCall;
11
15
  export type BuildStepCommandRun = {
@@ -48,16 +52,20 @@ export type BuildFunctionInputs = (string | {
48
52
  required?: boolean;
49
53
  })[];
50
54
  export type BuildFunctionOutputs = BuildStepOutputs;
55
+ export declare const BuildFunctionsConfigFileSchema: Joi.ObjectSchema<BuildFunctionsConfigFile>;
51
56
  export declare const BuildConfigSchema: Joi.ObjectSchema<BuildConfig>;
52
57
  interface BuildConfigValidationParams {
53
58
  externalFunctionIds?: string[];
54
59
  skipNamespacedFunctionsCheck?: boolean;
55
60
  }
56
61
  export declare function readAndValidateBuildConfigAsync(configPath: string, params?: BuildConfigValidationParams): Promise<BuildConfig>;
62
+ export declare function readAndValidateBuildFunctionsConfigFileAsync(configPath: string): Promise<BuildFunctionsConfigFile>;
57
63
  export declare function readRawBuildConfigAsync(configPath: string): Promise<any>;
58
- export declare function validateBuildConfig(rawConfig: object, params: BuildConfigValidationParams): BuildConfig;
64
+ export declare function validateConfig<T>(schema: Joi.ObjectSchema<T>, config: object, configFilePath?: string): T;
65
+ export declare function mergeConfigWithImportedFunctions(config: BuildConfig, importedFunctions: BuildFunctions): void;
59
66
  export declare function isBuildStepCommandRun(step: BuildStepConfig): step is BuildStepCommandRun;
60
67
  export declare function isBuildStepBareCommandRun(step: BuildStepConfig): step is BuildStepBareCommandRun;
61
68
  export declare function isBuildStepFunctionCall(step: BuildStepConfig): step is BuildStepFunctionCall;
62
69
  export declare function isBuildStepBareFunctionCall(step: BuildStepConfig): step is BuildStepBareFunctionCall;
70
+ export declare function validateAllFunctionsExist(config: BuildConfig, { externalFunctionIds, skipNamespacedFunctionsCheck }: BuildConfigValidationParams): void;
63
71
  export {};
@@ -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';\n\nimport Joi from 'joi';\nimport YAML from 'yaml';\n\nimport { BuildConfigError } from './errors.js';\nimport { BuildPlatform } from './BuildPlatform.js';\nimport { BuildFunction } from './BuildFunction.js';\n\nexport interface BuildConfig {\n build: {\n name?: string;\n steps: BuildStepConfig[];\n };\n functions?: Record<string, BuildFunctionConfig>;\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>;\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 platforms?: BuildPlatform[];\n shell?: string;\n command: string;\n}\n\nexport type BuildFunctionInputs = (\n | string\n | {\n name: string;\n defaultValue?: string;\n allowedValues?: string[];\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.string()\n .valid(Joi.in('allowedValues'))\n .messages({ 'any.only': '{{#label}} must be one of allowed values' }),\n otherwise: Joi.string(),\n }),\n allowedValues: Joi.array().items(Joi.string()),\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.string()),\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 platforms: Joi.string().allow(...Object.values(BuildPlatform)),\n inputs: BuildFunctionInputsSchema,\n outputs: BuildStepOutputsSchema,\n command: Joi.string().required(),\n shell: Joi.string(),\n});\n\nexport const BuildConfigSchema = Joi.object<BuildConfig>({\n build: Joi.object({\n name: Joi.string(),\n steps: Joi.array().items(BuildStepConfigSchema.required()).required(),\n }).required(),\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}).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 return validateBuildConfig(rawConfig, params);\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 validateBuildConfig(\n rawConfig: object,\n params: BuildConfigValidationParams\n): BuildConfig {\n const { error, value: buildConfig } = BuildConfigSchema.validate(rawConfig, {\n allowUnknown: false,\n abortEarly: false,\n });\n if (error) {\n const errorMessage = error.details.map(({ message }) => message).join(', ');\n throw new BuildConfigError(errorMessage, { cause: error });\n }\n validateAllFunctionsExist(buildConfig, params);\n return buildConfig;\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\nfunction 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 { BuildPlatform } from './BuildPlatform.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>;\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 platforms?: BuildPlatform[];\n shell?: string;\n command: string;\n}\n\nexport type BuildFunctionInputs = (\n | string\n | {\n name: string;\n defaultValue?: string;\n allowedValues?: string[];\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.string()\n .valid(Joi.in('allowedValues'))\n .messages({ 'any.only': '{{#label}} must be one of allowed values' }),\n otherwise: Joi.string(),\n }),\n allowedValues: Joi.array().items(Joi.string()),\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.string()),\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 platforms: Joi.string().allow(...Object.values(BuildPlatform)),\n inputs: BuildFunctionInputsSchema,\n outputs: BuildStepOutputsSchema,\n command: Joi.string().required(),\n shell: Joi.string(),\n});\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,15 @@
1
1
  import Joi from 'joi';
2
2
  import { BuildPlatform } from './BuildPlatform.js';
3
- export interface BuildConfig {
3
+ export type BuildFunctions = Record<string, BuildFunctionConfig>;
4
+ interface BuildFunctionsConfigFile {
5
+ configFilesToImport?: string[];
6
+ functions?: BuildFunctions;
7
+ }
8
+ export interface BuildConfig extends BuildFunctionsConfigFile {
4
9
  build: {
5
10
  name?: string;
6
11
  steps: BuildStepConfig[];
7
12
  };
8
- functions?: Record<string, BuildFunctionConfig>;
9
13
  }
10
14
  export type BuildStepConfig = BuildStepCommandRun | BuildStepBareCommandRun | BuildStepFunctionCall | BuildStepBareFunctionCall;
11
15
  export type BuildStepCommandRun = {
@@ -48,16 +52,20 @@ export type BuildFunctionInputs = (string | {
48
52
  required?: boolean;
49
53
  })[];
50
54
  export type BuildFunctionOutputs = BuildStepOutputs;
55
+ export declare const BuildFunctionsConfigFileSchema: Joi.ObjectSchema<BuildFunctionsConfigFile>;
51
56
  export declare const BuildConfigSchema: Joi.ObjectSchema<BuildConfig>;
52
57
  interface BuildConfigValidationParams {
53
58
  externalFunctionIds?: string[];
54
59
  skipNamespacedFunctionsCheck?: boolean;
55
60
  }
56
61
  export declare function readAndValidateBuildConfigAsync(configPath: string, params?: BuildConfigValidationParams): Promise<BuildConfig>;
62
+ export declare function readAndValidateBuildFunctionsConfigFileAsync(configPath: string): Promise<BuildFunctionsConfigFile>;
57
63
  export declare function readRawBuildConfigAsync(configPath: string): Promise<any>;
58
- export declare function validateBuildConfig(rawConfig: object, params: BuildConfigValidationParams): BuildConfig;
64
+ export declare function validateConfig<T>(schema: Joi.ObjectSchema<T>, config: object, configFilePath?: string): T;
65
+ export declare function mergeConfigWithImportedFunctions(config: BuildConfig, importedFunctions: BuildFunctions): void;
59
66
  export declare function isBuildStepCommandRun(step: BuildStepConfig): step is BuildStepCommandRun;
60
67
  export declare function isBuildStepBareCommandRun(step: BuildStepConfig): step is BuildStepBareCommandRun;
61
68
  export declare function isBuildStepFunctionCall(step: BuildStepConfig): step is BuildStepFunctionCall;
62
69
  export declare function isBuildStepBareFunctionCall(step: BuildStepConfig): step is BuildStepBareFunctionCall;
70
+ export declare function validateAllFunctionsExist(config: BuildConfig, { externalFunctionIds, skipNamespacedFunctionsCheck }: BuildConfigValidationParams): void;
63
71
  export {};
@@ -1,8 +1,9 @@
1
1
  import assert from 'assert';
2
2
  import fs from 'fs/promises';
3
+ import path from 'path';
3
4
  import Joi from 'joi';
4
5
  import YAML from 'yaml';
5
- import { BuildConfigError } from './errors.js';
6
+ import { BuildConfigError, BuildWorkflowError } from './errors.js';
6
7
  import { BuildPlatform } from './BuildPlatform.js';
7
8
  import { BuildFunction } from './BuildFunction.js';
8
9
  const BuildFunctionInputsSchema = Joi.array().items(Joi.alternatives().try(Joi.string().required(), Joi.object({
@@ -59,36 +60,106 @@ const BuildFunctionConfigSchema = Joi.object({
59
60
  command: Joi.string().required(),
60
61
  shell: Joi.string(),
61
62
  });
62
- export const BuildConfigSchema = Joi.object({
63
- build: Joi.object({
64
- name: Joi.string(),
65
- steps: Joi.array().items(BuildStepConfigSchema.required()).required(),
66
- }).required(),
63
+ export const BuildFunctionsConfigFileSchema = Joi.object({
64
+ configFilesToImport: Joi.array().items(Joi.string().pattern(/\.y(a)?ml$/)),
67
65
  functions: Joi.object().pattern(Joi.string()
68
66
  .pattern(/^[\w-]+$/, 'function names')
69
67
  .min(1)
70
68
  .required()
71
69
  .disallow('run'), BuildFunctionConfigSchema.required()),
70
+ })
71
+ .rename('import', 'configFilesToImport')
72
+ .required();
73
+ export const BuildConfigSchema = BuildFunctionsConfigFileSchema.append({
74
+ build: Joi.object({
75
+ name: Joi.string(),
76
+ steps: Joi.array().items(BuildStepConfigSchema.required()).required(),
77
+ }).required(),
72
78
  }).required();
73
79
  export async function readAndValidateBuildConfigAsync(configPath, params = {}) {
74
80
  const rawConfig = await readRawBuildConfigAsync(configPath);
75
- return validateBuildConfig(rawConfig, params);
81
+ const config = validateConfig(BuildConfigSchema, rawConfig);
82
+ const importedFunctions = await importFunctionsAsync(configPath, config.configFilesToImport);
83
+ mergeConfigWithImportedFunctions(config, importedFunctions);
84
+ validateAllFunctionsExist(config, params);
85
+ return config;
86
+ }
87
+ async function importFunctionsAsync(baseConfigPath, configPathsToImport) {
88
+ if (!configPathsToImport) {
89
+ return {};
90
+ }
91
+ const baseConfigDir = path.dirname(baseConfigPath);
92
+ const errors = [];
93
+ const importedFunctions = {};
94
+ // this is a set of visited files identified by ABSOLUTE paths
95
+ const visitedFiles = new Set([baseConfigPath]);
96
+ const configFilesToVisit = (configPathsToImport !== null && configPathsToImport !== void 0 ? configPathsToImport : []).map((childConfigRelativePath) => path.resolve(baseConfigDir, childConfigRelativePath));
97
+ while (configFilesToVisit.length > 0) {
98
+ const childConfigPath = configFilesToVisit.shift();
99
+ assert(childConfigPath, 'Guaranteed by loop condition');
100
+ if (visitedFiles.has(childConfigPath)) {
101
+ continue;
102
+ }
103
+ visitedFiles.add(childConfigPath);
104
+ try {
105
+ const childConfig = await readAndValidateBuildFunctionsConfigFileAsync(childConfigPath);
106
+ for (const functionName in childConfig.functions) {
107
+ if (!(functionName in importedFunctions)) {
108
+ importedFunctions[functionName] = childConfig.functions[functionName];
109
+ }
110
+ }
111
+ if (childConfig.configFilesToImport) {
112
+ const childDir = path.dirname(childConfigPath);
113
+ configFilesToVisit.push(...childConfig.configFilesToImport.map((relativePath) => path.resolve(childDir, relativePath)));
114
+ }
115
+ }
116
+ catch (err) {
117
+ if (err instanceof BuildConfigError) {
118
+ errors.push(err);
119
+ }
120
+ else {
121
+ throw err;
122
+ }
123
+ }
124
+ }
125
+ if (errors.length > 0) {
126
+ throw new BuildWorkflowError(`Detected build config errors in imported files.`, errors);
127
+ }
128
+ return importedFunctions;
129
+ }
130
+ export async function readAndValidateBuildFunctionsConfigFileAsync(configPath) {
131
+ const rawConfig = await readRawBuildConfigAsync(configPath);
132
+ return validateConfig(BuildFunctionsConfigFileSchema, rawConfig);
76
133
  }
77
134
  export async function readRawBuildConfigAsync(configPath) {
78
135
  const contents = await fs.readFile(configPath, 'utf-8');
79
136
  return YAML.parse(contents);
80
137
  }
81
- export function validateBuildConfig(rawConfig, params) {
82
- const { error, value: buildConfig } = BuildConfigSchema.validate(rawConfig, {
138
+ export function validateConfig(schema, config, configFilePath) {
139
+ const { error, value } = schema.validate(config, {
83
140
  allowUnknown: false,
84
141
  abortEarly: false,
85
142
  });
86
143
  if (error) {
87
144
  const errorMessage = error.details.map(({ message }) => message).join(', ');
88
- throw new BuildConfigError(errorMessage, { cause: error });
145
+ throw new BuildConfigError(errorMessage, {
146
+ cause: error,
147
+ ...(configFilePath && { metadata: { configFilePath } }),
148
+ });
149
+ }
150
+ return value;
151
+ }
152
+ export function mergeConfigWithImportedFunctions(config, importedFunctions) {
153
+ var _a;
154
+ if (Object.keys(importedFunctions).length === 0) {
155
+ return;
156
+ }
157
+ config.functions = (_a = config.functions) !== null && _a !== void 0 ? _a : {};
158
+ for (const functionName in importedFunctions) {
159
+ if (!(functionName in config.functions)) {
160
+ config.functions[functionName] = importedFunctions[functionName];
161
+ }
89
162
  }
90
- validateAllFunctionsExist(buildConfig, params);
91
- return buildConfig;
92
163
  }
93
164
  export function isBuildStepCommandRun(step) {
94
165
  return typeof step === 'object' && typeof step.run === 'object';
@@ -102,7 +173,7 @@ export function isBuildStepFunctionCall(step) {
102
173
  export function isBuildStepBareFunctionCall(step) {
103
174
  return typeof step === 'string';
104
175
  }
105
- function validateAllFunctionsExist(config, { externalFunctionIds = [], skipNamespacedFunctionsCheck } = {}) {
176
+ export function validateAllFunctionsExist(config, { externalFunctionIds = [], skipNamespacedFunctionsCheck }) {
106
177
  const calledFunctionsSet = new Set();
107
178
  for (const step of config.build.steps) {
108
179
  if (typeof step === 'string') {
@@ -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';\n\nimport Joi from 'joi';\nimport YAML from 'yaml';\n\nimport { BuildConfigError } from './errors.js';\nimport { BuildPlatform } from './BuildPlatform.js';\nimport { BuildFunction } from './BuildFunction.js';\n\nexport interface BuildConfig {\n build: {\n name?: string;\n steps: BuildStepConfig[];\n };\n functions?: Record<string, BuildFunctionConfig>;\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>;\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 platforms?: BuildPlatform[];\n shell?: string;\n command: string;\n}\n\nexport type BuildFunctionInputs = (\n | string\n | {\n name: string;\n defaultValue?: string;\n allowedValues?: string[];\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.string()\n .valid(Joi.in('allowedValues'))\n .messages({ 'any.only': '{{#label}} must be one of allowed values' }),\n otherwise: Joi.string(),\n }),\n allowedValues: Joi.array().items(Joi.string()),\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.string()),\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 platforms: Joi.string().allow(...Object.values(BuildPlatform)),\n inputs: BuildFunctionInputsSchema,\n outputs: BuildStepOutputsSchema,\n command: Joi.string().required(),\n shell: Joi.string(),\n});\n\nexport const BuildConfigSchema = Joi.object<BuildConfig>({\n build: Joi.object({\n name: Joi.string(),\n steps: Joi.array().items(BuildStepConfigSchema.required()).required(),\n }).required(),\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}).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 return validateBuildConfig(rawConfig, params);\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 validateBuildConfig(\n rawConfig: object,\n params: BuildConfigValidationParams\n): BuildConfig {\n const { error, value: buildConfig } = BuildConfigSchema.validate(rawConfig, {\n allowUnknown: false,\n abortEarly: false,\n });\n if (error) {\n const errorMessage = error.details.map(({ message }) => message).join(', ');\n throw new BuildConfigError(errorMessage, { cause: error });\n }\n validateAllFunctionsExist(buildConfig, params);\n return buildConfig;\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\nfunction 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 { BuildPlatform } from './BuildPlatform.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>;\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 platforms?: BuildPlatform[];\n shell?: string;\n command: string;\n}\n\nexport type BuildFunctionInputs = (\n | string\n | {\n name: string;\n defaultValue?: string;\n allowedValues?: string[];\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.string()\n .valid(Joi.in('allowedValues'))\n .messages({ 'any.only': '{{#label}} must be one of allowed values' }),\n otherwise: Joi.string(),\n }),\n allowedValues: Joi.array().items(Joi.string()),\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.string()),\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 platforms: Joi.string().allow(...Object.values(BuildPlatform)),\n inputs: BuildFunctionInputsSchema,\n outputs: BuildStepOutputsSchema,\n command: Joi.string().required(),\n shell: Joi.string(),\n});\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"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@expo/steps",
3
3
  "type": "module",
4
- "version": "1.0.8",
4
+ "version": "1.0.11",
5
5
  "main": "./dist_commonjs/index.cjs",
6
6
  "types": "./dist_esm/index.d.ts",
7
7
  "exports": {
@@ -58,5 +58,5 @@
58
58
  "node": "18.13.0",
59
59
  "yarn": "1.22.19"
60
60
  },
61
- "gitHead": "5f3390f8af135e407fab67af0ce59ca3e53ccdd8"
61
+ "gitHead": "740e67d17f77b90df11cb1373b6200c151fd5cd7"
62
62
  }