Skip to content

Commit

Permalink
chore: Strict Mocks Server config type
Browse files Browse the repository at this point in the history
  • Loading branch information
javierbrea committed Jun 5, 2023
1 parent 90f1ab7 commit eadc71c
Show file tree
Hide file tree
Showing 16 changed files with 63 additions and 42 deletions.
1 change: 1 addition & 0 deletions packages/admin-api-client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
"test:unit": "start-server-and-test mocks:ci tcp:127.0.0.1:3110 test"
},
"dependencies": {
"@mocks-server/core": "workspace:*",
"@mocks-server/config": "workspace:*",
"@mocks-server/admin-api-paths": "workspace:*",
"cross-fetch": "3.1.5"
Expand Down
9 changes: 5 additions & 4 deletions packages/admin-api-client/src/AdminApiClient.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { ConfigurationObject } from "@mocks-server/config";
import type { Configuration } from "@mocks-server/core";

import { AdminApiClientEntities } from "./AdminApiClientEntities";

Expand All @@ -23,12 +24,12 @@ export const AdminApiClient: AdminApiClientConstructor = class AdminApiClient
return this._adminApiClient.about.read();
}

public readConfig(): Promise<ConfigurationObject> {
return this._adminApiClient.config.read() as Promise<ConfigurationObject>;
public readConfig(): Promise<Configuration> {
return this._adminApiClient.config.read() as Promise<Configuration>;
}

public updateConfig(newConfig: ConfigurationObject): Promise<void> {
return this._adminApiClient.config.update(newConfig) as Promise<void>;
public updateConfig(newConfig: Configuration): Promise<void> {
return this._adminApiClient.config.update(newConfig as ConfigurationObject) as Promise<void>;
}

public readAlerts(): Promise<ApiResponseBody> {
Expand Down
6 changes: 3 additions & 3 deletions packages/admin-api-client/src/AdminApiClient.types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { ConfigurationObject } from "@mocks-server/config";
import type { Configuration } from "@mocks-server/core";

import type { ApiResponseBody, ApiClientConfig } from "./AdminApiClientEntities.types";
import type { EntityId } from "./Common.types";
Expand Down Expand Up @@ -26,14 +26,14 @@ export interface AdminApiClientInterface {
* @returns Promise. Resolved with config data {@link ConfigurationObject}
* @example const config = await adminApiClient.readConfig();
*/
readConfig(): Promise<ConfigurationObject>;
readConfig(): Promise<Configuration>;
/**
* Updates config data
* @param newConfig - Partial Mocks Server configuration object to be updated {@link ConfigurationObject}
* @returns Promise. Resolved with undefined when data is valid
* @example await adminApiClient.updateConfig({ mock: { delay: 1000 }});
*/
updateConfig(newConfig: ConfigurationObject): Promise<void>;
updateConfig(newConfig: Configuration): Promise<void>;
/**
* Returns alerts data
* @returns Promise. Resolved with alerts data {@link ApiResponseBody}
Expand Down
20 changes: 20 additions & 0 deletions packages/config/src/Options.types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/** Built in configuration object */
export interface BuiltInConfig {
/** Configuration for the config library itself */
config?: {
/** Determines whether config file should be read or not */
readFile?: boolean;
/** Determines whether config should read arguments or not */
readArguments?: boolean;
/** Determines whether config should read environment vars or not */
readEnvironment?: boolean;
/** Determines where config should search for config file */
fileSearchPlaces?: string[];
/** Determines from where config should start searching for config file */
fileSearchFrom?: string;
/** Determines where config should stop searching for config file */
fileSearchStop?: string;
/** Determines whether unknown arguments should be allowed or not */
allowUnknownArguments?: boolean;
};
}
1 change: 1 addition & 0 deletions packages/config/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ export * from "./Files.types";
export * from "./Option.types";
export * from "./Typing.types";
export * from "./Validation.types";
export * from "./Options.types";
11 changes: 5 additions & 6 deletions packages/core/src/Core.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
Config,
ConfigInterface,
ConfigNamespaceInterface,
ConfigurationObject,
OptionInterfaceOfType,
} from "@mocks-server/config";
import { Logger, LoggerInterface, LogLevel } from "@mocks-server/logger";
Expand Down Expand Up @@ -43,6 +44,7 @@ import type {
CoreConstructor,
CoreAdvancedOptions,
LogOptionDefinition,
Configuration,
} from "./Core.types";

const MODULE_NAME = "mocks";
Expand All @@ -57,7 +59,7 @@ const ROOT_OPTIONS: [LogOptionDefinition] = [
];

export const Core: CoreConstructor = class Core implements CoreInterface {
private _programmaticConfig: MocksServer.Config;
private _programmaticConfig: Configuration;
private _eventEmitter: EventEmitter;
private _logger: LoggerInterface;
private _configLogger: LoggerInterface;
Expand All @@ -80,10 +82,7 @@ export const Core: CoreConstructor = class Core implements CoreInterface {
private _startPluginsPromise: Promise<void> | null;
private _version: string;

constructor(
programmaticConfig: MocksServer.Config = {},
advancedOptions: CoreAdvancedOptions = {}
) {
constructor(programmaticConfig: Configuration = {}, advancedOptions: CoreAdvancedOptions = {}) {
// TODO, move to about. Do not read on constructor
const packageJson = readJsonSync(path.resolve(__dirname, "..", "package.json"));
this._version = packageJson.version;
Expand Down Expand Up @@ -228,7 +227,7 @@ export const Core: CoreConstructor = class Core implements CoreInterface {
this._updateNotifier.init();

// Init config
await this._config.init(this._programmaticConfig);
await this._config.init(this._programmaticConfig as ConfigurationObject);
this._logger.setLevel(this._logOption.value);

// Register plugins, let them add their custom config
Expand Down
13 changes: 6 additions & 7 deletions packages/core/src/Core.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ Unless required by applicable law or agreed to in writing, software distributed

import type {
ConfigInterface,
ConfigurationObject,
GetOptionValueTypeFromDefinition,
OptionDefinition,
BuiltInConfig,
} from "@mocks-server/config";
import type { LoggerInterface, LogLevel } from "@mocks-server/logger";
import type { Package } from "update-notifier";
Expand All @@ -27,7 +27,7 @@ declare global {
//eslint-disable-next-line @typescript-eslint/no-namespace
namespace MocksServer {
//eslint-disable-next-line @typescript-eslint/no-empty-interface
interface Config extends ConfigurationObject {}
interface Config extends BuiltInConfig {}
}
}

Expand All @@ -42,6 +42,8 @@ declare global {
}
}

export type Configuration = MocksServer.Config;

/** Mocks-server base core interface */
export interface BaseCoreInterface {
/** Files */
Expand Down Expand Up @@ -77,15 +79,12 @@ export interface CoreAdvancedOptions {
export interface CoreConstructor {
/**
* Creates a Mocks Server core interface
* @param config - Programmatic configuration {@link ConfigurationObject}
* @param config - Programmatic configuration {@link Configuration}
* @param advancedOptions - Advanced options {@link AdvancedOptions}
* @returns Mocks Server core interface {@link CoreInterface}.
* @example const core = new Core({ log: "error" }, { pkg: { version: "1.2.0" }});
*/
new (
programmaticConfig?: ConfigurationObject,
advancedOptions?: CoreAdvancedOptions
): CoreInterface;
new (programmaticConfig?: Configuration, advancedOptions?: CoreAdvancedOptions): CoreInterface;
}

/** Mocks-server base core interface */
Expand Down
2 changes: 1 addition & 1 deletion packages/cypress-commands/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
"test:unit": "jest"
},
"dependencies": {
"@mocks-server/config": "workspace:*",
"@mocks-server/core": "workspace:*",
"@mocks-server/admin-api-paths": "workspace:*",
"@mocks-server/admin-api-client": "workspace:*"
},
Expand Down
4 changes: 2 additions & 2 deletions packages/cypress-commands/src/AdminApiClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {
DEFAULT_PORT,
DEFAULT_CLIENT_HOST,
} from "@mocks-server/admin-api-paths";
import type { ConfigurationObject } from "@mocks-server/config";
import type { Configuration } from "@mocks-server/core";

import { isUndefined, isFalsy } from "./Helpers";

Expand Down Expand Up @@ -43,7 +43,7 @@ export const AdminApiClient: AdminApiClientConstructor = class AdminApiClient
return `${this._protocol}://${this._host}:${this._port}`;
}

public updateConfig(mocksServerConfig: ConfigurationObject): Promise<void> {
public updateConfig(mocksServerConfig: Configuration): Promise<void> {
if (this._isDisabled()) {
return doNothing();
}
Expand Down
4 changes: 2 additions & 2 deletions packages/cypress-commands/src/AdminApiClient.types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { ApiClientConfig, EntityId, BaseUrl } from "@mocks-server/admin-api-client";
import type { ConfigurationObject } from "@mocks-server/config";
import type { Configuration } from "@mocks-server/core";

export interface AdminApiClientConfig extends ApiClientConfig {
enabled?: boolean;
Expand All @@ -26,7 +26,7 @@ export interface AdminApiClientInterface {
* @returns Promise. Resolved with undefined when data is valid
* @example await adminApiClient.updateConfig({ mock: { delay: 1000 }});
*/
updateConfig(mocksServerConfig: ConfigurationObject): Promise<void>;
updateConfig(mocksServerConfig: Configuration): Promise<void>;
/**
* Sets a custom route variant to be used by current collection
* @param id - Route variant id
Expand Down
7 changes: 2 additions & 5 deletions packages/cypress-commands/src/Commands.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { EntityId } from "@mocks-server/admin-api-client";
import type { ConfigurationObject } from "@mocks-server/config";
import type { Configuration } from "@mocks-server/core";
import type Bluebird from "cypress/types/bluebird";

import { AdminApiClient } from "./AdminApiClient";
Expand Down Expand Up @@ -117,10 +117,7 @@ export function commands(Cyp: typeof Cypress, CypCy: typeof cy): CypressCommands
);
}

function setConfig(
mocksServerConfig: ConfigurationObject,
apiClient?: AdminApiClientInterface
): void {
function setConfig(mocksServerConfig: Configuration, apiClient?: AdminApiClientInterface): void {
const client = getClient(apiClient);
const configMessage = JSON.stringify(mocksServerConfig);
doRequestAndLog(
Expand Down
4 changes: 2 additions & 2 deletions packages/cypress-commands/src/Commands.types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { EntityId } from "@mocks-server/admin-api-client";
import type { ConfigurationObject } from "@mocks-server/config";
import type { Configuration } from "@mocks-server/core";

import type { AdminApiClientConfig, AdminApiClientInterface } from "./AdminApiClient.types";

Expand Down Expand Up @@ -28,7 +28,7 @@ export interface CypressCommandsMethods {
* @param apiClient - Custom API client to be used instead of the default one. Useful to control several Mocks Servers instances {@link AdminApiClientInterface}
* @example setConfig({ mock: { delay: 1000 }});
*/
setConfig(mocksServerConfig: ConfigurationObject, apiClient?: AdminApiClientInterface): void;
setConfig(mocksServerConfig: Configuration, apiClient?: AdminApiClientInterface): void;
/**
* Set a specific route variant to be used by the current collection.
* @param id - Route variant id {@link EntityId}
Expand Down
4 changes: 2 additions & 2 deletions packages/cypress-commands/src/Cypress.types.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/// <reference types="cypress" />

import type { EntityId } from "@mocks-server/admin-api-client";
import type { ConfigurationObject } from "@mocks-server/config";
import type { Configuration } from "@mocks-server/core";

import type { AdminApiClientInterface, AdminApiClientConfig } from "./AdminApiClient.types";

Expand Down Expand Up @@ -32,7 +32,7 @@ declare global {
* @example cy.mocksSetConfig({ mock: { routes: { delay: 1000 }} })
*/
mocksSetConfig(
mocksServerConfig: ConfigurationObject,
mocksServerConfig: Configuration,
adminApiClient?: AdminApiClientInterface
): Promise<void>;

Expand Down
6 changes: 3 additions & 3 deletions packages/main/src/CreateServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@ import { readFileSync } from "fs";
import path from "path";

import { Core } from "@mocks-server/core";
import type { CoreInterface } from "@mocks-server/core";
import type { CoreInterface, Configuration } from "@mocks-server/core";
import { Plugin as AdminApi } from "@mocks-server/plugin-admin-api";
import { Plugin as InquirerCli } from "@mocks-server/plugin-inquirer-cli";
import { Plugin as OpenApi } from "@mocks-server/plugin-openapi";
import { Plugin as PluginProxy } from "@mocks-server/plugin-proxy";
import deepMerge from "deepmerge";

const DEFAULT_CONFIG: MocksServer.Config = {
const DEFAULT_CONFIG: Configuration = {
config: {
readArguments: false,
readEnvironment: false,
Expand All @@ -36,7 +36,7 @@ const DEFAULT_CONFIG: MocksServer.Config = {
},
};

export function createServer(userConfig: MocksServer.Config): CoreInterface {
export function createServer(userConfig: Configuration): CoreInterface {
const pkg = JSON.parse(readFileSync(path.resolve(__dirname, "..", "package.json"), "utf8"));
const config = userConfig ? deepMerge(DEFAULT_CONFIG, userConfig) : DEFAULT_CONFIG;
return new Core(config, {
Expand Down
7 changes: 4 additions & 3 deletions packages/plugin-admin-api/src/routes/api/Config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ Unless required by applicable law or agreed to in writing, software distributed
*/

import { badRequest } from "@hapi/boom";
import type { ScopedCoreInterface } from "@mocks-server/core";
import type { ConfigurationObject } from "@mocks-server/config";
import type { ScopedCoreInterface, Configuration } from "@mocks-server/core";
import { NextFunction, Response, Router } from "express";

import type { RequestWithId } from "../../server/Server.types";
Expand All @@ -34,8 +35,8 @@ export const Config: ConfigConstructor = class Config implements ConfigInterface
return this._router;
}

private _validateNewConfig(newConfig: MocksServer.Config) {
return this._config.validate(newConfig);
private _validateNewConfig(newConfig: Configuration) {
return this._config.validate(newConfig as ConfigurationObject);
}

private _patch(req: RequestWithId, res: Response, next: NextFunction) {
Expand Down
6 changes: 4 additions & 2 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit eadc71c

Please sign in to comment.