@asyncapi/generator 2.7.0 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +43 -0
- package/docs/api.md +33 -0
- package/docs/baked-in-templates.md +100 -0
- package/docs/configuration-file.md +49 -31
- package/docs/template.md +22 -3
- package/lib/generator.js +31 -3
- package/lib/templates/BakedInTemplatesList.json +20 -0
- package/lib/templates/bakedInTemplates.js +53 -0
- package/package.json +9 -5
- package/test/__mocks__/@npmcli/arborist.js +0 -11
- package/test/__mocks__/@npmcli/config.js +0 -3
- package/test/__mocks__/fs.extra.js +0 -3
- package/test/__mocks__/loglevel.js +0 -3
- package/test/__mocks__/resolve-from.js +0 -8
- package/test/__mocks__/resolve-pkg.js +0 -8
- package/test/__snapshots__/integration.test.js.snap +0 -419
- package/test/docs/apiwithref.json +0 -41
- package/test/docs/dummy.yml +0 -390
- package/test/docs/dummyV3.yml +0 -31
- package/test/docs/shared.json +0 -27
- package/test/docs/ws.yml +0 -36
- package/test/generator.test.js +0 -629
- package/test/hooksRegistry.test.js +0 -173
- package/test/integration.test.js +0 -203
- package/test/parser.test.js +0 -205
- package/test/renderer.test.js +0 -62
- package/test/templateConfigValidator.test.js +0 -294
- package/test/test-project/.yarncr.yml +0 -3
- package/test/test-project/README.md +0 -8
- package/test/test-project/docker-compose.yml +0 -16
- package/test/test-project/package.json +0 -24
- package/test/test-project/test-global.test.js +0 -37
- package/test/test-project/test-project.test.js +0 -102
- package/test/test-project/test-registry.test.js +0 -62
- package/test/test-project/test.sh +0 -104
- package/test/test-project/verdaccio/config.yaml +0 -22
- package/test/test-project/verdaccio/htpasswd +0 -1
- package/test/test-templates/nunjucks-template/package-lock.json +0 -4062
- package/test/test-templates/nunjucks-template/package.json +0 -21
- package/test/test-templates/nunjucks-template/template/test-file.md +0 -5
- package/test/test-templates/react-template/.ageneratorrc +0 -33
- package/test/test-templates/react-template/package.json +0 -14
- package/test/test-templates/react-template/template/conditionalFile.txt +0 -0
- package/test/test-templates/react-template/template/conditionalFolder/conditionalFile.txt +0 -0
- package/test/test-templates/react-template/template/conditionalFolder2/input.txt +0 -0
- package/test/test-templates/react-template/template/models.js +0 -6
- package/test/test-templates/react-template/template/test-file.md.js +0 -11
- package/test/utils.test.js +0 -129
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @jest-environment node
|
|
3
|
-
*/
|
|
4
|
-
const fs = require('fs');
|
|
5
|
-
const path = require('path');
|
|
6
|
-
const { addHook, registerLocalHooks, registerConfigHooks, registerHooks } = require('../lib/hooksRegistry');
|
|
7
|
-
|
|
8
|
-
jest.mock('fs');
|
|
9
|
-
jest.mock('path');
|
|
10
|
-
|
|
11
|
-
describe('hooksRegistry', () => {
|
|
12
|
-
let hooks;
|
|
13
|
-
|
|
14
|
-
beforeEach(() => {
|
|
15
|
-
hooks = {}; // reset hooks for each test
|
|
16
|
-
jest.clearAllMocks(); // Reset all mocks
|
|
17
|
-
jest.resetModules(); // Reset modules
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
describe('registerHooks', () => {
|
|
21
|
-
it('registers both local and config hooks', async () => {
|
|
22
|
-
const templateDir = path.join(__dirname, 'fixtures', 'template', 'hooks');
|
|
23
|
-
const hooksDir = path.join(__dirname, 'hooks');
|
|
24
|
-
|
|
25
|
-
fs.mkdirSync(hooksDir, { recursive: true });
|
|
26
|
-
fs.writeFileSync(path.join(hooksDir, 'preGenerate.js'), `
|
|
27
|
-
module.exports = function localPreGenerateHook() {};
|
|
28
|
-
`);
|
|
29
|
-
|
|
30
|
-
const templateConfig = {
|
|
31
|
-
hooks: {
|
|
32
|
-
'@asyncapi/hooks-module': ['configPreGenerateHook']
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
jest.mock('@asyncapi/hooks-module', () => ({
|
|
37
|
-
preGenerate: [function configPreGenerateHook() {}]
|
|
38
|
-
}), { virtual: true });
|
|
39
|
-
|
|
40
|
-
const result = await registerHooks(hooks, templateConfig, templateDir, 'hooks');
|
|
41
|
-
|
|
42
|
-
expect(result.preGenerate).toHaveLength(1);
|
|
43
|
-
expect(result.preGenerate[0].name).toBe('configPreGenerateHook');
|
|
44
|
-
|
|
45
|
-
fs.rmSync(hooksDir, { recursive: true, force: true });
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
describe('registerLocalHooks', () => {
|
|
50
|
-
const mockPreGenerateHook = function preGenerateHook() {};
|
|
51
|
-
|
|
52
|
-
beforeAll(() => {
|
|
53
|
-
path.join.mockImplementation((...args) => args.join('/'));
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
beforeEach(() => {
|
|
57
|
-
fs.existsSync.mockReturnValue(true);
|
|
58
|
-
fs.readdirSync.mockReturnValue(['preGenerate.js']);
|
|
59
|
-
|
|
60
|
-
jest.mock('fixtures/template/hooks/preGenerate.js', () => mockPreGenerateHook, { virtual: true });
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it('handles missing hooks directory', async () => {
|
|
64
|
-
fs.existsSync.mockReturnValueOnce(false);
|
|
65
|
-
|
|
66
|
-
const result = await registerLocalHooks(hooks, '/non/existent/path', 'hooks');
|
|
67
|
-
expect(result).toBe(hooks);
|
|
68
|
-
expect(result.preGenerate).toBeUndefined();
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it('handles errors during hook loading', async () => {
|
|
72
|
-
fs.existsSync.mockReturnValue(true);
|
|
73
|
-
fs.readdirSync.mockReturnValue(['errorHook.js']);
|
|
74
|
-
|
|
75
|
-
jest.mock('fixtures/template/hooks/errorHook.js', () => {
|
|
76
|
-
throw new Error('Mock import error');
|
|
77
|
-
}, { virtual: true });
|
|
78
|
-
|
|
79
|
-
await expect(registerLocalHooks(hooks, 'fixtures/template', 'hooks'))
|
|
80
|
-
.resolves.not.toThrow();
|
|
81
|
-
|
|
82
|
-
expect(hooks).toEqual({});
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
describe('registerConfigHooks', () => {
|
|
87
|
-
it('registers hooks from template config', async () => {
|
|
88
|
-
const templateDir = path.join(__dirname, 'fixtures', 'template');
|
|
89
|
-
const templateConfig = {
|
|
90
|
-
hooks: {
|
|
91
|
-
'@asyncapi/hooks-module': ['preGenerateHook']
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
// Mock the hook module
|
|
96
|
-
jest.mock('@asyncapi/hooks-module', () => ({
|
|
97
|
-
preGenerate: [function preGenerateHook() {}]
|
|
98
|
-
}), { virtual: true });
|
|
99
|
-
|
|
100
|
-
const result = await registerConfigHooks(hooks, templateDir, templateConfig);
|
|
101
|
-
|
|
102
|
-
expect(result.preGenerate).toHaveLength(1);
|
|
103
|
-
expect(result.preGenerate[0].name).toBe('preGenerateHook');
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it('handles missing hooks in config', async () => {
|
|
107
|
-
const result = await registerConfigHooks(hooks, '', {});
|
|
108
|
-
expect(result).toBeUndefined();
|
|
109
|
-
expect(hooks).toEqual({});
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
describe('addHooks', () => {
|
|
114
|
-
it('adds hooks from module to hooks object', () => {
|
|
115
|
-
const mod = {
|
|
116
|
-
preGenerate: [function preGenerateHook() {}],
|
|
117
|
-
postGenerate: [function postGenerateHook() {}]
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
addHook(hooks, mod, null);
|
|
121
|
-
|
|
122
|
-
expect(hooks.preGenerate).toHaveLength(1);
|
|
123
|
-
expect(hooks.postGenerate).toHaveLength(1);
|
|
124
|
-
expect(hooks.preGenerate[0].name).toBe('preGenerateHook');
|
|
125
|
-
expect(hooks.postGenerate[0].name).toBe('postGenerateHook');
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
it('adds hooks from module.default if it exists', () => {
|
|
129
|
-
const mod = {
|
|
130
|
-
default: {
|
|
131
|
-
preGenerate: [function preGenerateHook() {}],
|
|
132
|
-
postGenerate: [function postGenerateHook() {}]
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
addHook(hooks, mod, null);
|
|
137
|
-
|
|
138
|
-
expect(hooks.preGenerate).toHaveLength(1);
|
|
139
|
-
expect(hooks.postGenerate).toHaveLength(1);
|
|
140
|
-
expect(hooks.preGenerate[0].name).toBe('preGenerateHook');
|
|
141
|
-
expect(hooks.postGenerate[0].name).toBe('postGenerateHook');
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
it('does not add hooks that are not in config', () => {
|
|
145
|
-
const mod = {
|
|
146
|
-
preGenerate: [function preGenerateHook() {}],
|
|
147
|
-
postGenerate: [function postGenerateHook() {}]
|
|
148
|
-
};
|
|
149
|
-
const config = ['preGenerateHook'];
|
|
150
|
-
|
|
151
|
-
addHook(hooks, mod, config);
|
|
152
|
-
|
|
153
|
-
expect(hooks.preGenerate).toHaveLength(1);
|
|
154
|
-
expect(hooks.postGenerate).toBeUndefined();
|
|
155
|
-
expect(hooks.preGenerate[0].name).toBe('preGenerateHook');
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
it('adds hooks that are in config', () => {
|
|
159
|
-
const mod = {
|
|
160
|
-
preGenerate: [function preGenerateHook() {}],
|
|
161
|
-
postGenerate: [function postGenerateHook() {}]
|
|
162
|
-
};
|
|
163
|
-
const config = ['preGenerateHook', 'postGenerateHook'];
|
|
164
|
-
|
|
165
|
-
addHook(hooks, mod, config);
|
|
166
|
-
|
|
167
|
-
expect(hooks.preGenerate).toHaveLength(1);
|
|
168
|
-
expect(hooks.postGenerate).toHaveLength(1);
|
|
169
|
-
expect(hooks.preGenerate[0].name).toBe('preGenerateHook');
|
|
170
|
-
expect(hooks.postGenerate[0].name).toBe('postGenerateHook');
|
|
171
|
-
});
|
|
172
|
-
});
|
|
173
|
-
});
|
package/test/integration.test.js
DELETED
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @jest-environment node
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
const path = require('path');
|
|
6
|
-
const { readFile, writeFile, access, mkdir } = require('fs').promises;
|
|
7
|
-
const { copy } = require('fs-extra');
|
|
8
|
-
const Generator = require('../lib/generator');
|
|
9
|
-
const dummySpecPath = path.resolve(__dirname, './docs/dummy.yml');
|
|
10
|
-
const refSpecPath = path.resolve(__dirname, './docs/apiwithref.json');
|
|
11
|
-
const refSpecFolder = path.resolve(__dirname, './docs/');
|
|
12
|
-
const crypto = require('crypto');
|
|
13
|
-
const mainTestResultPath = path.resolve(__dirname, './temp/integrationTestResult');
|
|
14
|
-
const reactTemplate = path.resolve(__dirname, './test-templates/react-template');
|
|
15
|
-
const nunjucksTemplate = path.resolve(__dirname, './test-templates/nunjucks-template');
|
|
16
|
-
//temp location where react template is copied for each test that does some mutation on template files
|
|
17
|
-
const copyOfReactTemplate = path.resolve(__dirname, './temp/reactTemplate');
|
|
18
|
-
|
|
19
|
-
describe('Integration testing generateFromFile() to make sure the result of the generation is not changend comparing to snapshot', () => {
|
|
20
|
-
const generateFolderName = () => {
|
|
21
|
-
//you always want to generate to new directory to make sure test runs in clear environment
|
|
22
|
-
return path.resolve(mainTestResultPath, crypto.randomBytes(4).toString('hex'));
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const getCleanReactTemplate = async () => {
|
|
26
|
-
//for each test new react template is needed in unique location
|
|
27
|
-
const newReactTemplateLocation = path.resolve(copyOfReactTemplate, crypto.randomBytes(4).toString('hex'));
|
|
28
|
-
await copy(reactTemplate, newReactTemplateLocation);
|
|
29
|
-
return newReactTemplateLocation;
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
jest.setTimeout(100000);
|
|
33
|
-
const testOutputFile = 'test-file.md';
|
|
34
|
-
|
|
35
|
-
const tempJsContent = `
|
|
36
|
-
import { File, Text } from '@asyncapi/generator-react-sdk';
|
|
37
|
-
|
|
38
|
-
export default function() {
|
|
39
|
-
return (
|
|
40
|
-
<File name="temp.md">
|
|
41
|
-
<Text>Test</Text>
|
|
42
|
-
</File>
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
`;
|
|
46
|
-
|
|
47
|
-
it('generated using Nunjucks template', async () => {
|
|
48
|
-
const outputDir = generateFolderName();
|
|
49
|
-
const generator = new Generator(nunjucksTemplate, outputDir, {
|
|
50
|
-
forceWrite: true,
|
|
51
|
-
templateParams: { version: 'v1', mode: 'production' }
|
|
52
|
-
});
|
|
53
|
-
await generator.generateFromFile(dummySpecPath);
|
|
54
|
-
const file = await readFile(path.join(outputDir, testOutputFile), 'utf8');
|
|
55
|
-
expect(file).toMatchSnapshot();
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it('generate using React template', async () => {
|
|
59
|
-
const outputDir = generateFolderName();
|
|
60
|
-
const generator = new Generator(reactTemplate, outputDir, {
|
|
61
|
-
forceWrite: true ,
|
|
62
|
-
templateParams: { version: 'v1', mode: 'production' }
|
|
63
|
-
});
|
|
64
|
-
await generator.generateFromFile(dummySpecPath);
|
|
65
|
-
const mdFile = await readFile(path.join(outputDir, testOutputFile), 'utf8');
|
|
66
|
-
//react template has hooks lib enabled and generation of asyncapi document that was passed as input should work out of the box without adding @asyncapi/generator-hooks to dependencies
|
|
67
|
-
const asyncAPIFile = await readFile(path.join(outputDir, 'asyncapi.yaml'), 'utf8');
|
|
68
|
-
expect(mdFile).toMatchSnapshot();
|
|
69
|
-
expect(asyncAPIFile).toMatchSnapshot();
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it('generate json based api with referenced JSON Schema', async () => {
|
|
73
|
-
const outputDir = generateFolderName();
|
|
74
|
-
const generator = new Generator(reactTemplate, outputDir, {
|
|
75
|
-
mapBaseUrlToFolder: { url: 'https://schema.example.com/crm/', folder: `${refSpecFolder}/`},
|
|
76
|
-
forceWrite: true,
|
|
77
|
-
templateParams: { version: 'v1', mode: 'production' }
|
|
78
|
-
});
|
|
79
|
-
await generator.generateFromFile(refSpecPath);
|
|
80
|
-
const file = await readFile(path.join(outputDir, testOutputFile), 'utf8');
|
|
81
|
-
expect(file).toMatchSnapshot();
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('check if the temp.md file is created with compile option true', async () => {
|
|
85
|
-
const outputDir = generateFolderName();
|
|
86
|
-
const cleanReactTemplate = await getCleanReactTemplate();
|
|
87
|
-
// Create temp.md.js file dynamically
|
|
88
|
-
|
|
89
|
-
const tempJsPath = path.join(cleanReactTemplate, 'template/temp.md.js');
|
|
90
|
-
// Create temp.md.js file dynamically
|
|
91
|
-
await writeFile(tempJsPath, tempJsContent);
|
|
92
|
-
|
|
93
|
-
const generator = new Generator(cleanReactTemplate, outputDir, {
|
|
94
|
-
forceWrite: true,
|
|
95
|
-
compile: true,
|
|
96
|
-
debug: true,
|
|
97
|
-
});
|
|
98
|
-
await generator.generateFromFile(dummySpecPath);
|
|
99
|
-
|
|
100
|
-
const tempMdPath = path.join(outputDir, 'temp.md');
|
|
101
|
-
|
|
102
|
-
// Check the content of temp.md
|
|
103
|
-
const tempMdContent = await readFile(tempMdPath, 'utf8');
|
|
104
|
-
expect(tempMdContent.trim()).toBe('Test');
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it('check if the temp.md file is not created when compile option is false', async () => {
|
|
108
|
-
const outputDir = generateFolderName();
|
|
109
|
-
const cleanReactTemplate = await getCleanReactTemplate();
|
|
110
|
-
// Create temp.md.js file dynamically
|
|
111
|
-
const tempJsPath = path.join(cleanReactTemplate, 'template/temp.md.js');
|
|
112
|
-
await writeFile(tempJsPath, tempJsContent);
|
|
113
|
-
|
|
114
|
-
const generator = new Generator(cleanReactTemplate, outputDir, {
|
|
115
|
-
forceWrite: true,
|
|
116
|
-
compile: false,
|
|
117
|
-
debug: true
|
|
118
|
-
});
|
|
119
|
-
await generator.generateFromFile(dummySpecPath);
|
|
120
|
-
|
|
121
|
-
// Check if temp.md is not created in the output directory
|
|
122
|
-
const tempMdPath = path.join(outputDir, 'temp.md');
|
|
123
|
-
const tempMdExists = await access(tempMdPath).then(() => true).catch(() => false);
|
|
124
|
-
expect(tempMdExists).toBe(false);
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
it('should ignore specified files with noOverwriteGlobs', async () => {
|
|
128
|
-
const outputDir = generateFolderName();
|
|
129
|
-
const cleanReactTemplate = await getCleanReactTemplate();
|
|
130
|
-
// Manually create a file to test if it's not overwritten
|
|
131
|
-
await mkdir(outputDir, { recursive: true });
|
|
132
|
-
// Create a variable to store the file content
|
|
133
|
-
const testContent = '<script>const initialContent = "This should not change";</script>';
|
|
134
|
-
// eslint-disable-next-line sonarjs/no-duplicate-string
|
|
135
|
-
const testFilePath = path.normalize(path.resolve(outputDir, testOutputFile));
|
|
136
|
-
await writeFile(testFilePath, testContent);
|
|
137
|
-
|
|
138
|
-
// Manually create an output first, before generation, with additional custom file to validate if later it is still there, not overwritten
|
|
139
|
-
const generator = new Generator(cleanReactTemplate, outputDir, {
|
|
140
|
-
forceWrite: true,
|
|
141
|
-
noOverwriteGlobs: [`**/${testOutputFile}`],
|
|
142
|
-
debug: true,
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
await generator.generateFromFile(dummySpecPath);
|
|
146
|
-
|
|
147
|
-
// Read the file to confirm it was not overwritten
|
|
148
|
-
const fileContent = await readFile(testFilePath, 'utf8');
|
|
149
|
-
// Check if the files have been overwritten
|
|
150
|
-
expect(fileContent).toBe(testContent);
|
|
151
|
-
// Check if the log debug message was printed
|
|
152
|
-
/*TODO:
|
|
153
|
-
Include log message test in the future to ensure that the log.debug for skipping overwrite is called
|
|
154
|
-
*/
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it('should not generate the conditionalFolder if the singleFolder parameter is set true', async () => {
|
|
158
|
-
const outputDir = generateFolderName();
|
|
159
|
-
const generator = new Generator(reactTemplate, outputDir, {
|
|
160
|
-
forceWrite: true ,
|
|
161
|
-
templateParams: { version: 'v1', mode: 'production', singleFolder: 'true' }
|
|
162
|
-
});
|
|
163
|
-
await generator.generateFromFile(dummySpecPath);
|
|
164
|
-
const conditionalFolderPath = path.join(outputDir, 'conditionalFolder');
|
|
165
|
-
const exists = await access(conditionalFolderPath).then(() => true).catch(() => false);
|
|
166
|
-
expect(exists).toBe(false);
|
|
167
|
-
});
|
|
168
|
-
it('should not generate the conditionalFile if the singleFile parameter is set true', async () => {
|
|
169
|
-
const outputDir = generateFolderName();
|
|
170
|
-
const generator = new Generator(reactTemplate, outputDir, {
|
|
171
|
-
forceWrite: true ,
|
|
172
|
-
templateParams: { version: 'v1', mode: 'production', singleFile: 'true' }
|
|
173
|
-
});
|
|
174
|
-
await generator.generateFromFile(dummySpecPath);
|
|
175
|
-
const conditionalFilePath = path.join(outputDir, 'conditionalFile.txt');
|
|
176
|
-
const exists = await readFile(conditionalFilePath).then(() => true).catch(() => false);
|
|
177
|
-
expect(exists).toBe(false);
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
it('should generate the conditionalFile if the singleFile parameter is set false', async () => {
|
|
181
|
-
const outputDir = generateFolderName();
|
|
182
|
-
const generator = new Generator(reactTemplate, outputDir, {
|
|
183
|
-
forceWrite: true ,
|
|
184
|
-
templateParams: { version: 'v1', mode: 'production', singleFile: 'false' }
|
|
185
|
-
});
|
|
186
|
-
await generator.generateFromFile(dummySpecPath);
|
|
187
|
-
const conditionalFilePath = path.join(outputDir, 'conditionalFile.txt');
|
|
188
|
-
const exists = await readFile(conditionalFilePath).then(() => true).catch(() => false);
|
|
189
|
-
expect(exists).toBe(true);
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
it('should generate the conditionalFile if the singleFile parameter is set false using enum validation', async () => {
|
|
193
|
-
const outputDir = generateFolderName();
|
|
194
|
-
const generator = new Generator(reactTemplate, outputDir, {
|
|
195
|
-
forceWrite: true ,
|
|
196
|
-
templateParams: { version: 'v1', mode: 'production', singleFile: 'false' }
|
|
197
|
-
});
|
|
198
|
-
await generator.generateFromFile(dummySpecPath);
|
|
199
|
-
const conditionalFilePath = path.join(outputDir, 'conditionalFolder2/input.txt');
|
|
200
|
-
const exists = await readFile(conditionalFilePath).then(() => true).catch(() => false);
|
|
201
|
-
expect(exists).toBe(true);
|
|
202
|
-
});
|
|
203
|
-
});
|
package/test/parser.test.js
DELETED
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
const { sanitizeTemplateApiVersion, usesNewAPI, parse, convertOldOptionsToNew } = require('../lib/parser');
|
|
4
|
-
const dummyV2Document = fs.readFileSync(path.resolve(__dirname, './docs/dummy.yml'), 'utf8');
|
|
5
|
-
const dummyV3Document = fs.readFileSync(path.resolve(__dirname, './docs/dummyV3.yml'), 'utf8');
|
|
6
|
-
|
|
7
|
-
describe('Parser', () => {
|
|
8
|
-
describe('sanitizeTemplateApiVersion', () => {
|
|
9
|
-
it('should return version number when given `v99` syntax', () => {
|
|
10
|
-
const rawVersion = 'v99';
|
|
11
|
-
const expectedVersion = 99;
|
|
12
|
-
const sanitizedVersion = sanitizeTemplateApiVersion(rawVersion);
|
|
13
|
-
|
|
14
|
-
expect(sanitizedVersion).toStrictEqual(expectedVersion);
|
|
15
|
-
});
|
|
16
|
-
it('should return version number when given `v1` syntax', () => {
|
|
17
|
-
const rawVersion = 'v1';
|
|
18
|
-
const expectedVersion = 1;
|
|
19
|
-
const sanitizedVersion = sanitizeTemplateApiVersion(rawVersion);
|
|
20
|
-
|
|
21
|
-
expect(sanitizedVersion).toStrictEqual(expectedVersion);
|
|
22
|
-
});
|
|
23
|
-
it('should return version number when given `1` syntax', () => {
|
|
24
|
-
const rawVersion = '1';
|
|
25
|
-
const expectedVersion = 1;
|
|
26
|
-
const sanitizedVersion = sanitizeTemplateApiVersion(rawVersion);
|
|
27
|
-
|
|
28
|
-
expect(sanitizedVersion).toStrictEqual(expectedVersion);
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
describe('usesNewAPI', () => {
|
|
32
|
-
it('should use new parser api if v1', () => {
|
|
33
|
-
const templateConfig = {
|
|
34
|
-
apiVersion: 'v1'
|
|
35
|
-
};
|
|
36
|
-
const isUsingNewAPI = usesNewAPI(templateConfig);
|
|
37
|
-
|
|
38
|
-
expect(isUsingNewAPI).toStrictEqual(true);
|
|
39
|
-
});
|
|
40
|
-
it('should use new parser api if v2', () => {
|
|
41
|
-
const templateConfig = {
|
|
42
|
-
apiVersion: 'v2'
|
|
43
|
-
};
|
|
44
|
-
const isUsingNewAPI = usesNewAPI(templateConfig);
|
|
45
|
-
|
|
46
|
-
expect(isUsingNewAPI).toStrictEqual(true);
|
|
47
|
-
});
|
|
48
|
-
it('should use new parser api if v3', () => {
|
|
49
|
-
const templateConfig = {
|
|
50
|
-
apiVersion: 'v3'
|
|
51
|
-
};
|
|
52
|
-
const isUsingNewAPI = usesNewAPI(templateConfig);
|
|
53
|
-
|
|
54
|
-
expect(isUsingNewAPI).toStrictEqual(true);
|
|
55
|
-
});
|
|
56
|
-
it('should not use new API if no apiVersion', () => {
|
|
57
|
-
const templateConfig = { };
|
|
58
|
-
const isUsingNewAPI = usesNewAPI(templateConfig);
|
|
59
|
-
|
|
60
|
-
expect(isUsingNewAPI).toStrictEqual(false);
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
describe('parse', () => {
|
|
64
|
-
it('should be able to parse AsyncAPI v2 document for parser API v1', async () => {
|
|
65
|
-
const parsedDocument = await parse(dummyV2Document, {}, {templateConfig: {apiVersion: 'v1'}});
|
|
66
|
-
|
|
67
|
-
expect(parsedDocument).toBeDefined();
|
|
68
|
-
expect(parsedDocument.document.version()).toEqual('2.3.0');
|
|
69
|
-
});
|
|
70
|
-
it('should be able to parse AsyncAPI v2 document for parser API v2', async () => {
|
|
71
|
-
const parsedDocument = await parse(dummyV2Document, {}, {templateConfig: {apiVersion: 'v2'}});
|
|
72
|
-
|
|
73
|
-
expect(parsedDocument).toBeDefined();
|
|
74
|
-
expect(parsedDocument.document.version()).toEqual('2.3.0');
|
|
75
|
-
});
|
|
76
|
-
it('should be able to parse AsyncAPI v2 document for parser API v3', async () => {
|
|
77
|
-
const parsedDocument = await parse(dummyV2Document, {}, {templateConfig: {apiVersion: 'v3'}});
|
|
78
|
-
|
|
79
|
-
expect(parsedDocument).toBeDefined();
|
|
80
|
-
expect(parsedDocument.document.version()).toEqual('2.3.0');
|
|
81
|
-
});
|
|
82
|
-
it('should not be able to parse AsyncAPI v3 document for parser API v1', async () => {
|
|
83
|
-
const parsedDocument = await parse(dummyV3Document, {}, {templateConfig: {apiVersion: 'v1'}});
|
|
84
|
-
|
|
85
|
-
expect(parsedDocument).toBeDefined();
|
|
86
|
-
expect(parsedDocument.document).not.toBeDefined();
|
|
87
|
-
});
|
|
88
|
-
it('should not be able to parse AsyncAPI v3 document for old parser', async () => {
|
|
89
|
-
const parsedDocument = await parse(dummyV3Document, {}, {templateConfig: {}});
|
|
90
|
-
|
|
91
|
-
expect(parsedDocument).toBeDefined();
|
|
92
|
-
expect(parsedDocument.document).not.toBeDefined();
|
|
93
|
-
});
|
|
94
|
-
it('should be able to parse AsyncAPI v3 document for parser API v2', async () => {
|
|
95
|
-
const parsedDocument = await parse(dummyV3Document, {}, {templateConfig: {apiVersion: 'v2'}});
|
|
96
|
-
|
|
97
|
-
expect(parsedDocument).toBeDefined();
|
|
98
|
-
expect(parsedDocument.document.version()).toEqual('3.0.0');
|
|
99
|
-
});
|
|
100
|
-
it('should be able to parse AsyncAPI v3 document for parser API v3', async () => {
|
|
101
|
-
const parsedDocument = await parse(dummyV3Document, {}, {templateConfig: {apiVersion: 'v3'}});
|
|
102
|
-
expect(parsedDocument).toBeDefined();
|
|
103
|
-
expect(parsedDocument.document.version()).toEqual('3.0.0');
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
describe('getProperApiDocument', () => {
|
|
108
|
-
const parser_api_version = 'x-parser-api-version';
|
|
109
|
-
const parser_spec_parsed = 'x-parser-spec-parsed';
|
|
110
|
-
const parser_original_schema = 'x-parser-original-schema-format';
|
|
111
|
-
const parser_original_payload = 'x-parser-original-payload';
|
|
112
|
-
const parser_message = 'x-parser-message-parsed';
|
|
113
|
-
it('should convert to old API if apiVersion is undefined', async () => {
|
|
114
|
-
// parse calls the get properAPIDocument and returns it along with a diagnostic in a Object
|
|
115
|
-
// so its like called the get properAPIDocument function and then returned the result
|
|
116
|
-
const templateConfig = {};
|
|
117
|
-
const properDocument = await parse(dummyV2Document, {}, { templateConfig });
|
|
118
|
-
|
|
119
|
-
// Validate that properDocument convert it to expected API version from the template
|
|
120
|
-
expect(properDocument).toBeDefined();
|
|
121
|
-
|
|
122
|
-
expect(properDocument).toBeDefined();
|
|
123
|
-
expect(properDocument.document._json).toBeDefined();
|
|
124
|
-
expect(properDocument.document._json.asyncapi).toEqual('2.3.0');
|
|
125
|
-
expect(properDocument.diagnostics).toBeDefined();
|
|
126
|
-
expect(properDocument.diagnostics.length).toBeGreaterThan(0);
|
|
127
|
-
|
|
128
|
-
expect(properDocument.document._json[parser_api_version]).toBeDefined();
|
|
129
|
-
expect(properDocument.document._json[parser_api_version]).toEqual(0);
|
|
130
|
-
expect(properDocument.document._json[parser_spec_parsed]).toBeDefined();
|
|
131
|
-
expect(properDocument.document._json[parser_spec_parsed]).toEqual(true);
|
|
132
|
-
|
|
133
|
-
expect(properDocument.document._meta).toBeDefined();
|
|
134
|
-
expect(properDocument.document._meta).toEqual({});
|
|
135
|
-
expect(properDocument.document._json.components.messages.dummyCreated).toBeDefined();
|
|
136
|
-
expect(properDocument.document._json.components.messages.dummyCreated[parser_original_schema]).toBeDefined(); // Only old API includes this filed
|
|
137
|
-
expect(properDocument.document._json.components.messages.dummyCreated[parser_original_payload]).toBeDefined();
|
|
138
|
-
expect(properDocument.document._json.components.messages.dummyCreated[parser_message]).toBeDefined();
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it('should convert to specified API version', async () => {
|
|
142
|
-
const templateConfig = { apiVersion: 'v2' };
|
|
143
|
-
const properDocument = await parse(dummyV2Document, {}, { templateConfig });
|
|
144
|
-
|
|
145
|
-
// Validate that properDocument is defined
|
|
146
|
-
expect(properDocument).toBeDefined();
|
|
147
|
-
|
|
148
|
-
// Validate that the document is converted to the specified API version
|
|
149
|
-
expect(properDocument.document._json.asyncapi).toEqual('2.3.0');
|
|
150
|
-
expect(properDocument.diagnostics).toBeDefined();
|
|
151
|
-
expect(properDocument.diagnostics.length).toBeGreaterThan(0);
|
|
152
|
-
|
|
153
|
-
expect(properDocument.document._json[parser_api_version]).toBeDefined();
|
|
154
|
-
expect(properDocument.document._json[parser_spec_parsed]).toBeDefined();
|
|
155
|
-
expect(properDocument.document._json[parser_api_version]).toEqual(2);
|
|
156
|
-
expect(properDocument.document._json[parser_spec_parsed]).toEqual(true);
|
|
157
|
-
|
|
158
|
-
expect(properDocument.document._meta).toBeDefined();
|
|
159
|
-
expect(properDocument.document._json.components.messages.dummyCreated).toBeDefined();
|
|
160
|
-
expect(properDocument.document._json.components.messages.dummyCreated[parser_original_schema]).toBeUndefined();
|
|
161
|
-
expect(properDocument.document._json.components.messages.dummyCreated[parser_original_payload]).toBeUndefined();
|
|
162
|
-
expect(properDocument.document._json.components.messages.dummyCreated[parser_message]).toBeUndefined();
|
|
163
|
-
|
|
164
|
-
// Validate that old API-specific functions and properties are not present
|
|
165
|
-
expect(properDocument.oldApiSpecificFunction).toBeUndefined();
|
|
166
|
-
expect(properDocument.oldApiSpecificProperty).toBeUndefined();
|
|
167
|
-
expect(properDocument.anotherOldApiFunction).toBeUndefined();
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
describe('convertOldOptionsToNew', () => {
|
|
172
|
-
it('should convert old options to new options', () => {
|
|
173
|
-
const oldOptions = {
|
|
174
|
-
path: './test/docs/',
|
|
175
|
-
applyTraits: true,
|
|
176
|
-
resolve: {
|
|
177
|
-
http: {
|
|
178
|
-
order: 1,
|
|
179
|
-
canRead: true,
|
|
180
|
-
read: jest.fn()
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
};
|
|
184
|
-
const generator = {
|
|
185
|
-
mapBaseUrlToFolder: {
|
|
186
|
-
url: 'https://schema.example.com/crm/',
|
|
187
|
-
folder: './test/docs/'
|
|
188
|
-
}
|
|
189
|
-
};
|
|
190
|
-
const newOptions = convertOldOptionsToNew(oldOptions, generator);
|
|
191
|
-
|
|
192
|
-
expect(newOptions).toBeDefined();
|
|
193
|
-
expect(newOptions.source).toEqual(oldOptions.path);
|
|
194
|
-
expect(newOptions.applyTraits).toEqual(oldOptions.applyTraits);
|
|
195
|
-
expect(newOptions.__unstable).toBeDefined();
|
|
196
|
-
expect(newOptions.__unstable.resolver.resolvers.length).toBeGreaterThan(0);
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
it('should return undefined if oldOptions is not provided', () => {
|
|
200
|
-
const newOptions = convertOldOptionsToNew(undefined, {});
|
|
201
|
-
|
|
202
|
-
expect(newOptions).toBeUndefined();
|
|
203
|
-
});
|
|
204
|
-
});
|
|
205
|
-
});
|
package/test/renderer.test.js
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/* eslint-disable sonarjs/no-duplicate-string */
|
|
2
|
-
const {
|
|
3
|
-
configureReact,
|
|
4
|
-
renderReact,
|
|
5
|
-
saveRenderedReactContent,
|
|
6
|
-
} = require('../lib/renderer/react');
|
|
7
|
-
|
|
8
|
-
jest.mock('../lib/utils');
|
|
9
|
-
jest.mock('@asyncapi/generator-react-sdk');
|
|
10
|
-
|
|
11
|
-
describe('React renderer', () => {
|
|
12
|
-
describe('saveRenderedReactContent', () => {
|
|
13
|
-
let util;
|
|
14
|
-
let AsyncReactSDK;
|
|
15
|
-
beforeAll(() => {
|
|
16
|
-
util = require('../lib/utils');
|
|
17
|
-
AsyncReactSDK = require('@asyncapi/generator-react-sdk');
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
it('works transpilation', async () => {
|
|
21
|
-
await configureReact('../file', '../dir', '../file');
|
|
22
|
-
expect(AsyncReactSDK.transpileFiles).toHaveBeenCalledTimes(1);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('works rendering', async () => {
|
|
26
|
-
await renderReact({}, '../file', {}, '../file', '../dir', '../location', {}, false, '');
|
|
27
|
-
expect(AsyncReactSDK.renderTemplate).toHaveBeenCalledTimes(1);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('works saving single rendered content', async () => {
|
|
31
|
-
const content = {
|
|
32
|
-
content: 'Content',
|
|
33
|
-
metadata: {
|
|
34
|
-
fileName: 'file.html',
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
await saveRenderedReactContent(content, '../some/path');
|
|
39
|
-
expect(util.writeFile).toHaveBeenCalledTimes(1);
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it('works saving multiple rendered contents', async () => {
|
|
43
|
-
const content = [
|
|
44
|
-
{
|
|
45
|
-
content: 'Content1',
|
|
46
|
-
metadata: {
|
|
47
|
-
fileName: 'file1.html',
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
content: 'Content2',
|
|
52
|
-
metadata: {
|
|
53
|
-
fileName: 'file2.html',
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
];
|
|
57
|
-
|
|
58
|
-
await saveRenderedReactContent(content, '../some/path');
|
|
59
|
-
expect(util.writeFile).toHaveBeenCalledTimes(2);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
});
|