ibm-cloud-sdk-core
Version:
Core functionality to support SDKs generated with IBM's OpenAPI SDK Generator.
95 lines (94 loc) • 3.46 kB
JavaScript
/**
* Copyright 2021, 2024 IBM Corp. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { parse } from 'dotenv';
import { existsSync, readFileSync, lstatSync } from 'fs';
import { homedir } from 'os';
import { join } from 'path';
import logger from '../../lib/logger';
// Putting all file-reading related code in this file to isolate the usage of the
// `fs` module, as it causes problems in browser environments.
const defaultCredsFilename = 'ibm-credentials.env';
/**
* Return a config object based on a credentials file. Credentials files can
* be specified filepath via the environment variable: `IBM_CREDENTIALS_FILE`.
*/
export function readCredentialsFile() {
if (!existsSync) {
return {};
}
// first look for an env variable called IBM_CREDENTIALS_FILE
// it should be the path to the file
// then look at the current working directory
// then at the os-dependent home directory
const givenFilepath = process.env.IBM_CREDENTIALS_FILE || '';
const workingDir = constructFilepath(process.cwd());
const homeDir = constructFilepath(homedir());
let filepathToUse;
if (givenFilepath) {
if (fileExistsAtPath(givenFilepath)) {
// see if user gave a path to a file named something other than `ibm-credentials.env`
filepathToUse = givenFilepath;
}
else if (fileExistsAtPath(constructFilepath(givenFilepath))) {
// see if user gave a path to the directory where file is located
filepathToUse = constructFilepath(givenFilepath);
}
}
else if (fileExistsAtPath(workingDir)) {
filepathToUse = workingDir;
}
else if (fileExistsAtPath(homeDir)) {
filepathToUse = homeDir;
}
else {
// file does not exist anywhere, will not be used
logger.info('Credential file does not exist. Will not be used');
return {};
}
const credsFile = readFileSync(filepathToUse);
return parse(credsFile);
}
export function fileExistsAtPath(filepath) {
if (existsSync(filepath)) {
const stats = lstatSync(filepath);
return stats.isFile() || stats.isSymbolicLink();
}
return false;
}
export function constructFilepath(filepath) {
// ensure filepath includes the filename
if (!filepath.endsWith(defaultCredsFilename)) {
filepath = join(filepath, defaultCredsFilename);
}
return filepath;
}
export function readCrTokenFile(filepath) {
if (!existsSync) {
return '';
}
try {
let token = '';
logger.debug(`Attempting to read CR token from file: ${filepath}`);
token = readFileSync(filepath, 'utf8');
logger.debug(`Successfully read CR token from file: ${filepath}`);
return token;
}
catch (err) {
const msg = `Error reading CR token: ${err.toString()}`;
logger.debug(msg);
throw new Error(msg);
}
}