@eventcatalog/sdk 2.11.0 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.md +86 -1
  2. package/dist/cli/index.d.mts +1 -0
  3. package/dist/cli/index.d.ts +1 -0
  4. package/dist/{eventcatalog.js → cli/index.js} +505 -378
  5. package/dist/cli/index.js.map +1 -0
  6. package/dist/{eventcatalog.mjs → cli/index.mjs} +583 -436
  7. package/dist/cli/index.mjs.map +1 -0
  8. package/dist/cli-docs.d.mts +43 -0
  9. package/dist/cli-docs.d.ts +43 -0
  10. package/dist/cli-docs.js +1513 -0
  11. package/dist/cli-docs.js.map +1 -0
  12. package/dist/cli-docs.mjs +1485 -0
  13. package/dist/cli-docs.mjs.map +1 -0
  14. package/dist/index.d.mts +330 -3
  15. package/dist/index.d.ts +330 -3
  16. package/package.json +13 -4
  17. package/dist/channels.d.mts +0 -214
  18. package/dist/channels.d.ts +0 -214
  19. package/dist/channels.js +0 -432
  20. package/dist/channels.js.map +0 -1
  21. package/dist/channels.mjs +0 -384
  22. package/dist/channels.mjs.map +0 -1
  23. package/dist/commands.d.mts +0 -274
  24. package/dist/commands.d.ts +0 -274
  25. package/dist/commands.js +0 -394
  26. package/dist/commands.js.map +0 -1
  27. package/dist/commands.mjs +0 -350
  28. package/dist/commands.mjs.map +0 -1
  29. package/dist/containers.d.mts +0 -179
  30. package/dist/containers.d.ts +0 -179
  31. package/dist/containers.js +0 -388
  32. package/dist/containers.js.map +0 -1
  33. package/dist/containers.mjs +0 -345
  34. package/dist/containers.mjs.map +0 -1
  35. package/dist/custom-docs.d.mts +0 -89
  36. package/dist/custom-docs.d.ts +0 -89
  37. package/dist/custom-docs.js +0 -164
  38. package/dist/custom-docs.js.map +0 -1
  39. package/dist/custom-docs.mjs +0 -122
  40. package/dist/custom-docs.mjs.map +0 -1
  41. package/dist/data-products.d.mts +0 -225
  42. package/dist/data-products.d.ts +0 -225
  43. package/dist/data-products.js +0 -375
  44. package/dist/data-products.js.map +0 -1
  45. package/dist/data-products.mjs +0 -332
  46. package/dist/data-products.mjs.map +0 -1
  47. package/dist/data-stores.d.mts +0 -179
  48. package/dist/data-stores.d.ts +0 -179
  49. package/dist/data-stores.js +0 -401
  50. package/dist/data-stores.js.map +0 -1
  51. package/dist/data-stores.mjs +0 -356
  52. package/dist/data-stores.mjs.map +0 -1
  53. package/dist/domains.d.mts +0 -347
  54. package/dist/domains.d.ts +0 -347
  55. package/dist/domains.js +0 -547
  56. package/dist/domains.js.map +0 -1
  57. package/dist/domains.mjs +0 -498
  58. package/dist/domains.mjs.map +0 -1
  59. package/dist/entities.d.mts +0 -174
  60. package/dist/entities.d.ts +0 -174
  61. package/dist/entities.js +0 -348
  62. package/dist/entities.js.map +0 -1
  63. package/dist/entities.mjs +0 -307
  64. package/dist/entities.mjs.map +0 -1
  65. package/dist/eventcatalog.d.mts +0 -21
  66. package/dist/eventcatalog.d.ts +0 -21
  67. package/dist/eventcatalog.js.map +0 -1
  68. package/dist/eventcatalog.mjs.map +0 -1
  69. package/dist/events.d.mts +0 -276
  70. package/dist/events.d.ts +0 -276
  71. package/dist/events.js +0 -393
  72. package/dist/events.js.map +0 -1
  73. package/dist/events.mjs +0 -349
  74. package/dist/events.mjs.map +0 -1
  75. package/dist/messages.d.mts +0 -65
  76. package/dist/messages.d.ts +0 -65
  77. package/dist/messages.js +0 -312
  78. package/dist/messages.js.map +0 -1
  79. package/dist/messages.mjs +0 -269
  80. package/dist/messages.mjs.map +0 -1
  81. package/dist/queries.d.mts +0 -276
  82. package/dist/queries.d.ts +0 -276
  83. package/dist/queries.js +0 -394
  84. package/dist/queries.js.map +0 -1
  85. package/dist/queries.mjs +0 -350
  86. package/dist/queries.mjs.map +0 -1
  87. package/dist/services.d.mts +0 -384
  88. package/dist/services.d.ts +0 -384
  89. package/dist/services.js +0 -577
  90. package/dist/services.js.map +0 -1
  91. package/dist/services.mjs +0 -526
  92. package/dist/services.mjs.map +0 -1
  93. package/dist/teams.d.mts +0 -90
  94. package/dist/teams.d.ts +0 -90
  95. package/dist/teams.js +0 -246
  96. package/dist/teams.js.map +0 -1
  97. package/dist/teams.mjs +0 -202
  98. package/dist/teams.mjs.map +0 -1
  99. package/dist/types.d.d.mts +0 -331
  100. package/dist/types.d.d.ts +0 -331
  101. package/dist/types.d.js +0 -19
  102. package/dist/types.d.js.map +0 -1
  103. package/dist/types.d.mjs +0 -1
  104. package/dist/types.d.mjs.map +0 -1
  105. package/dist/users.d.mts +0 -83
  106. package/dist/users.d.ts +0 -83
  107. package/dist/users.js +0 -127
  108. package/dist/users.js.map +0 -1
  109. package/dist/users.mjs +0 -88
  110. package/dist/users.mjs.map +0 -1
package/dist/users.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/users.ts","../src/internal/utils.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport fsSync from 'node:fs';\nimport { join } from 'node:path';\nimport type { User } from './types';\nimport matter from 'gray-matter';\nimport { getFiles } from './internal/utils';\n\n/**\n * Returns a user from EventCatalog.\n *\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { getUser } = utils('/path/to/eventcatalog');\n *\n * // Gets the user with the given id\n * const user = await getUser('eventcatalog-core-user');\n *\n * ```\n */\nexport const getUser =\n (catalogDir: string) =>\n async (id: string): Promise<User | undefined> => {\n const files = await getFiles(`${catalogDir}/${id}.{md,mdx}`);\n\n if (files.length == 0) return undefined;\n const file = files[0];\n\n const { data, content } = matter.read(file);\n return {\n ...data,\n id: data.id,\n name: data.name,\n avatarUrl: data.avatarUrl,\n markdown: content.trim(),\n } as User;\n };\n\n/**\n * Returns all users from EventCatalog.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { getUsers } = utils('/path/to/eventcatalog');\n *\n * // Gets all users from the catalog\n * const channels = await getUsers();\n *\n * ```\n */\nexport const getUsers =\n (catalogDir: string) =>\n async (options?: {}): Promise<User[]> => {\n const files = await getFiles(`${catalogDir}/users/*.{md,mdx}`);\n if (files.length === 0) return [];\n\n return files.map((file) => {\n const { data, content } = matter.read(file);\n return {\n ...data,\n id: data.id,\n name: data.name,\n avatarUrl: data.avatarUrl,\n markdown: content.trim(),\n } as User;\n });\n };\n\n/**\n * Write a user to EventCatalog.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { writeUser } = utils('/path/to/eventcatalog');\n *\n * // Write a user to the catalog\n * // user would be written to users/eventcatalog-tech-lead\n * await writeUser({\n * id: 'eventcatalog-tech-lead',\n * name: 'EventCatalog Tech Lead',\n * email: 'test@test.com',\n * avatarUrl: 'https://pbs.twimg.com/profile_images/1262283153563140096/DYRDqKg6_400x400.png',\n * slackDirectMessageUrl: https://yourteam.slack.com/channels/boyney123\n * });\n *\n * // Write a team to the catalog and override the existing content (if there is any)\n * await writeUser({\n * id: 'eventcatalog-tech-lead',\n * name: 'EventCatalog Tech Lead',\n * email: 'test@test.com',\n * avatarUrl: 'https://pbs.twimg.com/profile_images/1262283153563140096/DYRDqKg6_400x400.png',\n * slackDirectMessageUrl: https://yourteam.slack.com/channels/boyney123\n * }, { override: true });\n *\n * ```\n */\nexport const writeUser =\n (catalogDir: string) =>\n async (user: User, options: { override?: boolean } = {}) => {\n const resource: User = { ...user };\n\n // Get the path\n const currentUser = await getUser(catalogDir)(resource.id);\n const exists = currentUser !== undefined;\n\n if (exists && !options.override) {\n throw new Error(`Failed to write ${resource.id} (user) as it already exists`);\n }\n\n const { markdown, ...frontmatter } = resource;\n\n const document = matter.stringify(markdown, frontmatter);\n fsSync.mkdirSync(join(catalogDir, ''), { recursive: true });\n fsSync.writeFileSync(join(catalogDir, '', `${resource.id}.mdx`), document);\n };\n\n/**\n * Delete a user by it's id.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmUserById } = utils('/path/to/eventcatalog');\n *\n * // deletes the user with id eventcatalog-core-user\n * await rmUserById('eventcatalog-core-user');\n *\n * ```\n */\nexport const rmUserById = (catalogDir: string) => async (id: string) => {\n fsSync.rmSync(join(catalogDir, `${id}.mdx`), { recursive: true });\n};\n","import { globSync } from 'glob';\nimport fsSync from 'node:fs';\nimport { copy, CopyFilterAsync, CopyFilterSync } from 'fs-extra';\nimport { join, dirname, normalize, sep as pathSeparator, resolve, basename, relative } from 'node:path';\nimport matter from 'gray-matter';\nimport { satisfies, validRange, valid } from 'semver';\n\n/**\n * Returns true if a given version of a resource id exists in the catalog\n */\nexport const versionExists = async (catalogDir: string, id: string, version: string) => {\n const files = await getFiles(`${catalogDir}/**/index.{md,mdx}`);\n const matchedFiles = (await searchFilesForId(files, id, version)) || [];\n return matchedFiles.length > 0;\n};\n\nexport const findFileById = async (catalogDir: string, id: string, version?: string): Promise<string | undefined> => {\n const files = await getFiles(`${catalogDir}/**/index.{md,mdx}`);\n\n const matchedFiles = (await searchFilesForId(files, id)) || [];\n const latestVersion = matchedFiles.find((path) => !path.includes('versioned'));\n\n // If no version is provided, return the latest version\n if (!version) {\n return latestVersion;\n }\n\n // map files into gray matter to get versions\n const parsedFiles = matchedFiles.map((path) => {\n const { data } = matter.read(path);\n return { ...data, path };\n }) as any[];\n\n // Handle 'latest' version - return the latest (non-versioned) file\n if (version === 'latest') {\n return latestVersion;\n }\n\n // First, check for exact version match (handles non-semver versions like '1', '2', etc.)\n const exactMatch = parsedFiles.find((c) => c.version === version);\n if (exactMatch) {\n return exactMatch.path;\n }\n\n // Try semver range matching\n const semverRange = validRange(version);\n\n if (semverRange) {\n const match = parsedFiles.filter((c) => {\n try {\n return satisfies(c.version, semverRange);\n } catch (error) {\n // If satisfies fails (e.g., comparing semver range with non-semver version), skip this file\n return false;\n }\n });\n return match.length > 0 ? match[0].path : undefined;\n }\n\n // If no exact match and no valid semver range, return undefined\n return undefined;\n};\n\nexport const getFiles = async (pattern: string, ignore: string | string[] = '') => {\n try {\n // 1. Normalize the input pattern to handle mixed separators potentially\n const normalizedInputPattern = normalize(pattern);\n\n // 2. Determine the absolute base directory (cwd for glob)\n // Resolve ensures it's absolute. Handles cases with/without globstar.\n const absoluteBaseDir = resolve(\n normalizedInputPattern.includes('**') ? normalizedInputPattern.split('**')[0] : dirname(normalizedInputPattern)\n );\n\n // 3. Determine the pattern part relative to the absolute base directory\n // We extract the part of the normalized pattern that comes *after* the absoluteBaseDir\n let relativePattern = relative(absoluteBaseDir, normalizedInputPattern);\n\n // On Windows, relative() might return empty string if paths are identical,\n // or might need normalization if the original pattern didn't have `**`\n // Example: pattern = 'dir/file.md', absoluteBaseDir='.../dir', normalized='...\\dir\\file.md'\n // relative() -> 'file.md'\n // Example: pattern = 'dir/**/file.md', absoluteBaseDir='.../dir', normalized='...\\dir\\**\\file.md'\n // relative() -> '**\\file.md'\n // Convert separators in the relative pattern to forward slashes for glob\n relativePattern = relativePattern.replace(/\\\\/g, '/');\n\n const ignoreList = Array.isArray(ignore) ? ignore : [ignore];\n\n const files = globSync(relativePattern, {\n cwd: absoluteBaseDir,\n ignore: ['node_modules/**', ...ignoreList],\n absolute: true,\n nodir: true,\n });\n\n // 5. Normalize results for consistency before returning\n return files.map(normalize);\n } catch (error: any) {\n // Add more diagnostic info to the error\n const absoluteBaseDirForError = resolve(\n normalize(pattern).includes('**') ? normalize(pattern).split('**')[0] : dirname(normalize(pattern))\n );\n const relativePatternForError = relative(absoluteBaseDirForError, normalize(pattern)).replace(/\\\\/g, '/');\n throw new Error(\n `Error finding files for pattern \"${pattern}\" (using cwd: \"${absoluteBaseDirForError}\", globPattern: \"${relativePatternForError}\"): ${error.message}`\n );\n }\n};\n\nexport const readMdxFile = async (path: string) => {\n const { data } = matter.read(path);\n const { markdown, ...frontmatter } = data;\n return { ...frontmatter, markdown };\n};\n\nexport const searchFilesForId = async (files: string[], id: string, version?: string) => {\n // Escape the id to avoid regex issues\n const escapedId = id.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const idRegex = new RegExp(`^id:\\\\s*(['\"]|>-)?\\\\s*${escapedId}['\"]?\\\\s*$`, 'm');\n\n const versionRegex = new RegExp(`^version:\\\\s*['\"]?${version}['\"]?\\\\s*$`, 'm');\n\n const matches = files.map((file) => {\n const content = fsSync.readFileSync(file, 'utf-8');\n const hasIdMatch = content.match(idRegex);\n\n // Check version if provided\n if (version && !content.match(versionRegex)) {\n return undefined;\n }\n\n if (hasIdMatch) {\n return file;\n }\n });\n\n return matches.filter(Boolean).filter((file) => file !== undefined);\n};\n\n/**\n * Function to copy a directory from source to target, uses a tmp directory\n * @param catalogDir\n * @param source\n * @param target\n * @param filter\n */\nexport const copyDir = async (catalogDir: string, source: string, target: string, filter?: CopyFilterAsync | CopyFilterSync) => {\n const tmpDirectory = join(catalogDir, 'tmp');\n fsSync.mkdirSync(tmpDirectory, { recursive: true });\n\n // Copy everything over\n await copy(source, tmpDirectory, {\n overwrite: true,\n filter,\n });\n\n await copy(tmpDirectory, target, {\n overwrite: true,\n filter,\n });\n\n // Remove the tmp directory\n fsSync.rmSync(tmpDirectory, { recursive: true });\n};\n\n// Makes sure values in sends/recieves are unique\nexport const uniqueVersions = (messages: { id: string; version: string }[]): { id: string; version: string }[] => {\n const uniqueSet = new Set();\n\n return messages.filter((message) => {\n const key = `${message.id}-${message.version}`;\n if (!uniqueSet.has(key)) {\n uniqueSet.add(key);\n return true;\n }\n return false;\n });\n};\n"],"mappings":"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","names":["import_node_fs","import_node_path","import_gray_matter","matter","fsSync"]}
package/dist/users.mjs DELETED
@@ -1,88 +0,0 @@
1
- // src/users.ts
2
- import fsSync from "node:fs";
3
- import { join as join2 } from "node:path";
4
- import matter2 from "gray-matter";
5
-
6
- // src/internal/utils.ts
7
- import { globSync } from "glob";
8
- import { copy } from "fs-extra";
9
- import { join, dirname, normalize, resolve, relative } from "node:path";
10
- import matter from "gray-matter";
11
- import { satisfies, validRange } from "semver";
12
- var getFiles = async (pattern, ignore = "") => {
13
- try {
14
- const normalizedInputPattern = normalize(pattern);
15
- const absoluteBaseDir = resolve(
16
- normalizedInputPattern.includes("**") ? normalizedInputPattern.split("**")[0] : dirname(normalizedInputPattern)
17
- );
18
- let relativePattern = relative(absoluteBaseDir, normalizedInputPattern);
19
- relativePattern = relativePattern.replace(/\\/g, "/");
20
- const ignoreList = Array.isArray(ignore) ? ignore : [ignore];
21
- const files = globSync(relativePattern, {
22
- cwd: absoluteBaseDir,
23
- ignore: ["node_modules/**", ...ignoreList],
24
- absolute: true,
25
- nodir: true
26
- });
27
- return files.map(normalize);
28
- } catch (error) {
29
- const absoluteBaseDirForError = resolve(
30
- normalize(pattern).includes("**") ? normalize(pattern).split("**")[0] : dirname(normalize(pattern))
31
- );
32
- const relativePatternForError = relative(absoluteBaseDirForError, normalize(pattern)).replace(/\\/g, "/");
33
- throw new Error(
34
- `Error finding files for pattern "${pattern}" (using cwd: "${absoluteBaseDirForError}", globPattern: "${relativePatternForError}"): ${error.message}`
35
- );
36
- }
37
- };
38
-
39
- // src/users.ts
40
- var getUser = (catalogDir) => async (id) => {
41
- const files = await getFiles(`${catalogDir}/${id}.{md,mdx}`);
42
- if (files.length == 0) return void 0;
43
- const file = files[0];
44
- const { data, content } = matter2.read(file);
45
- return {
46
- ...data,
47
- id: data.id,
48
- name: data.name,
49
- avatarUrl: data.avatarUrl,
50
- markdown: content.trim()
51
- };
52
- };
53
- var getUsers = (catalogDir) => async (options) => {
54
- const files = await getFiles(`${catalogDir}/users/*.{md,mdx}`);
55
- if (files.length === 0) return [];
56
- return files.map((file) => {
57
- const { data, content } = matter2.read(file);
58
- return {
59
- ...data,
60
- id: data.id,
61
- name: data.name,
62
- avatarUrl: data.avatarUrl,
63
- markdown: content.trim()
64
- };
65
- });
66
- };
67
- var writeUser = (catalogDir) => async (user, options = {}) => {
68
- const resource = { ...user };
69
- const currentUser = await getUser(catalogDir)(resource.id);
70
- const exists = currentUser !== void 0;
71
- if (exists && !options.override) {
72
- throw new Error(`Failed to write ${resource.id} (user) as it already exists`);
73
- }
74
- const { markdown, ...frontmatter } = resource;
75
- const document = matter2.stringify(markdown, frontmatter);
76
- fsSync.mkdirSync(join2(catalogDir, ""), { recursive: true });
77
- fsSync.writeFileSync(join2(catalogDir, "", `${resource.id}.mdx`), document);
78
- };
79
- var rmUserById = (catalogDir) => async (id) => {
80
- fsSync.rmSync(join2(catalogDir, `${id}.mdx`), { recursive: true });
81
- };
82
- export {
83
- getUser,
84
- getUsers,
85
- rmUserById,
86
- writeUser
87
- };
88
- //# sourceMappingURL=users.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/users.ts","../src/internal/utils.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport fsSync from 'node:fs';\nimport { join } from 'node:path';\nimport type { User } from './types';\nimport matter from 'gray-matter';\nimport { getFiles } from './internal/utils';\n\n/**\n * Returns a user from EventCatalog.\n *\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { getUser } = utils('/path/to/eventcatalog');\n *\n * // Gets the user with the given id\n * const user = await getUser('eventcatalog-core-user');\n *\n * ```\n */\nexport const getUser =\n (catalogDir: string) =>\n async (id: string): Promise<User | undefined> => {\n const files = await getFiles(`${catalogDir}/${id}.{md,mdx}`);\n\n if (files.length == 0) return undefined;\n const file = files[0];\n\n const { data, content } = matter.read(file);\n return {\n ...data,\n id: data.id,\n name: data.name,\n avatarUrl: data.avatarUrl,\n markdown: content.trim(),\n } as User;\n };\n\n/**\n * Returns all users from EventCatalog.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { getUsers } = utils('/path/to/eventcatalog');\n *\n * // Gets all users from the catalog\n * const channels = await getUsers();\n *\n * ```\n */\nexport const getUsers =\n (catalogDir: string) =>\n async (options?: {}): Promise<User[]> => {\n const files = await getFiles(`${catalogDir}/users/*.{md,mdx}`);\n if (files.length === 0) return [];\n\n return files.map((file) => {\n const { data, content } = matter.read(file);\n return {\n ...data,\n id: data.id,\n name: data.name,\n avatarUrl: data.avatarUrl,\n markdown: content.trim(),\n } as User;\n });\n };\n\n/**\n * Write a user to EventCatalog.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { writeUser } = utils('/path/to/eventcatalog');\n *\n * // Write a user to the catalog\n * // user would be written to users/eventcatalog-tech-lead\n * await writeUser({\n * id: 'eventcatalog-tech-lead',\n * name: 'EventCatalog Tech Lead',\n * email: 'test@test.com',\n * avatarUrl: 'https://pbs.twimg.com/profile_images/1262283153563140096/DYRDqKg6_400x400.png',\n * slackDirectMessageUrl: https://yourteam.slack.com/channels/boyney123\n * });\n *\n * // Write a team to the catalog and override the existing content (if there is any)\n * await writeUser({\n * id: 'eventcatalog-tech-lead',\n * name: 'EventCatalog Tech Lead',\n * email: 'test@test.com',\n * avatarUrl: 'https://pbs.twimg.com/profile_images/1262283153563140096/DYRDqKg6_400x400.png',\n * slackDirectMessageUrl: https://yourteam.slack.com/channels/boyney123\n * }, { override: true });\n *\n * ```\n */\nexport const writeUser =\n (catalogDir: string) =>\n async (user: User, options: { override?: boolean } = {}) => {\n const resource: User = { ...user };\n\n // Get the path\n const currentUser = await getUser(catalogDir)(resource.id);\n const exists = currentUser !== undefined;\n\n if (exists && !options.override) {\n throw new Error(`Failed to write ${resource.id} (user) as it already exists`);\n }\n\n const { markdown, ...frontmatter } = resource;\n\n const document = matter.stringify(markdown, frontmatter);\n fsSync.mkdirSync(join(catalogDir, ''), { recursive: true });\n fsSync.writeFileSync(join(catalogDir, '', `${resource.id}.mdx`), document);\n };\n\n/**\n * Delete a user by it's id.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmUserById } = utils('/path/to/eventcatalog');\n *\n * // deletes the user with id eventcatalog-core-user\n * await rmUserById('eventcatalog-core-user');\n *\n * ```\n */\nexport const rmUserById = (catalogDir: string) => async (id: string) => {\n fsSync.rmSync(join(catalogDir, `${id}.mdx`), { recursive: true });\n};\n","import { globSync } from 'glob';\nimport fsSync from 'node:fs';\nimport { copy, CopyFilterAsync, CopyFilterSync } from 'fs-extra';\nimport { join, dirname, normalize, sep as pathSeparator, resolve, basename, relative } from 'node:path';\nimport matter from 'gray-matter';\nimport { satisfies, validRange, valid } from 'semver';\n\n/**\n * Returns true if a given version of a resource id exists in the catalog\n */\nexport const versionExists = async (catalogDir: string, id: string, version: string) => {\n const files = await getFiles(`${catalogDir}/**/index.{md,mdx}`);\n const matchedFiles = (await searchFilesForId(files, id, version)) || [];\n return matchedFiles.length > 0;\n};\n\nexport const findFileById = async (catalogDir: string, id: string, version?: string): Promise<string | undefined> => {\n const files = await getFiles(`${catalogDir}/**/index.{md,mdx}`);\n\n const matchedFiles = (await searchFilesForId(files, id)) || [];\n const latestVersion = matchedFiles.find((path) => !path.includes('versioned'));\n\n // If no version is provided, return the latest version\n if (!version) {\n return latestVersion;\n }\n\n // map files into gray matter to get versions\n const parsedFiles = matchedFiles.map((path) => {\n const { data } = matter.read(path);\n return { ...data, path };\n }) as any[];\n\n // Handle 'latest' version - return the latest (non-versioned) file\n if (version === 'latest') {\n return latestVersion;\n }\n\n // First, check for exact version match (handles non-semver versions like '1', '2', etc.)\n const exactMatch = parsedFiles.find((c) => c.version === version);\n if (exactMatch) {\n return exactMatch.path;\n }\n\n // Try semver range matching\n const semverRange = validRange(version);\n\n if (semverRange) {\n const match = parsedFiles.filter((c) => {\n try {\n return satisfies(c.version, semverRange);\n } catch (error) {\n // If satisfies fails (e.g., comparing semver range with non-semver version), skip this file\n return false;\n }\n });\n return match.length > 0 ? match[0].path : undefined;\n }\n\n // If no exact match and no valid semver range, return undefined\n return undefined;\n};\n\nexport const getFiles = async (pattern: string, ignore: string | string[] = '') => {\n try {\n // 1. Normalize the input pattern to handle mixed separators potentially\n const normalizedInputPattern = normalize(pattern);\n\n // 2. Determine the absolute base directory (cwd for glob)\n // Resolve ensures it's absolute. Handles cases with/without globstar.\n const absoluteBaseDir = resolve(\n normalizedInputPattern.includes('**') ? normalizedInputPattern.split('**')[0] : dirname(normalizedInputPattern)\n );\n\n // 3. Determine the pattern part relative to the absolute base directory\n // We extract the part of the normalized pattern that comes *after* the absoluteBaseDir\n let relativePattern = relative(absoluteBaseDir, normalizedInputPattern);\n\n // On Windows, relative() might return empty string if paths are identical,\n // or might need normalization if the original pattern didn't have `**`\n // Example: pattern = 'dir/file.md', absoluteBaseDir='.../dir', normalized='...\\dir\\file.md'\n // relative() -> 'file.md'\n // Example: pattern = 'dir/**/file.md', absoluteBaseDir='.../dir', normalized='...\\dir\\**\\file.md'\n // relative() -> '**\\file.md'\n // Convert separators in the relative pattern to forward slashes for glob\n relativePattern = relativePattern.replace(/\\\\/g, '/');\n\n const ignoreList = Array.isArray(ignore) ? ignore : [ignore];\n\n const files = globSync(relativePattern, {\n cwd: absoluteBaseDir,\n ignore: ['node_modules/**', ...ignoreList],\n absolute: true,\n nodir: true,\n });\n\n // 5. Normalize results for consistency before returning\n return files.map(normalize);\n } catch (error: any) {\n // Add more diagnostic info to the error\n const absoluteBaseDirForError = resolve(\n normalize(pattern).includes('**') ? normalize(pattern).split('**')[0] : dirname(normalize(pattern))\n );\n const relativePatternForError = relative(absoluteBaseDirForError, normalize(pattern)).replace(/\\\\/g, '/');\n throw new Error(\n `Error finding files for pattern \"${pattern}\" (using cwd: \"${absoluteBaseDirForError}\", globPattern: \"${relativePatternForError}\"): ${error.message}`\n );\n }\n};\n\nexport const readMdxFile = async (path: string) => {\n const { data } = matter.read(path);\n const { markdown, ...frontmatter } = data;\n return { ...frontmatter, markdown };\n};\n\nexport const searchFilesForId = async (files: string[], id: string, version?: string) => {\n // Escape the id to avoid regex issues\n const escapedId = id.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const idRegex = new RegExp(`^id:\\\\s*(['\"]|>-)?\\\\s*${escapedId}['\"]?\\\\s*$`, 'm');\n\n const versionRegex = new RegExp(`^version:\\\\s*['\"]?${version}['\"]?\\\\s*$`, 'm');\n\n const matches = files.map((file) => {\n const content = fsSync.readFileSync(file, 'utf-8');\n const hasIdMatch = content.match(idRegex);\n\n // Check version if provided\n if (version && !content.match(versionRegex)) {\n return undefined;\n }\n\n if (hasIdMatch) {\n return file;\n }\n });\n\n return matches.filter(Boolean).filter((file) => file !== undefined);\n};\n\n/**\n * Function to copy a directory from source to target, uses a tmp directory\n * @param catalogDir\n * @param source\n * @param target\n * @param filter\n */\nexport const copyDir = async (catalogDir: string, source: string, target: string, filter?: CopyFilterAsync | CopyFilterSync) => {\n const tmpDirectory = join(catalogDir, 'tmp');\n fsSync.mkdirSync(tmpDirectory, { recursive: true });\n\n // Copy everything over\n await copy(source, tmpDirectory, {\n overwrite: true,\n filter,\n });\n\n await copy(tmpDirectory, target, {\n overwrite: true,\n filter,\n });\n\n // Remove the tmp directory\n fsSync.rmSync(tmpDirectory, { recursive: true });\n};\n\n// Makes sure values in sends/recieves are unique\nexport const uniqueVersions = (messages: { id: string; version: string }[]): { id: string; version: string }[] => {\n const uniqueSet = new Set();\n\n return messages.filter((message) => {\n const key = `${message.id}-${message.version}`;\n if (!uniqueSet.has(key)) {\n uniqueSet.add(key);\n return true;\n }\n return false;\n });\n};\n"],"mappings":"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","names":["join","matter","matter","join"]}