@sw-tsdk/plugin-connector 3.9.2 → 3.11.2
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 +84 -35
- package/lib/commands/action/run/local.js +1 -1
- package/lib/commands/action/run/local.js.map +1 -1
- package/lib/commands/connector/create/openapi.js +48 -30
- package/lib/commands/connector/create/openapi.js.map +1 -1
- package/lib/commands/migrator/convert.d.ts +25 -0
- package/lib/commands/migrator/convert.js +224 -0
- package/lib/commands/migrator/convert.js.map +1 -0
- package/lib/commands/migrator/export.d.ts +13 -0
- package/lib/commands/migrator/export.js +121 -0
- package/lib/commands/migrator/export.js.map +1 -0
- package/lib/common.js +1 -0
- package/lib/common.js.map +1 -1
- package/lib/templates/migrator-runners/image.png +0 -0
- package/lib/templates/migrator-runners/plugin_override.txt +34 -0
- package/lib/templates/migrator-runners/runner_override.txt +22 -0
- package/lib/templates/migrator-runners/script_override.txt +31 -0
- package/lib/templates/python_312_definition/template/connector/config/actions/example.yaml +40 -0
- package/lib/templates/python_312_definition/template/connector/config/assets/example.yaml +27 -0
- package/lib/templates/python_312_definition/template/data/asset.json +1 -0
- package/lib/templates/python_312_definition/template/docs/CHANGELOG.md.t +7 -0
- package/lib/templates/python_312_definition/template/docs/README.md +38 -0
- package/lib/templates/python_312_definition/template/requirements.txt +0 -0
- package/lib/templates/python_312_definition/template_src/connector/config/actions/example.yaml +40 -0
- package/lib/templates/python_312_definition/template_src/connector/config/assets/example.yaml +27 -0
- package/lib/templates/python_312_definition/template_src/connector/src/runner_override.py +11 -0
- package/lib/templates/python_312_definition/template_src/data/asset.json +1 -0
- package/lib/templates/python_312_definition/template_src/docs/CHANGELOG.md.t +7 -0
- package/lib/templates/python_312_definition/template_src/docs/README.md +38 -0
- package/lib/templates/python_312_definition/template_src/requirements.txt +0 -0
- package/lib/transformers/base-transformer.d.ts +6 -0
- package/lib/transformers/base-transformer.js +54 -0
- package/lib/transformers/base-transformer.js.map +1 -0
- package/lib/transformers/connector-generator.d.ts +18 -0
- package/lib/transformers/connector-generator.js +327 -0
- package/lib/transformers/connector-generator.js.map +1 -0
- package/lib/transformers/forked-plugin-transformer.d.ts +4 -0
- package/lib/transformers/forked-plugin-transformer.js +16 -0
- package/lib/transformers/forked-plugin-transformer.js.map +1 -0
- package/lib/transformers/index.d.ts +3 -0
- package/lib/transformers/index.js +17 -0
- package/lib/transformers/index.js.map +1 -0
- package/lib/transformers/script-transformer.d.ts +5 -0
- package/lib/transformers/script-transformer.js +16 -0
- package/lib/transformers/script-transformer.js.map +1 -0
- package/lib/types/migrator-types.d.ts +59 -0
- package/lib/types/migrator-types.js +18 -0
- package/lib/types/migrator-types.js.map +1 -0
- package/oclif.manifest.json +133 -2
- package/package.json +13 -6
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
## Overview
|
|
2
|
+
|
|
3
|
+
A brief description goes here. Be sure to provide an overview of what the plugin does. Include description of the
|
|
4
|
+
product being integrated, plus use cases/value prop of the Swimlane integration.
|
|
5
|
+
|
|
6
|
+
## Prerequisites
|
|
7
|
+
|
|
8
|
+
Prerequisites, everything outside of the plugin itself. This should include info on how to
|
|
9
|
+
configure the device (API Key, Perms, ect)
|
|
10
|
+
|
|
11
|
+
## Capabilities
|
|
12
|
+
|
|
13
|
+
This Connector provides the following capabilities:
|
|
14
|
+
|
|
15
|
+
* Capabilities
|
|
16
|
+
* Go
|
|
17
|
+
* Here
|
|
18
|
+
* e.g. Manage Firewall Policies instead of listing each individual tasks
|
|
19
|
+
|
|
20
|
+
### Limitations
|
|
21
|
+
|
|
22
|
+
Include information about known limitations here, including supported or minimum versions, especially
|
|
23
|
+
known unsupported versions.
|
|
24
|
+
|
|
25
|
+
## Asset Setup
|
|
26
|
+
|
|
27
|
+
The content here should discuss asset setup in a conversational manner. Be sure to include any known login
|
|
28
|
+
and test connection errors.
|
|
29
|
+
|
|
30
|
+
## Tasks Setup
|
|
31
|
+
Special task setup as needed depending on plugin, exclude if empty.
|
|
32
|
+
|
|
33
|
+
Known available allowed input options from enum type selection
|
|
34
|
+
|
|
35
|
+
## Notes
|
|
36
|
+
|
|
37
|
+
* Any other notes not fitting other sections go here.
|
|
38
|
+
* Any reference URLs to external docs or other resources
|
|
File without changes
|
package/lib/templates/python_312_definition/template_src/connector/config/actions/example.yaml
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# THIS IS AN EXAMPLE, PLEASE USE THE SDK TO CREATE A NEW ACTION and DELETE
|
|
2
|
+
name: action_name
|
|
3
|
+
schema: action/1
|
|
4
|
+
title: ''
|
|
5
|
+
description: ''
|
|
6
|
+
inputs: # Use the SDK to autogenerate the inputs, can be 'object' or 'array' type.
|
|
7
|
+
type: object
|
|
8
|
+
properties: # the following are used for definition runner.
|
|
9
|
+
path_parameters: # remove if path parameters are not needed.
|
|
10
|
+
type: object
|
|
11
|
+
description: Path Parameters
|
|
12
|
+
properties:
|
|
13
|
+
required:
|
|
14
|
+
parameters:
|
|
15
|
+
type: object
|
|
16
|
+
description: URL Query Parameters
|
|
17
|
+
properties:
|
|
18
|
+
required:
|
|
19
|
+
json_body: # remove if no json_body is needed.
|
|
20
|
+
type: object
|
|
21
|
+
description: Body
|
|
22
|
+
properties:
|
|
23
|
+
required:
|
|
24
|
+
data_body: # remove if no data_body is needed.
|
|
25
|
+
type: object
|
|
26
|
+
description: Body
|
|
27
|
+
properties:
|
|
28
|
+
required:
|
|
29
|
+
headers: # remove if no custom headers are needed.
|
|
30
|
+
type: object
|
|
31
|
+
description: Body
|
|
32
|
+
properties:
|
|
33
|
+
required:
|
|
34
|
+
output: # use the SDK to autogenerate the output schema. This can be 'object' or 'array' type.
|
|
35
|
+
type: object
|
|
36
|
+
properties:
|
|
37
|
+
additionalProperties: true
|
|
38
|
+
meta:
|
|
39
|
+
endpoint: turbine-api/v3/turbine # full path to endpoint after host.
|
|
40
|
+
method: GET
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# THIS IS AN EXAMPLE, PLEASE USE THE SDK TO CREATE A NEW ASSET and DELETE
|
|
2
|
+
schema: asset/1
|
|
3
|
+
name: asset
|
|
4
|
+
title: Virus Total API Key Authentication
|
|
5
|
+
description: ''
|
|
6
|
+
inputs:
|
|
7
|
+
type: object
|
|
8
|
+
properties:
|
|
9
|
+
url:
|
|
10
|
+
type: string
|
|
11
|
+
default: https://www.swimlane.com # add the default if cloud.
|
|
12
|
+
x-apikey:
|
|
13
|
+
type: string
|
|
14
|
+
verify_ssl:
|
|
15
|
+
type: boolean
|
|
16
|
+
http_proxy:
|
|
17
|
+
type: string
|
|
18
|
+
default: https://www.proxy.com
|
|
19
|
+
required:
|
|
20
|
+
- url
|
|
21
|
+
- x-apikey # example
|
|
22
|
+
meta:
|
|
23
|
+
asset_url_key: url
|
|
24
|
+
security: # example of header auth. All security objects must follow OpenAPI spec auth.
|
|
25
|
+
type: apiKey
|
|
26
|
+
name: x-apikey # example
|
|
27
|
+
in: header
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from connector_definition_runner import Runner
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class RunnerOverride(Runner):
|
|
5
|
+
|
|
6
|
+
def __init__(self, asset, asset_schema, http_proxy):
|
|
7
|
+
# Initialise asset and proxies
|
|
8
|
+
super().__init__(asset, asset_schema, http_proxy)
|
|
9
|
+
|
|
10
|
+
def run(self, inputs, action_schema):
|
|
11
|
+
return super().run(inputs, action_schema)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
## Overview
|
|
2
|
+
|
|
3
|
+
A brief description goes here. Be sure to provide an overview of what the plugin does. Include description of the
|
|
4
|
+
product being integrated, plus use cases/value prop of the Swimlane integration.
|
|
5
|
+
|
|
6
|
+
## Prerequisites
|
|
7
|
+
|
|
8
|
+
Prerequisites, everything outside of the plugin itself. This should include info on how to
|
|
9
|
+
configure the device (API Key, Perms, ect)
|
|
10
|
+
|
|
11
|
+
## Capabilities
|
|
12
|
+
|
|
13
|
+
This Connector provides the following capabilities:
|
|
14
|
+
|
|
15
|
+
* Capabilities
|
|
16
|
+
* Go
|
|
17
|
+
* Here
|
|
18
|
+
* e.g. Manage Firewall Policies instead of listing each individual tasks
|
|
19
|
+
|
|
20
|
+
### Limitations
|
|
21
|
+
|
|
22
|
+
Include information about known limitations here, including supported or minimum versions, especially
|
|
23
|
+
known unsupported versions.
|
|
24
|
+
|
|
25
|
+
## Asset Setup
|
|
26
|
+
|
|
27
|
+
The content here should discuss asset setup in a conversational manner. Be sure to include any known login
|
|
28
|
+
and test connection errors.
|
|
29
|
+
|
|
30
|
+
## Tasks Setup
|
|
31
|
+
Special task setup as needed depending on plugin, exclude if empty.
|
|
32
|
+
|
|
33
|
+
Known available allowed input options from enum type selection
|
|
34
|
+
|
|
35
|
+
## Notes
|
|
36
|
+
|
|
37
|
+
* Any other notes not fitting other sections go here.
|
|
38
|
+
* Any reference URLs to external docs or other resources
|
|
File without changes
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { TransformationResult } from '../types/migrator-types';
|
|
2
|
+
export declare abstract class BaseTransformer {
|
|
3
|
+
abstract transform(jsonFileContent: any): TransformationResult;
|
|
4
|
+
protected parseCommonFields(jsonFileContent: any): any;
|
|
5
|
+
scriptIsValid(script: string): boolean;
|
|
6
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseTransformer = void 0;
|
|
4
|
+
class BaseTransformer {
|
|
5
|
+
parseCommonFields(jsonFileContent) {
|
|
6
|
+
const MAX_LENGTH = 49;
|
|
7
|
+
const truncateIfNeeded = (name, field) => {
|
|
8
|
+
if (!name)
|
|
9
|
+
return '';
|
|
10
|
+
if (name.length > MAX_LENGTH) {
|
|
11
|
+
console.warn(`Warning: ${field} exceeds ${MAX_LENGTH} characters and will be truncated. Original: ${name}`);
|
|
12
|
+
return name.slice(0, Math.max(0, MAX_LENGTH));
|
|
13
|
+
}
|
|
14
|
+
return name;
|
|
15
|
+
};
|
|
16
|
+
const inputs = (jsonFileContent?.InputMapping ?? []).map((input) => ({
|
|
17
|
+
...input,
|
|
18
|
+
Key: typeof input.Key === 'string' ?
|
|
19
|
+
input.Key.replaceAll(' ', '_') :
|
|
20
|
+
input.Key,
|
|
21
|
+
}));
|
|
22
|
+
const outputs = (jsonFileContent?.Outputs ?? [])
|
|
23
|
+
.flatMap((output) => output.Mappings ?? [])
|
|
24
|
+
.map((mapping) => ({
|
|
25
|
+
Key: typeof mapping.Key === 'string' ? mapping.Key.replaceAll(' ', '_') : mapping.Key,
|
|
26
|
+
Title: mapping.Key,
|
|
27
|
+
ValueType: 'string',
|
|
28
|
+
Example: mapping.Example || [],
|
|
29
|
+
Description: '',
|
|
30
|
+
}));
|
|
31
|
+
return {
|
|
32
|
+
description: jsonFileContent?.Action?.Descriptor?.Description,
|
|
33
|
+
family: jsonFileContent?.Action?.Descriptor?.Family,
|
|
34
|
+
base64Image: jsonFileContent?.Action?.Descriptor?.Base64Image,
|
|
35
|
+
pythonVersion: jsonFileContent?.Action?.Descriptor?.PythonVersion,
|
|
36
|
+
actionName: truncateIfNeeded(jsonFileContent?.Action?.Descriptor?.Name, 'actionName'),
|
|
37
|
+
script: jsonFileContent?.Action?.Script,
|
|
38
|
+
exportName: truncateIfNeeded(jsonFileContent?.Name, 'exportName'),
|
|
39
|
+
exportUid: truncateIfNeeded(jsonFileContent?.Uid.replaceAll('-', '_'), 'exportUid'),
|
|
40
|
+
forkedName: truncateIfNeeded(jsonFileContent?.Action?.ForkedFromPackage, 'forkedName'),
|
|
41
|
+
inputs,
|
|
42
|
+
outputs,
|
|
43
|
+
author: jsonFileContent?.CreatedByUser?.Author,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
scriptIsValid(script) {
|
|
47
|
+
const containsMongoImports = script.includes('from pymongo import MongoClient' || 'import pymongo');
|
|
48
|
+
const containsSwimlaneDriver = script.includes('from swimlane import Swimlane' || 'from swimlane import SwimlaneClient' || 'import Swimlane');
|
|
49
|
+
const containsInternalConfig = script.includes('sw_context.config');
|
|
50
|
+
return !(containsMongoImports || containsSwimlaneDriver || containsInternalConfig);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.BaseTransformer = BaseTransformer;
|
|
54
|
+
//# sourceMappingURL=base-transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-transformer.js","sourceRoot":"","sources":["../../src/transformers/base-transformer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AppTasks, ConnectorMigrationConfig, TransformationResult } from '../types/migrator-types';
|
|
2
|
+
export declare class ConnectorGenerator {
|
|
3
|
+
static initializeForkedPlugin(transformedExport: TransformationResult, fromDirectory: string, toDirectory: string): Promise<void>;
|
|
4
|
+
static generateLogo(toDirectory: string): Promise<void>;
|
|
5
|
+
static generateBaseStructure(toDirectory: string): Promise<void>;
|
|
6
|
+
static generateRunnerOverride(toDirectory: string): Promise<void>;
|
|
7
|
+
static generateAction(transformedExport: TransformationResult, toDirectory: string): Promise<void>;
|
|
8
|
+
private static generateAsset;
|
|
9
|
+
private static extractZip;
|
|
10
|
+
static generateRequirements(fromDirectory: string, toDirectory: string, packageName: string): Promise<void>;
|
|
11
|
+
private static createBaseCode;
|
|
12
|
+
private static getBaseCodePath;
|
|
13
|
+
private static getActionContentFork;
|
|
14
|
+
private static getActionContentScript;
|
|
15
|
+
static generateActionConfig(transformationResult: TransformationResult, toDirectory: string): Promise<boolean>;
|
|
16
|
+
private static createFile;
|
|
17
|
+
static generateConnectorManifest(connectorConfig: ConnectorMigrationConfig, group: AppTasks, toDir: string): Promise<void>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConnectorGenerator = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const connector_interfaces_1 = require("@swimlane/connector-interfaces");
|
|
6
|
+
const node_fs_1 = require("node:fs");
|
|
7
|
+
const node_path_1 = require("node:path");
|
|
8
|
+
const js_yaml_1 = tslib_1.__importDefault(require("js-yaml"));
|
|
9
|
+
const adm_zip_1 = tslib_1.__importDefault(require("adm-zip"));
|
|
10
|
+
class ConnectorGenerator {
|
|
11
|
+
static async initializeForkedPlugin(transformedExport, fromDirectory, toDirectory) {
|
|
12
|
+
const { forkedName } = transformedExport;
|
|
13
|
+
console.log(`Initializing forked plugin: ${forkedName}`);
|
|
14
|
+
await Promise.all([
|
|
15
|
+
this.createBaseCode(fromDirectory, toDirectory, forkedName),
|
|
16
|
+
this.generateRequirements(fromDirectory, toDirectory, forkedName),
|
|
17
|
+
this.generateAsset(fromDirectory, toDirectory, forkedName),
|
|
18
|
+
]);
|
|
19
|
+
console.log(`Forked plugin initialized: ${forkedName}`);
|
|
20
|
+
}
|
|
21
|
+
static async generateLogo(toDirectory) {
|
|
22
|
+
const templatePath = (0, node_path_1.join)(__dirname, '../templates/migrator-runners/image.png');
|
|
23
|
+
const outputPath = (0, node_path_1.join)(toDirectory, 'image', 'logo.png');
|
|
24
|
+
const image = await node_fs_1.promises.readFile(templatePath);
|
|
25
|
+
await node_fs_1.promises.writeFile(outputPath, image);
|
|
26
|
+
}
|
|
27
|
+
static async generateBaseStructure(toDirectory) {
|
|
28
|
+
await node_fs_1.promises.mkdir((0, node_path_1.join)(toDirectory, 'connector', 'config', 'actions'), { recursive: true });
|
|
29
|
+
await node_fs_1.promises.mkdir((0, node_path_1.join)(toDirectory, 'image'));
|
|
30
|
+
await node_fs_1.promises.mkdir((0, node_path_1.join)(toDirectory, 'docs'));
|
|
31
|
+
await node_fs_1.promises.mkdir((0, node_path_1.join)(toDirectory, 'data'));
|
|
32
|
+
await node_fs_1.promises.mkdir((0, node_path_1.join)(toDirectory, 'doc_images'));
|
|
33
|
+
await node_fs_1.promises.mkdir((0, node_path_1.join)(toDirectory, 'connector', 'config', 'assets'));
|
|
34
|
+
await node_fs_1.promises.mkdir((0, node_path_1.join)(toDirectory, 'connector', 'src'));
|
|
35
|
+
await this.createFile((0, node_path_1.join)(toDirectory, 'requirements.txt'), '');
|
|
36
|
+
await this.createFile((0, node_path_1.join)(toDirectory, 'docs', 'changelog.md'), '');
|
|
37
|
+
await this.createFile((0, node_path_1.join)(toDirectory, 'docs', 'readme.md'), '# Example Readme');
|
|
38
|
+
await this.createFile((0, node_path_1.join)(toDirectory, 'docs', 'EXTERNAL_README.md'), '# Example External Readme');
|
|
39
|
+
await this.createFile((0, node_path_1.join)(toDirectory, 'docs', 'external.yml'), '');
|
|
40
|
+
await this.createFile((0, node_path_1.join)(toDirectory, 'readme.md'), '# Example Readme');
|
|
41
|
+
}
|
|
42
|
+
static async generateRunnerOverride(toDirectory) {
|
|
43
|
+
const templatePath = (0, node_path_1.join)(__dirname, '../templates/migrator-runners/runner_override.txt');
|
|
44
|
+
const outputPath = (0, node_path_1.join)(toDirectory, 'connector', 'src', 'runner_override.py');
|
|
45
|
+
try {
|
|
46
|
+
const content = await node_fs_1.promises.readFile(templatePath, 'utf8');
|
|
47
|
+
await this.createFile(outputPath, content);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
console.error('Failed to generate runner override');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
static async generateAction(transformedExport, toDirectory) {
|
|
54
|
+
let content;
|
|
55
|
+
if (transformedExport.type === 'script') {
|
|
56
|
+
content = transformedExport.error ? `Error: ${transformedExport.error}` : await this.getActionContentScript(transformedExport.script);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
content = transformedExport.error ? `Error: ${transformedExport.error}` : await this.getActionContentFork(transformedExport.script);
|
|
60
|
+
}
|
|
61
|
+
const outputPath = (0, node_path_1.join)(toDirectory, 'connector', 'src', `${transformedExport.exportUid}.py`);
|
|
62
|
+
await this.createFile(outputPath, content);
|
|
63
|
+
}
|
|
64
|
+
static async generateAsset(fromDirectory, toDirectory, packageName) {
|
|
65
|
+
const assetPath = (0, node_path_1.join)(fromDirectory, 'packages', packageName, 'imports', 'asset.json');
|
|
66
|
+
const destinationPath = (0, node_path_1.join)(toDirectory, 'connector', 'config', 'assets', 'asset.yaml');
|
|
67
|
+
try {
|
|
68
|
+
await node_fs_1.promises.access(assetPath);
|
|
69
|
+
const assetContent = await node_fs_1.promises.readFile(assetPath, 'utf8');
|
|
70
|
+
const assetJson = JSON.parse(assetContent);
|
|
71
|
+
const inputProperties = {};
|
|
72
|
+
const requiredInputs = [];
|
|
73
|
+
for (const [key, rawValue] of Object.entries(assetJson.inputParameters || {})) {
|
|
74
|
+
const value = rawValue;
|
|
75
|
+
inputProperties[key] = {
|
|
76
|
+
title: value.name || key,
|
|
77
|
+
description: value.description || '',
|
|
78
|
+
type: 'string',
|
|
79
|
+
};
|
|
80
|
+
if (value.type === 4) {
|
|
81
|
+
inputProperties[key].format = 'password';
|
|
82
|
+
}
|
|
83
|
+
if (value.example !== undefined) {
|
|
84
|
+
inputProperties[key].example = value.example;
|
|
85
|
+
}
|
|
86
|
+
if (value.default !== undefined) {
|
|
87
|
+
inputProperties[key].default = value.default;
|
|
88
|
+
}
|
|
89
|
+
if (value.required) {
|
|
90
|
+
requiredInputs.push(key);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const assetYaml = js_yaml_1.default.dump({
|
|
94
|
+
schema: 'asset/1',
|
|
95
|
+
name: 'asset',
|
|
96
|
+
title: assetJson.name,
|
|
97
|
+
description: assetJson.description,
|
|
98
|
+
inputs: {
|
|
99
|
+
type: 'object',
|
|
100
|
+
properties: inputProperties,
|
|
101
|
+
required: requiredInputs.length > 0 ? requiredInputs : undefined,
|
|
102
|
+
},
|
|
103
|
+
meta: {},
|
|
104
|
+
});
|
|
105
|
+
await node_fs_1.promises.writeFile(destinationPath, assetYaml, 'utf8');
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
console.error(`Error generating asset for ${packageName}:`, error);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
static async extractZip(fromDirectory, packageName) {
|
|
112
|
+
const zipPath = (0, node_path_1.join)(fromDirectory, 'packages', `${packageName}.zip`);
|
|
113
|
+
const extractPath = (0, node_path_1.join)(fromDirectory, 'packages', packageName);
|
|
114
|
+
try {
|
|
115
|
+
await node_fs_1.promises.access(zipPath);
|
|
116
|
+
console.log(`Extracting ${zipPath}...`);
|
|
117
|
+
const zip = new adm_zip_1.default(zipPath);
|
|
118
|
+
zip.extractAllTo(extractPath, true);
|
|
119
|
+
console.log(`Successfully extracted ${packageName}.zip.`);
|
|
120
|
+
return extractPath;
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.error(`Error extracting ZIP file for ${packageName}:`, error);
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
static async generateRequirements(fromDirectory, toDirectory, packageName) {
|
|
128
|
+
const packageExtractedDir = (0, node_path_1.join)(fromDirectory, 'packages', packageName);
|
|
129
|
+
const requirementsPath = (0, node_path_1.join)(toDirectory, 'requirements.txt');
|
|
130
|
+
try {
|
|
131
|
+
const files = await node_fs_1.promises.readdir(packageExtractedDir);
|
|
132
|
+
const whlFiles = files.filter(file => file.endsWith('.whl'));
|
|
133
|
+
if (whlFiles.length === 0) {
|
|
134
|
+
console.warn(`No .whl files found in ${packageExtractedDir}`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const dependencies = whlFiles
|
|
138
|
+
.map(whlFile => {
|
|
139
|
+
const match = whlFile.match(/^([\w-]+)-([\d.]+)-/);
|
|
140
|
+
if (!match)
|
|
141
|
+
return null;
|
|
142
|
+
const packageNameFromWhl = match[1];
|
|
143
|
+
const packageVersion = match[2];
|
|
144
|
+
// Skip the package itself (eg sw_microsoft_office)
|
|
145
|
+
if (packageNameFromWhl === packageName) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
return `${packageNameFromWhl}==${packageVersion}`;
|
|
149
|
+
})
|
|
150
|
+
.filter(Boolean);
|
|
151
|
+
await node_fs_1.promises.appendFile(requirementsPath, dependencies.join('\n') + '\n');
|
|
152
|
+
console.log(`requirements.txt generated at: ${requirementsPath}`);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
console.error('Error generating requirements.txt:', error);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
static async createBaseCode(fromDirectory, toDirectory, packageName) {
|
|
159
|
+
const extractedPath = await this.extractZip(fromDirectory, packageName);
|
|
160
|
+
if (!extractedPath)
|
|
161
|
+
return;
|
|
162
|
+
const whlPath = await this.getBaseCodePath(fromDirectory, packageName);
|
|
163
|
+
if (!whlPath)
|
|
164
|
+
return;
|
|
165
|
+
const tempExtractDir = (0, node_path_1.join)(fromDirectory, 'packages', `${packageName}_extracted`);
|
|
166
|
+
await node_fs_1.promises.mkdir(tempExtractDir, { recursive: true });
|
|
167
|
+
try {
|
|
168
|
+
const zip = new adm_zip_1.default(whlPath);
|
|
169
|
+
zip.extractAllTo(tempExtractDir, true);
|
|
170
|
+
const extractedFiles = await node_fs_1.promises.readdir(tempExtractDir);
|
|
171
|
+
const basePackageDir = extractedFiles.find(dir => dir === packageName);
|
|
172
|
+
if (!basePackageDir) {
|
|
173
|
+
console.error(`Could not find base package folder inside: ${whlPath}`);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const destinationPath = (0, node_path_1.join)(toDirectory, 'connector', 'src', packageName);
|
|
177
|
+
await node_fs_1.promises.mkdir(destinationPath, { recursive: true });
|
|
178
|
+
const baseCodePath = (0, node_path_1.join)(tempExtractDir, basePackageDir);
|
|
179
|
+
const baseFiles = await node_fs_1.promises.readdir(baseCodePath);
|
|
180
|
+
await Promise.all(baseFiles.map(file => node_fs_1.promises.rename((0, node_path_1.join)(baseCodePath, file), (0, node_path_1.join)(destinationPath, file))));
|
|
181
|
+
console.log(`Base code for ${packageName} moved successfully.`);
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
console.error(`Error extracting and moving base code for ${packageName}:`, error);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
static async getBaseCodePath(fromDirectory, packageName) {
|
|
188
|
+
const packageDir = (0, node_path_1.join)(fromDirectory, 'packages', packageName);
|
|
189
|
+
try {
|
|
190
|
+
const files = await node_fs_1.promises.readdir(packageDir);
|
|
191
|
+
const whlFile = files.find(file => file.startsWith(`${packageName}-`) && file.endsWith('.whl'));
|
|
192
|
+
if (!whlFile) {
|
|
193
|
+
console.error(`Could not find .whl file for package: ${packageName}`);
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
return (0, node_path_1.join)(packageDir, whlFile);
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
console.error(`Error accessing package directory: ${packageDir}`, error);
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
static async getActionContentFork(script) {
|
|
204
|
+
try {
|
|
205
|
+
const templateContent = await node_fs_1.promises.readFile((0, node_path_1.join)(__dirname, '../templates/migrator-runners/plugin_override.txt'), 'utf8');
|
|
206
|
+
// Remove any carriage returns to avoid CRLF issues
|
|
207
|
+
const scriptNoCR = script.replaceAll('\r', '');
|
|
208
|
+
return templateContent.replace('# HERE', scriptNoCR);
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
console.error('Failed to load action forked template', error);
|
|
212
|
+
return `Error during forked plugin generation: ${error}`;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
static async getActionContentScript(script) {
|
|
216
|
+
try {
|
|
217
|
+
const templateContent = await node_fs_1.promises.readFile((0, node_path_1.join)(__dirname, '../templates/migrator-runners/script_override.txt'), 'utf8');
|
|
218
|
+
// Remove any carriage returns to avoid CRLF issues
|
|
219
|
+
const scriptNoCR = script.replaceAll('\r', '');
|
|
220
|
+
const lines = scriptNoCR.split('\n');
|
|
221
|
+
if (lines.length === 0) {
|
|
222
|
+
return templateContent.replace('# HERE', '');
|
|
223
|
+
}
|
|
224
|
+
const firstLine = lines[0];
|
|
225
|
+
const subsequentIndented = lines.slice(1)
|
|
226
|
+
.map(line => ` ${line}`)
|
|
227
|
+
.join('\n');
|
|
228
|
+
const combinedScript = subsequentIndented ?
|
|
229
|
+
`${firstLine}\n${subsequentIndented}` :
|
|
230
|
+
firstLine;
|
|
231
|
+
return templateContent.replace('# HERE', combinedScript);
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
console.error('Failed to load action script template', error);
|
|
235
|
+
return `Error during script generation: ${error}`;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
static async generateActionConfig(transformationResult, toDirectory) {
|
|
239
|
+
const exportUid = transformationResult.exportUid;
|
|
240
|
+
const outputPath = (0, node_path_1.join)(toDirectory, 'connector', 'config', 'actions', `${exportUid}.yaml`);
|
|
241
|
+
const yamlData = {
|
|
242
|
+
schema: 'action/1',
|
|
243
|
+
title: transformationResult.exportName,
|
|
244
|
+
name: transformationResult.exportUid,
|
|
245
|
+
description: transformationResult.description,
|
|
246
|
+
inputs: {
|
|
247
|
+
type: 'object',
|
|
248
|
+
properties: {},
|
|
249
|
+
required: [],
|
|
250
|
+
additionalProperties: true,
|
|
251
|
+
},
|
|
252
|
+
output: {
|
|
253
|
+
type: 'object',
|
|
254
|
+
properties: {},
|
|
255
|
+
required: [],
|
|
256
|
+
additionalProperties: true,
|
|
257
|
+
},
|
|
258
|
+
meta: {
|
|
259
|
+
endpoint: '',
|
|
260
|
+
method: '',
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
for (const input of transformationResult.inputs) {
|
|
264
|
+
yamlData.inputs.properties[input.Key] = {
|
|
265
|
+
title: input.Title || input.Key,
|
|
266
|
+
type: input.ValueType || 'string',
|
|
267
|
+
examples: input.Example,
|
|
268
|
+
};
|
|
269
|
+
if (input.Creds) {
|
|
270
|
+
yamlData.inputs.properties[input.Key].format = 'password';
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
for (const output of transformationResult.outputs) {
|
|
274
|
+
yamlData.output.properties[output.Key] = {
|
|
275
|
+
title: output.Title,
|
|
276
|
+
type: output.ValueType,
|
|
277
|
+
examples: output.Example,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
const yamlString = js_yaml_1.default.dump(yamlData, { indent: 2 });
|
|
281
|
+
await this.createFile(outputPath, yamlString);
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
static async createFile(dir, data) {
|
|
285
|
+
await node_fs_1.promises.writeFile(dir, data);
|
|
286
|
+
}
|
|
287
|
+
static async generateConnectorManifest(connectorConfig, group, toDir) {
|
|
288
|
+
const connectorNameUid = group.connectorName
|
|
289
|
+
.replaceAll(/[^\w -]/g, '')
|
|
290
|
+
.replaceAll(/\s+/g, '_')
|
|
291
|
+
.toLowerCase();
|
|
292
|
+
const data = {
|
|
293
|
+
author: connectorConfig.author || connectorConfig.vendor,
|
|
294
|
+
bugs: '',
|
|
295
|
+
description: connectorConfig.description,
|
|
296
|
+
homepage: connectorConfig.homepage,
|
|
297
|
+
iconImage: '../image/logo.png',
|
|
298
|
+
keywords: ['Custom', 'User created'],
|
|
299
|
+
license: 'AGPL-3.0',
|
|
300
|
+
meta: {
|
|
301
|
+
imageRepository: `quay.io/swimlane-connectors/${connectorNameUid}`,
|
|
302
|
+
private: false,
|
|
303
|
+
publishConfig: {
|
|
304
|
+
access: 'public',
|
|
305
|
+
},
|
|
306
|
+
buildConfig: {
|
|
307
|
+
template: group.pythonDefinition,
|
|
308
|
+
},
|
|
309
|
+
},
|
|
310
|
+
name: connectorNameUid,
|
|
311
|
+
product: connectorConfig.product || 'Unknown Product',
|
|
312
|
+
repository: `https://github.com/swimlane/t_${connectorNameUid}`,
|
|
313
|
+
schema: 'connector/1',
|
|
314
|
+
title: group.connectorName,
|
|
315
|
+
vendor: connectorConfig.vendor || 'Unknown Vendor',
|
|
316
|
+
version: '1.0.0',
|
|
317
|
+
runConfig: {
|
|
318
|
+
inputs: {
|
|
319
|
+
type: connector_interfaces_1.ConnectorInputsType.stdin,
|
|
320
|
+
},
|
|
321
|
+
},
|
|
322
|
+
};
|
|
323
|
+
await this.createFile((0, node_path_1.join)(toDir, 'connector', 'connector.yaml'), js_yaml_1.default.dump(data, { noRefs: true }));
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
exports.ConnectorGenerator = ConnectorGenerator;
|
|
327
|
+
//# sourceMappingURL=connector-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connector-generator.js","sourceRoot":"","sources":["../../src/transformers/connector-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ForkedPluginTransformer = void 0;
|
|
4
|
+
const base_transformer_1 = require("./base-transformer");
|
|
5
|
+
class ForkedPluginTransformer extends base_transformer_1.BaseTransformer {
|
|
6
|
+
transform(jsonFileContent) {
|
|
7
|
+
const commonFields = this.parseCommonFields(jsonFileContent);
|
|
8
|
+
return {
|
|
9
|
+
...commonFields,
|
|
10
|
+
type: 'forked-plugin',
|
|
11
|
+
dependencies: [],
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.ForkedPluginTransformer = ForkedPluginTransformer;
|
|
16
|
+
//# sourceMappingURL=forked-plugin-transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forked-plugin-transformer.js","sourceRoot":"","sources":["../../src/transformers/forked-plugin-transformer.ts"],"names":[],"mappings":";;;AAAA,yDAAkD;AAElD,MAAa,uBAAwB,SAAQ,kCAAe;IACnD,SAAS,CAAC,eAAoB;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAA;QAE5D,OAAO;YACL,GAAG,YAAY;YACf,IAAI,EAAE,eAAe;YACrB,YAAY,EAAE,EAAE;SACjB,CAAA;IACH,CAAC;CACF;AAVD,0DAUC"}
|