@itentialopensource/adapter-microsoft_graph 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- package/.eslintignore +6 -0
- package/.eslintrc.js +18 -0
- package/.gitlab/.gitkeep +0 -0
- package/.gitlab/issue_templates/.gitkeep +0 -0
- package/.gitlab/issue_templates/Default.md +17 -0
- package/.gitlab/issue_templates/bugReportTemplate.md +42 -0
- package/.gitlab/issue_templates/featureRequestTemplate.md +14 -0
- package/.jshintrc +0 -0
- package/AUTH.md +39 -0
- package/BROKER.md +199 -0
- package/CALLS.md +170 -0
- package/CHANGELOG.md +9 -0
- package/CODE_OF_CONDUCT.md +43 -0
- package/CONTRIBUTING.md +172 -0
- package/ENHANCE.md +69 -0
- package/LICENSE +201 -0
- package/PROPERTIES.md +641 -0
- package/README.md +337 -0
- package/SUMMARY.md +9 -0
- package/SYSTEMINFO.md +11 -0
- package/TROUBLESHOOT.md +47 -0
- package/adapter.js +18798 -0
- package/adapterBase.js +1787 -0
- package/entities/.generic/action.json +214 -0
- package/entities/.generic/schema.json +28 -0
- package/entities/.system/action.json +50 -0
- package/entities/.system/mockdatafiles/getToken-default.json +3 -0
- package/entities/.system/mockdatafiles/healthcheck-default.json +3 -0
- package/entities/.system/schema.json +19 -0
- package/entities/.system/schemaTokenReq.json +53 -0
- package/entities/.system/schemaTokenResp.json +53 -0
- package/entities/Applications/action.json +127 -0
- package/entities/Applications/schema.json +35 -0
- package/entities/AzureADDevice/action.json +106 -0
- package/entities/AzureADDevice/schema.json +45 -0
- package/entities/Batch/action.json +24 -0
- package/entities/Batch/schema.json +19 -0
- package/entities/CaseCreation/action.json +249 -0
- package/entities/CaseCreation/schema.json +30 -0
- package/entities/Catalog/action.json +25 -0
- package/entities/Catalog/schema.json +19 -0
- package/entities/ConnectionSetup/action.json +148 -0
- package/entities/ConnectionSetup/schema.json +25 -0
- package/entities/ContentSync/action.json +65 -0
- package/entities/ContentSync/schema.json +21 -0
- package/entities/CreateDSR/action.json +45 -0
- package/entities/CreateDSR/schema.json +20 -0
- package/entities/Deployment/action.json +106 -0
- package/entities/Deployment/schema.json +34 -0
- package/entities/DeploymentAudience/action.json +66 -0
- package/entities/DeploymentAudience/schema.json +32 -0
- package/entities/Events/action.json +108 -0
- package/entities/Events/schema.json +34 -0
- package/entities/Files/action.json +108 -0
- package/entities/Files/schema.json +23 -0
- package/entities/Groups/action.json +25 -0
- package/entities/Groups/schema.json +19 -0
- package/entities/IdentitySync/action.json +105 -0
- package/entities/IdentitySync/schema.json +23 -0
- package/entities/Insights/action.json +46 -0
- package/entities/Insights/schema.json +20 -0
- package/entities/LabelManagement/action.json +106 -0
- package/entities/LabelManagement/schema.json +23 -0
- package/entities/Mail/action.json +212 -0
- package/entities/Mail/schema.json +72 -0
- package/entities/Memberships/action.json +167 -0
- package/entities/Memberships/schema.json +70 -0
- package/entities/Misc/action.json +66 -0
- package/entities/Misc/schema.json +21 -0
- package/entities/Notebooks/action.json +107 -0
- package/entities/Notebooks/schema.json +34 -0
- package/entities/OpenExtensions/action.json +65 -0
- package/entities/OpenExtensions/schema.json +54 -0
- package/entities/People/action.json +46 -0
- package/entities/People/schema.json +31 -0
- package/entities/SchemaExtensions/action.json +65 -0
- package/entities/SchemaExtensions/schema.json +32 -0
- package/entities/Search/action.json +24 -0
- package/entities/Search/schema.json +19 -0
- package/entities/Security/action.json +151 -0
- package/entities/Security/schema.json +58 -0
- package/entities/SharePoint/action.json +214 -0
- package/entities/SharePoint/schema.json +39 -0
- package/entities/Subscriptions/action.json +65 -0
- package/entities/Subscriptions/schema.json +32 -0
- package/entities/TasksPlanner/action.json +272 -0
- package/entities/TasksPlanner/schema.json +86 -0
- package/entities/TasksTodo/action.json +187 -0
- package/entities/TasksTodo/schema.json +49 -0
- package/entities/Teams/action.json +519 -0
- package/entities/Teams/schema.json +120 -0
- package/entities/TrackDSRStatus/action.json +108 -0
- package/entities/TrackDSRStatus/schema.json +23 -0
- package/entities/TriggerEventForExistingLabel/action.json +108 -0
- package/entities/TriggerEventForExistingLabel/schema.json +23 -0
- package/entities/Users/action.json +213 -0
- package/entities/Users/schema.json +50 -0
- package/entities/WorkflowAutomation/action.json +249 -0
- package/entities/WorkflowAutomation/schema.json +30 -0
- package/error.json +190 -0
- package/package.json +87 -0
- package/pronghorn.json +8654 -0
- package/propertiesDecorators.json +14 -0
- package/propertiesSchema.json +1248 -0
- package/refs?service=git-upload-pack +0 -0
- package/report/creationReport.json +1715 -0
- package/report/graph.json +14709 -0
- package/sampleProperties.json +195 -0
- package/test/integration/adapterTestBasicGet.js +83 -0
- package/test/integration/adapterTestConnectivity.js +93 -0
- package/test/integration/adapterTestIntegration.js +6059 -0
- package/test/unit/adapterBaseTestUnit.js +949 -0
- package/test/unit/adapterTestUnit.js +7492 -0
- package/utils/adapterInfo.js +206 -0
- package/utils/addAuth.js +94 -0
- package/utils/artifactize.js +146 -0
- package/utils/basicGet.js +50 -0
- package/utils/checkMigrate.js +63 -0
- package/utils/entitiesToDB.js +178 -0
- package/utils/findPath.js +74 -0
- package/utils/methodDocumentor.js +225 -0
- package/utils/modify.js +154 -0
- package/utils/packModificationScript.js +35 -0
- package/utils/patches2bundledDeps.js +90 -0
- package/utils/pre-commit.sh +32 -0
- package/utils/removeHooks.js +20 -0
- package/utils/setup.js +33 -0
- package/utils/tbScript.js +246 -0
- package/utils/tbUtils.js +490 -0
- package/utils/testRunner.js +298 -0
- package/utils/troubleshootingAdapter.js +195 -0
- package/workflows/README.md +3 -0
@@ -0,0 +1,206 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
/* @copyright Itential, LLC 2019 */
|
3
|
+
/* eslint global-require:warn */
|
4
|
+
/* eslint import/no-dynamic-require:warn */
|
5
|
+
/* eslint prefer-destructuring:warn */
|
6
|
+
|
7
|
+
const fs = require('fs-extra');
|
8
|
+
const path = require('path');
|
9
|
+
|
10
|
+
/**
|
11
|
+
* This script will determine the information about the adapter and store
|
12
|
+
* it into a file in the adapter.
|
13
|
+
*/
|
14
|
+
|
15
|
+
/**
|
16
|
+
* get adapter information
|
17
|
+
*/
|
18
|
+
function adapterInfo() {
|
19
|
+
// set the base pase of the adapter - tool shoud be one level up in utils
|
20
|
+
let adaptdir = __dirname;
|
21
|
+
const infoRes = {};
|
22
|
+
|
23
|
+
if (adaptdir.endsWith('/utils')) {
|
24
|
+
adaptdir = adaptdir.substring(0, adaptdir.length - 6);
|
25
|
+
}
|
26
|
+
const pack = require(`${adaptdir}/package.json`);
|
27
|
+
infoRes.version = pack.version;
|
28
|
+
|
29
|
+
let configCount = 0;
|
30
|
+
if (fs.existsSync(`${adaptdir}/pronghorn.json`)) {
|
31
|
+
const cFile = fs.readFileSync(`${adaptdir}/pronghorn.json`, 'utf8');
|
32
|
+
configCount += cFile.split('\n').length;
|
33
|
+
} else {
|
34
|
+
console.log('Missing - pronghorn.json');
|
35
|
+
}
|
36
|
+
if (fs.existsSync(`${adaptdir}/propertiesSchema.json`)) {
|
37
|
+
const cFile = fs.readFileSync(`${adaptdir}/propertiesSchema.json`, 'utf8');
|
38
|
+
configCount += cFile.split('\n').length;
|
39
|
+
} else {
|
40
|
+
console.log('Missing - propertiesSchema.json');
|
41
|
+
}
|
42
|
+
if (fs.existsSync(`${adaptdir}/error.json`)) {
|
43
|
+
const cFile = fs.readFileSync(`${adaptdir}/error.json`, 'utf8');
|
44
|
+
configCount += cFile.split('\n').length;
|
45
|
+
} else {
|
46
|
+
console.log('Missing - error.json');
|
47
|
+
}
|
48
|
+
const entitydir = path.join(adaptdir, '/entities');
|
49
|
+
if (fs.existsSync(entitydir) && fs.statSync(entitydir).isDirectory()) {
|
50
|
+
const entities = fs.readdirSync(entitydir);
|
51
|
+
// need to go through each entity in the entities directory
|
52
|
+
for (let e = 0; e < entities.length; e += 1) {
|
53
|
+
if (fs.statSync(`${entitydir}/${entities[e]}`).isDirectory()) {
|
54
|
+
const cfiles = fs.readdirSync(entitydir);
|
55
|
+
for (let c = 0; c < cfiles.length; c += 1) {
|
56
|
+
if (cfiles[c].endsWith('.json')) {
|
57
|
+
const ccFile = fs.readFileSync(`${entitydir}/${entities[e]}/${cfiles[c]}`, 'utf8');
|
58
|
+
configCount += ccFile.split('\n').length;
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}
|
62
|
+
}
|
63
|
+
} else {
|
64
|
+
console.log('Could not find the entities directory');
|
65
|
+
}
|
66
|
+
infoRes.configLines = configCount;
|
67
|
+
|
68
|
+
let scodeCount = 0;
|
69
|
+
if (fs.existsSync(`${adaptdir}/utils/artifactize.js`)) {
|
70
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/artifactize.js`, 'utf8');
|
71
|
+
scodeCount += sFile.split('\n').length;
|
72
|
+
} else {
|
73
|
+
console.log('Missing - utils/artifactize.js');
|
74
|
+
}
|
75
|
+
if (fs.existsSync(`${adaptdir}/utils/basicGet.js`)) {
|
76
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/basicGet.js`, 'utf8');
|
77
|
+
scodeCount += sFile.split('\n').length;
|
78
|
+
} else {
|
79
|
+
console.log('Missing - utils/basicGet.js');
|
80
|
+
}
|
81
|
+
if (fs.existsSync(`${adaptdir}/utils/checkMigrate.js`)) {
|
82
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/checkMigrate.js`, 'utf8');
|
83
|
+
scodeCount += sFile.split('\n').length;
|
84
|
+
} else {
|
85
|
+
console.log('Missing - utils/checkMigrate.js');
|
86
|
+
}
|
87
|
+
if (fs.existsSync(`${adaptdir}/utils/findPath.js`)) {
|
88
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/findPath.js`, 'utf8');
|
89
|
+
scodeCount += sFile.split('\n').length;
|
90
|
+
} else {
|
91
|
+
console.log('Missing - utils/findPath.js');
|
92
|
+
}
|
93
|
+
if (fs.existsSync(`${adaptdir}/utils/modify.js`)) {
|
94
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/modify.js`, 'utf8');
|
95
|
+
scodeCount += sFile.split('\n').length;
|
96
|
+
} else {
|
97
|
+
console.log('Missing - utils/modify.js');
|
98
|
+
}
|
99
|
+
if (fs.existsSync(`${adaptdir}/utils/packModificationScript.js`)) {
|
100
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/packModificationScript.js`, 'utf8');
|
101
|
+
scodeCount += sFile.split('\n').length;
|
102
|
+
} else {
|
103
|
+
console.log('Missing - utils/packModificationScript.js');
|
104
|
+
}
|
105
|
+
if (fs.existsSync(`${adaptdir}/utils/setup.js`)) {
|
106
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/setup.js`, 'utf8');
|
107
|
+
scodeCount += sFile.split('\n').length;
|
108
|
+
} else {
|
109
|
+
console.log('Missing - utils/setup.js');
|
110
|
+
}
|
111
|
+
if (fs.existsSync(`${adaptdir}/utils/tbScript.js`)) {
|
112
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/tbScript.js`, 'utf8');
|
113
|
+
scodeCount += sFile.split('\n').length;
|
114
|
+
} else {
|
115
|
+
console.log('Missing - utils/tbScript.js');
|
116
|
+
}
|
117
|
+
if (fs.existsSync(`${adaptdir}/utils/tbUtils.js`)) {
|
118
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/tbUtils.js`, 'utf8');
|
119
|
+
scodeCount += sFile.split('\n').length;
|
120
|
+
} else {
|
121
|
+
console.log('Missing - utils/tbUtils.js');
|
122
|
+
}
|
123
|
+
if (fs.existsSync(`${adaptdir}/utils/testRunner.js`)) {
|
124
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/testRunner.js`, 'utf8');
|
125
|
+
scodeCount += sFile.split('\n').length;
|
126
|
+
} else {
|
127
|
+
console.log('Missing - utils/testRunner.js');
|
128
|
+
}
|
129
|
+
if (fs.existsSync(`${adaptdir}/utils/troubleshootingAdapter.js`)) {
|
130
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/troubleshootingAdapter.js`, 'utf8');
|
131
|
+
scodeCount += sFile.split('\n').length;
|
132
|
+
} else {
|
133
|
+
console.log('Missing - utils/troubleshootingAdapter.js');
|
134
|
+
}
|
135
|
+
infoRes.scriptLines = scodeCount;
|
136
|
+
|
137
|
+
let codeCount = 0;
|
138
|
+
if (fs.existsSync(`${adaptdir}/adapter.js`)) {
|
139
|
+
const aFile = fs.readFileSync(`${adaptdir}/adapter.js`, 'utf8');
|
140
|
+
codeCount += aFile.split('\n').length;
|
141
|
+
} else {
|
142
|
+
console.log('Missing - utils/adapter.js');
|
143
|
+
}
|
144
|
+
if (fs.existsSync(`${adaptdir}/adapterBase.js`)) {
|
145
|
+
const aFile = fs.readFileSync(`${adaptdir}/adapterBase.js`, 'utf8');
|
146
|
+
codeCount += aFile.split('\n').length;
|
147
|
+
} else {
|
148
|
+
console.log('Missing - utils/adapterBase.js');
|
149
|
+
}
|
150
|
+
infoRes.codeLines = codeCount;
|
151
|
+
|
152
|
+
let tcodeCount = 0;
|
153
|
+
let ttestCount = 0;
|
154
|
+
if (fs.existsSync(`${adaptdir}/test/integration/adapterTestBasicGet.js`)) {
|
155
|
+
const tFile = fs.readFileSync(`${adaptdir}/test/integration/adapterTestBasicGet.js`, 'utf8');
|
156
|
+
tcodeCount += tFile.split('\n').length;
|
157
|
+
ttestCount += tFile.split('it(\'').length;
|
158
|
+
} else {
|
159
|
+
console.log('Missing - test/integration/adapterTestBasicGet.js');
|
160
|
+
}
|
161
|
+
if (fs.existsSync(`${adaptdir}/test/integration/adapterTestConnectivity.js`)) {
|
162
|
+
const tFile = fs.readFileSync(`${adaptdir}/test/integration/adapterTestConnectivity.js`, 'utf8');
|
163
|
+
tcodeCount += tFile.split('\n').length;
|
164
|
+
ttestCount += tFile.split('it(\'').length;
|
165
|
+
} else {
|
166
|
+
console.log('Missing - test/integration/adapterTestConnectivity.js');
|
167
|
+
}
|
168
|
+
if (fs.existsSync(`${adaptdir}/test/integration/adapterTestIntegration.js`)) {
|
169
|
+
const tFile = fs.readFileSync(`${adaptdir}/test/integration/adapterTestIntegration.js`, 'utf8');
|
170
|
+
tcodeCount += tFile.split('\n').length;
|
171
|
+
ttestCount += tFile.split('it(\'').length;
|
172
|
+
} else {
|
173
|
+
console.log('Missing - test/integration/adapterTestIntegration.js');
|
174
|
+
}
|
175
|
+
if (fs.existsSync(`${adaptdir}/test/unit/adapterBaseTestUnit.js`)) {
|
176
|
+
const tFile = fs.readFileSync(`${adaptdir}/test/unit/adapterBaseTestUnit.js`, 'utf8');
|
177
|
+
tcodeCount += tFile.split('\n').length;
|
178
|
+
ttestCount += tFile.split('it(\'').length;
|
179
|
+
} else {
|
180
|
+
console.log('Missing - test/unit/adapterBaseTestUnit.js');
|
181
|
+
}
|
182
|
+
if (fs.existsSync(`${adaptdir}/test/unit/adapterTestUnit.js`)) {
|
183
|
+
const tFile = fs.readFileSync(`${adaptdir}/test/unit/adapterTestUnit.js`, 'utf8');
|
184
|
+
tcodeCount += tFile.split('\n').length;
|
185
|
+
ttestCount += tFile.split('it(\'').length;
|
186
|
+
} else {
|
187
|
+
console.log('Missing - test/unit/adapterTestUnit.js');
|
188
|
+
}
|
189
|
+
infoRes.testLines = tcodeCount;
|
190
|
+
infoRes.testCases = ttestCount;
|
191
|
+
infoRes.totalCodeLines = scodeCount + codeCount + tcodeCount;
|
192
|
+
|
193
|
+
if (fs.existsSync(`${adaptdir}/pronghorn.json`)) {
|
194
|
+
// Read the entity schema from the file system
|
195
|
+
const phFile = path.join(adaptdir, '/pronghorn.json');
|
196
|
+
const prong = require(phFile);
|
197
|
+
infoRes.wfTasks = prong.methods.length;
|
198
|
+
} else {
|
199
|
+
console.log('Missing - pronghorn.json');
|
200
|
+
}
|
201
|
+
|
202
|
+
console.log(JSON.stringify(infoRes));
|
203
|
+
fs.writeFileSync(`${adaptdir}/report/adapterInfo.json`, JSON.stringify(infoRes, null, 2));
|
204
|
+
}
|
205
|
+
|
206
|
+
adapterInfo();
|
package/utils/addAuth.js
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
/* eslint-disable no-plusplus */
|
2
|
+
/* eslint global-require: warn */
|
3
|
+
/* eslint import/no-dynamic-require: warn */
|
4
|
+
|
5
|
+
const rls = require('readline-sync');
|
6
|
+
const path = require('path');
|
7
|
+
const fs = require('fs');
|
8
|
+
|
9
|
+
function getQuestions(props, obj) {
|
10
|
+
const questions = props.map((p) => `${p}: ${(obj[p] !== undefined) ? `(${obj[p]})` : ''} `);
|
11
|
+
return questions;
|
12
|
+
}
|
13
|
+
|
14
|
+
// function outputs each property for user to edit/confirm
|
15
|
+
// props are the fields that need to be changed depending on what the user selects
|
16
|
+
// obj is the JSON object that's being updated
|
17
|
+
function confirm(props, obj) {
|
18
|
+
// create array of questions
|
19
|
+
const updatedObj = obj;
|
20
|
+
getQuestions(props, obj).forEach((q) => {
|
21
|
+
const answer = rls.question(q);
|
22
|
+
// only update the field if the answer is NOT and empty string
|
23
|
+
if (answer) {
|
24
|
+
updatedObj[q.split(':')[0].trim()] = answer;
|
25
|
+
}
|
26
|
+
});
|
27
|
+
return updatedObj;
|
28
|
+
}
|
29
|
+
|
30
|
+
const updateBasicAuth = (auth) => {
|
31
|
+
const propsToUpdate = ['username', 'password', 'auth_field', 'auth_field_format'];
|
32
|
+
return confirm(propsToUpdate, auth);
|
33
|
+
};
|
34
|
+
|
35
|
+
const updateStaticTokenAuth = (auth) => {
|
36
|
+
const propsToUpdate = ['token', 'auth_field', 'auth_field_format'];
|
37
|
+
return confirm(propsToUpdate, auth);
|
38
|
+
};
|
39
|
+
|
40
|
+
function updateTokenSchemas(user, pw, token) {
|
41
|
+
let schemaPath = path.join(__dirname, '..', 'entities/.system/schemaTokenReq.json');
|
42
|
+
const reqSchema = require(schemaPath);
|
43
|
+
reqSchema.properties.username.external_name = user;
|
44
|
+
reqSchema.properties.password.external_name = pw;
|
45
|
+
fs.writeFileSync(schemaPath, JSON.stringify(reqSchema, null, 2));
|
46
|
+
schemaPath = path.join(__dirname, '..', 'entities/.system/schemaTokenResp.json');
|
47
|
+
const respSchema = require(schemaPath);
|
48
|
+
respSchema.properties.token.external_name = token;
|
49
|
+
fs.writeFileSync(schemaPath, JSON.stringify(respSchema, null, 2));
|
50
|
+
}
|
51
|
+
|
52
|
+
function updateRequestToken(auth) {
|
53
|
+
const propsToUpdate = [
|
54
|
+
'username',
|
55
|
+
'password',
|
56
|
+
'auth_field',
|
57
|
+
'auth_field_format',
|
58
|
+
'token_user_field',
|
59
|
+
'token_password_field',
|
60
|
+
'token_result_field',
|
61
|
+
'token_URI_path'
|
62
|
+
];
|
63
|
+
const newAuth = confirm(propsToUpdate, auth);
|
64
|
+
updateTokenSchemas(newAuth.token_user_field, newAuth.token_password_field, newAuth.token_result_field);
|
65
|
+
|
66
|
+
return newAuth;
|
67
|
+
}
|
68
|
+
|
69
|
+
// prompt users to pick an auth method from the list above
|
70
|
+
const addAuthInfo = (props) => {
|
71
|
+
const authOptions = [
|
72
|
+
'basic user_password',
|
73
|
+
'static_token',
|
74
|
+
'request_token',
|
75
|
+
'no_authentication'
|
76
|
+
];
|
77
|
+
const newProps = confirm(['host', 'port', 'base_path'], props);
|
78
|
+
|
79
|
+
const newAuthMethod = authOptions[rls.keyInSelect(authOptions, 'Which authentication method?')];
|
80
|
+
newProps.authentication.auth_method = newAuthMethod;
|
81
|
+
|
82
|
+
if (newAuthMethod === 'basic user_password') {
|
83
|
+
newProps.authentication = updateBasicAuth(newProps.authentication);
|
84
|
+
} else if (newAuthMethod === 'static_token') {
|
85
|
+
newProps.authentication = updateStaticTokenAuth(newProps.authentication);
|
86
|
+
} else if (newAuthMethod === 'request_token') {
|
87
|
+
newProps.authentication = updateRequestToken(newProps.authentication);
|
88
|
+
}
|
89
|
+
console.log('Connectivity and authentication properties have been configured');
|
90
|
+
console.log('If you want to make changes, rerun this script to reinstall the adapter');
|
91
|
+
return newProps;
|
92
|
+
};
|
93
|
+
|
94
|
+
module.exports = { addAuthInfo };
|
@@ -0,0 +1,146 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
/* @copyright Itential, LLC 2019 */
|
3
|
+
|
4
|
+
const fs = require('fs-extra');
|
5
|
+
const path = require('path');
|
6
|
+
|
7
|
+
async function createBundle(adapterOldDir) {
|
8
|
+
// set directories
|
9
|
+
const artifactDir = path.join(adapterOldDir, '../artifactTemp');
|
10
|
+
const workflowsDir = path.join(adapterOldDir, 'workflows');
|
11
|
+
|
12
|
+
// read adapter's package and set names
|
13
|
+
const adapterPackage = fs.readJSONSync(path.join(adapterOldDir, 'package.json'));
|
14
|
+
const originalName = adapterPackage.name.substring(adapterPackage.name.lastIndexOf('/') + 1);
|
15
|
+
const shortenedName = originalName.replace('adapter-', '');
|
16
|
+
const artifactName = originalName.replace('adapter', 'bundled-adapter');
|
17
|
+
|
18
|
+
const adapterNewDir = path.join(artifactDir, 'bundles', 'adapters', originalName);
|
19
|
+
fs.ensureDirSync(adapterNewDir);
|
20
|
+
|
21
|
+
const ops = [];
|
22
|
+
|
23
|
+
// copy old adapterDir to bundled hierarchy location
|
24
|
+
ops.push(() => fs.copySync(adapterOldDir, adapterNewDir));
|
25
|
+
|
26
|
+
// copy readme
|
27
|
+
ops.push(() => fs.copySync(path.join(adapterOldDir, 'README.md'), path.join(artifactDir, 'README.md')));
|
28
|
+
|
29
|
+
// copy changelog
|
30
|
+
if (fs.existsSync(path.join(adapterOldDir, 'CHANGELOG.md'))) {
|
31
|
+
ops.push(() => fs.copySync(path.join(adapterOldDir, 'CHANGELOG.md'), path.join(artifactDir, 'CHANGELOG.md')));
|
32
|
+
}
|
33
|
+
|
34
|
+
// copy license
|
35
|
+
if (fs.existsSync(path.join(adapterOldDir, 'LICENSE'))) {
|
36
|
+
ops.push(() => fs.copySync(path.join(adapterOldDir, 'LICENSE'), path.join(artifactDir, 'LICENSE')));
|
37
|
+
}
|
38
|
+
|
39
|
+
// create package
|
40
|
+
const artifactPackage = {
|
41
|
+
name: artifactName,
|
42
|
+
version: adapterPackage.version,
|
43
|
+
description: `A bundled version of the ${originalName} to be used in adapter-artifacts for easy installation`,
|
44
|
+
scripts: {
|
45
|
+
test: 'echo "Error: no test specified" && exit 1',
|
46
|
+
deploy: 'npm publish --registry=http://registry.npmjs.org'
|
47
|
+
},
|
48
|
+
keywords: [
|
49
|
+
'IAP',
|
50
|
+
'artifacts',
|
51
|
+
'Itential',
|
52
|
+
'Pronghorn',
|
53
|
+
'Adapter',
|
54
|
+
'Adapter-Artifacts',
|
55
|
+
shortenedName
|
56
|
+
],
|
57
|
+
author: 'Itential Artifacts',
|
58
|
+
license: 'Apache-2.0',
|
59
|
+
repository: adapterPackage.repository,
|
60
|
+
private: false,
|
61
|
+
devDependencies: {
|
62
|
+
r2: '^2.0.1',
|
63
|
+
ajv: '6.10.0',
|
64
|
+
'better-ajv-errors': '^0.6.1',
|
65
|
+
'fs-extra': '^7.0.1'
|
66
|
+
}
|
67
|
+
};
|
68
|
+
|
69
|
+
ops.push(() => fs.writeJSONSync(path.join(artifactDir, 'package.json'), artifactPackage, { spaces: 2 }));
|
70
|
+
|
71
|
+
// create manifest
|
72
|
+
const manifest = {
|
73
|
+
bundleName: originalName,
|
74
|
+
version: adapterPackage.version,
|
75
|
+
fingerprint: 'Some verifiable token',
|
76
|
+
createdEpoch: '1554836984020',
|
77
|
+
artifacts: [
|
78
|
+
{
|
79
|
+
id: `${shortenedName}-adapter`,
|
80
|
+
name: `${shortenedName}-adapter`,
|
81
|
+
type: 'adapter',
|
82
|
+
location: `/bundles/adapters/${originalName}`,
|
83
|
+
description: artifactPackage.description,
|
84
|
+
properties: {
|
85
|
+
entryPoint: false
|
86
|
+
}
|
87
|
+
}
|
88
|
+
]
|
89
|
+
};
|
90
|
+
|
91
|
+
// add workflows into artifact
|
92
|
+
if (fs.existsSync(workflowsDir)) {
|
93
|
+
const workflowFileNames = fs.readdirSync(workflowsDir);
|
94
|
+
|
95
|
+
// if folder isnt empty and only file is not readme
|
96
|
+
if (workflowFileNames.length !== 0 && (!(workflowFileNames.length === 1 && workflowFileNames[0].split('.')[1] === 'md'))) {
|
97
|
+
// add workflows to correct location in bundle
|
98
|
+
ops.push(() => fs.copySync(workflowsDir, path.join(artifactDir, 'bundles', 'workflows')));
|
99
|
+
|
100
|
+
// add workflows to manifest
|
101
|
+
workflowFileNames.forEach((filename) => {
|
102
|
+
const [filenameNoExt, ext] = filename.split('.');
|
103
|
+
if (ext === 'json') {
|
104
|
+
manifest.artifacts.push({
|
105
|
+
id: `workflow-${filenameNoExt}`,
|
106
|
+
name: filenameNoExt,
|
107
|
+
type: 'workflow',
|
108
|
+
location: `/bundles/workflows/${filename}`,
|
109
|
+
description: 'Main entry point to artifact',
|
110
|
+
properties: {
|
111
|
+
entryPoint: false
|
112
|
+
}
|
113
|
+
});
|
114
|
+
}
|
115
|
+
});
|
116
|
+
}
|
117
|
+
}
|
118
|
+
|
119
|
+
ops.push(() => fs.writeJSONSync(path.join(artifactDir, 'manifest.json'), manifest, { spaces: 2 }));
|
120
|
+
|
121
|
+
// Run the commands in parallel
|
122
|
+
try {
|
123
|
+
await Promise.all(ops.map(async (op) => op()));
|
124
|
+
} catch (e) {
|
125
|
+
throw new Error(e);
|
126
|
+
}
|
127
|
+
|
128
|
+
const pathObj = {
|
129
|
+
bundlePath: artifactDir,
|
130
|
+
bundledAdapterPath: path.join(artifactDir, 'bundles', 'adapters', originalName)
|
131
|
+
};
|
132
|
+
return pathObj;
|
133
|
+
}
|
134
|
+
|
135
|
+
async function artifactize(entryPathToAdapter) {
|
136
|
+
const truePath = path.resolve(entryPathToAdapter);
|
137
|
+
const packagePath = path.join(truePath, 'package');
|
138
|
+
// remove adapter from package and move bundle in
|
139
|
+
const pathObj = await createBundle(packagePath);
|
140
|
+
const { bundlePath } = pathObj;
|
141
|
+
fs.removeSync(packagePath);
|
142
|
+
fs.moveSync(bundlePath, packagePath);
|
143
|
+
return 'Bundle successfully created and old folder system removed';
|
144
|
+
}
|
145
|
+
|
146
|
+
module.exports = { createBundle, artifactize };
|
@@ -0,0 +1,50 @@
|
|
1
|
+
/* @copyright Itential, LLC 2020 */
|
2
|
+
|
3
|
+
/* eslint object-shorthand: warn */
|
4
|
+
/* eslint import/no-extraneous-dependencies: warn */
|
5
|
+
/* eslint global-require: warn */
|
6
|
+
/* eslint import/no-unresolved: warn */
|
7
|
+
/* eslint import/no-dynamic-require: warn */
|
8
|
+
|
9
|
+
const winston = require('winston');
|
10
|
+
|
11
|
+
const logLevel = 'none';
|
12
|
+
const myCustomLevels = {
|
13
|
+
levels: {
|
14
|
+
spam: 6,
|
15
|
+
trace: 5,
|
16
|
+
debug: 4,
|
17
|
+
info: 3,
|
18
|
+
warn: 2,
|
19
|
+
error: 1,
|
20
|
+
none: 0
|
21
|
+
}
|
22
|
+
};
|
23
|
+
|
24
|
+
const basicGet = {
|
25
|
+
/**
|
26
|
+
* @summary create Adapter instance
|
27
|
+
*
|
28
|
+
* @function getAdapterInstance
|
29
|
+
* @param {Object} adapter - adaper configuration object required by IAP
|
30
|
+
*/
|
31
|
+
getAdapterInstance: (adapter) => {
|
32
|
+
const Adapter = require('../adapter');
|
33
|
+
const adapterProps = JSON.parse(JSON.stringify(adapter.properties.properties));
|
34
|
+
adapterProps.stub = false;
|
35
|
+
// need to set global logging
|
36
|
+
global.log = winston.createLogger({
|
37
|
+
level: logLevel,
|
38
|
+
levels: myCustomLevels.levels,
|
39
|
+
transports: [
|
40
|
+
new winston.transports.Console()
|
41
|
+
]
|
42
|
+
});
|
43
|
+
return new Adapter(
|
44
|
+
adapter.id,
|
45
|
+
adapterProps
|
46
|
+
);
|
47
|
+
}
|
48
|
+
};
|
49
|
+
|
50
|
+
module.exports = basicGet;
|
@@ -0,0 +1,63 @@
|
|
1
|
+
const { execSync } = require('child_process');
|
2
|
+
const semver = require('semver');
|
3
|
+
const axios = require('axios');
|
4
|
+
const fs = require('fs');
|
5
|
+
const packageJson = require('../package.json');
|
6
|
+
|
7
|
+
const localEngineVer = packageJson.engineVersion;
|
8
|
+
const localUtils = execSync('npm list @itentialopensource/adapter-utils', { encoding: 'utf-8' });
|
9
|
+
const localUtilsVer = localUtils.split('@').pop().replace(/(\r\n|\n|\r| )/gm, '');
|
10
|
+
|
11
|
+
/**
|
12
|
+
* @summary Makes a GET call using axios
|
13
|
+
*
|
14
|
+
* @function get
|
15
|
+
* @param {String} url - url to make the call to
|
16
|
+
*/
|
17
|
+
function get(url) {
|
18
|
+
const config = {
|
19
|
+
method: 'get',
|
20
|
+
url
|
21
|
+
};
|
22
|
+
return axios(config);
|
23
|
+
}
|
24
|
+
|
25
|
+
/**
|
26
|
+
* @summary Checks if adapter can be migrated using migration package
|
27
|
+
*
|
28
|
+
* @function migratePossible
|
29
|
+
*/
|
30
|
+
function migratePossible() {
|
31
|
+
const adapterTestUnit = fs.readFileSync('./test/unit/adapterTestUnit.js', { encoding: 'utf-8' });
|
32
|
+
const readme = fs.readFileSync('./README.md', { encoding: 'utf-8' });
|
33
|
+
return packageJson.keywords !== null && adapterTestUnit.indexOf('DO NOT REMOVE THIS COMMENT BLOCK') !== -1
|
34
|
+
&& readme.indexOf('available at ') !== -1 && readme.indexOf('You will need to change the credentials and possibly the host information below.') !== -1;
|
35
|
+
}
|
36
|
+
|
37
|
+
/**
|
38
|
+
* @summary Checks if adapter is up-to-date or if migration is needed
|
39
|
+
*
|
40
|
+
* @function migrateNeeded
|
41
|
+
*/
|
42
|
+
async function migrateNeeded() {
|
43
|
+
const engineUrl = 'https://adapters.itential.io/engineVersion';
|
44
|
+
const utilsUrl = 'https://registry.npmjs.org/@itentialopensource/adapter-utils';
|
45
|
+
const latestEngineVer = (await get(engineUrl)).data;
|
46
|
+
const latestUtilsVer = (await get(utilsUrl)).data['dist-tags'].latest;
|
47
|
+
return semver.lt(localEngineVer, latestEngineVer) || semver.lt(localUtilsVer, latestUtilsVer);
|
48
|
+
}
|
49
|
+
|
50
|
+
// Main Script
|
51
|
+
if (migratePossible()) {
|
52
|
+
migrateNeeded().then((needed) => {
|
53
|
+
if (needed) {
|
54
|
+
console.log('Migration is needed and possible -- go to dev site to download migration package');
|
55
|
+
} else {
|
56
|
+
console.log('Migration is possible but not needed at the current time.');
|
57
|
+
}
|
58
|
+
}).catch((error) => {
|
59
|
+
console.log('Could not get latest engine or utils version.', error.message);
|
60
|
+
});
|
61
|
+
} else {
|
62
|
+
console.log('Migration is not possible. Please contact Itential support for assistance');
|
63
|
+
}
|