Skip to content

Commit

Permalink
feat: add flag moveAllToComponents
Browse files Browse the repository at this point in the history
  • Loading branch information
aeworxet committed Mar 25, 2024
1 parent 0958b77 commit 185fa11
Show file tree
Hide file tree
Showing 7 changed files with 94 additions and 6 deletions.
11 changes: 11 additions & 0 deletions API.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,16 @@ This function is used to get the optimized document after seeing the report.
| --- | --- | --- |
| [Options] | [<code>Options</code>](#Options) | the options are a way to customize the final output. |

<a name="findAllComponents"></a>

## findAllComponents(optimizableComponentGroup) ⇒
**Kind**: global function
**Returns**: A list of optimization report elements.

| Param | Description |
| --- | --- |
| optimizableComponentGroup | list of all AsyncAPI Specification-valid components. |

<a name="findDuplicateComponents"></a>

## findDuplicateComponents(optimizableComponentGroup) ⇒
Expand Down Expand Up @@ -132,6 +142,7 @@ Converts JSON or YAML string object.
| --- | --- | --- |
| [reuseComponents] | <code>Boolean</code> | whether to reuse components from `components` section or not. Defaults to `true`. |
| [removeComponents] | <code>Boolean</code> | whether to remove un-used components from `components` section or not. Defaults to `true`. |
| [moveAllToComponents] | <code>Boolean</code> | whether to move all AsyncAPI Specification-valid components to the `components` section or not. Defaults to `true`. |
| [moveDuplicatesToComponents] | <code>Boolean</code> | whether to move duplicated components to the `components` section or not. Defaults to `true`. |

<a name="Options"></a>
Expand Down
3 changes: 2 additions & 1 deletion examples/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ optimizer.getReport().then((report) => {
rules: {
reuseComponents: true,
removeComponents: true,
moveDuplicatesToComponents: true,
moveAllToComponents: true,
moveDuplicatesToComponents: false,
},
})
//store optimizedDocument as to output.yaml
Expand Down
3 changes: 2 additions & 1 deletion src/ComponentProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ export const getOptimizableComponents = (
asyncAPIDocument: AsyncAPIDocumentInterface
): OptimizableComponentGroup[] => {
const optimizeableComponents: OptimizableComponentGroup[] = []

const getAllComponents = (type: string) => {
// @ts-ignore
if (typeof asyncAPIDocument[type] !== 'function') return []
Expand Down Expand Up @@ -84,6 +83,8 @@ export const getOptimizableComponents = (
operationBindings: getAllComponents('operationBindings'),
messageBindings: getAllComponents('messageBindings'),
}
const options = { includeSchemas: false }
!options.includeSchemas && delete optimizableComponents.schemas
for (const [type, components] of Object.entries(optimizableComponents)) {
if (components.length === 0) continue
optimizeableComponents.push({
Expand Down
19 changes: 15 additions & 4 deletions src/Optimizer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@ import {
Reporter,
} from './index.d'
import { Parser } from '@asyncapi/parser'
import { removeComponents, reuseComponents, moveDuplicatesToComponents } from './Reporters'
import {
removeComponents,
reuseComponents,
moveAllToComponents,
moveDuplicatesToComponents,
} from './Reporters'
import YAML from 'js-yaml'
import merge from 'merge-deep'
import * as _ from 'lodash'
Expand Down Expand Up @@ -42,7 +47,12 @@ export class Optimizer {
*/
constructor(private YAMLorJSON: any) {
this.outputObject = toJS(this.YAMLorJSON)
this.reporters = [removeComponents, reuseComponents, moveDuplicatesToComponents]
this.reporters = [
removeComponents,
reuseComponents,
moveAllToComponents,
moveDuplicatesToComponents,
]
}

/**
Expand All @@ -65,7 +75,6 @@ export class Optimizer {
hasParent(reportElement, this.outputObject)
),
}))

const filteredReports = filterReportElements(reportsWithParents)
const sortedReports = filteredReports.map((report) => sortReportElements(report))
this.reports = sortedReports
Expand All @@ -78,6 +87,7 @@ export class Optimizer {
* @typedef {Object} Rules
* @property {Boolean=} reuseComponents - whether to reuse components from `components` section or not. Defaults to `true`.
* @property {Boolean=} removeComponents - whether to remove un-used components from `components` section or not. Defaults to `true`.
* @property {Boolean=} moveAllToComponents - whether to move all AsyncAPI Specification-valid components to the `components` section or not.
* @property {Boolean=} moveDuplicatesToComponents - whether to move duplicated components to the `components` section or not. Defaults to `true`.
*/

Expand All @@ -98,7 +108,8 @@ export class Optimizer {
rules: {
reuseComponents: true,
removeComponents: true,
moveDuplicatesToComponents: true,
moveAllToComponents: true,
moveDuplicatesToComponents: false, // there is no need to move duplicates if `moveAllToComponents` is true
},
output: Output.YAML,
}
Expand Down
1 change: 1 addition & 0 deletions src/Reporters/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './moveAllToComponents'
export * from './moveDuplicatesToComponents'
export * from './RemoveComponents'
export * from './ReuseComponents'
61 changes: 61 additions & 0 deletions src/Reporters/moveAllToComponents.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { Action } from '../Optimizer'
import { createReport, isEqual, isInComponents } from '../Utils'
import { OptimizableComponent, OptimizableComponentGroup, ReportElement, Reporter } from 'index.d'
import Debug from 'debug'
const debug = Debug('reporter:moveAllToComponents')
/**
*
* @param optimizableComponentGroup all AsyncAPI Specification-valid components.
* @returns A list of optimization report elements.
*/
const findAllComponents = (
optimizableComponentGroup: OptimizableComponentGroup
): ReportElement[] => {
const allComponents = optimizableComponentGroup.components
const insideComponentsSection = allComponents.filter(isInComponents)
const outsideComponentsSection = getOutsideComponents(allComponents, insideComponentsSection)

const resultElements: ReportElement[] = []

for (const [index, component] of outsideComponentsSection.entries()) {
const existingResult = resultElements.filter(
(reportElement) => component.path === reportElement.path
)[0]
if (!existingResult) {
let componentName: string
if (component.component['x-origin']) {
componentName = String(component.component['x-origin']).split('/').reverse()[0]
} else {
componentName = String(component.path).split('.')[1]
}
const target = `components.${optimizableComponentGroup.type}.${componentName}`
resultElements.push({
path: component.path,
action: Action.Move,
target,
})
}
}
debug(
'all %s: %O',
optimizableComponentGroup.type,
resultElements.map((element) => element.path)
)
return resultElements
}

export const moveAllToComponents: Reporter = (optimizableComponentsGroup) => {
return createReport(findAllComponents, optimizableComponentsGroup, 'moveAllToComponents')
}

function getOutsideComponents(
allComponents: OptimizableComponent[],
insideComponentsSection: OptimizableComponent[]
) {
return allComponents.filter(
(component) =>
!isInComponents(component) &&
insideComponentsSection.filter((inCSC) => isEqual(component.component, inCSC.component, true))
.length === 0
)
}
2 changes: 2 additions & 0 deletions src/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export type OptimizableComponentGroup = {
export interface Report {
reuseComponents?: ReportElement[]
removeComponents?: ReportElement[]
moveAllToComponents?: ReportElement[]
moveDuplicatesToComponents?: ReportElement[]
}

Expand All @@ -32,6 +33,7 @@ export type Reporter = (optimizeableComponents: OptimizableComponentGroup[]) =>
interface Rules {
reuseComponents?: boolean
removeComponents?: boolean
moveAllToComponents?: boolean
moveDuplicatesToComponents?: boolean
}
export interface Options {
Expand Down

0 comments on commit 185fa11

Please sign in to comment.