@eventcatalog/linter 0.0.1

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 (78) hide show
  1. package/README.md +583 -0
  2. package/dist/cli/index.d.ts +3 -0
  3. package/dist/cli/index.d.ts.map +1 -0
  4. package/dist/cli/index.js +54 -0
  5. package/dist/cli/index.js.map +1 -0
  6. package/dist/index.d.ts +7 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +23 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/parser/index.d.ts +17 -0
  11. package/dist/parser/index.d.ts.map +1 -0
  12. package/dist/parser/index.js +43 -0
  13. package/dist/parser/index.js.map +1 -0
  14. package/dist/reporters/index.d.ts +16 -0
  15. package/dist/reporters/index.d.ts.map +1 -0
  16. package/dist/reporters/index.js +151 -0
  17. package/dist/reporters/index.js.map +1 -0
  18. package/dist/scanner/index.d.ts +14 -0
  19. package/dist/scanner/index.d.ts.map +1 -0
  20. package/dist/scanner/index.js +99 -0
  21. package/dist/scanner/index.js.map +1 -0
  22. package/dist/schemas/channel.d.ts +389 -0
  23. package/dist/schemas/channel.d.ts.map +1 -0
  24. package/dist/schemas/channel.js +20 -0
  25. package/dist/schemas/channel.js.map +1 -0
  26. package/dist/schemas/common.d.ts +550 -0
  27. package/dist/schemas/common.d.ts.map +1 -0
  28. package/dist/schemas/common.js +144 -0
  29. package/dist/schemas/common.js.map +1 -0
  30. package/dist/schemas/domain.d.ts +381 -0
  31. package/dist/schemas/domain.d.ts.map +1 -0
  32. package/dist/schemas/domain.js +13 -0
  33. package/dist/schemas/domain.js.map +1 -0
  34. package/dist/schemas/entity.d.ts +382 -0
  35. package/dist/schemas/entity.d.ts.map +1 -0
  36. package/dist/schemas/entity.js +24 -0
  37. package/dist/schemas/entity.js.map +1 -0
  38. package/dist/schemas/flow.d.ts +733 -0
  39. package/dist/schemas/flow.d.ts.map +1 -0
  40. package/dist/schemas/flow.js +70 -0
  41. package/dist/schemas/flow.js.map +1 -0
  42. package/dist/schemas/index.d.ts +3432 -0
  43. package/dist/schemas/index.d.ts.map +1 -0
  44. package/dist/schemas/index.js +47 -0
  45. package/dist/schemas/index.js.map +1 -0
  46. package/dist/schemas/message.d.ts +1076 -0
  47. package/dist/schemas/message.d.ts.map +1 -0
  48. package/dist/schemas/message.js +17 -0
  49. package/dist/schemas/message.js.map +1 -0
  50. package/dist/schemas/service.d.ts +381 -0
  51. package/dist/schemas/service.d.ts.map +1 -0
  52. package/dist/schemas/service.js +13 -0
  53. package/dist/schemas/service.js.map +1 -0
  54. package/dist/schemas/team.d.ts +45 -0
  55. package/dist/schemas/team.d.ts.map +1 -0
  56. package/dist/schemas/team.js +20 -0
  57. package/dist/schemas/team.js.map +1 -0
  58. package/dist/schemas/user.d.ts +48 -0
  59. package/dist/schemas/user.d.ts.map +1 -0
  60. package/dist/schemas/user.js +21 -0
  61. package/dist/schemas/user.js.map +1 -0
  62. package/dist/types/index.d.ts +81 -0
  63. package/dist/types/index.d.ts.map +1 -0
  64. package/dist/types/index.js +3 -0
  65. package/dist/types/index.js.map +1 -0
  66. package/dist/validators/index.d.ts +6 -0
  67. package/dist/validators/index.d.ts.map +1 -0
  68. package/dist/validators/index.js +28 -0
  69. package/dist/validators/index.js.map +1 -0
  70. package/dist/validators/reference-validator.d.ts +11 -0
  71. package/dist/validators/reference-validator.d.ts.map +1 -0
  72. package/dist/validators/reference-validator.js +171 -0
  73. package/dist/validators/reference-validator.js.map +1 -0
  74. package/dist/validators/schema-validator.d.ts +5 -0
  75. package/dist/validators/schema-validator.d.ts.map +1 -0
  76. package/dist/validators/schema-validator.js +50 -0
  77. package/dist/validators/schema-validator.js.map +1 -0
  78. package/package.json +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export * from './schema-validator';
