@friggframework/schemas 2.0.0--canary.666.89f6545.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 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
- * @param {object} apiModuleDefinition - API module definition object to validate
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
- return validate('api-module-definition', apiModuleDefinition);
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.666.89f6545.0",
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": "89f6545362623128362b730cb02b286c8308c66e"
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
@@ -95,39 +95,6 @@
95
95
  },
96
96
  "default": []
97
97
  },
98
- "adminScripts": {
99
- "type": "array",
100
- "description": "Admin script classes (extending AdminScriptBase from @friggframework/admin-scripts) served under /admin/scripts",
101
- "items": {
102
- "description": "Admin script class"
103
- },
104
- "default": []
105
- },
106
- "reports": {
107
- "type": "array",
108
- "description": "Report classes served by the admin report runner",
109
- "items": {
110
- "description": "Report class"
111
- },
112
- "default": []
113
- },
114
- "admin": {
115
- "type": "object",
116
- "description": "Admin script and report runner options",
117
- "properties": {
118
- "enableScheduling": {
119
- "type": "boolean",
120
- "description": "Provision the EventBridge Scheduler group and role so admin scripts and reports can run on a schedule",
121
- "default": false
122
- },
123
- "includeBuiltinReports": {
124
- "type": "boolean",
125
- "description": "Serve the built-in reports alongside the app's own reports",
126
- "default": false
127
- }
128
- },
129
- "additionalProperties": false
130
- },
131
98
  "user": {
132
99
  "type": "object",
133
100
  "description": "User management and authentication. Read by core when it loads the app definition; an omitted block gets the defaults below (ADR-051).",