Skip to content

Commit

Permalink
feat: add baseDir option
Browse files Browse the repository at this point in the history
  • Loading branch information
Souvikns committed Feb 12, 2024
1 parent 8524439 commit a42c48d
Show file tree
Hide file tree
Showing 7 changed files with 117 additions and 5 deletions.
10 changes: 7 additions & 3 deletions example/v3/bundle.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,18 @@ const {readFileSync, writeFileSync} = require('fs')
async function main() {
await singleFile()
await multiFile()
await singleFileWithBaseDir()
}


async function singleFile(){
const document = await bundle([readFileSync('./main.yaml', 'utf-8')] )
async function singleFileWithBaseDir(){
const document = await bundle([readFileSync('./spec/main.yaml', 'utf-8')], {baseDir: './spec'})
writeFileSync('asyncapi.yaml', document.yml())
}

async function singleFile(){
const document = await bundle([readFileSync('./spec/main.yaml', 'utf-8')], {baseDir: './spec'})
writeFileSync('asyncapi.yaml', document.yml())

}

async function multiFile(){
Expand Down
3 changes: 2 additions & 1 deletion example/v3/package-lock.json

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

34 changes: 34 additions & 0 deletions example/v3/spec/main.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
asyncapi: 3.0.0
info:
title: Account Service
version: 1.0.0
description: This service is in charge of processing user signupsA
channels:
userSignedup:
address: 'user/signedup'
messages:
userSignedUpMessage:
$ref: './messages.yaml#/messages/UserSignedUp'
test:
address: '/test'
messages:
testMessage:
$ref: '#/components/messages/TestMessage'
operations:
UserSignedUp:
action: send
channel:
$ref: '#/channels/userSignedup'
messages:
- $ref: './messages.yaml#/messages/UserSignedUp'
TestOpp:
action: send
channel:
$ref: '#/channels/test'
messages:
- $ref: '#/components/messages/TestMessage'
components:
messages:
TestMessage:
payload:
type: string
17 changes: 17 additions & 0 deletions example/v3/spec/messages.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
messages:
UserSignedUp:
payload:
type: object
properties:
displayName:
type: string
description: Name of the user
email:
type: string
format: email
description: Email of the user
UserLoggedIn:
payload:
type: object
properties:
id: string
6 changes: 5 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { toJS, resolve, versionCheck } from './util';
import { toJS, resolve, versionCheck, resolveBaseFileDir } from './util';
import { Document } from './document';
import { parse } from './parser';

Expand Down Expand Up @@ -80,6 +80,10 @@ export default async function bundle(files: string[], options: any = {}) {

const parsedJsons = files.map(file => toJS(file)) as AsyncAPIObject[];

if (typeof options.baseDir !== 'undefined') {
parsedJsons.forEach( parsedJson => resolveBaseFileDir(parsedJson, options.baseDir))
}

const majorVersion = versionCheck(parsedJsons);
let resolvedJsons;

Expand Down
51 changes: 51 additions & 0 deletions src/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@ import { cloneDeep } from 'lodash';
import yaml from 'js-yaml';
import { parse } from './parser';
import { ParserError } from './errors';
import {JSONPath} from 'jsonpath-plus';

import type { AsyncAPIObject } from './spec-types';
import path from 'path';
import { parentPort } from 'worker_threads';

/**
* @private
Expand Down Expand Up @@ -99,4 +102,52 @@ export function versionCheck(asyncapiDocuments: AsyncAPIObject[]): number {
currentVersion = majorVersion;
}
return currentVersion;
}

export function isExternalReference(ref: string): boolean {
return typeof ref === 'string' && !ref.startsWith('#')
}

export function notAUrl(ref: string): boolean {
try {
new URL(ref)
return false
} catch (error) {
return true
}
}

export function resolveBaseFileDir(file: object, baseFileDir: string) {
/**
* Update the local refences in a given file with the
* absolute file path using the baseDir passed by the
* user as an option.
*/
JSONPath({
json: file,
resultType: 'all',
path: '$.channels.*.messages.*'
}).forEach( ({parent, parentProperty}: {parent: any, parentProperty: string}) => {
const ref = parent[String(parentProperty)]['$ref']
if (isExternalReference(ref) && notAUrl(ref)) {
// console.log(ref)
// console.log(path.resolve(baseFileDir, ref))
parent[String(parentProperty)]['$ref'] = path.resolve(baseFileDir, ref)
}
})

JSONPath({
json: file,
resultType: 'all',
path: '$.operations.*.messages.*'
}).forEach(
({parent, parentProperty}: {parent: any, parentProperty: string}) => {
const ref = parent[String(parentProperty)]['$ref']
if (isExternalReference(ref) && notAUrl(ref)) {
// console.log(ref)
// console.log(path.resolve(baseFileDir, ref))
parent[String(parentProperty)]['$ref'] = path.resolve(baseFileDir, ref)
}
}
)
}
1 change: 1 addition & 0 deletions src/v3/parser.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import $RefParser, {$Refs} from '@apidevtools/json-schema-ref-parser';
import { JSONPath } from 'jsonpath-plus';
import { merge } from 'lodash';
import path from 'path';

import { AsyncAPIObject } from 'spec-types';

Expand Down

0 comments on commit a42c48d

Please sign in to comment.