@softarc/native-federation 4.3.1 → 4.4.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 (57) hide show
  1. package/README.md +71 -1
  2. package/dist/config.d.ts +1 -0
  3. package/dist/config.js +2 -0
  4. package/dist/internal.d.ts +5 -1
  5. package/dist/internal.js +24 -0
  6. package/dist/lib/config/expand-mappings.d.ts +24 -0
  7. package/dist/lib/config/expand-mappings.js +88 -0
  8. package/dist/lib/config/get-used-dependencies.d.ts +0 -2
  9. package/dist/lib/config/get-used-dependencies.js +4 -40
  10. package/dist/lib/config/mapped-paths.d.ts +7 -2
  11. package/dist/lib/config/mapped-paths.js +21 -4
  12. package/dist/lib/config/mapping-utils.d.ts +32 -0
  13. package/dist/lib/config/mapping-utils.js +68 -0
  14. package/dist/lib/config/match-mapping.d.ts +9 -0
  15. package/dist/lib/config/match-mapping.js +46 -0
  16. package/dist/lib/config/remove-unused-deps.d.ts +2 -1
  17. package/dist/lib/config/remove-unused-deps.js +35 -2
  18. package/dist/lib/config/validate-mappings.d.ts +15 -0
  19. package/dist/lib/config/validate-mappings.js +28 -0
  20. package/dist/lib/config/with-native-federation.js +20 -7
  21. package/dist/lib/core/build/build-for-federation.d.ts +7 -0
  22. package/dist/lib/core/build/build-for-federation.js +32 -134
  23. package/dist/lib/core/build/bundle-exposed-and-mappings.js +21 -8
  24. package/dist/lib/core/build/bundle-shared.d.ts +7 -0
  25. package/dist/lib/core/build/bundle-shared.js +45 -8
  26. package/dist/lib/core/build/rebuild-for-federation.d.ts +8 -0
  27. package/dist/lib/core/build/rebuild-for-federation.js +26 -0
  28. package/dist/lib/core/build/resolve-shared-dirs.d.ts +32 -0
  29. package/dist/lib/core/build/resolve-shared-dirs.js +70 -0
  30. package/dist/lib/core/build/shared-bundle-plan.d.ts +22 -0
  31. package/dist/lib/core/build/shared-bundle-plan.js +70 -0
  32. package/dist/lib/core/build/synthesize-cjs-exports.d.ts +12 -0
  33. package/dist/lib/core/build/synthesize-cjs-exports.js +58 -0
  34. package/dist/lib/core/cache/cache-persistence.d.ts +4 -2
  35. package/dist/lib/core/cache/cache-persistence.js +28 -6
  36. package/dist/lib/core/federation-builder.d.ts +2 -1
  37. package/dist/lib/core/federation-builder.js +3 -0
  38. package/dist/lib/core/normalize-options.d.ts +2 -2
  39. package/dist/lib/core/normalize-options.js +15 -9
  40. package/dist/lib/core/output/densify-externals.js +1 -0
  41. package/dist/lib/domain/config/federation-config.contract.d.ts +29 -2
  42. package/dist/lib/domain/utils/file-watcher.contract.d.ts +19 -1
  43. package/dist/lib/domain/utils/io-port.contract.d.ts +20 -6
  44. package/dist/lib/utils/file-watcher.d.ts +15 -4
  45. package/dist/lib/utils/file-watcher.js +126 -16
  46. package/dist/lib/utils/io/node-io-adapter.js +85 -24
  47. package/dist/lib/utils/package/cjs-named-exports.d.ts +21 -0
  48. package/dist/lib/utils/package/cjs-named-exports.js +36 -0
  49. package/dist/lib/utils/package/entry-point-resolver.js +2 -5
  50. package/dist/lib/utils/package/esm-detection.d.ts +13 -0
  51. package/dist/lib/utils/package/esm-detection.js +29 -0
  52. package/dist/lib/utils/package/package-info.d.ts +13 -0
  53. package/dist/lib/utils/package/package-info.js +30 -4
  54. package/dist/lib/utils/package/resolve-wildcard-keys.js +8 -2
  55. package/dist/lib/utils/path-patterns.d.ts +14 -0
  56. package/dist/lib/utils/path-patterns.js +12 -0
  57. package/package.json +6 -6
@@ -1,51 +1,72 @@
1
1
  import * as fs from "fs";
2
+ import * as path from "path";
2
3
  import * as crypto from "crypto";
3
4
  import fg from "fast-glob";
