apib2swagger 1.12.0 → 1.13.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.
Files changed (118) hide show
  1. package/.github/workflows/codeql-analysis.yml +71 -0
  2. package/.github/workflows/docker-publish.yml +1 -1
  3. package/.github/workflows/nodejs.yml +1 -1
  4. package/.travis.yml +2 -1
  5. package/Dockerfile +1 -1
  6. package/LICENSE +0 -0
  7. package/README.md +29 -3
  8. package/bin/apib2swagger.js +43 -17
  9. package/index.js +81 -366
  10. package/package.json +5 -3
  11. package/src/escape_json_pointer.js +0 -0
  12. package/src/mson_to_json_schema.js +12 -10
  13. package/src/parameters.js +111 -0
  14. package/src/requests.js +344 -0
  15. package/src/responses.js +181 -0
  16. package/src/util.js +127 -0
  17. package/test/input/Attributes.md +0 -0
  18. package/test/input/Issue-#15.md +0 -0
  19. package/test/input/Issue-#22.md +0 -0
  20. package/test/input/Issue-#23.md +0 -0
  21. package/test/input/Issue-#26.md +0 -0
  22. package/test/input/Issue-#29.md +0 -0
  23. package/test/input/Issue-#33.md +0 -0
  24. package/test/input/Issue-#35.md +0 -0
  25. package/test/input/Issue-#36.md +0 -0
  26. package/test/input/Issue-#38.md +0 -0
  27. package/test/input/Issue-#49.md +0 -0
  28. package/test/input/OpenAPI3_attributes.md +36 -0
  29. package/test/input/OpenAPI3_headers.md +74 -0
  30. package/test/input/OpenAPI3_includes.md +22 -0
  31. package/test/input/OpenAPI3_requests.md +162 -0
  32. package/test/input/OpenAPI3_responses.md +177 -0
  33. package/test/input/Schema.md +0 -0
  34. package/test/input/apiblueprint_uber.md +0 -0
  35. package/test/input/apiblueprint_valid_simple.md +0 -0
  36. package/test/input/includes/resource-request-body-2.json +3 -0
  37. package/test/input/includes/resource-request-body.json +3 -0
  38. package/test/input/includes/resource-request-schema.json +9 -0
  39. package/test/input/includes/resource-response-body-2.json +3 -0
  40. package/test/input/includes/resource-response-body.json +3 -0
  41. package/test/input/includes/resource-response-schema.json +9 -0
  42. package/test/input/schema_without_body.md +17 -0
  43. package/test/meta_schema.json +0 -0
  44. package/test/openAPI_30_schema.json +1662 -0
  45. package/test/output/01. Simplest API.json +0 -0
  46. package/test/output/01. Simplest API.ref.json +0 -0
  47. package/test/output/02. Resource and Actions.json +0 -0
  48. package/test/output/02. Resource and Actions.ref.json +0 -0
  49. package/test/output/03. Named Resource and Actions.json +0 -0
  50. package/test/output/03. Named Resource and Actions.ref.json +0 -0
  51. package/test/output/04. Grouping Resources.json +0 -0
  52. package/test/output/04. Grouping Resources.ref.json +0 -0
  53. package/test/output/05. Responses.json +0 -0
  54. package/test/output/05. Responses.ref.json +0 -0
  55. package/test/output/06. Requests.json +0 -0
  56. package/test/output/06. Requests.ref.json +0 -0
  57. package/test/output/07. Parameters.json +0 -0
  58. package/test/output/07. Parameters.ref.json +0 -0
  59. package/test/output/08. Attributes.json +0 -0
  60. package/test/output/08. Attributes.ref.json +0 -0
  61. package/test/output/09. Advanced Attributes.json +0 -0
  62. package/test/output/09. Advanced Attributes.ref.json +0 -0
  63. package/test/output/10. Data Structures.json +0 -0
  64. package/test/output/10. Data Structures.ref.json +0 -0
  65. package/test/output/11. Resource Model.json +0 -0
  66. package/test/output/11. Resource Model.ref.json +0 -0
  67. package/test/output/12. Advanced Action.json +0 -0
  68. package/test/output/12. Advanced Action.ref.json +0 -0
  69. package/test/output/13. Named Endpoints.json +0 -0
  70. package/test/output/13. Named Endpoints.ref.json +0 -0
  71. package/test/output/Attributes.json +0 -0
  72. package/test/output/Attributes.ref.json +0 -0
  73. package/test/output/Gist Fox API + Auth.json +0 -0
  74. package/test/output/Gist Fox API + Auth.ref.json +0 -0
  75. package/test/output/Issue-#15.json +0 -0
  76. package/test/output/Issue-#15.ref.json +0 -0
  77. package/test/output/Issue-#22.json +0 -0
  78. package/test/output/Issue-#22.ref.json +0 -0
  79. package/test/output/Issue-#23.json +0 -0
  80. package/test/output/Issue-#23.ref.json +0 -0
  81. package/test/output/Issue-#26.json +0 -0
  82. package/test/output/Issue-#26.ref.json +0 -0
  83. package/test/output/Issue-#29.json +0 -0
  84. package/test/output/Issue-#29.ref.json +0 -0
  85. package/test/output/Issue-#33.json +0 -0
  86. package/test/output/Issue-#33.ref.json +0 -0
  87. package/test/output/Issue-#35.json +0 -0
  88. package/test/output/Issue-#35.ref.json +0 -0
  89. package/test/output/Issue-#36.json +0 -0
  90. package/test/output/Issue-#36.ref.json +0 -0
  91. package/test/output/Issue-#38.bearer.json +0 -0
  92. package/test/output/Issue-#38.json +0 -0
  93. package/test/output/Issue-#38.ref.json +0 -0
  94. package/test/output/Issue-#49.json +0 -0
  95. package/test/output/Issue-#49.ref.json +0 -0
  96. package/test/output/OpenAPI3_attributes.json +199 -0
  97. package/test/output/OpenAPI3_attributes.ref.json +173 -0
  98. package/test/output/OpenAPI3_headers.json +169 -0
  99. package/test/output/OpenAPI3_headers.ref.json +169 -0
  100. package/test/output/OpenAPI3_includes.json +66 -0
  101. package/test/output/OpenAPI3_includes.ref.json +66 -0
  102. package/test/output/OpenAPI3_requests.json +326 -0
  103. package/test/output/OpenAPI3_requests.ref.json +321 -0
  104. package/test/output/OpenAPI3_responses.json +255 -0
  105. package/test/output/OpenAPI3_responses.ref.json +245 -0
  106. package/test/output/Schema.json +0 -0
  107. package/test/output/Schema.ref.json +0 -0
  108. package/test/output/apiblueprint_uber.json +0 -0
  109. package/test/output/apiblueprint_uber.ref.json +0 -0
  110. package/test/output/apiblueprint_valid_simple.json +0 -0
  111. package/test/output/apiblueprint_valid_simple.ref.json +0 -0
  112. package/test/output/schema_without_body.json +52 -0
  113. package/test/output/schema_without_body.ref.json +52 -0
  114. package/test/swagger_20_schema.json +0 -0
  115. package/test/test.js +24 -9
  116. package/test/util.test.js +151 -0
  117. package/.npmignore +0 -35
  118. package/package-lock.json +0 -2021
