diff --git a/package-lock.json b/package-lock.json index 6a722c6..44c31d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "ts-jest": "^27.0.3", "ts-node": "^10.0.0", "tslint": "^6.0.0", - "typescript": "^4.3.2" + "typescript": "4.3.2" } }, "node_modules/@babel/code-frame": { diff --git a/src/helpers/filter-existing-npm-packages.spec.ts b/src/helpers/filter-existing-npm-packages.spec.ts index 8144287..2b2153e 100644 --- a/src/helpers/filter-existing-npm-packages.spec.ts +++ b/src/helpers/filter-existing-npm-packages.spec.ts @@ -1,7 +1,7 @@ import 'jest-extended'; import { resetAllWhenMocks, verifyAllWhenMocksCalled, when } from 'jest-when'; -import * as npmUtils from '../npm-utils'; +import * as npmUtils from '../utils/npm'; import { filterExistingNpmPackages } from './filter-existing-npm-packages'; import { Package } from '../storage-explorer'; diff --git a/src/helpers/filter-existing-npm-packages.ts b/src/helpers/filter-existing-npm-packages.ts index dbe64d4..06736a2 100644 --- a/src/helpers/filter-existing-npm-packages.ts +++ b/src/helpers/filter-existing-npm-packages.ts @@ -1,5 +1,5 @@ import { Package } from '../storage-explorer'; -import { getCurrentRegistry, isNpmPackagePublished } from '../npm-utils'; +import { getCurrentRegistry, isNpmPackagePublished } from '../utils/npm'; import PromisePool from 'es6-promise-pool'; import { logger } from '../logger'; diff --git a/src/index.ts b/src/index.ts index a6d4c22..6c4c882 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,18 +1,18 @@ import storageExplorer, { Package } from './storage-explorer'; import npmPublishScriptCreator from './npm-publish-script-creator'; import fileWriter from './file-writer'; -import { userOptionGetter } from './user-option/user-options-getter'; +import { userOptionGetter } from './options/'; import { logger } from './logger'; import { bold } from 'kleur'; import emoji from 'node-emoji'; -import { UserOptions } from './user-option/user-options'; -import { IUserOptionGetter } from './user-option/i-user-option-getter'; -import { userOptionPromptGetter } from './user-option/interactive/user-option-prompt-getter'; +import { UserOptions } from './options/user-options'; import path from 'path'; -import { userOptionArgGetter } from './user-option/args'; -import { validateUserOptions } from './user-option/validator'; -import { getLineTransformer } from './utils'; +import { validateUserOptions } from './options/validator'; +import { getLineTransformer } from './utils/common'; import { filterExistingNpmPackages } from './helpers/filter-existing-npm-packages'; +import { IUserOptionGetter } from './options/i-user-option-getter'; +import { userOptionArgGetter } from './options/providers/args'; +import { userOptionPromptGetter } from './options/providers/interactive'; // The order is important const userOptionGetters: { @@ -23,7 +23,7 @@ const userOptionGetters: { interactive: userOptionPromptGetter, }; -const run = async () => { +const getConfigFromUser = async () => { let config: UserOptions; try { config = await userOptionGetter(userOptionGetters); @@ -51,6 +51,15 @@ const run = async () => { // Make it absolute path in case the user move the file config.storagePath = config.storagePath ?? path.resolve(config.storagePath); + return config; +}; + +const run = async () => { + const config = await getConfigFromUser(); + + if (!config) { + return; + } logger.info('User configuration loaded'); diff --git a/src/logger.ts b/src/logger/index.ts similarity index 100% rename from src/logger.ts rename to src/logger/index.ts diff --git a/src/user-option/i-user-option-getter.ts b/src/options/i-user-option-getter.ts similarity index 100% rename from src/user-option/i-user-option-getter.ts rename to src/options/i-user-option-getter.ts diff --git a/src/options/index.ts b/src/options/index.ts new file mode 100644 index 0000000..4a9f0d0 --- /dev/null +++ b/src/options/index.ts @@ -0,0 +1 @@ +export { userOptionGetter } from './providers/'; diff --git a/src/user-option/args/index.spec.ts b/src/options/providers/args/index.spec.ts similarity index 96% rename from src/user-option/args/index.spec.ts rename to src/options/providers/args/index.spec.ts index 0a55977..edcce7d 100644 --- a/src/user-option/args/index.spec.ts +++ b/src/options/providers/args/index.spec.ts @@ -1,10 +1,10 @@ import 'jest-extended'; -import { IUserOptionGetter as IUserOptionGetterLib } from '../i-user-option-getter'; -import { UserOptions as UserOptionsLib } from '../user-options'; -import { setPlatform } from '../../../tests/util'; +import { IUserOptionGetter as IUserOptionGetterLib } from '../../i-user-option-getter'; +import { UserOptions as UserOptionsLib } from '../../user-options'; +import { setPlatform } from '../../../../tests/util'; import Mock = jest.Mock; -import { UserOptionArgGetterResult } from './index'; +import { UserOptionArgGetterResult } from './'; interface TestDeps { UserOptions: UserOptionsLib; @@ -15,9 +15,9 @@ interface TestDeps { function getDeps(): TestDeps { // eslint-disable-next-line @typescript-eslint/no-var-requires - const { UserOptions } = require('../user-options'); + const { UserOptions } = require('../../user-options'); // eslint-disable-next-line @typescript-eslint/no-var-requires - const { IUserOptionGetter } = require('../i-user-option-getter'); + const { IUserOptionGetter } = require('../../i-user-option-getter'); // eslint-disable-next-line @typescript-eslint/no-var-requires const UserOptionGetter = require('./'); diff --git a/src/user-option/args/index.ts b/src/options/providers/args/index.ts similarity index 96% rename from src/user-option/args/index.ts rename to src/options/providers/args/index.ts index 5efafef..fe3962d 100644 --- a/src/user-option/args/index.ts +++ b/src/options/providers/args/index.ts @@ -1,8 +1,8 @@ -import { IUserOptionGetter } from '../i-user-option-getter'; +import { IUserOptionGetter } from '../../i-user-option-getter'; import yargs from 'yargs'; -import { logger } from '../../logger'; -import { getCurrentOS, getPackageName, OSTypes, removeEmpty } from '../../utils'; -import { DEFAULT_USER_OPTIONS, UserOptions } from '../user-options'; +import { logger } from '../../../logger'; +import { getCurrentOS, getPackageName, OSTypes, removeEmpty } from '../../../utils/common'; +import { DEFAULT_USER_OPTIONS, UserOptions } from '../../user-options'; import chalk from 'chalk'; const usageExamples: ((...params: any[]) => [string, string])[] = [ diff --git a/src/user-option/user-options-getter.spec.ts b/src/options/providers/index.spec.ts similarity index 70% rename from src/user-option/user-options-getter.spec.ts rename to src/options/providers/index.spec.ts index aef12ae..92f7e7d 100644 --- a/src/user-option/user-options-getter.spec.ts +++ b/src/options/providers/index.spec.ts @@ -1,24 +1,20 @@ import 'jest-extended'; -import { UserOptions as UserOptionsLib } from './user-options'; +import { UserOptions as UserOptionsLib } from '../user-options'; -import { IUserOptionGetter as IUserOptionGetterLib } from './i-user-option-getter'; -import { setPlatform } from '../../tests/util'; +import { IUserOptionGetter as IUserOptionGetterLib } from '../i-user-option-getter'; +import { setPlatform } from '../../../tests/util'; interface TestsDep { - UserOptions: UserOptionsLib; - IUserOptionGetter: IUserOptionGetterLib; + UserOptions?: UserOptionsLib; + IUserOptionGetter?: IUserOptionGetterLib; userOptionGetter: IUserOptionGetterLib; } function getDeps(): TestsDep { // eslint-disable-next-line @typescript-eslint/no-var-requires - const { UserOptions } = require('./user-options'); - // eslint-disable-next-line @typescript-eslint/no-var-requires - const { IUserOptionGetter } = require('./i-user-option-getter'); - // eslint-disable-next-line @typescript-eslint/no-var-requires - const { userOptionGetter } = require('./user-options-getter'); + const { userOptionGetter } = require('./'); - return { UserOptions, IUserOptionGetter, userOptionGetter }; + return { userOptionGetter }; } describe('Get User Options (from the available option)', () => { @@ -32,7 +28,6 @@ describe('Get User Options (from the available option)', () => { } beforeEach(() => { - // TODO(rluvaton): set reset modules option in the jest config instead jest.resetModules(); // this is important - it clears the cache }); @@ -51,30 +46,6 @@ describe('Get User Options (from the available option)', () => { expect(userOptionGetter).toBeDefined(); }); - it('should throw error when no userOptionGetters passed', async () => { - const { userOptionGetter } = startTest('linux'); - const pr = userOptionGetter(); - - await expect(pr).toReject(); - - const rejectResult = await pr.catch((e) => e); - expect(rejectResult).toBeDefined(); - expect(rejectResult).toBeInstanceOf(Error); - expect(rejectResult).toHaveProperty('message', 'One of the user option getter must be provided'); - }); - - it('should throw error when empty userOptionGetters passed', async () => { - const { userOptionGetter } = startTest('linux'); - const pr = getOptionsAndEnsureCalledTimeAndArgs(userOptionGetter, {}); - - await expect(pr).toReject(); - - const rejectResult = await pr.catch((e) => e); - expect(rejectResult).toBeDefined(); - expect(rejectResult).toBeInstanceOf(Error); - expect(rejectResult).toHaveProperty('message', 'One of the user option getter must be provided'); - }); - it('should throw error when userOptionGetters rejected', async () => { const { userOptionGetter } = startTest('linux'); const pr = getOptionsAndEnsureCalledTimeAndArgs(userOptionGetter, { @@ -105,8 +76,8 @@ describe('Get User Options (from the available option)', () => { }); it('should get the first user options that resolved', async () => { - const { IUserOptionGetter, UserOptions, userOptionGetter } = startTest('windows'); - const expectedUserOptions: typeof UserOptions = { + const { userOptionGetter } = startTest('windows'); + const expectedUserOptions: UserOptionsLib = { storagePath: 'C://storage/', destPublishScriptFilePath: './publish.bat', npmPublishOptions: { @@ -118,7 +89,7 @@ describe('Get User Options (from the available option)', () => { }, }; - const pr = getOptionsAndEnsureCalledTimeAndArgs(userOptionGetter, { + const pr = getOptionsAndEnsureCalledTimeAndArgs(userOptionGetter, { args: () => Promise.resolve({ storagePath: expectedUserOptions.storagePath, @@ -137,9 +108,9 @@ describe('Get User Options (from the available option)', () => { }); it('should get the first user options that not rejected', async () => { - const { UserOptions, userOptionGetter } = startTest('windows'); + const { userOptionGetter } = startTest('windows'); - const expectedUserOptions: typeof UserOptions = { + const expectedUserOptions: UserOptionsLib = { storagePath: 'C://storage/', destPublishScriptFilePath: './my-publish-script.bat', npmPublishOptions: { @@ -167,8 +138,8 @@ describe('Get User Options (from the available option)', () => { }); it('should get provided storage path and default values for destPublishScriptFilePath npmPublishOptions.registry (on Windows)', async () => { - const { UserOptions, userOptionGetter } = startTest('windows'); - const expectedUserOptions: typeof UserOptions = { + const { userOptionGetter } = startTest('windows'); + const expectedUserOptions: UserOptionsLib = { storagePath: 'C://storage/', destPublishScriptFilePath: './publish.bat', npmPublishOptions: { @@ -190,9 +161,9 @@ describe('Get User Options (from the available option)', () => { }); it('should get provided storage path and default values for destPublishScriptFilePath npmPublishOptions.registry (on Linux)', async () => { - const { UserOptions, userOptionGetter } = startTest('linux'); + const { userOptionGetter } = startTest('linux'); - const expectedUserOptions: typeof UserOptions = { + const expectedUserOptions: UserOptionsLib = { storagePath: '/home/root/my-storage/', destPublishScriptFilePath: './publish.sh', npmPublishOptions: { diff --git a/src/user-option/user-options-getter.ts b/src/options/providers/index.ts similarity index 92% rename from src/user-option/user-options-getter.ts rename to src/options/providers/index.ts index 31edc37..e328361 100644 --- a/src/user-option/user-options-getter.ts +++ b/src/options/providers/index.ts @@ -1,6 +1,6 @@ -import { IUserOptionGetter } from './i-user-option-getter'; -import { DEFAULT_USER_OPTIONS, setDefaultUserOptionsProperties, UserOptions } from './user-options'; -import { logger } from '../logger'; +import { IUserOptionGetter } from '../i-user-option-getter'; +import { DEFAULT_USER_OPTIONS, setDefaultUserOptionsProperties, UserOptions } from '../user-options'; +import { logger } from '../../logger'; /** * Get the user options from one of the provided getters diff --git a/src/user-option/interactive/user-option-prompt-getter.spec.ts b/src/options/providers/interactive/index.spec.ts similarity index 91% rename from src/user-option/interactive/user-option-prompt-getter.spec.ts rename to src/options/providers/interactive/index.spec.ts index 2780c21..4d116da 100644 --- a/src/user-option/interactive/user-option-prompt-getter.spec.ts +++ b/src/options/providers/interactive/index.spec.ts @@ -1,8 +1,8 @@ import 'jest-extended'; -import { IUserOptionGetter as IUserOptionGetterLib } from '../i-user-option-getter'; -import { UserOptions as UserOptionsLib } from '../user-options'; -import { setPlatform } from '../../../tests/util'; +import { IUserOptionGetter as IUserOptionGetterLib } from '../../i-user-option-getter'; +import { UserOptions as UserOptionsLib } from '../../user-options'; +import { setPlatform } from '../../../../tests/util'; import Mock = jest.Mock; interface TestDeps { @@ -17,11 +17,11 @@ function getDeps(): TestDeps { // eslint-disable-next-line @typescript-eslint/no-var-requires const prompts = require('prompts'); // eslint-disable-next-line @typescript-eslint/no-var-requires - const { UserOptions } = require('../user-options'); + const { UserOptions } = require('../../user-options'); // eslint-disable-next-line @typescript-eslint/no-var-requires - const { IUserOptionGetter } = require('../i-user-option-getter'); + const { IUserOptionGetter } = require('../../i-user-option-getter'); // eslint-disable-next-line @typescript-eslint/no-var-requires - const UserOptionPromptGetter = require('./user-option-prompt-getter'); + const UserOptionPromptGetter = require('./'); return { prompts, UserOptions, IUserOptionGetter, UserOptionPromptGetter }; } @@ -70,12 +70,6 @@ describe('Get User Options from User Interactive Input', () => { setPlatform(originalPlatform); }); - it('userOptionPromptGetter should be define', () => { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const { userOptionPromptGetter } = require('./user-option-prompt-getter'); - expect(userOptionPromptGetter).toBeDefined(); - }); - describe('should get provided storage path and default values for destPublishScriptFilePath npmPublishOptions.registry', () => { it.each([ ['win32', 'C://storage-to-publish', './publish.bat'], diff --git a/src/user-option/interactive/user-option-prompt-getter.ts b/src/options/providers/interactive/index.ts similarity index 91% rename from src/user-option/interactive/user-option-prompt-getter.ts rename to src/options/providers/interactive/index.ts index 47a5111..772b838 100644 --- a/src/user-option/interactive/user-option-prompt-getter.ts +++ b/src/options/providers/interactive/index.ts @@ -1,14 +1,14 @@ -import { IUserOptionGetter } from '../i-user-option-getter'; -import { DEFAULT_USER_OPTIONS } from '../user-options'; +import { IUserOptionGetter } from '../../i-user-option-getter'; import prompts from 'prompts'; -import { logger } from '../../logger'; -import { deepClone } from '../../utils'; +import { logger } from '../../../logger'; +import { deepClone } from '../../../utils/common'; +import { DEFAULT_USER_OPTIONS } from '../../user-options'; import { - validateStorage, validateDestPublishScriptFilePath, validateNpmPublishOptionsIfSpecified, validateOnlyNewOptionsIfSpecified, -} from '../validator'; + validateStorage, +} from '../../validator'; const _questions = [ { diff --git a/src/user-option/user-options.spec.ts b/src/options/user-options.spec.ts similarity index 98% rename from src/user-option/user-options.spec.ts rename to src/options/user-options.spec.ts index 0e2904d..733f1d9 100644 --- a/src/user-option/user-options.spec.ts +++ b/src/options/user-options.spec.ts @@ -1,6 +1,6 @@ import 'jest-extended'; import { DEFAULT_USER_OPTIONS, setDefaultUserOptionsProperties, UserOptions } from './user-options'; -import { deepClone } from '../utils'; +import { deepClone } from '../utils/common'; describe('UserOptions', () => { describe('#setDefaultUserOptionsProperties', () => { diff --git a/src/user-option/user-options.ts b/src/options/user-options.ts similarity index 96% rename from src/user-option/user-options.ts rename to src/options/user-options.ts index d1b6543..a105743 100644 --- a/src/user-option/user-options.ts +++ b/src/options/user-options.ts @@ -1,5 +1,5 @@ import { NpmPublishOptions } from '../npm-publish-script-creator'; -import { getCurrentOS, OSTypes } from '../utils'; +import { getCurrentOS, OSTypes } from '../utils/common'; export interface UserOptionsGetNewPackages { enable?: boolean; diff --git a/src/user-option/validator.spec.ts b/src/options/validator/index.spec.ts similarity index 99% rename from src/user-option/validator.spec.ts rename to src/options/validator/index.spec.ts index dea4b1b..1bf6550 100644 --- a/src/user-option/validator.spec.ts +++ b/src/options/validator/index.spec.ts @@ -2,10 +2,10 @@ import 'jest-extended'; import { when, verifyAllWhenMocksCalled, resetAllWhenMocks } from 'jest-when'; import { dirname } from 'path'; -import { UserOptions } from './user-options'; -import * as validator from './validator'; -import * as fsUtils from '../fs-utils'; -import * as npmUtils from '../npm-utils'; +import { UserOptions } from '../user-options'; +import * as validator from '../validator'; +import * as fsUtils from '../../utils/fs'; +import * as npmUtils from '../../utils/npm'; describe('User Options Validator', () => { afterEach(() => { diff --git a/src/user-option/validator.ts b/src/options/validator/index.ts similarity index 94% rename from src/user-option/validator.ts rename to src/options/validator/index.ts index 55545ec..e31f901 100644 --- a/src/user-option/validator.ts +++ b/src/options/validator/index.ts @@ -1,9 +1,9 @@ -import { UserOptions } from './user-options'; -import { isDirectoryExists } from '../fs-utils'; +import { UserOptions } from '../user-options'; +import { isDirectoryExists } from '../../utils/fs'; import { dirname } from 'path'; import { isWebUri } from 'valid-url'; import isValidPath from 'is-valid-path'; -import { getCurrentRegistry, pingNpmRegistry } from '../npm-utils'; +import { getCurrentRegistry, pingNpmRegistry } from '../../utils/npm'; export const validateUserOptions = async (options: Partial): Promise => { return ( diff --git a/src/storage-explorer.spec.ts b/src/storage-explorer/index.spec.ts similarity index 99% rename from src/storage-explorer.spec.ts rename to src/storage-explorer/index.spec.ts index 07f830d..1d15e93 100644 --- a/src/storage-explorer.spec.ts +++ b/src/storage-explorer/index.spec.ts @@ -3,7 +3,7 @@ import * as path from 'path'; import { fs, vol } from 'memfs'; jest.mock('fs', () => fs); -import storageExplorer, { Package } from './storage-explorer'; +import storageExplorer, { Package } from './'; describe('Storage Explorer', () => { const mockFs = (fakeFsStructure) => vol.fromNestedJSON(fakeFsStructure, '/'); diff --git a/src/storage-explorer.ts b/src/storage-explorer/index.ts similarity index 99% rename from src/storage-explorer.ts rename to src/storage-explorer/index.ts index 2ea8ac3..b9f9d70 100644 --- a/src/storage-explorer.ts +++ b/src/storage-explorer/index.ts @@ -1,5 +1,5 @@ import dirTree from 'directory-tree'; -import { logger } from './logger'; +import { logger } from '../logger/'; import emoji from 'node-emoji'; import path from 'path'; diff --git a/src/type-utils.ts b/src/type-utils.ts deleted file mode 100644 index 6aedfee..0000000 --- a/src/type-utils.ts +++ /dev/null @@ -1 +0,0 @@ -export type ArrayOneOrMore = [T, ...T[]]; diff --git a/src/utils.ts b/src/utils/common/index.ts similarity index 95% rename from src/utils.ts rename to src/utils/common/index.ts index 5f44c7a..9e4296a 100644 --- a/src/utils.ts +++ b/src/utils/common/index.ts @@ -42,7 +42,7 @@ export const getLineTransformer = (outputFilePath: string) => { export const getPackageName = () => { if (!packageJson) { - packageJson = require('../package.json'); + packageJson = require('../../../package.json'); } return packageJson.name; diff --git a/src/fs-utils/index.ts b/src/utils/fs/index.ts similarity index 54% rename from src/fs-utils/index.ts rename to src/utils/fs/index.ts index 3eeba87..5535afc 100644 --- a/src/fs-utils/index.ts +++ b/src/utils/fs/index.ts @@ -1,7 +1,7 @@ -import fs, { Stats } from 'fs'; +import { Stats } from 'fs'; +import fsPromises from 'fs/promises'; -export const getPathType = (path: string): Promise => - new Promise((resolve, reject) => fs.lstat(path, (err, stats) => (err ? reject(err) : resolve(stats)))); +export const getPathType = (path: string): Promise => fsPromises.lstat(path); export const isDirectoryExists = async (path?: string) => { if (!path) { diff --git a/src/npm-utils.spec.ts b/src/utils/npm/index.spec.ts similarity index 98% rename from src/npm-utils.spec.ts rename to src/utils/npm/index.spec.ts index 025c4b2..fec6f43 100644 --- a/src/npm-utils.spec.ts +++ b/src/utils/npm/index.spec.ts @@ -12,8 +12,8 @@ jest.mock('npm-registry-fetch', () => { import $fetch from 'npm-registry-fetch'; -import * as npmUtils from './npm-utils'; -import { isNpmPackagePublished } from './npm-utils'; +import * as npmUtils from './'; +import { isNpmPackagePublished } from './'; type MockedFetch = jest.MockedFunction & { _actual: typeof $fetch }; const fetch: MockedFetch = $fetch as MockedFetch; diff --git a/src/npm-utils.ts b/src/utils/npm/index.ts similarity index 100% rename from src/npm-utils.ts rename to src/utils/npm/index.ts