auth0-deploy-cli 8.26.0 → 8.28.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/CHANGELOG.md +29 -1
- package/lib/context/directory/handlers/actionModules.d.ts +5 -0
- package/lib/context/directory/handlers/actionModules.js +91 -0
- package/lib/context/directory/handlers/actions.js +4 -0
- package/lib/context/directory/handlers/index.js +2 -0
- package/lib/context/yaml/handlers/actionModules.d.ts +6 -0
- package/lib/context/yaml/handlers/actionModules.js +68 -0
- package/lib/context/yaml/handlers/actions.js +4 -0
- package/lib/context/yaml/handlers/index.js +2 -0
- package/lib/tools/auth0/handlers/actionModules.d.ts +64 -0
- package/lib/tools/auth0/handlers/actionModules.js +200 -0
- package/lib/tools/auth0/handlers/actions.d.ts +19 -1
- package/lib/tools/auth0/handlers/actions.js +89 -1
- package/lib/tools/auth0/handlers/clientGrants.js +23 -5
- package/lib/tools/auth0/handlers/clients.js +3 -6
- package/lib/tools/auth0/handlers/connections.d.ts +2 -2
- package/lib/tools/auth0/handlers/connections.js +33 -10
- package/lib/tools/auth0/handlers/databases.d.ts +14 -2
- package/lib/tools/auth0/handlers/databases.js +88 -24
- package/lib/tools/auth0/handlers/index.js +2 -0
- package/lib/tools/auth0/handlers/scimHandler.js +6 -0
- package/lib/tools/auth0/handlers/selfServiceProfiles.d.ts +8 -0
- package/lib/tools/auth0/handlers/selfServiceProfiles.js +9 -0
- package/lib/tools/constants.d.ts +1 -0
- package/lib/tools/constants.js +1 -0
- package/lib/tools/utils.d.ts +11 -0
- package/lib/tools/utils.js +24 -1
- package/lib/types.d.ts +3 -1
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [8.28.0] - 2026-02-20
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Add support for managing `action-modules`.(EA) [#1302]
|
|
15
|
+
- Add support for managing `modules` in `actions`.(EA) [#1302]
|
|
16
|
+
|
|
17
|
+
## [8.27.0] - 2026-02-13
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- Add support for `custom_password_hash.action_id` in `databases` (Universal Custom Password Hash EA). [#1288]
|
|
22
|
+
- Add support for `allowed_strategies` in `selfServiceProfiles`. [#1298]
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
- Fix validation handling for `authentication_methods.password.enabled` and `disable_self_service_change_password` in `databases`. [#1297]
|
|
27
|
+
- Fix stripping deprecated `enabled_clients` for `connections` with enhanced client management. [#1294]
|
|
28
|
+
- Fix exclude third-party `clientGrants` when `AUTH0_EXCLUDE_THIRD_PARTY_CLIENTS` is enabled. [#1289]
|
|
29
|
+
|
|
10
30
|
## [8.26.0] - 2026-01-30
|
|
11
31
|
|
|
12
32
|
### Added
|
|
@@ -1634,7 +1654,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
1634
1654
|
[#1282]: https://github.com/auth0/auth0-deploy-cli/issues/1282
|
|
1635
1655
|
[#1283]: https://github.com/auth0/auth0-deploy-cli/issues/1283
|
|
1636
1656
|
[#1284]: https://github.com/auth0/auth0-deploy-cli/issues/1284
|
|
1637
|
-
[
|
|
1657
|
+
[#1288]: https://github.com/auth0/auth0-deploy-cli/issues/1288
|
|
1658
|
+
[#1289]: https://github.com/auth0/auth0-deploy-cli/issues/1289
|
|
1659
|
+
[#1294]: https://github.com/auth0/auth0-deploy-cli/issues/1294
|
|
1660
|
+
[#1297]: https://github.com/auth0/auth0-deploy-cli/issues/1297
|
|
1661
|
+
[#1298]: https://github.com/auth0/auth0-deploy-cli/issues/1298
|
|
1662
|
+
[#1302]: https://github.com/auth0/auth0-deploy-cli/issues/1302
|
|
1663
|
+
[Unreleased]: https://github.com/auth0/auth0-deploy-cli/compare/v8.28.0...HEAD
|
|
1664
|
+
[8.28.0]: https://github.com/auth0/auth0-deploy-cli/compare/v8.27.0...v8.28.0
|
|
1665
|
+
[8.27.0]: https://github.com/auth0/auth0-deploy-cli/compare/v8.26.0...v8.27.0
|
|
1638
1666
|
[8.26.0]: https://github.com/auth0/auth0-deploy-cli/compare/v8.25.0...v8.26.0
|
|
1639
1667
|
[8.25.0]: https://github.com/auth0/auth0-deploy-cli/compare/v8.24.0...v8.25.0
|
|
1640
1668
|
[8.24.0]: https://github.com/auth0/auth0-deploy-cli/compare/v8.23.2...v8.24.0
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { DirectoryHandler } from '.';
|
|
2
|
+
import { Asset, ParsedAsset } from '../../../types';
|
|
3
|
+
type ParsedActionModules = ParsedAsset<'actionModules', Asset[]>;
|
|
4
|
+
declare const actionModulesHandler: DirectoryHandler<ParsedActionModules>;
|
|
5
|
+
export default actionModulesHandler;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
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
|
+
const path_1 = __importDefault(require("path"));
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const tools_1 = require("../../../tools");
|
|
9
|
+
const utils_1 = require("../../../utils");
|
|
10
|
+
const logger_1 = __importDefault(require("../../../logger"));
|
|
11
|
+
function parse(context) {
|
|
12
|
+
const modulesFolder = path_1.default.join(context.filePath, tools_1.constants.ACTION_MODULES_DIRECTORY);
|
|
13
|
+
if (!(0, utils_1.existsMustBeDir)(modulesFolder))
|
|
14
|
+
return { actionModules: null };
|
|
15
|
+
const files = (0, utils_1.getFiles)(modulesFolder, ['.json']);
|
|
16
|
+
const actionModules = files.map((file) => {
|
|
17
|
+
const module = {
|
|
18
|
+
...(0, utils_1.loadJSON)(file, {
|
|
19
|
+
mappings: context.mappings,
|
|
20
|
+
disableKeywordReplacement: context.disableKeywordReplacement,
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
const moduleFolder = path_1.default.join(tools_1.constants.ACTION_MODULES_DIRECTORY, `${module.name}`);
|
|
24
|
+
if (module.code) {
|
|
25
|
+
// The `module.code` can be a file path. It needs to be loaded.
|
|
26
|
+
// It can be a relative path, so we need to handle both cases.
|
|
27
|
+
const unixPath = module.code.replace(/[\\/]+/g, '/').replace(/^([a-zA-Z]+:|\.\/)/, '');
|
|
28
|
+
if (fs_extra_1.default.existsSync(unixPath)) {
|
|
29
|
+
module.code = context.loadFile(unixPath, moduleFolder);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
module.code = context.loadFile(path_1.default.join(context.filePath, module.code), moduleFolder);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return module;
|
|
36
|
+
});
|
|
37
|
+
return { actionModules };
|
|
38
|
+
}
|
|
39
|
+
function mapSecrets(secrets) {
|
|
40
|
+
if (typeof secrets === 'string') {
|
|
41
|
+
return secrets;
|
|
42
|
+
}
|
|
43
|
+
if (secrets && secrets.length > 0) {
|
|
44
|
+
return secrets.map((secret) => ({ name: secret.name, value: secret.value }));
|
|
45
|
+
}
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
function mapModuleCode(filePath, module) {
|
|
49
|
+
const { code } = module;
|
|
50
|
+
if (!code) {
|
|
51
|
+
return '';
|
|
52
|
+
}
|
|
53
|
+
const moduleName = (0, utils_1.sanitize)(module.name);
|
|
54
|
+
const moduleFolder = path_1.default.join(filePath, tools_1.constants.ACTION_MODULES_DIRECTORY, `${moduleName}`);
|
|
55
|
+
fs_extra_1.default.ensureDirSync(moduleFolder);
|
|
56
|
+
const codeFile = path_1.default.join(moduleFolder, 'code.js');
|
|
57
|
+
logger_1.default.info(`Writing ${codeFile}`);
|
|
58
|
+
fs_extra_1.default.writeFileSync(codeFile, code);
|
|
59
|
+
return `./${tools_1.constants.ACTION_MODULES_DIRECTORY}/${moduleName}/code.js`;
|
|
60
|
+
}
|
|
61
|
+
function mapToActionModule(filePath, module, includeIdentifiers) {
|
|
62
|
+
return {
|
|
63
|
+
...(includeIdentifiers && module.id ? { id: module.id } : {}),
|
|
64
|
+
name: module.name,
|
|
65
|
+
code: mapModuleCode(filePath, module),
|
|
66
|
+
dependencies: module.dependencies,
|
|
67
|
+
secrets: mapSecrets(module.secrets),
|
|
68
|
+
actions_using_module_total: module.actions_using_module_total,
|
|
69
|
+
all_changes_published: module.all_changes_published,
|
|
70
|
+
latest_version_number: module.latest_version_number,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async function dump(context) {
|
|
74
|
+
const { actionModules } = context.assets;
|
|
75
|
+
if (!actionModules)
|
|
76
|
+
return;
|
|
77
|
+
// Create action modules folder
|
|
78
|
+
const modulesFolder = path_1.default.join(context.filePath, tools_1.constants.ACTION_MODULES_DIRECTORY);
|
|
79
|
+
fs_extra_1.default.ensureDirSync(modulesFolder);
|
|
80
|
+
const includeIdentifiers = Boolean(context.config.AUTH0_EXPORT_IDENTIFIERS);
|
|
81
|
+
actionModules.forEach((module) => {
|
|
82
|
+
const name = (0, utils_1.sanitize)(module.name);
|
|
83
|
+
const moduleFile = path_1.default.join(modulesFolder, `${name}.json`);
|
|
84
|
+
(0, utils_1.dumpJSON)(moduleFile, mapToActionModule(context.filePath, module, includeIdentifiers));
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const actionModulesHandler = {
|
|
88
|
+
parse,
|
|
89
|
+
dump,
|
|
90
|
+
};
|
|
91
|
+
exports.default = actionModulesHandler;
|
|
@@ -73,6 +73,10 @@ function mapToAction(filePath, action, includeIdentifiers) {
|
|
|
73
73
|
supported_triggers: action.supported_triggers,
|
|
74
74
|
deployed: action.deployed || action.all_changes_deployed,
|
|
75
75
|
installed_integration_id: action.installed_integration_id,
|
|
76
|
+
modules: action.modules?.map((module) => ({
|
|
77
|
+
module_name: module.module_name,
|
|
78
|
+
module_version_number: module.module_version_number,
|
|
79
|
+
})),
|
|
76
80
|
};
|
|
77
81
|
}
|
|
78
82
|
async function dump(context) {
|
|
@@ -20,6 +20,7 @@ const guardianPhoneFactorSelectedProvider_1 = __importDefault(require("./guardia
|
|
|
20
20
|
const guardianPolicies_1 = __importDefault(require("./guardianPolicies"));
|
|
21
21
|
const roles_1 = __importDefault(require("./roles"));
|
|
22
22
|
const actions_1 = __importDefault(require("./actions"));
|
|
23
|
+
const actionModules_1 = __importDefault(require("./actionModules"));
|
|
23
24
|
const organizations_1 = __importDefault(require("./organizations"));
|
|
24
25
|
const triggers_1 = __importDefault(require("./triggers"));
|
|
25
26
|
const attackProtection_1 = __importDefault(require("./attackProtection"));
|
|
@@ -63,6 +64,7 @@ const directoryHandlers = {
|
|
|
63
64
|
guardianPolicies: guardianPolicies_1.default,
|
|
64
65
|
roles: roles_1.default,
|
|
65
66
|
actions: actions_1.default,
|
|
67
|
+
actionModules: actionModules_1.default,
|
|
66
68
|
organizations: organizations_1.default,
|
|
67
69
|
triggers: triggers_1.default,
|
|
68
70
|
attackProtection: attackProtection_1.default,
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { YAMLHandler } from '.';
|
|
2
|
+
import { ParsedAsset } from '../../../types';
|
|
3
|
+
import { ActionModule } from '../../../tools/auth0/handlers/actionModules';
|
|
4
|
+
type ParsedActionModules = ParsedAsset<'actionModules', Partial<ActionModule>[]>;
|
|
5
|
+
declare const ActionModulesHandler: YAMLHandler<ParsedActionModules>;
|
|
6
|
+
export default ActionModulesHandler;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
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
|
+
const path_1 = __importDefault(require("path"));
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const tools_1 = require("../../../tools");
|
|
9
|
+
const utils_1 = require("../../../utils");
|
|
10
|
+
const logger_1 = __importDefault(require("../../../logger"));
|
|
11
|
+
async function parse(context) {
|
|
12
|
+
const { actionModules } = context.assets;
|
|
13
|
+
if (!actionModules)
|
|
14
|
+
return { actionModules: null };
|
|
15
|
+
return {
|
|
16
|
+
actionModules: [
|
|
17
|
+
...actionModules.map((module) => ({
|
|
18
|
+
...module,
|
|
19
|
+
code: context.loadFile(module.code || ''),
|
|
20
|
+
})),
|
|
21
|
+
],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function mapSecrets(secrets) {
|
|
25
|
+
if (typeof secrets === 'string') {
|
|
26
|
+
return secrets;
|
|
27
|
+
}
|
|
28
|
+
if (secrets && secrets.length > 0) {
|
|
29
|
+
return secrets.map((secret) => ({ name: secret.name, value: secret.value }));
|
|
30
|
+
}
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
function mapModuleCode(basePath, module) {
|
|
34
|
+
const { code } = module;
|
|
35
|
+
if (!code) {
|
|
36
|
+
return '';
|
|
37
|
+
}
|
|
38
|
+
const moduleName = (0, utils_1.sanitize)(module.name);
|
|
39
|
+
const modulesFolder = path_1.default.join(basePath, tools_1.constants.ACTION_MODULES_DIRECTORY, moduleName);
|
|
40
|
+
fs_extra_1.default.ensureDirSync(modulesFolder);
|
|
41
|
+
const codeFile = path_1.default.join(modulesFolder, 'code.js');
|
|
42
|
+
logger_1.default.info(`Writing ${codeFile}`);
|
|
43
|
+
fs_extra_1.default.writeFileSync(codeFile, code);
|
|
44
|
+
return `./${tools_1.constants.ACTION_MODULES_DIRECTORY}/${moduleName}/code.js`;
|
|
45
|
+
}
|
|
46
|
+
async function dump(context) {
|
|
47
|
+
const { actionModules } = context.assets;
|
|
48
|
+
if (!actionModules || actionModules.length === 0)
|
|
49
|
+
return { actionModules: null };
|
|
50
|
+
const includeIdentifiers = Boolean(context.config.AUTH0_EXPORT_IDENTIFIERS);
|
|
51
|
+
return {
|
|
52
|
+
actionModules: actionModules?.map((module) => ({
|
|
53
|
+
...(includeIdentifiers && module.id ? { id: module.id } : {}),
|
|
54
|
+
name: module.name,
|
|
55
|
+
code: mapModuleCode(context.basePath, module),
|
|
56
|
+
dependencies: module.dependencies || [],
|
|
57
|
+
secrets: mapSecrets(module.secrets),
|
|
58
|
+
actions_using_module_total: module.actions_using_module_total,
|
|
59
|
+
all_changes_published: module.all_changes_published,
|
|
60
|
+
latest_version_number: module.latest_version_number,
|
|
61
|
+
})),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const ActionModulesHandler = {
|
|
65
|
+
parse,
|
|
66
|
+
dump,
|
|
67
|
+
};
|
|
68
|
+
exports.default = ActionModulesHandler;
|
|
@@ -77,6 +77,10 @@ async function dump(context) {
|
|
|
77
77
|
status: action.status,
|
|
78
78
|
secrets: mapSecrets(action.secrets),
|
|
79
79
|
supported_triggers: action.supported_triggers,
|
|
80
|
+
modules: action.modules?.map((module) => ({
|
|
81
|
+
module_name: module.module_name,
|
|
82
|
+
module_version_number: module.module_version_number,
|
|
83
|
+
})),
|
|
80
84
|
})),
|
|
81
85
|
};
|
|
82
86
|
}
|
|
@@ -21,6 +21,7 @@ const guardianPolicies_1 = __importDefault(require("./guardianPolicies"));
|
|
|
21
21
|
const roles_1 = __importDefault(require("./roles"));
|
|
22
22
|
const organizations_1 = __importDefault(require("./organizations"));
|
|
23
23
|
const actions_1 = __importDefault(require("./actions"));
|
|
24
|
+
const actionModules_1 = __importDefault(require("./actionModules"));
|
|
24
25
|
const triggers_1 = __importDefault(require("./triggers"));
|
|
25
26
|
const attackProtection_1 = __importDefault(require("./attackProtection"));
|
|
26
27
|
const riskAssessment_1 = __importDefault(require("./riskAssessment"));
|
|
@@ -63,6 +64,7 @@ const yamlHandlers = {
|
|
|
63
64
|
guardianPhoneFactorSelectedProvider: guardianPhoneFactorSelectedProvider_1.default,
|
|
64
65
|
guardianPolicies: guardianPolicies_1.default,
|
|
65
66
|
actions: actions_1.default,
|
|
67
|
+
actionModules: actionModules_1.default,
|
|
66
68
|
organizations: organizations_1.default,
|
|
67
69
|
triggers: triggers_1.default,
|
|
68
70
|
attackProtection: attackProtection_1.default,
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import DefaultAPIHandler from './default';
|
|
2
|
+
import { Asset, Assets } from '../../../types';
|
|
3
|
+
import { Management } from 'auth0';
|
|
4
|
+
export declare const schema: {
|
|
5
|
+
type: string;
|
|
6
|
+
items: {
|
|
7
|
+
type: string;
|
|
8
|
+
required: string[];
|
|
9
|
+
additionalProperties: boolean;
|
|
10
|
+
properties: {
|
|
11
|
+
name: {
|
|
12
|
+
type: string;
|
|
13
|
+
};
|
|
14
|
+
code: {
|
|
15
|
+
type: string;
|
|
16
|
+
};
|
|
17
|
+
dependencies: {
|
|
18
|
+
type: string;
|
|
19
|
+
items: {
|
|
20
|
+
type: string;
|
|
21
|
+
additionalProperties: boolean;
|
|
22
|
+
properties: {
|
|
23
|
+
name: {
|
|
24
|
+
type: string;
|
|
25
|
+
};
|
|
26
|
+
version: {
|
|
27
|
+
type: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
secrets: {
|
|
33
|
+
type: string;
|
|
34
|
+
items: {
|
|
35
|
+
type: string;
|
|
36
|
+
properties: {
|
|
37
|
+
name: {
|
|
38
|
+
type: string;
|
|
39
|
+
};
|
|
40
|
+
value: {
|
|
41
|
+
type: string;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
required: string[];
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
all_changes_published: {
|
|
48
|
+
type: string;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
export type ActionModule = Management.ActionModuleListItem;
|
|
54
|
+
export default class ActionModulesHandler extends DefaultAPIHandler {
|
|
55
|
+
existing: ActionModule[] | null;
|
|
56
|
+
constructor(options: DefaultAPIHandler);
|
|
57
|
+
createModule(module: Management.CreateActionModuleRequestContent): Promise<Management.CreateActionModuleResponseContent>;
|
|
58
|
+
updateModule(moduleId: string, module: Management.UpdateActionModuleRequestContent): Promise<Management.UpdateActionModuleResponseContent>;
|
|
59
|
+
deleteModule(moduleId: string): Promise<void>;
|
|
60
|
+
objString(module: ActionModule): string;
|
|
61
|
+
publishActionModules(modules: ActionModule[]): Promise<void>;
|
|
62
|
+
getType(): Promise<Asset[] | null>;
|
|
63
|
+
processChanges(assets: Assets): Promise<void>;
|
|
64
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
42
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.schema = void 0;
|
|
46
|
+
const default_1 = __importStar(require("./default"));
|
|
47
|
+
const logger_1 = __importDefault(require("../../../logger"));
|
|
48
|
+
const client_1 = require("../client");
|
|
49
|
+
exports.schema = {
|
|
50
|
+
type: 'array',
|
|
51
|
+
items: {
|
|
52
|
+
type: 'object',
|
|
53
|
+
required: ['name', 'code'],
|
|
54
|
+
additionalProperties: true,
|
|
55
|
+
properties: {
|
|
56
|
+
name: { type: 'string' },
|
|
57
|
+
code: { type: 'string' },
|
|
58
|
+
dependencies: {
|
|
59
|
+
type: 'array',
|
|
60
|
+
items: {
|
|
61
|
+
type: 'object',
|
|
62
|
+
additionalProperties: false,
|
|
63
|
+
properties: {
|
|
64
|
+
name: { type: 'string' },
|
|
65
|
+
version: { type: 'string' },
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
secrets: {
|
|
70
|
+
type: 'array',
|
|
71
|
+
items: {
|
|
72
|
+
type: 'object',
|
|
73
|
+
properties: {
|
|
74
|
+
name: { type: 'string' },
|
|
75
|
+
value: { type: 'string' },
|
|
76
|
+
},
|
|
77
|
+
required: ['name'],
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
all_changes_published: { type: 'boolean' },
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
class ActionModulesHandler extends default_1.default {
|
|
85
|
+
constructor(options) {
|
|
86
|
+
super({
|
|
87
|
+
...options,
|
|
88
|
+
type: 'actionModules',
|
|
89
|
+
id: 'id',
|
|
90
|
+
identifiers: ['id', 'name'],
|
|
91
|
+
stripUpdateFields: [
|
|
92
|
+
'name',
|
|
93
|
+
'actions_using_module_total',
|
|
94
|
+
'all_changes_published',
|
|
95
|
+
'latest_version_number',
|
|
96
|
+
'created_at',
|
|
97
|
+
'updated_at',
|
|
98
|
+
],
|
|
99
|
+
stripCreateFields: [
|
|
100
|
+
'actions_using_module_total',
|
|
101
|
+
'latest_version_number',
|
|
102
|
+
'created_at',
|
|
103
|
+
'updated_at',
|
|
104
|
+
],
|
|
105
|
+
functions: {
|
|
106
|
+
create: (module) => this.createModule(module),
|
|
107
|
+
update: (id, module) => this.updateModule(id, module),
|
|
108
|
+
delete: (id) => this.deleteModule(id),
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
async createModule(module) {
|
|
113
|
+
if ('all_changes_published' in module) {
|
|
114
|
+
delete module.all_changes_published;
|
|
115
|
+
}
|
|
116
|
+
const createdModule = await this.client.actions.modules.create(module);
|
|
117
|
+
return createdModule;
|
|
118
|
+
}
|
|
119
|
+
async updateModule(moduleId, module) {
|
|
120
|
+
const updatableModule = {
|
|
121
|
+
code: module.code,
|
|
122
|
+
dependencies: module.dependencies,
|
|
123
|
+
secrets: module.secrets,
|
|
124
|
+
};
|
|
125
|
+
return this.client.actions.modules.update(moduleId, updatableModule);
|
|
126
|
+
}
|
|
127
|
+
async deleteModule(moduleId) {
|
|
128
|
+
return this.client.actions.modules.delete(moduleId);
|
|
129
|
+
}
|
|
130
|
+
objString(module) {
|
|
131
|
+
return super.objString({ id: module.id, name: module.name });
|
|
132
|
+
}
|
|
133
|
+
async publishActionModules(modules) {
|
|
134
|
+
await this.client.pool
|
|
135
|
+
.addEachTask({
|
|
136
|
+
data: modules || [],
|
|
137
|
+
generator: (module) => this.client.actions.modules.versions
|
|
138
|
+
.create(module.id)
|
|
139
|
+
.then(() => {
|
|
140
|
+
logger_1.default.info(`Published [${this.type}]: ${this.objString(module)}`);
|
|
141
|
+
})
|
|
142
|
+
.catch((err) => {
|
|
143
|
+
throw new Error(`Problem Publishing ${this.type} ${this.objString(module)}\n${err}`);
|
|
144
|
+
}),
|
|
145
|
+
})
|
|
146
|
+
.promise();
|
|
147
|
+
}
|
|
148
|
+
async getType() {
|
|
149
|
+
if (this.existing)
|
|
150
|
+
return this.existing;
|
|
151
|
+
try {
|
|
152
|
+
const modules = await (0, client_1.paginate)(this.client.actions.modules.list, {
|
|
153
|
+
paginate: true,
|
|
154
|
+
});
|
|
155
|
+
this.existing = modules;
|
|
156
|
+
return this.existing;
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
if (err.statusCode === 404 || err.statusCode === 501) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
if (err.statusCode === 403 || err.errorCode === 'feature_not_enabled') {
|
|
163
|
+
logger_1.default.debug('Skipping action modules because it is not enabled.');
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
throw err;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Before actions are processed
|
|
170
|
+
async processChanges(assets) {
|
|
171
|
+
const { actionModules } = assets;
|
|
172
|
+
// Do nothing if not set
|
|
173
|
+
if (!actionModules)
|
|
174
|
+
return;
|
|
175
|
+
const changes = await this.calcChanges(assets);
|
|
176
|
+
await super.processChanges(assets, changes);
|
|
177
|
+
// Refresh module list to get latest state with all_changes_published field
|
|
178
|
+
const postProcessedModules = await (async () => {
|
|
179
|
+
this.existing = null; // Clear the cache
|
|
180
|
+
return this.getType();
|
|
181
|
+
})();
|
|
182
|
+
// Publish modules that have unpublished changes
|
|
183
|
+
const modulesToPublish = [
|
|
184
|
+
...changes.create
|
|
185
|
+
.filter((module) => module.all_changes_published === true)
|
|
186
|
+
.map((moduleWithoutId) => {
|
|
187
|
+
// Add IDs to just-created modules
|
|
188
|
+
const moduleId = postProcessedModules?.find((postProcessedModule) => postProcessedModule.name === moduleWithoutId.name)?.id;
|
|
189
|
+
const module = postProcessedModules?.find((postProcessedModule) => postProcessedModule.id === moduleId);
|
|
190
|
+
return module;
|
|
191
|
+
}),
|
|
192
|
+
...changes.update.filter((module) => module.all_changes_published === true),
|
|
193
|
+
].filter((module) => module !== undefined);
|
|
194
|
+
await this.publishActionModules(modulesToPublish);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.default = ActionModulesHandler;
|
|
198
|
+
__decorate([
|
|
199
|
+
(0, default_1.order)('50')
|
|
200
|
+
], ActionModulesHandler.prototype, "processChanges", null);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Management } from 'auth0';
|
|
2
2
|
import DefaultAPIHandler from './default';
|
|
3
|
-
import { Asset, Assets } from '../../../types';
|
|
3
|
+
import { Asset, Assets, CalculatedChanges } from '../../../types';
|
|
4
|
+
import { ActionModule } from './actionModules';
|
|
4
5
|
export type Action = Management.Action & {
|
|
5
6
|
deployed?: boolean;
|
|
6
7
|
};
|
|
@@ -80,6 +81,21 @@ export declare const schema: {
|
|
|
80
81
|
};
|
|
81
82
|
};
|
|
82
83
|
};
|
|
84
|
+
modules: {
|
|
85
|
+
type: string;
|
|
86
|
+
items: {
|
|
87
|
+
type: string;
|
|
88
|
+
required: string[];
|
|
89
|
+
properties: {
|
|
90
|
+
module_name: {
|
|
91
|
+
type: string;
|
|
92
|
+
};
|
|
93
|
+
module_version_number: {
|
|
94
|
+
type: string;
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
};
|
|
83
99
|
deployed: {
|
|
84
100
|
type: string;
|
|
85
101
|
};
|
|
@@ -101,6 +117,8 @@ export default class ActionHandler extends DefaultAPIHandler {
|
|
|
101
117
|
deployAction(action: any): Promise<void>;
|
|
102
118
|
actionChanges(action: any, found: any): Promise<Asset>;
|
|
103
119
|
getType(): Promise<Asset[] | null>;
|
|
120
|
+
calcChanges(assets: Assets): Promise<CalculatedChanges>;
|
|
121
|
+
enrichActionWithModuleIds(action: Action, modules: ActionModule[]): Promise<Action>;
|
|
104
122
|
processChanges(assets: Assets): Promise<void>;
|
|
105
123
|
}
|
|
106
124
|
export {};
|