@asyncapi-actions-test/trusted-publishing-test_asyncapi-cli 4.1.3

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 (257) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +117 -0
  3. package/assets/create-template/templates/default/asyncapi.yaml +34 -0
  4. package/assets/create-template/templates/default/package-lock.json +4062 -0
  5. package/assets/create-template/templates/default/package.json +10 -0
  6. package/assets/create-template/templates/default/readme.md +4 -0
  7. package/assets/create-template/templates/default/template/index.js +11 -0
  8. package/assets/examples/adeo-kafka-request-reply-asyncapi.yml +298 -0
  9. package/assets/examples/anyof-asyncapi.yml +36 -0
  10. package/assets/examples/application-headers-asyncapi.yml +86 -0
  11. package/assets/examples/correlation-id-asyncapi.yml +180 -0
  12. package/assets/examples/default-example.json +51 -0
  13. package/assets/examples/default-example.yaml +31 -0
  14. package/assets/examples/examples.json +82 -0
  15. package/assets/examples/gitter-streaming-asyncapi.yml +178 -0
  16. package/assets/examples/kraken-websocket-request-reply-message-filter-in-reply-asyncapi.yml +388 -0
  17. package/assets/examples/kraken-websocket-request-reply-multiple-channels-asyncapi.yml +394 -0
  18. package/assets/examples/mercure-asyncapi.yml +58 -0
  19. package/assets/examples/not-asyncapi.yml +29 -0
  20. package/assets/examples/oneof-asyncapi.yml +57 -0
  21. package/assets/examples/operation-security-asyncapi.yml +117 -0
  22. package/assets/examples/rpc-client-asyncapi.yml +72 -0
  23. package/assets/examples/rpc-server-asyncapi.yml +69 -0
  24. package/assets/examples/simple-asyncapi.yml +31 -0
  25. package/assets/examples/slack-rtm-asyncapi.yml +982 -0
  26. package/assets/examples/streetlights-kafka-asyncapi.yml +199 -0
  27. package/assets/examples/streetlights-mqtt-asyncapi.yml +253 -0
  28. package/assets/examples/streetlights-operation-security-asyncapi.yml +240 -0
  29. package/assets/examples/tutorial.yml +41 -0
  30. package/assets/examples/websocket-gemini-asyncapi.yml +301 -0
  31. package/assets/logo.png +0 -0
  32. package/assets/server-api.png +0 -0
  33. package/bin/dev +17 -0
  34. package/bin/dev.cmd +3 -0
  35. package/bin/run +12 -0
  36. package/bin/run.cmd +3 -0
  37. package/bin/run_bin +13 -0
  38. package/bin/run_bin.cmd +3 -0
  39. package/lib/apps/api/app.d.ts +15 -0
  40. package/lib/apps/api/app.js +91 -0
  41. package/lib/apps/api/configs/development.json +16 -0
  42. package/lib/apps/api/configs/production.json +16 -0
  43. package/lib/apps/api/configs/test.json +16 -0
  44. package/lib/apps/api/constants.d.ts +1 -0
  45. package/lib/apps/api/constants.js +4 -0
  46. package/lib/apps/api/controllers/bundle.controller.d.ts +7 -0
  47. package/lib/apps/api/controllers/bundle.controller.js +44 -0
  48. package/lib/apps/api/controllers/convert.controller.d.ts +11 -0
  49. package/lib/apps/api/controllers/convert.controller.js +69 -0
  50. package/lib/apps/api/controllers/diff.controller.d.ts +7 -0
  51. package/lib/apps/api/controllers/diff.controller.js +42 -0
  52. package/lib/apps/api/controllers/docs.controller.d.ts +6 -0
  53. package/lib/apps/api/controllers/docs.controller.js +24 -0
  54. package/lib/apps/api/controllers/generate.controller.d.ts +22 -0
  55. package/lib/apps/api/controllers/generate.controller.js +174 -0
  56. package/lib/apps/api/controllers/help.controller.d.ts +6 -0
  57. package/lib/apps/api/controllers/help.controller.js +101 -0
  58. package/lib/apps/api/controllers/parse.controller.d.ts +10 -0
  59. package/lib/apps/api/controllers/parse.controller.js +35 -0
  60. package/lib/apps/api/controllers/validate.controller.d.ts +10 -0
  61. package/lib/apps/api/controllers/validate.controller.js +50 -0
  62. package/lib/apps/api/controllers/version.controller.d.ts +8 -0
  63. package/lib/apps/api/controllers/version.controller.js +69 -0
  64. package/lib/apps/api/exceptions/problem.exception.d.ts +14 -0
  65. package/lib/apps/api/exceptions/problem.exception.js +10 -0
  66. package/lib/apps/api/index.d.ts +10 -0
  67. package/lib/apps/api/index.js +23 -0
  68. package/lib/apps/api/middlewares/logger.middleware.d.ts +2 -0
  69. package/lib/apps/api/middlewares/logger.middleware.js +12 -0
  70. package/lib/apps/api/middlewares/problem.middleware.d.ts +6 -0
  71. package/lib/apps/api/middlewares/problem.middleware.js +27 -0
  72. package/lib/apps/api/middlewares/validation.middleware.d.ts +12 -0
  73. package/lib/apps/api/middlewares/validation.middleware.js +245 -0
  74. package/lib/apps/api/server.d.ts +3 -0
  75. package/lib/apps/api/server.js +19 -0
  76. package/lib/apps/cli/commands/bundle.d.ts +15 -0
  77. package/lib/apps/cli/commands/bundle.js +75 -0
  78. package/lib/apps/cli/commands/config/analytics.d.ts +11 -0
  79. package/lib/apps/cli/commands/config/analytics.js +61 -0
  80. package/lib/apps/cli/commands/config/auth/add.d.ts +13 -0
  81. package/lib/apps/cli/commands/config/auth/add.js +68 -0
  82. package/lib/apps/cli/commands/config/context/add.d.ts +13 -0
  83. package/lib/apps/cli/commands/config/context/add.js +46 -0
  84. package/lib/apps/cli/commands/config/context/current.d.ts +8 -0
  85. package/lib/apps/cli/commands/config/context/current.js +37 -0
  86. package/lib/apps/cli/commands/config/context/edit.d.ts +12 -0
  87. package/lib/apps/cli/commands/config/context/edit.js +44 -0
  88. package/lib/apps/cli/commands/config/context/index.d.ts +5 -0
  89. package/lib/apps/cli/commands/config/context/index.js +16 -0
  90. package/lib/apps/cli/commands/config/context/init.d.ts +12 -0
  91. package/lib/apps/cli/commands/config/context/init.js +31 -0
  92. package/lib/apps/cli/commands/config/context/list.d.ts +8 -0
  93. package/lib/apps/cli/commands/config/context/list.js +36 -0
  94. package/lib/apps/cli/commands/config/context/remove.d.ts +11 -0
  95. package/lib/apps/cli/commands/config/context/remove.js +39 -0
  96. package/lib/apps/cli/commands/config/context/use.d.ts +11 -0
  97. package/lib/apps/cli/commands/config/context/use.js +40 -0
  98. package/lib/apps/cli/commands/config/index.d.ts +5 -0
  99. package/lib/apps/cli/commands/config/index.js +16 -0
  100. package/lib/apps/cli/commands/config/versions.d.ts +8 -0
  101. package/lib/apps/cli/commands/config/versions.js +56 -0
  102. package/lib/apps/cli/commands/convert.d.ts +21 -0
  103. package/lib/apps/cli/commands/convert.js +85 -0
  104. package/lib/apps/cli/commands/diff.d.ts +36 -0
  105. package/lib/apps/cli/commands/diff.js +335 -0
  106. package/lib/apps/cli/commands/format.d.ts +18 -0
  107. package/lib/apps/cli/commands/format.js +97 -0
  108. package/lib/apps/cli/commands/generate/client.d.ts +30 -0
  109. package/lib/apps/cli/commands/generate/client.js +94 -0
  110. package/lib/apps/cli/commands/generate/fromTemplate.d.ts +29 -0
  111. package/lib/apps/cli/commands/generate/fromTemplate.js +91 -0
  112. package/lib/apps/cli/commands/generate/index.d.ts +5 -0
  113. package/lib/apps/cli/commands/generate/index.js +15 -0
  114. package/lib/apps/cli/commands/generate/models.d.ts +16 -0
  115. package/lib/apps/cli/commands/generate/models.js +166 -0
  116. package/lib/apps/cli/commands/new/file.d.ts +16 -0
  117. package/lib/apps/cli/commands/new/file.js +180 -0
  118. package/lib/apps/cli/commands/new/index.d.ts +5 -0
  119. package/lib/apps/cli/commands/new/index.js +15 -0
  120. package/lib/apps/cli/commands/new/template.d.ts +18 -0
  121. package/lib/apps/cli/commands/new/template.js +102 -0
  122. package/lib/apps/cli/commands/optimize.d.ts +41 -0
  123. package/lib/apps/cli/commands/optimize.js +289 -0
  124. package/lib/apps/cli/commands/pretty.d.ts +12 -0
  125. package/lib/apps/cli/commands/pretty.js +70 -0
  126. package/lib/apps/cli/commands/start/api.d.ts +11 -0
  127. package/lib/apps/cli/commands/start/api.js +23 -0
  128. package/lib/apps/cli/commands/start/index.d.ts +5 -0
  129. package/lib/apps/cli/commands/start/index.js +15 -0
  130. package/lib/apps/cli/commands/start/preview.d.ts +17 -0
  131. package/lib/apps/cli/commands/start/preview.js +41 -0
  132. package/lib/apps/cli/commands/start/studio.d.ts +16 -0
  133. package/lib/apps/cli/commands/start/studio.js +94 -0
  134. package/lib/apps/cli/commands/validate.d.ts +23 -0
  135. package/lib/apps/cli/commands/validate.js +95 -0
  136. package/lib/apps/cli/internal/args/generate.args.d.ts +3 -0
  137. package/lib/apps/cli/internal/args/generate.args.js +10 -0
  138. package/lib/apps/cli/internal/base/BaseGeneratorCommand.d.ts +42 -0
  139. package/lib/apps/cli/internal/base/BaseGeneratorCommand.js +119 -0
  140. package/lib/apps/cli/internal/base.d.ts +20 -0
  141. package/lib/apps/cli/internal/base.js +173 -0
  142. package/lib/apps/cli/internal/flags/bundle.flags.d.ts +7 -0
  143. package/lib/apps/cli/internal/flags/bundle.flags.js +26 -0
  144. package/lib/apps/cli/internal/flags/config/analytics.flags.d.ts +6 -0
  145. package/lib/apps/cli/internal/flags/config/analytics.flags.js +24 -0
  146. package/lib/apps/cli/internal/flags/config/context.flags.d.ts +4 -0
  147. package/lib/apps/cli/internal/flags/config/context.flags.js +16 -0
  148. package/lib/apps/cli/internal/flags/convert.flags.d.ts +7 -0
  149. package/lib/apps/cli/internal/flags/convert.flags.js +32 -0
  150. package/lib/apps/cli/internal/flags/diff.flags.d.ts +13 -0
  151. package/lib/apps/cli/internal/flags/diff.flags.js +29 -0
  152. package/lib/apps/cli/internal/flags/format.flags.d.ts +6 -0
  153. package/lib/apps/cli/internal/flags/format.flags.js +22 -0
  154. package/lib/apps/cli/internal/flags/generate/clients.flags.d.ts +16 -0
  155. package/lib/apps/cli/internal/flags/generate/clients.flags.js +8 -0
  156. package/lib/apps/cli/internal/flags/generate/fromTemplate.flags.d.ts +16 -0
  157. package/lib/apps/cli/internal/flags/generate/fromTemplate.flags.js +8 -0
  158. package/lib/apps/cli/internal/flags/generate/models.flags.d.ts +1 -0
  159. package/lib/apps/cli/internal/flags/generate/models.flags.js +14 -0
  160. package/lib/apps/cli/internal/flags/generate/sharedFlags.d.ts +16 -0
  161. package/lib/apps/cli/internal/flags/generate/sharedFlags.js +57 -0
  162. package/lib/apps/cli/internal/flags/global.flags.d.ts +4 -0
  163. package/lib/apps/cli/internal/flags/global.flags.js +18 -0
  164. package/lib/apps/cli/internal/flags/new/file.flags.d.ts +8 -0
  165. package/lib/apps/cli/internal/flags/new/file.flags.js +20 -0
  166. package/lib/apps/cli/internal/flags/new/template.flags.d.ts +7 -0
  167. package/lib/apps/cli/internal/flags/new/template.flags.js +28 -0
  168. package/lib/apps/cli/internal/flags/optimize.flags.d.ts +21 -0
  169. package/lib/apps/cli/internal/flags/optimize.flags.js +51 -0
  170. package/lib/apps/cli/internal/flags/parser.flags.d.ts +10 -0
  171. package/lib/apps/cli/internal/flags/parser.flags.js +28 -0
  172. package/lib/apps/cli/internal/flags/pretty.flags.d.ts +3 -0
  173. package/lib/apps/cli/internal/flags/pretty.flags.js +13 -0
  174. package/lib/apps/cli/internal/flags/proxy.flags.d.ts +4 -0
  175. package/lib/apps/cli/internal/flags/proxy.flags.js +17 -0
  176. package/lib/apps/cli/internal/flags/start/api.flags.d.ts +5 -0
  177. package/lib/apps/cli/internal/flags/start/api.flags.js +20 -0
  178. package/lib/apps/cli/internal/flags/start/preview.flags.d.ts +9 -0
  179. package/lib/apps/cli/internal/flags/start/preview.flags.js +32 -0
  180. package/lib/apps/cli/internal/flags/start/studio.flags.d.ts +7 -0
  181. package/lib/apps/cli/internal/flags/start/studio.flags.js +25 -0
  182. package/lib/apps/cli/internal/flags/validate.flags.d.ts +11 -0
  183. package/lib/apps/cli/internal/flags/validate.flags.js +22 -0
  184. package/lib/apps/cli/internal/globals.d.ts +10 -0
  185. package/lib/apps/cli/internal/globals.js +46 -0
  186. package/lib/apps/cli/internal/hooks/command_not_found/myhook.d.ts +4 -0
  187. package/lib/apps/cli/internal/hooks/command_not_found/myhook.js +85 -0
  188. package/lib/domains/models/Context.d.ts +21 -0
  189. package/lib/domains/models/Context.js +321 -0
  190. package/lib/domains/models/Preview.d.ts +2 -0
  191. package/lib/domains/models/Preview.js +227 -0
  192. package/lib/domains/models/SpecificationFile.d.ts +40 -0
  193. package/lib/domains/models/SpecificationFile.js +295 -0
  194. package/lib/domains/models/Studio.d.ts +2 -0
  195. package/lib/domains/models/Studio.js +182 -0
  196. package/lib/domains/models/generate/ClientLanguages.d.ts +12 -0
  197. package/lib/domains/models/generate/ClientLanguages.js +17 -0
  198. package/lib/domains/models/generate/Flags.d.ts +9 -0
  199. package/lib/domains/models/generate/Flags.js +2 -0
  200. package/lib/domains/services/archiver.service.d.ts +17 -0
  201. package/lib/domains/services/archiver.service.js +53 -0
  202. package/lib/domains/services/base.service.d.ts +6 -0
  203. package/lib/domains/services/base.service.js +26 -0
  204. package/lib/domains/services/config.service.d.ts +42 -0
  205. package/lib/domains/services/config.service.js +95 -0
  206. package/lib/domains/services/convert.service.d.ts +12 -0
  207. package/lib/domains/services/convert.service.js +65 -0
  208. package/lib/domains/services/generator.service.d.ts +15 -0
  209. package/lib/domains/services/generator.service.js +75 -0
  210. package/lib/domains/services/validation.service.d.ts +54 -0
  211. package/lib/domains/services/validation.service.js +375 -0
  212. package/lib/errors/context-error.d.ts +26 -0
  213. package/lib/errors/context-error.js +71 -0
  214. package/lib/errors/diff-error.d.ts +9 -0
  215. package/lib/errors/diff-error.js +27 -0
  216. package/lib/errors/generator-error.d.ts +3 -0
  217. package/lib/errors/generator-error.js +11 -0
  218. package/lib/errors/specification-file.d.ts +18 -0
  219. package/lib/errors/specification-file.js +65 -0
  220. package/lib/errors/validation-error.d.ts +11 -0
  221. package/lib/errors/validation-error.js +55 -0
  222. package/lib/index.d.ts +1 -0
  223. package/lib/index.js +11 -0
  224. package/lib/interfaces/index.d.ts +87 -0
  225. package/lib/interfaces/index.js +7 -0
  226. package/lib/utils/ajv.d.ts +2 -0
  227. package/lib/utils/ajv.js +18 -0
  228. package/lib/utils/app-openapi.d.ts +4 -0
  229. package/lib/utils/app-openapi.js +28 -0
  230. package/lib/utils/generate/flags.d.ts +2 -0
  231. package/lib/utils/generate/flags.js +14 -0
  232. package/lib/utils/generate/mapBaseUrl.d.ts +6 -0
  233. package/lib/utils/generate/mapBaseUrl.js +34 -0
  234. package/lib/utils/generate/parseParams.d.ts +3 -0
  235. package/lib/utils/generate/parseParams.js +58 -0
  236. package/lib/utils/generate/prompts.d.ts +4 -0
  237. package/lib/utils/generate/prompts.js +77 -0
  238. package/lib/utils/generate/registry.d.ts +2 -0
  239. package/lib/utils/generate/registry.js +30 -0
  240. package/lib/utils/generate/watcher.d.ts +51 -0
  241. package/lib/utils/generate/watcher.js +230 -0
  242. package/lib/utils/logger.d.ts +6 -0
  243. package/lib/utils/logger.js +33 -0
  244. package/lib/utils/retrieve-language.d.ts +1 -0
  245. package/lib/utils/retrieve-language.js +9 -0
  246. package/lib/utils/scoreCalculator.d.ts +2 -0
  247. package/lib/utils/scoreCalculator.js +22 -0
  248. package/lib/utils/temp-dir.d.ts +2 -0
  249. package/lib/utils/temp-dir.js +26 -0
  250. package/oclif.manifest.json +2137 -0
  251. package/openapi.yaml +713 -0
  252. package/package.json +203 -0
  253. package/scripts/enableAutoComplete.js +160 -0
  254. package/scripts/fetch-asyncapi-example.js +126 -0
  255. package/scripts/generateTypesForGenerateCommand.js +40 -0
  256. package/scripts/releasePackagesRename.js +88 -0
  257. package/scripts/updateUsageDocs.js +73 -0
