@eventcatalog/core 5.0.0-beta.26 → 5.0.0-beta.28

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 (42) hide show
  1. package/dist/analytics/analytics.cjs +1 -1
  2. package/dist/analytics/analytics.js +2 -2
  3. package/dist/analytics/log-build.cjs +89 -44
  4. package/dist/analytics/log-build.d.cts +2 -2
  5. package/dist/analytics/log-build.d.ts +2 -2
  6. package/dist/analytics/log-build.js +5 -4
  7. package/dist/analytics/studio-usage.cjs +90 -0
  8. package/dist/analytics/studio-usage.d.cts +5 -0
  9. package/dist/analytics/studio-usage.d.ts +5 -0
  10. package/dist/analytics/studio-usage.js +10 -0
  11. package/dist/{chunk-RFIXKATC.js → chunk-4G7FSRPN.js} +35 -42
  12. package/dist/chunk-CA6WCQ2T.js +54 -0
  13. package/dist/{chunk-M4TIQ4Z6.js → chunk-EUMQAONX.js} +1 -1
  14. package/dist/{chunk-O2ZA26FX.js → chunk-G46KUC6G.js} +4 -2
  15. package/dist/{chunk-MDWB5HLO.js → chunk-NKNOXQ62.js} +1 -1
  16. package/dist/{chunk-KHACCTW2.js → chunk-OX6TSVHY.js} +2 -2
  17. package/dist/{chunk-36RYTYT5.js → chunk-PD7KTSYN.js} +1 -1
  18. package/dist/{chunk-TMCBFXNE.js → chunk-QWFP2PDM.js} +1 -1
  19. package/dist/{chunk-LBHPRPYB.js → chunk-TDUUHSGF.js} +1 -1
  20. package/dist/{chunk-W4RMG6EP.js → chunk-VAL22T5Y.js} +12 -4
  21. package/dist/constants.cjs +1 -1
  22. package/dist/constants.js +1 -1
  23. package/dist/eventcatalog-config-file-utils.cjs +34 -41
  24. package/dist/eventcatalog-config-file-utils.d.cts +56 -58
  25. package/dist/eventcatalog-config-file-utils.d.ts +56 -58
  26. package/dist/eventcatalog-config-file-utils.js +1 -1
  27. package/dist/eventcatalog.cjs +281 -233
  28. package/dist/eventcatalog.js +15 -13
  29. package/dist/features.cjs +34 -41
  30. package/dist/features.js +2 -2
  31. package/dist/federation/federate.cjs +37 -44
  32. package/dist/federation/federate.js +4 -4
  33. package/dist/federation/source-provider.js +2 -2
  34. package/dist/generate.cjs +37 -42
  35. package/dist/generate.js +4 -4
  36. package/dist/resolve-catalog-dependencies.cjs +34 -41
  37. package/dist/resolve-catalog-dependencies.js +2 -2
  38. package/dist/utils/cli-logger.cjs +1 -1
  39. package/dist/utils/cli-logger.js +2 -2
  40. package/eventcatalog/integrations/config-loader.mjs +56 -58
  41. package/package.json +3 -3
  42. package/dist/{chunk-A2RZR3U4.js → chunk-6K7XZAYI.js} +3 -3
@@ -1,8 +1,8 @@
1
- import { readFile, rm, copyFile, mkdtemp, symlink } from 'node:fs/promises';
1
+ import { readFile, rm } from 'node:fs/promises';
2
2
  import { existsSync } from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import { pathToFileURL } from 'node:url';
5
- import { tmpdir } from 'node:os';
5
+ import { register } from 'node:module';
6
6
 
7
7
  export async function cleanup(projectDirectory) {
8
8
  const filePath = path.join(projectDirectory, 'eventcatalog.config.mjs');
@@ -11,75 +11,73 @@ export async function cleanup(projectDirectory) {
11
11
  }
12
12
  }
13
13
 
