import * as ts from 'typescript'; import { applyChangesToString, stripIndents } from '@nrwl/devkit'; import { addRemoteRoute, addRemoteDefinition, addRemoteToConfig, } from './ast-utils'; describe('addRemoteToConfig', () => { it('should add to existing remotes array', async () => { const sourceCode = stripIndents` module.exports = { name: 'shell', remotes: [ 'app1', ['app2','//example.com'] ] }; `; const source = ts.createSourceFile( '/module-federation.config.js', sourceCode, ts.ScriptTarget.Latest, true ); const result = applyChangesToString( sourceCode, addRemoteToConfig(source, 'new-app') ); expect(result).toEqual(stripIndents` module.exports = { name: 'shell', remotes: [ 'app1', ['app2','//example.com'], 'new-app', ] }; `); }); it('should create remotes array if none exist', async () => { const sourceCode = stripIndents` module.exports = { name: 'shell', }; `; const source = ts.createSourceFile( '/module-federation.config.js', sourceCode, ts.ScriptTarget.Latest, true ); const result = applyChangesToString( sourceCode, addRemoteToConfig(source, 'new-app') ); expect(result).toEqual(stripIndents` module.exports = { name: 'shell', remotes: ['new-app'] }; `); }); it.each` sourceCode ${"console.log('???');"} ${'module.exports = { remotes: {} }'} ${"module.exports = '???';"} `('should skip updates if format not as expected', async ({ sourceCode }) => { const source = ts.createSourceFile( '/module-federation.config.js', sourceCode, ts.ScriptTarget.Latest, true ); const result = applyChangesToString( sourceCode, addRemoteToConfig(source, 'new-app') ); expect(result).toEqual(sourceCode); }); }); describe('addRemoteDefinition', () => { it('should add to existing remotes array', async () => { const sourceCode = stripIndents` declare module 'app1/Module'; `; const source = ts.createSourceFile( '/remotes.d.ts', sourceCode, ts.ScriptTarget.Latest, true ); const result = applyChangesToString( sourceCode, addRemoteDefinition(source, 'app2') ); expect(result).toEqual(stripIndents` declare module 'app1/Module'; declare module 'app2/Module'; `); }); }); describe('addRemoteRoute', () => { it('should add remote route to host app', async () => { const sourceCode = stripIndents` import * as React from 'react'; import { Link, Route, Routes } from 'react-router-dom'; const App1 = React.lazy(() => import('app1/Module')); export function App() { return ( } /> ); } export default App; `; const source = ts.createSourceFile( '/apps.tsx', sourceCode, ts.ScriptTarget.Latest, true ); const result = applyChangesToString( sourceCode, addRemoteRoute(source, { fileName: 'app2', className: 'App2' }) ); expect(result).toEqual( stripIndents` import * as React from 'react'; import { Link, Route, Routes } from 'react-router-dom'; const App2 = React.lazy(() => import('app2/Module')); const App1 = React.lazy(() => import('app1/Module')); export function App() { return ( } /> } /> ); } export default App; ` ); }); });