@@ -0,0 +1,227 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_PORT = void 0;
4
+ exports.startPreview = startPreview;
5
+ const tslib_1 = require("tslib");
6
+ const specification_file_1 = require("../../errors/specification-file");
7
+ const fs_1 = require("fs");
8
+ const bundler_1 = tslib_1.__importDefault(require("@asyncapi/bundler"));
9
+ const http_1 = require("http");
10
+ const ws_1 = require("ws");
11
+ const chokidar_1 = tslib_1.__importDefault(require("chokidar"));
12
+ const open_1 = tslib_1.__importDefault(require("open"));
13
+ const path_1 = tslib_1.__importDefault(require("path"));
14
+ const js_yaml_1 = tslib_1.__importDefault(require("js-yaml"));
15
+ const picocolors_1 = require("picocolors");
16
+ const package_json_1 = require("@asyncapi/studio/package.json");
17
+ const sockets = [];
18
+ const messageQueue = [];
19
+ const filePathsToWatch = new Set();
20
+ const defaultErrorMessage = 'error occured while bundling files. use --detailedLog or -l flag to get more details.';
21
+ let bundleError = true;
22
+ exports.DEFAULT_PORT = 0;
23
+ function isValidFilePath(filePath) {
24
+ return (0, fs_1.existsSync)(filePath);
25
+ }
26
+ function resolveStudioNextInstance(studioPath) {
27
+ var _a;
28
+ const resolvedNextPath = require.resolve('next', { paths: [studioPath] });
29
+ // eslint-disable-next-line @typescript-eslint/no-var-requires,security/detect-non-literal-require
30
+ const nextModule = require(resolvedNextPath);
31
+ return (_a = nextModule.default) !== null && _a !== void 0 ? _a : nextModule;
32
+ }
33
+ // eslint-disable-next-line sonarjs/cognitive-complexity
34
+ function startPreview(filePath, base, baseDirectory, xOrigin, suppressLogs, port = exports.DEFAULT_PORT, noBrowser) {
35
+ if (filePath && !isValidFilePath(filePath)) {
36
+ throw new specification_file_1.SpecificationFileNotFound(filePath);
37
+ }
38
+ const baseDir = path_1.default.dirname(path_1.default.resolve(filePath));
39
+ (0, bundler_1.default)(filePath).then((doc) => {
40
+ if (doc) {
41
+ bundleError = false;
42
+ }
43
+ }).catch((err) => {
44
+ if (suppressLogs) {
45
+ console.log(defaultErrorMessage);
46
+ }
47
+ else {
48
+ console.log(err);
49
+ }
50
+ });
51
+ const studioPath = path_1.default.dirname(require.resolve('@asyncapi/studio/package.json'));
52
+ const nextInstance = resolveStudioNextInstance(studioPath);
53
+ const app = nextInstance({
54
+ dev: false,
55
+ dir: studioPath,
56
+ conf: {
57
+ distDir: 'build',
58
+ },
59
+ });
60
+ const handle = app.getRequestHandler();
61
+ const wsServer = new ws_1.WebSocketServer({ noServer: true });
62
+ wsServer.on('connection', (socket) => {
63
+ sockets.push(socket);
64
+ sendQueuedMessages();
65
+ });
66
+ wsServer.on('close', (socket) => {
67
+ sockets.splice(sockets.findIndex(s => s === socket));
68
+ });
69
+ app.prepare().then(() => {
70
+ if (filePath && !bundleError) {
71
+ messageQueue.push(JSON.stringify({
72
+ type: 'preview:connected',
73
+ code: 'Preview server connected'
74
+ }));
75
+ sendQueuedMessages();
76
+ findPathsToWatchFromSchemaRef(filePath, baseDir);
77
+ filePathsToWatch.add(path_1.default.resolve(baseDir, filePath));
78
+ chokidar_1.default.watch([...filePathsToWatch]).on('all', (event) => {
79
+ switch (event) {
80
+ case 'add':
81
+ (0, bundler_1.default)([filePath], {
82
+ base,
83
+ baseDir: baseDirectory,
84
+ xOrigin,
85
+ }).then((intitalDocument) => {
86
+ messageQueue.push(JSON.stringify({
87
+ type: 'preview:file:added',
88
+ code: (path_1.default.extname(filePath) === '.yaml' || path_1.default.extname(filePath) === '.yml') ?
89
+ intitalDocument.yml() : intitalDocument.string()
90
+ }));
91
+ sendQueuedMessages();
92
+ }).catch((e) => {
93
+ if (suppressLogs) {
94
+ console.log(defaultErrorMessage);
95
+ }
96
+ else {
97
+ console.log(e);
98
+ }
99
+ });
100
+ break;
101
+ case 'change':
102
+ (0, bundler_1.default)([filePath], {
103
+ base,
104
+ baseDir: baseDirectory,
105
+ xOrigin,
106
+ }).then((modifiedDocument) => {
107
+ messageQueue.push(JSON.stringify({
108
+ type: 'preview:file:changed',
109
+ code: (path_1.default.extname(filePath) === '.yaml' || path_1.default.extname(filePath) === '.yml') ?
110
+ modifiedDocument.yml() : modifiedDocument.string()
111
+ }));
112
+ sendQueuedMessages();
113
+ }).catch((error) => {
114
+ if (suppressLogs) {
115
+ console.log(defaultErrorMessage);
116
+ }
117
+ else {
118
+ console.log(error);
119
+ }
120
+ });
121
+ break;
122
+ case 'unlink':
123
+ messageQueue.push(JSON.stringify({
124
+ type: 'preview:file:deleted',
125
+ filePath,
126
+ }));
127
+ sendQueuedMessages();
128
+ break;
129
+ }
130
+ });
131
+ }
132
+ const server = (0, http_1.createServer)((req, res) => {
133
+ if (req.url === '/close') {
134
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
135
+ res.end('Shutting down server');
136
+ for (const socket of wsServer.clients) {
137
+ socket.close();
138
+ }
139
+ // Close the server
140
+ server.close(() => {
141
+ // eslint-disable-next-line no-process-exit
142
+ process.exit(0);
143
+ });
144
+ return;
145
+ }
146
+ handle(req, res);
147
+ });
148
+ server.on('upgrade', (request, socket, head) => {
149
+ if (request.url === '/preview-server' && request.headers['origin'] === `http://localhost:${port}`) {
150
+ console.log('🔗 WebSocket connection established for the preview.');
151
+ wsServer.handleUpgrade(request, socket, head, (sock) => {
152
+ wsServer.emit('connection', sock, request);
153
+ });
154
+ }
155
+ else {
156
+ console.log('🔗 WebSocket connection not established.');
157
+ socket.destroy();
158
+ }
159
+ });
160
+ if (!bundleError) {
161
+ server.listen(port, () => {
162
+ const previewServerAddr = server.address();
163
+ const currentPort = (previewServerAddr && typeof previewServerAddr === 'object' && 'port' in previewServerAddr) ? previewServerAddr.port : port;
164
+ const url = `http://localhost:${currentPort}?previewServer=${currentPort}&studio-version=${package_json_1.version}`;
165
+ console.log(`🎉 Connected to Preview Server running at ${(0, picocolors_1.blueBright)(url)}.`);
166
+ console.log(`🌐 Open this URL in your web browser: ${(0, picocolors_1.blueBright)(url)}`);
167
+ console.log(`🛑 If needed, press ${(0, picocolors_1.redBright)('Ctrl + C')} to stop the server.`);
168
+ if (filePath) {
169
+ for (const entry of filePathsToWatch) {
170
+ console.log(`👁️ Watching changes on file ${(0, picocolors_1.blueBright)(entry)}`);
171
+ }
172
+ }
173
+ else {
174
+ console.warn('Warning: No file was provided, and we couldn\'t find a default file (like "asyncapi.yaml" or "asyncapi.json") in the current folder. Starting Studio with a blank workspace.');
175
+ }
176
+ if (!bundleError && !noBrowser) {
177
+ (0, open_1.default)(url);
178
+ }
179
+ }).on('error', (error) => {
180
+ if (error.message.includes('EADDRINUSE')) {
181
+ console.log(error);
182
+ console.error((0, picocolors_1.redBright)(`Error: Port ${port} is already in use.`));
183
+ // eslint-disable-next-line no-process-exit
184
+ process.exit(1);
185
+ }
186
+ else {
187
+ console.error(`Failed to start server on port ${port}:`, 'cause', error.cause, '\n', 'name', error.name, '\n', 'stack', error.stack, '\n', 'message', error.message);
188
+ }
189
+ });
190
+ }
191
+ });
192
+ }
193
+ function sendQueuedMessages() {
194
+ while (messageQueue.length && sockets.length) {
195
+ const nextMessage = messageQueue.shift();
196
+ for (const socket of sockets) {
197
+ socket.send(nextMessage);
198
+ }
199
+ }
200
+ }
201
+ function isLocalRefAPath(key, value) {
202
+ return (typeof value === 'string' && key === '$ref' &&
203
+ (value.startsWith('.') || value.startsWith('./') ||
204
+ value.startsWith('../') || !value.startsWith('#')));
205
+ }
206
+ function findPathsToWatchFromSchemaRef(filePath, baseDir) {
207
+ if (filePath && !isValidFilePath(filePath)) {
208
+ throw new specification_file_1.SpecificationFileNotFound(filePath);
209
+ }
210
+ const document = js_yaml_1.default.load((0, fs_1.readFileSync)(filePath, 'utf-8'));
211
+ const stack = [document];
212
+ while (stack.length > 0) {
213
+ const current = stack.pop();
214
+ if (current === null || typeof current !== 'object') {
215
+ continue;
216
+ }
217
+ for (const [key, value] of Object.entries(current)) {
218
+ if (isLocalRefAPath(key, value)) {
219
+ const absolutePath = path_1.default.resolve(baseDir, value);
220
+ filePathsToWatch.add(absolutePath);
221
+ }
222
+ if (value !== null && typeof value === 'object') {
223
+ stack.push(value);
224
+ }
225
+ }
226
+ }
227
+ }
@@ -0,0 +1,40 @@
1
+ import { fileFormat } from '../../apps/cli/internal/flags/format.flags';
2
+ export declare class Specification {
3
+ private readonly spec;
4
+ private readonly filePath?;
5
+ private readonly fileURL?;
6
+ private readonly kind?;
7
+ constructor(spec: string, options?: {
8
+ filepath?: string;
9
+ fileURL?: string;
10
+ });
11
+ isAsyncAPI3(): boolean;
12
+ toJson(): Record<string, any>;
13
+ text(): string;
14
+ getFilePath(): string | undefined;
15
+ getFileURL(): string | undefined;
16
+ getKind(): "url" | "file" | undefined;
17
+ getSource(): string | undefined;
18
+ toSourceString(): string;
19
+ static fromFile(filepath: string): Promise<Specification>;
20
+ static fromURL(URLpath: string): Promise<Specification>;
21
+ }
22
+ export default class SpecificationFile {
23
+ private readonly pathToFile;
24
+ constructor(filePath: string);
25
+ getPath(): string;
26
+ read(): Promise<string>;
27
+ }
28
+ interface LoadType {
29
+ file?: boolean;
30
+ url?: boolean;
31
+ context?: boolean;
32
+ }
33
+ export declare function load(filePathOrContextName?: string, loadType?: LoadType): Promise<Specification>;
34
+ export declare function nameType(name: string): Promise<string>;
35
+ export declare function isURL(urlpath: string): Promise<boolean>;
36
+ export declare function fileExists(name: string): Promise<boolean>;
37
+ export declare function retrieveFileFormat(content: string): fileFormat | undefined;
38
+ export declare function convertToYaml(spec: string): string | undefined;
39
+ export declare function convertToJSON(spec: string): string | undefined;
40
+ export {};
@@ -0,0 +1,295 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Specification = void 0;
4
+ exports.load = load;
5
+ exports.nameType = nameType;
6
+ exports.isURL = isURL;
7
+ exports.fileExists = fileExists;
8
+ exports.retrieveFileFormat = retrieveFileFormat;
9
+ exports.convertToYaml = convertToYaml;
10
+ exports.convertToJSON = convertToJSON;
11
+ const tslib_1 = require("tslib");
12
+ const fs_1 = require("fs");
13
+ const path_1 = tslib_1.__importDefault(require("path"));
14
+ const url_1 = require("url");
15
+ const js_yaml_1 = tslib_1.__importDefault(require("js-yaml"));
16
+ const Context_1 = require("./Context");
17
+ const specification_file_1 = require("../../errors/specification-file");
18
+ const context_error_1 = require("../../errors/context-error");
19
+ const https_proxy_agent_1 = require("https-proxy-agent");
20
+ const { readFile, lstat } = fs_1.promises;
21
+ const allowedFileNames = [
22
+ 'asyncapi.json',
23
+ 'asyncapi.yml',
24
+ 'asyncapi.yaml',
25
+ ];
26
+ const TYPE_CONTEXT_NAME = 'context-name';
27
+ const TYPE_FILE_PATH = 'file-path';
28
+ const TYPE_URL = 'url-path';
29
+ class Specification {
30
+ constructor(spec, options = {}) {
31
+ this.spec = spec;
32
+ if (options.filepath) {
33
+ this.filePath = options.filepath;
34
+ this.kind = 'file';
35
+ }
36
+ else if (options.fileURL) {
37
+ this.fileURL = options.fileURL;
38
+ this.kind = 'url';
39
+ }
40
+ }
41
+ isAsyncAPI3() {
42
+ const jsObj = this.toJson();
43
+ return jsObj.asyncapi === '3.0.0';
44
+ }
45
+ toJson() {
46
+ try {
47
+ return js_yaml_1.default.load(this.spec, { json: true });
48
+ }
49
+ catch (e) {
50
+ return JSON.parse(this.spec);
51
+ }
52
+ }
53
+ text() {
54
+ return this.spec;
55
+ }
56
+ getFilePath() {
57
+ return this.filePath;
58
+ }
59
+ getFileURL() {
60
+ return this.fileURL;
61
+ }
62
+ getKind() {
63
+ return this.kind;
64
+ }
65
+ getSource() {
66
+ var _a;
67
+ return (_a = this.getFilePath()) !== null && _a !== void 0 ? _a : this.getFileURL();
68
+ }
69
+ toSourceString() {
70
+ if (this.kind === 'file') {
71
+ return `File ${this.filePath}`;
72
+ }
73
+ return `URL ${this.fileURL}`;
74
+ }
75
+ static fromFile(filepath) {
76
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
77
+ let spec;
78
+ try {
79
+ spec = yield readFile(filepath, { encoding: 'utf8' });
80
+ }
81
+ catch (error) {
82
+ throw new specification_file_1.ErrorLoadingSpec('file', filepath);
83
+ }
84
+ return new Specification(spec, { filepath });
85
+ });
86
+ }
87
+ static fromURL(URLpath) {
88
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
89
+ let response;
90
+ const delimiter = '+';
91
+ let targetUrl = URLpath;
92
+ let proxyUrl = '';
93
+ // Check if URLpath contains a proxy URL
94
+ if (URLpath.includes(delimiter)) {
95
+ [targetUrl, proxyUrl] = URLpath.split(delimiter);
96
+ }
97
+ try {
98
+ // Validate the target URL
99
+ new url_1.URL(targetUrl);
100
+ const fetchOptions = { method: 'GET' };
101
+ // If proxy URL is provided, create a proxy agent
102
+ if (proxyUrl) {
103
+ try {
104
+ new url_1.URL(proxyUrl);
105
+ const proxyAgent = new https_proxy_agent_1.HttpsProxyAgent(proxyUrl);
106
+ fetchOptions.agent = proxyAgent;
107
+ response = yield fetch(targetUrl, fetchOptions);
108
+ }
109
+ catch (err) {
110
+ throw new Error('Proxy Connection Error: Unable to establish a connection to the proxy check hostName or PortNumber');
111
+ }
112
+ }
113
+ else {
114
+ response = yield fetch(targetUrl);
115
+ if (!response.ok) {
116
+ throw new specification_file_1.ErrorLoadingSpec('url', targetUrl);
117
+ }
118
+ }
119
+ }
120
+ catch (error) {
121
+ console.log(error);
122
+ throw new specification_file_1.ErrorLoadingSpec('url', targetUrl);
123
+ }
124
+ return new Specification((yield (response === null || response === void 0 ? void 0 : response.text())), {
125
+ fileURL: targetUrl,
126
+ });
127
+ });
128
+ }
129
+ }
130
+ exports.Specification = Specification;
131
+ class SpecificationFile {
132
+ constructor(filePath) {
133
+ this.pathToFile = filePath;
134
+ }
135
+ getPath() {
136
+ return this.pathToFile;
137
+ }
138
+ read() {
139
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
140
+ return readFile(this.pathToFile, { encoding: 'utf8' });
141
+ });
142
+ }
143
+ }
144
+ exports.default = SpecificationFile;
145
+ /* eslint-disable sonarjs/cognitive-complexity */
146
+ function load(filePathOrContextName, loadType) {
147
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
148
+ // NOSONAR
149
+ try {
150
+ if (filePathOrContextName) {
151
+ if (loadType === null || loadType === void 0 ? void 0 : loadType.file) {
152
+ return Specification.fromFile(filePathOrContextName);
153
+ }
154
+ if (loadType === null || loadType === void 0 ? void 0 : loadType.context) {
155
+ return loadFromContext(filePathOrContextName);
156
+ }
157
+ if (loadType === null || loadType === void 0 ? void 0 : loadType.url) {
158
+ return Specification.fromURL(filePathOrContextName);
159
+ }
160
+ const type = yield nameType(filePathOrContextName);
161
+ if (type === TYPE_CONTEXT_NAME) {
162
+ return loadFromContext(filePathOrContextName);
163
+ }
164
+ if (type === TYPE_URL) {
165
+ return Specification.fromURL(filePathOrContextName);
166
+ }
167
+ yield fileExists(filePathOrContextName);
168
+ return Specification.fromFile(filePathOrContextName);
169
+ }
170
+ return yield loadFromContext();
171
+ }
172
+ catch (e) {
173
+ const autoDetectedSpecFile = yield detectSpecFile();
174
+ if (autoDetectedSpecFile) {
175
+ return Specification.fromFile(autoDetectedSpecFile);
176
+ }
177
+ if (e instanceof context_error_1.MissingContextFileError) {
178
+ throw new specification_file_1.ErrorLoadingSpec();
179
+ }
180
+ throw e;
181
+ }
182
+ });
183
+ }
184
+ function nameType(name) {
185
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
186
+ if (name.startsWith('.')) {
187
+ return TYPE_FILE_PATH;
188
+ }
189
+ try {
190
+ if (yield fileExists(name)) {
191
+ return TYPE_FILE_PATH;
192
+ }
193
+ return TYPE_CONTEXT_NAME;
194
+ }
195
+ catch (e) {
196
+ if (yield isURL(name)) {
197
+ return TYPE_URL;
198
+ }
199
+ return TYPE_CONTEXT_NAME;
200
+ }
201
+ });
202
+ }
203
+ function isURL(urlpath) {
204
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
205
+ try {
206
+ const url = new url_1.URL(urlpath);
207
+ return url.protocol === 'http:' || url.protocol === 'https:';
208
+ }
209
+ catch (error) {
210
+ return false;
211
+ }
212
+ });
213
+ }
214
+ function fileExists(name) {
215
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
216
+ try {
217
+ if ((yield lstat(name)).isFile()) {
218
+ return true;
219
+ }
220
+ const extension = name.split('.')[1];
221
+ const allowedExtenstion = ['yml', 'yaml', 'json'];
222
+ if (!allowedExtenstion.includes(extension)) {
223
+ throw new specification_file_1.ErrorLoadingSpec('invalid file', name);
224
+ }
225
+ throw new specification_file_1.ErrorLoadingSpec('file', name);
226
+ }
227
+ catch (e) {
228
+ throw new specification_file_1.ErrorLoadingSpec('file', name);
229
+ }
230
+ });
231
+ }
232
+ function loadFromContext(contextName) {
233
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
234
+ try {
235
+ const context = yield (0, Context_1.loadContext)(contextName);
236
+ return Specification.fromFile(context);
237
+ }
238
+ catch (error) {
239
+ if (error instanceof context_error_1.MissingContextFileError) {
240
+ throw new specification_file_1.ErrorLoadingSpec();
241
+ }
242
+ throw error;
243
+ }
244
+ });
245
+ }
246
+ function detectSpecFile() {
247
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
248
+ const existingFileNames = yield Promise.all(allowedFileNames.map((filename) => tslib_1.__awaiter(this, void 0, void 0, function* () {
249
+ try {
250
+ const exists = yield fileExists(path_1.default.resolve(process.cwd(), filename));
251
+ return exists ? filename : undefined;
252
+ }
253
+ catch (e) {
254
+ // We did our best...
255
+ }
256
+ })));
257
+ return existingFileNames.find((filename) => filename !== undefined);
258
+ });
259
+ }
260
+ function retrieveFileFormat(content) {
261
+ try {
262
+ if (content.trimStart()[0] === '{') {
263
+ JSON.parse(content);
264
+ return 'json';
265
+ }
266
+ // below yaml.load is not a definitive way to determine if a file is yaml or not.
267
+ // it is able to load .txt text files also.
268
+ js_yaml_1.default.load(content);
269
+ return 'yaml';
270
+ }
271
+ catch (err) {
272
+ return undefined;
273
+ }
274
+ }
275
+ function convertToYaml(spec) {
276
+ try {
277
+ // JS object -> YAML string
278
+ const jsonContent = js_yaml_1.default.load(spec);
279
+ return js_yaml_1.default.dump(jsonContent);
280
+ }
281
+ catch (err) {
282
+ console.error(err);
283
+ }
284
+ }
285
+ function convertToJSON(spec) {
286
+ try {
287
+ // JSON or YAML String -> JS object
288
+ const jsonContent = js_yaml_1.default.load(spec);
289
+ // JS Object -> pretty JSON string
290
+ return JSON.stringify(jsonContent, null, 2);
291
+ }
292
+ catch (err) {
293
+ console.error(err);
294
+ }
295
+ }
@@ -0,0 +1,2 @@
1
+ export declare const DEFAULT_PORT = 0;
2
+ export declare function start(filePath: string, port?: number, noBrowser?: boolean): void;