2
+ export * from './reference-validator';
3
+ import { ParsedFile } from '../parser';
4
+ import { ValidationError } from '../types';
5
+ export declare const validateCatalog: (parsedFiles: ParsedFile[]) => ValidationError[];
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validators/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAI3C,eAAO,MAAM,eAAe,GAAI,aAAa,UAAU,EAAE,KAAG,eAAe,EAK1E,CAAC"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.validateCatalog = void 0;
18
+ __exportStar(require("./schema-validator"), exports);
19
+ __exportStar(require("./reference-validator"), exports);
20
+ const schema_validator_1 = require("./schema-validator");
21
+ const reference_validator_1 = require("./reference-validator");
22
+ const validateCatalog = (parsedFiles) => {
23
+ const schemaErrors = (0, schema_validator_1.validateAllSchemas)(parsedFiles);
24
+ const referenceErrors = (0, reference_validator_1.validateReferences)(parsedFiles);
25
+ return [...schemaErrors, ...referenceErrors];
26
+ };
27
+ exports.validateCatalog = validateCatalog;
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,wDAAsC;AAItC,yDAAwD;AACxD,+DAA2D;AAEpD,MAAM,eAAe,GAAG,CAAC,WAAyB,EAAqB,EAAE;IAC9E,MAAM,YAAY,GAAG,IAAA,qCAAkB,EAAC,WAAW,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,IAAA,wCAAkB,EAAC,WAAW,CAAC,CAAC;IAExD,OAAO,CAAC,GAAG,YAAY,EAAE,GAAG,eAAe,CAAC,CAAC;AAC/C,CAAC,CAAC;AALW,QAAA,eAAe,mBAK1B"}
@@ -0,0 +1,11 @@
1
+ import { ParsedFile } from '../parser';
2
+ import { ValidationError } from '../types';
3
+ interface ResourceIndex {
4
+ [resourceType: string]: {
5
+ [resourceId: string]: Set<string>;
6
+ };
7
+ }
8
+ export declare const buildResourceIndex: (parsedFiles: ParsedFile[]) => ResourceIndex;
9
+ export declare const validateReferences: (parsedFiles: ParsedFile[]) => ValidationError[];
10
+ export {};
11
+ //# sourceMappingURL=reference-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-validator.d.ts","sourceRoot":"","sources":["../../src/validators/reference-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,eAAe,EAAqB,MAAM,UAAU,CAAC;AAI9D,UAAU,aAAa;IACrB,CAAC,YAAY,EAAE,MAAM,GAAG;QACtB,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;KACnC,CAAC;CACH;AAED,eAAO,MAAM,kBAAkB,GAAI,aAAa,UAAU,EAAE,KAAG,aA8B9D,CAAC;AA0IF,eAAO,MAAM,kBAAkB,GAAI,aAAa,UAAU,EAAE,KAAG,eAAe,EAyB7E,CAAC"}
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.validateReferences = exports.buildResourceIndex = void 0;
7
+ const semver_1 = __importDefault(require("semver"));
8
+ const buildResourceIndex = (parsedFiles) => {
9
+ const index = {};
10
+ for (const parsedFile of parsedFiles) {
11
+ const { file, frontmatter } = parsedFile;
12
+ const { resourceType } = file;
13
+ // For users and teams, use the frontmatter id field instead of filename
14
+ // This handles cases where filename is "aSmith.mdx" but frontmatter has id: "asmith"
15
+ let resourceId = file.resourceId;
16
+ if ((resourceType === 'user' || resourceType === 'team') && frontmatter.id && typeof frontmatter.id === 'string') {
17
+ resourceId = frontmatter.id;
18
+ }
19
+ if (!index[resourceType]) {
20
+ index[resourceType] = {};
21
+ }
22
+ if (!index[resourceType][resourceId]) {
23
+ index[resourceType][resourceId] = new Set();
24
+ }
25
+ if (frontmatter.version && typeof frontmatter.version === 'string') {
26
+ index[resourceType][resourceId].add(frontmatter.version);
27
+ }
28
+ else {
29
+ index[resourceType][resourceId].add('latest');
30
+ }
31
+ }
32
+ return index;
33
+ };
34
+ exports.buildResourceIndex = buildResourceIndex;
35
+ const checkResourceExists = (ref, resourceType, index) => {
36
+ const resourceVersions = index[resourceType]?.[ref.id];
37
+ if (!resourceVersions || resourceVersions.size === 0) {
38
+ return false;
39
+ }
40
+ if (!ref.version) {
41
+ return true;
42
+ }
43
+ const refVersion = ref.version === 'latest' ? ref.version : ref.version;
44
+ const availableVersions = Array.from(resourceVersions);
45
+ // Handle 'latest' specifically
46
+ if (refVersion === 'latest') {
47
+ return availableVersions.includes('latest') || availableVersions.length > 0;
48
+ }
49
+ // Check for exact match first
50
+ if (availableVersions.includes(refVersion)) {
51
+ return true;
52
+ }
53
+ // Handle semver patterns like '0.0.x', '^1.0.0', '~1.2.0', etc.
54
+ try {
55
+ // Filter out 'latest' from available versions for semver matching
56
+ const semverVersions = availableVersions.filter((v) => v !== 'latest' && semver_1.default.valid(v));
57
+ // Check if any available version satisfies the requested version pattern
58
+ for (const availableVersion of semverVersions) {
59
+ if (semver_1.default.satisfies(availableVersion, refVersion)) {
60
+ return true;
61
+ }
62
+ }
63
+ // Special handling for patterns like '0.0.x' which aren't standard semver ranges
64
+ if (refVersion.includes('.x')) {
65
+ const pattern = refVersion.replace(/\.x/g, '');
66
+ for (const availableVersion of semverVersions) {
67
+ if (availableVersion.startsWith(pattern)) {
68
+ return true;
69
+ }
70
+ }
71
+ }
72
+ return false;
73
+ }
74
+ catch (error) {
75
+ // If semver parsing fails, fall back to exact string match
76
+ return availableVersions.includes(refVersion);
77
+ }
78
+ };
79
+ const extractReferences = (parsedFile) => {
80
+ const { file, frontmatter } = parsedFile;
81
+ const references = [];
82
+ if (file.resourceType === 'domain') {
83
+ if (frontmatter.services && Array.isArray(frontmatter.services)) {
84
+ frontmatter.services.forEach((ref) => {
85
+ references.push({ ref, possibleTypes: ['service'], field: 'services' });
86
+ });
87
+ }
88
+ if (frontmatter.entities && Array.isArray(frontmatter.entities)) {
89
+ frontmatter.entities.forEach((ref) => {
90
+ references.push({ ref, possibleTypes: ['entity'], field: 'entities' });
91
+ });
92
+ }
93
+ }
94
+ if (file.resourceType === 'service') {
95
+ if (frontmatter.sends && Array.isArray(frontmatter.sends)) {
96
+ frontmatter.sends.forEach((ref) => {
97
+ references.push({ ref, possibleTypes: ['event', 'command', 'query'], field: 'sends' });
98
+ });
99
+ }
100
+ if (frontmatter.receives && Array.isArray(frontmatter.receives)) {
101
+ frontmatter.receives.forEach((ref) => {
102
+ references.push({ ref, possibleTypes: ['event', 'command', 'query'], field: 'receives' });
103
+ });
104
+ }
105
+ if (frontmatter.entities && Array.isArray(frontmatter.entities)) {
106
+ frontmatter.entities.forEach((ref) => {
107
+ references.push({ ref, possibleTypes: ['entity'], field: 'entities' });
108
+ });
109
+ }
110
+ }
111
+ if (file.resourceType === 'flow' && frontmatter.steps && Array.isArray(frontmatter.steps)) {
112
+ frontmatter.steps.forEach((step, index) => {
113
+ if (step.message) {
114
+ references.push({
115
+ ref: step.message,
116
+ possibleTypes: ['event', 'command', 'query'],
117
+ field: `steps[${index}].message`,
118
+ });
119
+ }
120
+ if (step.service) {
121
+ references.push({ ref: step.service, possibleTypes: ['service'], field: `steps[${index}].service` });
122
+ }
123
+ });
124
+ }
125
+ if (file.resourceType === 'entity' && frontmatter.properties && Array.isArray(frontmatter.properties)) {
126
+ frontmatter.properties.forEach((prop, index) => {
127
+ if (prop.references) {
128
+ references.push({
129
+ ref: { id: prop.references },
130
+ possibleTypes: ['entity'],
131
+ field: `properties[${index}].references`,
132
+ });
133
+ }
134
+ });
135
+ }
136
+ if (frontmatter.owners && Array.isArray(frontmatter.owners)) {
137
+ frontmatter.owners.forEach((owner) => {
138
+ references.push({ ref: { id: owner }, possibleTypes: ['user', 'team'], field: 'owners' });
139
+ });
140
+ }
141
+ if (file.resourceType === 'team' && frontmatter.members && Array.isArray(frontmatter.members)) {
142
+ frontmatter.members.forEach((member) => {
143
+ references.push({ ref: { id: member }, possibleTypes: ['user'], field: 'members' });
144
+ });
145
+ }
146
+ return references;
147
+ };
148
+ const validateReferences = (parsedFiles) => {
149
+ const index = (0, exports.buildResourceIndex)(parsedFiles);
150
+ const errors = [];
151
+ for (const parsedFile of parsedFiles) {
152
+ const references = extractReferences(parsedFile);
153
+ for (const { ref, possibleTypes, field } of references) {
154
+ const found = possibleTypes.some((type) => checkResourceExists(ref, type, index));
155
+ if (!found) {
156
+ const versionStr = ref.version ? ` (version: ${ref.version})` : '';
157
+ const typeStr = possibleTypes.length === 1 ? possibleTypes[0] : possibleTypes.join('/');
158
+ errors.push({
159
+ type: 'reference',
160
+ resource: `${parsedFile.file.resourceType}/${parsedFile.file.resourceId}`,
161
+ field,
162
+ message: `Referenced ${typeStr} "${ref.id}"${versionStr} does not exist`,
163
+ file: parsedFile.file.relativePath,
164
+ });
165
+ }
166
+ }
167
+ }
168
+ return errors;
169
+ };
170
+ exports.validateReferences = validateReferences;
171
+ //# sourceMappingURL=reference-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-validator.js","sourceRoot":"","sources":["../../src/validators/reference-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ParsedFile } from '../parser';
2
+ import { ValidationError } from '../types';
3
+ export declare const validateSchema: (parsedFile: ParsedFile) => ValidationError[];
4
+ export declare const validateAllSchemas: (parsedFiles: ParsedFile[]) => ValidationError[];
5
+ //# sourceMappingURL=schema-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../../src/validators/schema-validator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,eAAO,MAAM,cAAc,GAAI,YAAY,UAAU,KAAG,eAAe,EAoCtE,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,aAAa,UAAU,EAAE,KAAG,eAAe,EAQ7E,CAAC"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateAllSchemas = exports.validateSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const schemas_1 = require("../schemas");
6
+ const validateSchema = (parsedFile) => {
7
+ const { file, frontmatter } = parsedFile;
8
+ const schema = schemas_1.schemas[file.resourceType];
9
+ const errors = [];
10
+ try {
11
+ schema.parse(frontmatter);
12
+ }
13
+ catch (error) {
14
+ if (error instanceof zod_1.z.ZodError) {
15
+ for (const issue of error.issues) {
16
+ const field = issue.path.join('.');
17
+ let message = issue.message;
18
+ if (issue.code === 'invalid_type') {
19
+ message = `Expected ${issue.expected}, but received ${issue.received}`;
20
+ }
21
+ errors.push({
22
+ type: 'schema',
23
+ resource: `${file.resourceType}/${file.resourceId}`,
24
+ field: field || undefined,
25
+ message: field ? `${field}: ${message}` : message,
26
+ file: file.relativePath,
27
+ });
28
+ }
29
+ }
30
+ else {
31
+ errors.push({
32
+ type: 'schema',
33
+ resource: `${file.resourceType}/${file.resourceId}`,
34
+ message: error instanceof Error ? error.message : String(error),
35
+ file: file.relativePath,
36
+ });
37
+ }
38
+ }
39
+ return errors;
40
+ };
41
+ exports.validateSchema = validateSchema;
42
+ const validateAllSchemas = (parsedFiles) => {
43
+ const errors = [];
44
+ for (const parsedFile of parsedFiles) {
45
+ errors.push(...(0, exports.validateSchema)(parsedFile));
46
+ }
47
+ return errors;
48
+ };
49
+ exports.validateAllSchemas = validateAllSchemas;
50
+ //# sourceMappingURL=schema-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../../src/validators/schema-validator.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AACxB,wCAAqC;AAI9B,MAAM,cAAc,GAAG,CAAC,UAAsB,EAAqB,EAAE;IAC1E,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC;IACzC,MAAM,MAAM,GAAG,iBAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,OAAC,CAAC,QAAQ,EAAE,CAAC;YAChC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnC,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;gBAE5B,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBAClC,OAAO,GAAG,YAAY,KAAK,CAAC,QAAQ,kBAAkB,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACzE,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,EAAE;oBACnD,KAAK,EAAE,KAAK,IAAI,SAAS;oBACzB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO;oBACjD,IAAI,EAAE,IAAI,CAAC,YAAY;iBACxB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnD,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC/D,IAAI,EAAE,IAAI,CAAC,YAAY;aACxB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AApCW,QAAA,cAAc,kBAoCzB;AAEK,MAAM,kBAAkB,GAAG,CAAC,WAAyB,EAAqB,EAAE;IACjF,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAA,sBAAc,EAAC,UAAU,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AARW,QAAA,kBAAkB,sBAQ7B"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@eventcatalog/linter",
3
+ "version": "0.0.1",
4
+ "description": "A linter for EventCatalog to validate frontmatter and resource references",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "eventcatalog-linter": "./dist/cli/index.js"
8
+ },
9
+ "publishConfig": {
10
+ "access": "public"
11
+ },
12
+ "keywords": [
13
+ "eventcatalog",
14
+ "linter",
15
+ "validation",
16
+ "event-driven",
17
+ "architecture"
18
+ ],
19
+ "author": "",
20
+ "license": "MIT",
21
+ "dependencies": {
22
+ "@types/semver": "^7.7.0",
23
+ "chalk": "^5.3.0",
24
+ "commander": "^11.1.0",
25
+ "fast-glob": "^3.3.2",
26
+ "gray-matter": "^4.0.3",
27
+ "ora": "^8.0.1",
28
+ "semver": "^7.7.2",
29
+ "zod": "^3.22.4"
30
+ },
31
+ "devDependencies": {
32
+ "@changesets/cli": "^2.27.7",
33
+ "@types/node": "^20.10.5",
34
+ "@typescript-eslint/eslint-plugin": "^6.15.0",
35
+ "@typescript-eslint/parser": "^6.15.0",
36
+ "prettier": "^3.3.3",
37
+ "tsx": "^4.7.0",
38
+ "typescript": "^5.3.3",
39
+ "vitest": "^1.1.0"
40
+ },
41
+ "files": [
42
+ "dist"
43
+ ],
44
+ "engines": {
45
+ "node": ">=16.0.0"
46
+ },
47
+ "scripts": {
48
+ "build": "tsc",
49
+ "dev": "tsx watch src/cli/index.ts",
50
+ "test": "vitest",
51
+ "test:watch": "vitest --watch",
52
+ "typecheck": "tsc --noEmit",
53
+ "format": "prettier --write .",
54
+ "format:diff": "prettier --list-different .",
55
+ "changeset": "changeset",
56
+ "release": "changeset publish"
57
+ }
58
+ }