Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(cli): flatten file arch #316

Merged
merged 2 commits into from
Jan 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM node:16-alpine
FROM node:18-alpine

WORKDIR /app

Expand Down
2 changes: 1 addition & 1 deletion bin/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const { existsSync } = require('fs');
const nodeWatch = require('node-watch');
const yargs = require('yargs');
const packageJson = require('../package');
const { logger } = require('../src/logger/configLogger');
const { logger } = require('../src/logger');
const { apiDocMock, OPTIONS } = require('../src');

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`BuildDocs should fail a build gracefully: fail 1`] = `[]`;
exports[`apidocBuild should fail a build gracefully: fail 1`] = `[]`;

exports[`BuildDocs should handle additional response content types: html mock 1`] = `
exports[`apidocBuild should handle additional response content types: html mock 1`] = `
{
"error": undefined,
"filename": "html.js",
Expand All @@ -17,7 +17,7 @@ exports[`BuildDocs should handle additional response content types: html mock 1`
}
`;

exports[`BuildDocs should handle additional response content types: svg mock 1`] = `
exports[`apidocBuild should handle additional response content types: svg mock 1`] = `
{
"error": undefined,
"filename": "svg.js",
Expand All @@ -32,7 +32,7 @@ exports[`BuildDocs should handle additional response content types: svg mock 1`]
}
`;

exports[`BuildDocs should setup api docs and create a predictable output: setupDocs 1`] = `
exports[`apidocBuild should setup api docs and create a predictable output: setupDocs 1`] = `
{
"error": "{"examples":[{"title":"Error-Response:","content":"HTTP/1.1 400 OK\\n{\\n \\"error\\": \\"test\\"\\n}","type":"json"}]}",
"filename": "test.js",
Expand Down
7 changes: 7 additions & 0 deletions src/__tests__/__snapshots__/apidocConfig.test.js.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`apidocConfig should parse custom settings and return an object 1`] = `
{
"delayResponse": "3000",
}
`;
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`ParseApi return a 401 specific example: parseAuthExample 1`] = `
exports[`apidocParse return a 401 specific example: parseAuthExample 1`] = `
{
"content": "HTTP/1.1 401 Unauthorized
{
Expand All @@ -12,27 +12,27 @@ exports[`ParseApi return a 401 specific example: parseAuthExample 1`] = `
}
`;

exports[`ParseApi should force a response, or a general example: exampleResponse.fallback 1`] = `
exports[`apidocParse should force a response, or a general example: exampleResponse.fallback 1`] = `
{
"content": "Success",
"status": 200,
"type": "text",
}
`;

exports[`ParseApi should force a response, or a general example: exampleResponse.forcedStatus.200 1`] = `
exports[`apidocParse should force a response, or a general example: exampleResponse.forcedStatus.200 1`] = `
{
"status": 200,
}
`;

exports[`ParseApi should force a response, or a general example: exampleResponse.forcedStatus.400 1`] = `
exports[`apidocParse should force a response, or a general example: exampleResponse.forcedStatus.400 1`] = `
{
"status": 400,
}
`;

exports[`ParseApi should parse type and status examples: parseStatus.success.delete 1`] = `
exports[`apidocParse should parse type and status examples: parseStatus.success.delete 1`] = `
[
{
"content": "HTTP/1.1 200 OK
Expand All @@ -47,7 +47,7 @@ exports[`ParseApi should parse type and status examples: parseStatus.success.del
]
`;

exports[`ParseApi should parse type and status examples: parseStatus.success.get 1`] = `
exports[`apidocParse should parse type and status examples: parseStatus.success.get 1`] = `
[
{
"content": "HTTP/1.1 200 OK
Expand All @@ -62,7 +62,7 @@ exports[`ParseApi should parse type and status examples: parseStatus.success.get
]
`;

exports[`ParseApi should return specific properties: specific properties 1`] = `
exports[`apidocParse should return specific properties: specific properties 1`] = `
[
"exampleApiDocResponse",
"exampleResponse",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`BuildApi should build a response with specific properties: buildResponse 1`] = `
exports[`buildApiResponse should build a response with specific properties: buildResponse 1`] = `
{
"appResponses": [
{
Expand All @@ -13,7 +13,7 @@ exports[`BuildApi should build a response with specific properties: buildRespons
}
`;

exports[`BuildApi should build a response with specific properties: buildResponse callback 1`] = `
exports[`buildApiResponse should build a response with specific properties: buildResponse callback 1`] = `
[
[
"Cache-Control",
Expand All @@ -29,15 +29,15 @@ exports[`BuildApi should build a response with specific properties: buildRespons
]
`;

exports[`BuildApi should build specific headers: buildRequestHeaders.request.headers 1`] = `
exports[`buildApiResponse should build specific headers: buildRequestHeaders.request.headers 1`] = `
{
"Access-Control-Allow-Credentials": true,
"Access-Control-Allow-Methods": "GET, PUT, POST, DELETE, HEAD, OPTIONS, PATCH",
"Access-Control-Allow-Origin": "*",
}
`;

