mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 01:54:15 +00:00
Merge branch 'main-upstream' into w2p-91400_Fix-for-missing-comma-in-json-files
This commit is contained in:
39
scripts/env-to-yaml.ts
Normal file
39
scripts/env-to-yaml.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
import * as fs from 'fs';
|
||||
import * as yaml from 'js-yaml';
|
||||
import { join } from 'path';
|
||||
|
||||
/**
|
||||
* Script to help convert previous version environment.*.ts to yaml.
|
||||
*
|
||||
* Usage (see package.json):
|
||||
*
|
||||
* yarn env:yaml [relative path to environment.ts file] (optional relative path to write yaml file) *
|
||||
*/
|
||||
|
||||
const args = process.argv.slice(2);
|
||||
if (args[0] === undefined) {
|
||||
console.log(`Usage:\n\tyarn env:yaml [relative path to environment.ts file] (optional relative path to write yaml file)\n`);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
const envFullPath = join(process.cwd(), args[0]);
|
||||
|
||||
if (!fs.existsSync(envFullPath)) {
|
||||
console.error(`Error:\n${envFullPath} does not exist\n`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
try {
|
||||
const env = require(envFullPath).environment;
|
||||
|
||||
const config = yaml.dump(env);
|
||||
if (args[1]) {
|
||||
const ymlFullPath = join(process.cwd(), args[1]);
|
||||
fs.writeFileSync(ymlFullPath, config);
|
||||
} else {
|
||||
console.log(config);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
|
99
scripts/merge-i18n-files.ts
Normal file
99
scripts/merge-i18n-files.ts
Normal file
@@ -0,0 +1,99 @@
|
||||
import { projectRoot} from '../webpack/helpers';
|
||||
const commander = require('commander');
|
||||
const fs = require('fs');
|
||||
const JSON5 = require('json5');
|
||||
const _cliProgress = require('cli-progress');
|
||||
const _ = require('lodash');
|
||||
|
||||
const program = new commander.Command();
|
||||
program.version('1.0.0', '-v, --version');
|
||||
|
||||
const LANGUAGE_FILES_LOCATION = 'src/assets/i18n';
|
||||
|
||||
parseCliInput();
|
||||
|
||||
/**
|
||||
* Purpose: Allows customization of i18n labels from within themes
|
||||
* e.g. Customize the label "menu.section.browse_global" to display "Browse DSpace" rather than "All of DSpace"
|
||||
*
|
||||
* This script uses the i18n files found in a source directory to override settings in files with the same
|
||||
* name in a destination directory. Only the i18n labels to be overridden need be in the source files.
|
||||
*
|
||||
* Execution (using custom theme):
|
||||
* ```
|
||||
* yarn merge-i18n -s src/themes/custom/assets/i18n
|
||||
* ```
|
||||
*
|
||||
* Input parameters:
|
||||
* * Output directory: The directory in which the original i18n files are stored
|
||||
* - Defaults to src/assets/i18n (the default i18n file location)
|
||||
* - This is where the final output files will be written
|
||||
* * Source directory: The directory with override files
|
||||
* - Required
|
||||
* - Recommended to place override files in the theme directory under assets/i18n (but this is not required)
|
||||
* - Files must have matching names in both source and destination directories, for example:
|
||||
* en.json5 in the source directory will be merged with en.json5 in the destination directory
|
||||
* fr.json5 in the source directory will be merged with fr.json5 in the destination directory
|
||||
*/
|
||||
function parseCliInput() {
|
||||
program
|
||||
.option('-d, --output-dir <output-dir>', 'output dir when running script on all language files', projectRoot(LANGUAGE_FILES_LOCATION))
|
||||
.option('-s, --source-dir <source-dir>', 'source dir of transalations to be merged')
|
||||
.usage('(-s <source-dir> [-d <output-dir>])')
|
||||
.parse(process.argv);
|
||||
|
||||
if (program.outputDir && program.sourceDir) {
|
||||
if (!fs.existsSync(program.outputDir) && !fs.lstatSync(program.outputDir).isDirectory() ) {
|
||||
console.error('Output does not exist or is not a directory.');
|
||||
console.log(program.outputHelp());
|
||||
process.exit(1);
|
||||
}
|
||||
if (!fs.existsSync(program.sourceDir) && !fs.lstatSync(program.sourceDir).isDirectory() ) {
|
||||
console.error('Source does not exist or is not a directory.');
|
||||
console.log(program.outputHelp());
|
||||
process.exit(1);
|
||||
}
|
||||
fs.readdirSync(projectRoot(program.sourceDir)).forEach(file => {
|
||||
if (fs.existsSync(program.outputDir + '/' + file) ) {
|
||||
console.log('Merging: ' + program.outputDir + '/' + file + ' with ' + program.sourceDir + '/' + file);
|
||||
mergeFileWithSource(program.sourceDir + '/' + file, program.outputDir + '/' + file);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.error('Source or Output parameter is missing.');
|
||||
console.log(program.outputHelp());
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads source file and output file to merge the contents
|
||||
* > Iterates over the source file keys
|
||||
* > Updates values for each key and adds new keys as needed
|
||||
* > Updates the output file with the new merged json
|
||||
* @param pathToSourceFile Valid path to source file to merge from
|
||||
* @param pathToOutputFile Valid path to merge and write output
|
||||
*/
|
||||
function mergeFileWithSource(pathToSourceFile, pathToOutputFile) {
|
||||
const progressBar = new _cliProgress.SingleBar({}, _cliProgress.Presets.shades_classic);
|
||||
progressBar.start(100, 0);
|
||||
|
||||
const sourceFile = fs.readFileSync(pathToSourceFile, 'utf8');
|
||||
progressBar.update(10);
|
||||
const outputFile = fs.readFileSync(pathToOutputFile, 'utf8');
|
||||
progressBar.update(20);
|
||||
|
||||
const parsedSource = JSON5.parse(sourceFile);
|
||||
progressBar.update(30);
|
||||
const parsedOutput = JSON5.parse(outputFile);
|
||||
progressBar.update(40);
|
||||
|
||||
for (const key of Object.keys(parsedSource)) {
|
||||
parsedOutput[key] = parsedSource[key];
|
||||
}
|
||||
progressBar.update(80);
|
||||
fs.writeFileSync(pathToOutputFile,JSON5.stringify(parsedOutput,{ space:'\n ', quote: '"' }), { encoding:'utf8' });
|
||||
|
||||
progressBar.update(100);
|
||||
progressBar.stop();
|
||||
}
|
@@ -1,11 +1,14 @@
|
||||
import { environment } from '../src/environments/environment';
|
||||
|
||||
import * as child from 'child_process';
|
||||
|
||||
import { AppConfig } from '../src/config/app-config.interface';
|
||||
import { buildAppConfig } from '../src/config/config.server';
|
||||
|
||||
const appConfig: AppConfig = buildAppConfig();
|
||||
|
||||
/**
|
||||
* Calls `ng serve` with the following arguments configured for the UI in the environment file: host, port, nameSpace, ssl
|
||||
* Calls `ng serve` with the following arguments configured for the UI in the app config: host, port, nameSpace, ssl
|
||||
*/
|
||||
child.spawn(
|
||||
`ng serve --host ${environment.ui.host} --port ${environment.ui.port} --servePath ${environment.ui.nameSpace} --ssl ${environment.ui.ssl}`,
|
||||
{ stdio:'inherit', shell: true }
|
||||
`ng serve --host ${appConfig.ui.host} --port ${appConfig.ui.port} --serve-path ${appConfig.ui.nameSpace} --ssl ${appConfig.ui.ssl}`,
|
||||
{ stdio: 'inherit', shell: true }
|
||||
);
|
||||
|
@@ -1,116 +0,0 @@
|
||||
import { writeFile } from 'fs';
|
||||
import { environment as commonEnv } from '../src/environments/environment.common';
|
||||
import { GlobalConfig } from '../src/config/global-config.interface';
|
||||
import { ServerConfig } from '../src/config/server-config.interface';
|
||||
import { hasValue } from '../src/app/shared/empty.util';
|
||||
|
||||
// Configure Angular `environment.ts` file path
|
||||
const targetPath = './src/environments/environment.ts';
|
||||
// Load node modules
|
||||
const colors = require('colors');
|
||||
require('dotenv').config();
|
||||
const merge = require('deepmerge');
|
||||
const mergeOptions = { arrayMerge: (destinationArray, sourceArray, options) => sourceArray };
|
||||
const environment = process.argv[2];
|
||||
let environmentFilePath;
|
||||
let production = false;
|
||||
|
||||
switch (environment) {
|
||||
case '--prod':
|
||||
case '--production':
|
||||
production = true;
|
||||
console.log(`Building ${colors.red.bold(`production`)} environment`);
|
||||
environmentFilePath = '../src/environments/environment.prod.ts';
|
||||
break;
|
||||
case '--test':
|
||||
console.log(`Building ${colors.blue.bold(`test`)} environment`);
|
||||
environmentFilePath = '../src/environments/environment.test.ts';
|
||||
break;
|
||||
default:
|
||||
console.log(`Building ${colors.green.bold(`development`)} environment`);
|
||||
environmentFilePath = '../src/environments/environment.dev.ts';
|
||||
}
|
||||
|
||||
const processEnv = {
|
||||
ui: createServerConfig(
|
||||
process.env.DSPACE_HOST,
|
||||
process.env.DSPACE_PORT,
|
||||
process.env.DSPACE_NAMESPACE,
|
||||
process.env.DSPACE_SSL),
|
||||
rest: createServerConfig(
|
||||
process.env.DSPACE_REST_HOST,
|
||||
process.env.DSPACE_REST_PORT,
|
||||
process.env.DSPACE_REST_NAMESPACE,
|
||||
process.env.DSPACE_REST_SSL)
|
||||
} as GlobalConfig;
|
||||
|
||||
import(environmentFilePath)
|
||||
.then((file) => generateEnvironmentFile(merge.all([commonEnv, file.environment, processEnv], mergeOptions)))
|
||||
.catch(() => {
|
||||
console.log(colors.yellow.bold(`No specific environment file found for ` + environment));
|
||||
generateEnvironmentFile(merge(commonEnv, processEnv, mergeOptions))
|
||||
});
|
||||
|
||||
function generateEnvironmentFile(file: GlobalConfig): void {
|
||||
file.production = production;
|
||||
buildBaseUrls(file);
|
||||
const contents = `export const environment = ` + JSON.stringify(file);
|
||||
writeFile(targetPath, contents, (err) => {
|
||||
if (err) {
|
||||
throw console.error(err);
|
||||
} else {
|
||||
console.log(`Angular ${colors.bold('environment.ts')} file generated correctly at ${colors.bold(targetPath)} \n`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// allow to override a few important options by environment variables
|
||||
function createServerConfig(host?: string, port?: string, nameSpace?: string, ssl?: string): ServerConfig {
|
||||
const result = {} as any;
|
||||
if (hasValue(host)) {
|
||||
result.host = host;
|
||||
}
|
||||
|
||||
if (hasValue(nameSpace)) {
|
||||
result.nameSpace = nameSpace;
|
||||
}
|
||||
|
||||
if (hasValue(port)) {
|
||||
result.port = Number(port);
|
||||
}
|
||||
|
||||
if (hasValue(ssl)) {
|
||||
result.ssl = ssl.trim().match(/^(true|1|yes)$/i) ? true : false;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
function buildBaseUrls(config: GlobalConfig): void {
|
||||
for (const key in config) {
|
||||
if (config.hasOwnProperty(key) && config[key].host) {
|
||||
config[key].baseUrl = [
|
||||
getProtocol(config[key].ssl),
|
||||
getHost(config[key].host),
|
||||
getPort(config[key].port),
|
||||
getNameSpace(config[key].nameSpace)
|
||||
].join('');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getProtocol(ssl: boolean): string {
|
||||
return ssl ? 'https://' : 'http://';
|
||||
}
|
||||
|
||||
function getHost(host: string): string {
|
||||
return host;
|
||||
}
|
||||
|
||||
function getPort(port: number): string {
|
||||
return port ? (port !== 80 && port !== 443) ? ':' + port : '' : '';
|
||||
}
|
||||
|
||||
function getNameSpace(nameSpace: string): string {
|
||||
return nameSpace ? nameSpace.charAt(0) === '/' ? nameSpace : '/' + nameSpace : '';
|
||||
}
|
@@ -1,11 +0,0 @@
|
||||
import { copyFile } from 'fs';
|
||||
|
||||
// Configure Angular `environment.ts` file path
|
||||
const sourcePath = './src/environments/mock-environment.ts';
|
||||
const targetPath = './src/environments/environment.ts';
|
||||
|
||||
// destination.txt will be created or overwritten by default.
|
||||
copyFile(sourcePath, targetPath, (err) => {
|
||||
if (err) throw err;
|
||||
console.log(sourcePath + ' was copied to ' + targetPath);
|
||||
});
|
70
scripts/test-rest.ts
Normal file
70
scripts/test-rest.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
import * as http from 'http';
|
||||
import * as https from 'https';
|
||||
|
||||
import { AppConfig } from '../src/config/app-config.interface';
|
||||
import { buildAppConfig } from '../src/config/config.server';
|
||||
|
||||
const appConfig: AppConfig = buildAppConfig();
|
||||
|
||||
/**
|
||||
* Script to test the connection with the configured REST API (in the 'rest' settings of your config.*.yaml)
|
||||
*
|
||||
* This script is useful to test for any Node.js connection issues with your REST API.
|
||||
*
|
||||
* Usage (see package.json): yarn test:rest
|
||||
*/
|
||||
|
||||
// Get root URL of configured REST API
|
||||
const restUrl = appConfig.rest.baseUrl + '/api';
|
||||
console.log(`...Testing connection to REST API at ${restUrl}...\n`);
|
||||
|
||||
// If SSL enabled, test via HTTPS, else via HTTP
|
||||
if (appConfig.rest.ssl) {
|
||||
const req = https.request(restUrl, (res) => {
|
||||
console.log(`RESPONSE: ${res.statusCode} ${res.statusMessage} \n`);
|
||||
res.on('data', (data) => {
|
||||
checkJSONResponse(data);
|
||||
});
|
||||
});
|
||||
|
||||
req.on('error', error => {
|
||||
console.error('ERROR connecting to REST API\n' + error);
|
||||
});
|
||||
|
||||
req.end();
|
||||
} else {
|
||||
const req = http.request(restUrl, (res) => {
|
||||
console.log(`RESPONSE: ${res.statusCode} ${res.statusMessage} \n`);
|
||||
res.on('data', (data) => {
|
||||
checkJSONResponse(data);
|
||||
});
|
||||
});
|
||||
|
||||
req.on('error', error => {
|
||||
console.error('ERROR connecting to REST API\n' + error);
|
||||
});
|
||||
|
||||
req.end();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check JSON response from REST API to see if it looks valid. Log useful information
|
||||
* @param responseData response data
|
||||
*/
|
||||
function checkJSONResponse(responseData: any): any {
|
||||
let parsedData;
|
||||
try {
|
||||
parsedData = JSON.parse(responseData);
|
||||
console.log('Checking JSON returned for validity...');
|
||||
console.log(`\t"dspaceVersion" = ${parsedData.dspaceVersion}`);
|
||||
console.log(`\t"dspaceUI" = ${parsedData.dspaceUI}`);
|
||||
console.log(`\t"dspaceServer" = ${parsedData.dspaceServer}`);
|
||||
console.log(`\t"dspaceServer" property matches UI's "rest" config? ${(parsedData.dspaceServer === appConfig.rest.baseUrl)}`);
|
||||
// Check for "authn" and "sites" in "_links" section as they should always exist (even if no data)!
|
||||
const linksFound: string[] = Object.keys(parsedData._links);
|
||||
console.log(`\tDoes "/api" endpoint have HAL links ("_links" section)? ${linksFound.includes('authn') && linksFound.includes('sites')}`);
|
||||
} catch (err) {
|
||||
console.error('ERROR: INVALID DSPACE REST API! Response is not valid JSON!');
|
||||
console.error(`Response returned:\n${responseData}`);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user