diff --git a/.eslintrc b/.eslintrc index 057caa8f..cd43f819 100644 --- a/.eslintrc +++ b/.eslintrc @@ -4,6 +4,7 @@ "no-console": "off", "import/no-extraneous-dependencies": "off", "prefer-object-spread": "off", - "no-multiple-empty-lines": "off" + "no-multiple-empty-lines": "off", + "import/extensions": "off" } } diff --git a/doc/dev-guide.md b/doc/dev-guide.md index a0280bb6..dd481473 100644 --- a/doc/dev-guide.md +++ b/doc/dev-guide.md @@ -134,7 +134,7 @@ At minimum, include `type` and `describe` properties for all options help popula In the command's builder, apply options with `.option()`: ```javascript -command: 'hello', +command: 'hello', builder: (yargs) => { yargs .option('name', { @@ -251,7 +251,7 @@ To accept standard input (stdin) within a command, apply one of the CLI's stdin Each of the CLI's stdin middleware accept a key and return the middleware function for use by Yargs. When the middleware is invoked, stdin will be parsed and, if available, assigned to the specified option key. From within the command, simply access the value as you would any other option. -For example, the following will assign `stdin`, parsed as an string, to the `name` option. For consistency, include "(stdin)" in your option's description to surface this consistently in the CLI's generated documentation. +For example, the following will assign `stdin`, parsed as an string, to the `name` option. For consistency, include "(stdin)" in your option's description to surface this consistently in the CLI's generated documentation. ```javascript // Lazy load to improve startup time @@ -384,15 +384,19 @@ Yargs will surface descriptions for each command in the `mod` directory with the Logging is instrumented with the [debug](https://www.npmjs.com/package/debug) utility. All logs within the CLI pass through `lib/cli/logger.js`, a wrapper around `debug`, to ensure proper namespace assignment. -To add a logger to code, require and invoke it: +To add a logger to code, import and invoke it with a channel: ```javascript -const logger = require('./cli/logger')(); +import getLogger from './cli/logger'; + +const logger = getLogger(); logger.log('a message'); ``` Optionally, pass the name of a feature or category when invoking the logger. This is useful for filtering log output. ```javascript -const okapiLogger = require('./cli/logger')('okapi'); +import getLogger from './cli/logger'; + +const okapiLogger = getLogger('okapi'); okapiLogger.log('a message about Okapi'); ``` diff --git a/index.js b/index.js index 9af04736..c59b0f4e 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,2 @@ -const { babelOptions } = require('@folio/stripes-webpack'); - -module.exports = { - babelOptions, -}; +export { babelOptions } from '@folio/stripes-webpack'; diff --git a/lib/cli/config.js b/lib/cli/config.js index e3339f9b..8cf126a1 100644 --- a/lib/cli/config.js +++ b/lib/cli/config.js @@ -1,6 +1,9 @@ -const findUp = require('find-up'); -const fs = require('fs'); -const logger = require('./logger')(); +import findUp from 'find-up'; +import fs from 'fs'; + +import getLogger from './logger.js'; + +const logger = getLogger(); // Maintain backwards compatibility for plugins referencing previous commands const pluginMap = { @@ -63,7 +66,8 @@ const commandDirOptions = cliConfig.plugins ? { visit: applyCommandPlugin } : {} const yargsConfig = Object.assign({}, cliConfig); delete yargsConfig.plugins; -module.exports = { + +export default { yargsConfig, commandDirOptions, configPath, diff --git a/lib/cli/context-middleware.js b/lib/cli/context-middleware.js index e09986f0..7e7d1e1b 100644 --- a/lib/cli/context-middleware.js +++ b/lib/cli/context-middleware.js @@ -1,19 +1,14 @@ -const context = require('./context'); +import context from './context.js'; // Exposed separately for commands to change context if necessary -function applyContext(argv) { +export function applyContext(argv) { const cliContext = Object.assign({}, context.getContext(argv.workingDir || '')); return Object.assign(argv, { context: cliContext }); } // Context middleware applies CLI context to argv -function contextMiddleware() { +export function contextMiddleware() { return (argv) => { return Promise.resolve(applyContext(argv)); }; } - -module.exports = { - applyContext, - contextMiddleware, -}; diff --git a/lib/cli/context.js b/lib/cli/context.js index 24b949d2..826524d5 100644 --- a/lib/cli/context.js +++ b/lib/cli/context.js @@ -1,24 +1,30 @@ -const path = require('path'); -const fs = require('fs'); -const importLazy = require('import-lazy')(require); -const isInstalledGlobally = require('is-installed-globally'); -const isPathInside = require('is-path-inside'); -const logger = require('./logger')(); +import path from 'path'; +import fs from 'fs'; + +import isInstalledGlobally from 'is-installed-globally'; +import isPathInside from 'is-path-inside'; +import { XMLParser } from 'fast-xml-parser'; + +import getLogger from './logger.js'; + // TODO: Yarn 1.5.1 changed global install directory on Windows, 'global-dirs' does not yet reflect this // https://github.com/yarnpkg/yarn/pull/5336 -const globalDirs = require('./global-dirs'); -const { stripesModules, toFolioName } = require('../environment/inventory'); +import globalDirs from './global-dirs.js'; + +import { stripesModules, toFolioName } from '../environment/inventory.js'; -const { XMLParser } = importLazy('fast-xml-parser'); +const logger = getLogger(); -const cliRoot = path.join(__dirname, '..', '..'); +const cliRoot = path.join(import.meta.dirname, '..', '..'); const context = { - require, // add require to make it possible to mock it in the tests + // @@TODO + require: () => { }, + // require, // add require to make it possible to mock it in the tests }; function isGlobalYarn() { - return isPathInside(__dirname, globalDirs.yarn.packages); + return isPathInside(import.meta.dirname, globalDirs.yarn.packages); } function isUiModule(actsAs) { @@ -137,4 +143,4 @@ context.getContext = (...args) => { return resultContext; }; -module.exports = context; +export default context; diff --git a/lib/cli/generate-module-descriptor.js b/lib/cli/generate-module-descriptor.js index 2b00d4f9..d9e4e0a6 100644 --- a/lib/cli/generate-module-descriptor.js +++ b/lib/cli/generate-module-descriptor.js @@ -1,6 +1,6 @@ // Logic borrowed from stripes-core's package2md.js excluding file load and console output // $ node ../stripes-core/util/package2md.js package.json > MD.json -module.exports = function generateModuleDescriptor(packageJson, isStrict) { +export default function generateModuleDescriptor(packageJson, isStrict) { const stripes = packageJson.stripes || {}; const moduleDescriptor = { id: `${packageJson.name.replace(/^@/, '').replace('/', '_')}-${packageJson.version}`, @@ -14,4 +14,4 @@ module.exports = function generateModuleDescriptor(packageJson, isStrict) { moduleDescriptor.optional = Object.keys(optional).map(key => ({ id: key, version: optional[key] })); } return moduleDescriptor; -}; +} diff --git a/lib/cli/global-dirs.js b/lib/cli/global-dirs.js index 0208eaae..769ecdb7 100644 --- a/lib/cli/global-dirs.js +++ b/lib/cli/global-dirs.js @@ -1,8 +1,10 @@ -const globalDirs = require('global-dirs'); -const semver = require('semver'); -const childProcess = require('child_process'); -const path = require('path'); -const logger = require('./logger')('global-dirs'); +import globalDirs from 'global-dirs'; +import semver from 'semver'; +import childProcess from 'child_process'; +import path from 'path'; +import getLogger from './logger.js'; + +const logger = getLogger('global-dirs'); function isYarnVersion(version) { try { @@ -24,4 +26,4 @@ if (process.platform === 'win32' && isYarnVersion('>=1.5.1')) { logger.log('Updated globalDirs.yarn:', globalDirs.yarn); } -module.exports = globalDirs; +export default globalDirs; diff --git a/lib/cli/logger.js b/lib/cli/logger.js index 6d703326..2d7c52b3 100644 --- a/lib/cli/logger.js +++ b/lib/cli/logger.js @@ -1,11 +1,11 @@ -const debug = require('debug'); +import debug from 'debug'; // Wrapper for debug to ensure consistent use of namespace -module.exports = function getLogger(name) { +export default function getLogger(name) { const namespace = name ? `stripes-cli:${name}` : 'stripes-cli'; const logger = debug(namespace); return { log: (...args) => logger(...args), }; -}; +} diff --git a/lib/cli/prompt-middleware.js b/lib/cli/prompt-middleware.js index 403ae5cc..ea34da20 100644 --- a/lib/cli/prompt-middleware.js +++ b/lib/cli/prompt-middleware.js @@ -1,10 +1,8 @@ -const importLazy = require('import-lazy')(require); - -const inquirer = importLazy('inquirer'); +import inquirer from 'inquirer'; // Convert Yargs CLI options to Inquire.js questions // This allows options/questions to be defined in a consistent format -function yargsToInquirer(yargsOptions) { +export function yargsToInquirer(yargsOptions) { return Object.keys(yargsOptions).map((key) => { const option = yargsOptions[key]; return Object.assign({}, { @@ -21,7 +19,7 @@ function yargsToInquirer(yargsOptions) { } // Check for missing Yargs input and ask if necessary -function askIfUndefined(argv, yargsOptions) { +export function askIfUndefined(argv, yargsOptions) { const askFor = {}; Object.keys(yargsOptions).forEach((key) => { // Also check for yargs alias @@ -38,12 +36,12 @@ function askIfUndefined(argv, yargsOptions) { } // Returns middleware to prompt for missing input prior to running command -function promptMiddleware(yargsOptions) { +export function promptMiddleware(yargsOptions) { return (argv) => askIfUndefined(argv, yargsOptions); } -module.exports = { - yargsToInquirer, +export default { askIfUndefined, promptMiddleware, + yargsToInquirer, }; diff --git a/lib/cli/stdin-middleware.js b/lib/cli/stdin-middleware.js index 71ee7614..71cf37d3 100644 --- a/lib/cli/stdin-middleware.js +++ b/lib/cli/stdin-middleware.js @@ -1,9 +1,11 @@ -const stdinWrapper = require('./stdin'); -const logger = require('./logger')('stdinMiddleware'); +import getStdinWrapper from './stdin.js'; +import getLogger from './logger.js'; -function stdinStringMiddleware(name) { +const logger = getLogger('stdinMiddleware'); + +export function stdinStringMiddleware(name) { return (argv) => { - return stdinWrapper.getStdin().then(stdin => { + return getStdinWrapper.getStdin().then(stdin => { if (stdin) { logger.log(`read string from stdin for key "${name}"`); argv[name] = stdin; @@ -13,9 +15,9 @@ function stdinStringMiddleware(name) { }; } -function stdinJsonMiddleware(name) { +export function stdinJsonMiddleware(name) { return (argv) => { - return stdinWrapper.getStdin().then(stdin => { + return getStdinWrapper.getStdin().then(stdin => { if (stdin) { logger.log(`parsing JSON from stdin for key "${name}"`); argv[name] = JSON.parse(stdin); @@ -25,9 +27,9 @@ function stdinJsonMiddleware(name) { }; } -function stdinArrayMiddleware(name) { +export function stdinArrayMiddleware(name) { return (argv) => { - return stdinWrapper.getStdin().then(stdin => { + return getStdinWrapper.getStdin().then(stdin => { if (stdin) { logger.log(`parsing array from stdin for key "${name}"`); argv[name] = stdin.trim().split(/\s+/); @@ -37,9 +39,9 @@ function stdinArrayMiddleware(name) { }; } -function stdinArrayOrJsonMiddleware(name) { +export function stdinArrayOrJsonMiddleware(name) { return (argv) => { - return stdinWrapper.getStdin().then(stdin => { + return getStdinWrapper.getStdin().then(stdin => { if (stdin) { // Simple check for starting character of '{' or '[' to determine how to handle the data if (stdin.match(/^\s*[{[]/)) { @@ -55,7 +57,7 @@ function stdinArrayOrJsonMiddleware(name) { }; } -module.exports = { +export default { stdinStringMiddleware, stdinJsonMiddleware, stdinArrayMiddleware, diff --git a/lib/cli/stdin.js b/lib/cli/stdin.js index 7efd4fae..152d37ae 100644 --- a/lib/cli/stdin.js +++ b/lib/cli/stdin.js @@ -1,17 +1,16 @@ -const getStdin = require('get-stdin'); +import wrappedGetStdin from 'get-stdin'; -function stdinWrapper() { +function getStdin() { // Per Node docs, the preferred method of determining whether Node.js is being run within // a TTY context is to check that the value of the process.stdout.isTTY property is true // (https://nodejs.org/docs/latest-v8.x/api/tty.html) if (process.stdout.isTTY) { - return getStdin(); + return wrappedGetStdin(); } else { return Promise.resolve(); } } -// Wrapper to facilitate testing -module.exports = { - getStdin: stdinWrapper, +export default { + getStdin }; diff --git a/lib/cli/stripes-cli-error.js b/lib/cli/stripes-cli-error.js index 09fa97ea..a48f1f8f 100644 --- a/lib/cli/stripes-cli-error.js +++ b/lib/cli/stripes-cli-error.js @@ -1,7 +1,7 @@ -module.exports = class StripesCliError extends Error { +export default class StripesCliError extends Error { constructor(...args) { super(...args); this.name = this.constructor.name; Error.captureStackTrace(this, StripesCliError); } -}; +} diff --git a/lib/cli/stripes-config-middleware.js b/lib/cli/stripes-config-middleware.js index ee5e4c5b..c7605656 100644 --- a/lib/cli/stripes-config-middleware.js +++ b/lib/cli/stripes-config-middleware.js @@ -1,7 +1,9 @@ -const path = require('path'); -const { stdinJsonMiddleware } = require('./stdin-middleware'); -const StripesCliError = require('./stripes-cli-error'); -const logger = require('./logger')('stripesConfigMiddleware'); +import path from 'path'; +import { stdinJsonMiddleware } from './stdin-middleware.js'; +import StripesCliError from './stripes-cli-error.js'; +import getLogger from './logger.js'; + +const logger = getLogger('stripesConfigMiddleware'); function loadStripesConfig(stripesConfigFile) { @@ -27,7 +29,7 @@ async function readStripesConfigStdin() { // Given a "--configFile" has been provided, this middleware will load the stripes configuration from disk // and make the stripes configuration object available to the command as "argv.stripesConfig" // If no configFile has been provided, stdin is checked for JSON input -function stripesConfigMiddleware(fileOnly) { +export function stripesConfigMiddleware(fileOnly) { return async function middleware(argv) { logger.log('initializing...'); let stripesConfig; @@ -57,7 +59,3 @@ function stripesConfigMiddleware(fileOnly) { return Promise.resolve(argv); }; } - -module.exports = { - stripesConfigMiddleware, -}; diff --git a/lib/cli/stripes-core.js b/lib/cli/stripes-core.js index 266e9c0b..3d54043d 100644 --- a/lib/cli/stripes-core.js +++ b/lib/cli/stripes-core.js @@ -1,13 +1,18 @@ -const path = require('path'); -const resolvePkg = require('resolve-pkg'); -const resolveFrom = require('resolve-from'); -const importLazy = require('import-lazy'); -const logger = require('./logger')(); -const getStripesWebpackConfig = require('../test/webpack-config'); +import path from 'path'; +import resolvePkg from 'resolve-pkg'; +import resolveFrom from 'resolve-from'; +import importLazy from 'import-lazy'; +import { createRequire } from 'module'; + +import getLogger from './logger.js'; +import getStripesWebpackConfig from '../test/webpack-config.js'; + +const logger = getLogger(); +const require = createRequire(import.meta.url); // Wraps stripes-core modules and API: // Includes centralized logic to locate stripes-core for build and runtime -module.exports = class StripesCore { +export default class StripesCore { constructor(context, aliases) { this.context = context; this.coreAlias = aliases['@folio/stripes-webpack']; @@ -76,4 +81,4 @@ module.exports = class StripesCore { getStripesWebpackConfig(...args) { return getStripesWebpackConfig(this, ...args); } -}; +} diff --git a/lib/commands/alias.js b/lib/commands/alias.js index 884bffb3..5e0663f6 100644 --- a/lib/commands/alias.js +++ b/lib/commands/alias.js @@ -1,8 +1,6 @@ -const importLazy = require('import-lazy')(require); +import AliasService from '../platform/alias-service.js'; -const AliasService = importLazy('../platform/alias-service'); - -function listAliases(aliases) { +export function listAliases(aliases) { const aliasNames = Object.getOwnPropertyNames(aliases); if (!aliasNames.length) { console.log(' No aliases set.'); @@ -45,7 +43,7 @@ function aliasCommand(argv) { } } -module.exports = { +export default { command: 'alias [mod] [path]', describe: 'Maintain global aliases that apply to all platforms and apps [deprecated: use workspace instead]', builder: (yargs) => { diff --git a/lib/commands/app.js b/lib/commands/app.js index 5f554cc8..77d26f72 100644 --- a/lib/commands/app.js +++ b/lib/commands/app.js @@ -1,6 +1,8 @@ -module.exports = { +import { bigtest, create, perms } from './app/index.js'; + +export default { command: 'app ', describe: 'Commands to create and manage stripes UI apps', - builder: yargs => yargs.commandDir('app'), + builder: yargs => yargs.command([bigtest, create, perms]), handler: () => {}, }; diff --git a/lib/commands/app/bigtest.js b/lib/commands/app/bigtest.js index eefa223c..8ce66d36 100644 --- a/lib/commands/app/bigtest.js +++ b/lib/commands/app/bigtest.js @@ -1,8 +1,6 @@ -const importLazy = require('import-lazy')(require); - -const { contextMiddleware } = importLazy('../../cli/context-middleware'); -const bigtest = importLazy('../../test/setup-bigtest'); -const yarn = importLazy('../../yarn'); +import { contextMiddleware } from '../../cli/context-middleware.js'; +import bigtest from '../../test/setup-bigtest.js'; +import yarn from '../../yarn.js'; function setupBigTestCommand(argv) { const context = argv.context; @@ -27,7 +25,7 @@ function setupBigTestCommand(argv) { }); } -module.exports = { +export default { command: 'bigtest', describe: 'Setup BigTest for the current app', builder: (yargs) => { diff --git a/lib/commands/app/create.js b/lib/commands/app/create.js index e2a60ac6..f89101b7 100644 --- a/lib/commands/app/create.js +++ b/lib/commands/app/create.js @@ -1,13 +1,12 @@ -const importLazy = require('import-lazy')(require); +import path from 'path'; -const { contextMiddleware, applyContext } = importLazy('../../cli/context-middleware'); -const createApp = importLazy('../../create-app'); -const yarn = importLazy('../../yarn'); -const { promptMiddleware } = importLazy('../../cli/prompt-middleware'); -const addModCommand = importLazy('../mod/add'); -const enableModCommand = importLazy('../mod/enable'); -const assignPermCommand = importLazy('../perm/assign'); -const path = importLazy('path'); +import { contextMiddleware, applyContext } from '../../cli/context-middleware.js'; +import createApp from '../../create-app.js'; +import yarn from '../../yarn.js'; +import { promptMiddleware } from '../../cli/prompt-middleware.js'; +import addModCommand from '../mod/add.js'; +import enableModCommand from '../mod/enable.js'; +import assignPermCommand from '../perm/assign.js'; function createAppCommand(argv) { const context = argv.context; @@ -84,7 +83,7 @@ const appOptions = { }, }; -module.exports = { +export default { command: 'create [name]', describe: 'Create a new Stripes app module', builder: (yargs) => { diff --git a/lib/commands/app/index.js b/lib/commands/app/index.js new file mode 100644 index 00000000..274d7198 --- /dev/null +++ b/lib/commands/app/index.js @@ -0,0 +1,3 @@ +export { default as bigtest } from './bigtest.js'; +export { default as create } from './create.js'; +export { default as perms } from './perms.js'; diff --git a/lib/commands/app/perms.js b/lib/commands/app/perms.js index f91df437..8042d872 100644 --- a/lib/commands/app/perms.js +++ b/lib/commands/app/perms.js @@ -1,7 +1,5 @@ -const importLazy = require('import-lazy')(require); - -const path = importLazy('path'); -const { contextMiddleware } = importLazy('../../cli/context-middleware'); +import path from 'path'; +import { contextMiddleware } from '../../cli/context-middleware.js'; function appPermsCommand(argv) { const context = argv.context; @@ -16,7 +14,7 @@ function appPermsCommand(argv) { permissionSets.forEach(permission => console.log(permission.permissionName)); } -module.exports = { +export default { command: 'perms', describe: 'View list of permissions for the current app (app context)', builder: (yargs) => { diff --git a/lib/commands/build.js b/lib/commands/build.js index 69b4fee8..82b90fe8 100644 --- a/lib/commands/build.js +++ b/lib/commands/build.js @@ -1,15 +1,20 @@ -const importLazy = require('import-lazy')(require); +import WebpackBundleAnalyzer from 'webpack-bundle-analyzer'; // ).BundleAnalyzerPlugin; // eslint-disable-line -const { contextMiddleware } = importLazy('../cli/context-middleware'); -const { stripesConfigMiddleware } = importLazy('../cli/stripes-config-middleware'); -const StripesCore = importLazy('../cli/stripes-core'); -const StripesPlatform = importLazy('../platform/stripes-platform'); -const { okapiOptions, stripesConfigFile, stripesConfigStdin, stripesConfigOptions, buildOptions } = importLazy('./common-options'); -const { processError, processStats, emitLintWarnings, limitChunks, ignoreCache } = importLazy('../webpack-common'); +import { contextMiddleware } from '../cli/context-middleware.js'; +import { stripesConfigMiddleware } from '../cli/stripes-config-middleware.js'; +import StripesCore from '../cli/stripes-core.js'; +import StripesPlatform from '../platform/stripes-platform.js'; +import { okapiOptions, stripesConfigFile, stripesConfigStdin, stripesConfigOptions, buildOptions } from './common-options.js'; +import webpackCommon from '../webpack-common.js'; + +const { BundleAnalyzerPlugin } = { WebpackBundleAnalyzer }; let _stripesPlatform; let _stripesCore; +const { processError, processStats, emitLintWarnings, limitChunks, ignoreCache } = { webpackCommon }; + + // stripesPlatform and stripesCore overrides primarily used as injection for unit tests function stripesOverrides(stripesPlatform, stripesCore) { _stripesPlatform = stripesPlatform; @@ -36,7 +41,8 @@ function buildCommand(argv) { const webpackOverrides = platform.getWebpackOverrides(context); if (argv.analyze) { - const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; // eslint-disable-line + // TODO + // const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; // eslint-disable-line webpackOverrides.push((config) => { config.plugins.push(new BundleAnalyzerPlugin()); return config; @@ -70,7 +76,7 @@ function buildCommand(argv) { .catch(processError); } -module.exports = { +export default { command: 'build [configFile] [outputPath]', describe: 'Build a Stripes tenant bundle', builder: (yargs) => { diff --git a/lib/commands/common-options.js b/lib/commands/common-options.js index ba6c04bd..c3f6bbbe 100644 --- a/lib/commands/common-options.js +++ b/lib/commands/common-options.js @@ -1,4 +1,4 @@ -module.exports.serverOptions = { +export const serverOptions = { port: { type: 'number', describe: 'Development server port', @@ -31,7 +31,7 @@ module.exports.serverOptions = { }, }; -module.exports.authOptions = { +export const authOptions = { username: { type: 'string', describe: 'Okapi tenant username', @@ -61,25 +61,25 @@ const okapiOptions = { }, }; -module.exports.okapiOptions = okapiOptions; +export { okapiOptions }; -module.exports.okapiOption = { +export const okapiOption = { okapi: okapiOptions.okapi, }; -module.exports.tenantOption = { +export const tenantOption = { tenant: okapiOptions.tenant, }; -module.exports.okapiRequired = { +export const okapiRequired = { okapi: Object.assign({}, okapiOptions.okapi, { required: true }), }; -module.exports.tenantRequired = { +export const tenantRequired = { tenant: Object.assign({}, okapiOptions.tenant, { required: true }), }; -module.exports.moduleIdsStdin = { +export const moduleIdsStdin = { ids: { describe: 'Module descriptor ids (stdin)', type: 'array', @@ -88,7 +88,7 @@ module.exports.moduleIdsStdin = { // When applied as a positional, "configFile" is the first parameter: // yargs.positional('configFile', stripesConfigFile.configFile) -module.exports.stripesConfigFile = { +export const stripesConfigFile = { configFile: { type: 'string', describe: 'File containing a Stripes tenant configuration', @@ -97,7 +97,7 @@ module.exports.stripesConfigFile = { }, }; -module.exports.stripesConfigStdin = { +export const stripesConfigStdin = { stripesConfig: { type: 'string', describe: 'Stripes config JSON (stdin)', @@ -105,7 +105,7 @@ module.exports.stripesConfigStdin = { }, }; -module.exports.stripesConfigOptions = { +export const stripesConfigOptions = { hasAllPerms: { type: 'boolean', describe: 'Set "hasAllPerms" in Stripes config', @@ -116,7 +116,7 @@ module.exports.stripesConfigOptions = { } }; -module.exports.buildOptions = { +export const buildOptions = { // prod: { // type: 'boolean', // describe: 'Use production build settings', @@ -159,13 +159,13 @@ const pathOptions = { }, }; -module.exports.pathOptions = pathOptions; +export { pathOptions }; -module.exports.pathRequired = { +export const pathRequired = { path: Object.assign({}, pathOptions.path, { required: true }), }; -module.exports.fileOptions = { +export const fileOptions = { json: { type: 'string', describe: 'File containing JSON data', diff --git a/lib/commands/index.js b/lib/commands/index.js new file mode 100644 index 00000000..a2b572ff --- /dev/null +++ b/lib/commands/index.js @@ -0,0 +1,31 @@ +import alias from './alias.js'; +import app from './app.js'; +import build from './build.js'; +import inventory from './inventory.js'; +import mod from './mod.js'; +import okapi from './okapi.js'; +import perm from './perm.js'; +import platform from './platform.js'; +import serve from './serve.js'; +import status from './status.js'; +import test from './test.js'; +import translate from './translate.js'; +import transpile from './transpile.js'; +import workspace from './workspace.js'; + +export const commands = [ + alias, + app, + build, + inventory, + mod, + okapi, + perm, + platform, + serve, + status, + test, + translate, + transpile, + workspace, +]; diff --git a/lib/commands/inventory.js b/lib/commands/inventory.js index 2fc56245..b8ba0cf3 100644 --- a/lib/commands/inventory.js +++ b/lib/commands/inventory.js @@ -1,7 +1,5 @@ -const importLazy = require('import-lazy')(require); - -const { contextMiddleware } = importLazy('../cli/context-middleware'); -const { fetchAndStoreModules } = importLazy('../environment/inventory'); +import { contextMiddleware } from '../cli/context-middleware.js'; +import { fetchAndStoreModules } from '../environment/inventory.js'; function inventoryCommand(argv) { if (argv.fetch) { @@ -11,7 +9,7 @@ function inventoryCommand(argv) { return Promise.resolve(); } -module.exports = { +export default { command: 'inventory', describe: 'Manage local inventory cache to supply module data for `stripes workspace`.', builder: (yargs) => { diff --git a/lib/commands/mod.js b/lib/commands/mod.js index 09be9d28..fb9d746c 100644 --- a/lib/commands/mod.js +++ b/lib/commands/mod.js @@ -1,6 +1,36 @@ -module.exports = { +import { + add, + descriptor, + disable, + discover, + enable, + filter, + install, + list, + perms, + pull, + remove, + update, + view, +} from './mod/index.js'; + +export default { command: 'mod ', describe: 'Commands to manage UI module descriptors', - builder: yargs => yargs.commandDir('mod'), + builder: yargs => yargs.command([ + add, + descriptor, + disable, + discover, + enable, + filter, + install, + list, + perms, + pull, + remove, + update, + view, + ]), handler: () => {}, }; diff --git a/lib/commands/mod/add.js b/lib/commands/mod/add.js index d9947e3a..748ad169 100644 --- a/lib/commands/mod/add.js +++ b/lib/commands/mod/add.js @@ -1,11 +1,9 @@ -const importLazy = require('import-lazy')(require); - -const { contextMiddleware } = importLazy('../../cli/context-middleware'); -const { stdinJsonMiddleware } = importLazy('../../cli/stdin-middleware'); -const Okapi = importLazy('../../okapi'); -const ModuleService = importLazy('../../okapi/module-service'); -const DescriptorService = importLazy('../../okapi/descriptor-service'); -const { okapiRequired } = importLazy('../common-options'); +import { contextMiddleware } from '../../cli/context-middleware.js'; +import { stdinJsonMiddleware } from '../../cli/stdin-middleware.js'; +import Okapi from '../../okapi/index.js'; +import ModuleService from '../../okapi/module-service.js'; +import DescriptorService from '../../okapi/descriptor-service.js'; +import { okapiRequired } from '../common-options.js'; function addModuleDescriptorCommand(argv) { @@ -32,7 +30,7 @@ function addModuleDescriptorCommand(argv) { })); } -module.exports = { +export default { command: 'add', describe: 'Add an app module descriptor to Okapi', builder: (yargs) => { diff --git a/lib/commands/mod/descriptor.js b/lib/commands/mod/descriptor.js index 401295cc..d52cfce0 100644 --- a/lib/commands/mod/descriptor.js +++ b/lib/commands/mod/descriptor.js @@ -1,9 +1,7 @@ -const importLazy = require('import-lazy')(require); - -const { contextMiddleware } = importLazy('../../cli/context-middleware'); -const { stripesConfigMiddleware } = importLazy('../../cli/stripes-config-middleware'); -const DescriptorService = importLazy('../../okapi/descriptor-service'); -const { stripesConfigFile, stripesConfigStdin } = importLazy('../common-options'); +import { contextMiddleware } from '../../cli/context-middleware.js'; +import { stripesConfigMiddleware } from '../../cli/stripes-config-middleware.js'; +import DescriptorService from '../../okapi/descriptor-service.js'; +import { stripesConfigFile, stripesConfigStdin } from '../common-options.js'; function moduleDescriptorCommand(argv) { const context = argv.context; @@ -20,7 +18,7 @@ function moduleDescriptorCommand(argv) { } } -module.exports = { +export default { command: 'descriptor [configFile]', describe: 'Generate module descriptors for an app or platform.', builder: (yargs) => { diff --git a/lib/commands/mod/disable.js b/lib/commands/mod/disable.js index fd604657..52a6446f 100644 --- a/lib/commands/mod/disable.js +++ b/lib/commands/mod/disable.js @@ -1,11 +1,9 @@ -const importLazy = require('import-lazy')(require); - -const { contextMiddleware } = importLazy('../../cli/context-middleware'); -const Okapi = importLazy('../../okapi'); -const ModuleService = importLazy('../../okapi/module-service'); -const DescriptorService = importLazy('../../okapi/descriptor-service'); -const { moduleIdsStdin, okapiRequired, tenantRequired } = importLazy('../common-options'); -const { stdinArrayMiddleware } = importLazy('../../cli/stdin-middleware'); +import { contextMiddleware } from '../../cli/context-middleware.js'; +import Okapi from '../../okapi/index.js'; +import ModuleService from '../../okapi/module-service.js'; +import DescriptorService from '../../okapi/descriptor-service.js'; +import { moduleIdsStdin, okapiRequired, tenantRequired } from '../common-options.js'; +import { stdinArrayMiddleware } from '../../cli/stdin-middleware.js'; function disableModuleCommand(argv) { const context = argv.context; @@ -27,7 +25,7 @@ function disableModuleCommand(argv) { .then((responses) => responses.forEach(response => console.log(`Module ${response.id} no longer associated with tenant ${argv.tenant}`))); } -module.exports = { +export default { command: 'disable', describe: 'Disable modules for a tenant in Okapi', builder: (yargs) => { diff --git a/lib/commands/mod/discover.js b/lib/commands/mod/discover.js index 39a7cf7b..a9939820 100644 --- a/lib/commands/mod/discover.js +++ b/lib/commands/mod/discover.js @@ -1,9 +1,7 @@ -const importLazy = require('import-lazy')(require); - -const { contextMiddleware } = importLazy('../../cli/context-middleware'); -const Okapi = importLazy('../../okapi'); -const DiscoveryService = importLazy('../../okapi/discovery-service'); -const { okapiRequired } = importLazy('../common-options'); +import { contextMiddleware } from '../../cli/context-middleware.js'; +import Okapi from '../../okapi/index.js'; +import DiscoveryService from '../../okapi/discovery-service.js'; +import { okapiRequired } from '../common-options.js'; function discoverModuleCommand(argv) { const context = argv.context; @@ -50,7 +48,7 @@ function discoverModuleCommand(argv) { } } -module.exports = { +export default { command: 'discover', describe: 'Manage instances for the current backend module with Okapi\'s _/discovery endpoint', builder: (yargs) => { diff --git a/lib/commands/mod/enable.js b/lib/commands/mod/enable.js index 27ee1a60..0fa345e3 100644 --- a/lib/commands/mod/enable.js +++ b/lib/commands/mod/enable.js @@ -1,11 +1,9 @@ -const importLazy = require('import-lazy')(require); - -const { contextMiddleware } = importLazy('../../cli/context-middleware'); -const Okapi = importLazy('../../okapi'); -const ModuleService = importLazy('../../okapi/module-service'); -const DescriptorService = importLazy('../../okapi/descriptor-service'); -const { moduleIdsStdin, okapiRequired, tenantRequired } = importLazy('../common-options'); -const { stdinArrayMiddleware } = importLazy('../../cli/stdin-middleware'); +import { contextMiddleware } from '../../cli/context-middleware.js'; +import Okapi from '../../okapi/index.js'; +import ModuleService from '../../okapi/module-service.js'; +import DescriptorService from '../../okapi/descriptor-service.js'; +import { moduleIdsStdin, okapiRequired, tenantRequired } from '../common-options.js'; +import { stdinArrayMiddleware } from '../../cli/stdin-middleware.js'; function enableModuleCommand(argv) { const context = argv.context; @@ -35,7 +33,7 @@ function enableModuleCommand(argv) { }); } -module.exports = { +export default { command: 'enable', describe: 'Enable an app module descriptor for a tenant in Okapi', builder: (yargs) => { diff --git a/lib/commands/mod/filter.js b/lib/commands/mod/filter.js index aa80d51f..4aa95bc6 100644 --- a/lib/commands/mod/filter.js +++ b/lib/commands/mod/filter.js @@ -1,8 +1,6 @@ -const importLazy = require('import-lazy')(require); - -const Okapi = importLazy('../../okapi'); -const ModuleService = importLazy('../../okapi/module-service'); -const { stdinArrayOrJsonMiddleware } = importLazy('../../cli/stdin-middleware'); +import Okapi from '../../okapi/index.js'; +import ModuleService from '../../okapi/module-service.js'; +import { stdinArrayOrJsonMiddleware } from '../../cli/stdin-middleware.js'; function filterModulesCommand(argv) { @@ -26,7 +24,7 @@ function filterModulesCommand(argv) { } } -module.exports = { +export default { command: 'filter', describe: 'Filter module descriptors', builder: (yargs) => { diff --git a/lib/commands/mod/index.js b/lib/commands/mod/index.js new file mode 100644 index 00000000..541bbb01 --- /dev/null +++ b/lib/commands/mod/index.js @@ -0,0 +1,14 @@ +export { default as add } from './add.js'; +export { default as descriptor } from './descriptor.js'; +export { default as disable } from './disable.js'; +export { default as discover } from './discover.js'; +export { default as enable } from './enable.js'; +export { default as filter } from './filter.js'; +export { default as install } from './install.js'; +export { default as list } from './list.js'; +export { default as perms } from './perms.js'; +export { default as pull } from './pull.js'; +export { default as remove } from './remove.js'; +export { default as update } from './update.js'; +export { default as view } from './view.js'; + diff --git a/lib/commands/mod/install.js b/lib/commands/mod/install.js index 3625e742..ca31e068 100644 --- a/lib/commands/mod/install.js +++ b/lib/commands/mod/install.js @@ -1,10 +1,8 @@ -const importLazy = require('import-lazy')(require); - -const Okapi = importLazy('../../okapi'); -const OkapiError = importLazy('../../okapi/okapi-error'); -const ModuleService = importLazy('../../okapi/module-service'); -const { moduleIdsStdin, okapiRequired, tenantRequired } = importLazy('../common-options'); -const { stdinArrayOrJsonMiddleware } = importLazy('../../cli/stdin-middleware'); +import Okapi from '../../okapi/index.js'; +import OkapiError from '../../okapi/okapi-error.js'; +import ModuleService from '../../okapi/module-service.js'; +import { moduleIdsStdin, okapiRequired, tenantRequired } from '../common-options.js'; +import { stdinArrayOrJsonMiddleware } from '../../cli/stdin-middleware.js'; function installModulesCommand(argv) { @@ -51,7 +49,7 @@ function installModulesCommand(argv) { }); } -module.exports = { +export default { command: 'install', describe: 'Enable, disable, and optionally deploy one or more modules for a tenant in Okapi', builder: (yargs) => { diff --git a/lib/commands/mod/list.js b/lib/commands/mod/list.js index 25ee89cf..10e77207 100644 --- a/lib/commands/mod/list.js +++ b/lib/commands/mod/list.js @@ -1,8 +1,6 @@ -const importLazy = require('import-lazy')(require); - -const Okapi = importLazy('../../okapi'); -const ModuleService = importLazy('../../okapi/module-service'); -const { okapiRequired, tenantOption } = importLazy('../common-options'); +import Okapi from '../../okapi/index.js'; +import ModuleService from '../../okapi/module-service.js'; +import { okapiRequired, tenantOption } from '../common-options.js'; function listModuleCommand(argv) { @@ -28,7 +26,7 @@ function listModuleCommand(argv) { }); } -module.exports = { +export default { command: 'list', describe: 'List all module ids available in Okapi or enabled for a tenant', builder: (yargs) => { diff --git a/lib/commands/mod/perms.js b/lib/commands/mod/perms.js index f4595915..d507ad55 100644 --- a/lib/commands/mod/perms.js +++ b/lib/commands/mod/perms.js @@ -1,9 +1,7 @@ -const importLazy = require('import-lazy')(require); - -const Okapi = importLazy('../../okapi'); -const ModuleService = importLazy('../../okapi/module-service'); -const { moduleIdsStdin, okapiRequired } = importLazy('../common-options'); -const { stdinArrayMiddleware } = importLazy('../../cli/stdin-middleware'); +import Okapi from '../../okapi/index.js'; +import ModuleService from '../../okapi/module-service.js'; +import { moduleIdsStdin, okapiRequired } from '../common-options.js'; +import { stdinArrayMiddleware } from '../../cli/stdin-middleware.js'; function listModulePermissionsCommand(argv) { @@ -28,7 +26,7 @@ function listModulePermissionsCommand(argv) { }); } -module.exports = { +export default { command: 'perms', describe: 'List permissions for module ids in Okapi', builder: (yargs) => { diff --git a/lib/commands/mod/pull.js b/lib/commands/mod/pull.js index 4c451735..18e628f4 100644 --- a/lib/commands/mod/pull.js +++ b/lib/commands/mod/pull.js @@ -1,9 +1,6 @@ -const importLazy = require('import-lazy')(require); - -const Okapi = importLazy('../../okapi'); -const ModuleService = importLazy('../../okapi/module-service'); -const { okapiRequired } = importLazy('../common-options'); - +import Okapi from '../../okapi/index.js'; +import ModuleService from '../../okapi/module-service.js'; +import { okapiRequired } from '../common-options.js'; function pullModuleDescriptorsCommand(argv) { const okapi = new Okapi(argv.okapi, argv.tenant); @@ -19,7 +16,7 @@ function pullModuleDescriptorsCommand(argv) { }); } -module.exports = { +export default { command: 'pull', describe: 'Pull module descriptors from a remote okapi', builder: (yargs) => { diff --git a/lib/commands/mod/remove.js b/lib/commands/mod/remove.js index c4b1b2f7..30e02039 100644 --- a/lib/commands/mod/remove.js +++ b/lib/commands/mod/remove.js @@ -1,11 +1,9 @@ -const importLazy = require('import-lazy')(require); - -const { contextMiddleware } = importLazy('../../cli/context-middleware'); -const Okapi = importLazy('../../okapi'); -const ModuleService = importLazy('../../okapi/module-service'); -const DescriptorService = importLazy('../../okapi/descriptor-service'); -const { moduleIdsStdin, okapiRequired } = importLazy('../common-options'); -const { stdinArrayMiddleware } = importLazy('../../cli/stdin-middleware'); +import { contextMiddleware } from '../../cli/context-middleware.js'; +import Okapi from '../../okapi/index.js'; +import ModuleService from '../../okapi/module-service.js'; +import DescriptorService from '../../okapi/descriptor-service.js'; +import { moduleIdsStdin, okapiRequired } from '../common-options.js'; +import { stdinArrayMiddleware } from '../../cli/stdin-middleware.js'; function removeModuleDescriptorCommand(argv) { @@ -34,7 +32,7 @@ function removeModuleDescriptorCommand(argv) { })); } -module.exports = { +export default { command: 'remove', describe: 'Remove a module descriptor from Okapi', builder: (yargs) => { diff --git a/lib/commands/mod/update.js b/lib/commands/mod/update.js index 9372ef63..fb0caf56 100644 --- a/lib/commands/mod/update.js +++ b/lib/commands/mod/update.js @@ -1,10 +1,8 @@ -const importLazy = require('import-lazy')(require); - -const { contextMiddleware } = importLazy('../../cli/context-middleware'); -const Okapi = importLazy('../../okapi'); -const ModuleService = importLazy('../../okapi/module-service'); -const DescriptorService = importLazy('../../okapi/descriptor-service'); -const { okapiRequired } = importLazy('../common-options'); +import { contextMiddleware } from '../../cli/context-middleware.js'; +import Okapi from '../../okapi/index.js'; +import ModuleService from '../../okapi/module-service.js'; +import DescriptorService from '../../okapi/descriptor-service.js'; +import { okapiRequired } from '../common-options.js'; function updateModuleDescriptorCommand(argv) { @@ -28,7 +26,7 @@ function updateModuleDescriptorCommand(argv) { }); } -module.exports = { +export default { command: 'update', describe: 'Update an app module descriptor in Okapi', builder: (yargs) => { diff --git a/lib/commands/mod/view.js b/lib/commands/mod/view.js index cdfdd47a..d9acb435 100644 --- a/lib/commands/mod/view.js +++ b/lib/commands/mod/view.js @@ -1,9 +1,7 @@ -const importLazy = require('import-lazy')(require); - -const Okapi = importLazy('../../okapi'); -const ModuleService = importLazy('../../okapi/module-service'); -const { moduleIdsStdin, okapiRequired } = importLazy('../common-options'); -const { stdinArrayMiddleware } = importLazy('../../cli/stdin-middleware'); +import Okapi from '../../okapi/index.js'; +import ModuleService from '../../okapi/module-service.js'; +import { moduleIdsStdin, okapiRequired } from '../common-options.js'; +import { stdinArrayMiddleware } from '../../cli/stdin-middleware.js'; function viewModuleCommand(argv) { @@ -24,7 +22,7 @@ function viewModuleCommand(argv) { }); } -module.exports = { +export default { command: 'view', describe: 'View module descriptors of module ids in Okapi', builder: (yargs) => { diff --git a/lib/commands/new.js b/lib/commands/new.js index 7c556e3d..facaf0dd 100644 --- a/lib/commands/new.js +++ b/lib/commands/new.js @@ -1,7 +1,5 @@ -const importLazy = require('import-lazy')(require); - -const { contextMiddleware } = importLazy('../cli/context-middleware'); -const createAppCommand = importLazy('./app/create'); +import { contextMiddleware } from '../cli/context-middleware.js'; +import createAppCommand from './app/create.js'; // TODO: Assess usage and possibly deprecate function newCommand(argv) { @@ -12,7 +10,7 @@ function newCommand(argv) { return createAppCommand.handler(argv); } -module.exports = { +export default { command: 'new ', describe: 'Create a new Stripes module', builder: (yargs) => { diff --git a/lib/commands/okapi.js b/lib/commands/okapi.js index d8c55e80..df194274 100644 --- a/lib/commands/okapi.js +++ b/lib/commands/okapi.js @@ -1,6 +1,26 @@ -module.exports = { +import { + cookies, + login, + logout, + pathDelete, + pathGet, + pathPost, + pathPut, + token, +} from './okapi/index.js'; + +export default { command: 'okapi ', describe: 'Okapi commands (login and logout)', - builder: yargs => yargs.commandDir('okapi'), + builder: yargs => yargs.command([ + cookies, + login, + logout, + pathDelete, + pathGet, + pathPost, + pathPut, + token, + ]), handler: () => {}, }; diff --git a/lib/commands/okapi/cookies.js b/lib/commands/okapi/cookies.js index 5594b5cd..ff41593e 100644 --- a/lib/commands/okapi/cookies.js +++ b/lib/commands/okapi/cookies.js @@ -1,6 +1,4 @@ -const importLazy = require('import-lazy')(require); - -const AuthService = importLazy('../../okapi/auth-service'); +import AuthService from '../../okapi/auth-service.js'; function viewCookiesCommand() { const authService = new AuthService(); @@ -14,7 +12,7 @@ function viewCookiesCommand() { }); } -module.exports = { +export default { command: 'cookies', describe: 'Display the stored cookies', builder: yargs => yargs.example('$0 okapi cookies', 'Display the stored cookies'), diff --git a/lib/commands/okapi/index.js b/lib/commands/okapi/index.js new file mode 100644 index 00000000..0a9fb206 --- /dev/null +++ b/lib/commands/okapi/index.js @@ -0,0 +1,8 @@ +export { default as cookies } from './cookies.js'; +export { default as login } from './login.js'; +export { default as logout } from './logout.js'; +export { default as pathDelete } from './pathDelete.js'; +export { default as pathGet } from './pathGet.js'; +export { default as pathPost } from './pathPost.js'; +export { default as pathPut } from './pathPut.js'; +export { default as token } from './token.js'; diff --git a/lib/commands/okapi/login.js b/lib/commands/okapi/login.js index f89dc83f..041daf82 100644 --- a/lib/commands/okapi/login.js +++ b/lib/commands/okapi/login.js @@ -1,9 +1,7 @@ -const importLazy = require('import-lazy')(require); - -const { promptMiddleware } = importLazy('../../cli/prompt-middleware'); -const Okapi = importLazy('../../okapi'); -const AuthService = importLazy('../../okapi/auth-service'); -const { authOptions, okapiRequired, tenantRequired } = importLazy('../common-options'); +import { promptMiddleware } from '../../cli/prompt-middleware.js'; +import Okapi from '../../okapi/index.js'; +import AuthService from '../../okapi/auth-service.js'; +import { authOptions, okapiRequired, tenantRequired } from '../common-options.js'; function loginCommand(argv) { const okapi = new Okapi(argv.okapi, argv.tenant); @@ -18,7 +16,7 @@ function loginCommand(argv) { }); } -module.exports = { +export default { command: 'login [password]', describe: 'Log into an Okapi tenant persist the token', builder: (yargs) => { diff --git a/lib/commands/okapi/logout.js b/lib/commands/okapi/logout.js index e3019a1c..252eb4f4 100644 --- a/lib/commands/okapi/logout.js +++ b/lib/commands/okapi/logout.js @@ -1,6 +1,4 @@ -const importLazy = require('import-lazy')(require); - -const AuthService = importLazy('../../okapi/auth-service'); +import AuthService from '../../okapi/auth-service.js'; function logoutCommand(argv) { const authService = new AuthService(argv.okapi, argv.tenant); @@ -9,7 +7,7 @@ function logoutCommand(argv) { .catch(err => console.log('Error logging out', err)); } -module.exports = { +export default { command: 'logout', describe: 'Clear previously saved Okapi token.', builder: yargs => yargs, diff --git a/lib/commands/okapi/pathDelete.js b/lib/commands/okapi/pathDelete.js index 068fd9a0..6ed1b30e 100644 --- a/lib/commands/okapi/pathDelete.js +++ b/lib/commands/okapi/pathDelete.js @@ -1,7 +1,5 @@ -const importLazy = require('import-lazy')(require); - -const EndpointService = importLazy('../../okapi/endpoint-service'); -const { okapiOptions, pathRequired, tenantOption } = importLazy('../common-options'); +import EndpointService from '../../okapi/endpoint-service.js'; +import { okapiOptions, pathRequired, tenantOption } from '../common-options.js'; function pathDeleteCommand(argv) { @@ -15,7 +13,7 @@ function pathDeleteCommand(argv) { }); } -module.exports = { +export default { command: 'delete ', describe: 'Perform an HTTP DELETE request to a given Okapi endpoint', builder: (yargs) => { diff --git a/lib/commands/okapi/pathGet.js b/lib/commands/okapi/pathGet.js index 38e7a77d..0157ef23 100644 --- a/lib/commands/okapi/pathGet.js +++ b/lib/commands/okapi/pathGet.js @@ -1,7 +1,5 @@ -const importLazy = require('import-lazy')(require); - -const EndpointService = importLazy('../../okapi/endpoint-service'); -const { okapiOptions, pathRequired, tenantOption } = importLazy('../common-options'); +import EndpointService from '../../okapi/endpoint-service.js'; +import { okapiOptions, pathRequired, tenantOption } from '../common-options.js'; function pathGetCommand(argv) { @@ -15,7 +13,7 @@ function pathGetCommand(argv) { }); } -module.exports = { +export default { command: 'get ', describe: 'Perform an HTTP GET request to a given Okapi endpoint', builder: (yargs) => { diff --git a/lib/commands/okapi/pathPost.js b/lib/commands/okapi/pathPost.js index e41321f5..94834dc4 100644 --- a/lib/commands/okapi/pathPost.js +++ b/lib/commands/okapi/pathPost.js @@ -1,12 +1,10 @@ -const importLazy = require('import-lazy')(require); +import fs from 'fs'; +import path from 'path'; +import process from 'process'; -const fs = importLazy('fs'); -const path = importLazy('path'); -const process = importLazy('process'); - -const { stdinJsonMiddleware } = importLazy('../../cli/stdin-middleware'); -const EndpointService = importLazy('../../okapi/endpoint-service'); -const { fileOptions, okapiOptions, pathRequired, tenantOption } = importLazy('../common-options'); +import { stdinJsonMiddleware } from '../../cli/stdin-middleware.js'; +import EndpointService from '../../okapi/endpoint-service.js'; +import { fileOptions, okapiOptions, pathRequired, tenantOption } from '../common-options.js'; function pathPostCommand(argv) { @@ -29,7 +27,7 @@ function pathPostCommand(argv) { }); } -module.exports = { +export default { command: 'post [file]', describe: 'Perform an HTTP POST request with a payload from JSON file/stdin a given Okapi endpoint', builder: (yargs) => { diff --git a/lib/commands/okapi/pathPut.js b/lib/commands/okapi/pathPut.js index 1fbdd105..178e171c 100644 --- a/lib/commands/okapi/pathPut.js +++ b/lib/commands/okapi/pathPut.js @@ -1,12 +1,10 @@ -const importLazy = require('import-lazy')(require); +import fs from 'fs'; +import path from 'path'; +import process from 'process'; -const fs = importLazy('fs'); -const path = importLazy('path'); -const process = importLazy('process'); - -const { stdinJsonMiddleware } = importLazy('../../cli/stdin-middleware'); -const EndpointService = importLazy('../../okapi/endpoint-service'); -const { fileOptions, okapiOptions, pathRequired, tenantOption } = importLazy('../common-options'); +import { stdinJsonMiddleware } from '../../cli/stdin-middleware.js'; +import EndpointService from '../../okapi/endpoint-service.js'; +import { fileOptions, okapiOptions, pathRequired, tenantOption } from '../common-options.js'; function pathPutCommand(argv) { @@ -29,7 +27,7 @@ function pathPutCommand(argv) { }); } -module.exports = { +export default { command: 'put [file]', describe: 'Perform an HTTP PUT request with a payload from JSON file/stdin a given Okapi endpoint', builder: (yargs) => { diff --git a/lib/commands/okapi/token.js b/lib/commands/okapi/token.js index be14c3b0..24716b1c 100644 --- a/lib/commands/okapi/token.js +++ b/lib/commands/okapi/token.js @@ -1,6 +1,4 @@ -const importLazy = require('import-lazy')(require); - -const AuthService = importLazy('../../okapi/auth-service'); +import AuthService from '../../okapi/auth-service.js'; function viewTokenCommand() { const authService = new AuthService(); @@ -9,7 +7,7 @@ function viewTokenCommand() { }); } -module.exports = { +export default { command: 'token', describe: 'Display the stored Okapi token', builder: yargs => yargs.example('$0 okapi token', 'Display the stored Okapi token'), diff --git a/lib/commands/perm.js b/lib/commands/perm.js index 7db46e55..35414578 100644 --- a/lib/commands/perm.js +++ b/lib/commands/perm.js @@ -1,6 +1,20 @@ -module.exports = { +import { + assign, + create, + filter, + list, + unassign, +} from './perm/index.js'; + +export default { command: 'perm ', describe: 'Commands to manage UI module permissions', - builder: yargs => yargs.commandDir('perm'), + builder: yargs => yargs.command([ + assign, + create, + filter, + list, + unassign, + ]), handler: () => {}, }; diff --git a/lib/commands/perm/assign.js b/lib/commands/perm/assign.js index abe80719..5a4853d8 100644 --- a/lib/commands/perm/assign.js +++ b/lib/commands/perm/assign.js @@ -1,10 +1,8 @@ -const importLazy = require('import-lazy')(require); - -const Okapi = importLazy('../../okapi'); -const PermissionService = importLazy('../../okapi/permission-service'); -const { okapiRequired, tenantRequired } = importLazy('../common-options'); -const { promptMiddleware } = importLazy('../../cli/prompt-middleware'); -const { stdinArrayMiddleware } = importLazy('../../cli/stdin-middleware'); +import Okapi from '../../okapi/index.js'; +import PermissionService from '../../okapi/permission-service.js'; +import { okapiRequired, tenantRequired } from '../common-options.js'; +import { promptMiddleware } from '../../cli/prompt-middleware.js'; +import { stdinArrayMiddleware } from '../../cli/stdin-middleware.js'; function assignPermissionsCommand(argv) { // TODO: update aliases @@ -43,7 +41,7 @@ const permOptions = { }, }; -module.exports = { +export default { command: 'assign', describe: 'Assign permission to a user', builder: (yargs) => { diff --git a/lib/commands/perm/create.js b/lib/commands/perm/create.js index fbeb971a..9f88a70c 100644 --- a/lib/commands/perm/create.js +++ b/lib/commands/perm/create.js @@ -1,14 +1,12 @@ -const importLazy = require('import-lazy')(require); - -const { contextMiddleware } = importLazy('../../cli/context-middleware'); -const { promptMiddleware } = importLazy('../../cli/prompt-middleware'); -const Okapi = importLazy('../../okapi'); -const PermissionService = importLazy('../../okapi/permission-service'); -const { okapiOptions } = importLazy('../common-options'); -const addModCommand = importLazy('../mod/add'); -const enableModCommand = importLazy('../mod/enable'); -const updateModCommand = importLazy('../mod/update'); -const assignPermCommand = importLazy('../perm/assign'); +import { contextMiddleware } from '../../cli/context-middleware.js'; +import { promptMiddleware } from '../../cli/prompt-middleware.js'; +import Okapi from '../../okapi/index.js'; +import PermissionService from '../../okapi/permission-service.js'; +import { okapiOptions } from '../common-options.js'; +import addModCommand from '../mod/add.js'; +import enableModCommand from '../mod/enable.js'; +import updateModCommand from '../mod/update.js'; +import assignPermCommand from './assign.js'; function createPermCommand(argv) { const context = argv.context; @@ -81,7 +79,7 @@ const permOptions = { }, }; -module.exports = { +export default { command: 'create [name]', describe: 'Adds new UI permission to permissionSet', // TODO: Handle sub-permissions builder: (yargs) => { diff --git a/lib/commands/perm/filter.js b/lib/commands/perm/filter.js index 258ae1fe..a6fe557c 100644 --- a/lib/commands/perm/filter.js +++ b/lib/commands/perm/filter.js @@ -1,8 +1,6 @@ -const importLazy = require('import-lazy')(require); - -const Okapi = importLazy('../../okapi'); -const PermissionService = importLazy('../../okapi/permission-service'); -const { stdinArrayMiddleware } = importLazy('../../cli/stdin-middleware'); +import Okapi from '../../okapi/index.js'; +import PermissionService from '../../okapi/permission-service.js'; +import { stdinArrayMiddleware } from '../../cli/stdin-middleware.js'; function filterPermissionsCommand(argv, context) { @@ -21,7 +19,7 @@ function filterPermissionsCommand(argv, context) { filteredPromise.then(permissions => permissions.forEach(perm => console.log(perm))); } -module.exports = { +export default { command: 'filter', describe: 'Filter permissions', builder: (yargs) => { diff --git a/lib/commands/perm/index.js b/lib/commands/perm/index.js new file mode 100644 index 00000000..6b2f6902 --- /dev/null +++ b/lib/commands/perm/index.js @@ -0,0 +1,5 @@ +export { default as assign } from './assign.js'; +export { default as create } from './create.js'; +export { default as filter } from './filter.js'; +export { default as list } from './list.js'; +export { default as unassign } from './unassign.js'; diff --git a/lib/commands/perm/list.js b/lib/commands/perm/list.js index 5b28d94a..0a6db342 100644 --- a/lib/commands/perm/list.js +++ b/lib/commands/perm/list.js @@ -1,8 +1,6 @@ -const importLazy = require('import-lazy')(require); - -const Okapi = importLazy('../../okapi'); -const PermissionService = importLazy('../../okapi/permission-service'); -const { okapiRequired, tenantRequired } = importLazy('../common-options'); +import Okapi from '../../okapi/index.js'; +import PermissionService from '../../okapi/permission-service.js'; +import { okapiRequired, tenantRequired } from '../common-options.js'; function listPermissionsCommand(argv) { @@ -19,7 +17,7 @@ function listPermissionsCommand(argv) { }); } -module.exports = { +export default { command: 'list', describe: 'List permissions for a user', aliases: ['view'], diff --git a/lib/commands/perm/unassign.js b/lib/commands/perm/unassign.js index dc0538b6..b4798c88 100644 --- a/lib/commands/perm/unassign.js +++ b/lib/commands/perm/unassign.js @@ -1,10 +1,8 @@ -const importLazy = require('import-lazy')(require); - -const Okapi = importLazy('../../okapi'); -const PermissionService = importLazy('../../okapi/permission-service'); -const { okapiRequired, tenantRequired } = importLazy('../common-options'); -const { promptMiddleware } = importLazy('../../cli/prompt-middleware'); -const { stdinArrayMiddleware } = importLazy('../../cli/stdin-middleware'); +import Okapi from '../../okapi/index.js'; +import PermissionService from '../../okapi/permission-service.js'; +import { okapiRequired, tenantRequired } from '../common-options.js'; +import { promptMiddleware } from '../../cli/prompt-middleware.js'; +import { stdinArrayMiddleware } from '../../cli/stdin-middleware.js'; function unassignPermissionsCommand(argv) { const okapi = new Okapi(argv.okapi, argv.tenant); @@ -39,7 +37,7 @@ const permOptions = { }, }; -module.exports = { +export default { command: 'unassign', describe: 'Unassign permissions from a user', builder: (yargs) => { diff --git a/lib/commands/platform.js b/lib/commands/platform.js index 428e4dfb..4c2bb40d 100644 --- a/lib/commands/platform.js +++ b/lib/commands/platform.js @@ -1,6 +1,18 @@ -module.exports = { +import { + backend, + clean, + install, + pull, +} from './platform/index.js'; + +export default { command: 'platform ', describe: 'Commands to manage stripes UI platforms', - builder: yargs => yargs.commandDir('platform'), + builder: yargs => yargs.command([ + backend, + clean, + install, + pull, + ]), handler: () => {}, }; diff --git a/lib/commands/platform/backend.js b/lib/commands/platform/backend.js index 2be4622b..e98acbaa 100644 --- a/lib/commands/platform/backend.js +++ b/lib/commands/platform/backend.js @@ -1,13 +1,11 @@ -const importLazy = require('import-lazy')(require); - -const { contextMiddleware } = importLazy('../../cli/context-middleware'); -const { stripesConfigMiddleware } = importLazy('../../cli/stripes-config-middleware'); -const Okapi = importLazy('../../okapi'); -const OkapiError = importLazy('../../okapi/okapi-error'); -const ModuleService = importLazy('../../okapi/module-service'); -const DescriptorService = importLazy('../../okapi/descriptor-service'); -const PermissionService = importLazy('../../okapi/permission-service'); -const { okapiRequired, tenantRequired, stripesConfigFile, stripesConfigStdin } = importLazy('../common-options'); +import { contextMiddleware } from '../../cli/context-middleware.js'; +import { stripesConfigMiddleware } from '../../cli/stripes-config-middleware.js'; +import Okapi from '../../okapi/index.js'; +import OkapiError from '../../okapi/okapi-error.js'; +import ModuleService from '../../okapi/module-service.js'; +import DescriptorService from '../../okapi/descriptor-service.js'; +import PermissionService from '../../okapi/permission-service.js'; +import { okapiRequired, tenantRequired, stripesConfigFile, stripesConfigStdin } from '../common-options.js'; function displayActionResults(response, isDetailView, isSimulation) { @@ -112,7 +110,7 @@ async function backendInstallCommand(argv) { return Promise.resolve(); } -module.exports = { +export default { command: 'backend ', describe: 'Initialize Okapi backend for a platform', builder: (yargs) => { diff --git a/lib/commands/platform/clean.js b/lib/commands/platform/clean.js index fa11ebf1..5564e441 100644 --- a/lib/commands/platform/clean.js +++ b/lib/commands/platform/clean.js @@ -1,10 +1,8 @@ -const importLazy = require('import-lazy')(require); - -const { contextMiddleware } = importLazy('../../cli/context-middleware'); -const path = importLazy('path'); -const fs = importLazy('fs'); -const rimraf = importLazy('rimraf'); -const DevelopmentEnvironment = importLazy('../../environment/development'); +import path from 'path'; +import fs from 'fs'; +import rimraf from 'rimraf'; +import { contextMiddleware } from '../../cli/context-middleware.js'; +import DevelopmentEnvironment from '../../environment/development.js'; function removeFileOrFolder(dir, fileOrFolderName) { return new Promise((resolve) => { @@ -65,7 +63,7 @@ function cleanCommand(argv) { }); } -module.exports = { +export default { command: 'clean', describe: 'Remove node_modules for active platform, workspace, and aliases', builder: (yargs) => { diff --git a/lib/commands/platform/index.js b/lib/commands/platform/index.js new file mode 100644 index 00000000..403032a0 --- /dev/null +++ b/lib/commands/platform/index.js @@ -0,0 +1,4 @@ +export { default as backend } from './backend.js'; +export { default as clean } from './clean.js'; +export { default as install } from './install.js'; +export { default as pull } from './pull.js'; diff --git a/lib/commands/platform/install.js b/lib/commands/platform/install.js index c8035141..75a33b89 100644 --- a/lib/commands/platform/install.js +++ b/lib/commands/platform/install.js @@ -1,7 +1,5 @@ -const importLazy = require('import-lazy')(require); - -const { contextMiddleware } = importLazy('../../cli/context-middleware'); -const DevelopmentEnvironment = importLazy('../../environment/development'); +import { contextMiddleware } from '../../cli/context-middleware.js'; +import DevelopmentEnvironment from '../../environment/development.js'; function installCommand(argv) { @@ -20,7 +18,7 @@ function installCommand(argv) { }); } -module.exports = { +export default { command: 'install', describe: 'Yarn install platform or workspace dependencies including aliases', builder: (yargs) => { diff --git a/lib/commands/platform/pull.js b/lib/commands/platform/pull.js index 4dc956ec..3ec9faf4 100644 --- a/lib/commands/platform/pull.js +++ b/lib/commands/platform/pull.js @@ -1,8 +1,7 @@ -const importLazy = require('import-lazy')(require); +import simpleGit from 'simple-git'; -const { contextMiddleware } = importLazy('../../cli/context-middleware'); -const simpleGit = importLazy('simple-git'); -const DevelopmentEnvironment = importLazy('../../environment/development'); +import { contextMiddleware } from '../../cli/context-middleware.js'; +import DevelopmentEnvironment from '../../environment/development.js'; function isClean(status) { const check = ['conflicted', 'created', 'deleted', 'modified', 'renamed']; @@ -95,7 +94,7 @@ function pullCommand(argv) { }); } -module.exports = { +export default { command: 'pull', describe: 'Git pull latest code for a platform or workspace including aliases', builder: (yargs) => { diff --git a/lib/commands/serve.js b/lib/commands/serve.js index 52036169..2f548311 100644 --- a/lib/commands/serve.js +++ b/lib/commands/serve.js @@ -1,14 +1,15 @@ -const importLazy = require('import-lazy')(require); -const childProcess = require('child_process'); -const path = require('path'); - -const { contextMiddleware } = importLazy('../cli/context-middleware'); -const { stripesConfigMiddleware } = importLazy('../cli/stripes-config-middleware'); -const StripesCore = importLazy('../cli/stripes-core'); -const StripesPlatform = importLazy('../platform/stripes-platform'); -const { serverOptions, okapiOptions, stripesConfigFile, stripesConfigStdin, stripesConfigOptions, buildOptions } = importLazy('./common-options'); -const { processError, emitLintWarnings, limitChunks, enableMirage, enableCoverage, ignoreCache } = importLazy('../webpack-common'); -const server = importLazy('../server'); +import childProcess from 'child_process'; +import path from 'path'; + +import { contextMiddleware } from '../cli/context-middleware.js'; +import { stripesConfigMiddleware } from '../cli/stripes-config-middleware.js'; +import StripesCore from '../cli/stripes-core.js'; +import StripesPlatform from '../platform/stripes-platform.js'; +import { serverOptions, okapiOptions, stripesConfigFile, stripesConfigStdin, stripesConfigOptions, buildOptions } from './common-options.js'; +import webpackCommon from '../webpack-common.js'; +import { start } from '../server.js'; + +const { processError, emitLintWarnings, limitChunks, enableMirage, enableCoverage, ignoreCache } = { webpackCommon }; // stripes-core does not currently support publicPath with the dev server const serveBuildOptions = Object.assign({}, buildOptions); @@ -32,7 +33,7 @@ function serveCommand(argv) { // When a directory is provided, there is nothing to build if (argv.existingBuild) { console.log('Serving an existing build...'); - server.start(argv.existingBuild, argv); + start(argv.existingBuild, argv); return; } @@ -92,7 +93,7 @@ function serveCommand(argv) { .catch(processError); } -module.exports = { +export default { command: 'serve [configFile]', aliases: ['dev'], describe: 'Serve up a development build of Stripes', diff --git a/lib/commands/status.js b/lib/commands/status.js index cd7dc53f..02513881 100644 --- a/lib/commands/status.js +++ b/lib/commands/status.js @@ -1,17 +1,21 @@ -const importLazy = require('import-lazy')(require); +import path from 'path'; +import fs from 'fs-extra'; -const { contextMiddleware } = importLazy('../cli/context-middleware'); -const { stripesConfigMiddleware } = importLazy('../cli/stripes-config-middleware'); -const packageJson = importLazy('../../package.json'); -const StripesPlatform = importLazy('../platform/stripes-platform'); -const PlatformStorage = importLazy('../platform/platform-storage'); -const { listAliases } = importLazy('./alias'); -const { okapiOptions, stripesConfigFile, stripesConfigStdin, stripesConfigOptions } = importLazy('./common-options'); -const { configPath, plugins } = importLazy('../cli/config'); -const AliasService = importLazy('../platform/alias-service'); -const DevelopmentEnvironment = importLazy('../environment/development'); -const StripesCore = importLazy('../cli/stripes-core'); +import { contextMiddleware } from '../cli/context-middleware.js'; +import { stripesConfigMiddleware } from '../cli/stripes-config-middleware.js'; +import StripesPlatform from '../platform/stripes-platform.js'; +import PlatformStorage from '../platform/platform-storage.js'; +import { listAliases } from './alias.js'; +import { okapiOptions, stripesConfigFile, stripesConfigStdin, stripesConfigOptions } from './common-options.js'; +import cliConfig from '../cli/config.js'; +import AliasService from '../platform/alias-service.js'; +import DevelopmentEnvironment from '../environment/development.js'; +import StripesCore from '../cli/stripes-core.js'; +const { configPath, plugins } = { cliConfig }; + +const pkgPath = path.join(import.meta.dirname, '..', '..', 'package.json'); +const packageJson = fs.readJsonSync(pkgPath, { throws: false }); function statusCommand(argv) { const context = argv.context; @@ -64,7 +68,7 @@ function statusCommand(argv) { console.log(); } -module.exports = { +export default { command: 'status [configFile]', describe: 'Display Stripes CLI status information', builder: (yargs) => { diff --git a/lib/commands/test.js b/lib/commands/test.js index ae296720..d688ecf7 100644 --- a/lib/commands/test.js +++ b/lib/commands/test.js @@ -1,19 +1,20 @@ -const importLazy = require('import-lazy')(require); +import { + karma +} from './test/index.js'; -const { contextMiddleware } = importLazy('../cli/context-middleware'); -const { stripesConfigMiddleware } = importLazy('../cli/stripes-config-middleware'); -const { serverOptions, okapiOptions, stripesConfigFile, stripesConfigOptions } = importLazy('./common-options'); -const karmaCommand = importLazy('./test/karma').handler; -const { commandDirOptions } = importLazy('../cli/config'); +import { contextMiddleware } from '../cli/context-middleware.js'; +import { stripesConfigMiddleware } from '../cli/stripes-config-middleware.js'; +import { serverOptions, okapiOptions, stripesConfigFile, stripesConfigOptions } from './common-options.js'; +import cliConfig from '../cli/config.js'; function testCommand(argv) { // Maintain backwards compatibility with original commands if (argv.type === 'unit') { - karmaCommand(argv); + karma.handler(argv); } } -module.exports = { +export default { command: 'test', describe: 'Run the current app module\'s tests', builder: (yargs) => { @@ -22,7 +23,8 @@ module.exports = { contextMiddleware(), stripesConfigMiddleware(true) ]) - .commandDir('test', commandDirOptions) + //@@ + .command([karma]) .positional('configFile', stripesConfigFile.configFile) .options(Object.assign({}, serverOptions, okapiOptions, stripesConfigOptions)) .example('$0 test karma', 'Run Karma tests for the current app module'); diff --git a/lib/commands/test/index.js b/lib/commands/test/index.js new file mode 100644 index 00000000..58d69756 --- /dev/null +++ b/lib/commands/test/index.js @@ -0,0 +1 @@ +export { default as karma } from './karma.js'; diff --git a/lib/commands/test/karma.js b/lib/commands/test/karma.js index db1d6ef2..1e36d73b 100644 --- a/lib/commands/test/karma.js +++ b/lib/commands/test/karma.js @@ -1,11 +1,9 @@ -const importLazy = require('import-lazy')(require); - -const { contextMiddleware } = importLazy('../../cli/context-middleware'); -const { stripesConfigMiddleware } = importLazy('../../cli/stripes-config-middleware'); -const KarmaService = importLazy('../../test/karma-service'); -const StripesPlatform = importLazy('../../platform/stripes-platform'); -const { serverOptions, okapiOptions, stripesConfigFile, stripesConfigStdin, stripesConfigOptions } = importLazy('../common-options'); -const StripesCore = importLazy('../../cli/stripes-core'); +import { contextMiddleware } from '../../cli/context-middleware.js'; +import { stripesConfigMiddleware } from '../../cli/stripes-config-middleware.js'; +import KarmaService from '../../test/karma-service.js'; +import StripesPlatform from '../../platform/stripes-platform.js'; +import { serverOptions, okapiOptions, stripesConfigFile, stripesConfigStdin, stripesConfigOptions } from '../common-options.js'; +import StripesCore from '../../cli/stripes-core.js'; function karmaCommand(argv) { const context = argv.context; @@ -52,7 +50,7 @@ function karmaCommand(argv) { karmaService.runKarmaTests(webpackConfig, Object.assign({}, argv.karma, { watch: argv.watch, cache: argv.cache })); } -module.exports = { +export default { command: 'karma [configFile]', describe: 'Run the current app module\'s Karma tests', builder: (yargs) => { diff --git a/lib/commands/translate.js b/lib/commands/translate.js index 49b1f51b..c600599c 100644 --- a/lib/commands/translate.js +++ b/lib/commands/translate.js @@ -1,6 +1,9 @@ -module.exports = { +import { compile, pcheck, stats } from './translate/index.js'; + +export default { command: 'translate ', describe: 'Commands to manage translations in UI platforms', - builder: yargs => yargs.commandDir('translate'), + // @@builder: yargs => yargs.commandDir('translate'), + builder: yargs => yargs.command([compile, pcheck, stats]), handler: () => {}, }; diff --git a/lib/commands/translate/compile.js b/lib/commands/translate/compile.js index bc926c35..0bb0f42c 100644 --- a/lib/commands/translate/compile.js +++ b/lib/commands/translate/compile.js @@ -5,15 +5,13 @@ * Exits if the output directory cannot be created * */ -const importLazy = require('import-lazy')(require); +import fs from 'fs'; +import path from 'path'; +import process from 'process'; +import fg from 'fast-glob'; +import { compile } from '@formatjs/cli-lib'; -const fs = importLazy('fs'); -const path = importLazy('path'); -const process = importLazy('process'); -const fg = importLazy('fast-glob'); -const { compile } = importLazy('@formatjs/cli-lib'); - -const { contextMiddleware } = importLazy('../../cli/context-middleware'); +import { contextMiddleware } from '../../cli/context-middleware.js'; /** * createOutDir @@ -61,7 +59,7 @@ function formatjsCompileCommand(argv) { } } -module.exports = { +export default { command: 'compile', describe: 'compile translations to AST for consumption by formatjs', builder: (yargs) => { diff --git a/lib/commands/translate/index.js b/lib/commands/translate/index.js new file mode 100644 index 00000000..33523fd1 --- /dev/null +++ b/lib/commands/translate/index.js @@ -0,0 +1,3 @@ +export { default as compile } from './compile.js'; +export { default as pcheck } from './pcheck.js'; +export { default as stats } from './stats.js'; diff --git a/lib/commands/translate/pcheck.js b/lib/commands/translate/pcheck.js index be4ab6c1..d9830956 100644 --- a/lib/commands/translate/pcheck.js +++ b/lib/commands/translate/pcheck.js @@ -6,12 +6,11 @@ * missing; otherwise exit 0. * */ -const importLazy = require('import-lazy')(require); -const fs = importLazy('fs'); -const path = importLazy('path'); +import fs from 'fs'; +import path from 'path'; -const { contextMiddleware } = importLazy('../../cli/context-middleware'); +import { contextMiddleware } from '../../cli/context-middleware.js'; function pcheckCommand(argv) { const context = argv.context; @@ -37,7 +36,7 @@ function pcheckCommand(argv) { } } -module.exports = { +export default { command: 'pcheck', describe: 'validate that permissions have translation keys', builder: (yargs) => { diff --git a/lib/commands/translate/stats.js b/lib/commands/translate/stats.js index 65bbdf91..ce11d4b5 100644 --- a/lib/commands/translate/stats.js +++ b/lib/commands/translate/stats.js @@ -3,13 +3,11 @@ * calculate completeness of translations for each locale by comparison to en_US * */ -const importLazy = require('import-lazy')(require); +import fs from 'fs'; +import path from 'path'; +import _ from 'lodash'; -const fs = importLazy('fs'); -const path = importLazy('path'); -const _ = importLazy('lodash'); - -const { contextMiddleware } = importLazy('../../cli/context-middleware'); +import { contextMiddleware } from '../../cli/context-middleware.js'; const localeFormat = (s) => _.padStart(s.substr(0, s.indexOf('.')), 6); const nFormat = (n) => _.padStart(Math.floor(n), 3); @@ -35,7 +33,7 @@ function statsCommand(argv) { }); } -module.exports = { +export default { command: 'stats', describe: 'Show completeness of translations for each locale', builder: (yargs) => { diff --git a/lib/commands/transpile.js b/lib/commands/transpile.js index 1c2b7db3..938bb6c1 100644 --- a/lib/commands/transpile.js +++ b/lib/commands/transpile.js @@ -1,10 +1,8 @@ -const importLazy = require('import-lazy')(require); - -const { contextMiddleware } = importLazy('../cli/context-middleware'); -const StripesCore = importLazy('../cli/stripes-core'); -const StripesPlatform = importLazy('../platform/stripes-platform'); -const { stripesConfigFile } = importLazy('./common-options'); -const { processError, processStats } = importLazy('../webpack-common'); +import { contextMiddleware } from '../cli/context-middleware.js'; +import StripesCore from '../cli/stripes-core.js'; +import StripesPlatform from '../platform/stripes-platform.js'; +import { stripesConfigFile } from './common-options.js'; +import webpackCommon from '../webpack-common.js'; let _stripesPlatform; let _stripesCore; @@ -36,11 +34,11 @@ function transpileCommand(argv) { console.info('Transpiling...'); const stripes = _stripesCore || new StripesCore(context, platform.aliases); stripes.api.transpile(Object.assign({}, argv, { webpackOverrides })) - .then(processStats) - .catch(processError); + .then(webpackCommon.processStats) + .catch(webpackCommon.processError); } -module.exports = { +export default { command: 'transpile', describe: 'Transpile single module', builder: (yargs) => { diff --git a/lib/commands/workspace.js b/lib/commands/workspace.js index f1ea853a..0e46b6b1 100644 --- a/lib/commands/workspace.js +++ b/lib/commands/workspace.js @@ -1,11 +1,10 @@ -const importLazy = require('import-lazy')(require); +import path from 'path'; +import inquirer from 'inquirer'; -const { contextMiddleware } = importLazy('../cli/context-middleware'); -const path = importLazy('path'); -const inquirer = importLazy('inquirer'); -const DevelopmentEnvironment = importLazy('../environment/development'); -const { allModules, allModulesAsFlatArray } = importLazy('../environment/inventory'); -const { promptMiddleware } = importLazy('../cli/prompt-middleware'); +import { contextMiddleware } from '../cli/context-middleware.js'; +import DevelopmentEnvironment from '../environment/development.js'; +import { allModules, allModulesAsFlatArray } from '../environment/inventory.js'; +import { promptMiddleware } from '../cli/prompt-middleware.js'; function workspaceCommand(argv) { @@ -123,7 +122,7 @@ const options = () => { }; }; -module.exports = { +export default { command: 'workspace', describe: 'Create a Yarn workspace for Stripes development, select modules, clone, and install.', builder: (yargs) => { diff --git a/lib/create-app.js b/lib/create-app.js index c6305969..f5b90a21 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -1,11 +1,14 @@ -const path = require('path'); -const fs = require('fs-extra'); -const kebabCase = require('just-kebab-case'); -const semver = require('semver'); -const pascalCase = require('just-pascal-case'); -const simpleGit = require('simple-git'); -const { templates } = require('./environment/inventory'); -const { version: currentCLIVersion } = require('../package'); +import path from 'path'; +import fs from 'fs-extra'; +import kebabCase from 'just-kebab-case'; +import semver from 'semver'; +import pascalCase from 'just-pascal-case'; +import simpleGit from 'simple-git'; + +import { templates } from './environment/inventory.js'; + +const pkgPath = path.join(import.meta.dirname, '..', 'package.json'); +const { version: currentCLIVersion } = fs.readJsonSync(pkgPath, { throws: false }); const COOKIECUTTER_PREFIX = '__'; @@ -116,7 +119,7 @@ async function createApp(appName, appDescription) { return args; } -module.exports = { +export default { appDefaults, createApp, }; diff --git a/lib/doc/commands-to-markdown.js b/lib/doc/commands-to-markdown.js index f87aa23b..87b14ae4 100644 --- a/lib/doc/commands-to-markdown.js +++ b/lib/doc/commands-to-markdown.js @@ -1,8 +1,9 @@ +import getLogger from '../cli/logger.js'; /* Generates CLI command reference in markdown format using command data obtained from yargs-help-parser */ -const logger = require('../cli/logger')('docs'); +const logger = getLogger('docs'); // Exclude these commands from the markdown @@ -121,7 +122,7 @@ function markdownCommand(command, depth) { } // Recursively returns markdown for all commands in the tree -function generateMarkdown(command, depth = 1) { +export function generateMarkdown(command, depth = 1) { const skip = skipCommands.includes(command.fullName); let markdown = skip ? '' : markdownCommand(command, depth); command.subCommands.forEach(subCommand => { @@ -131,7 +132,7 @@ function generateMarkdown(command, depth = 1) { } // Recursively returns markdown TOC for all commands in the tree -function generateToc(command, depth = 0) { +export function generateToc(command, depth = 0) { const skip = skipCommands.includes(command.fullName); let level = depth; let tocIndent = ''; @@ -145,8 +146,3 @@ function generateToc(command, depth = 0) { }); return toc; } - -module.exports = { - generateToc: (command) => generateToc(command).trim(), - generateMarkdown, -}; diff --git a/lib/doc/generator.js b/lib/doc/generator.js index 789a8229..e3dd94cd 100644 --- a/lib/doc/generator.js +++ b/lib/doc/generator.js @@ -1,15 +1,19 @@ /* Automatically generates doc/commands.md based on Stripes-CLI help output */ -const fs = require('fs'); -const path = require('path'); -const { version } = require('../../package'); -const logger = require('../cli/logger')('docs'); -const { gatherCommands } = require('./yargs-help-parser'); -const { generateToc, generateMarkdown } = require('./commands-to-markdown'); - -const scriptPath = path.join(__dirname, '..', 'stripes-cli.js'); -const docPath = path.join(__dirname, '..', '..', 'doc'); +import fs from 'fs'; + +import path from 'path'; +import getLogger from '../cli/logger.js'; +import { gatherCommands } from './yargs-help-parser.js'; +import { generateToc, generateMarkdown } from './commands-to-markdown.js'; + +const { version } = fs.readJsonSync('../../package.json', { throws: false }); + +const logger = getLogger('docs'); + +const scriptPath = path.join(import.meta.dirname, '..', 'stripes-cli.js'); +const docPath = path.join(import.meta.dirname, '..', '..', 'doc'); const templatePath = path.join(docPath, 'commands-template.md'); const outputPath = path.join(docPath, 'commands.md'); diff --git a/lib/doc/yargs-help-parser.js b/lib/doc/yargs-help-parser.js index fd90ad14..497b8781 100644 --- a/lib/doc/yargs-help-parser.js +++ b/lib/doc/yargs-help-parser.js @@ -2,8 +2,11 @@ Recursively parses Yargs command --help output to generate a command tree for use in generating a CLI command reference. This is currently specific to stripes-cli, but a future refactor could make it general purpose for other Yargs-based CLIs */ -const childProcess = require('child_process'); -const logger = require('../cli/logger')('docs'); +import childProcess from 'child_process'; + +import getLogger from '../cli/logger.js'; + +const logger = getLogger('docs'); // Captures command name, eg. "stripes foo bar" (match[1]), and description (match[2]) separated by two new-lines const commandRegex = /(stripes\s.*)\n\n\b(.*)\n/; @@ -150,7 +153,7 @@ function getYargsHelpText(command, scriptPath) { } // Walks the entire command tree as visible from --help -function gatherCommands(commandName, scriptPath) { +export function gatherCommands(commandName, scriptPath) { const name = commandName.replace(/^stripes\s?/, ''); const helpText = getYargsHelpText(name, scriptPath); return { @@ -164,7 +167,3 @@ function gatherCommands(commandName, scriptPath) { examples: parseExamples(helpText), }; } - -module.exports = { - gatherCommands, -}; diff --git a/lib/environment/development.js b/lib/environment/development.js index 6ae3e1fc..e757ea62 100644 --- a/lib/environment/development.js +++ b/lib/environment/development.js @@ -1,14 +1,18 @@ -const kopy = require('kopy'); -const path = require('path'); -const fs = require('fs'); -const simpleGit = require('simple-git'); -const semver = require('semver'); -const context = require('../cli/context'); -const yarn = require('../yarn'); -const { allModules, allModulesAsFlatArray, toFolioName } = require('./inventory'); -const AliasService = require('../platform/alias-service'); -const logger = require('../cli/logger')(); -const { version: currentCLIVersion } = require('../../package'); +import kopy from 'kopy'; +import path from 'path'; +import fs from 'fs-extra'; +import simpleGit from 'simple-git'; +import semver from 'semver'; + +import context from '../cli/context.js'; +import yarn from '../yarn.js'; +import { allModules, allModulesAsFlatArray, toFolioName } from './inventory.js'; +import AliasService from '../platform/alias-service.js'; + +import logger from '../cli/logger.js'; + +const pkgPath = path.join(import.meta.dirname, '..', '..', 'package.json'); +const { version: currentCLIVersion } = fs.readJsonSync(pkgPath, { throws: false }); // Compare a list of module names against those known to be valid function validateModules(theModules) { @@ -28,7 +32,7 @@ function mergeUnique(...theArrays) { // Contains logic to create and manage a development environment // Includes shared module/alias validation for consistency across operations. -module.exports = class DevelopmentEnvironment { +export default class DevelopmentEnvironment { constructor(projectDir, isYarnWorkspace) { this.projectDir = projectDir; this.isYarnWorkspace = isYarnWorkspace; @@ -109,7 +113,7 @@ module.exports = class DevelopmentEnvironment { } // Copy the workspace template - const templateDir = path.join(__dirname, '..', '..', 'resources', 'workspace'); + const templateDir = path.join(import.meta.dirname, '..', '..', 'resources', 'workspace'); const { version: normalizedCLIVersion } = semver.coerce(currentCLIVersion); const zeroPatchCLIVersion = normalizedCLIVersion.replace(/\d*$/, '0'); @@ -193,4 +197,4 @@ module.exports = class DevelopmentEnvironment { resolve(); }); } -}; +} diff --git a/lib/environment/inventory.js b/lib/environment/inventory.js index 4994a89b..828c3094 100644 --- a/lib/environment/inventory.js +++ b/lib/environment/inventory.js @@ -1,6 +1,6 @@ -const fs = require('fs-extra'); -const path = require('path'); -const { Octokit } = require('@octokit/rest'); +import fs from 'fs-extra'; +import path from 'path'; +import { Octokit } from '@octokit/rest'; const MODULE_CACHE_FILE = '/inventory.json'; @@ -16,22 +16,22 @@ const otherModules = [ // Modules not present in a stripes.config, but do need to be included when // generating module descriptors for a platform -const moduleDescriptorExtras = [ +export const moduleDescriptorExtras = [ 'stripes-smart-components', 'stripes-core', ]; -function saveModules(modules) { - const outputPath = path.join(__dirname, MODULE_CACHE_FILE); +const saveModules = (modules) => { + const outputPath = path.join(import.meta.dirname, MODULE_CACHE_FILE); fs.outputJSONSync(outputPath, modules); console.log(`Saved modules to ${outputPath}`); -} +}; -function readModules() { - return fs.readJSONSync(path.join(__dirname, MODULE_CACHE_FILE)); -} +const readModules = () => { + return fs.readJSONSync(path.join(import.meta.dirname, MODULE_CACHE_FILE)); +}; -async function fetchAndStoreModules() { +export const fetchAndStoreModules = async () => { const octokit = new Octokit(); const repos = { apps: [], libs: [], other: [], platforms: [], plugins: [] }; const options = octokit.repos.listForOrg.endpoint.merge({ org: 'folio-org', type: 'public' }); @@ -64,40 +64,40 @@ async function fetchAndStoreModules() { }); saveModules(repos); -} +}; -const allModules = () => { +export const allModules = () => { return readModules(); }; -function stripesModules() { +export const stripesModules = () => { const mods = readModules(); return mods.libs; -} +}; // Add the @folio scope, omitting "ui-" prefix if necessary -function toFolioName(theModule) { +export const toFolioName = (theModule) => { const mods = allModules(); let moduleName = theModule; if (mods.apps.includes(theModule)) { moduleName = moduleName.replace(/^ui-/, ''); } return `@folio/${moduleName}`; -} +}; // Mapping of extra modules based on existence of other modules. -const backendDescriptorExtras = [ +export const backendDescriptorExtras = [ { match: ['folio_search', 'folio_inventory'], ids: ['mod-codex-inventory'] }, { match: ['folio_search', 'folio_eholdings'], ids: ['mod-codex-ekb'] } ]; -const templates = { +export const templates = { uiApp: 'https://github.com/folio-org/ui-app-template.git' }; -const allModulesAsFlatArray = () => { +export const allModulesAsFlatArray = () => { let ret = []; const repos = allModules(); @@ -108,13 +108,3 @@ const allModulesAsFlatArray = () => { return ret; }; -module.exports = { - stripesModules, - allModules, - allModulesAsFlatArray, - fetchAndStoreModules, - toFolioName, - moduleDescriptorExtras, - backendDescriptorExtras, - templates, -}; diff --git a/lib/okapi/auth-service.js b/lib/okapi/auth-service.js index 7eb51d08..2a63648e 100644 --- a/lib/okapi/auth-service.js +++ b/lib/okapi/auth-service.js @@ -1,8 +1,8 @@ -const tough = require('tough-cookie'); -const TokenStorage = require('./token-storage'); +import tough from 'tough-cookie'; +import TokenStorage from './token-storage.js'; // Logs into Okapi and persists token for subsequent use -module.exports = class AuthService { +export default class AuthService { accessCookie = 'folioAccessToken'; refreshCookie = 'folioRefreshToken'; @@ -82,4 +82,4 @@ module.exports = class AuthService { getToken() { return Promise.resolve(this.tokenStorage.getToken()); } -}; +} diff --git a/lib/okapi/descriptor-service.js b/lib/okapi/descriptor-service.js index 05db3aaf..523836a4 100644 --- a/lib/okapi/descriptor-service.js +++ b/lib/okapi/descriptor-service.js @@ -1,13 +1,13 @@ -const path = require('path'); -const { uniq } = require('lodash'); -const fs = require('fs'); +import path from 'path'; +import _ from 'lodash'; +import fs from 'fs'; -const StripesPlatform = require('../platform/stripes-platform'); -const StripesCore = require('../cli/stripes-core'); -const generateModuleDescriptor = require('../cli/generate-module-descriptor'); -const { moduleDescriptorExtras, backendDescriptorExtras, toFolioName } = require('../environment/inventory'); +import StripesPlatform from '../platform/stripes-platform.js'; +import StripesCore from '../cli/stripes-core.js'; +import generateModuleDescriptor from '../cli/generate-module-descriptor.js'; +import { moduleDescriptorExtras, backendDescriptorExtras, toFolioName } from '../environment/inventory.js'; -module.exports = class DescriptorService { +export default class DescriptorService { constructor(context, stripesConfig) { this.context = context; this.stripesConfig = stripesConfig; @@ -28,7 +28,7 @@ module.exports = class DescriptorService { const moduleNames = Object.getOwnPropertyNames(stripesConfig.modules); const extraModuleNames = moduleDescriptorExtras.map(mod => toFolioName(mod)); - uniq(moduleNames.concat(extraModuleNames)).forEach(moduleName => { + _.uniq(moduleNames.concat(extraModuleNames)).forEach(moduleName => { // The StripesModuleParser's constructor takes care of locating a module's package.json try { const moduleParser = new this.stripesCore.api.StripesModuleParser(moduleName, {}, this.context.cwd, this.platform.aliases); @@ -85,7 +85,7 @@ module.exports = class DescriptorService { }, []); // Remove duplicates - const idsToAdd = uniq(automaticallyAdded.concat(manuallyAdded || [])); + const idsToAdd = _.uniq(automaticallyAdded.concat(manuallyAdded || [])); return moduleDescriptorIds.concat(idsToAdd); } @@ -103,4 +103,4 @@ module.exports = class DescriptorService { fs.writeFileSync(`${outdir}/${filename}.json`, `${formattedJson}\n`, { encoding: 'utf8' }); }); } -}; +} diff --git a/lib/okapi/discovery-service.js b/lib/okapi/discovery-service.js index 3c2893d6..13cf3d59 100644 --- a/lib/okapi/discovery-service.js +++ b/lib/okapi/discovery-service.js @@ -1,8 +1,9 @@ -const path = require('path'); -const fs = require('fs'); -const { resolveIfOkapiSays } = require('./okapi-utils'); +import path from 'path'; +import fs from 'fs'; -module.exports = class DiscoveryService { +import { resolveIfOkapiSays } from './okapi-utils.js'; + +export default class DiscoveryService { constructor(okapiRepository, context) { this.okapi = okapiRepository; this.context = context; @@ -78,4 +79,4 @@ module.exports = class DiscoveryService { const descriptor = this.getDeploymentDescriptor(); return this.removeInstances(descriptor.srvcId); } -}; +} diff --git a/lib/okapi/endpoint-service.js b/lib/okapi/endpoint-service.js index fa3b54a7..6a566cc4 100644 --- a/lib/okapi/endpoint-service.js +++ b/lib/okapi/endpoint-service.js @@ -1,9 +1,9 @@ -const OkapiClient = require('./okapi-client'); +import OkapiClient from './okapi-client.js'; const parseJson = data => data.json(); const stringifyJson = data => JSON.stringify(data, null, ' '); -module.exports = class EndpointService { +export default class EndpointService { constructor(okapi, tenant) { this.client = new OkapiClient(okapi, tenant); } @@ -35,4 +35,4 @@ module.exports = class EndpointService { .then(() => true) .catch(() => false); } -}; +} diff --git a/lib/okapi/index.js b/lib/okapi/index.js index 21894ef2..97561e9b 100644 --- a/lib/okapi/index.js +++ b/lib/okapi/index.js @@ -1,3 +1,3 @@ -const OkapiRepository = require('./okapi-repository'); +import OkapiRepository from './okapi-repository.js'; -module.exports = OkapiRepository; +export default OkapiRepository; diff --git a/lib/okapi/module-service.js b/lib/okapi/module-service.js index ae067005..c2c78f98 100644 --- a/lib/okapi/module-service.js +++ b/lib/okapi/module-service.js @@ -1,9 +1,10 @@ -const { flatMap } = require('lodash'); -const { resolveIfOkapiSays } = require('./okapi-utils'); -const OkapiError = require('./okapi-error'); +import _ from 'lodash'; + +import { resolveIfOkapiSays } from './okapi-utils.js'; +import OkapiError from './okapi-error.js'; // Consider renaming to ProxyService -module.exports = class ModuleService { +export default class ModuleService { constructor(okapiRepository) { this.okapi = okapiRepository; } @@ -127,10 +128,10 @@ module.exports = class ModuleService { listModulePermissions(moduleDescriptorIds, expand = false) { return this.viewModuleDescriptors(moduleDescriptorIds) - .then(moduleDescriptors => flatMap(moduleDescriptors, descriptor => descriptor.permissionSets || [])) + .then(moduleDescriptors => _.flatMap(moduleDescriptors, descriptor => descriptor.permissionSets || [])) .then(permissions => { const allPermissionNames = permissions.map(perm => perm.permissionName); - const subPermissionNames = flatMap(permissions, perm => perm.subPermissions || []); + const subPermissionNames = _.flatMap(permissions, perm => perm.subPermissions || []); return allPermissionNames.filter(name => expand || !subPermissionNames.includes(name)); }); } @@ -255,4 +256,4 @@ module.exports = class ModuleService { .then(response => response.json()) .then(data => data.map(mod => mod.id)); } -}; +} diff --git a/lib/okapi/okapi-client-helper.js b/lib/okapi/okapi-client-helper.js index 4660532e..1a9efa1f 100644 --- a/lib/okapi/okapi-client-helper.js +++ b/lib/okapi/okapi-client-helper.js @@ -1,11 +1,10 @@ -const fetch = require('minipass-fetch'); -const OkapiError = require('./okapi-error'); - -const logger = require('../cli/logger')('okapi'); +import OkapiError from './okapi-error.js'; +import getLogger from '../cli/logger.js'; +const logger = getLogger('okapi'); // Ensures the operation return with a 2xx status code -function ensureOk(response) { +export function ensureOk(response) { logger.log(`<--- ${response.status} ${response.statusText}`); if (response.ok) { return response; @@ -15,23 +14,16 @@ function ensureOk(response) { }); } -function optionsHeaders(options) { +export function optionsHeaders(options) { return Object.entries(options.headers || {}).map(([k, v]) => `-H '${k}: ${v}'`).join(' '); } -function optionsBody(options) { +export function optionsBody(options) { return options.body ? `-d ${JSON.stringify(options.body)}` : ''; } // Wraps fetch to capture request/response for logging -function okapiFetch(resource, options) { +export function okapiFetch(resource, options) { logger.log(`---> curl -X${options.method} ${optionsHeaders(options)} ${resource} ${optionsBody(options)}`); return fetch(resource, options).then(ensureOk); } - -module.exports = { - ensureOk, - optionsHeaders, - optionsBody, - okapiFetch, -}; diff --git a/lib/okapi/okapi-client.js b/lib/okapi/okapi-client.js index 4f273dee..de0f6132 100644 --- a/lib/okapi/okapi-client.js +++ b/lib/okapi/okapi-client.js @@ -1,12 +1,13 @@ -const url = require('url'); +import url from 'url'; -const logger = require('../cli/logger')('okapi'); -const TokenStorage = require('./token-storage'); -const AuthService = require('./auth-service'); +import getLogger from '../cli/logger.js'; +import TokenStorage from './token-storage.js'; +import AuthService from './auth-service.js'; +import { okapiFetch } from './okapi-client-helper.js'; -const { okapiFetch } = require('./okapi-client-helper'); +const logger = getLogger('okapi'); -module.exports = class OkapiClient { +export default class OkapiClient { constructor(okapi, tenant) { this.tokenStorage = new TokenStorage(); this.okapiBase = url.parse(okapi); @@ -136,4 +137,4 @@ module.exports = class OkapiClient { return { ...options, headers }; }); } -}; +} diff --git a/lib/okapi/okapi-error.js b/lib/okapi/okapi-error.js index be74d6ed..c74cb489 100644 --- a/lib/okapi/okapi-error.js +++ b/lib/okapi/okapi-error.js @@ -1,4 +1,4 @@ -module.exports = class OkapiError extends Error { +export default class OkapiError extends Error { constructor(response, message, ...args) { super(message, ...args); this.name = this.constructor.name; @@ -7,4 +7,4 @@ module.exports = class OkapiError extends Error { this.statusText = response.statusText; Error.captureStackTrace(this, OkapiError); } -}; +} diff --git a/lib/okapi/okapi-repository.js b/lib/okapi/okapi-repository.js index 13d25790..303500c8 100644 --- a/lib/okapi/okapi-repository.js +++ b/lib/okapi/okapi-repository.js @@ -1,4 +1,4 @@ -const OkapiClient = require('./okapi-client'); +import OkapiClient from './okapi-client.js'; // Use this when x-okapi-tenant and x-okapi-token headers should not be provided const noTenantNoToken = { @@ -118,7 +118,7 @@ const okapiRoutes = { }, }; -module.exports = function OkapiRepository(okapi, tenant) { +export default function OkapiRepository(okapi, tenant) { okapiClient = new OkapiClient(okapi, tenant); return okapiRoutes; -}; +} diff --git a/lib/okapi/okapi-utils.js b/lib/okapi/okapi-utils.js index 0db2d0bc..0bb8f391 100644 --- a/lib/okapi/okapi-utils.js +++ b/lib/okapi/okapi-utils.js @@ -1,7 +1,7 @@ -const OkapiError = require('./okapi-error'); +import OkapiError from './okapi-error.js'; // Helper for services to easily resolve acceptable Okapi responses -module.exports.resolveIfOkapiSays = function resolveIfOkapiSays(acceptableText, responseObj) { +export const resolveIfOkapiSays = function resolveIfOkapiSays(acceptableText, responseObj) { return (error) => { if (error instanceof OkapiError && error.message.includes(acceptableText)) { return Promise.resolve(responseObj || error); diff --git a/lib/okapi/permission-service.js b/lib/okapi/permission-service.js index 54a8e3d2..caeaed65 100644 --- a/lib/okapi/permission-service.js +++ b/lib/okapi/permission-service.js @@ -1,8 +1,9 @@ -const fs = require('fs'); -const { resolveIfOkapiSays } = require('./okapi-utils'); -const ModuleService = require('./module-service'); +import fs from 'fs'; -module.exports = class PermissionService { +import { resolveIfOkapiSays } from './okapi-utils.js'; +import ModuleService from './module-service.js'; + +export default class PermissionService { constructor(okapiRepository, context) { this.okapi = okapiRepository; this.context = context; @@ -121,4 +122,4 @@ module.exports = class PermissionService { return assignmentResponses.filter(response => !response.alreadyExists).map(response => response.id); } -}; +} diff --git a/lib/okapi/token-storage.js b/lib/okapi/token-storage.js index 9ac38f03..f073fabe 100644 --- a/lib/okapi/token-storage.js +++ b/lib/okapi/token-storage.js @@ -1,4 +1,4 @@ -const Configstore = require('configstore'); +import Configstore from 'configstore'; const storageKey = '@folio/stripes-cli'; @@ -8,7 +8,7 @@ const storageDefault = { }, }; -module.exports = class TokenStorage { +export default class TokenStorage { constructor() { this.config = new Configstore(storageKey, storageDefault); this.tokenKey = 'okapi.token'; @@ -51,4 +51,4 @@ module.exports = class TokenStorage { clearRefreshCookie() { this.config.set(this.refreshCookieKey, ''); } -}; +} diff --git a/lib/platform/alias-error.js b/lib/platform/alias-error.js index 478976e4..7beda8e4 100644 --- a/lib/platform/alias-error.js +++ b/lib/platform/alias-error.js @@ -1,7 +1,7 @@ -module.exports = class AliasError extends Error { +export default class AliasError extends Error { constructor(...args) { super(...args); this.name = this.constructor.name; Error.captureStackTrace(this, AliasError); } -}; +} diff --git a/lib/platform/alias-service.js b/lib/platform/alias-service.js index 901ce7ae..9c93354d 100644 --- a/lib/platform/alias-service.js +++ b/lib/platform/alias-service.js @@ -1,16 +1,21 @@ -const path = require('path'); -const fs = require('fs'); -const PlatformStorage = require('./platform-storage'); -const cliConfig = require('../cli/config'); -const AliasError = require('./alias-error'); -const logger = require('../cli/logger')(); +import path from 'path'; +import fs from 'fs'; +import { createRequire } from 'module'; +import PlatformStorage from './platform-storage.js'; +import cliConfig from '../cli/config.js'; +import AliasError from './alias-error.js'; +import getLogger from '../cli/logger.js'; + +const logger = getLogger(); const cwd = path.resolve(); // Manages parsing and validation logic for aliases -module.exports = class AliasService { +export default class AliasService { constructor(platformStorage) { + //@@ require // Cheap way to mock require later on + const require = createRequire(import.meta.url); this.require = require; // Aliases stored with "alias add" command this.storage = platformStorage || new PlatformStorage(); @@ -118,4 +123,4 @@ module.exports = class AliasService { hasNodeModules, }; } -}; +} diff --git a/lib/platform/platform-storage.js b/lib/platform/platform-storage.js index f4338ea5..e8244b46 100644 --- a/lib/platform/platform-storage.js +++ b/lib/platform/platform-storage.js @@ -1,4 +1,4 @@ -const Configstore = require('configstore'); +import Configstore from 'configstore'; // TODO: May want to modify storage key if running CLI locally const storageKey = '@folio/stripes-cli'; @@ -14,7 +14,7 @@ const platformDefault = { // Creates and persists a virtual platform for use by the CLI // Currently this maintains aliases for mapping a virtual platform during build // TODO: This could also manage stripes.config.js properties like okapi, config, and modules -module.exports = class PlatformStorage { +export default class PlatformStorage { constructor(stripesConfig, platformName) { this.platformKey = platformName || 'default'; this.config = new Configstore(storageKey, storageDefault); @@ -61,4 +61,4 @@ module.exports = class PlatformStorage { getStoragePath() { return this.config.path; } -}; +} diff --git a/lib/platform/stripes-platform.js b/lib/platform/stripes-platform.js index ab933634..155dad13 100644 --- a/lib/platform/stripes-platform.js +++ b/lib/platform/stripes-platform.js @@ -1,10 +1,13 @@ -const path = require('path'); -const { defaultConfig, emptyConfig, mergeConfig } = require('./tenant-config'); -const AliasService = require('./alias-service'); -const webpackCommon = require('../webpack-common'); -const logger = require('../cli/logger')(); +import path from 'path'; -module.exports = class StripesPlatform { +import { defaultConfig, emptyConfig, mergeConfig } from './tenant-config.js'; +import AliasService from './alias-service.js'; +import webpackCommon from '../webpack-common.js'; +import getLogger from '../cli/logger.js'; + +const logger = getLogger(); + +export default class StripesPlatform { constructor(stripesConfig, context, options) { this.aliasService = new AliasService(); this.isAppContext = context.isUiModule; @@ -98,4 +101,4 @@ module.exports = class StripesPlatform { logger.log('using stripes tenant config:', config); return config; } -}; +} diff --git a/lib/platform/tenant-config.js b/lib/platform/tenant-config.js index 3901c7b2..4ef21d42 100644 --- a/lib/platform/tenant-config.js +++ b/lib/platform/tenant-config.js @@ -1,6 +1,6 @@ -const { merge } = require('lodash'); +import _ from 'lodash'; -const defaultConfig = { +export const defaultConfig = { okapi: { url: 'http://localhost:9130', tenant: 'diku', @@ -23,7 +23,7 @@ const defaultConfig = { }, }; -const emptyConfig = { +export const emptyConfig = { okapi: {}, config: {}, modules: {}, @@ -31,12 +31,6 @@ const emptyConfig = { }; // Merge two stripes configurations -function mergeConfig(base, extend) { - return merge({}, base, extend); +export function mergeConfig(base, extend) { + return _.merge({}, base, extend); } - -module.exports = { - defaultConfig, - emptyConfig, - mergeConfig, -}; diff --git a/lib/run-process.js b/lib/run-process.js index 0c292911..13f01868 100644 --- a/lib/run-process.js +++ b/lib/run-process.js @@ -1,9 +1,9 @@ -const childProcess = require('child_process'); -const path = require('path'); -const logger = require('./cli/logger')(); +import childProcess from 'child_process'; +import path from 'path'; +import logger from './cli/logger.js'; // Wraps a child process in a promise -module.exports = function runProcess(script, args, options) { +export default function runProcess(script, args, options) { const defaults = { cwd: path.resolve(), stdio: 'inherit', @@ -29,4 +29,4 @@ module.exports = function runProcess(script, args, options) { reject(error); }); }); -}; +} diff --git a/lib/run-proxy.js b/lib/run-proxy.js index 5b80abb9..2bafbfcd 100644 --- a/lib/run-proxy.js +++ b/lib/run-proxy.js @@ -1,32 +1,32 @@ -const express = require('express'); -const { createProxyMiddleware } = require('http-proxy-middleware'); - -const app = express(); - -// [argv.okapi, argv.port, argv.proxyHost, argv.proxyPort]); -const OKAPI = process.argv[2]; -const PORT = process.argv[3]; -const PROXY_HOST = process.argv[4]; -const PROXY_PORT = process.argv[5]; - -app.use( - '/', - createProxyMiddleware({ - target: OKAPI, - changeOrigin: true, - on: { - proxyRes: (proxyRes) => { - // STCOM-247: overwrite any CORS headers in responses with those of - // the proxy, thus allowing access from any browser pointed at the proxy. - proxyRes.headers['Access-Control-Allow-Origin'] = `${PROXY_HOST}:${PORT}`; - proxyRes.headers['Access-Control-Allow-Credentials'] = 'true'; - - // STCOM-248: omit STS headers in responses, thus allowing non-ssl access, - // e.g. access via http://localhost:3000 - delete proxyRes.headers['Strict-Transport-Security']; - }, - }, - }), -); - -app.listen(PROXY_PORT); +import express from 'express'; +import { createProxyMiddleware } from 'http-proxy-middleware'; + +const app = express(); + +// [argv.okapi, argv.port, argv.proxyHost, argv.proxyPort]); +const OKAPI = process.argv[2]; +const PORT = process.argv[3]; +const PROXY_HOST = process.argv[4]; +const PROXY_PORT = process.argv[5]; + +app.use( + '/', + createProxyMiddleware({ + target: OKAPI, + changeOrigin: true, + on: { + proxyRes: (proxyRes) => { + // STCOM-247: overwrite any CORS headers in responses with those of + // the proxy, thus allowing access from any browser pointed at the proxy. + proxyRes.headers['Access-Control-Allow-Origin'] = `${PROXY_HOST}:${PORT}`; + proxyRes.headers['Access-Control-Allow-Credentials'] = 'true'; + + // STCOM-248: omit STS headers in responses, thus allowing non-ssl access, + // e.g. access via http://localhost:3000 + delete proxyRes.headers['Strict-Transport-Security']; + }, + }, + }), +); + +app.listen(PROXY_PORT); diff --git a/lib/server.js b/lib/server.js index f6cb6a05..6739c29b 100644 --- a/lib/server.js +++ b/lib/server.js @@ -1,9 +1,9 @@ -const path = require('path'); -const fs = require('fs'); -const http = require('http'); -const express = require('express'); -const logger = require('morgan'); -const debug = require('debug'); +import path from 'path'; +import fs from 'fs'; +import http from 'http'; +import express from 'express'; +import logger from 'morgan'; +import debug from 'debug'; // // this is cribbed from files generated by express-generator for a new app, @@ -46,7 +46,7 @@ function onListening(server) { } -function start(dir, options) { +export function start(dir, options) { const app = express(); app.use(express.static(dir, {})); app.use(logger('tiny')); @@ -67,7 +67,3 @@ function start(dir, options) { server.on('error', (error) => onError(options, error)); server.on('listening', () => onListening(server)); } - -module.exports = { - start, -}; diff --git a/lib/stripes-cli.js b/lib/stripes-cli.js index 8623ebe3..f1b03e44 100755 --- a/lib/stripes-cli.js +++ b/lib/stripes-cli.js @@ -1,35 +1,40 @@ #!/usr/bin/env node -const yargs = require('yargs/yargs'); -const { hideBin } = require('yargs/helpers'); -const isInstalledGlobally = require('is-installed-globally'); -const packageJson = require('../package'); -const AliasError = require('./platform/alias-error'); -const { yargsConfig, commandDirOptions } = require('./cli/config'); -const logger = require('./cli/logger')(); +import path from 'path'; +import yargs from 'yargs'; +import { hideBin } from 'yargs/helpers'; +import isInstalledGlobally from 'is-installed-globally'; +import updateNotifier from 'update-notifier'; + +import fs from 'fs-extra'; + +import AliasError from './platform/alias-error.js'; +import cliConfig from './cli/config.js'; +import getLogger from './cli/logger.js'; +import { commands } from './commands/index.js'; + +const { yargsConfig, commandDirOptions } = cliConfig; + +const pkgPath = path.join(import.meta.dirname, '..', 'package.json'); +const packageJson = fs.readJsonSync(pkgPath, { throws: false }); +const logger = getLogger(); process.title = 'stripes-cli'; logger.log('stripes-cli', packageJson.version); -// update-notifier is pure ESM so needs to be loaded via dynamic import -// until we refactor from CJS to ESM. Until then, say hello to our old -// friend, the IIFE. -(async () => { - // Update notifier runs async in a child process - const updateNotifier = await import('update-notifier'); - updateNotifier.default({ - pkg: packageJson, - updateCheckInterval: 1000 * 60 * 60 * 24 * 7, - }).notify({ - isGlobal: isInstalledGlobally, - // TODO: Consider reverting to default message once update-notifier detects global yarn installs - message: 'Update available - Refer to README.md:\nhttps://github.com/folio-org/stripes-cli', - }); -})(); +// Update notifier runs async in a child process +updateNotifier({ + pkg: packageJson, + updateCheckInterval: 1000 * 60 * 60 * 24 * 7, +}).notify({ + isGlobal: isInstalledGlobally, + // TODO: Consider reverting to default message once update-notifier detects global yarn installs + message: 'Update available - Refer to README.md:\nhttps://github.com/folio-org/stripes-cli', +}); try { yargs(hideBin(process.argv)) - .commandDir('./commands', commandDirOptions) // NOSONAR + .command(commands) .config(yargsConfig) .option('interactive', { describe: 'Enable interactive input (use --no-interactive to disable)', diff --git a/lib/test/karma-service.js b/lib/test/karma-service.js index b0b5e31a..31c347e4 100644 --- a/lib/test/karma-service.js +++ b/lib/test/karma-service.js @@ -1,10 +1,13 @@ -const fs = require('fs'); -const path = require('path'); -const os = require('os'); -const _pickBy = require('lodash/pickBy'); -const { Server, config } = require('karma'); -const logger = require('../cli/logger')('karma'); +import fs from 'fs'; +import path from 'path'; +import os from 'os'; +import _ from 'lodash'; +import karma from 'karma'; +import getLogger from '../cli/logger.js'; +const { Server, config } = { karma }; + +const logger = getLogger('karma'); function getTestIndex(cwd, dirs) { let file = path.join(cwd, dirs[0], 'index.js'); let i = 0; @@ -16,7 +19,7 @@ function getTestIndex(cwd, dirs) { return file; } -module.exports = class KarmaService { +export default class KarmaService { constructor(cwd) { this.cwd = cwd; } @@ -49,7 +52,7 @@ module.exports = class KarmaService { webpackTestConfig.watch = !!karmaOptions?.watch; webpackTestConfig.cache = !!karmaOptions?.cache; // only apply 'false' options as overrides to what karma-webpack wants to set. - webpackTestConfig = _pickBy(webpackTestConfig, (opt) => !opt); + webpackTestConfig = _.pickBy(webpackTestConfig, (opt) => !opt); let karmaConfig = { frameworks: ['mocha', 'webpack'], @@ -170,10 +173,10 @@ module.exports = class KarmaService { // Runs the specified integration tests runKarmaTests(webpackConfig, karmaOptions) { const karmaConfig = this.generateKarmaConfig(webpackConfig, karmaOptions); - const karma = new Server(karmaConfig, (exitCode) => { + const karmaServer = new Server(karmaConfig, (exitCode) => { console.log(`Karma exited with ${exitCode}`); process.exit(exitCode); }); - karma.start(); + karmaServer.start(); } -}; +} diff --git a/lib/test/setup-bigtest.js b/lib/test/setup-bigtest.js index 88078cba..b5179f69 100644 --- a/lib/test/setup-bigtest.js +++ b/lib/test/setup-bigtest.js @@ -1,8 +1,9 @@ -const copy = require('kopy'); -const path = require('path'); -const fs = require('fs-extra'); -const simpleGit = require('simple-git'); -const { templates } = require('../environment/inventory'); +import copy from 'kopy'; +import path from 'path'; +import fs from 'fs-extra'; +import simpleGit from 'simple-git'; + +import { templates } from '../environment/inventory.js'; const tempDir = '_bigtest_temp'; const bigTestDir = 'test/bigtest'; @@ -35,7 +36,7 @@ async function setupBigTest() { }); } -module.exports = { +export default { packages, setupBigTest }; diff --git a/lib/test/webpack-config.js b/lib/test/webpack-config.js index c3aade16..667099f8 100644 --- a/lib/test/webpack-config.js +++ b/lib/test/webpack-config.js @@ -1,10 +1,10 @@ -const path = require('path'); +import path from 'path'; -const { enableCoverage } = require('../webpack-common'); +import webpackCommon from '../webpack-common.js'; // TODO: Move this to stripes-core and expose as part of the Stripes Node API // Generates a webpack config for Stripes independent of build or serve -module.exports = function getStripesWebpackConfig(stripeCore, stripesConfig, options, context) { +export default function getStripesWebpackConfig(stripeCore, stripesConfig, options, context) { const StripesWebpackPlugin = stripeCore.getCoreModule('webpack/stripes-webpack-plugin'); const applyWebpackOverrides = stripeCore.getCoreModule('webpack/apply-webpack-overrides'); @@ -32,7 +32,7 @@ module.exports = function getStripesWebpackConfig(stripeCore, stripesConfig, opt // Inject babel-plugin-istanbul when coverage is enabled if (options.coverage) { - enableCoverage(config); + webpackCommon.enableCoverage(config); } // Remove HMR plugin during testing @@ -53,4 +53,4 @@ module.exports = function getStripesWebpackConfig(stripeCore, stripesConfig, opt config = applyWebpackOverrides(options.webpackOverrides, config); return config; -}; +} diff --git a/lib/webpack-common.js b/lib/webpack-common.js index 95c80ab0..698b1bb9 100644 --- a/lib/webpack-common.js +++ b/lib/webpack-common.js @@ -1,8 +1,11 @@ -const fs = require('fs'); -const path = require('path'); -const { set } = require('lodash'); -const webpack = require('webpack'); -const logger = require('./cli/logger')('webpack'); +import fs from 'fs'; +import path from 'path'; +import _ from 'lodash'; +import webpack from 'webpack'; + +import getLogger from './cli/logger.js'; + +const logger = getLogger('webpack'); // Display error to the console and exit function processError(err) { @@ -32,8 +35,8 @@ function cliResolve(context) { config.resolve.modules.push(context.globalDirs.yarn.packages); config.resolveLoader.modules.push(context.globalDirs.yarn.packages); } else { - config.resolve.modules.push(path.resolve(__dirname, path.join('..', 'node_modules'))); - config.resolveLoader.modules.push(path.resolve(__dirname, path.join('..', 'node_modules'))); + config.resolve.modules.push(path.resolve(import.meta.dirname, path.join('..', 'node_modules'))); + config.resolveLoader.modules.push(path.resolve(import.meta.dirname, path.join('..', 'node_modules'))); } logger.log('entry:', config.entry); logger.log('resolve.modules:', config.resolve.modules); @@ -114,7 +117,7 @@ function enableCoverage(config) { }); if (!config.module.rules[babelLoaderConfigIndex]?.oneOf?.[1].use[0].options?.plugins) { - set(config.module.rules[babelLoaderConfigIndex], 'oneOf[1].use[0].options.plugins', []); + _.set(config.module.rules[babelLoaderConfigIndex], 'oneOf[1].use[0].options.plugins', []); } // only use babel configuration for test coverage.. @@ -136,7 +139,7 @@ function enableCoverage(config) { babelConfigurationItem.include = shouldModuleBeIncluded; // replace the esbuild tooling with babel-loader - set(config.module, `rules[${babelLoaderConfigIndex}]`, babelConfigurationItem); + _.set(config.module, `rules[${babelLoaderConfigIndex}]`, babelConfigurationItem); return config; } @@ -161,7 +164,7 @@ function ignoreCache(config) { return { ...config, cache: false }; } -module.exports = { +export default { processError, processStats, cliResolve, diff --git a/lib/yarn.js b/lib/yarn.js index cf09a320..c1273923 100644 --- a/lib/yarn.js +++ b/lib/yarn.js @@ -1,4 +1,4 @@ -const childProcess = require('child_process'); +import childProcess from 'child_process'; function runYarn(options) { return new Promise((resolve, reject) => { @@ -63,7 +63,7 @@ function add(projectDir, packageName, isDev) { }); } -module.exports = { +export default { add, install, }; diff --git a/package.json b/package.json index 023b8a8c..f24472f4 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "node": ">=20.0.0" }, "main": "index.js", + "type": "module", "bin": { "stripes": "./lib/stripes-cli.js" }, @@ -56,7 +57,6 @@ "karma-webpack": "^5.0.0", "kopy": "^9.4.2", "lodash": "^4.17.5", - "minipass-fetch": "^3.0.4", "mocha": "^10.2.0", "mocha-jenkins-reporter": "^0.4.1", "morgan": "^1.10.0", diff --git a/test/cli/context-middleware.spec.js b/test/cli/context-middleware.spec.js index 5d0e3ddc..c9578edf 100644 --- a/test/cli/context-middleware.spec.js +++ b/test/cli/context-middleware.spec.js @@ -1,7 +1,9 @@ -const expect = require('chai').expect; -const context = require('../../lib/cli/context'); -const contextMiddleware = require('../../lib/cli/context-middleware'); +import { expect } from 'chai'; +import context from '../../lib/cli/context.js'; +import { contextMiddleware, applyContext } from '../../lib/cli/context-middleware.js'; + +const cmw = { contextMiddleware, applyContext }; const contextStub = { moduleName: 'myModule', isUiModule: true, @@ -10,7 +12,7 @@ const contextStub = { describe('The context-middleware module', function () { beforeEach(function () { - this.sut = contextMiddleware; + this.sut = cmw; this.sandbox.stub(context, 'getContext').returns(contextStub); this.argvIn = { tenant: 'diku', diff --git a/test/cli/context.spec.js b/test/cli/context.spec.js index f06c7689..1523a173 100644 --- a/test/cli/context.spec.js +++ b/test/cli/context.spec.js @@ -1,8 +1,8 @@ -const expect = require('chai').expect; -const fs = require('fs'); -const path = require('path'); -require('fast-xml-parser'); // included here to resolve a lazy-load issue of this module within tests -const context = require('../../lib/cli/context'); +import { expect } from 'chai'; +import fs from 'fs'; +import path from 'path'; +import 'fast-xml-parser'; // included here to resolve a lazy-load issue of this module within tests +import context from '../../lib/cli/context.js'; const createModuleWithType = (type) => ({ name: type === 'components' ? '@folio/stripes-components' : '@folio/ui-app', @@ -158,7 +158,7 @@ describe('The CLI\'s getContext', function () { this.sandbox.stub(context, 'require').returns({ name: '@folio/stripes-cli', }); - const result = this.sut(path.resolve(__dirname, '../..')); + const result = this.sut(path.resolve(import.meta.dirname, '../..')); expect(result).to.include({ type: 'cli', diff --git a/test/cli/prompt-middleware.spec.js b/test/cli/prompt-middleware.spec.js index e2a21318..b7cd0fde 100644 --- a/test/cli/prompt-middleware.spec.js +++ b/test/cli/prompt-middleware.spec.js @@ -1,6 +1,6 @@ -const expect = require('chai').expect; -const inquirer = require('inquirer'); -const questionModule = require('../../lib/cli/prompt-middleware'); +import { expect } from 'chai'; +import inquirer from 'inquirer'; +import questionModule from '../../lib/cli/prompt-middleware.js'; describe('The prompt-middleware module', function () { beforeEach(function () { diff --git a/test/cli/stdin-middleware.spec.js b/test/cli/stdin-middleware.spec.js index 15347e12..2dfae74e 100644 --- a/test/cli/stdin-middleware.spec.js +++ b/test/cli/stdin-middleware.spec.js @@ -1,6 +1,6 @@ -const expect = require('chai').expect; -const stdin = require('../../lib/cli/stdin'); -const stdinMiddleware = require('../../lib/cli/stdin-middleware'); +import { expect } from 'chai'; +import stdin from '../../lib/cli/stdin.js'; +import stdinMiddleware from '../../lib/cli/stdin-middleware.js'; describe('The stdin-middleware module', function () { beforeEach(function () { diff --git a/test/cli/stripes-config-middleware.spec.js b/test/cli/stripes-config-middleware.spec.js index de817a3e..abbd19d3 100644 --- a/test/cli/stripes-config-middleware.spec.js +++ b/test/cli/stripes-config-middleware.spec.js @@ -1,9 +1,9 @@ -const expect = require('chai').expect; -const path = require('path'); -const stdin = require('../../lib/cli/stdin'); -const { stripesConfigMiddleware } = require('../../lib/cli/stripes-config-middleware'); -const StripesCliError = require('../../lib/cli/stripes-cli-error'); -const stripesConfigTestFile = require('./stripes-test.config'); +import { expect } from 'chai'; +import path from 'path'; +import stdin from '../../lib/cli/stdin.js'; +import { stripesConfigMiddleware } from '../../lib/cli/stripes-config-middleware.js'; +import StripesCliError from '../../lib/cli/stripes-cli-error.js'; +import stripesConfigTestFile from './stripes-test.config.js'; const stripesConfigStub = { okapi: { @@ -19,7 +19,7 @@ const stripesConfigStub = { }, }; -const testConfigFile = path.resolve(__dirname, 'stripes-test.config.js'); +const testConfigFile = path.resolve(import.meta.dirname, 'stripes-test.config.js'); describe('The stripes-config-middleware module', function () { describe('stripesConfigMiddleware', function () { @@ -42,7 +42,7 @@ describe('The stripes-config-middleware module', function () { it('rejects when no file is found', function (done) { const argvIn = { - configFile: path.resolve(__dirname, 'not-a-file.js'), + configFile: path.resolve(import.meta.dirname, 'not-a-file.js'), }; this.sut(argvIn) .catch((err) => { diff --git a/test/cli/stripes-test.config.js b/test/cli/stripes-test.config.js index b96231f1..7db0d10c 100644 --- a/test/cli/stripes-test.config.js +++ b/test/cli/stripes-test.config.js @@ -1,4 +1,4 @@ -module.exports = { +export default { okapi: { url: 'http://localhost:9130', tenant: 'diku', diff --git a/test/commands/app/create.spec.js b/test/commands/app/create.spec.js index f1b6d189..5f904351 100644 --- a/test/commands/app/create.spec.js +++ b/test/commands/app/create.spec.js @@ -1,12 +1,12 @@ -const expect = require('chai').expect; +import { expect } from 'chai'; -const context = require('../../../lib/cli/context'); -const yarn = require('../../../lib/yarn'); -const createApp = require('../../../lib/create-app'); -const appCreateCommand = require('../../../lib/commands/app/create'); -const addModCommand = require('../../../lib/commands/mod/add'); -const enableModCommand = require('../../../lib/commands/mod/enable'); -const assignPermissionCommand = require('../../../lib/commands/perm/assign'); +import context from '../../../lib/cli/context.js'; +import yarn from '../../../lib/yarn.js'; +import createApp from '../../../lib/create-app.js'; +import appCreateCommand from '../../../lib/commands/app/create.js'; +import addModCommand from '../../../lib/commands/mod/add.js'; +import enableModCommand from '../../../lib/commands/mod/enable.js'; +import assignPermissionCommand from '../../../lib/commands/perm/assign.js'; const yarnStub = () => Promise.resolve({ diff --git a/test/commands/build.spec.js b/test/commands/build.spec.js index 406f42f0..e032581f 100644 --- a/test/commands/build.spec.js +++ b/test/commands/build.spec.js @@ -1,7 +1,6 @@ -const expect = require('chai').expect; -const buildAppCommand = require('../../lib/commands/build'); - -const { ignoreCache } = require('../../lib/webpack-common'); +import { expect } from 'chai'; +import buildAppCommand from '../../lib/commands/build.js'; +import webpackCommon from '../../lib/webpack-common.js'; const packageJsonStub = {}; const tenantConfig = {}; @@ -65,7 +64,7 @@ describe('The app create command', function () { }); it('turns off webpack caching when --output flag is used.', function () { - const expectedArgs = Object.assign({}, this.argv, { cache: false, outputPath: './output', webpackOverrides: [ignoreCache] }); + const expectedArgs = Object.assign({}, this.argv, { cache: false, outputPath: './output', webpackOverrides: [webpackCommon.ignoreCache] }); this.sut.stripesOverrides(platformStub, stripesCoreStub); this.sut.handler(Object.assign({}, this.argv, { cache: false })); diff --git a/test/commands/create-app.spec.js b/test/commands/create-app.spec.js index c48efe0c..462c911e 100644 --- a/test/commands/create-app.spec.js +++ b/test/commands/create-app.spec.js @@ -1,9 +1,8 @@ -const expect = require('chai').expect; -const path = require('path'); -const fs = require('fs-extra'); - -const { templates } = require('../../lib/environment/inventory'); -const createApp = require('../../lib/create-app'); +import { expect } from 'chai'; +import path from 'path'; +import fs from 'fs-extra'; +import { templates } from '../../lib/environment/inventory.js'; +import createApp from '../../lib/create-app.js'; describe('The app create command', function () { beforeEach(function () { diff --git a/test/commands/okapi/login.spec.js b/test/commands/okapi/login.spec.js index a338eacd..ca25a12a 100644 --- a/test/commands/okapi/login.spec.js +++ b/test/commands/okapi/login.spec.js @@ -1,7 +1,7 @@ -const expect = require('chai').expect; +import { expect } from 'chai'; -const AuthService = require('../../../lib/okapi/auth-service'); -const loginCommand = require('../../../lib/commands/okapi/login'); +import AuthService from '../../../lib/okapi/auth-service.js'; +import loginCommand from '../../../lib/commands/okapi/login.js'; const authServiceStub = { login: (username, password) => { diff --git a/test/commands/okapi/logout.spec.js b/test/commands/okapi/logout.spec.js index 290d566c..3ed7f09f 100644 --- a/test/commands/okapi/logout.spec.js +++ b/test/commands/okapi/logout.spec.js @@ -1,7 +1,7 @@ -const expect = require('chai').expect; +import { expect } from 'chai'; -const AuthService = require('../../../lib/okapi/auth-service'); -const logoutCommand = require('../../../lib/commands/okapi/logout'); +import AuthService from '../../../lib/okapi/auth-service.js'; +import logoutCommand from '../../../lib/commands/okapi/logout.js'; const authServiceStub = { logout: () => Promise.resolve(), diff --git a/test/okapi/auth-service.spec.js b/test/okapi/auth-service.spec.js index 6ba6eff7..0a6af276 100644 --- a/test/okapi/auth-service.spec.js +++ b/test/okapi/auth-service.spec.js @@ -1,6 +1,6 @@ -const expect = require('chai').expect; +import { expect } from 'chai'; -const AuthService = require('../../lib/okapi/auth-service'); +import AuthService from '../../lib/okapi/auth-service.js'; const authnStub = { login: (username, password) => { diff --git a/test/okapi/descriptor-service.spec.js b/test/okapi/descriptor-service.spec.js index 5f6780a3..b4c4ba23 100644 --- a/test/okapi/descriptor-service.spec.js +++ b/test/okapi/descriptor-service.spec.js @@ -1,7 +1,6 @@ -const expect = require('chai').expect; -const fs = require('fs'); - -const DescriptorService = require('../../lib/okapi/descriptor-service'); +import { expect } from 'chai'; +import fs from 'fs'; +import DescriptorService from '../../lib/okapi/descriptor-service.js'; const platformContext = { isPlatform: true, diff --git a/test/okapi/discovery-service.spec.js b/test/okapi/discovery-service.spec.js index d4f149da..de59b73b 100644 --- a/test/okapi/discovery-service.spec.js +++ b/test/okapi/discovery-service.spec.js @@ -1,8 +1,7 @@ -const expect = require('chai').expect; -const fs = require('fs'); - -const DiscoveryService = require('../../lib/okapi/discovery-service'); -const OkapiError = require('../../lib/okapi/okapi-error'); +import { expect } from 'chai'; +import fs from 'fs'; +import DiscoveryService from '../../lib/okapi/discovery-service.js'; +import OkapiError from '../../lib/okapi/okapi-error.js'; const okapiResolve = (data) => Promise.resolve({ json: () => data }); const okapiReject = (message) => Promise.reject(new OkapiError({}, message)); diff --git a/test/okapi/module-service.spec.js b/test/okapi/module-service.spec.js index ae3f3530..96e098c1 100644 --- a/test/okapi/module-service.spec.js +++ b/test/okapi/module-service.spec.js @@ -1,8 +1,8 @@ -const expect = require('chai').expect; -const sinon = require('sinon'); +import { expect } from 'chai'; +import sinon from 'sinon'; -const ModuleService = require('../../lib/okapi/module-service'); -const OkapiError = require('../../lib/okapi/okapi-error'); +import ModuleService from '../../lib/okapi/module-service.js'; +import OkapiError from '../../lib/okapi/okapi-error.js'; const okapiResolve = (data) => Promise.resolve({ json: () => data }); const okapiReject = (message) => Promise.reject(new OkapiError({}, message)); diff --git a/test/okapi/okapi-client-helper.spec.js b/test/okapi/okapi-client-helper.spec.js index bbc1f9ce..5d661e66 100644 --- a/test/okapi/okapi-client-helper.spec.js +++ b/test/okapi/okapi-client-helper.spec.js @@ -1,12 +1,9 @@ -const expect = require('chai').expect; -const OkapiClient = require('../../lib/okapi/okapi-client'); -const OkapiError = require('../../lib/okapi/okapi-error'); -const TokenStorage = require('../../lib/okapi/token-storage'); -const { - ensureOk, - optionsHeaders, - optionsBody, -} = require('../../lib/okapi/okapi-client-helper'); +import { expect } from 'chai'; + +import OkapiClient from '../../lib/okapi/okapi-client.js'; +import OkapiError from '../../lib/okapi/okapi-error.js'; +import TokenStorage from '../../lib/okapi/token-storage.js'; +import { ensureOk, optionsHeaders, optionsBody } from '../../lib/okapi/okapi-client-helper.js'; // const OkapiError = require('./okapi-error'); diff --git a/test/okapi/okapi-client.spec.js b/test/okapi/okapi-client.spec.js index a9860056..6d63e52f 100644 --- a/test/okapi/okapi-client.spec.js +++ b/test/okapi/okapi-client.spec.js @@ -1,6 +1,7 @@ -const expect = require('chai').expect; -const OkapiClient = require('../../lib/okapi/okapi-client'); -const TokenStorage = require('../../lib/okapi/token-storage'); +import { expect } from 'chai'; + +import OkapiClient from '../../lib/okapi/okapi-client.js'; +import TokenStorage from '../../lib/okapi/token-storage.js'; describe('The okapi-client', function () { diff --git a/test/okapi/permission-service.spec.js b/test/okapi/permission-service.spec.js index 84e381dd..4421ac6a 100644 --- a/test/okapi/permission-service.spec.js +++ b/test/okapi/permission-service.spec.js @@ -1,8 +1,8 @@ -const expect = require('chai').expect; -const fs = require('fs'); +import { expect } from 'chai'; +import fs from 'fs'; -const PermissionService = require('../../lib/okapi/permission-service'); -const OkapiError = require('../../lib/okapi/okapi-error'); +import PermissionService from '../../lib/okapi/permission-service.js'; +import OkapiError from '../../lib/okapi/okapi-error.js'; const jsonResponseStub = (data) => { return Promise.resolve({ diff --git a/test/okapi/token-storage.spec.js b/test/okapi/token-storage.spec.js index 44a74001..af78d69c 100644 --- a/test/okapi/token-storage.spec.js +++ b/test/okapi/token-storage.spec.js @@ -1,7 +1,7 @@ -const expect = require('chai').expect; -const Configstore = require('configstore'); +import { expect } from 'chai'; +import Configstore from 'configstore'; -const TokenStorage = require('../../lib/okapi/token-storage'); +import TokenStorage from '../../lib/okapi/token-storage.js'; describe('token-storage', function () { beforeEach(function () { diff --git a/test/platform/alias-service.spec.js b/test/platform/alias-service.spec.js index 9b5facb3..0bd18c7e 100644 --- a/test/platform/alias-service.spec.js +++ b/test/platform/alias-service.spec.js @@ -1,9 +1,10 @@ -const expect = require('chai').expect; -const match = require('sinon').match; -const path = require('path'); -const cliConfig = require('../../lib/cli/config'); -const AliasService = require('../../lib/platform/alias-service'); -const AliasError = require('../../lib/platform/alias-error'); +import { expect } from 'chai'; +import { match } from 'sinon'; +import path from 'path'; + +import cliConfig from '../../lib/cli/config.js'; +import AliasService from '../../lib/platform/alias-service.js'; +import AliasError from '../../lib/platform/alias-error.js'; const storageStub = { getAllAliases: () => {}, diff --git a/test/platform/stripes-platform.spec.js b/test/platform/stripes-platform.spec.js index 0c232dda..15d85230 100644 --- a/test/platform/stripes-platform.spec.js +++ b/test/platform/stripes-platform.spec.js @@ -1,7 +1,8 @@ -const expect = require('chai').expect; -const path = require('path'); -const webpackCommon = require('../../lib/webpack-common'); -const StripesPlatform = require('../../lib/platform/stripes-platform'); +import { expect } from 'chai'; +import path from 'path'; + +import webpackCommon from '../../lib/webpack-common.js'; +import StripesPlatform from '../../lib/platform/stripes-platform.js'; const stripesConfigStub = { okapi: { diff --git a/test/test-setup.spec.js b/test/test-setup.spec.js index c9d05bcf..7368b923 100644 --- a/test/test-setup.spec.js +++ b/test/test-setup.spec.js @@ -1,9 +1,10 @@ // Test setup for Mocha tests // Root-level Mocha hooks defined here apply to all tests regardless of file. -const sinon = require('sinon'); -const chai = require('chai'); -const sinonChai = require('sinon-chai'); +import sinon from 'sinon'; + +import chai from 'chai'; +import sinonChai from 'sinon-chai'; before(function () { chai.use(sinonChai); diff --git a/test/test/karma-service.spec.js b/test/test/karma-service.spec.js index 54de5ebc..c2d349f6 100644 --- a/test/test/karma-service.spec.js +++ b/test/test/karma-service.spec.js @@ -1,8 +1,10 @@ -const expect = require('chai').expect; -const path = require('path'); -const { config } = require('karma'); -const KarmaService = require('../../lib/test/karma-service'); +import { expect } from 'chai'; +import path from 'path'; +import karma from 'karma'; +import KarmaService from '../../lib/test/karma-service.js'; + +const { config } = { karma }; const webpackStub = { resolve: 'somewhere', }; @@ -54,8 +56,8 @@ describe('The karma-service', function () { }); it('applies a local karma config', function () { - // Passing __dirname should prompt the service to consider the karma.conf.js within the current test directory. - this.sut = new KarmaService(__dirname); + // Passing import.meta.dirname should prompt the service to consider the karma.conf.js within the current test directory. + this.sut = new KarmaService(import.meta.dirname); // Expected from applying local karma.conf.js const globalExpected = { diff --git a/test/test/karma.conf.js b/test/test/karma.conf.js index 9317d8fa..e2471c29 100644 --- a/test/test/karma.conf.js +++ b/test/test/karma.conf.js @@ -1,4 +1,4 @@ -module.exports = (config) => { +export default (config) => { config.coverageIstanbulReporter.thresholds.global = { statements: 95, branches: 85, diff --git a/test/webpack-common.spec.js b/test/webpack-common.spec.js index efab0527..c7eeeaec 100644 --- a/test/webpack-common.spec.js +++ b/test/webpack-common.spec.js @@ -1,5 +1,6 @@ -const expect = require('chai').expect; -const webpackCommon = require('../lib/webpack-common'); +import { expect } from 'chai'; + +import webpackCommon from '../lib/webpack-common.js'; describe('The webpack-common module', function () { beforeEach(function () {