mirror of https://gitee.com/bigwinds/arangodb
Allow multi-dependencies in Foxx
This commit is contained in:
parent
593274b095
commit
d6a063e28d
|
@ -131,7 +131,8 @@ const manifestSchema = {
|
||||||
name: joi.string().default('*'),
|
name: joi.string().default('*'),
|
||||||
version: joi.string().default('*'),
|
version: joi.string().default('*'),
|
||||||
description: joi.string().optional(),
|
description: joi.string().optional(),
|
||||||
required: joi.boolean().default(true)
|
required: joi.boolean().default(true),
|
||||||
|
multiple: joi.boolean().default(false)
|
||||||
})
|
})
|
||||||
))
|
))
|
||||||
),
|
),
|
||||||
|
|
|
@ -92,6 +92,7 @@ module.exports =
|
||||||
|
|
||||||
this.configuration = createConfiguration(this.manifest.configuration);
|
this.configuration = createConfiguration(this.manifest.configuration);
|
||||||
this.dependencies = createDependencies(this.manifest.dependencies, this.options.dependencies);
|
this.dependencies = createDependencies(this.manifest.dependencies, this.options.dependencies);
|
||||||
|
|
||||||
const warnings = this.applyConfiguration(this.options.configuration, false);
|
const warnings = this.applyConfiguration(this.options.configuration, false);
|
||||||
if (warnings) {
|
if (warnings) {
|
||||||
console.warnLines(`Stored configuration for service "${data.mount}" has errors:\n ${
|
console.warnLines(`Stored configuration for service "${data.mount}" has errors:\n ${
|
||||||
|
@ -196,18 +197,44 @@ module.exports =
|
||||||
const def = definitions[name];
|
const def = definitions[name];
|
||||||
const value = deps[name];
|
const value = deps[name];
|
||||||
|
|
||||||
if (value === undefined || value === null || value === '') {
|
if (def.multiple) {
|
||||||
this.options.dependencies[name] = undefined;
|
this.options.dependencies[name] = deps;
|
||||||
if (def.required !== false) {
|
const values = Array.isArray(value) ? value : (
|
||||||
warnings[name] = 'is required';
|
(value === undefined || value === null || value === '')
|
||||||
}
|
? []
|
||||||
continue;
|
: [value]
|
||||||
}
|
);
|
||||||
|
|
||||||
if (typeof value !== 'string') {
|
if (!values.length) {
|
||||||
warnings[name] = 'must be a string';
|
if (def.required !== false) {
|
||||||
|
warnings[name] = 'is required';
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < values.length; i++) {
|
||||||
|
const value = values[i];
|
||||||
|
if (typeof value !== 'string') {
|
||||||
|
warnings[name] = `at ${i} must be a string`;
|
||||||
|
} else {
|
||||||
|
this.options.dependencies[name].push(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
this.options.dependencies[name] = value;
|
this.options.dependencies[name] = undefined;
|
||||||
|
|
||||||
|
if (value === undefined || value === null || value === '') {
|
||||||
|
if (def.required !== false) {
|
||||||
|
warnings[name] = 'is required';
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof value !== 'string') {
|
||||||
|
warnings[name] = 'must be a string';
|
||||||
|
} else {
|
||||||
|
this.options.dependencies[name] = value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -398,11 +425,10 @@ module.exports =
|
||||||
needsConfiguration () {
|
needsConfiguration () {
|
||||||
const config = this.getConfiguration();
|
const config = this.getConfiguration();
|
||||||
const deps = this.getDependencies();
|
const deps = this.getDependencies();
|
||||||
return _.some(config, function (cfg) {
|
return (
|
||||||
return cfg.current === undefined && cfg.required !== false;
|
_.some(config, (cfg) => cfg.current === undefined && cfg.required) ||
|
||||||
}) || _.some(deps, function (dep) {
|
_.some(deps, (dep) => (dep.multiple ? !dep.current.length : !dep.current) && dep.required)
|
||||||
return dep.current === undefined && dep.required !== false;
|
);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
run (filename, options) {
|
run (filename, options) {
|
||||||
|
@ -556,16 +582,28 @@ function createConfiguration (definitions) {
|
||||||
function createDependencies (definitions, options) {
|
function createDependencies (definitions, options) {
|
||||||
const deps = {};
|
const deps = {};
|
||||||
for (const name of Object.keys(definitions)) {
|
for (const name of Object.keys(definitions)) {
|
||||||
|
const dfn = definitions[name];
|
||||||
Object.defineProperty(deps, name, {
|
Object.defineProperty(deps, name, {
|
||||||
configurable: true,
|
|
||||||
enumerable: true,
|
enumerable: true,
|
||||||
get() {
|
get () {
|
||||||
const mount = options[name];
|
const fm = require('@arangodb/foxx/manager');
|
||||||
if (!mount) {
|
const value = options[name];
|
||||||
return null;
|
if (!dfn.multiple) {
|
||||||
|
return value ? fm.requireService(value) : null;
|
||||||
}
|
}
|
||||||
const FoxxManager = require('@arangodb/foxx/manager');
|
const multi = [];
|
||||||
return FoxxManager.requireService('/' + mount.replace(/(^\/+|\/+$)/, ''));
|
if (value) {
|
||||||
|
for (let i = 0; i < value.length; i++) {
|
||||||
|
const item = value[i];
|
||||||
|
Object.defineProperty(multi, String(i), {
|
||||||
|
enumerable: true,
|
||||||
|
get: () => item ? fm.requireService(item) : null
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Object.freeze(multi);
|
||||||
|
Object.seal(multi);
|
||||||
|
return multi;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue