@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,43 @@
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.parseAllFiles = exports.parseFrontmatter = void 0;
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ const gray_matter_1 = __importDefault(require("gray-matter"));
9
+ const parseFrontmatter = async (file) => {
10
+ try {
11
+ const fileContent = await promises_1.default.readFile(file.path, 'utf-8');
12
+ const { data, content } = (0, gray_matter_1.default)(fileContent);
13
+ return {
14
+ file,
15
+ frontmatter: data,
16
+ content,
17
+ raw: fileContent,
18
+ };
19
+ }
20
+ catch (error) {
21
+ return {
22
+ file,
23
+ error: error instanceof Error ? error : new Error(String(error)),
24
+ };
25
+ }
26
+ };
27
+ exports.parseFrontmatter = parseFrontmatter;
28
+ const parseAllFiles = async (files) => {
29
+ const results = await Promise.all(files.map(exports.parseFrontmatter));
30
+ const parsed = [];
31
+ const errors = [];
32
+ for (const result of results) {
33
+ if ('error' in result) {
34
+ errors.push(result);
35
+ }
36
+ else {
37
+ parsed.push(result);
38
+ }
39
+ }
40
+ return { parsed, errors };
41
+ };
42
+ exports.parseAllFiles = parseAllFiles;
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":";;;;;;AAAA,2DAA6B;AAC7B,8DAAiC;AAe1B,MAAM,gBAAgB,GAAG,KAAK,EAAE,IAAiB,EAAoC,EAAE;IAC5F,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAA,qBAAM,EAAC,WAAW,CAAC,CAAC;QAE9C,OAAO;YACL,IAAI;YACJ,WAAW,EAAE,IAAI;YACjB,OAAO;YACP,GAAG,EAAE,WAAW;SACjB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACjE,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAjBW,QAAA,gBAAgB,oBAiB3B;AAEK,MAAM,aAAa,GAAG,KAAK,EAChC,KAAoB,EAInB,EAAE;IACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAgB,CAAC,CAAC,CAAC;IAE/D,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC,CAAC;AApBW,QAAA,aAAa,iBAoBxB"}
@@ -0,0 +1,16 @@
1
+ import { ValidationError } from '../types';
2
+ import { ParseError } from '../parser';
3
+ export interface ReportSummary {
4
+ totalErrors: number;
5
+ totalWarnings: number;
6
+ schemaErrors: number;
7
+ referenceErrors: number;
8
+ parseErrors: number;
9
+ filesChecked: number;
10
+ filesWithErrors: number;
11
+ }
12
+ export declare const formatError: (error: ValidationError, showFilename?: boolean) => string;
13
+ export declare const formatParseError: (error: ParseError, showFilename?: boolean) => string;
14
+ export declare const groupErrorsByFile: (errors: ValidationError[]) => Map<string, ValidationError[]>;
15
+ export declare const reportErrors: (validationErrors: ValidationError[], parseErrors: ParseError[], verbose?: boolean) => ReportSummary;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,eAAe,EAAE,eAAc,OAAc,KAAG,MAelF,CAAC;AAiBF,eAAO,MAAM,gBAAgB,GAAI,OAAO,UAAU,EAAE,eAAc,OAAc,KAAG,MAWlF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,eAAe,EAAE,KAAG,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAW1F,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,kBAAkB,eAAe,EAAE,EACnC,aAAa,UAAU,EAAE,EACzB,UAAS,OAAe,KACvB,aAyFF,CAAC"}
@@ -0,0 +1,151 @@
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.reportErrors = exports.groupErrorsByFile = exports.formatParseError = exports.formatError = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const formatError = (error, showFilename = true) => {
9
+ const lineInfo = error.line ? chalk_1.default.dim(`:${error.line}:1`) : '';
10
+ const filename = showFilename ? `${chalk_1.default.dim(error.file)}${lineInfo}` : '';
11
+ const isWarning = error.severity === 'warning';
12
+ const severity = isWarning ? chalk_1.default.yellow('warning') : chalk_1.default.red('error');
13
+ const icon = isWarning ? chalk_1.default.yellow('⚠') : chalk_1.default.red('✖');
14
+ const errorCode = getErrorCode(error);
15
+ const field = error.field ? chalk_1.default.dim(`[${error.field}]`) : '';
16
+ const parts = [];
17
+ if (filename)
18
+ parts.push(filename);
19
+ parts.push(icon, severity, error.message, field, chalk_1.default.dim(errorCode));
20
+ return parts.filter(Boolean).join(' ');
21
+ };
22
+ exports.formatError = formatError;
23
+ const getErrorCode = (error) => {
24
+ if (error.type === 'schema') {
25
+ if (error.field) {
26
+ if (error.message.includes('Required'))
27
+ return '(@eventcatalog/required-field)';
28
+ if (error.message.includes('Expected'))
29
+ return '(@eventcatalog/invalid-type)';
30
+ return '(@eventcatalog/schema-validation)';
31
+ }
32
+ return '(@eventcatalog/schema)';
33
+ }
34
+ if (error.type === 'reference') {
35
+ return '(@eventcatalog/invalid-reference)';
36
+ }
37
+ return '(@eventcatalog/unknown)';
38
+ };
39
+ const formatParseError = (error, showFilename = true) => {
40
+ const filename = showFilename ? chalk_1.default.dim(error.file.relativePath) : '';
41
+ const severity = chalk_1.default.red('error');
42
+ const message = `Parse error: ${error.error.message}`;
43
+ const errorCode = chalk_1.default.dim('(@eventcatalog/parse-error)');
44
+ const parts = [];
45
+ if (filename)
46
+ parts.push(filename);
47
+ parts.push(chalk_1.default.red('✖'), severity, message, errorCode);
48
+ return parts.filter(Boolean).join(' ');
49
+ };
50
+ exports.formatParseError = formatParseError;
51
+ const groupErrorsByFile = (errors) => {
52
+ const grouped = new Map();
53
+ for (const error of errors) {
54
+ if (!grouped.has(error.file)) {
55
+ grouped.set(error.file, []);
56
+ }
57
+ grouped.get(error.file).push(error);
58
+ }
59
+ return grouped;
60
+ };
61
+ exports.groupErrorsByFile = groupErrorsByFile;
62
+ const reportErrors = (validationErrors, parseErrors, verbose = false) => {
63
+ const allErrors = [
64
+ ...validationErrors,
65
+ ...parseErrors.map((pe) => ({
66
+ type: 'parse',
67
+ resource: pe.file.resourceType || 'unknown',
68
+ message: pe.error.message,
69
+ file: pe.file.relativePath,
70
+ line: undefined,
71
+ })),
72
+ ];
73
+ const schemaErrors = validationErrors.filter((e) => e.type === 'schema');
74
+ const referenceErrors = validationErrors.filter((e) => e.type === 'reference');
75
+ const warnings = validationErrors.filter((e) => e.severity === 'warning');
76
+ const errors = [...validationErrors.filter((e) => e.severity !== 'warning'), ...parseErrors];
77
+ const totalErrors = errors.length;
78
+ const totalWarnings = warnings.length;
79
+ if (totalErrors === 0 && totalWarnings === 0) {
80
+ console.log(chalk_1.default.green('\\n✔ No problems found!'));
81
+ return {
82
+ totalErrors: 0,
83
+ totalWarnings: 0,
84
+ schemaErrors: 0,
85
+ referenceErrors: 0,
86
+ parseErrors: 0,
87
+ filesChecked: 0,
88
+ filesWithErrors: 0,
89
+ };
90
+ }
91
+ const grouped = (0, exports.groupErrorsByFile)(validationErrors);
92
+ const parseErrorsGrouped = groupParseErrorsByFile(parseErrors);
93
+ const allFiles = new Set([...grouped.keys(), ...parseErrorsGrouped.keys()]);
94
+ console.log(); // Empty line
95
+ // Report by file for better readability
96
+ for (const file of Array.from(allFiles).sort()) {
97
+ const fileErrors = grouped.get(file) || [];
98
+ const fileParseErrors = parseErrorsGrouped.get(file) || [];
99
+ const fileErrorCount = fileErrors.length + fileParseErrors.length;
100
+ if (fileErrorCount === 0)
101
+ continue;
102
+ // File header (ESLint-style)
103
+ console.log(chalk_1.default.underline(file));
104
+ // Parse errors first
105
+ for (const error of fileParseErrors) {
106
+ console.log(` ${(0, exports.formatParseError)(error, false)}`);
107
+ }
108
+ // Then validation errors
109
+ for (const error of fileErrors) {
110
+ console.log(` ${(0, exports.formatError)(error, false)}`);
111
+ }
112
+ // File summary
113
+ const fileWarnings = fileErrors.filter((e) => e.severity === 'warning').length;
114
+ const fileActualErrors = fileErrorCount - fileWarnings;
115
+ const problemText = fileErrorCount === 1 ? 'problem' : 'problems';
116
+ const summaryColor = fileActualErrors > 0 ? chalk_1.default.red : chalk_1.default.yellow;
117
+ const summaryIcon = fileActualErrors > 0 ? '✖' : '⚠';
118
+ console.log(summaryColor(`\n${summaryIcon} ${fileErrorCount} ${problemText}\n`));
119
+ }
120
+ // Overall summary (ESLint-style)
121
+ const filesWithErrors = allFiles.size;
122
+ const totalProblems = totalErrors + totalWarnings;
123
+ const problemText = totalProblems === 1 ? 'problem' : 'problems';
124
+ const fileText = filesWithErrors === 1 ? 'file' : 'files';
125
+ const summaryColor = totalErrors > 0 ? chalk_1.default.red.bold : chalk_1.default.yellow.bold;
126
+ const summaryIcon = totalErrors > 0 ? '✖' : '⚠';
127
+ console.log(summaryColor(`${summaryIcon} ${totalProblems} ${problemText} (${totalErrors} errors, ${totalWarnings} warnings)`));
128
+ console.log(chalk_1.default.dim(` ${filesWithErrors} ${fileText} checked`));
129
+ return {
130
+ totalErrors,
131
+ totalWarnings,
132
+ schemaErrors: schemaErrors.length,
133
+ referenceErrors: referenceErrors.length,
134
+ parseErrors: parseErrors.length,
135
+ filesChecked: allFiles.size,
136
+ filesWithErrors,
137
+ };
138
+ };
139
+ exports.reportErrors = reportErrors;
140
+ const groupParseErrorsByFile = (errors) => {
141
+ const grouped = new Map();
142
+ for (const error of errors) {
143
+ const file = error.file.relativePath;
144
+ if (!grouped.has(file)) {
145
+ grouped.set(file, []);
146
+ }
147
+ grouped.get(file).push(error);
148
+ }
149
+ return grouped;
150
+ };
151
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { ResourceType } from '../schemas';
2
+ export interface CatalogFile {
3
+ path: string;
4
+ relativePath: string;
5
+ resourceType: ResourceType;
6
+ resourceId: string;
7
+ version?: string;
8
+ }
9
+ export declare const extractResourceInfo: (filePath: string, resourceType: ResourceType) => {
10
+ id: string;
11
+ version?: string;
12
+ };
13
+ export declare const scanCatalogFiles: (rootDir: string) => Promise<CatalogFile[]>;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA2BD,eAAO,MAAM,mBAAmB,GAAI,UAAU,MAAM,EAAE,cAAc,YAAY,KAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAiDhH,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,WAAW,EAAE,CA0B7E,CAAC"}
@@ -0,0 +1,99 @@
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.scanCatalogFiles = exports.extractResourceInfo = void 0;
7
+ const fast_glob_1 = __importDefault(require("fast-glob"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const RESOURCE_PATTERNS = {
10
+ domain: [
11
+ 'domains/*/index.{md,mdx}',
12
+ 'domains/*/versioned/*/index.{md,mdx}',
13
+ 'domains/*/subdomains/*/index.{md,mdx}',
14
+ 'domains/*/subdomains/*/versioned/*/index.{md,mdx}',
15
+ ],
16
+ service: [
17
+ 'domains/*/services/*/index.{md,mdx}',
18
+ 'domains/*/services/*/versioned/*/index.{md,mdx}',
19
+ 'domains/*/subdomains/*/services/*/index.{md,mdx}',
20
+ 'domains/*/subdomains/*/services/*/versioned/*/index.{md,mdx}',
21
+ 'services/*/index.{md,mdx}',
22
+ 'services/*/versioned/*/index.{md,mdx}',
23
+ ],
24
+ event: ['**/events/*/index.{md,mdx}', '**/events/*/versioned/*/index.{md,mdx}'],
25
+ command: ['**/commands/*/index.{md,mdx}', '**/commands/*/versioned/*/index.{md,mdx}'],
26
+ query: ['**/queries/*/index.{md,mdx}', '**/queries/*/versioned/*/index.{md,mdx}'],
27
+ channel: ['**/channels/*/index.{md,mdx}', '**/channels/*/versioned/*/index.{md,mdx}'],
28
+ flow: ['**/flows/*/index.{md,mdx}', '**/flows/*/versioned/*/index.{md,mdx}'],
29
+ entity: ['**/entities/*/index.{md,mdx}', '**/entities/*/versioned/*/index.{md,mdx}'],
30
+ user: ['users/*.{md,mdx}'],
31
+ team: ['teams/*.{md,mdx}'],
32
+ };
33
+ const extractResourceInfo = (filePath, resourceType) => {
34
+ const relativePath = filePath.split(path_1.default.sep);
35
+ if (resourceType === 'user' || resourceType === 'team') {
36
+ const filename = path_1.default.basename(filePath, path_1.default.extname(filePath));
37
+ return { id: filename };
38
+ }
39
+ // Find the resource type directory in the path
40
+ const resourceTypePattern = `${resourceType}s`;
41
+ const resourceTypeIndex = relativePath.findIndex((part) => part === resourceTypePattern);
42
+ if (resourceTypeIndex === -1) {
43
+ // Fallback to original logic if pattern not found
44
+ const parts = relativePath.slice(1, -1);
45
+ return { id: parts[parts.length - 1] };
46
+ }
47
+ // Extract parts after the resource type directory, excluding index.mdx
48
+ const parts = relativePath.slice(resourceTypeIndex + 1, -1);
49
+ if (parts.length === 0) {
50
+ return { id: 'unknown' };
51
+ }
52
+ // Check for versioned structure: resourceId/versioned/version/index.mdx
53
+ if (parts.length >= 3 && parts[parts.length - 2] === 'versioned') {
54
+ const version = parts[parts.length - 1];
55
+ const resourceId = parts.slice(0, -2).join('/');
56
+ return { id: resourceId, version };
57
+ }
58
+ // Check for domain versioned structure: domains/domainId/versioned/version/index.mdx
59
+ if (resourceType === 'domain' && parts.length >= 2) {
60
+ const versionedIndex = parts.findIndex((part) => part === 'versioned');
61
+ if (versionedIndex !== -1 && versionedIndex < parts.length - 1) {
62
+ const version = parts[versionedIndex + 1];
63
+ const resourceId = parts.slice(0, versionedIndex).join('/');
64
+ return { id: resourceId, version };
65
+ }
66
+ }
67
+ // Standard structure: resourceId/index.mdx
68
+ if (parts.length === 1) {
69
+ return { id: parts[0] };
70
+ }
71
+ // Handle subdomain structure or nested resources
72
+ return { id: parts.join('/') };
73
+ };
74
+ exports.extractResourceInfo = extractResourceInfo;
75
+ const scanCatalogFiles = async (rootDir) => {
76
+ const files = [];
77
+ for (const [resourceType, patterns] of Object.entries(RESOURCE_PATTERNS)) {
78
+ const foundFiles = await (0, fast_glob_1.default)(patterns, {
79
+ cwd: rootDir,
80
+ absolute: true,
81
+ onlyFiles: true,
82
+ followSymbolicLinks: false,
83
+ });
84
+ for (const filePath of foundFiles) {
85
+ const relativePath = path_1.default.relative(rootDir, filePath);
86
+ const { id, version } = (0, exports.extractResourceInfo)(relativePath, resourceType);
87
+ files.push({
88
+ path: filePath,
89
+ relativePath,
90
+ resourceType: resourceType,
91
+ resourceId: id,
92
+ version,
93
+ });
94
+ }
95
+ }
96
+ return files;
97
+ };
98
+ exports.scanCatalogFiles = scanCatalogFiles;
99
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"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"}