14
- const findNodeModulesDirectory = (directory) => {
15
- let currentDirectory = directory;
16
-
17
- while (true) {
18
- const nodeModulesDirectory = path.join(currentDirectory, 'node_modules');
19
-
20
- if (existsSync(nodeModulesDirectory)) {
21
- return nodeModulesDirectory;
22
- }
23
-
24
- const parentDirectory = path.dirname(currentDirectory);
25
-
26
- if (parentDirectory === currentDirectory) {
27
- return undefined;
28
- }
29
-
30
- currentDirectory = parentDirectory;
31
- }
14
+ let hidesConfigModuleTypeWarning = false;
15
+ let loads = 0;
16
+
17
+ /**
18
+ * Node loads an eventcatalog.config.js that uses import/export as an ES module even when the catalog's
19
+ * package.json has no "type": "module" (a new catalog's doesn't), and warns that it had to detect it.
20
+ * That warning, for the config file only, is hidden: the catalog doesn't need to change anything.
21
+ */
22
+ const hideConfigModuleTypeWarning = () => {
23
+ if (hidesConfigModuleTypeWarning) return;
24
+ hidesConfigModuleTypeWarning = true;
25
+
26
+ const emitWarning = process.emitWarning;
27
+ process.emitWarning = function (warning, ...args) {
28
+ const code = typeof args[0] === 'object' ? args[0]?.code : args[1];
29
+ const message = typeof warning === 'string' ? warning : warning?.message;
30
+ if (code === 'MODULE_TYPELESS_PACKAGE_JSON' && message?.includes('eventcatalog.config.js')) return;
31
+ return emitWarning.call(this, warning, ...args);
32
+ };
32
33
  };
33
34
 
34
- const linkNodeModulesIntoTempDirectory = async ({ projectDirectory, tempDir }) => {
35
- const nodeModulesDirectory = findNodeModulesDirectory(projectDirectory);
36
-
37
- if (!nodeModulesDirectory) {
38
- return;
39
- }
40
-
41
- await symlink(nodeModulesDirectory, path.join(tempDir, 'node_modules'), 'dir');
35
+ // Marks a config URL Node should load as an ES module, whatever the catalog's package.json says
36
+ const AS_MODULE_QUERY = 'eventcatalog-config-as-module';
37
+ let loadsMarkedConfigsAsModules = false;
38
+
39
+ /**
40
+ * Node won't load a config written with import/export in a catalog whose package.json has
41
+ * "type": "commonjs". A loader hook loads that config file (and only it) as an ES module.
42
+ */
43
+ const loadMarkedConfigsAsModules = () => {
44
+ if (loadsMarkedConfigsAsModules) return;
45
+ loadsMarkedConfigsAsModules = true;
46
+ const hook = `export async function load(url, context, nextLoad) {
47
+ return nextLoad(url, url.includes('${AS_MODULE_QUERY}=') ? { ...context, format: 'module' } : context);
48
+ }`;
49
+ register(`data:text/javascript,${encodeURIComponent(hook)}`);
42
50
  };
43
51
 
44
- const createTemporaryConfigDirectory = async (projectDirectory) => {
45
- const nodeModulesDirectory = findNodeModulesDirectory(projectDirectory);
46
-
47
- if (nodeModulesDirectory) {
48
- return mkdtemp(path.join(nodeModulesDirectory, '.eventcatalog-config-'));
52
+ /**
53
+ * Loads the catalog's eventcatalog.config.js from where it is, so paths it builds from its own location
54
+ * (`import.meta.url`, `import.meta.dirname`) and its relative imports point into the catalog. It was
55
+ * loaded from a copy in a temporary folder before, which broke them (e.g. the paths to a generator's specs).
56
+ */
57
+ const isCommonJSPackage = async (projectDirectory) => {
58
+ try {
59
+ const packageJson = JSON.parse(await readFile(path.join(projectDirectory, 'package.json'), 'utf-8'));
60
+ return packageJson?.type === 'commonjs';
61
+ } catch {
62
+ return false;
49
63
  }
50
-
51
- const tempDir = await mkdtemp(path.join(tmpdir(), 'eventcatalog-config-'));
52
- await linkNodeModulesIntoTempDirectory({ projectDirectory, tempDir });
53
- return tempDir;
54
64
  };
55
65
 
56
66
  export const getEventCatalogConfigFile = async (projectDirectory) => {
57
- let tempDir;
58
-
59
67
  try {
60
- let configFilePath = path.join(projectDirectory, 'eventcatalog.config.js');
61
-
62
- const filePath = path.join(projectDirectory, 'package.json');
63
- const packageJson = JSON.parse(await readFile(filePath, 'utf-8'));
68
+ hideConfigModuleTypeWarning();
69
+ // A catalog's config is an ES module, as it always was (with "type": "commonjs" it was loaded from an .mjs copy)
70
+ const asModule = await isCommonJSPackage(projectDirectory);
71
+ if (asModule) loadMarkedConfigsAsModules();
64
72
 
65
- if (packageJson?.type !== 'module') {
66
- // Importing CommonJS config via ESM import requires an .mjs file.
67
- // Keep this temp copy outside the project directory so Astro/Vite
68
- // file watchers do not trigger a dev-server restart during startup.
69
- tempDir = await createTemporaryConfigDirectory(projectDirectory);
70
- configFilePath = path.join(tempDir, 'eventcatalog.config.mjs');
71
- await copyFile(path.join(projectDirectory, 'eventcatalog.config.js'), configFilePath);
72
- }
73
-
74
- const configFileURL = `${pathToFileURL(configFilePath).href}?t=${Date.now()}`;
75
- const config = await import(/* @vite-ignore */ configFileURL);
73
+ const configFileURL = pathToFileURL(path.join(projectDirectory, 'eventcatalog.config.js')).href;
74
+ // A new URL each time, so a changed config is loaded again (not `?t=`: Vite drops it as its own timestamp)
75
+ const query = `${asModule ? AS_MODULE_QUERY : 'loaded'}=${Date.now()}-${loads++}`;
76
+ const config = await import(/* @vite-ignore */ `${configFileURL}?${query}`);
76
77
 
77
78
  return config.default;
78
79
  } finally {
80
+ // Earlier versions loaded a copy from eventcatalog.config.mjs in the catalog: remove one left behind
79
81
  await cleanup(projectDirectory);
80
-
81
- if (tempDir) {
82
- await rm(tempDir, { recursive: true, force: true });
83
- }
84
82
  }
85
83
  };
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "license": "BUSL-1.1",
9
9
  "type": "module",
10
- "version": "5.0.0-beta.26",
10
+ "version": "5.0.0-beta.28",
11
11
  "publishConfig": {
12
12
  "access": "public"
13
13
  },
@@ -142,8 +142,8 @@
142
142
  "yjs": "^13.6.33",
143
143
  "zod": "^4.3.6",
144
144
  "@eventcatalog/linter": "1.2.0-beta.4",
145
- "@eventcatalog/visualiser": "^5.0.0-beta.6",
146
- "@eventcatalog/sdk": "2.30.0-beta.1"
145
+ "@eventcatalog/sdk": "2.30.0-beta.1",
146
+ "@eventcatalog/visualiser": "^5.0.0-beta.6"
147
147
  },
148
148
  "devDependencies": {
149
149
  "@astrojs/check": "^0.9.10",
@@ -1,9 +1,9 @@
1
- import {
2
- createFileSystemSourceProvider
3
- } from "./chunk-SDZQJTJW.js";
4
1
  import {
5
2
  createGitHubSourceProvider
6
3
  } from "./chunk-352FGP6W.js";
4
+ import {
5
+ createFileSystemSourceProvider
6
+ } from "./chunk-SDZQJTJW.js";
7
7
 
8
8
  // src/federation/source-provider.ts
9
9
  var createFederationSourceProvider = (projectDirectory, providers = {}) => {