Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions src/builders/remote/builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import './setup-builder-env-variables.js';

import * as path from 'path';
import { existsSync, mkdirSync, rmSync } from 'fs';
import { mkdirSync } from 'fs';

import { SourceFileCache } from '@angular/build/private';
import { deleteOutputDir, SourceFileCache } from '@angular/build/private';

import { type BuilderContext, type BuilderOutput, createBuilder } from '@angular-devkit/architect';

Expand Down Expand Up @@ -36,6 +36,7 @@ import { resolveCachePath } from '../../utils/resolve-cache-path.js';

import type { NfRemoteBuilderSchema, NfRemoteInternalOptions } from './schema.js';
import { resolveNgBuilderOptions } from './resolve-ng-options.js';
import { resolveBrowserOutputPath } from './output-path.js';
import { inferFederationConfigPath } from './infer-config-path.js';
import { createDebouncedChangeWatcher } from './change-watcher.js';
import {
Expand All @@ -60,8 +61,10 @@ export async function* runRemoteBuilder(
const context = withDiskCaseWorkspaceRoot(builderContext);

const federationTsConfig = nfBuilderOptions.tsConfig;
const outputBase = nfBuilderOptions.outputPath ?? `dist/${context.target!.project}`;
const browserOutputPath = path.join(outputBase, 'browser');
const browserOutputPath = resolveBrowserOutputPath(
nfBuilderOptions.outputPath,
context.target!.project
);
const absoluteBrowserOutput = path.resolve(context.workspaceRoot, browserOutputPath);

const { ngBuilderOptions, projectRoot, projectSourceRoot } = await resolveNgBuilderOptions(
Expand Down Expand Up @@ -147,9 +150,7 @@ export async function* runRemoteBuilder(
}
}

if (existsSync(absoluteBrowserOutput)) {
rmSync(absoluteBrowserOutput, { recursive: true });
}
await deleteOutputDir(context.workspaceRoot, absoluteBrowserOutput);
mkdirSync(absoluteBrowserOutput, { recursive: true });

try {
Expand Down
30 changes: 30 additions & 0 deletions src/builders/remote/output-path.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import * as path from 'path';

import { resolveBrowserOutputPath } from './output-path.js';

describe('resolveBrowserOutputPath', () => {
it('defaults to dist/<project>/browser', () => {
expect(resolveBrowserOutputPath(undefined, 'mfe1')).toBe(path.join('dist/mfe1/browser'));
});

// Existing string configs must not move their output (#188).
it('appends browser to a string outputPath', () => {
expect(resolveBrowserOutputPath('dist/apps/mfe1', 'mfe1')).toBe(
path.join('dist/apps/mfe1/browser')
);
});

it('defaults browser to "browser" in the object form, as Angular does', () => {
expect(resolveBrowserOutputPath({ base: 'dist/apps/mfe1' }, 'mfe1')).toBe(
path.join('dist/apps/mfe1/browser')
);
});

// `browser: ''` must not be treated as missing: it writes straight into base, like
// the build builder does for Angular's `outputPath: { base, browser: '' }` (#188).
it('writes directly into base when browser is empty', () => {
expect(resolveBrowserOutputPath({ base: 'dist/apps/mfe1', browser: '' }, 'mfe1')).toBe(
path.join('dist/apps/mfe1')
);
});
});
12 changes: 12 additions & 0 deletions src/builders/remote/output-path.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import * as path from 'path';

import type { NfRemoteBuilderSchema } from './schema.js';

export function resolveBrowserOutputPath(
outputPath: NfRemoteBuilderSchema['outputPath'],
project: string
): string {
const { base, browser = 'browser' } =
typeof outputPath === 'object' ? outputPath : { base: outputPath ?? `dist/${project}` };
return path.join(base, browser);
}
2 changes: 1 addition & 1 deletion src/builders/remote/schema.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export interface NfRemoteBuilderSchema extends JsonObject {
rebuildDelay: number;
watch: boolean;
watchLinkedDeps?: boolean;
outputPath?: string;
outputPath?: string | { base: string; browser?: string };
projectName?: string;
verbose?: boolean;
entryPoints?: string[];
Expand Down
14 changes: 13 additions & 1 deletion src/builders/remote/schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,19 @@
"type": "string"
},
"outputPath": {
"type": "string"
"description": "Output folder, relative to the workspace root. A string writes to '<outputPath>/browser'. The object form follows Angular's: files go to '<base>/<browser>', and 'browser' defaults to 'browser'; set 'browser' to '' to write directly into 'base'. The output folder is emptied when the builder starts.",
"oneOf": [
{ "type": "string" },
{
"type": "object",
"properties": {
"base": { "type": "string" },
"browser": { "type": "string", "pattern": "^[-\\w\\.]*$" }
},
"required": ["base"],
"additionalProperties": false
}
]
},
"verbose": {
"type": "boolean",
Expand Down
Loading