package/test/test.js CHANGED
@@ -4,6 +4,14 @@ var assert = require("assert"),
4
4
  apib2swagger = require("../index.js"),
5
5
  tv4 = require('tv4');
6
6
 
7
+ const swaggerSchema = JSON.parse(fs.readFileSync('test/swagger_20_schema.json'));
8
+ const openAPI3Schema = JSON.parse(fs.readFileSync('test/openAPI_30_schema.json'))
9
+ const meta_schema = JSON.parse(fs.readFileSync('test/meta_schema.json'));
10
+
11
+ tv4.addSchema('http://json-schema.org/draft-04/schema', meta_schema);
12
+ tv4.addSchema('https://spec.openapis.org/oas/3.0/schema/2021-09-28', openAPI3Schema);
13
+ tv4.addSchema('http://swagger.io/v2/schema.json', swaggerSchema);
14
+
7
15
  var remote = 'https://raw.githubusercontent.com/apiaryio/api-blueprint/format-1A9/examples/',
8
16
  localInput = 'test/input/',
9
17
  localOutput = 'test/output/',
@@ -39,7 +47,13 @@ var remote = 'https://raw.githubusercontent.com/apiaryio/api-blueprint/format-1A
39
47
  'Issue-#38.md',
40
48
  'Issue-#49.md',
41
49
  'apiblueprint_uber.md',
42
- 'apiblueprint_valid_simple.md'
50
+ 'apiblueprint_valid_simple.md',
51
+ 'schema_without_body.md',
52
+ 'OpenAPI3_responses.md',
53
+ 'OpenAPI3_requests.md',
54
+ 'OpenAPI3_headers.md',
55
+ 'OpenAPI3_includes.md',
56
+ 'OpenAPI3_attributes.md'
43
57
  ];
44
58
 
