@friggframework/schemas 2.0.0--canary.666.abcf913.0 → 2.0.0--canary.701.3b01ea3.0
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 +3 -1
- package/api-module-definition.js +93 -0
- package/index.js +13 -3
- package/package.json +3 -2
- package/schemas/api-module-definition.schema.json +23 -0
package/README.md
CHANGED
|
@@ -172,7 +172,9 @@ Defines the structure for Frigg API modules.
|
|
|
172
172
|
**Key Properties:**
|
|
173
173
|
- `moduleName` (required): Module identifier
|
|
174
174
|
- `getName` (required): Function returning module name
|
|
175
|
-
- `requiredAuthMethods` (required): Authentication configuration
|
|
175
|
+
- `requiredAuthMethods` (required): Authentication configuration (includes optional `getAuthorizationRequirements` and `setAuthParams` for API-key modules)
|
|
176
|
+
- `modelName`: Entity/credential model name used by the Module runtime
|
|
177
|
+
- Real Definitions (classes/functions) are accepted by `validateApiModuleDefinition` via a schema view.
|
|
176
178
|
- `env`: Environment variable configuration
|
|
177
179
|
- `config`: Module-specific configuration
|
|
178
180
|
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API module definition helpers shared by validators and the frigg CLI.
|
|
3
|
+
* Real Definitions carry classes and functions that JSON Schema cannot
|
|
4
|
+
* describe; validators check the serialisable view produced here.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
function isPlainObject(value) {
|
|
8
|
+
if (value === null || typeof value !== 'object') return false;
|
|
9
|
+
const proto = Object.getPrototypeOf(value);
|
|
10
|
+
return proto === Object.prototype || proto === null;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Schema descriptor for a JavaScript function (see api-module-definition
|
|
15
|
+
* schema: `{ type: "function", async?: boolean }`).
|
|
16
|
+
*
|
|
17
|
+
* @param {Function} fn
|
|
18
|
+
* @returns {{ type: 'function', async?: boolean }}
|
|
19
|
+
*/
|
|
20
|
+
function toFunctionDescriptor(fn) {
|
|
21
|
+
const descriptor = { type: 'function' };
|
|
22
|
+
if (fn && fn.constructor && fn.constructor.name === 'AsyncFunction') {
|
|
23
|
+
descriptor.async = true;
|
|
24
|
+
}
|
|
25
|
+
return descriptor;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* JSON Schema cannot describe a JavaScript class or function. Validators
|
|
30
|
+
* therefore check this serialisable view: the API class becomes an empty
|
|
31
|
+
* object, functions become `{ type: "function" }` descriptors, and
|
|
32
|
+
* `undefined` env values are dropped (unset `process.env.*` entries).
|
|
33
|
+
*
|
|
34
|
+
* @param {object} definition the `Definition` exported by an API module
|
|
35
|
+
* @returns {object} a view suitable for the api-module-definition schema
|
|
36
|
+
*/
|
|
37
|
+
function toApiModuleDefinitionSchemaView(definition) {
|
|
38
|
+
if (!isPlainObject(definition)) return definition;
|
|
39
|
+
|
|
40
|
+
const view = { ...definition };
|
|
41
|
+
|
|
42
|
+
if (typeof view.API === 'function') {
|
|
43
|
+
view.API = {};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (typeof view.getName === 'function') {
|
|
47
|
+
view.getName = toFunctionDescriptor(view.getName);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (isPlainObject(view.requiredAuthMethods)) {
|
|
51
|
+
const methods = { ...view.requiredAuthMethods };
|
|
52
|
+
for (const [key, value] of Object.entries(methods)) {
|
|
53
|
+
if (typeof value === 'function') {
|
|
54
|
+
methods[key] = toFunctionDescriptor(value);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
view.requiredAuthMethods = methods;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (isPlainObject(view.env)) {
|
|
61
|
+
const env = {};
|
|
62
|
+
for (const [key, value] of Object.entries(view.env)) {
|
|
63
|
+
if (value !== undefined) env[key] = value;
|
|
64
|
+
}
|
|
65
|
+
view.env = env;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (isPlainObject(view.manager)) {
|
|
69
|
+
const manager = { ...view.manager };
|
|
70
|
+
for (const key of ['Entity', 'Credential']) {
|
|
71
|
+
if (typeof manager[key] === 'function') {
|
|
72
|
+
manager[key] = {};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (isPlainObject(manager.methods)) {
|
|
76
|
+
const methods = { ...manager.methods };
|
|
77
|
+
for (const [key, value] of Object.entries(methods)) {
|
|
78
|
+
if (typeof value === 'function') {
|
|
79
|
+
methods[key] = {};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
manager.methods = methods;
|
|
83
|
+
}
|
|
84
|
+
view.manager = manager;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return view;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
module.exports = {
|
|
91
|
+
toApiModuleDefinitionSchemaView,
|
|
92
|
+
toFunctionDescriptor,
|
|
93
|
+
};
|
package/index.js
CHANGED
|
@@ -16,6 +16,9 @@ const {
|
|
|
16
16
|
applyAppDefinitionDefaults,
|
|
17
17
|
toAppDefinitionSchemaView,
|
|
18
18
|
} = require('./app-definition');
|
|
19
|
+
const {
|
|
20
|
+
toApiModuleDefinitionSchemaView,
|
|
21
|
+
} = require('./api-module-definition');
|
|
19
22
|
|
|
20
23
|
// Initialize AJV with formats
|
|
21
24
|
const ajv = new Ajv({
|
|
@@ -99,12 +102,18 @@ function validateIntegrationDefinition(integrationDefinition) {
|
|
|
99
102
|
}
|
|
100
103
|
|
|
101
104
|
/**
|
|
102
|
-
* Validate API Module Definition
|
|
103
|
-
*
|
|
105
|
+
* Validate API Module Definition.
|
|
106
|
+
* Real Definitions carry classes and functions; validate the serialisable
|
|
107
|
+
* view and return the original definition (same pattern as validateAppDefinition).
|
|
108
|
+
* @param {object} apiModuleDefinition - API module definition object to validate
|
|
104
109
|
* @returns {object} - Validation result
|
|
105
110
|
*/
|
|
106
111
|
function validateApiModuleDefinition(apiModuleDefinition) {
|
|
107
|
-
|
|
112
|
+
const result = validate(
|
|
113
|
+
'api-module-definition',
|
|
114
|
+
toApiModuleDefinitionSchemaView(apiModuleDefinition)
|
|
115
|
+
);
|
|
116
|
+
return { ...result, data: apiModuleDefinition };
|
|
108
117
|
}
|
|
109
118
|
|
|
110
119
|
/**
|
|
@@ -369,6 +378,7 @@ module.exports = {
|
|
|
369
378
|
validateAppDefinition,
|
|
370
379
|
applyAppDefinitionDefaults,
|
|
371
380
|
toAppDefinitionSchemaView,
|
|
381
|
+
toApiModuleDefinitionSchemaView,
|
|
372
382
|
validateIntegrationDefinition,
|
|
373
383
|
validateApiModuleDefinition,
|
|
374
384
|
validateServerlessConfig,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@friggframework/schemas",
|
|
3
|
-
"version": "2.0.0--canary.
|
|
3
|
+
"version": "2.0.0--canary.701.3b01ea3.0",
|
|
4
4
|
"description": "Canonical JSON Schema definitions for Frigg Framework",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"author": "",
|
|
@@ -40,7 +40,8 @@
|
|
|
40
40
|
"mocks/",
|
|
41
41
|
"middleware/",
|
|
42
42
|
"app-definition.js",
|
|
43
|
+
"api-module-definition.js",
|
|
43
44
|
"index.js"
|
|
44
45
|
],
|
|
45
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "3b01ea3abd65f1771e9bb1f143168da6acff4125"
|
|
46
47
|
}
|
|
@@ -27,6 +27,13 @@
|
|
|
27
27
|
"minLength": 1,
|
|
28
28
|
"maxLength": 100
|
|
29
29
|
},
|
|
30
|
+
"modelName": {
|
|
31
|
+
"type": "string",
|
|
32
|
+
"description": "Entity/credential model name used by the Module runtime (e.g. 'Fathom'). Distinct from moduleName, which is the package identifier.",
|
|
33
|
+
"pattern": "^[a-zA-Z][a-zA-Z0-9_]*$",
|
|
34
|
+
"minLength": 1,
|
|
35
|
+
"maxLength": 100
|
|
36
|
+
},
|
|
30
37
|
"requiredAuthMethods": {
|
|
31
38
|
"type": "object",
|
|
32
39
|
"description": "Required authentication methods and configuration",
|
|
@@ -90,6 +97,22 @@
|
|
|
90
97
|
"type": {"type": "string", "enum": ["function"]},
|
|
91
98
|
"async": {"type": "boolean", "default": true}
|
|
92
99
|
}
|
|
100
|
+
},
|
|
101
|
+
"getAuthorizationRequirements": {
|
|
102
|
+
"type": "object",
|
|
103
|
+
"description": "Method that returns the authorization requirements (type, jsonSchema/uiSchema) for non-OAuth flows such as API key",
|
|
104
|
+
"properties": {
|
|
105
|
+
"type": {"type": "string", "enum": ["function"]},
|
|
106
|
+
"async": {"type": "boolean", "default": true}
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
"setAuthParams": {
|
|
110
|
+
"type": "object",
|
|
111
|
+
"description": "Method that applies authorization parameters (e.g. API key) to the API instance",
|
|
112
|
+
"properties": {
|
|
113
|
+
"type": {"type": "string", "enum": ["function"]},
|
|
114
|
+
"async": {"type": "boolean", "default": true}
|
|
115
|
+
}
|
|
93
116
|
}
|
|
94
117
|
},
|
|
95
118
|
"additionalProperties": false
|