appium 2.0.0-beta.45 → 2.0.0-beta.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +145 -44
- package/build/lib/appium.d.ts +3 -103
- package/build/lib/appium.d.ts.map +1 -1
- package/build/lib/appium.js +679 -549
- package/build/lib/appium.js.map +1 -1
- package/build/lib/cli/args.js +247 -127
- package/build/lib/cli/args.js.map +1 -1
- package/build/lib/cli/driver-command.js +63 -88
- package/build/lib/cli/driver-command.js.map +1 -1
- package/build/lib/cli/extension-command.d.ts +32 -23
- package/build/lib/cli/extension-command.d.ts.map +1 -1
- package/build/lib/cli/extension-command.js +730 -512
- package/build/lib/cli/extension-command.js.map +1 -1
- package/build/lib/cli/extension.d.ts +5 -4
- package/build/lib/cli/extension.d.ts.map +1 -1
- package/build/lib/cli/extension.js +68 -65
- package/build/lib/cli/extension.js.map +1 -1
- package/build/lib/cli/parser.d.ts +3 -3
- package/build/lib/cli/parser.d.ts.map +1 -1
- package/build/lib/cli/parser.js +234 -192
- package/build/lib/cli/parser.js.map +1 -1
- package/build/lib/cli/plugin-command.js +58 -87
- package/build/lib/cli/plugin-command.js.map +1 -1
- package/build/lib/cli/utils.js +66 -69
- package/build/lib/cli/utils.js.map +1 -1
- package/build/lib/config-file.d.ts.map +1 -1
- package/build/lib/config-file.js +189 -120
- package/build/lib/config-file.js.map +1 -1
- package/build/lib/config.d.ts.map +1 -1
- package/build/lib/config.js +254 -213
- package/build/lib/config.js.map +1 -1
- package/build/lib/constants.d.ts +5 -5
- package/build/lib/constants.d.ts.map +1 -1
- package/build/lib/constants.js +64 -59
- package/build/lib/constants.js.map +1 -1
- package/build/lib/extension/driver-config.js +199 -164
- package/build/lib/extension/driver-config.js.map +1 -1
- package/build/lib/extension/extension-config.d.ts +18 -16
- package/build/lib/extension/extension-config.d.ts.map +1 -1
- package/build/lib/extension/extension-config.js +523 -396
- package/build/lib/extension/extension-config.js.map +1 -1
- package/build/lib/extension/index.js +98 -68
- package/build/lib/extension/index.js.map +1 -1
- package/build/lib/extension/manifest-migrations.d.ts +27 -0
- package/build/lib/extension/manifest-migrations.d.ts.map +1 -0
- package/build/lib/extension/manifest-migrations.js +99 -0
- package/build/lib/extension/manifest-migrations.js.map +1 -0
- package/build/lib/extension/manifest.d.ts +7 -56
- package/build/lib/extension/manifest.d.ts.map +1 -1
- package/build/lib/extension/manifest.js +432 -240
- package/build/lib/extension/manifest.js.map +1 -1
- package/build/lib/extension/package-changed.js +57 -61
- package/build/lib/extension/package-changed.js.map +1 -1
- package/build/lib/extension/plugin-config.d.ts +2 -3
- package/build/lib/extension/plugin-config.d.ts.map +1 -1
- package/build/lib/extension/plugin-config.js +94 -70
- package/build/lib/extension/plugin-config.js.map +1 -1
- package/build/lib/grid-register.js +119 -137
- package/build/lib/grid-register.js.map +1 -1
- package/build/lib/logger.d.ts +1 -1
- package/build/lib/logger.d.ts.map +1 -1
- package/build/lib/logger.js +5 -15
- package/build/lib/logger.js.map +1 -1
- package/build/lib/logsink.d.ts.map +1 -1
- package/build/lib/logsink.js +189 -183
- package/build/lib/logsink.js.map +1 -1
- package/build/lib/main.d.ts +19 -12
- package/build/lib/main.d.ts.map +1 -1
- package/build/lib/main.js +330 -304
- package/build/lib/main.js.map +1 -1
- package/build/lib/schema/arg-spec.js +153 -108
- package/build/lib/schema/arg-spec.js.map +1 -1
- package/build/lib/schema/cli-args.js +203 -164
- package/build/lib/schema/cli-args.js.map +1 -1
- package/build/lib/schema/cli-transformers.js +117 -72
- package/build/lib/schema/cli-transformers.js.map +1 -1
- package/build/lib/schema/index.js +17 -32
- package/build/lib/schema/index.js.map +1 -1
- package/build/lib/schema/keywords.js +125 -67
- package/build/lib/schema/keywords.js.map +1 -1
- package/build/lib/schema/schema.d.ts.map +1 -1
- package/build/lib/schema/schema.js +582 -417
- package/build/lib/schema/schema.js.map +1 -1
- package/build/lib/utils.d.ts +41 -255
- package/build/lib/utils.d.ts.map +1 -1
- package/build/lib/utils.js +342 -193
- package/build/lib/utils.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/cli.d.ts +45 -34
- package/build/types/cli.d.ts.map +1 -1
- package/build/types/cli.js +3 -0
- package/build/types/cli.js.map +1 -0
- package/build/types/index.d.ts +1 -2
- package/build/types/index.d.ts.map +1 -1
- package/build/types/index.js +19 -0
- package/build/types/index.js.map +1 -0
- package/build/types/manifest/base.d.ts +135 -0
- package/build/types/manifest/base.d.ts.map +1 -0
- package/build/types/manifest/base.js +3 -0
- package/build/types/manifest/base.js.map +1 -0
- package/build/types/manifest/index.d.ts +19 -0
- package/build/types/manifest/index.d.ts.map +1 -0
- package/build/types/manifest/index.js +40 -0
- package/build/types/manifest/index.js.map +1 -0
- package/build/types/manifest/v3.d.ts +139 -0
- package/build/types/manifest/v3.d.ts.map +1 -0
- package/build/types/manifest/v3.js +3 -0
- package/build/types/manifest/v3.js.map +1 -0
- package/lib/appium.js +1 -1
- package/lib/cli/args.js +1 -1
- package/lib/cli/extension-command.js +116 -61
- package/lib/cli/extension.js +9 -8
- package/lib/cli/parser.js +2 -2
- package/lib/config-file.js +2 -3
- package/lib/config.js +3 -2
- package/lib/constants.js +6 -5
- package/lib/extension/extension-config.js +24 -25
- package/lib/extension/manifest-migrations.js +99 -0
- package/lib/extension/manifest.js +79 -72
- package/lib/extension/plugin-config.js +1 -2
- package/lib/logsink.js +26 -5
- package/lib/main.js +58 -50
- package/lib/schema/schema.js +6 -1
- package/lib/utils.js +62 -0
- package/package.json +23 -24
- package/scripts/autoinstall-extensions.js +78 -26
- package/types/cli.ts +81 -42
- package/types/index.ts +1 -2
- package/types/manifest/README.md +30 -0
- package/types/manifest/base.ts +158 -0
- package/types/manifest/index.ts +27 -0
- package/types/manifest/v3.ts +161 -0
- package/build/types/appium-manifest.d.ts +0 -59
- package/build/types/appium-manifest.d.ts.map +0 -1
- package/build/types/extension-manifest.d.ts +0 -55
- package/build/types/extension-manifest.d.ts.map +0 -1
- package/types/appium-manifest.ts +0 -73
- package/types/extension-manifest.ts +0 -64
package/build/lib/config-file.js
CHANGED
|
@@ -1,138 +1,207 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
exports.formatErrors =
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
require("
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
17
|
-
|
|
18
|
-
var _yaml = _interopRequireDefault(require("yaml"));
|
|
19
|
-
|
|
20
|
-
var _schema = require("./schema/schema");
|
|
21
|
-
|
|
22
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
|
-
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.normalizeConfig = exports.readConfigFile = exports.formatErrors = void 0;
|
|
7
|
+
const better_ajv_errors_1 = __importDefault(require("@sidvind/better-ajv-errors"));
|
|
8
|
+
const lilconfig_1 = require("lilconfig");
|
|
9
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
10
|
+
const yaml_1 = __importDefault(require("yaml"));
|
|
11
|
+
const schema_1 = require("./schema/schema");
|
|
12
|
+
/**
|
|
13
|
+
* lilconfig loader to handle `.yaml` files
|
|
14
|
+
* @type {import('lilconfig').LoaderSync}
|
|
15
|
+
*/
|
|
24
16
|
function yamlLoader(filepath, content) {
|
|
25
|
-
|
|
17
|
+
return yaml_1.default.parse(content);
|
|
26
18
|
}
|
|
27
|
-
|
|
19
|
+
/**
|
|
20
|
+
* A cache of the raw config file (a JSON string) at a filepath.
|
|
21
|
+
* This is used for better error reporting.
|
|
22
|
+
* Note that config files needn't be JSON, but it helps if they are.
|
|
23
|
+
* @type {Map<string,RawJson>}
|
|
24
|
+
*/
|
|
28
25
|
const rawConfig = new Map();
|
|
29
|
-
|
|
26
|
+
/**
|
|
27
|
+
* Custom JSON loader that caches the raw config file (for use with `better-ajv-errors`).
|
|
28
|
+
* If it weren't for this cache, this would be unnecessary.
|
|
29
|
+
* @type {import('lilconfig').LoaderSync}
|
|
30
|
+
*/
|
|
30
31
|
function jsonLoader(filepath, content) {
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
rawConfig.set(filepath, content);
|
|
33
|
+
return JSON.parse(content);
|
|
33
34
|
}
|
|
34
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Loads a config file from an explicit path
|
|
37
|
+
* @param {LilconfigAsyncSearcher} lc - lilconfig instance
|
|
38
|
+
* @param {string} filepath - Path to config file
|
|
39
|
+
* @returns {Promise<import('lilconfig').LilconfigResult>}
|
|
40
|
+
*/
|
|
35
41
|
async function loadConfigFile(lc, filepath) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
try {
|
|
43
|
+
// removing "await" will cause any rejection to _not_ be caught in this block!
|
|
44
|
+
return await lc.load(filepath);
|
|
45
|
+
}
|
|
46
|
+
catch ( /** @type {unknown} */err) {
|
|
47
|
+
if ( /** @type {NodeJS.ErrnoException} */(err).code === 'ENOENT') {
|
|
48
|
+
/** @type {NodeJS.ErrnoException} */ (err).message = `Config file not found at user-provided path: ${filepath}`;
|
|
49
|
+
throw err;
|
|
50
|
+
}
|
|
51
|
+
else if (err instanceof SyntaxError) {
|
|
52
|
+
// generally invalid JSON
|
|
53
|
+
err.message = `Config file at user-provided path ${filepath} is invalid:\n${err.message}`;
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
throw err;
|
|
45
57
|
}
|
|
46
|
-
|
|
47
|
-
throw err;
|
|
48
|
-
}
|
|
49
58
|
}
|
|
50
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Searches for a config file
|
|
61
|
+
* @param {LilconfigAsyncSearcher} lc - lilconfig instance
|
|
62
|
+
* @returns {Promise<import('lilconfig').LilconfigResult>}
|
|
63
|
+
*/
|
|
51
64
|
async function searchConfigFile(lc) {
|
|
52
|
-
|
|
65
|
+
return await lc.search();
|
|
53
66
|
}
|
|
54
|
-
|
|
67
|
+
/**
|
|
68
|
+
* Given an array of errors and the result of loading a config file, generate a
|
|
69
|
+
* helpful string for the user.
|
|
70
|
+
*
|
|
71
|
+
* - If `opts` contains a `json` property, this should be the original JSON
|
|
72
|
+
* _string_ of the config file. This is only applicable if the config file
|
|
73
|
+
* was in JSON format. If present, it will associate line numbers with errors.
|
|
74
|
+
* - If `errors` happens to be empty, this will throw.
|
|
75
|
+
* @param {import('ajv').ErrorObject[]} errors - Non-empty array of errors. Required.
|
|
76
|
+
* @param {ReadConfigFileResult['config']|any} [config] -
|
|
77
|
+
* Configuration & metadata
|
|
78
|
+
* @param {FormatConfigErrorsOptions} [opts]
|
|
79
|
+
* @throws {TypeError} If `errors` is empty
|
|
80
|
+
* @returns {string}
|
|
81
|
+
*/
|
|
55
82
|
function formatErrors(errors = [], config = {}, opts = {}) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
});
|
|
83
|
+
if (errors && !errors.length) {
|
|
84
|
+
throw new TypeError('Array of errors must be non-empty');
|
|
85
|
+
}
|
|
86
|
+
return (0, better_ajv_errors_1.default)((0, schema_1.getSchema)(opts.schemaId), config, errors, {
|
|
87
|
+
json: opts.json,
|
|
88
|
+
format: 'cli',
|
|
89
|
+
});
|
|
64
90
|
}
|
|
65
|
-
|
|
91
|
+
exports.formatErrors = formatErrors;
|
|
92
|
+
/**
|
|
93
|
+
* Given an optional path, read a config file. Validates the config file.
|
|
94
|
+
*
|
|
95
|
+
* Call {@link validate} if you already have a config object.
|
|
96
|
+
* @param {string} [filepath] - Path to config file, if we have one
|
|
97
|
+
* @param {ReadConfigFileOptions} [opts] - Options
|
|
98
|
+
* @public
|
|
99
|
+
* @returns {Promise<ReadConfigFileResult>} Contains config and filepath, if found, and any errors
|
|
100
|
+
*/
|
|
66
101
|
async function readConfigFile(filepath, opts = {}) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
errors
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
configResult.config = normalizeConfig(configResult.config);
|
|
105
|
-
return configResult;
|
|
106
|
-
} finally {
|
|
107
|
-
rawConfig.delete(result.filepath);
|
|
102
|
+
const lc = (0, lilconfig_1.lilconfig)('appium', {
|
|
103
|
+
loaders: {
|
|
104
|
+
'.yaml': yamlLoader,
|
|
105
|
+
'.yml': yamlLoader,
|
|
106
|
+
'.json': jsonLoader,
|
|
107
|
+
noExt: jsonLoader,
|
|
108
|
+
},
|
|
109
|
+
packageProp: 'appiumConfig',
|
|
110
|
+
});
|
|
111
|
+
const result = filepath ? await loadConfigFile(lc, filepath) : await searchConfigFile(lc);
|
|
112
|
+
if (result?.filepath && !result?.isEmpty) {
|
|
113
|
+
const { pretty = true } = opts;
|
|
114
|
+
try {
|
|
115
|
+
let configResult;
|
|
116
|
+
const errors = (0, schema_1.validate)(result.config);
|
|
117
|
+
if (lodash_1.default.isEmpty(errors)) {
|
|
118
|
+
configResult = { ...result, errors };
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
const reason = formatErrors(errors, result.config, {
|
|
122
|
+
json: rawConfig.get(result.filepath),
|
|
123
|
+
pretty,
|
|
124
|
+
});
|
|
125
|
+
configResult = reason ? { ...result, errors, reason } : { ...result, errors };
|
|
126
|
+
}
|
|
127
|
+
// normalize (to camel case) all top-level property names of the config file
|
|
128
|
+
configResult.config = normalizeConfig(/** @type {AppiumConfig} */ (configResult.config));
|
|
129
|
+
return configResult;
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
// clean up the raw config file cache, which is only kept to better report errors.
|
|
133
|
+
rawConfig.delete(result.filepath);
|
|
134
|
+
}
|
|
108
135
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
return result ?? {};
|
|
136
|
+
return result ?? {};
|
|
112
137
|
}
|
|
113
|
-
|
|
138
|
+
exports.readConfigFile = readConfigFile;
|
|
139
|
+
/**
|
|
140
|
+
* Convert schema property names to either a) the value of the `appiumCliDest` property, if any; or b) camel-case
|
|
141
|
+
* @param {AppiumConfig} config - Configuration object
|
|
142
|
+
* @returns {NormalizedAppiumConfig} New object with camel-cased keys (or `dest` keys).
|
|
143
|
+
*/
|
|
114
144
|
function normalizeConfig(config) {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
145
|
+
const schema = (0, schema_1.getSchema)();
|
|
146
|
+
/**
|
|
147
|
+
* @param {AppiumConfig} config
|
|
148
|
+
* @param {string} [section] - Keypath (lodash `_.get()` style) to section of config. If omitted, assume root Appium config schema
|
|
149
|
+
* @todo Rewrite as a loop
|
|
150
|
+
* @returns Normalized section of config
|
|
151
|
+
*/
|
|
152
|
+
const normalize = (config, section) => {
|
|
153
|
+
const obj = lodash_1.default.isUndefined(section) ? config : lodash_1.default.get(config, section, config);
|
|
154
|
+
const mappedObj = lodash_1.default.mapKeys(obj, (__, prop) => lodash_1.default.get(schema, `properties.server.properties[${prop}].appiumCliDest`, lodash_1.default.camelCase(prop)));
|
|
155
|
+
return lodash_1.default.mapValues(mappedObj, (value, property) => {
|
|
156
|
+
const nextSection = section ? `${section}.${property}` : property;
|
|
157
|
+
return isSchemaTypeObject(schema.properties?.[property])
|
|
158
|
+
? normalize(config, nextSection)
|
|
159
|
+
: value;
|
|
160
|
+
});
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Returns `true` if the schema prop references an object, or if it's an object itself
|
|
164
|
+
* @param {import('ajv').SchemaObject|object} schema - Referencing schema object
|
|
165
|
+
*/
|
|
166
|
+
const isSchemaTypeObject = (schema) => Boolean(schema?.properties || schema?.type === 'object');
|
|
167
|
+
return normalize(config);
|
|
137
168
|
}
|
|
138
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ5YW1sTG9hZGVyIiwiZmlsZXBhdGgiLCJjb250ZW50IiwieWFtbCIsInBhcnNlIiwicmF3Q29uZmlnIiwiTWFwIiwianNvbkxvYWRlciIsInNldCIsIkpTT04iLCJsb2FkQ29uZmlnRmlsZSIsImxjIiwibG9hZCIsImVyciIsImNvZGUiLCJtZXNzYWdlIiwiU3ludGF4RXJyb3IiLCJzZWFyY2hDb25maWdGaWxlIiwic2VhcmNoIiwiZm9ybWF0RXJyb3JzIiwiZXJyb3JzIiwiY29uZmlnIiwib3B0cyIsImxlbmd0aCIsIlR5cGVFcnJvciIsImJldHRlckFqdkVycm9ycyIsImdldFNjaGVtYSIsInNjaGVtYUlkIiwianNvbiIsImZvcm1hdCIsInJlYWRDb25maWdGaWxlIiwibGlsY29uZmlnIiwibG9hZGVycyIsIm5vRXh0IiwicGFja2FnZVByb3AiLCJyZXN1bHQiLCJpc0VtcHR5IiwicHJldHR5IiwiY29uZmlnUmVzdWx0IiwidmFsaWRhdGUiLCJfIiwicmVhc29uIiwiZ2V0Iiwibm9ybWFsaXplQ29uZmlnIiwiZGVsZXRlIiwic2NoZW1hIiwibm9ybWFsaXplIiwic2VjdGlvbiIsIm9iaiIsImlzVW5kZWZpbmVkIiwibWFwcGVkT2JqIiwibWFwS2V5cyIsIl9fIiwicHJvcCIsInByb3BlcnRpZXMiLCJhcHBpdW1DbGlEZXN0IiwiY2FtZWxDYXNlIiwibWFwVmFsdWVzIiwidmFsdWUiLCJwcm9wZXJ0eSIsIm5leHRTZWN0aW9uIiwiaXNTY2hlbWFUeXBlT2JqZWN0IiwiQm9vbGVhbiIsInR5cGUiXSwic291cmNlcyI6WyIuLi8uLi9saWIvY29uZmlnLWZpbGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGJldHRlckFqdkVycm9ycyBmcm9tICdAc2lkdmluZC9iZXR0ZXItYWp2LWVycm9ycyc7XG5pbXBvcnQge2xpbGNvbmZpZ30gZnJvbSAnbGlsY29uZmlnJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeWFtbCBmcm9tICd5YW1sJztcbmltcG9ydCB7Z2V0U2NoZW1hLCB2YWxpZGF0ZX0gZnJvbSAnLi9zY2hlbWEvc2NoZW1hJztcblxuLyoqXG4gKiBsaWxjb25maWcgbG9hZGVyIHRvIGhhbmRsZSBgLnlhbWxgIGZpbGVzXG4gKiBAdHlwZSB7aW1wb3J0KCdsaWxjb25maWcnKS5Mb2FkZXJTeW5jfVxuICovXG5mdW5jdGlvbiB5YW1sTG9hZGVyKGZpbGVwYXRoLCBjb250ZW50KSB7XG4gIHJldHVybiB5YW1sLnBhcnNlKGNvbnRlbnQpO1xufVxuXG4vKipcbiAqIEEgY2FjaGUgb2YgdGhlIHJhdyBjb25maWcgZmlsZSAoYSBKU09OIHN0cmluZykgYXQgYSBmaWxlcGF0aC5cbiAqIFRoaXMgaXMgdXNlZCBmb3IgYmV0dGVyIGVycm9yIHJlcG9ydGluZy5cbiAqIE5vdGUgdGhhdCBjb25maWcgZmlsZXMgbmVlZG4ndCBiZSBKU09OLCBidXQgaXQgaGVscHMgaWYgdGhleSBhcmUuXG4gKiBAdHlwZSB7TWFwPHN0cmluZyxSYXdKc29uPn1cbiAqL1xuY29uc3QgcmF3Q29uZmlnID0gbmV3IE1hcCgpO1xuXG4vKipcbiAqIEN1c3RvbSBKU09OIGxvYWRlciB0aGF0IGNhY2hlcyB0aGUgcmF3IGNvbmZpZyBmaWxlIChmb3IgdXNlIHdpdGggYGJldHRlci1hanYtZXJyb3JzYCkuXG4gKiBJZiBpdCB3ZXJlbid0IGZvciB0aGlzIGNhY2hlLCB0aGlzIHdvdWxkIGJlIHVubmVjZXNzYXJ5LlxuICogQHR5cGUge2ltcG9ydCgnbGlsY29uZmlnJykuTG9hZGVyU3luY31cbiAqL1xuZnVuY3Rpb24ganNvbkxvYWRlcihmaWxlcGF0aCwgY29udGVudCkge1xuICByYXdDb25maWcuc2V0KGZpbGVwYXRoLCBjb250ZW50KTtcbiAgcmV0dXJuIEpTT04ucGFyc2UoY29udGVudCk7XG59XG5cbi8qKlxuICogTG9hZHMgYSBjb25maWcgZmlsZSBmcm9tIGFuIGV4cGxpY2l0IHBhdGhcbiAqIEBwYXJhbSB7TGlsY29uZmlnQXN5bmNTZWFyY2hlcn0gbGMgLSBsaWxjb25maWcgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlcGF0aCAtIFBhdGggdG8gY29uZmlnIGZpbGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydCgnbGlsY29uZmlnJykuTGlsY29uZmlnUmVzdWx0Pn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZENvbmZpZ0ZpbGUobGMsIGZpbGVwYXRoKSB7XG4gIHRyeSB7XG4gICAgLy8gcmVtb3ZpbmcgXCJhd2FpdFwiIHdpbGwgY2F1c2UgYW55IHJlamVjdGlvbiB0byBfbm90XyBiZSBjYXVnaHQgaW4gdGhpcyBibG9jayFcbiAgICByZXR1cm4gYXdhaXQgbGMubG9hZChmaWxlcGF0aCk7XG4gIH0gY2F0Y2ggKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gZXJyKSB7XG4gICAgaWYgKC8qKiBAdHlwZSB7Tm9kZUpTLkVycm5vRXhjZXB0aW9ufSAqLyAoZXJyKS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgLyoqIEB0eXBlIHtOb2RlSlMuRXJybm9FeGNlcHRpb259ICovIChcbiAgICAgICAgZXJyXG4gICAgICApLm1lc3NhZ2UgPSBgQ29uZmlnIGZpbGUgbm90IGZvdW5kIGF0IHVzZXItcHJvdmlkZWQgcGF0aDogJHtmaWxlcGF0aH1gO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHtcbiAgICAgIC8vIGdlbmVyYWxseSBpbnZhbGlkIEpTT05cbiAgICAgIGVyci5tZXNzYWdlID0gYENvbmZpZyBmaWxlIGF0IHVzZXItcHJvdmlkZWQgcGF0aCAke2ZpbGVwYXRofSBpcyBpbnZhbGlkOlxcbiR7ZXJyLm1lc3NhZ2V9YDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogU2VhcmNoZXMgZm9yIGEgY29uZmlnIGZpbGVcbiAqIEBwYXJhbSB7TGlsY29uZmlnQXN5bmNTZWFyY2hlcn0gbGMgLSBsaWxjb25maWcgaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydCgnbGlsY29uZmlnJykuTGlsY29uZmlnUmVzdWx0Pn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2VhcmNoQ29uZmlnRmlsZShsYykge1xuICByZXR1cm4gYXdhaXQgbGMuc2VhcmNoKCk7XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gYXJyYXkgb2YgZXJyb3JzIGFuZCB0aGUgcmVzdWx0IG9mIGxvYWRpbmcgYSBjb25maWcgZmlsZSwgZ2VuZXJhdGUgYVxuICogaGVscGZ1bCBzdHJpbmcgZm9yIHRoZSB1c2VyLlxuICpcbiAqIC0gSWYgYG9wdHNgIGNvbnRhaW5zIGEgYGpzb25gIHByb3BlcnR5LCB0aGlzIHNob3VsZCBiZSB0aGUgb3JpZ2luYWwgSlNPTlxuICogICBfc3RyaW5nXyBvZiB0aGUgY29uZmlnIGZpbGUuICBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSBpZiB0aGUgY29uZmlnIGZpbGVcbiAqICAgd2FzIGluIEpTT04gZm9ybWF0LiBJZiBwcmVzZW50LCBpdCB3aWxsIGFzc29jaWF0ZSBsaW5lIG51bWJlcnMgd2l0aCBlcnJvcnMuXG4gKiAtIElmIGBlcnJvcnNgIGhhcHBlbnMgdG8gYmUgZW1wdHksIHRoaXMgd2lsbCB0aHJvdy5cbiAqIEBwYXJhbSB7aW1wb3J0KCdhanYnKS5FcnJvck9iamVjdFtdfSBlcnJvcnMgLSBOb24tZW1wdHkgYXJyYXkgb2YgZXJyb3JzLiBSZXF1aXJlZC5cbiAqIEBwYXJhbSB7UmVhZENvbmZpZ0ZpbGVSZXN1bHRbJ2NvbmZpZyddfGFueX0gW2NvbmZpZ10gLVxuICogQ29uZmlndXJhdGlvbiAmIG1ldGFkYXRhXG4gKiBAcGFyYW0ge0Zvcm1hdENvbmZpZ0Vycm9yc09wdGlvbnN9IFtvcHRzXVxuICogQHRocm93cyB7VHlwZUVycm9yfSBJZiBgZXJyb3JzYCBpcyBlbXB0eVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEVycm9ycyhlcnJvcnMgPSBbXSwgY29uZmlnID0ge30sIG9wdHMgPSB7fSkge1xuICBpZiAoZXJyb3JzICYmICFlcnJvcnMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkgb2YgZXJyb3JzIG11c3QgYmUgbm9uLWVtcHR5Jyk7XG4gIH1cbiAgcmV0dXJuIGJldHRlckFqdkVycm9ycyhnZXRTY2hlbWEob3B0cy5zY2hlbWFJZCksIGNvbmZpZywgZXJyb3JzLCB7XG4gICAganNvbjogb3B0cy5qc29uLFxuICAgIGZvcm1hdDogJ2NsaScsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdpdmVuIGFuIG9wdGlvbmFsIHBhdGgsIHJlYWQgYSBjb25maWcgZmlsZS4gVmFsaWRhdGVzIHRoZSBjb25maWcgZmlsZS5cbiAqXG4gKiBDYWxsIHtAbGluayB2YWxpZGF0ZX0gaWYgeW91IGFscmVhZHkgaGF2ZSBhIGNvbmZpZyBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZpbGVwYXRoXSAtIFBhdGggdG8gY29uZmlnIGZpbGUsIGlmIHdlIGhhdmUgb25lXG4gKiBAcGFyYW0ge1JlYWRDb25maWdGaWxlT3B0aW9uc30gW29wdHNdIC0gT3B0aW9uc1xuICogQHB1YmxpY1xuICogQHJldHVybnMge1Byb21pc2U8UmVhZENvbmZpZ0ZpbGVSZXN1bHQ+fSBDb250YWlucyBjb25maWcgYW5kIGZpbGVwYXRoLCBpZiBmb3VuZCwgYW5kIGFueSBlcnJvcnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRDb25maWdGaWxlKGZpbGVwYXRoLCBvcHRzID0ge30pIHtcbiAgY29uc3QgbGMgPSBsaWxjb25maWcoJ2FwcGl1bScsIHtcbiAgICBsb2FkZXJzOiB7XG4gICAgICAnLnlhbWwnOiB5YW1sTG9hZGVyLFxuICAgICAgJy55bWwnOiB5YW1sTG9hZGVyLFxuICAgICAgJy5qc29uJzoganNvbkxvYWRlcixcbiAgICAgIG5vRXh0OiBqc29uTG9hZGVyLFxuICAgIH0sXG4gICAgcGFja2FnZVByb3A6ICdhcHBpdW1Db25maWcnLFxuICB9KTtcblxuICBjb25zdCByZXN1bHQgPSBmaWxlcGF0aCA/IGF3YWl0IGxvYWRDb25maWdGaWxlKGxjLCBmaWxlcGF0aCkgOiBhd2FpdCBzZWFyY2hDb25maWdGaWxlKGxjKTtcblxuICBpZiAocmVzdWx0Py5maWxlcGF0aCAmJiAhcmVzdWx0Py5pc0VtcHR5KSB7XG4gICAgY29uc3Qge3ByZXR0eSA9IHRydWV9ID0gb3B0cztcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbmZpZ1Jlc3VsdDtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlKHJlc3VsdC5jb25maWcpO1xuICAgICAgaWYgKF8uaXNFbXB0eShlcnJvcnMpKSB7XG4gICAgICAgIGNvbmZpZ1Jlc3VsdCA9IHsuLi5yZXN1bHQsIGVycm9yc307XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWFzb24gPSBmb3JtYXRFcnJvcnMoZXJyb3JzLCByZXN1bHQuY29uZmlnLCB7XG4gICAgICAgICAganNvbjogcmF3Q29uZmlnLmdldChyZXN1bHQuZmlsZXBhdGgpLFxuICAgICAgICAgIHByZXR0eSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbmZpZ1Jlc3VsdCA9IHJlYXNvbiA/IHsuLi5yZXN1bHQsIGVycm9ycywgcmVhc29ufSA6IHsuLi5yZXN1bHQsIGVycm9yc307XG4gICAgICB9XG5cbiAgICAgIC8vIG5vcm1hbGl6ZSAodG8gY2FtZWwgY2FzZSkgYWxsIHRvcC1sZXZlbCBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgY29uZmlnIGZpbGVcbiAgICAgIGNvbmZpZ1Jlc3VsdC5jb25maWcgPSBub3JtYWxpemVDb25maWcoLyoqIEB0eXBlIHtBcHBpdW1Db25maWd9ICovIChjb25maWdSZXN1bHQuY29uZmlnKSk7XG5cbiAgICAgIHJldHVybiBjb25maWdSZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIGNsZWFuIHVwIHRoZSByYXcgY29uZmlnIGZpbGUgY2FjaGUsIHdoaWNoIGlzIG9ubHkga2VwdCB0byBiZXR0ZXIgcmVwb3J0IGVycm9ycy5cbiAgICAgIHJhd0NvbmZpZy5kZWxldGUocmVzdWx0LmZpbGVwYXRoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdCA/PyB7fTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHNjaGVtYSBwcm9wZXJ0eSBuYW1lcyB0byBlaXRoZXIgYSkgdGhlIHZhbHVlIG9mIHRoZSBgYXBwaXVtQ2xpRGVzdGAgcHJvcGVydHksIGlmIGFueTsgb3IgYikgY2FtZWwtY2FzZVxuICogQHBhcmFtIHtBcHBpdW1Db25maWd9IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcmV0dXJucyB7Tm9ybWFsaXplZEFwcGl1bUNvbmZpZ30gTmV3IG9iamVjdCB3aXRoIGNhbWVsLWNhc2VkIGtleXMgKG9yIGBkZXN0YCBrZXlzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbmZpZyhjb25maWcpIHtcbiAgY29uc3Qgc2NoZW1hID0gZ2V0U2NoZW1hKCk7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0FwcGl1bUNvbmZpZ30gY29uZmlnXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VjdGlvbl0gLSBLZXlwYXRoIChsb2Rhc2ggYF8uZ2V0KClgIHN0eWxlKSB0byBzZWN0aW9uIG9mIGNvbmZpZy4gSWYgb21pdHRlZCwgYXNzdW1lIHJvb3QgQXBwaXVtIGNvbmZpZyBzY2hlbWFcbiAgICogQHRvZG8gUmV3cml0ZSBhcyBhIGxvb3BcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCBzZWN0aW9uIG9mIGNvbmZpZ1xuICAgKi9cbiAgY29uc3Qgbm9ybWFsaXplID0gKGNvbmZpZywgc2VjdGlvbikgPT4ge1xuICAgIGNvbnN0IG9iaiA9IF8uaXNVbmRlZmluZWQoc2VjdGlvbikgPyBjb25maWcgOiBfLmdldChjb25maWcsIHNlY3Rpb24sIGNvbmZpZyk7XG5cbiAgICBjb25zdCBtYXBwZWRPYmogPSBfLm1hcEtleXMoXG4gICAgICBvYmosXG4gICAgICAoX18sIHByb3ApID0+IHNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BdPy5hcHBpdW1DbGlEZXN0ID8/IF8uY2FtZWxDYXNlKHByb3ApXG4gICAgKTtcblxuICAgIHJldHVybiBfLm1hcFZhbHVlcyhtYXBwZWRPYmosICh2YWx1ZSwgcHJvcGVydHkpID0+IHtcbiAgICAgIGNvbnN0IG5leHRTZWN0aW9uID0gc2VjdGlvbiA/IGAke3NlY3Rpb259LiR7cHJvcGVydHl9YCA6IHByb3BlcnR5O1xuICAgICAgcmV0dXJuIGlzU2NoZW1hVHlwZU9iamVjdChzY2hlbWEucHJvcGVydGllcz8uW3Byb3BlcnR5XSlcbiAgICAgICAgPyBub3JtYWxpemUoY29uZmlnLCBuZXh0U2VjdGlvbilcbiAgICAgICAgOiB2YWx1ZTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNjaGVtYSBwcm9wIHJlZmVyZW5jZXMgYW4gb2JqZWN0LCBvciBpZiBpdCdzIGFuIG9iamVjdCBpdHNlbGZcbiAgICogQHBhcmFtIHtpbXBvcnQoJ2FqdicpLlNjaGVtYU9iamVjdHxvYmplY3R9IHNjaGVtYSAtIFJlZmVyZW5jaW5nIHNjaGVtYSBvYmplY3RcbiAgICovXG4gIGNvbnN0IGlzU2NoZW1hVHlwZU9iamVjdCA9IChzY2hlbWEpID0+IEJvb2xlYW4oc2NoZW1hPy5wcm9wZXJ0aWVzIHx8IHNjaGVtYT8udHlwZSA9PT0gJ29iamVjdCcpO1xuXG4gIHJldHVybiBub3JtYWxpemUoY29uZmlnKTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgY2FsbGluZyB7QGxpbmsgcmVhZENvbmZpZ0ZpbGV9LlxuICogQHR5cGVkZWYgUmVhZENvbmZpZ0ZpbGVSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCdhanYnKS5FcnJvck9iamVjdFtdfSBbZXJyb3JzXSAtIFZhbGlkYXRpb24gZXJyb3JzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2ZpbGVwYXRoXSAtIFRoZSBwYXRoIHRvIHRoZSBjb25maWcgZmlsZSwgaWYgZm91bmRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lzRW1wdHldIC0gSWYgYHRydWVgLCB0aGUgY29uZmlnIGZpbGUgZXhpc3RzIGJ1dCBpcyBlbXB0eVxuICogQHByb3BlcnR5IHtOb3JtYWxpemVkQXBwaXVtQ29uZmlnfSBbY29uZmlnXSAtIFRoZSBwYXJzZWQgY29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd8aW1wb3J0KCdAc2lkdmluZC9iZXR0ZXItYWp2LWVycm9ycycpLklPdXRwdXRFcnJvcltdfSBbcmVhc29uXSAtIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2VzIGFuZCBzdWdnZXN0aW9ucy4gSWYgdGhlIGBwcmV0dHlgIG9wdGlvbiBpcyBgdHJ1ZWAsIHRoaXMgd2lsbCBiZSBhIG5pY2Ugc3RyaW5nIHRvIHByaW50LlxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJlYWRDb25maWdGaWxlfS5cbiAqIEB0eXBlZGVmIFJlYWRDb25maWdGaWxlT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcHJldHR5PXRydWVdIElmIGBmYWxzZWAsIGRvIG5vdCB1c2UgY29sb3IgYW5kIGZhbmN5IGZvcm1hdHRpbmcgaW4gdGhlIGByZWFzb25gIHByb3BlcnR5IG9mIHRoZSB7QGxpbmsgUmVhZENvbmZpZ0ZpbGVSZXN1bHR9LiBUaGUgdmFsdWUgb2YgYHJlYXNvbmAgaXMgdGhlbiBzdWl0YWJsZSBmb3IgbWFjaGluZS1yZWFkaW5nLlxuICovXG5cbi8qKlxuICogVGhpcyBpcyBhbiBgQXN5bmNTZWFyY2hlcmAgd2hpY2ggaXMgaW5leHBsaWNhYmx5IF9ub3RfIGV4cG9ydGVkIGJ5IHRoZSBgbGlsY29uZmlnYCB0eXBlIGRlZmluaXRpb24uXG4gKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxpbXBvcnQoJ2xpbGNvbmZpZycpW1wibGlsY29uZmlnXCJdPn0gTGlsY29uZmlnQXN5bmNTZWFyY2hlclxuICovXG5cbi8qKlxuICogVGhlIGNvbnRlbnRzIG9mIGFuIEFwcGl1bSBjb25maWcgZmlsZS4gR2VuZXJhdGVkIGZyb20gc2NoZW1hXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtQ29uZmlnfSBBcHBpdW1Db25maWdcbiAqL1xuXG4vKipcbiAqIFRoZSBjb250ZW50cyBvZiBhbiBBcHBpdW0gY29uZmlnIGZpbGUgd2l0aCBjYW1lbGNhc2VkIHByb3BlcnR5IG5hbWVzIChhbmQgdXNpbmcgYGFwcGl1bUNsaURlc3RgIHZhbHVlIGlmIHByZXNlbnQpLiBHZW5lcmF0ZWQgZnJvbSB7QGxpbmsgQXBwaXVtQ29uZmlnfVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLk5vcm1hbGl6ZWRBcHBpdW1Db25maWd9IE5vcm1hbGl6ZWRBcHBpdW1Db25maWdcbiAqL1xuXG4vKipcbiAqIFRoZSBzdHJpbmcgc2hvdWxkIGJlIGEgcmF3IEpTT04gc3RyaW5nLlxuICogQHR5cGVkZWYge3N0cmluZ30gUmF3SnNvblxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGZvcm1hdEVycm9yc30uXG4gKiBAdHlwZWRlZiBGb3JtYXRDb25maWdFcnJvcnNPcHRpb25zXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnLi9jb25maWctZmlsZScpLlJhd0pzb259IFtqc29uXSAtIFJhdyBKU09OIGNvbmZpZyAoYXMgc3RyaW5nKVxuICogQHByb3BlcnR5IHtib29sZWFufSBbcHJldHR5PXRydWVdIC0gV2hldGhlciB0byBmb3JtYXQgZXJyb3JzIGFzIGEgQ0xJLWZyaWVuZGx5IHN0cmluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9ICBbc2NoZW1hSWRdIC0gU3BlY2lmaWMgSUQgb2YgYSBwcm9wOyBvdGhlcndpc2UgZW50aXJlIHNjaGVtYVxuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFNQSxTQUFTQSxVQUFULENBQW9CQyxRQUFwQixFQUE4QkMsT0FBOUIsRUFB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
|
|
169
|
+
exports.normalizeConfig = normalizeConfig;
|
|
170
|
+
/**
|
|
171
|
+
* Result of calling {@link readConfigFile}.
|
|
172
|
+
* @typedef ReadConfigFileResult
|
|
173
|
+
* @property {import('ajv').ErrorObject[]} [errors] - Validation errors
|
|
174
|
+
* @property {string} [filepath] - The path to the config file, if found
|
|
175
|
+
* @property {boolean} [isEmpty] - If `true`, the config file exists but is empty
|
|
176
|
+
* @property {NormalizedAppiumConfig} [config] - The parsed configuration
|
|
177
|
+
* @property {string|import('@sidvind/better-ajv-errors').IOutputError[]} [reason] - Human-readable error messages and suggestions. If the `pretty` option is `true`, this will be a nice string to print.
|
|
178
|
+
*/
|
|
179
|
+
/**
|
|
180
|
+
* Options for {@link readConfigFile}.
|
|
181
|
+
* @typedef ReadConfigFileOptions
|
|
182
|
+
* @property {boolean} [pretty=true] If `false`, do not use color and fancy formatting in the `reason` property of the {@link ReadConfigFileResult}. The value of `reason` is then suitable for machine-reading.
|
|
183
|
+
*/
|
|
184
|
+
/**
|
|
185
|
+
* This is an `AsyncSearcher` which is inexplicably _not_ exported by the `lilconfig` type definition.
|
|
186
|
+
* @typedef {ReturnType<import('lilconfig')["lilconfig"]>} LilconfigAsyncSearcher
|
|
187
|
+
*/
|
|
188
|
+
/**
|
|
189
|
+
* The contents of an Appium config file. Generated from schema
|
|
190
|
+
* @typedef {import('@appium/types').AppiumConfig} AppiumConfig
|
|
191
|
+
*/
|
|
192
|
+
/**
|
|
193
|
+
* The contents of an Appium config file with camelcased property names (and using `appiumCliDest` value if present). Generated from {@link AppiumConfig}
|
|
194
|
+
* @typedef {import('@appium/types').NormalizedAppiumConfig} NormalizedAppiumConfig
|
|
195
|
+
*/
|
|
196
|
+
/**
|
|
197
|
+
* The string should be a raw JSON string.
|
|
198
|
+
* @typedef {string} RawJson
|
|
199
|
+
*/
|
|
200
|
+
/**
|
|
201
|
+
* Options for {@link formatErrors}.
|
|
202
|
+
* @typedef FormatConfigErrorsOptions
|
|
203
|
+
* @property {import('./config-file').RawJson} [json] - Raw JSON config (as string)
|
|
204
|
+
* @property {boolean} [pretty=true] - Whether to format errors as a CLI-friendly string
|
|
205
|
+
* @property {string} [schemaId] - Specific ID of a prop; otherwise entire schema
|
|
206
|
+
*/
|
|
207
|
+
//# sourceMappingURL=config-file.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-file.js","names":["yamlLoader","filepath","content","yaml","parse","rawConfig","Map","jsonLoader","set","JSON","loadConfigFile","lc","load","err","code","message","SyntaxError","searchConfigFile","search","formatErrors","errors","config","opts","length","TypeError","betterAjvErrors","getSchema","schemaId","json","format","readConfigFile","lilconfig","loaders","noExt","packageProp","result","isEmpty","pretty","configResult","validate","_","reason","get","normalizeConfig","delete","schema","normalize","section","obj","isUndefined","mappedObj","mapKeys","__","prop","properties","appiumCliDest","camelCase","mapValues","value","property","nextSection","isSchemaTypeObject","Boolean","type"],"sources":["../../lib/config-file.js"],"sourcesContent":["import betterAjvErrors from '@sidvind/better-ajv-errors';\nimport {lilconfig} from 'lilconfig';\nimport _ from 'lodash';\nimport yaml from 'yaml';\nimport {getSchema, validate} from './schema/schema';\n\n/**\n * lilconfig loader to handle `.yaml` files\n * @type {import('lilconfig').LoaderSync}\n */\nfunction yamlLoader(filepath, content) {\n return yaml.parse(content);\n}\n\n/**\n * A cache of the raw config file (a JSON string) at a filepath.\n * This is used for better error reporting.\n * Note that config files needn't be JSON, but it helps if they are.\n * @type {Map<string,RawJson>}\n */\nconst rawConfig = new Map();\n\n/**\n * Custom JSON loader that caches the raw config file (for use with `better-ajv-errors`).\n * If it weren't for this cache, this would be unnecessary.\n * @type {import('lilconfig').LoaderSync}\n */\nfunction jsonLoader(filepath, content) {\n rawConfig.set(filepath, content);\n return JSON.parse(content);\n}\n\n/**\n * Loads a config file from an explicit path\n * @param {LilconfigAsyncSearcher} lc - lilconfig instance\n * @param {string} filepath - Path to config file\n * @returns {Promise<import('lilconfig').LilconfigResult>}\n */\nasync function loadConfigFile(lc, filepath) {\n try {\n // removing \"await\" will cause any rejection to _not_ be caught in this block!\n return await lc.load(filepath);\n } catch (/** @type {unknown} */ err) {\n if (/** @type {NodeJS.ErrnoException} */ (err).code === 'ENOENT') {\n /** @type {NodeJS.ErrnoException} */ (\n err\n ).message = `Config file not found at user-provided path: ${filepath}`;\n throw err;\n } else if (err instanceof SyntaxError) {\n // generally invalid JSON\n err.message = `Config file at user-provided path ${filepath} is invalid:\\n${err.message}`;\n throw err;\n }\n throw err;\n }\n}\n\n/**\n * Searches for a config file\n * @param {LilconfigAsyncSearcher} lc - lilconfig instance\n * @returns {Promise<import('lilconfig').LilconfigResult>}\n */\nasync function searchConfigFile(lc) {\n return await lc.search();\n}\n\n/**\n * Given an array of errors and the result of loading a config file, generate a\n * helpful string for the user.\n *\n * - If `opts` contains a `json` property, this should be the original JSON\n * _string_ of the config file. This is only applicable if the config file\n * was in JSON format. If present, it will associate line numbers with errors.\n * - If `errors` happens to be empty, this will throw.\n * @param {import('ajv').ErrorObject[]} errors - Non-empty array of errors. Required.\n * @param {ReadConfigFileResult['config']|any} [config] -\n * Configuration & metadata\n * @param {FormatConfigErrorsOptions} [opts]\n * @throws {TypeError} If `errors` is empty\n * @returns {string}\n */\nexport function formatErrors(errors = [], config = {}, opts = {}) {\n if (errors && !errors.length) {\n throw new TypeError('Array of errors must be non-empty');\n }\n return betterAjvErrors(getSchema(opts.schemaId), config, errors, {\n json: opts.json,\n format: 'cli',\n });\n}\n\n/**\n * Given an optional path, read a config file. Validates the config file.\n *\n * Call {@link validate} if you already have a config object.\n * @param {string} [filepath] - Path to config file, if we have one\n * @param {ReadConfigFileOptions} [opts] - Options\n * @public\n * @returns {Promise<ReadConfigFileResult>} Contains config and filepath, if found, and any errors\n */\nexport async function readConfigFile(filepath, opts = {}) {\n const lc = lilconfig('appium', {\n loaders: {\n '.yaml': yamlLoader,\n '.yml': yamlLoader,\n '.json': jsonLoader,\n noExt: jsonLoader,\n },\n packageProp: 'appiumConfig',\n });\n\n const result = filepath ? await loadConfigFile(lc, filepath) : await searchConfigFile(lc);\n\n if (result?.filepath && !result?.isEmpty) {\n const {pretty = true} = opts;\n try {\n let configResult;\n const errors = validate(result.config);\n if (_.isEmpty(errors)) {\n configResult = {...result, errors};\n } else {\n const reason = formatErrors(errors, result.config, {\n json: rawConfig.get(result.filepath),\n pretty,\n });\n configResult = reason ? {...result, errors, reason} : {...result, errors};\n }\n\n // normalize (to camel case) all top-level property names of the config file\n configResult.config = normalizeConfig(/** @type {AppiumConfig} */ (configResult.config));\n\n return configResult;\n } finally {\n // clean up the raw config file cache, which is only kept to better report errors.\n rawConfig.delete(result.filepath);\n }\n }\n return result ?? {};\n}\n\n/**\n * Convert schema property names to either a) the value of the `appiumCliDest` property, if any; or b) camel-case\n * @param {AppiumConfig} config - Configuration object\n * @returns {NormalizedAppiumConfig} New object with camel-cased keys (or `dest` keys).\n */\nexport function normalizeConfig(config) {\n const schema = getSchema();\n /**\n * @param {AppiumConfig} config\n * @param {string} [section] - Keypath (lodash `_.get()` style) to section of config. If omitted, assume root Appium config schema\n * @todo Rewrite as a loop\n * @returns Normalized section of config\n */\n const normalize = (config, section) => {\n const obj = _.isUndefined(section) ? config : _.get(config, section, config);\n\n const mappedObj = _.mapKeys(\n obj,\n (__, prop) => schema.properties[prop]?.appiumCliDest ?? _.camelCase(prop)\n );\n\n return _.mapValues(mappedObj, (value, property) => {\n const nextSection = section ? `${section}.${property}` : property;\n return isSchemaTypeObject(schema.properties?.[property])\n ? normalize(config, nextSection)\n : value;\n });\n };\n\n /**\n * Returns `true` if the schema prop references an object, or if it's an object itself\n * @param {import('ajv').SchemaObject|object} schema - Referencing schema object\n */\n const isSchemaTypeObject = (schema) => Boolean(schema?.properties || schema?.type === 'object');\n\n return normalize(config);\n}\n\n/**\n * Result of calling {@link readConfigFile}.\n * @typedef ReadConfigFileResult\n * @property {import('ajv').ErrorObject[]} [errors] - Validation errors\n * @property {string} [filepath] - The path to the config file, if found\n * @property {boolean} [isEmpty] - If `true`, the config file exists but is empty\n * @property {NormalizedAppiumConfig} [config] - The parsed configuration\n * @property {string|import('@sidvind/better-ajv-errors').IOutputError[]} [reason] - Human-readable error messages and suggestions. If the `pretty` option is `true`, this will be a nice string to print.\n */\n\n/**\n * Options for {@link readConfigFile}.\n * @typedef ReadConfigFileOptions\n * @property {boolean} [pretty=true] If `false`, do not use color and fancy formatting in the `reason` property of the {@link ReadConfigFileResult}. The value of `reason` is then suitable for machine-reading.\n */\n\n/**\n * This is an `AsyncSearcher` which is inexplicably _not_ exported by the `lilconfig` type definition.\n * @typedef {ReturnType<import('lilconfig')[\"lilconfig\"]>} LilconfigAsyncSearcher\n */\n\n/**\n * The contents of an Appium config file. Generated from schema\n * @typedef {import('@appium/types').AppiumConfig} AppiumConfig\n */\n\n/**\n * The contents of an Appium config file with camelcased property names (and using `appiumCliDest` value if present). Generated from {@link AppiumConfig}\n * @typedef {import('@appium/types').NormalizedAppiumConfig} NormalizedAppiumConfig\n */\n\n/**\n * The string should be a raw JSON string.\n * @typedef {string} RawJson\n */\n\n/**\n * Options for {@link formatErrors}.\n * @typedef FormatConfigErrorsOptions\n * @property {import('./config-file').RawJson} [json] - Raw JSON config (as string)\n * @property {boolean} [pretty=true] - Whether to format errors as a CLI-friendly string\n * @property {string} [schemaId] - Specific ID of a prop; otherwise entire schema\n */\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config-file.js","sourceRoot":"","sources":["../../lib/config-file.js"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../lib/config.js"],"names":[],"mappings":"AAsJA,4CAOC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../lib/config.js"],"names":[],"mappings":"AAsJA,4CAOC;yBAyLY,OAAO,cAAc,EAAE,UAAU;mBACjC,OAAO,cAAc,EAAE,IAAI;;AArNxC;;;;;;GAMG;AACH,gCAFa,OAAO,cAAc,EAAE,SAAS,CAI5C;AAED,oCAOC;AAwBD,+CAGC;AAhBD,6CAWC;AA6ID;;GAEG;AACH,uCAFW,MAAM,iBAWhB;AAlJD;;;;GAIG;AACH,oDAHW,IAAI,GACF,IAAI,CAmFhB;AAtMD;;;GAGG;AACH,uEAFa,QAAQ,MAAM,QAAE,CA6B5B;AArFD,6BAAsC;AA4BtC;;GAEG;AACH,2FAUC;AAmOD;;;;;;;;;;GAUG;AACH,0DALW,QAAQ,UAAU,CAAC,gBACnB,OAAO,eAAe,EAAE,oBAAoB,YAC5C,QAAQ,UAAU,CAAC,cACnB,UAAU,QAqBpB;AAgBD,6BAAuC"}
|