Skip to content

Commit d13fe55

Browse files
committed
fix(nf-core): provide flag for transient deps
1 parent d5183c6 commit d13fe55

File tree

19 files changed

+177
-65
lines changed

19 files changed

+177
-65
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
{
22
"name": "@softarc/native-federation",
3-
"version": "2.0.13",
3+
"version": "2.0.15",
44
"type": "commonjs",
55
"license": "MIT",
66
"dependencies": {
77
"json5": "^2.2.0",
88
"npmlog": "^6.0.2",
9-
"@softarc/native-federation-runtime": "2.0.13"
9+
"@softarc/native-federation-runtime": "2.0.15"
1010
}
1111
}

libs/native-federation-core/src/lib/config/federation-config.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { SkipList } from '../core/default-skip-list';
1+
import { PreparedSkipList, SkipList } from '../core/default-skip-list';
22
import { MappedPath } from '../utils/mapped-paths';
33

44
export interface SharedConfig {
@@ -7,6 +7,8 @@ export interface SharedConfig {
77
requiredVersion?: string;
88
version?: string;
99
includeSecondaries?: boolean;
10+
transient?: boolean;
11+
platform?: 'browser' | 'node';
1012
packageInfo?: {
1113
entryPoint: string;
1214
version: string;
@@ -28,6 +30,7 @@ export interface NormalizedSharedConfig {
2830
requiredVersion: string;
2931
version?: string;
3032
includeSecondaries?: boolean;
33+
platform: 'browser' | 'node';
3134
packageInfo?: {
3235
entryPoint: string;
3336
version: string;
@@ -40,4 +43,5 @@ export interface NormalizedFederationConfig {
4043
exposes: Record<string, string>;
4144
shared: Record<string, NormalizedSharedConfig>;
4245
sharedMappings: Array<MappedPath>;
46+
skip: PreparedSkipList;
4347
}

libs/native-federation-core/src/lib/config/share-utils.ts

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
import { getConfigContext } from './configuration-context';
1919
import { logger } from '../utils/logger';
2020
import { resolveGlobSync } from '../utils/resolve-glob';
21+
import { ShareObject } from '@softarc/native-federation-runtime';
2122

2223
let inferVersion = false;
2324

@@ -109,26 +110,26 @@ function _findSecondaries(
109110
): void {
110111
const files = fs.readdirSync(libPath);
111112

112-
const dirs = files
113+
const secondaries = files
113114
.map((f) => path.join(libPath, f))
114115
.filter((f) => fs.lstatSync(f).isDirectory() && f !== 'node_modules');
115116

116-
const secondaries = dirs.filter((d) =>
117-
fs.existsSync(path.join(d, 'package.json'))
118-
);
119117
for (const s of secondaries) {
120-
const secondaryLibName = s
121-
.replace(/\\/g, '/')
122-
.replace(/^.*node_modules[/]/, '');
123-
if (excludes.includes(secondaryLibName)) {
124-
continue;
125-
}
118+
if (fs.existsSync(path.join(s, 'package.json'))) {
119+
const secondaryLibName = s
120+
.replace(/\\/g, '/')
121+
.replace(/^.*node_modules[/]/, '');
122+
if (excludes.includes(secondaryLibName)) {
123+
continue;
124+
}
126125

127-
if (isInSkipList(secondaryLibName, PREPARED_DEFAULT_SKIP_LIST)) {
128-
continue;
126+
if (isInSkipList(secondaryLibName, PREPARED_DEFAULT_SKIP_LIST)) {
127+
continue;
128+
}
129+
130+
acc[secondaryLibName] = { ...shareObject };
129131
}
130132

131-
acc[secondaryLibName] = { ...shareObject };
132133
_findSecondaries(s, excludes, shareObject, acc);
133134
}
134135
}
@@ -351,27 +352,35 @@ type TransientDependency = {
351352
};
352353

353354
function findTransientDeps(
354-
packageNames: string[],
355+
configuredShareObjects: Config,
355356
projectRoot: string,
356357
preparedSkipList: PreparedSkipList
357358
): TransientDependency[] {
358359
const discovered = new Set<string>();
359360
const result: TransientDependency[] = [];
360361

362+
const packageNames = Object.keys(configuredShareObjects) as Array<
363+
keyof typeof configuredShareObjects
364+
>;
365+
361366
for (const packageName of packageNames) {
362-
const packagePath = path.join(
363-
projectRoot,
364-
'node_modules',
365-
packageName,
366-
'package.json'
367-
);
368-
_findTransientDeps(
369-
packagePath,
370-
projectRoot,
371-
preparedSkipList,
372-
discovered,
373-
result
374-
);
367+
const shareConfig = configuredShareObjects[packageName];
368+
369+
if (typeof shareConfig === 'object' && shareConfig.transient) {
370+
const packagePath = path.join(
371+
projectRoot,
372+
'node_modules',
373+
packageName,
374+
'package.json'
375+
);
376+
_findTransientDeps(
377+
packagePath,
378+
projectRoot,
379+
preparedSkipList,
380+
discovered,
381+
result
382+
);
383+
}
375384
}
376385

377386
return result;
@@ -431,13 +440,12 @@ export function share(
431440
projectPath = inferProjectPath(projectPath);
432441
const packagePath = findPackageJson(projectPath);
433442

434-
const sharedPackageNames = Object.keys(configuredShareObjects);
435443
const packageDirectory = path.dirname(packagePath);
436444

437445
const preparedSkipList = prepareSkipList(skipList);
438446

439447
const transientDeps = findTransientDeps(
440-
sharedPackageNames,
448+
configuredShareObjects,
441449
packageDirectory,
442450
preparedSkipList
443451
);

libs/native-federation-core/src/lib/config/with-native-federation.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
prepareSkipList,
1212
} from '../core/default-skip-list';
1313
import { logger } from '../utils/logger';
14+
import { DEFAULT_SERVER_DEPS_LIST } from '../core/default-server-deps-list';
1415

1516
export function withNativeFederation(
1617
config: FederationConfig
@@ -22,6 +23,7 @@ export function withNativeFederation(
2223
exposes: config.exposes ?? {},
2324
shared: normalizeShared(config, skip),
2425
sharedMappings: normalizeSharedMappings(config, skip),
26+
skip
2527
};
2628
}
2729

@@ -38,6 +40,7 @@ function normalizeShared(
3840
singleton: true,
3941
strictVersion: true,
4042
requiredVersion: 'auto',
43+
platform: 'browser',
4144
}) as Record<string, NormalizedSharedConfig>;
4245
} else {
4346
result = Object.keys(shared).reduce(
@@ -50,6 +53,7 @@ function normalizeShared(
5053
version: shared[cur].version,
5154
includeSecondaries: shared[cur].includeSecondaries,
5255
packageInfo: shared[cur].packageInfo,
56+
platform: shared[cur].platform ?? getDefaultPlatform(cur)
5357
},
5458
}),
5559
{}
@@ -82,7 +86,8 @@ function normalizeSharedMappings(
8286
sharedMappings: config.sharedMappings,
8387
});
8488

85-
const result = paths.filter(
89+
const result = paths
90+
.filter(
8691
(p) => !isInSkipList(p.key, skip) && !p.key.includes('*')
8792
);
8893

@@ -92,3 +97,12 @@ function normalizeSharedMappings(
9297

9398
return result;
9499
}
100+
101+
function getDefaultPlatform(cur: string): 'browser' | 'node' {
102+
if (DEFAULT_SERVER_DEPS_LIST.find(e => cur.startsWith(e))) {
103+
return 'node';
104+
}
105+
else {
106+
return 'browser';
107+
}
108+
}

libs/native-federation-core/src/lib/core/build-adapter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export interface BuildAdapterOptions {
3030
watch?: boolean;
3131
kind: BuildKind;
3232
hash: boolean;
33+
platform?: 'browser' | 'node';
3334
}
3435

3536
export interface BuildResult {

libs/native-federation-core/src/lib/core/build-for-federation.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { NormalizedFederationConfig } from '../config/federation-config';
1+
import { NormalizedFederationConfig, NormalizedSharedConfig } from '../config/federation-config';
22
import { FederationInfo } from '@softarc/native-federation-runtime';
33
import { FederationOptions } from './federation-options';
44
import { writeImportMap } from './write-import-map';
@@ -19,6 +19,7 @@ export const defaultBuildParams: BuildParams = {
1919
skipMappingsAndExposed: false,
2020
};
2121

22+
2223
export async function buildForFederation(
2324
config: NormalizedFederationConfig,
2425
fedOptions: FederationOptions,
@@ -38,7 +39,12 @@ export async function buildForFederation(
3839
? describeExposed(config, fedOptions)
3940
: artefactInfo.exposes;
4041

41-
const sharedPackageInfo = await bundleShared(config, fedOptions, externals);
42+
const { sharedBrowser, sharedServer } = splitShared(config.shared);
43+
44+
const sharedPackageInfoBrowser = await bundleShared(sharedBrowser, config, fedOptions, externals, 'browser');
45+
const sharedPackageInfoServer = await bundleShared(sharedServer, config, fedOptions, externals, 'node');
46+
47+
const sharedPackageInfo = [...sharedPackageInfoBrowser, ...sharedPackageInfoServer];
4248

4349
const sharedMappingInfo = !artefactInfo
4450
? describeSharedMappings(config, fedOptions)
@@ -57,3 +63,24 @@ export async function buildForFederation(
5763

5864
return federationInfo;
5965
}
66+
67+
function splitShared(shared: Record<string, NormalizedSharedConfig>): {sharedServer: Record<string, NormalizedSharedConfig>, sharedBrowser: Record<string, NormalizedSharedConfig>} {
68+
const sharedServer: Record<string, NormalizedSharedConfig> = {};
69+
const sharedBrowser: Record<string, NormalizedSharedConfig> = {};
70+
71+
for (const key in shared) {
72+
if (shared[key].platform === 'node') {
73+
sharedServer[key] = shared[key];
74+
}
75+
else {
76+
sharedBrowser[key] = shared[key];
77+
}
78+
}
79+
80+
return {
81+
sharedBrowser,
82+
sharedServer
83+
};
84+
85+
}
86+

libs/native-federation-core/src/lib/core/bundle-shared.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as path from 'path';
22
import * as fs from 'fs';
3-
import { NormalizedFederationConfig } from '../config/federation-config';
3+
import { NormalizedFederationConfig, NormalizedSharedConfig } from '../config/federation-config';
44
import { bundle } from '../utils/build-utils';
55
import { getPackageInfo, PackageInfo } from '../utils/package-info';
66
import { SharedInfo } from '@softarc/native-federation-runtime';
@@ -11,9 +11,11 @@ import { normalize } from '../utils/normalize';
1111
import crypto from 'crypto';
1212

1313
export async function bundleShared(
14+
sharedBundles: Record<string, NormalizedSharedConfig>,
1415
config: NormalizedFederationConfig,
1516
fedOptions: FederationOptions,
16-
externals: string[]
17+
externals: string[],
18+
platform: 'browser' | 'node' = 'browser'
1719
): Promise<Array<SharedInfo>> {
1820
const folder = fedOptions.packageJson
1921
? path.dirname(fedOptions.packageJson)
@@ -26,16 +28,16 @@ export async function bundleShared(
2628

2729
fs.mkdirSync(cachePath, { recursive: true });
2830

29-
const inferedPackageInfos = Object.keys(config.shared)
30-
.filter((packageName) => !config.shared[packageName].packageInfo)
31+
const inferedPackageInfos = Object.keys(sharedBundles)
32+
.filter((packageName) => !sharedBundles[packageName].packageInfo)
3133
.map((packageName) => getPackageInfo(packageName, folder))
3234
.filter((pi) => !!pi) as PackageInfo[];
3335

34-
const configuredPackageInfos = Object.keys(config.shared)
35-
.filter((packageName) => !!config.shared[packageName].packageInfo)
36+
const configuredPackageInfos = Object.keys(sharedBundles)
37+
.filter((packageName) => !!sharedBundles[packageName].packageInfo)
3638
.map((packageName) => ({
3739
packageName,
38-
...config.shared[packageName].packageInfo,
40+
...sharedBundles[packageName].packageInfo,
3941
})) as PackageInfo[];
4042

4143
const packageInfos = [...inferedPackageInfos, ...configuredPackageInfos];
@@ -74,7 +76,7 @@ export async function bundleShared(
7476
);
7577

7678
if (entryPoints.length > 0) {
77-
logger.info('Preparing shared npm packages');
79+
logger.info('Preparing shared npm packages for the platform ' + platform);
7880
logger.notice('This only needs to be done once, as results are cached');
7981
logger.notice(
8082
"Skip packages you don't want to share in your federation config"
@@ -91,6 +93,7 @@ export async function bundleShared(
9193
dev: fedOptions.dev,
9294
kind: 'shared-package',
9395
hash: false,
96+
platform,
9497
});
9598

9699
for (const fileName of exptedResults) {
@@ -134,7 +137,7 @@ export async function bundleShared(
134137
const outFileNames = [...exptedResults];
135138

136139
return packageInfos.map((pi) => {
137-
const shared = config.shared[pi.packageName];
140+
const shared = sharedBundles[pi.packageName];
138141
return {
139142
packageName: pi.packageName,
140143
outFileName: path.basename(outFileNames.shift() || ''),
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
export const DEFAULT_SERVER_DEPS_LIST: string[] = [
3+
'@angular/platform-server',
4+
'@angular/platform-server/init',
5+
'@angular/ssr',
6+
];
7+
8+
export const DEFAULT_SERVER_DEPS_SET = new Set(DEFAULT_SERVER_DEPS_LIST);
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { NormalizedFederationConfig } from '../config/federation-config';
2-
// import { isInSkipList, PREPARED_DEFAULT_SKIP_LIST } from './default-skip-list';
32

43
export function getExternals(config: NormalizedFederationConfig) {
54
const shared = Object.keys(config.shared);
65
const sharedMappings = config.sharedMappings.map((m) => m.key);
76

8-
const externals = [...shared, ...sharedMappings];
7+
// TODO: Also handle deps that match RegExps and functions
8+
const depsToSkip = config.skip.strings;
9+
const externals = [...shared, ...sharedMappings, ...depsToSkip];
910

1011
return externals;
11-
// return externals.filter((p) => !isInSkipList(p, PREPARED_DEFAULT_SKIP_LIST));
1212
}

libs/native-federation-esbuild/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@softarc/native-federation-esbuild",
3-
"version": "2.0.13",
3+
"version": "2.0.15",
44
"type": "commonjs",
55
"dependencies": {
66
"@rollup/plugin-commonjs": "^22.0.2",

0 commit comments

Comments
 (0)