45
59
  var fetch = function (file) {
@@ -79,6 +93,7 @@ const checkResultByFile = (result, file, originalExtension, newExtension) => {
79
93
  var f = fs.readFileSync(localOutput + file.replace(originalExtension, newExtension));
80
94
  var expected_answer = JSON.parse(f);
81
95
  assert.deepEqual(result.swagger, expected_answer);
96
+ const schema = file.includes('OpenAPI3') ? openAPI3Schema : swaggerSchema
82
97
  var validation_result = tv4.validateResult(result.swagger, schema);
83
98
  if (validation_result.error) {
84
99
  console.log(validation_result);
@@ -95,16 +110,16 @@ describe("apib2swagger", function () {
95
110
  return Promise.all(files.map(fetch));
96
111
  });
97
112
 
98
- schema = JSON.parse(fs.readFileSync('test/swagger_20_schema.json'));
99
- tv4.addSchema('http://swagger.io/v2/schema.json', schema);
100
- meta_schema = JSON.parse(fs.readFileSync('test/meta_schema.json'));
101
- tv4.addSchema('http://json-schema.org/draft-04/schema', meta_schema);
102
-
103
113
  files.concat(includedFiles).forEach(function (file) {
114
+ const options = {}
115
+ if (file.includes('OpenAPI3')){
116
+ options.openApi3 = true
117
+ }
118
+
104
119
  it(file, function (done) {
105
120
  this.timeout(10000); // 10s
106
121
  var apib = fs.readFileSync(localInput + file, "utf-8").replace(/\r/g, '');
107
- apib2swagger.convert(apib, function (error, result) {
122
+ apib2swagger.convert(apib, options, function (error, result) {
108
123
  if (error) {
109
124
  return done(error);
110
125
  }
@@ -117,7 +132,7 @@ describe("apib2swagger", function () {
117
132
  it(file + ' (--prefer-reference)', function (done) {
118
133
  this.timeout(10000); // 10s
119
134
  var apib = fs.readFileSync(localInput + file, "utf-8").replace(/\r/g, '');
120
- apib2swagger.convert(apib, { preferReference: true }, function (error, result) {
135
+ apib2swagger.convert(apib, { ...options, preferReference: true }, function (error, result) {
121
136
  if (error) {
122
137
  return done(error);
123
138
  }
@@ -140,7 +155,7 @@ describe("apib2swagger", function () {
140
155
  return done(error);
141
156
  }
142
157
  assert.equal(result.swagger.info.version, test.output);
143
- var validation_result = tv4.validateResult(result.swagger, schema);
158
+ var validation_result = tv4.validateResult(result.swagger, swaggerSchema);
144
159
  if (validation_result.error) {
145
160
  console.log(validation_result);
146
161
  }
@@ -0,0 +1,151 @@
1
+ const { hasFileRef, normalizeIncludes, getRefFromInclude, getAbsolutePath } = require('../src/util')
2
+ const assert = require('assert')
3
+ const sinon = require('sinon')
4
+ const fs = require('fs')
5
+
6
+ describe('util', () => {
7
+ describe('hasFileRef', () => {
8
+ it('should return true when include is present - has spaces', () => {
9
+ const result = hasFileRef('<!-- include(test.json) -->')
10
+ assert.equal(result, true)
11
+ })
12
+
13
+ it('should return true when include is present - lack of spaces', () => {
14
+ const result = hasFileRef('<!--include(test.json)-->')
15
+ assert.equal(result, true)
16
+ })
17
+
18
+ it('should return false when include is not present', () => {
19
+ const result = hasFileRef('test.json')
20
+ assert.equal(result, false)
21
+ })
22
+ });
23
+
24
+ describe('normalizeIncludes', () => {
25
+ it('should not affect contents before or after the include', () => {
26
+ const result = normalizeIncludes('12345<!-- include: path/to/file.json -->6789')
27
+ assert.equal(result, '12345<!-- include(path/to/file.json) -->6789')
28
+ })
29
+
30
+ it('should work with different input syntaxes', () => {
31
+ const inputSyntaxes = [
32
+ '<!-- include: path/to/file.json -->',
33
+ '<!-- include:path/to/file.json-->',
34
+ '<!-- include(path/to/file.json)-->',
35
+ '<!-- include (path/to/file.json) -->',
36
+ '<!-- include ( path/to/file.json ) -->',
37
+ '<!-- include ( path/to/file.json ) -->',
38
+ '<!-- include (path/to/file.json -->',
39
+ ]
40
+ inputSyntaxes.forEach(str => {
41
+ const result = normalizeIncludes(str)
42
+ assert.equal(result, '<!-- include(path/to/file.json) -->')
43
+ })
44
+ })
45
+
46
+ it('should work with multiple includes', () => {
47
+ const result = normalizeIncludes(`
48
+ 1234<!-- include: path/to/file.json -->5678
49
+ 1111<!-- include(path/to/file.json)-->2222
50
+ `)
51
+ assert.equal(result, `
52
+ 1234<!-- include(path/to/file.json) -->5678
53
+ 1111<!-- include(path/to/file.json) -->2222
54
+ `)
55
+ })
56
+
57
+ it('should allow parens in file name', () => {
58
+ const result = normalizeIncludes('<!-- include: path/to/file(test).json -->')
59
+ assert.equal(result, '<!-- include(path/to/file(test).json) -->')
60
+ })
61
+ });
62
+
63
+ describe('getRefFromInclude', () => {
64
+ it('should work with different input stynaxes', () => {
65
+ const inputSyntaxes = [
66
+ '<!-- include: path/to/file.json -->',
67
+ '<!-- include:path/to/file.json-->',
68
+ '<!-- include(path/to/file.json)-->',
69
+ '<!-- include (path/to/file.json) -->',
70
+ '<!-- include ( path/to/file.json ) -->',
71
+ '<!-- include (path/to/file.json -->',
72
+ ]
73
+ inputSyntaxes.forEach(str => {
74
+ const result = getRefFromInclude(str)
75
+ assert.deepEqual(result, { $ref: 'path/to/file.json' })
76
+ })
77
+ })
78
+
79
+ it('should allow parens in file name', () => {
80
+ const result = getRefFromInclude('<!-- include: path/to/file(test).json -->')
81
+ assert.deepEqual(result, { $ref: 'path/to/file(test).json' })
82
+ })
83
+
84
+ it('should throw an error if the syntax does not match a supported syntax', () => {
85
+ assert.throws(() => {
86
+ getRefFromInclude('<!-- include[path/to/file(test).json] -->')
87
+ })
88
+ })
89
+ });
90
+
91
+ describe('getAbsolutePath', () => {
92
+ const existsSync = sinon.stub(fs, 'existsSync')
93
+ const cwdStub = sinon.stub(process, 'cwd')
94
+ afterEach(() => {
95
+ existsSync.reset()
96
+ cwdStub.reset()
97
+ })
98
+
99
+ it('should return the path to the give source directory if the file exists', () => {
100
+ existsSync.returns(true)
101
+ const result = getAbsolutePath({ ['source-dir']: '~/source/dir/' }, '/file.json')
102
+ assert.equal(result, '~/source/dir/file.json')
103
+ })
104
+
105
+ it('should return the correct path when source is not given and execution path file exists', () => {
106
+ cwdStub.returns('~/cwd/dir/')
107
+ existsSync.returns(true)
108
+
109
+ const result = getAbsolutePath({}, '/file.json')
110
+ assert.equal(result, '~/cwd/dir/file.json')
111
+ })
112
+
113
+ it('should return the correct path when source path does not exist and execution path file exists', () => {
114
+ cwdStub.returns('~/cwd/dir/2/')
115
+ existsSync.onCall(0).returns(false)
116
+ existsSync.onCall(1).returns(true)
117
+
118
+ const result = getAbsolutePath({ ['source-dir']: '~/source/dir/' }, '/file.json')
119
+ assert.equal(result, '~/cwd/dir/2/file.json')
120
+ })
121
+
122
+ it('should return input path when other options do not exist and input path file exists', () => {
123
+ cwdStub.returns('~/cwd/dir/')
124
+ existsSync.onCall(0).returns(false)
125
+ existsSync.onCall(1).returns(false)
126
+ existsSync.onCall(2).returns(true)
127
+
128
+ const options = {
129
+ ['source-dir']: '~/source/dir/',
130
+ input: '~/input/api.md'
131
+ }
132
+ const result = getAbsolutePath(options, '/file.json')
133
+ assert.equal(result, '~/input/file.json')
134
+ })
135
+
136
+ it('should return null if the file does not exist at any of the paths', () => {
137
+ cwdStub.returns('~/cwd/dir/')
138
+ existsSync.onCall(0).returns(false)
139
+ existsSync.onCall(1).returns(false)
140
+ existsSync.onCall(2).returns(false)
141
+ existsSync.onCall(3).returns(true)
142
+
143
+ const options = {
144
+ ['source-dir']: '~/source/dir/',
145
+ input: '~/input/api.md'
146
+ }
147
+ const result = getAbsolutePath(options, '/file.json')
148
+ assert.equal(result, null)
149
+ })
150
+ })
151
+ })
package/.npmignore DELETED
@@ -1,35 +0,0 @@
1
- # Logs
2
- logs
3
- *.log
4
-
5
- # Runtime data
6
- pids
7
- *.pid
8
- *.seed
9
-
10
- # Directory for instrumented libs generated by jscoverage/JSCover
11
- lib-cov
12
-
13
- # Coverage directory used by tools like istanbul
14
- coverage
15
-
16
- # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
17
- .grunt
18
-
19
- # Compiled binary addons (http://nodejs.org/api/addons.html)
20
- build/Release
21
-
22
- # Dependency directory
23
- # Commenting this out is preferred by some people, see
24
- # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-
25
- node_modules
26
-
27
- # Users Environment Variables
28
- .lock-wscript
29
-
30
- # Swagger server
31
- swagger-ui-master/*
32
- swagger-ui-master.tar.gz
33
-
34
- # IDE
35
- .vscode