exports[`BuildApi should build specific headers: buildRequestHeaders.request.preflight 1`] = `
exports[`buildApiResponse should build specific headers: buildRequestHeaders.request.preflight 1`] = `
{
"Access-Control-Allow-Credentials": true,
"Access-Control-Allow-Headers": "x-test-header",
Expand All @@ -47,7 +47,7 @@ exports[`BuildApi should build specific headers: buildRequestHeaders.request.pre
}
`;

exports[`BuildApi should parse custom mock api settings: parseCustomMockSettings 1`] = `
exports[`buildApiResponse should parse custom mock api settings: parseCustomMockSettings 1`] = `
{
"delay": 2000,
"forceStatus": 401,
Expand All @@ -56,7 +56,7 @@ exports[`BuildApi should parse custom mock api settings: parseCustomMockSettings
}
`;

exports[`BuildApi should parse malformed mock api settings and provide fallbacks: parseCustomMockSettings.delayResponse.malformed 1`] = `
exports[`buildApiResponse should parse malformed mock api settings and provide fallbacks: parseCustomMockSettings.delayResponse.malformed 1`] = `
{
"delay": 1000,
"forceStatus": undefined,
Expand All @@ -65,7 +65,7 @@ exports[`BuildApi should parse malformed mock api settings and provide fallbacks
}
`;

exports[`BuildApi should parse malformed mock api settings and provide fallbacks: parseCustomMockSettings.forceStatus.malformed 1`] = `
exports[`buildApiResponse should parse malformed mock api settings and provide fallbacks: parseCustomMockSettings.forceStatus.malformed 1`] = `
{
"delay": undefined,
"forceStatus": 200,
Expand All @@ -74,7 +74,7 @@ exports[`BuildApi should parse malformed mock api settings and provide fallbacks
}
`;

exports[`BuildApi should parse random mock api settings: parseCustomMockSettings.randomError 1`] = `
exports[`buildApiResponse should parse random mock api settings: parseCustomMockSettings.randomError 1`] = `
{
"delay": undefined,
"forceStatus": undefined,
Expand All @@ -83,7 +83,7 @@ exports[`BuildApi should parse random mock api settings: parseCustomMockSettings
}
`;

exports[`BuildApi should parse random mock api settings: parseCustomMockSettings.randomSuccess 1`] = `
exports[`buildApiResponse should parse random mock api settings: parseCustomMockSettings.randomSuccess 1`] = `
{
"delay": undefined,
"forceStatus": undefined,
Expand All @@ -92,14 +92,14 @@ exports[`BuildApi should parse random mock api settings: parseCustomMockSettings
}
`;

exports[`BuildApi should return a mock mime type and parsed content: parseContentAndType 1`] = `
exports[`buildApiResponse should return a mock mime type and parsed content: parseContentAndType 1`] = `
{
"content": ""{\\n \\"foo\\": \\"hello\\",\\n \\"bar\\": \\"world\\"\\n}"",
"contentType": "application/json",
}
`;

exports[`BuildApi should return a mock mime type and parsed content: parseContentAndType.fallback 1`] = `
exports[`buildApiResponse should return a mock mime type and parsed content: parseContentAndType.fallback 1`] = `
{
"content": "{
"foo": "hello",
Expand All @@ -109,7 +109,7 @@ exports[`BuildApi should return a mock mime type and parsed content: parseConten
}
`;

exports[`BuildApi should return a mock mime type and parsed content: parseContentAndType.passthrough 1`] = `
exports[`buildApiResponse should return a mock mime type and parsed content: parseContentAndType.passthrough 1`] = `
{
"content": "{
"foo": "hello",
Expand All @@ -119,21 +119,21 @@ exports[`BuildApi should return a mock mime type and parsed content: parseConten
}
`;

exports[`BuildApi should return a mock mime type and parsed content: parseContentAndType.svg 1`] = `
exports[`buildApiResponse should return a mock mime type and parsed content: parseContentAndType.svg 1`] = `
{
"content": "<lorem><ipsum dolor="sit" /></lorem>",
"contentType": "image/svg+xml",
}
`;

exports[`BuildApi should return a mock mime type and parsed content: parseContentAndType.xml 1`] = `
exports[`buildApiResponse should return a mock mime type and parsed content: parseContentAndType.xml 1`] = `
{
"content": "<lorem><ipsum dolor="sit" /></lorem>",
"contentType": "text/xml",
}
`;

exports[`BuildApi should return specific properties: specific properties 1`] = `
exports[`buildApiResponse should return specific properties: specific properties 1`] = `
[
"buildResponse",
"buildRequestHeaders",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const { setupDocs } = require('../buildDocs');
const { OPTIONS } = require('../../global');
const { setupDocs } = require('../apidocBuild');
const { OPTIONS } = require('../global');

describe('BuildDocs', () => {
describe('apidocBuild', () => {
it('should have specific defined properties', () => {
expect(setupDocs()).toBeDefined();
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const { parse, path, getGroup, method } = require('../configDocs');
const { parse, path, getGroup, method } = require('../apidocConfig');

describe('ConfigDocs', () => {
describe('apidocConfig', () => {
it('should have specific defined properties', () => {
expect(parse).toBeDefined();
expect(path).toBeDefined();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
const parseApi = require('../parseApi');
const { exampleResponse, parseAuthExample, parseStatus } = parseApi;
const apidocParse = require('../apidocParse');
const { exampleResponse, parseAuthExample, parseStatus } = apidocParse;

describe('ParseApi', () => {
describe('apidocParse', () => {
it('should return specific properties', () => {
expect(Object.keys(parseApi)).toMatchSnapshot('specific properties');
expect(Object.keys(apidocParse)).toMatchSnapshot('specific properties');
});

it('should force a response, or a general example', () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
const buildApi = require('../buildApi');
const { buildRequestHeaders, buildResponse, getContentAndType, getCustomMockSettings } = buildApi;
const buildApiResponse = require('../buildApiResponse');
const { buildRequestHeaders, buildResponse, getContentAndType, getCustomMockSettings } = buildApiResponse;

describe('BuildApi', () => {
describe('buildApiResponse', () => {
it('should return specific properties', () => {
expect(Object.keys(buildApi)).toMatchSnapshot('specific properties');
expect(Object.keys(buildApiResponse)).toMatchSnapshot('specific properties');
});

it('should build specific headers', () => {
Expand Down
8 changes: 4 additions & 4 deletions src/docs/buildDocs.js → src/apidocBuild.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const apidoc = require('apidoc');
const { logger } = require('../logger/configLogger');
const { OPTIONS } = require('../global');
const { logger } = require('./logger');
const { OPTIONS } = require('./global');

/**
* Build ApiDoc documentation.
Expand All @@ -27,10 +27,10 @@ const setupDocs = ({ apiDocBaseConfig, watchPath: src, docsPath: dest, silent }
try {
const { data } = apidoc.createDoc(apiDocsConfig);
const updatedResult = JSON.parse(data);
logger.info('buildDocs.read.apiJsonFile');
logger.info('apidocBuild.read.apiJsonFile');
return updatedResult;
} catch (e) {
logger.error(`buildDocs.apiDoc.createDoc[${e.message}]`);
logger.error(`apidocBuild.apiDoc.createDoc[${e.message}]`);
}

return [];
Expand Down
File renamed without changes.
4 changes: 2 additions & 2 deletions src/api/parseApi.js → src/apidocParse.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const { logger } = require('../logger/configLogger');
const { memo } = require('../global');
const { logger } = require('./logger');
const { memo } = require('./global');

/**
* Return a 401 specific example.
Expand Down
6 changes: 3 additions & 3 deletions src/api/buildApi.js → src/buildApiResponse.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const { logger } = require('../logger/configLogger');
const { exampleApiDocResponse } = require('./parseApi');
const { memo } = require('../global');
const { logger } = require('./logger');
const { exampleApiDocResponse } = require('./apidocParse');
const { memo } = require('./global');

/**
* Parse custom mock settings.
Expand Down
7 changes: 0 additions & 7 deletions src/docs/__tests__/__snapshots__/configDocs.test.js.snap

This file was deleted.

2 changes: 1 addition & 1 deletion src/global.js
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ const apiDocBaseConfig = {
dryRun: process.env.NODE_ENV === 'test',
silent: process.env.NODE_ENV === 'test',
parsers: {
apimock: join(__dirname, './docs/configDocs.js')
apimock: join(__dirname, './apidocConfig.js')
}
};

Expand Down
6 changes: 3 additions & 3 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
const express = require('express');
const { createHttpTerminator } = require('http-terminator');
const { OPTIONS } = require('./global');
const { logger } = require('./logger/configLogger');
const { setupDocs } = require('./docs/buildDocs');
const { buildRequestHeaders, buildResponse } = require('./api/buildApi');
const { logger } = require('./logger');
const { setupDocs } = require('./apidocBuild');
const { buildRequestHeaders, buildResponse } = require('./buildApiResponse');
const CACHE = { app: null, httpTerminator: null };

/**
Expand Down
4 changes: 2 additions & 2 deletions src/logger/configLogger.js → src/logger.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ const { colorize, combine, timestamp, printf } = format;
*
* @type {{ error: Function, info: Function, warn: Function }}
*/
const configLogger = createLogger({
const logger = createLogger({
format: combine(
colorize(),
timestamp({
Expand All @@ -18,4 +18,4 @@ const configLogger = createLogger({
silent: process.env.NODE_ENV === 'test'
});

module.exports = { logger: configLogger };
module.exports = { logger };