@redocly/openapi-core 1.0.0-beta.76 → 1.0.0-beta.80

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 (96) hide show
  1. package/__tests__/utils.ts +11 -1
  2. package/lib/bundle.d.ts +3 -1
  3. package/lib/bundle.js +30 -8
  4. package/lib/config/builtIn.js +18 -4
  5. package/lib/config/config.d.ts +2 -9
  6. package/lib/{rules → decorators}/common/info-description-override.d.ts +0 -0
  7. package/lib/{rules → decorators}/common/info-description-override.js +0 -0
  8. package/lib/{rules → decorators}/common/operation-description-override.d.ts +0 -0
  9. package/lib/{rules → decorators}/common/operation-description-override.js +0 -0
  10. package/lib/{rules → decorators}/common/registry-dependencies.d.ts +0 -0
  11. package/lib/{rules → decorators}/common/registry-dependencies.js +0 -0
  12. package/lib/decorators/common/remove-x-internal.d.ts +2 -0
  13. package/lib/decorators/common/remove-x-internal.js +58 -0
  14. package/lib/{rules → decorators}/common/tag-description-override.d.ts +0 -0
  15. package/lib/{rules → decorators}/common/tag-description-override.js +0 -0
  16. package/lib/decorators/oas2/index.d.ts +8 -0
  17. package/lib/decorators/oas2/index.js +15 -0
  18. package/lib/decorators/oas3/index.d.ts +8 -0
  19. package/lib/decorators/oas3/index.js +15 -0
  20. package/lib/format/format.d.ts +1 -1
  21. package/lib/format/format.js +39 -1
  22. package/lib/js-yaml/index.js +1 -1
  23. package/lib/resolve.d.ts +1 -0
  24. package/lib/resolve.js +7 -3
  25. package/lib/rules/oas2/index.d.ts +1 -7
  26. package/lib/rules/oas2/index.js +1 -11
  27. package/lib/rules/oas2/remove-unused-components.d.ts +2 -0
  28. package/lib/rules/oas2/remove-unused-components.js +73 -0
  29. package/lib/rules/oas3/index.d.ts +0 -7
  30. package/lib/rules/oas3/index.js +1 -11
  31. package/lib/rules/oas3/remove-unused-components.d.ts +2 -0
  32. package/lib/rules/oas3/remove-unused-components.js +83 -0
  33. package/lib/typings/swagger.d.ts +14 -0
  34. package/lib/utils.d.ts +2 -0
  35. package/lib/utils.js +9 -1
  36. package/lib/walk.js +5 -8
  37. package/package.json +1 -1
  38. package/src/__tests__/js-yaml.test.ts +29 -5
  39. package/src/__tests__/lint.test.ts +1 -3
  40. package/src/bundle.ts +37 -8
  41. package/src/config/builtIn.ts +20 -7
  42. package/src/config/config.ts +2 -3
  43. package/src/decorators/__tests__/remove-x-internal.test.ts +316 -0
  44. package/src/{rules → decorators}/common/info-description-override.ts +0 -0
  45. package/src/{rules → decorators}/common/operation-description-override.ts +0 -0
  46. package/src/{rules → decorators}/common/registry-dependencies.ts +0 -0
  47. package/src/decorators/common/remove-x-internal.ts +59 -0
  48. package/src/{rules → decorators}/common/tag-description-override.ts +0 -0
  49. package/src/decorators/oas2/index.ts +14 -0
  50. package/src/decorators/oas3/index.ts +14 -0
  51. package/src/format/format.ts +47 -2
  52. package/src/js-yaml/index.ts +1 -2
  53. package/src/resolve.ts +6 -6
  54. package/src/rules/__tests__/no-unresolved-refs.test.ts +1 -4
  55. package/src/rules/common/__tests__/info-description.test.ts +1 -3
  56. package/src/rules/common/__tests__/info-license.test.ts +1 -2
  57. package/src/rules/common/__tests__/license-url.test.ts +1 -2
  58. package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +1 -2
  59. package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +1 -2
  60. package/src/rules/common/__tests__/no-identical-paths.test.ts +1 -2
  61. package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +1 -2
  62. package/src/rules/common/__tests__/operation-2xx-response.test.ts +1 -2
  63. package/src/rules/common/__tests__/operation-4xx-response.test.ts +1 -2
  64. package/src/rules/common/__tests__/operation-operationId-unique.test.ts +1 -2
  65. package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +1 -2
  66. package/src/rules/common/__tests__/operation-parameters-unique.test.ts +1 -2
  67. package/src/rules/common/__tests__/operation-security-defined.test.ts +1 -2
  68. package/src/rules/common/__tests__/operation-singular-tag.test.ts +1 -2
  69. package/src/rules/common/__tests__/path-http-verbs-order.test.ts +1 -2
  70. package/src/rules/common/__tests__/path-not-include-query.test.ts +1 -2
  71. package/src/rules/common/__tests__/path-params-defined.test.ts +1 -2
  72. package/src/rules/common/__tests__/paths-kebab-case.test.ts +1 -2
  73. package/src/rules/common/__tests__/tag-description.test.ts +1 -2
  74. package/src/rules/common/__tests__/tags-alphabetical.test.ts +1 -2
  75. package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +1 -2
  76. package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +1 -2
  77. package/src/rules/oas2/index.ts +1 -11
  78. package/src/rules/oas2/remove-unused-components.ts +76 -0
  79. package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +1 -2
  80. package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +1 -2
  81. package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +1 -2
  82. package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +1 -2
  83. package/src/rules/oas3/__tests__/no-server-example.com.test.ts +1 -2
  84. package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +1 -2
  85. package/src/rules/oas3/__tests__/no-unused-components.test.ts +1 -2
  86. package/src/rules/oas3/index.ts +0 -12
  87. package/src/rules/oas3/remove-unused-components.ts +84 -0
  88. package/src/types/oas2.ts +0 -3
  89. package/src/typings/swagger.ts +7 -0
  90. package/src/utils.ts +8 -0
  91. package/src/walk.ts +6 -13
  92. package/tsconfig.tsbuildinfo +1 -1
  93. package/lib/rules/builtin.d.ts +0 -20
  94. package/lib/rules/builtin.js +0 -17
  95. package/src/rules/__tests__/config.ts +0 -10
  96. package/src/rules/builtin.ts +0 -18
