-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathimport-config-handler.ts
More file actions
146 lines (124 loc) · 5.25 KB
/
import-config-handler.ts
File metadata and controls
146 lines (124 loc) · 5.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import merge from 'merge';
import * as path from 'path';
import { omit, filter, includes, isArray } from 'lodash';
import {
configHandler,
isAuthenticated,
cliux,
sanitizePath,
log,
} from '@contentstack/cli-utilities';
import defaultConfig from '../config';
import { readFile, fileExistsSync } from './file-helper';
import { askContentDir, askAPIKey } from './interactive';
import login from './login-handler';
import { ImportConfig } from '../types';
const setupConfig = async (importCmdFlags: any): Promise<ImportConfig> => {
let config: ImportConfig = merge({}, defaultConfig);
// Track authentication method
let authenticationMethod = 'unknown';
// setup the config
if (importCmdFlags['config']) {
let externalConfig = await readFile(importCmdFlags['config']);
if (isArray(externalConfig['modules'])) {
config.modules.types = filter(config.modules.types, (module) => includes(externalConfig['modules'], module));
externalConfig = omit(externalConfig, ['modules']);
}
config = merge.recursive(config, externalConfig);
}
config.contentDir = sanitizePath(
importCmdFlags['data'] || importCmdFlags['data-dir'] || config.data || (await askContentDir()),
);
const pattern = /[*$%#<>{}!&?]/g;
if (pattern.test(config.contentDir)) {
cliux.print(`\nPlease enter a directory path without any special characters: (*,&,{,},[,],$,%,<,>,?,!)`, {
color: 'yellow',
});
config.contentDir = sanitizePath(await askContentDir());
}
config.contentDir = config.contentDir.replace(/['"]/g, '');
config.contentDir = path.resolve(config.contentDir);
//Note to support the old key
config.data = config.contentDir;
const managementTokenAlias = importCmdFlags['management-token-alias'] || importCmdFlags['alias'];
if (managementTokenAlias) {
const { token, apiKey } = configHandler.get(`tokens.${managementTokenAlias}`) ?? {};
config.management_token = token;
config.apiKey = apiKey;
authenticationMethod = 'Management Token';
if (!config.management_token) {
throw new Error(`No management token found on given alias ${managementTokenAlias}`);
}
}
if (!config.management_token) {
if (!isAuthenticated()) {
log.debug('User not authenticated, checking for basic auth credentials');
if (config.email && config.password) {
log.debug('Using basic authentication with username/password');
await login(config);
authenticationMethod = 'Basic Auth';
log.debug('Basic authentication successful');
} else {
log.debug('No authentication method available');
throw new Error('Please login or provide an alias for the management token');
}
} else {
// Check if user is authenticated via OAuth
const isOAuthUser = configHandler.get('authorisationType') === 'OAUTH' || false;
if (isOAuthUser) {
authenticationMethod = 'OAuth';
log.debug('User authenticated via OAuth');
} else {
authenticationMethod = 'Basic Auth';
log.debug('User authenticated via auth token');
}
config.apiKey =
importCmdFlags['stack-uid'] || importCmdFlags['stack-api-key'] || config.target_stack || (await askAPIKey());
if (typeof config.apiKey !== 'string' || !config.apiKey || !config.apiKey.trim()) {
log.debug('Invalid or empty API key received!', { apiKey: config.apiKey });
throw new Error('Invalid or empty API key received. Please provide a valid stack API key.');
}
}
}
config.isAuthenticated = isAuthenticated();
config.auth_token = configHandler.get('authtoken'); // TBD handle auth token in httpClient & sdk
//Note to support the old key
config.source_stack = config.apiKey;
config.skipAudit = importCmdFlags['skip-audit'];
config.forceStopMarketplaceAppsPrompt = importCmdFlags.yes;
config.importWebhookStatus = importCmdFlags['import-webhook-status'];
config.skipPrivateAppRecreationIfExist = !importCmdFlags['skip-app-recreation'];
if (importCmdFlags['branch-alias']) {
config.branchAlias = importCmdFlags['branch-alias'];
}
if (importCmdFlags['branch']) {
config.branchName = importCmdFlags['branch'];
config.branchDir = config.contentDir;
}
if (importCmdFlags['module']) {
config.moduleName = importCmdFlags['module'];
config.singleModuleImport = true;
}
if (importCmdFlags['backup-dir']) {
config.useBackedupDir = importCmdFlags['backup-dir'];
}
if (importCmdFlags['skip-assets-publish']) {
config.skipAssetsPublish = importCmdFlags['skip-assets-publish'];
}
if (importCmdFlags['skip-entries-publish']) {
config.skipEntriesPublish = importCmdFlags['skip-entries-publish'];
}
// Note to support old modules
config.target_stack = config.apiKey;
config.replaceExisting = importCmdFlags['replace-existing'];
config.skipExisting = importCmdFlags['skip-existing'];
config.personalizeProjectName = importCmdFlags['personalize-project-name'];
if (importCmdFlags['exclude-global-modules']) {
config['exclude-global-modules'] = importCmdFlags['exclude-global-modules'];
}
// Add authentication details to config for context tracking
config.authenticationMethod = authenticationMethod;
log.debug('Import configuration setup completed.', { ...config });
return config;
};
export default setupConfig;