@softarc/native-federation 4.0.0-RC9 → 4.0.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.
- package/package.json +2 -2
- package/src/internal.d.ts +2 -0
- package/src/internal.js +1 -0
- package/src/lib/core/normalize-options.js +1 -33
- package/src/lib/domain/core/federation-options.contract.d.ts +1 -0
- package/src/lib/domain/utils/file-watcher.contract.d.ts +10 -0
- package/src/lib/domain/utils/file-watcher.contract.js +1 -0
- package/src/lib/utils/file-watcher.d.ts +5 -0
- package/src/lib/utils/file-watcher.js +51 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@softarc/native-federation",
|
|
3
|
-
"version": "4.0.0
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"dependencies": {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"chalk": "^5.6.2",
|
|
9
9
|
"fast-glob": "^3.3.3",
|
|
10
10
|
"json5": "^2.2.3",
|
|
11
|
-
"esbuild": "^0.
|
|
11
|
+
"esbuild": "^0.28.0"
|
|
12
12
|
},
|
|
13
13
|
"exports": {
|
|
14
14
|
"./package.json": "./package.json",
|
package/src/internal.d.ts
CHANGED
|
@@ -11,3 +11,5 @@ export type { NormalizedExternalConfig, NormalizedSharedExternalsConfig, } from
|
|
|
11
11
|
export type { NormalizedFederationConfig } from './lib/domain/config/federation-config.contract.js';
|
|
12
12
|
export { getDefaultCachePath, getChecksum } from './lib/utils/cache-persistence.js';
|
|
13
13
|
export { isInSkipList, prepareSkipList } from './lib/config/default-skip-list.js';
|
|
14
|
+
export { NfFileWatcher, NfFileWatcherOptions } from './lib/domain/utils/file-watcher.contract.js';
|
|
15
|
+
export { syncNfFileWatcher, createNfWatcher } from './lib/utils/file-watcher.js';
|
package/src/internal.js
CHANGED
|
@@ -8,3 +8,4 @@ export { createBuildResultMap, lookupInResultMap, popFromResultMap, } from './li
|
|
|
8
8
|
export { writeImportMap } from './lib/core/write-import-map.js';
|
|
9
9
|
export { getDefaultCachePath, getChecksum } from './lib/utils/cache-persistence.js';
|
|
10
10
|
export { isInSkipList, prepareSkipList } from './lib/config/default-skip-list.js';
|
|
11
|
+
export { syncNfFileWatcher, createNfWatcher } from './lib/utils/file-watcher.js';
|
|
@@ -27,6 +27,7 @@ export async function normalizeFederationOptions(options, cache) {
|
|
|
27
27
|
...options,
|
|
28
28
|
entryPoints: options.entryPoints ?? Object.values(config.exposes ?? {}),
|
|
29
29
|
projectName: resolveProjectName(options.projectName ?? config.name),
|
|
30
|
+
cacheExternalArtifacts: options.cacheExternalArtifacts ?? true,
|
|
30
31
|
federationCache,
|
|
31
32
|
};
|
|
32
33
|
/**
|
|
@@ -46,11 +47,6 @@ export async function normalizeFederationOptions(options, cache) {
|
|
|
46
47
|
.reduce((acc, [_path, _import]) => ({ ...acc, [_path]: _import }), {});
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
|
-
/**
|
|
50
|
-
* Step 4: Verify imports
|
|
51
|
-
*/
|
|
52
|
-
checkForInvalidImports(Object.values(config.sharedMappings), 'shared mappings');
|
|
53
|
-
checkForInvalidImports(Object.keys(config.shared), 'externals');
|
|
54
50
|
return { config, options: normalizedOptions };
|
|
55
51
|
}
|
|
56
52
|
export function resolveProjectName(name) {
|
|
@@ -60,31 +56,3 @@ export function resolveProjectName(name) {
|
|
|
60
56
|
}
|
|
61
57
|
return normalizePackageName(name);
|
|
62
58
|
}
|
|
63
|
-
const ALLOWED_FILE_EXTENSIONS = new Set(['mjs', 'js', 'mts', 'ts', 'jsx', 'tsx', 'json']);
|
|
64
|
-
function checkForInvalidImports(importList, type) {
|
|
65
|
-
const importsWithDot = [];
|
|
66
|
-
for (const mappingImport of importList) {
|
|
67
|
-
if (mappingImport.indexOf('.') < 0) {
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
const queryIndex = mappingImport.search(/[?#]/);
|
|
71
|
-
const sanitizedImport = queryIndex >= 0 ? mappingImport.slice(0, queryIndex) : mappingImport;
|
|
72
|
-
const segmentStart = sanitizedImport.lastIndexOf('/') + 1;
|
|
73
|
-
const dotIndex = sanitizedImport.lastIndexOf('.');
|
|
74
|
-
if (dotIndex < segmentStart) {
|
|
75
|
-
importsWithDot.push(mappingImport);
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
const extension = sanitizedImport.slice(dotIndex + 1);
|
|
79
|
-
if (!ALLOWED_FILE_EXTENSIONS.has(extension)) {
|
|
80
|
-
importsWithDot.push(mappingImport);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
if (importsWithDot.length > 0) {
|
|
84
|
-
importsWithDot.forEach(e => {
|
|
85
|
-
logger.warn(`Import '${e}' contains a bad dot (.) import.`);
|
|
86
|
-
});
|
|
87
|
-
logger.debug('Bad import issue: https://github.com/vitejs/vite/issues/21036');
|
|
88
|
-
throw new Error(`Invalid '${type}' config. Invalid imports paths detected, consider using a barrel import instead. `);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface NfFileWatcherOptions {
|
|
2
|
+
onChange?: (path: string) => void;
|
|
3
|
+
}
|
|
4
|
+
export interface NfFileWatcher {
|
|
5
|
+
addPaths(paths: string | readonly string[]): void;
|
|
6
|
+
close(): Promise<void>;
|
|
7
|
+
get(): ReadonlySet<string>;
|
|
8
|
+
clear(): void;
|
|
9
|
+
mutate(fn: (dirtyPaths: Set<string>) => void): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { NfFileWatcher, NfFileWatcherOptions } from '../domain/utils/file-watcher.contract.js';
|
|
2
|
+
export declare function createNfWatcher(options?: NfFileWatcherOptions): NfFileWatcher;
|
|
3
|
+
export declare function syncNfFileWatcher(watcher: NfFileWatcher, bundlerCache: {
|
|
4
|
+
keys(): IterableIterator<string>;
|
|
5
|
+
}): void;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { logger } from '@softarc/native-federation/internal';
|
|
2
|
+
import { watch, statSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
const toUnix = (p) => p.replace(/\\/g, '/');
|
|
5
|
+
export function createNfWatcher(options = {}) {
|
|
6
|
+
const { onChange } = options;
|
|
7
|
+
const watchers = new Map();
|
|
8
|
+
const dirtyPaths = new Set();
|
|
9
|
+
const notify = (path) => {
|
|
10
|
+
if (onChange)
|
|
11
|
+
onChange(path);
|
|
12
|
+
else
|
|
13
|
+
dirtyPaths.add(path);
|
|
14
|
+
};
|
|
15
|
+
return {
|
|
16
|
+
addPaths(paths) {
|
|
17
|
+
const list = typeof paths === 'string' ? [paths] : [...paths];
|
|
18
|
+
for (const p of list) {
|
|
19
|
+
if (watchers.has(p))
|
|
20
|
+
continue;
|
|
21
|
+
try {
|
|
22
|
+
const isDir = statSync(p).isDirectory();
|
|
23
|
+
const w = isDir
|
|
24
|
+
? watch(p, { recursive: true }, (_, filename) => {
|
|
25
|
+
if (filename)
|
|
26
|
+
notify(toUnix(join(p, filename)));
|
|
27
|
+
})
|
|
28
|
+
: watch(p, () => notify(toUnix(p)));
|
|
29
|
+
watchers.set(p, w);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
logger.debug(`Could not watch path '${p}'.`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
get: () => dirtyPaths,
|
|
37
|
+
clear: () => dirtyPaths.clear(),
|
|
38
|
+
mutate: fn => fn(dirtyPaths),
|
|
39
|
+
async close() {
|
|
40
|
+
for (const w of watchers.values()) {
|
|
41
|
+
w.close();
|
|
42
|
+
}
|
|
43
|
+
watchers.clear();
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function syncNfFileWatcher(watcher, bundlerCache) {
|
|
48
|
+
const files = [...bundlerCache.keys()].filter(k => !k.includes('node_modules'));
|
|
49
|
+
if (files.length)
|
|
50
|
+
watcher.addPaths(files);
|
|
51
|
+
}
|