4
5
  const nodeIo = {
5
- readText(path) {
6
- return fs.readFileSync(path, "utf-8");
6
+ readText(path2) {
7
+ return fs.readFileSync(path2, "utf-8");
7
8
  },
8
- readBytes(path) {
9
- return fs.readFileSync(path);
9
+ readBytes(path2) {
10
+ return fs.readFileSync(path2);
10
11
  },
11
- exists(path) {
12
- return fs.existsSync(path);
12
+ exists(path2) {
13
+ return fs.existsSync(path2);
13
14
  },
14
- isFile(path) {
15
+ isFile(path2) {
15
16
  try {
16
- return fs.statSync(path).isFile();
17
+ return fs.statSync(path2).isFile();
17
18
  } catch {
18
19
  return false;
19
20
  }
20
21
  },
21
- isDirectory(path) {
22
+ isDirectory(path2) {
22
23
  try {
23
- return fs.statSync(path).isDirectory();
24
+ return fs.statSync(path2).isDirectory();
24
25
  } catch {
25
26
  return false;
26
27
  }
27
28
  },
28
- readDir(path) {
29
+ readDir(path2) {
29
30
  try {
30
- return fs.readdirSync(path);
31
+ return fs.readdirSync(path2);
31
32
  } catch {
32
33
  return [];
33
34
  }
34
35
  },
35
- writeText(path, data) {
36
- fs.writeFileSync(path, data, "utf-8");
36
+ realpath(path2) {
37
+ try {
38
+ return fs.realpathSync(path2);
39
+ } catch {
40
+ return path2;
41
+ }
37
42
  },
38
- mkdirp(path) {
39
- fs.mkdirSync(path, { recursive: true });
43
+ stat(path2) {
44
+ try {
45
+ const s = fs.lstatSync(path2);
46
+ return { mtimeMs: s.mtimeMs, size: s.size, isSymbolicLink: s.isSymbolicLink() };
47
+ } catch {
48
+ return null;
49
+ }
50
+ },
51
+ writeText(path2, data) {
52
+ fs.writeFileSync(path2, data, "utf-8");
53
+ },
54
+ mkdirp(path2) {
55
+ fs.mkdirSync(path2, { recursive: true });
40
56
  },
41
57
  copyFile(from, to) {
42
58
  fs.copyFileSync(from, to);
43
59
  },
44
- remove(path) {
45
- fs.unlinkSync(path);
60
+ remove(path2) {
61
+ fs.unlinkSync(path2);
46
62
  },
47
63
  globFiles(pattern, opts) {
48
- return fg.sync(pattern, { cwd: opts.cwd, onlyFiles: true, deep: Infinity });
64
+ return fg.sync(pattern, {
65
+ cwd: opts.cwd,
66
+ ignore: opts.ignore,
67
+ onlyFiles: true,
68
+ deep: Infinity
69
+ });
49
70
  },
50
71
  hash(algorithm, data) {
51
72
  const sum = crypto.createHash(algorithm).update(data);
@@ -54,15 +75,55 @@ const nodeIo = {
54
75
  base64: () => sum.digest("base64")
55
76
  };
56
77
  },
57
- watch(path, opts, onEvent) {
58
- const watcher = opts.recursive ? fs.watch(
59
- path,
60
- { recursive: true },
78
+ watch(watchPath, opts, onEvent) {
79
+ if (opts.poll) return pollWatch(watchPath, opts.recursive, opts.poll.intervalMs, onEvent);
80
+ const watcher = fs.watch(
81
+ watchPath,
82
+ { recursive: opts.recursive },
61
83
  (_event, filename) => onEvent(filename ? filename.toString() : null)
62
- ) : fs.watch(path, () => onEvent(path));
84
+ );
63
85
  return { close: () => watcher.close() };
64
86
  }
65
87
  };
88
+ function pollWatch(root, recursive, intervalMs, onEvent) {
89
+ const snapshot = () => {
90
+ const out = /* @__PURE__ */ new Map();
91
+ const walk = (dir) => {
92
+ let entries;
93
+ try {
94
+ entries = fs.readdirSync(dir, { withFileTypes: true });
95
+ } catch {
96
+ return;
97
+ }
98
+ for (const entry of entries) {
99
+ const full = path.join(dir, entry.name);
100
+ if (entry.isDirectory()) {
101
+ if (recursive) walk(full);
102
+ } else {
103
+ try {
104
+ out.set(path.relative(root, full), fs.statSync(full).mtimeMs);
105
+ } catch {
106
+ }
107
+ }
108
+ }
109
+ };
110
+ walk(root);
111
+ return out;
112
+ };
113
+ let prev = snapshot();
114
+ const timer = setInterval(() => {
115
+ const next = snapshot();
116
+ for (const [rel, mtime] of next) {
117
+ if (prev.get(rel) !== mtime) onEvent(rel);
118
+ }
119
+ for (const rel of prev.keys()) {
120
+ if (!next.has(rel)) onEvent(rel);
121
+ }
122
+ prev = next;
123
+ }, intervalMs);
124
+ timer.unref?.();
125
+ return { close: () => clearInterval(timer) };
126
+ }
66
127
  export {
67
128
  nodeIo
68
129
  };
@@ -0,0 +1,21 @@
1
+ /** A key is re-exportable only if it is a syntactically valid identifier name. */
2
+ export declare const isIdentifierName: (name: string) => boolean;
3
+ /**
4
+ * Decides whether a `require()`d CommonJS value needs a synthetic named-export
5
+ * wrapper, and which names to re-export. UMD/CJS packages (e.g. dayjs) assign
6
+ * named exports dynamically, invisible to static lexers; enumerating the value
7
+ * recovers them. ES-module namespaces and `__esModule` interop objects are
8
+ * skipped — a bundler already exposes those statically.
9
+ */
10
+ export declare const planCjsWrap: (mod: unknown) => {
11
+ wrap: boolean;
12
+ keys: string[];
13
+ };
14
+ /**
15
+ * Synthetic ESM entry re-exporting the CommonJS default plus each discovered name.
16
+ * The `export { local as key }` clause lets reserved-word keys (`class`, `default`)
17
+ * pass without escaping.
18
+ */
19
+ export declare const buildSyntheticCjsEntry: (importPath: string, keys: string[]) => string;
20
+ /** True when a `require()` failure just means the file was ESM after all. */
21
+ export declare const isEsmInteropError: (err: unknown) => boolean;
@@ -0,0 +1,36 @@
1
+ const isIdentifierName = (name) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name);
2
+ const planCjsWrap = (mod) => {
3
+ if (mod === null || typeof mod !== "object" && typeof mod !== "function") {
4
+ return { wrap: false, keys: [] };
5
+ }
6
+ if (mod[Symbol.toStringTag] === "Module") {
7
+ return { wrap: false, keys: [] };
8
+ }
9
+ if (mod["__esModule"]) {
10
+ return { wrap: false, keys: [] };
11
+ }
12
+ const keys = Object.keys(mod).filter(
13
+ (key) => key !== "default" && key !== "__esModule" && isIdentifierName(key)
14
+ );
15
+ return { wrap: keys.length > 0, keys };
16
+ };
17
+ const buildSyntheticCjsEntry = (importPath, keys) => {
18
+ const spec = JSON.stringify(importPath);
19
+ const lines = [`import _nfDefault from ${spec};`, `export default _nfDefault;`];
20
+ if (keys.length > 0) {
21
+ keys.forEach((key, i) => lines.push(`const _nf${i} = _nfDefault[${JSON.stringify(key)}];`));
22
+ lines.push(`export { ${keys.map((key, i) => `_nf${i} as ${key}`).join(", ")} };`);
23
+ }
24
+ return lines.join("\n") + "\n";
25
+ };
26
+ const isEsmInteropError = (err) => {
27
+ const code = err?.code;
28
+ if (code === "ERR_REQUIRE_ESM" || code === "ERR_REQUIRE_ASYNC_MODULE") return true;
29
+ return err instanceof SyntaxError && /Unexpected token 'export'|Cannot use import statement|export|import statement/.test(err.message);
30
+ };
31
+ export {
32
+ buildSyntheticCjsEntry,
33
+ isEsmInteropError,
34
+ isIdentifierName,
35
+ planCjsWrap
36
+ };
@@ -44,7 +44,7 @@ function resolvePackageInfo(repo, packageName, directory) {
44
44
  const version = mainPkgJson["version"];
45
45
  const esm = mainPkgJson["type"] === "module";
46
46
  if (!version) {
47
- logger.warn("No version found for " + packageName);
47
+ logger.debug("No version found for " + packageName + " in " + directory);
48
48
  return null;
49
49
  }
50
50
  const pathToSecondary = path.relative(mainPkgName, packageName);
@@ -67,10 +67,7 @@ function resolvePackageInfo(repo, packageName, directory) {
67
67
  const result = strategy(ctx);
68
68
  if (result) return result;
69
69
  }
70
- logger.warn("No entry point found for " + packageName);
71
- logger.warn(
72
- "If you don't need this package, skip it in your federation.config.js or consider moving it into depDependencies in your package.json"
73
- );
70
+ logger.debug("No entry point found for " + packageName + " in " + directory);
74
71
  return null;
75
72
  }
76
73
  export {
@@ -3,3 +3,16 @@
3
3
  * or ambiguous (`undefined`).
4
4
  */
5
5
  export declare const isESMExport: (e: string) => boolean | undefined;
6
+ export type ModuleFormat = 'esm' | 'cjs' | 'unknown';
7
+ /** Node's format rule keyed on extension alone; `.js` stays ambiguous. */
8
+ export declare const classifyByExtension: (entryPoint: string) => ModuleFormat;
9
+ /** Does the source contain top-level ESM `import`/`export`? Dynamic `import()` is excluded (legal in CJS). */
10
+ export declare const hasEsmSyntax: (source: string) => boolean;
11
+ export declare const isCjsCandidate: (input: {
12
+ esm?: boolean;
13
+ entryPoint: string;
14
+ /** Nearest package.json `type` for an ambiguous `.js`. */
15
+ packageType?: "module" | "commonjs";
16
+ /** Lazy source for fallback content sniff; only read for an ambiguous `.js`. */
17
+ readSource?: () => string;
18
+ }) => boolean;
@@ -5,6 +5,35 @@ const isESMExport = (e) => {
5
5
  if (e === "cjs" || e === "commonjs") return false;
6
6
  return void 0;
7
7
  };
8
+ const classifyByExtension = (entryPoint) => {
9
+ if (entryPoint.endsWith(".mjs")) return "esm";
10
+ if (entryPoint.endsWith(".cjs")) return "cjs";
11
+ if (entryPoint.endsWith(".js")) return "unknown";
12
+ return "esm";
13
+ };
14
+ const hasEsmSyntax = (source) => {
15
+ const head = source.slice(0, 16384);
16
+ const exportStmt = /(?:^|[;\n}])\s*export\s*(?:\{|\*|default\b|const\b|let\b|var\b|function\b|async\b|class\b)/;
17
+ const importStmt = /(?:^|[;\n}])\s*import\s*(?:[A-Za-z_$]|\{|\*|['"])/;
18
+ return exportStmt.test(head) || importStmt.test(head);
19
+ };
20
+ const isCjsCandidate = (input) => {
21
+ if (input.esm === true) return false;
22
+ const fmt = classifyByExtension(input.entryPoint);
23
+ if (fmt === "esm") return false;
24
+ if (fmt === "cjs") return true;
25
+ if (input.packageType === "module") return false;
26
+ if (input.readSource) {
27
+ try {
28
+ if (hasEsmSyntax(input.readSource())) return false;
29
+ } catch {
30
+ }
31
+ }
32
+ return true;
33
+ };
8
34
  export {
35
+ classifyByExtension,
36
+ hasEsmSyntax,
37
+ isCjsCandidate,
9
38
  isESMExport
10
39
  };
@@ -2,6 +2,19 @@ import type { PackageInfo, PackageJsonRepository, VersionMap } from '../../domai
2
2
  export { sharedPackageJsonRepository } from '../io/package-json-repository.js';
3
3
  export type { PackageInfo, VersionMap, ExportCondition, ExportEntry, } from '../../domain/utils/package-json.contract.js';
4
4
  export { isESMExport } from './esm-detection.js';
5
+ export declare function tryGetPackageInfo(packageName: string, workspaceRoot: string, repo?: PackageJsonRepository): PackageInfo | null;
6
+ /**
7
+ * Resolve a package that is expected to be resolvable, warning once if it is not.
8
+ * Only use this where a failure is genuinely actionable, i.e. for packages the user
9
+ * asked to share.
10
+ */
5
11
  export declare function getPackageInfo(packageName: string, workspaceRoot: string, repo?: PackageJsonRepository): PackageInfo | null;
12
+ /**
13
+ * Installed version per key, from each key's package root. Resolution is deduped by root:
14
+ * `findDepPackageJson` trims to the root anyway, and that root package.json is also where
15
+ * `resolvePackageInfo` reads the `version` it records as `PackageInfo.version`, so a secondary
16
+ * yields the same string as its main entry point. Unresolvable keys map to ''.
17
+ */
18
+ export declare function installedVersions(packageNames: string[], workspaceRoot: string, repo?: PackageJsonRepository): Record<string, string>;
6
19
  export declare function getVersionMaps(project: string, workspace: string, repo?: PackageJsonRepository): VersionMap[];
7
20
  export declare function findDepPackageJson(packageName: string, projectRoot: string, repo?: PackageJsonRepository): string | null;
@@ -1,11 +1,11 @@
1
1
  import { logger } from "../logger.js";
2
2
  import { normalize } from "../normalize.js";
3
- import { sharedPackageJsonRepository } from "../io/package-json-repository.js";
3
+ import { getPkgFolder, sharedPackageJsonRepository } from "../io/package-json-repository.js";
4
4
  import { resolvePackageInfo } from "./entry-point-resolver.js";
5
5
  import { getVersionMaps as getVersionMapsFromRepo } from "./version-maps.js";
6
6
  import { sharedPackageJsonRepository as sharedPackageJsonRepository2 } from "../io/package-json-repository.js";
7
7
  import { isESMExport } from "./esm-detection.js";
8
- function getPackageInfo(packageName, workspaceRoot, repo = sharedPackageJsonRepository) {
8
+ function tryGetPackageInfo(packageName, workspaceRoot, repo = sharedPackageJsonRepository) {
9
9
  workspaceRoot = normalize(workspaceRoot, true);
10
10
  for (const info of repo.getPackageJsonFiles(workspaceRoot, workspaceRoot)) {
11
11
  const cand = resolvePackageInfo(repo, packageName, info.directory);
@@ -13,9 +13,33 @@ function getPackageInfo(packageName, workspaceRoot, repo = sharedPackageJsonRepo
13
13
  return cand;
14
14
  }
15
15
  }
16
- logger.warn("No meta data found for shared lib " + packageName);
17
16
  return null;
18
17
  }
18
+ function getPackageInfo(packageName, workspaceRoot, repo = sharedPackageJsonRepository) {
19
+ const info = tryGetPackageInfo(packageName, workspaceRoot, repo);
20
+ if (!info) {
21
+ logger.warn("No meta data found for shared lib " + packageName);
22
+ logger.warn(
23
+ "If you don't need this package, skip it in your federation.config.js or consider moving it into depDependencies in your package.json"
24
+ );
25
+ }
26
+ return info;
27
+ }
28
+ function installedVersions(packageNames, workspaceRoot, repo = sharedPackageJsonRepository) {
29
+ workspaceRoot = normalize(workspaceRoot, true);
30
+ const byRoot = /* @__PURE__ */ new Map();
31
+ const result = {};
32
+ for (const packageName of packageNames) {
33
+ const root = getPkgFolder(packageName);
34
+ if (!byRoot.has(root)) {
35
+ const pkgJsonPath = repo.findDepPackageJson(root, workspaceRoot);
36
+ const version = pkgJsonPath ? repo.readJson(pkgJsonPath)["version"] : "";
37
+ byRoot.set(root, version ?? "");
38
+ }
39
+ result[packageName] = byRoot.get(root);
40
+ }
41
+ return result;
42
+ }
19
43
  function getVersionMaps(project, workspace, repo = sharedPackageJsonRepository) {
20
44
  return getVersionMapsFromRepo(repo, project, workspace);
21
45
  }
@@ -26,6 +50,8 @@ export {
26
50
  findDepPackageJson,
27
51
  getPackageInfo,
28
52
  getVersionMaps,
53
+ installedVersions,
29
54
  isESMExport,
30
- sharedPackageJsonRepository2 as sharedPackageJsonRepository
55
+ sharedPackageJsonRepository2 as sharedPackageJsonRepository,
56
+ tryGetPackageInfo
31
57
  };
@@ -1,10 +1,16 @@
1
- import { captureWildcard, parseWildcard, substituteWildcard, toPosix } from "../path-patterns.js";
1
+ import {
2
+ captureWildcard,
3
+ parseWildcard,
4
+ substituteWildcard,
5
+ toGlobPattern,
6
+ toPosix
7
+ } from "../path-patterns.js";
2
8
  function resolvePackageJsonExportsWildcardCore(io, keyPattern, valuePattern, cwd) {
3
9
  const pattern = parseWildcard(valuePattern.replace(/^\.?\/+/, ""));
4
10
  if (!pattern.hasWildcard) {
5
11
  return [];
6
12
  }
7
- const files = io.globFiles(pattern.prefix + "**/*" + pattern.suffix, { cwd });
13
+ const files = io.globFiles(toGlobPattern(pattern), { cwd, ignore: ["**/node_modules/**"] });
8
14
  const keys = [];
9
15
  for (const file of files) {
10
16
  const relPath = toPosix(file).replace(/^\.\//, "");
@@ -1,4 +1,11 @@
1
1
  export declare const toPosix: (p: string) => string;
2
+ /**
3
+ * True when `file` is `dir` itself or lives under it. Both sides are normalized, so a
4
+ * caller cannot splice in `path.sep` and get a predicate that is silently always-false
5
+ * on Windows -- `linkedSharedDirs` and the file watcher both emit posix paths.
6
+ */
7
+ export declare function isUnderDir(file: string, dir: string): boolean;
8
+ export declare const isUnderAnyDir: (file: string, dirs: readonly string[]) => boolean;
2
9
  export interface WildcardPattern {
3
10
  prefix: string;
4
11
  suffix: string;
@@ -12,3 +19,10 @@ export declare function matchesWildcard(value: string, pattern: string): boolean
12
19
  */
13
20
  export declare function captureWildcard(value: string, pattern: WildcardPattern): string | null;
14
21
  export declare function substituteWildcard(template: string, captured: string): string;
22
+ /**
23
+ * A glob that is a superset of the pattern, for callers that re-check the match themselves
24
+ * (`captureWildcard`, `matchMapping`). `**` only acts as a globstar on a segment of its own,
25
+ * so a prefix stopping mid-segment (`libs/ui-`) has to be widened back to its directory --
26
+ * `libs/ui-**` reads as `libs/ui-*` and silently matches nothing one level down.
27
+ */
28
+ export declare function toGlobPattern({ prefix, suffix }: WildcardPattern): string;
@@ -1,4 +1,10 @@
1
1
  const toPosix = (p) => p.replace(/\\/g, "/");
2
+ function isUnderDir(file, dir) {
3
+ const f = toPosix(file);
4
+ const d = toPosix(dir).replace(/\/+$/, "");
5
+ return f === d || f.startsWith(d + "/");
6
+ }
7
+ const isUnderAnyDir = (file, dirs) => dirs.some((d) => isUnderDir(file, d));
2
8
  function parseWildcard(pattern) {
3
9
  const i = pattern.indexOf("*");
4
10
  if (i === -1) return { prefix: pattern, suffix: "", hasWildcard: false };
@@ -19,10 +25,16 @@ function captureWildcard(value, pattern) {
19
25
  function substituteWildcard(template, captured) {
20
26
  return template.replace("*", captured);
21
27
  }
28
+ function toGlobPattern({ prefix, suffix }) {
29
+ return prefix.slice(0, prefix.lastIndexOf("/") + 1) + "**/*" + suffix;
30
+ }
22
31
  export {
23
32
  captureWildcard,
33
+ isUnderAnyDir,
34
+ isUnderDir,
24
35
  matchesWildcard,
25
36
  parseWildcard,
26
37
  substituteWildcard,
38
+ toGlobPattern,
27
39
  toPosix
28
40
  };
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@softarc/native-federation",
3
- "version": "4.3.1",
3
+ "version": "4.4.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
- "packageManager": "pnpm@11.11.0",
6
+ "packageManager": "pnpm@11.18.0",
7
7
  "scripts": {
8
8
  "build": "node esbuild.config.mjs && tsc -p tsconfig.build.json",
9
9
  "lint": "eslint src",
@@ -13,7 +13,7 @@
13
13
  },
14
14
  "dependencies": {
15
15
  "@softarc/sheriff-core": "^0.19.6",
16
- "chalk": "^5.6.2",
16
+ "chalk": "^6.0.0",
17
17
  "esbuild": "^0.28.0",
18
18
  "fast-glob": "^3.3.3",
19
19
  "json5": "^2.2.3"
@@ -27,12 +27,12 @@
27
27
  "globals": "^17.3.0",
28
28
  "jiti": "^2.6.1",
29
29
  "jsdom": "^29.0.0",
30
- "knip": "^6.20.0",
31
- "prettier": "^3.8.1",
30
+ "knip": "^6.26.0",
31
+ "prettier": "^3.9.4",
32
32
  "tslib": "^2.3.0",
33
33
  "typescript": "~6.0.0",
34
34
  "typescript-eslint": "^8.61.0",
35
- "vite": "^8.0.0",
35
+ "vite": "^8.2.0",
36
36
  "vitest": "^4.0.0"
37
37
  },
38
38
  "exports": {