@@ -1,8 +1,9 @@
1
1
  import * as path from 'path';
2
2
 
3
3
  import { Document, Source, NormalizedProblem, parseYaml, stringifyYaml } from '../src';
4
- import { RuleConfig, LintConfig, Plugin } from '../src/config/config';
4
+ import { RuleConfig, LintConfig, Plugin, DecoratorConfig } from '../src/config/config';
5
5
  import { Oas3RuleSet } from '../src/oas-types';
6
+ import { defaultPlugin } from '../src/config/builtIn';
6
7
 
7
8
  export function parseYamlToDocument(body: string, absoluteRef: string = ''): Document {
8
9
  return {
@@ -62,3 +63,12 @@ export function makeConfigForRuleset(rules: Oas3RuleSet, plugin?: Partial<Plugin
62
63
  rules: rulesConf,
63
64
  });
64
65
  }
66
+
67
+ export function makeConfig(rules: Record<string, RuleConfig>, decorators?: Record<string, DecoratorConfig>) {
68
+ return new LintConfig({
69
+ plugins: [defaultPlugin],
70
+ extends: [],
71
+ rules,
72
+ decorators,
73
+ });
74
+ }
package/lib/bundle.d.ts CHANGED
@@ -17,6 +17,7 @@ export declare function bundle(opts: {
17
17
  dereference?: boolean;
18
18
  base?: string;
19
19
  skipRedoclyRegistryRefs?: boolean;
20
+ removeUnusedComponents?: boolean;
20
21
  }): Promise<{
21
22
  bundle: Document;
22
23
  problems: import("./walk").NormalizedProblem[];
@@ -32,6 +33,7 @@ export declare function bundleDocument(opts: {
32
33
  externalRefResolver: BaseResolver;
33
34
  dereference?: boolean;
34
35
  skipRedoclyRegistryRefs?: boolean;
36
+ removeUnusedComponents?: boolean;
35
37
  }): Promise<{
36
38
  bundle: Document;
37
39
  problems: import("./walk").NormalizedProblem[];
@@ -40,4 +42,4 @@ export declare function bundleDocument(opts: {
40
42
  refTypes: Map<string, NormalizedNodeType> | undefined;
41
43
  visitorsData: Record<string, Record<string, unknown>>;
42
44
  }>;
43
- export declare function mapTypeToComponent(typeName: string, version: OasMajorVersion): "headers" | "responses" | "schemas" | "parameters" | "examples" | "requestBodies" | "securitySchemes" | "links" | "callbacks" | "definitions" | null;
45
+ export declare function mapTypeToComponent(typeName: string, version: OasMajorVersion): "headers" | "responses" | "definitions" | "parameters" | "schemas" | "examples" | "requestBodies" | "securitySchemes" | "links" | "callbacks" | null;
package/lib/bundle.js CHANGED
@@ -24,6 +24,8 @@ const rules_1 = require("./config/rules");
24
24
  const no_unresolved_refs_1 = require("./rules/no-unresolved-refs");
25
25
  const utils_1 = require("./utils");
26
26
  const redocly_1 = require("./redocly");
27
+ const remove_unused_components_1 = require("./rules/oas2/remove-unused-components");
28
+ const remove_unused_components_2 = require("./rules/oas3/remove-unused-components");
27
29
  var OasVersion;
28
30
  (function (OasVersion) {
29
31
  OasVersion["Version2"] = "oas2";
@@ -46,7 +48,7 @@ function bundle(opts) {
46
48
  exports.bundle = bundle;
47
49
  function bundleDocument(opts) {
48
50
  return __awaiter(this, void 0, void 0, function* () {
49
- const { document, config, customTypes, externalRefResolver, dereference = false, skipRedoclyRegistryRefs = false, } = opts;
51
+ const { document, config, customTypes, externalRefResolver, dereference = false, skipRedoclyRegistryRefs = false, removeUnusedComponents = false, } = opts;
50
52
  const oasVersion = oas_types_1.detectOpenAPI(document.parsed);
51
53
  const oasMajorVersion = oas_types_1.openAPIMajor(oasVersion);
52
54
  const rules = config.getRulesForOasVersion(oasMajorVersion);
@@ -63,20 +65,29 @@ function bundleDocument(opts) {
63
65
  refTypes: new Map(),
64
66
  visitorsData: {},
65
67
  };
68
+ if (removeUnusedComponents) {
69
+ decorators.push({
70
+ severity: 'error',
71
+ ruleId: 'remove-unused-components',
72
+ visitor: oasMajorVersion === oas_types_1.OasMajorVersion.Version2
73
+ ? remove_unused_components_1.RemoveUnusedComponents({})
74
+ : remove_unused_components_2.RemoveUnusedComponents({})
75
+ });
76
+ }
77
+ const resolvedRefMap = yield resolve_1.resolveDocument({
78
+ rootDocument: document,
79
+ rootType: types.DefinitionRoot,
80
+ externalRefResolver,
81
+ });
66
82
  const bundleVisitor = visitors_1.normalizeVisitors([
67
83
  ...preprocessors,
68
84
  {
69
85
  severity: 'error',
70
86
  ruleId: 'bundler',
71
- visitor: makeBundleVisitor(oasMajorVersion, dereference, skipRedoclyRegistryRefs, document),
87
+ visitor: makeBundleVisitor(oasMajorVersion, dereference, skipRedoclyRegistryRefs, document, resolvedRefMap),
72
88
  },
73
89
  ...decorators,
74
90
  ], types);
75
- const resolvedRefMap = yield resolve_1.resolveDocument({
76
- rootDocument: document,
77
- rootType: types.DefinitionRoot,
78
- externalRefResolver,
79
- });
80
91
  walk_1.walkDocument({
81
92
  document,
82
93
  rootType: types.DefinitionRoot,
@@ -135,7 +146,7 @@ function mapTypeToComponent(typeName, version) {
135
146
  }
136
147
  exports.mapTypeToComponent = mapTypeToComponent;
137
148
  // function oas3Move
138
- function makeBundleVisitor(version, dereference, skipRedoclyRegistryRefs, rootDocument) {
149
+ function makeBundleVisitor(version, dereference, skipRedoclyRegistryRefs, rootDocument, resolvedRefMap) {
139
150
  let components;
140
151
  const visitor = {
141
152
  ref: {
@@ -164,6 +175,7 @@ function makeBundleVisitor(version, dereference, skipRedoclyRegistryRefs, rootDo
164
175
  }
165
176
  else {
166
177
  node.$ref = saveComponent(componentType, resolved, ctx);
178
+ resolveBundledComponent(node, resolved, ctx);
167
179
  }
168
180
  }
169
181
  },
@@ -200,6 +212,16 @@ function makeBundleVisitor(version, dereference, skipRedoclyRegistryRefs, rootDo
200
212
  },
201
213
  };
202
214
  }
215
+ function resolveBundledComponent(node, resolved, ctx) {
216
+ const newRefId = resolve_1.makeRefId(ctx.location.source.absoluteRef, node.$ref);
217
+ resolvedRefMap.set(newRefId, {
218
+ document: rootDocument,
219
+ isRemote: false,
220
+ node: resolved.node,
221
+ nodePointer: node.$ref,
222
+ resolved: true,
223
+ });
224
+ }
203
225
  function replaceRef(ref, resolved, ctx) {
204
226
  if (!utils_1.isPlainObject(resolved.node)) {
205
227
  ctx.parent[ctx.key] = resolved.node;
@@ -4,7 +4,12 @@ exports.defaultPlugin = exports.builtInConfigs = void 0;
4
4
  const recommended_1 = require("./recommended");
5
5
  const all_1 = require("./all");
6
6
  const minimal_1 = require("./minimal");
7
- const builtinRules = require("../rules/builtin");
7
+ const oas3_1 = require("../rules/oas3");
8
+ const oas2_1 = require("../rules/oas2");
9
+ const oas3_2 = require("../rules/oas3");
10
+ const oas2_2 = require("../rules/oas2");
11
+ const oas3_3 = require("../decorators/oas3");
12
+ const oas2_3 = require("../decorators/oas2");
8
13
  exports.builtInConfigs = {
9
14
  recommended: recommended_1.default,
10
15
  minimal: minimal_1.default,
@@ -15,8 +20,17 @@ exports.builtInConfigs = {
15
20
  };
16
21
  exports.defaultPlugin = {
17
22
  id: '',
18
- rules: builtinRules.rules,
19
- preprocessors: builtinRules.preprocessors,
20
- decorators: builtinRules.decorators,
23
+ rules: {
24
+ oas3: oas3_1.rules,
25
+ oas2: oas2_1.rules,
26
+ },
27
+ preprocessors: {
28
+ oas3: oas3_2.preprocessors,
29
+ oas2: oas2_2.preprocessors,
30
+ },
31
+ decorators: {
32
+ oas3: oas3_3.decorators,
33
+ oas2: oas2_3.decorators,
34
+ },
21
35
  configs: exports.builtInConfigs,
22
36
  };
@@ -5,10 +5,9 @@ export declare const IGNORE_FILE = ".redocly.lint-ignore.yaml";
5
5
  export declare type RuleConfig = ProblemSeverity | 'off' | ({
6
6
  severity?: ProblemSeverity;
7
7
  } & Record<string, any>);
8
- export declare type PreprocessorConfig = ProblemSeverity | 'off' | 'on' | {
8
+ export declare type PreprocessorConfig = ProblemSeverity | 'off' | 'on' | ({
9
9
  severity?: ProblemSeverity;
10
- options?: Record<string, any>;
11
- };
10
+ } & Record<string, any>);
12
11
  export declare type DecoratorConfig = PreprocessorConfig;
13
12
  export declare type LintRawConfig = {
14
13
  plugins?: (string | Plugin)[];
@@ -107,15 +106,9 @@ export declare class LintConfig {
107
106
  };
108
107
  getPreprocessorSettings(ruleId: string, oasVersion: OasVersion): {
109
108
  severity: ProblemSeverity | "off";
110
- } | {
111
- severity: ProblemSeverity;
112
- options?: Record<string, any> | undefined;
113
109
  };
114
110
  getDecoratorSettings(ruleId: string, oasVersion: OasVersion): {
115
111
  severity: ProblemSeverity | "off";
116
- } | {
117
- severity: ProblemSeverity;
118
- options?: Record<string, any> | undefined;
119
112
  };
120
113
  getUnusedRules(): {
121
114
  rules: string[];
@@ -0,0 +1,2 @@
1
+ import { Oas3Decorator, Oas2Decorator } from '../../visitors';
2
+ export declare const RemoveXInternal: Oas3Decorator | Oas2Decorator;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RemoveXInternal = void 0;
4
+ const utils_1 = require("../../utils");
5
+ const ref_utils_1 = require("../../ref-utils");
6
+ const DEFAULT_INTERNAL_PROPERTY_NAME = 'x-internal';
7
+ const RemoveXInternal = ({ internalFlagProperty }) => {
8
+ const hiddenTag = internalFlagProperty || DEFAULT_INTERNAL_PROPERTY_NAME;
9
+ function removeInternal(node, ctx) {
10
+ var _a, _b, _c, _d;
11
+ const { parent, key } = ctx;
12
+ let didDelete = false;
13
+ if (Array.isArray(node)) {
14
+ for (let i = 0; i < node.length; i++) {
15
+ if (ref_utils_1.isRef(node[i])) {
16
+ const resolved = ctx.resolve(node[i]);
17
+ if ((_a = resolved.node) === null || _a === void 0 ? void 0 : _a[hiddenTag]) {
18
+ node.splice(i, 1);
19
+ didDelete = true;
20
+ i--;
21
+ }
22
+ }
23
+ if ((_b = node[i]) === null || _b === void 0 ? void 0 : _b[hiddenTag]) {
24
+ node.splice(i, 1);
25
+ didDelete = true;
26
+ i--;
27
+ }
28
+ }
29
+ }
30
+ else if (utils_1.isPlainObject(node)) {
31
+ for (const key of Object.keys(node)) {
32
+ node = node;
33
+ if (ref_utils_1.isRef(node[key])) {
34
+ const resolved = ctx.resolve(node[key]);
35
+ if ((_c = resolved.node) === null || _c === void 0 ? void 0 : _c[hiddenTag]) {
36
+ delete node[key];
37
+ didDelete = true;
38
+ }
39
+ }
40
+ if ((_d = node[key]) === null || _d === void 0 ? void 0 : _d[hiddenTag]) {
41
+ delete node[key];
42
+ didDelete = true;
43
+ }
44
+ }
45
+ }
46
+ if (didDelete && (utils_1.isEmptyObject(node) || utils_1.isEmptyArray(node))) {
47
+ delete parent[key];
48
+ }
49
+ }
50
+ return {
51
+ any: {
52
+ enter: (node, ctx) => {
53
+ removeInternal(node, ctx);
54
+ }
55
+ }
56
+ };
57
+ };
58
+ exports.RemoveXInternal = RemoveXInternal;
@@ -0,0 +1,8 @@
1
+ import { Oas2Decorator } from '../../visitors';
2
+ export declare const decorators: {
3
+ 'registry-dependencies': Oas2Decorator;
4
+ 'operation-description-override': Oas2Decorator;
5
+ 'tag-description-override': Oas2Decorator;
6
+ 'info-description-override': Oas2Decorator;
7
+ 'remove-x-internal': Oas2Decorator;
8
+ };
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.decorators = void 0;
4
+ const registry_dependencies_1 = require("../common/registry-dependencies");
5
+ const operation_description_override_1 = require("../common/operation-description-override");
6
+ const tag_description_override_1 = require("../common/tag-description-override");
7
+ const info_description_override_1 = require("../common/info-description-override");
8
+ const remove_x_internal_1 = require("../common/remove-x-internal");
9
+ exports.decorators = {
10
+ 'registry-dependencies': registry_dependencies_1.RegistryDependencies,
11
+ 'operation-description-override': operation_description_override_1.OperationDescriptionOverride,
12
+ 'tag-description-override': tag_description_override_1.TagDescriptionOverride,
13
+ 'info-description-override': info_description_override_1.InfoDescriptionOverride,
14
+ 'remove-x-internal': remove_x_internal_1.RemoveXInternal
15
+ };
@@ -0,0 +1,8 @@
1
+ import { Oas3Decorator } from '../../visitors';
2
+ export declare const decorators: {
3
+ 'registry-dependencies': Oas3Decorator;
4
+ 'operation-description-override': Oas3Decorator;
5
+ 'tag-description-override': Oas3Decorator;
6
+ 'info-description-override': Oas3Decorator;
7
+ 'remove-x-internal': Oas3Decorator;
8
+ };
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.decorators = void 0;
4
+ const registry_dependencies_1 = require("../common/registry-dependencies");
5
+ const operation_description_override_1 = require("../common/operation-description-override");
6
+ const tag_description_override_1 = require("../common/tag-description-override");
7
+ const info_description_override_1 = require("../common/info-description-override");
8
+ const remove_x_internal_1 = require("../common/remove-x-internal");
9
+ exports.decorators = {
10
+ 'registry-dependencies': registry_dependencies_1.RegistryDependencies,
11
+ 'operation-description-override': operation_description_override_1.OperationDescriptionOverride,
12
+ 'tag-description-override': tag_description_override_1.TagDescriptionOverride,
13
+ 'info-description-override': info_description_override_1.InfoDescriptionOverride,
14
+ 'remove-x-internal': remove_x_internal_1.RemoveXInternal
15
+ };
@@ -4,7 +4,7 @@ export declare type Totals = {
4
4
  warnings: number;
5
5
  ignored: number;
6
6
  };
7
- export declare type OutputFormat = 'codeframe' | 'stylish' | 'json';
7
+ export declare type OutputFormat = 'codeframe' | 'stylish' | 'json' | 'checkstyle';
8
8
  export declare function getTotals(problems: (NormalizedProblem & {
9
9
  ignored?: boolean;
10
10
  })[]): Totals;
@@ -66,7 +66,7 @@ function formatProblems(problems, opts) {
66
66
  process.stderr.write(`${formatCodeframe(problem, i)}\n`);
67
67
  }
68
68
  break;
69
- case 'stylish':
69
+ case 'stylish': {
70
70
  const groupedByFile = groupByFiles(problems);
71
71
  for (const [file, { ruleIdPad, locationPad: positionPad, fileProblems }] of Object.entries(groupedByFile)) {
72
72
  process.stderr.write(`${colorette_1.blue(path.relative(cwd, file))}:\n`);
@@ -77,6 +77,19 @@ function formatProblems(problems, opts) {
77
77
  process.stderr.write('\n');
78
78
  }
79
79
  break;
80
+ }
81
+ case 'checkstyle': {
82
+ const groupedByFile = groupByFiles(problems);
83
+ process.stdout.write('<?xml version="1.0" encoding="UTF-8"?>\n');
84
+ process.stdout.write('<checkstyle version="4.3">\n');
85
+ for (const [file, { fileProblems }] of Object.entries(groupedByFile)) {
86
+ process.stdout.write(`<file name="${xmlEscape(path.relative(cwd, file))}">\n`);
87
+ fileProblems.forEach(formatCheckstyle);
88
+ process.stdout.write(`</file>\n`);
89
+ }
90
+ process.stdout.write(`</checkstyle>\n`);
91
+ break;
92
+ }
80
93
  }
81
94
  if (totalProblems - ignoredProblems > maxProblems) {
82
95
  process.stderr.write(`< ... ${totalProblems - maxProblems} more problems hidden > ${colorette_1.gray('increase with `--max-problems N`')}\n`);
@@ -131,6 +144,13 @@ function formatProblems(problems, opts) {
131
144
  const { start } = problem.location[0];
132
145
  return ` ${`${start.line}:${start.col}`.padEnd(locationPad)} ${severityName} ${problem.ruleId.padEnd(ruleIdPad)} ${problem.message}`;
133
146
  }
147
+ function formatCheckstyle(problem) {
148
+ const { line, col } = problem.location[0].start;
149
+ const severity = problem.severity == 'warn' ? 'warning' : 'error';
150
+ const message = xmlEscape(problem.message);
151
+ const source = xmlEscape(problem.ruleId);
152
+ process.stdout.write(`<error line="${line}" column="${col}" severity="${severity}" message="${message}" source="${source}" />\n`);
153
+ }
134
154
  }
135
155
  exports.formatProblems = formatProblems;
136
156
  function formatFrom(cwd, location) {
@@ -167,3 +187,21 @@ const groupByFiles = (problems) => {
167
187
  }
168
188
  return fileGroups;
169
189
  };
190
+ function xmlEscape(s) {
191
+ return s.replace(/[<>&"'\x00-\x1F\x7F\u0080-\uFFFF]/gu, (char) => {
192
+ switch (char) {
193
+ case '<':
194
+ return '&lt;';
195
+ case '>':
196
+ return '&gt;';
197
+ case '&':
198
+ return '&amp;';
199
+ case '"':
200
+ return '&quot;';
201
+ case "'":
202
+ return '&apos;';
203
+ default:
204
+ return `&#${char.charCodeAt(0)};`;
205
+ }
206
+ });
207
+ }
@@ -15,5 +15,5 @@ const DEFAULT_SCHEMA_WITHOUT_TIMESTAMP = js_yaml_1.JSON_SCHEMA.extend({
15
15
  });
16
16
  const parseYaml = (str, opts) => js_yaml_1.load(str, Object.assign({ schema: DEFAULT_SCHEMA_WITHOUT_TIMESTAMP }, opts));
17
17
  exports.parseYaml = parseYaml;
18
- const stringifyYaml = (obj, opts) => js_yaml_1.dump(obj, Object.assign({ schema: DEFAULT_SCHEMA_WITHOUT_TIMESTAMP }, opts));
18
+ const stringifyYaml = (obj, opts) => js_yaml_1.dump(obj, opts);
19
19
  exports.stringifyYaml = stringifyYaml;
package/lib/resolve.d.ts CHANGED
@@ -27,6 +27,7 @@ export declare type Document = {
27
27
  source: Source;
28
28
  parsed: any;
29
29
  };
30
+ export declare function makeRefId(absoluteRef: string, pointer: string): string;
30
31
  export declare function makeDocumentFromString(sourceString: string, absoluteRef: string): {
31
32
  source: Source;
32
33
  parsed: unknown;
package/lib/resolve.js CHANGED
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.resolveDocument = exports.BaseResolver = exports.makeDocumentFromString = exports.YamlParseError = exports.ResolveError = exports.Source = void 0;
12
+ exports.resolveDocument = exports.BaseResolver = exports.makeDocumentFromString = exports.makeRefId = exports.YamlParseError = exports.ResolveError = exports.Source = void 0;
13
13
  const fs = require("fs");
14
14
  const path = require("path");
15
15
  const url = require("url");
@@ -69,6 +69,10 @@ class YamlParseError extends Error {
69
69
  }
70
70
  }
71
71
  exports.YamlParseError = YamlParseError;
72
+ function makeRefId(absoluteRef, pointer) {
73
+ return absoluteRef + '::' + pointer;
74
+ }
75
+ exports.makeRefId = makeRefId;
72
76
  function makeDocumentFromString(sourceString, absoluteRef) {
73
77
  const source = new Source(absoluteRef, sourceString);
74
78
  try {
@@ -255,7 +259,7 @@ function resolveDocument(opts) {
255
259
  document: undefined,
256
260
  error: error,
257
261
  };
258
- const refId = document.source.absoluteRef + '::' + ref.$ref;
262
+ const refId = makeRefId(document.source.absoluteRef, ref.$ref);
259
263
  resolvedRefMap.set(refId, resolvedRef);
260
264
  return resolvedRef;
261
265
  }
@@ -294,7 +298,7 @@ function resolveDocument(opts) {
294
298
  }
295
299
  resolvedRef.node = target;
296
300
  resolvedRef.document = targetDoc;
297
- const refId = document.source.absoluteRef + '::' + ref.$ref;
301
+ const refId = makeRefId(document.source.absoluteRef, ref.$ref);
298
302
  if (resolvedRef.document && ref_utils_1.isRef(target)) {
299
303
  resolvedRef = yield followRef(resolvedRef.document, target, pushRef(refStack, target));
300
304
  }
@@ -1,4 +1,4 @@
1
- import { Oas2Decorator, Oas2Rule } from '../../visitors';
1
+ import { Oas2Rule } from '../../visitors';
2
2
  export declare const rules: {
3
3
  spec: Oas2Rule;
4
4
  'no-invalid-schema-examples': any;
@@ -40,9 +40,3 @@ export declare const rules: {
40
40
  'path-segment-plural': Oas2Rule;
41
41
  };
42
42
  export declare const preprocessors: {};
43
- export declare const decorators: {
44
- 'registry-dependencies': Oas2Decorator;
45
- 'operation-description-override': Oas2Decorator;
46
- 'tag-description-override': Oas2Decorator;
47
- 'info-description-override': Oas2Decorator;
48
- };
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.decorators = exports.preprocessors = exports.rules = void 0;
3
+ exports.preprocessors = exports.rules = void 0;
4
4
  const spec_1 = require("../common/spec");
5
5
  const no_invalid_schema_examples_1 = require("../common/no-invalid-schema-examples");
6
6
  const no_invalid_parameter_examples_1 = require("../common/no-invalid-parameter-examples");
@@ -29,7 +29,6 @@ const operation_singular_tag_1 = require("../common/operation-singular-tag");
29
29
  const operation_security_defined_1 = require("../common/operation-security-defined");
30
30
  const no_unresolved_refs_1 = require("../no-unresolved-refs");
31
31
  const path_http_verbs_order_1 = require("../common/path-http-verbs-order");
32
- const registry_dependencies_1 = require("../common/registry-dependencies");
33
32
  const no_identical_paths_1 = require("../common/no-identical-paths");
34
33
  const operation_operationId_1 = require("../common/operation-operationId");
35
34
  const operation_summary_1 = require("../common/operation-summary");
@@ -39,9 +38,6 @@ const path_excludes_patterns_1 = require("../common/path-excludes-patterns");
39
38
  const request_mime_type_1 = require("./request-mime-type");
40
39
  const response_mime_type_1 = require("./response-mime-type");
41
40
  const path_segment_plural_1 = require("../common/path-segment-plural");
42
- const operation_description_override_1 = require("../common/operation-description-override");
43
- const tag_description_override_1 = require("../common/tag-description-override");
44
- const info_description_override_1 = require("../common/info-description-override");
45
41
  exports.rules = {
46
42
  spec: spec_1.OasSpec,
47
43
  'no-invalid-schema-examples': no_invalid_schema_examples_1.NoInvalidSchemaExamples,
@@ -83,9 +79,3 @@ exports.rules = {
83
79
  'path-segment-plural': path_segment_plural_1.PathSegmentPlural,
84
80
  };
85
81
  exports.preprocessors = {};
86
- exports.decorators = {
87
- 'registry-dependencies': registry_dependencies_1.RegistryDependencies,
88
- 'operation-description-override': operation_description_override_1.OperationDescriptionOverride,
89
- 'tag-description-override': tag_description_override_1.TagDescriptionOverride,
90
- 'info-description-override': info_description_override_1.InfoDescriptionOverride,
91
- };
@@ -0,0 +1,2 @@
1
+ import { Oas2Rule } from '../../visitors';
2
+ export declare const RemoveUnusedComponents: Oas2Rule;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RemoveUnusedComponents = void 0;
4
+ const utils_1 = require("../../utils");
5
+ const RemoveUnusedComponents = () => {
6
+ let components = new Map();
7
+ function registerComponent(location, componentType, name) {
8
+ var _a;
9
+ components.set(location.absolutePointer, {
10
+ used: ((_a = components.get(location.absolutePointer)) === null || _a === void 0 ? void 0 : _a.used) || false,
11
+ componentType,
12
+ name,
13
+ });
14
+ }
15
+ return {
16
+ ref: {
17
+ leave(ref, { type, resolve, key }) {
18
+ if (['Schema', 'Parameter', 'Response', 'SecurityScheme'].includes(type.name)) {
19
+ const resolvedRef = resolve(ref);
20
+ if (!resolvedRef.location)
21
+ return;
22
+ components.set(resolvedRef.location.absolutePointer, {
23
+ used: true,
24
+ name: key.toString(),
25
+ });
26
+ }
27
+ }
28
+ },
29
+ DefinitionRoot: {
30
+ leave(root, ctx) {
31
+ const data = ctx.getVisitorData();
32
+ data.removedCount = 0;
33
+ let rootComponents = new Set();
34
+ components.forEach(usageInfo => {
35
+ const { used, name, componentType } = usageInfo;
36
+ if (!used && componentType) {
37
+ rootComponents.add(componentType);
38
+ delete root[componentType][name];
39
+ data.removedCount++;
40
+ }
41
+ });
42
+ for (const component of rootComponents) {
43
+ if (utils_1.isEmptyObject(root[component])) {
44
+ delete root[component];
45
+ }
46
+ }
47
+ },
48
+ },
49
+ NamedSchemas: {
50
+ Schema(schema, { location, key }) {
51
+ if (!schema.allOf) {
52
+ registerComponent(location, 'definitions', key.toString());
53
+ }
54
+ },
55
+ },
56
+ NamedParameters: {
57
+ Parameter(_parameter, { location, key }) {
58
+ registerComponent(location, 'parameters', key.toString());
59
+ },
60
+ },
61
+ NamedResponses: {
62
+ Response(_response, { location, key }) {
63
+ registerComponent(location, 'responses', key.toString());
64
+ },
65
+ },
66
+ NamedSecuritySchemes: {
67
+ SecurityScheme(_securityScheme, { location, key }) {
68
+ registerComponent(location, 'securityDefinitions', key.toString());
69
+ },
70
+ }
71
+ };
72
+ };
73
+ exports.RemoveUnusedComponents = RemoveUnusedComponents;
@@ -1,10 +1,3 @@
1
1
  import { Oas3RuleSet } from '../../oas-types';
2
- import { Oas3Decorator } from '../../visitors';
3
2
  export declare const rules: Oas3RuleSet;
4
3
  export declare const preprocessors: {};
5
- export declare const decorators: {
6
- 'registry-dependencies': Oas3Decorator;
7
- 'operation-description-override': Oas3Decorator;
8
- 'tag-description-override': Oas3Decorator;
9
- 'info-description-override': Oas3Decorator;
10
- };
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.decorators = exports.preprocessors = exports.rules = void 0;
3
+ exports.preprocessors = exports.rules = void 0;
4
4
  const spec_1 = require("../common/spec");
5
5
  const operation_2xx_response_1 = require("../common/operation-2xx-response");
6
6
  const operation_4xx_response_1 = require("../common/operation-4xx-response");
@@ -33,7 +33,6 @@ const paths_kebab_case_1 = require("../common/paths-kebab-case");
33
33
  const path_http_verbs_order_1 = require("../common/path-http-verbs-order");
34
34
  const no_empty_servers_1 = require("./no-empty-servers");
35
35
  const no_invalid_media_type_examples_1 = require("./no-invalid-media-type-examples");
36
- const registry_dependencies_1 = require("../common/registry-dependencies");
37
36
  const no_identical_paths_1 = require("../common/no-identical-paths");
38
37
  const no_undefined_server_variable_1 = require("./no-undefined-server-variable");
39
38
  const operation_operationId_1 = require("../common/operation-operationId");
@@ -44,9 +43,6 @@ const no_http_verbs_in_paths_1 = require("../common/no-http-verbs-in-paths");
44
43
  const request_mime_type_1 = require("./request-mime-type");
45
44
  const response_mime_type_1 = require("./response-mime-type");
46
45
  const path_segment_plural_1 = require("../common/path-segment-plural");
47
- const operation_description_override_1 = require("../common/operation-description-override");
48
- const tag_description_override_1 = require("../common/tag-description-override");
49
- const info_description_override_1 = require("../common/info-description-override");
50
46
  const path_excludes_patterns_1 = require("../common/path-excludes-patterns");
51
47
  const no_invalid_schema_examples_1 = require("../common/no-invalid-schema-examples");
52
48
  const no_invalid_parameter_examples_1 = require("../common/no-invalid-parameter-examples");
@@ -99,9 +95,3 @@ exports.rules = {
99
95
  'no-invalid-parameter-examples': no_invalid_parameter_examples_1.NoInvalidParameterExamples,
100
96
  };
101
97
  exports.preprocessors = {};
102
- exports.decorators = {
103
- 'registry-dependencies': registry_dependencies_1.RegistryDependencies,
104
- 'operation-description-override': operation_description_override_1.OperationDescriptionOverride,
105
- 'tag-description-override': tag_description_override_1.TagDescriptionOverride,
106
- 'info-description-override': info_description_override_1.InfoDescriptionOverride,
107
- };
@@ -0,0 +1,2 @@
1
+ import { Oas3Rule } from '../../visitors';
2
+ export declare const RemoveUnusedComponents: Oas3Rule;