@nx/angular 0.0.0-pr-27804-bc6b179 → 0.0.0-pr-27957-a99d5ea

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/esm2022/mf/mf.mjs CHANGED
@@ -2,11 +2,12 @@ let resolveRemoteUrl;
2
2
  export function setRemoteUrlResolver(_resolveRemoteUrl) {
3
3
  resolveRemoteUrl = _resolveRemoteUrl;
4
4
  }
5
- let remoteUrlDefinitions = {};
5
+ let remoteUrlDefinitions;
6
6
  export function setRemoteDefinitions(definitions) {
7
7
  remoteUrlDefinitions = definitions;
8
8
  }
9
9
  export function setRemoteDefinition(remoteName, remoteUrl) {
10
+ remoteUrlDefinitions ??= {};
10
11
  remoteUrlDefinitions[remoteName] = remoteUrl;
11
12
  }
12
13
  let remoteModuleMap = new Map();
@@ -48,4 +49,4 @@ async function loadRemoteContainer(remoteName) {
48
49
  remoteContainerMap.set(remoteName, container);
49
50
  return container;
50
51
  }
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyL21mL21mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUksZ0JBQTBDLENBQUM7QUFDL0MsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxpQkFBMkM7SUFFM0MsZ0JBQWdCLEdBQUcsaUJBQWlCLENBQUM7QUFDdkMsQ0FBQztBQUVELElBQUksb0JBQW9CLEdBQTJCLEVBQUUsQ0FBQztBQUN0RCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsV0FBbUM7SUFDdEUsb0JBQW9CLEdBQUcsV0FBVyxDQUFDO0FBQ3JDLENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsVUFBa0IsRUFBRSxTQUFpQjtJQUN2RSxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDL0MsQ0FBQztBQUVELElBQUksZUFBZSxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0FBQ2pELElBQUksa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7QUFDcEQsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxVQUFrQixFQUFFLFVBQWtCO0lBQzNFLE1BQU0sZUFBZSxHQUFHLEdBQUcsVUFBVSxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQ3RELElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1FBQ3pDLE9BQU8sZUFBZSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUNsRCxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUNwQyxDQUFDLENBQUMsTUFBTSxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUxQyxNQUFNLE9BQU8sR0FBRyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFFekIsZUFBZSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFN0MsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEdBQVc7SUFDN0IsT0FBTyxNQUFNLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVELElBQUksMEJBQTBCLEdBQUcsS0FBSyxDQUFDO0FBQ3ZDLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxVQUFrQjtJQUNuRCxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0hBQWtILENBQ25ILENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDaEMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLE1BQU0sd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLG9CQUFvQjtRQUNwQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxNQUFNLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXZDLElBQUksWUFBWSxHQUFHLFNBQVMsQ0FBQztJQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM5RCxZQUFZLEdBQUcsR0FBRyxTQUFTLEdBQ3pCLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FDakMsaUJBQWlCLENBQUM7SUFDcEIsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2pELE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV2RCxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBSZXNvbHZlUmVtb3RlVXJsRnVuY3Rpb24gPSAoXG4gIHJlbW90ZU5hbWU6IHN0cmluZ1xuKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XG5cbmRlY2xhcmUgY29uc3QgX193ZWJwYWNrX2luaXRfc2hhcmluZ19fOiAoc2NvcGU6ICdkZWZhdWx0JykgPT4gUHJvbWlzZTx2b2lkPjtcbmRlY2xhcmUgY29uc3QgX193ZWJwYWNrX3NoYXJlX3Njb3Blc19fOiB7IGRlZmF1bHQ6IHVua25vd24gfTtcblxubGV0IHJlc29sdmVSZW1vdGVVcmw6IFJlc29sdmVSZW1vdGVVcmxGdW5jdGlvbjtcbmV4cG9ydCBmdW5jdGlvbiBzZXRSZW1vdGVVcmxSZXNvbHZlcihcbiAgX3Jlc29sdmVSZW1vdGVVcmw6IFJlc29sdmVSZW1vdGVVcmxGdW5jdGlvblxuKSB7XG4gIHJlc29sdmVSZW1vdGVVcmwgPSBfcmVzb2x2ZVJlbW90ZVVybDtcbn1cblxubGV0IHJlbW90ZVVybERlZmluaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5leHBvcnQgZnVuY3Rpb24gc2V0UmVtb3RlRGVmaW5pdGlvbnMoZGVmaW5pdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgcmVtb3RlVXJsRGVmaW5pdGlvbnMgPSBkZWZpbml0aW9ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFJlbW90ZURlZmluaXRpb24ocmVtb3RlTmFtZTogc3RyaW5nLCByZW1vdGVVcmw6IHN0cmluZykge1xuICByZW1vdGVVcmxEZWZpbml0aW9uc1tyZW1vdGVOYW1lXSA9IHJlbW90ZVVybDtcbn1cblxubGV0IHJlbW90ZU1vZHVsZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xubGV0IHJlbW90ZUNvbnRhaW5lck1hcCA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRSZW1vdGVNb2R1bGUocmVtb3RlTmFtZTogc3RyaW5nLCBtb2R1bGVOYW1lOiBzdHJpbmcpIHtcbiAgY29uc3QgcmVtb3RlTW9kdWxlS2V5ID0gYCR7cmVtb3RlTmFtZX06JHttb2R1bGVOYW1lfWA7XG4gIGlmIChyZW1vdGVNb2R1bGVNYXAuaGFzKHJlbW90ZU1vZHVsZUtleSkpIHtcbiAgICByZXR1cm4gcmVtb3RlTW9kdWxlTWFwLmdldChyZW1vdGVNb2R1bGVLZXkpO1xuICB9XG5cbiAgY29uc3QgY29udGFpbmVyID0gcmVtb3RlQ29udGFpbmVyTWFwLmhhcyhyZW1vdGVOYW1lKVxuICAgID8gcmVtb3RlQ29udGFpbmVyTWFwLmdldChyZW1vdGVOYW1lKVxuICAgIDogYXdhaXQgbG9hZFJlbW90ZUNvbnRhaW5lcihyZW1vdGVOYW1lKTtcblxuICBjb25zdCBmYWN0b3J5ID0gYXdhaXQgY29udGFpbmVyLmdldChtb2R1bGVOYW1lKTtcbiAgY29uc3QgTW9kdWxlID0gZmFjdG9yeSgpO1xuXG4gIHJlbW90ZU1vZHVsZU1hcC5zZXQocmVtb3RlTW9kdWxlS2V5LCBNb2R1bGUpO1xuXG4gIHJldHVybiBNb2R1bGU7XG59XG5cbmZ1bmN0aW9uIGxvYWRNb2R1bGUodXJsOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGltcG9ydCgvKiB3ZWJwYWNrSWdub3JlOnRydWUgKi8gdXJsKTtcbn1cblxubGV0IGluaXRpYWxTaGFyaW5nU2NvcGVDcmVhdGVkID0gZmFsc2U7XG5hc3luYyBmdW5jdGlvbiBsb2FkUmVtb3RlQ29udGFpbmVyKHJlbW90ZU5hbWU6IHN0cmluZykge1xuICBpZiAoIXJlc29sdmVSZW1vdGVVcmwgJiYgIXJlbW90ZVVybERlZmluaXRpb25zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0NhbGwgc2V0UmVtb3RlRGVmaW5pdGlvbnMgb3Igc2V0UmVtb3RlVXJsUmVzb2x2ZXIgdG8gYWxsb3cgRHluYW1pYyBGZWRlcmF0aW9uIHRvIGZpbmQgdGhlIHJlbW90ZSBhcHBzIGNvcnJlY3RseS4nXG4gICAgKTtcbiAgfVxuXG4gIGlmICghaW5pdGlhbFNoYXJpbmdTY29wZUNyZWF0ZWQpIHtcbiAgICBpbml0aWFsU2hhcmluZ1Njb3BlQ3JlYXRlZCA9IHRydWU7XG4gICAgYXdhaXQgX193ZWJwYWNrX2luaXRfc2hhcmluZ19fKCdkZWZhdWx0Jyk7XG4gIH1cblxuICBjb25zdCByZW1vdGVVcmwgPSByZW1vdGVVcmxEZWZpbml0aW9uc1xuICAgID8gcmVtb3RlVXJsRGVmaW5pdGlvbnNbcmVtb3RlTmFtZV1cbiAgICA6IGF3YWl0IHJlc29sdmVSZW1vdGVVcmwocmVtb3RlTmFtZSk7XG5cbiAgbGV0IGNvbnRhaW5lclVybCA9IHJlbW90ZVVybDtcbiAgaWYgKCFyZW1vdGVVcmwuZW5kc1dpdGgoJy5tanMnKSAmJiAhcmVtb3RlVXJsLmVuZHNXaXRoKCcuanMnKSkge1xuICAgIGNvbnRhaW5lclVybCA9IGAke3JlbW90ZVVybH0ke1xuICAgICAgcmVtb3RlVXJsLmVuZHNXaXRoKCcvJykgPyAnJyA6ICcvJ1xuICAgIH1yZW1vdGVFbnRyeS5tanNgO1xuICB9XG5cbiAgY29uc3QgY29udGFpbmVyID0gYXdhaXQgbG9hZE1vZHVsZShjb250YWluZXJVcmwpO1xuICBhd2FpdCBjb250YWluZXIuaW5pdChfX3dlYnBhY2tfc2hhcmVfc2NvcGVzX18uZGVmYXVsdCk7XG5cbiAgcmVtb3RlQ29udGFpbmVyTWFwLnNldChyZW1vdGVOYW1lLCBjb250YWluZXIpO1xuICByZXR1cm4gY29udGFpbmVyO1xufVxuIl19
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyL21mL21mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUksZ0JBQTBDLENBQUM7QUFFL0MsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxpQkFBMkM7SUFFM0MsZ0JBQWdCLEdBQUcsaUJBQWlCLENBQUM7QUFDdkMsQ0FBQztBQUVELElBQUksb0JBQTRDLENBQUM7QUFFakQsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFdBQW1DO0lBQ3RFLG9CQUFvQixHQUFHLFdBQVcsQ0FBQztBQUNyQyxDQUFDO0FBRUQsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFVBQWtCLEVBQUUsU0FBaUI7SUFDdkUsb0JBQW9CLEtBQUssRUFBRSxDQUFDO0lBQzVCLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsSUFBSSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7QUFDakQsSUFBSSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztBQUVwRCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUFDLFVBQWtCLEVBQUUsVUFBa0I7SUFDM0UsTUFBTSxlQUFlLEdBQUcsR0FBRyxVQUFVLElBQUksVUFBVSxFQUFFLENBQUM7SUFDdEQsSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7UUFDekMsT0FBTyxlQUFlLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ2xELENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxNQUFNLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRTFDLE1BQU0sT0FBTyxHQUFHLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNoRCxNQUFNLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUV6QixlQUFlLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUU3QyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsR0FBVztJQUM3QixPQUFPLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQsSUFBSSwwQkFBMEIsR0FBRyxLQUFLLENBQUM7QUFFdkMsS0FBSyxVQUFVLG1CQUFtQixDQUFDLFVBQWtCO0lBQ25ELElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDL0MsTUFBTSxJQUFJLEtBQUssQ0FDYixrSEFBa0gsQ0FDbkgsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUNoQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7UUFDbEMsTUFBTSx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsb0JBQW9CO1FBQ3BDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUM7UUFDbEMsQ0FBQyxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFdkMsSUFBSSxZQUFZLEdBQUcsU0FBUyxDQUFDO0lBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzlELFlBQVksR0FBRyxHQUFHLFNBQVMsR0FDekIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUNqQyxpQkFBaUIsQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDakQsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXZELGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDOUMsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFJlc29sdmVSZW1vdGVVcmxGdW5jdGlvbiA9IChcbiAgcmVtb3RlTmFtZTogc3RyaW5nXG4pID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcblxuZGVjbGFyZSBjb25zdCBfX3dlYnBhY2tfaW5pdF9zaGFyaW5nX186IChzY29wZTogJ2RlZmF1bHQnKSA9PiBQcm9taXNlPHZvaWQ+O1xuZGVjbGFyZSBjb25zdCBfX3dlYnBhY2tfc2hhcmVfc2NvcGVzX186IHsgZGVmYXVsdDogdW5rbm93biB9O1xuXG5sZXQgcmVzb2x2ZVJlbW90ZVVybDogUmVzb2x2ZVJlbW90ZVVybEZ1bmN0aW9uO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVtb3RlVXJsUmVzb2x2ZXIoXG4gIF9yZXNvbHZlUmVtb3RlVXJsOiBSZXNvbHZlUmVtb3RlVXJsRnVuY3Rpb25cbikge1xuICByZXNvbHZlUmVtb3RlVXJsID0gX3Jlc29sdmVSZW1vdGVVcmw7XG59XG5cbmxldCByZW1vdGVVcmxEZWZpbml0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNldFJlbW90ZURlZmluaXRpb25zKGRlZmluaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gIHJlbW90ZVVybERlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRSZW1vdGVEZWZpbml0aW9uKHJlbW90ZU5hbWU6IHN0cmluZywgcmVtb3RlVXJsOiBzdHJpbmcpIHtcbiAgcmVtb3RlVXJsRGVmaW5pdGlvbnMgPz89IHt9O1xuICByZW1vdGVVcmxEZWZpbml0aW9uc1tyZW1vdGVOYW1lXSA9IHJlbW90ZVVybDtcbn1cblxubGV0IHJlbW90ZU1vZHVsZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xubGV0IHJlbW90ZUNvbnRhaW5lck1hcCA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFJlbW90ZU1vZHVsZShyZW1vdGVOYW1lOiBzdHJpbmcsIG1vZHVsZU5hbWU6IHN0cmluZykge1xuICBjb25zdCByZW1vdGVNb2R1bGVLZXkgPSBgJHtyZW1vdGVOYW1lfToke21vZHVsZU5hbWV9YDtcbiAgaWYgKHJlbW90ZU1vZHVsZU1hcC5oYXMocmVtb3RlTW9kdWxlS2V5KSkge1xuICAgIHJldHVybiByZW1vdGVNb2R1bGVNYXAuZ2V0KHJlbW90ZU1vZHVsZUtleSk7XG4gIH1cblxuICBjb25zdCBjb250YWluZXIgPSByZW1vdGVDb250YWluZXJNYXAuaGFzKHJlbW90ZU5hbWUpXG4gICAgPyByZW1vdGVDb250YWluZXJNYXAuZ2V0KHJlbW90ZU5hbWUpXG4gICAgOiBhd2FpdCBsb2FkUmVtb3RlQ29udGFpbmVyKHJlbW90ZU5hbWUpO1xuXG4gIGNvbnN0IGZhY3RvcnkgPSBhd2FpdCBjb250YWluZXIuZ2V0KG1vZHVsZU5hbWUpO1xuICBjb25zdCBNb2R1bGUgPSBmYWN0b3J5KCk7XG5cbiAgcmVtb3RlTW9kdWxlTWFwLnNldChyZW1vdGVNb2R1bGVLZXksIE1vZHVsZSk7XG5cbiAgcmV0dXJuIE1vZHVsZTtcbn1cblxuZnVuY3Rpb24gbG9hZE1vZHVsZSh1cmw6IHN0cmluZykge1xuICByZXR1cm4gaW1wb3J0KC8qIHdlYnBhY2tJZ25vcmU6dHJ1ZSAqLyB1cmwpO1xufVxuXG5sZXQgaW5pdGlhbFNoYXJpbmdTY29wZUNyZWF0ZWQgPSBmYWxzZTtcblxuYXN5bmMgZnVuY3Rpb24gbG9hZFJlbW90ZUNvbnRhaW5lcihyZW1vdGVOYW1lOiBzdHJpbmcpIHtcbiAgaWYgKCFyZXNvbHZlUmVtb3RlVXJsICYmICFyZW1vdGVVcmxEZWZpbml0aW9ucykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdDYWxsIHNldFJlbW90ZURlZmluaXRpb25zIG9yIHNldFJlbW90ZVVybFJlc29sdmVyIHRvIGFsbG93IER5bmFtaWMgRmVkZXJhdGlvbiB0byBmaW5kIHRoZSByZW1vdGUgYXBwcyBjb3JyZWN0bHkuJ1xuICAgICk7XG4gIH1cblxuICBpZiAoIWluaXRpYWxTaGFyaW5nU2NvcGVDcmVhdGVkKSB7XG4gICAgaW5pdGlhbFNoYXJpbmdTY29wZUNyZWF0ZWQgPSB0cnVlO1xuICAgIGF3YWl0IF9fd2VicGFja19pbml0X3NoYXJpbmdfXygnZGVmYXVsdCcpO1xuICB9XG5cbiAgY29uc3QgcmVtb3RlVXJsID0gcmVtb3RlVXJsRGVmaW5pdGlvbnNcbiAgICA/IHJlbW90ZVVybERlZmluaXRpb25zW3JlbW90ZU5hbWVdXG4gICAgOiBhd2FpdCByZXNvbHZlUmVtb3RlVXJsKHJlbW90ZU5hbWUpO1xuXG4gIGxldCBjb250YWluZXJVcmwgPSByZW1vdGVVcmw7XG4gIGlmICghcmVtb3RlVXJsLmVuZHNXaXRoKCcubWpzJykgJiYgIXJlbW90ZVVybC5lbmRzV2l0aCgnLmpzJykpIHtcbiAgICBjb250YWluZXJVcmwgPSBgJHtyZW1vdGVVcmx9JHtcbiAgICAgIHJlbW90ZVVybC5lbmRzV2l0aCgnLycpID8gJycgOiAnLydcbiAgICB9cmVtb3RlRW50cnkubWpzYDtcbiAgfVxuXG4gIGNvbnN0IGNvbnRhaW5lciA9IGF3YWl0IGxvYWRNb2R1bGUoY29udGFpbmVyVXJsKTtcbiAgYXdhaXQgY29udGFpbmVyLmluaXQoX193ZWJwYWNrX3NoYXJlX3Njb3Blc19fLmRlZmF1bHQpO1xuXG4gIHJlbW90ZUNvbnRhaW5lck1hcC5zZXQocmVtb3RlTmFtZSwgY29udGFpbmVyKTtcbiAgcmV0dXJuIGNvbnRhaW5lcjtcbn1cbiJdfQ==
@@ -2,11 +2,12 @@ let resolveRemoteUrl;
2
2
  function setRemoteUrlResolver(_resolveRemoteUrl) {
3
3
  resolveRemoteUrl = _resolveRemoteUrl;
4
4
  }
5
- let remoteUrlDefinitions = {};
5
+ let remoteUrlDefinitions;
6
6
  function setRemoteDefinitions(definitions) {
7
7
  remoteUrlDefinitions = definitions;
8
8
  }
9
9
  function setRemoteDefinition(remoteName, remoteUrl) {
10
+ remoteUrlDefinitions ??= {};
10
11
  remoteUrlDefinitions[remoteName] = remoteUrl;
11
12
  }
12
13
  let remoteModuleMap = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"nx-angular-mf.mjs","sources":["../../../../packages/angular/mf/mf.ts","../../../../packages/angular/mf/nx-angular-mf.ts"],"sourcesContent":["export type ResolveRemoteUrlFunction = (\n remoteName: string\n) => string | Promise<string>;\n\ndeclare const __webpack_init_sharing__: (scope: 'default') => Promise<void>;\ndeclare const __webpack_share_scopes__: { default: unknown };\n\nlet resolveRemoteUrl: ResolveRemoteUrlFunction;\nexport function setRemoteUrlResolver(\n _resolveRemoteUrl: ResolveRemoteUrlFunction\n) {\n resolveRemoteUrl = _resolveRemoteUrl;\n}\n\nlet remoteUrlDefinitions: Record<string, string> = {};\nexport function setRemoteDefinitions(definitions: Record<string, string>) {\n remoteUrlDefinitions = definitions;\n}\n\nexport function setRemoteDefinition(remoteName: string, remoteUrl: string) {\n remoteUrlDefinitions[remoteName] = remoteUrl;\n}\n\nlet remoteModuleMap = new Map<string, unknown>();\nlet remoteContainerMap = new Map<string, unknown>();\nexport async function loadRemoteModule(remoteName: string, moduleName: string) {\n const remoteModuleKey = `${remoteName}:${moduleName}`;\n if (remoteModuleMap.has(remoteModuleKey)) {\n return remoteModuleMap.get(remoteModuleKey);\n }\n\n const container = remoteContainerMap.has(remoteName)\n ? remoteContainerMap.get(remoteName)\n : await loadRemoteContainer(remoteName);\n\n const factory = await container.get(moduleName);\n const Module = factory();\n\n remoteModuleMap.set(remoteModuleKey, Module);\n\n return Module;\n}\n\nfunction loadModule(url: string) {\n return import(/* webpackIgnore:true */ url);\n}\n\nlet initialSharingScopeCreated = false;\nasync function loadRemoteContainer(remoteName: string) {\n if (!resolveRemoteUrl && !remoteUrlDefinitions) {\n throw new Error(\n 'Call setRemoteDefinitions or setRemoteUrlResolver to allow Dynamic Federation to find the remote apps correctly.'\n );\n }\n\n if (!initialSharingScopeCreated) {\n initialSharingScopeCreated = true;\n await __webpack_init_sharing__('default');\n }\n\n const remoteUrl = remoteUrlDefinitions\n ? remoteUrlDefinitions[remoteName]\n : await resolveRemoteUrl(remoteName);\n\n let containerUrl = remoteUrl;\n if (!remoteUrl.endsWith('.mjs') && !remoteUrl.endsWith('.js')) {\n containerUrl = `${remoteUrl}${\n remoteUrl.endsWith('/') ? '' : '/'\n }remoteEntry.mjs`;\n }\n\n const container = await loadModule(containerUrl);\n await container.init(__webpack_share_scopes__.default);\n\n remoteContainerMap.set(remoteName, container);\n return container;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAOA,IAAI,gBAA0C,CAAC;AACzC,SAAU,oBAAoB,CAClC,iBAA2C,EAAA;IAE3C,gBAAgB,GAAG,iBAAiB,CAAC;AACvC,CAAC;AAED,IAAI,oBAAoB,GAA2B,EAAE,CAAC;AAChD,SAAU,oBAAoB,CAAC,WAAmC,EAAA;IACtE,oBAAoB,GAAG,WAAW,CAAC;AACrC,CAAC;AAEe,SAAA,mBAAmB,CAAC,UAAkB,EAAE,SAAiB,EAAA;AACvE,IAAA,oBAAoB,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;AAC/C,CAAC;AAED,IAAI,eAAe,GAAG,IAAI,GAAG,EAAmB,CAAC;AACjD,IAAI,kBAAkB,GAAG,IAAI,GAAG,EAAmB,CAAC;AAC7C,eAAe,gBAAgB,CAAC,UAAkB,EAAE,UAAkB,EAAA;AAC3E,IAAA,MAAM,eAAe,GAAG,CAAA,EAAG,UAAU,CAAI,CAAA,EAAA,UAAU,EAAE,CAAC;AACtD,IAAA,IAAI,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE;AACxC,QAAA,OAAO,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;KAC7C;AAED,IAAA,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC;AAClD,UAAE,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC;AACpC,UAAE,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAE1C,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAChD,IAAA,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;AAEzB,IAAA,eAAe,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAE7C,IAAA,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAA;AAC7B,IAAA,OAAO,gCAAgC,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED,IAAI,0BAA0B,GAAG,KAAK,CAAC;AACvC,eAAe,mBAAmB,CAAC,UAAkB,EAAA;AACnD,IAAA,IAAI,CAAC,gBAAgB,IAAI,CAAC,oBAAoB,EAAE;AAC9C,QAAA,MAAM,IAAI,KAAK,CACb,kHAAkH,CACnH,CAAC;KACH;IAED,IAAI,CAAC,0BAA0B,EAAE;QAC/B,0BAA0B,GAAG,IAAI,CAAC;AAClC,QAAA,MAAM,wBAAwB,CAAC,SAAS,CAAC,CAAC;KAC3C;IAED,MAAM,SAAS,GAAG,oBAAoB;AACpC,UAAE,oBAAoB,CAAC,UAAU,CAAC;AAClC,UAAE,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAEvC,IAAI,YAAY,GAAG,SAAS,CAAC;AAC7B,IAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC7D,QAAA,YAAY,GAAG,CAAG,EAAA,SAAS,GACzB,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GACjC,iBAAiB,CAAC;KACnB;AAED,IAAA,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,SAAS,CAAC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAEvD,IAAA,kBAAkB,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAC9C,IAAA,OAAO,SAAS,CAAC;AACnB;;AC5EA;;AAEG;;;;"}
1
+ {"version":3,"file":"nx-angular-mf.mjs","sources":["../../../../packages/angular/mf/mf.ts","../../../../packages/angular/mf/nx-angular-mf.ts"],"sourcesContent":["export type ResolveRemoteUrlFunction = (\n remoteName: string\n) => string | Promise<string>;\n\ndeclare const __webpack_init_sharing__: (scope: 'default') => Promise<void>;\ndeclare const __webpack_share_scopes__: { default: unknown };\n\nlet resolveRemoteUrl: ResolveRemoteUrlFunction;\n\nexport function setRemoteUrlResolver(\n _resolveRemoteUrl: ResolveRemoteUrlFunction\n) {\n resolveRemoteUrl = _resolveRemoteUrl;\n}\n\nlet remoteUrlDefinitions: Record<string, string>;\n\nexport function setRemoteDefinitions(definitions: Record<string, string>) {\n remoteUrlDefinitions = definitions;\n}\n\nexport function setRemoteDefinition(remoteName: string, remoteUrl: string) {\n remoteUrlDefinitions ??= {};\n remoteUrlDefinitions[remoteName] = remoteUrl;\n}\n\nlet remoteModuleMap = new Map<string, unknown>();\nlet remoteContainerMap = new Map<string, unknown>();\n\nexport async function loadRemoteModule(remoteName: string, moduleName: string) {\n const remoteModuleKey = `${remoteName}:${moduleName}`;\n if (remoteModuleMap.has(remoteModuleKey)) {\n return remoteModuleMap.get(remoteModuleKey);\n }\n\n const container = remoteContainerMap.has(remoteName)\n ? remoteContainerMap.get(remoteName)\n : await loadRemoteContainer(remoteName);\n\n const factory = await container.get(moduleName);\n const Module = factory();\n\n remoteModuleMap.set(remoteModuleKey, Module);\n\n return Module;\n}\n\nfunction loadModule(url: string) {\n return import(/* webpackIgnore:true */ url);\n}\n\nlet initialSharingScopeCreated = false;\n\nasync function loadRemoteContainer(remoteName: string) {\n if (!resolveRemoteUrl && !remoteUrlDefinitions) {\n throw new Error(\n 'Call setRemoteDefinitions or setRemoteUrlResolver to allow Dynamic Federation to find the remote apps correctly.'\n );\n }\n\n if (!initialSharingScopeCreated) {\n initialSharingScopeCreated = true;\n await __webpack_init_sharing__('default');\n }\n\n const remoteUrl = remoteUrlDefinitions\n ? remoteUrlDefinitions[remoteName]\n : await resolveRemoteUrl(remoteName);\n\n let containerUrl = remoteUrl;\n if (!remoteUrl.endsWith('.mjs') && !remoteUrl.endsWith('.js')) {\n containerUrl = `${remoteUrl}${\n remoteUrl.endsWith('/') ? '' : '/'\n }remoteEntry.mjs`;\n }\n\n const container = await loadModule(containerUrl);\n await container.init(__webpack_share_scopes__.default);\n\n remoteContainerMap.set(remoteName, container);\n return container;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAOA,IAAI,gBAA0C,CAAC;AAEzC,SAAU,oBAAoB,CAClC,iBAA2C,EAAA;IAE3C,gBAAgB,GAAG,iBAAiB,CAAC;AACvC,CAAC;AAED,IAAI,oBAA4C,CAAC;AAE3C,SAAU,oBAAoB,CAAC,WAAmC,EAAA;IACtE,oBAAoB,GAAG,WAAW,CAAC;AACrC,CAAC;AAEe,SAAA,mBAAmB,CAAC,UAAkB,EAAE,SAAiB,EAAA;IACvE,oBAAoB,KAAK,EAAE,CAAC;AAC5B,IAAA,oBAAoB,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;AAC/C,CAAC;AAED,IAAI,eAAe,GAAG,IAAI,GAAG,EAAmB,CAAC;AACjD,IAAI,kBAAkB,GAAG,IAAI,GAAG,EAAmB,CAAC;AAE7C,eAAe,gBAAgB,CAAC,UAAkB,EAAE,UAAkB,EAAA;AAC3E,IAAA,MAAM,eAAe,GAAG,CAAA,EAAG,UAAU,CAAI,CAAA,EAAA,UAAU,EAAE,CAAC;AACtD,IAAA,IAAI,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE;AACxC,QAAA,OAAO,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;KAC7C;AAED,IAAA,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC;AAClD,UAAE,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC;AACpC,UAAE,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAE1C,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAChD,IAAA,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;AAEzB,IAAA,eAAe,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAE7C,IAAA,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAA;AAC7B,IAAA,OAAO,gCAAgC,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED,IAAI,0BAA0B,GAAG,KAAK,CAAC;AAEvC,eAAe,mBAAmB,CAAC,UAAkB,EAAA;AACnD,IAAA,IAAI,CAAC,gBAAgB,IAAI,CAAC,oBAAoB,EAAE;AAC9C,QAAA,MAAM,IAAI,KAAK,CACb,kHAAkH,CACnH,CAAC;KACH;IAED,IAAI,CAAC,0BAA0B,EAAE;QAC/B,0BAA0B,GAAG,IAAI,CAAC;AAClC,QAAA,MAAM,wBAAwB,CAAC,SAAS,CAAC,CAAC;KAC3C;IAED,MAAM,SAAS,GAAG,oBAAoB;AACpC,UAAE,oBAAoB,CAAC,UAAU,CAAC;AAClC,UAAE,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAEvC,IAAI,YAAY,GAAG,SAAS,CAAC;AAC7B,IAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC7D,QAAA,YAAY,GAAG,CAAG,EAAA,SAAS,GACzB,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GACjC,iBAAiB,CAAC;KACnB;AAED,IAAA,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,SAAS,CAAC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAEvD,IAAA,kBAAkB,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAC9C,IAAA,OAAO,SAAS,CAAC;AACnB;;ACjFA;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/angular",
3
- "version": "0.0.0-pr-27804-bc6b179",
3
+ "version": "0.0.0-pr-27957-a99d5ea",
4
4
  "private": false,
5
5
  "description": "The Nx Plugin for Angular contains executors, generators, and utilities for managing Angular applications and libraries within an Nx workspace. It provides: \n\n- Integration with libraries such as Storybook, Jest, ESLint, Tailwind CSS, Playwright and Cypress. \n\n- Generators to help scaffold code quickly (like: Micro Frontends, Libraries, both internal to your codebase and publishable to npm) \n\n- Single Component Application Modules (SCAMs) \n\n- NgRx helpers. \n\n- Utilities for automatic workspace refactoring.",
6
6
  "repository": {
@@ -22,7 +22,6 @@
22
22
  "./executors.json": "./executors.json",
23
23
  "./generators": "./generators.js",
24
24
  "./executors": "./executors.js",
25
- "./plugin": "./plugin.js",
26
25
  "./tailwind": "./tailwind.js",
27
26
  "./module-federation": "./module-federation/index.js",
28
27
  "./src/utils": "./src/utils/index.js",
@@ -80,14 +79,14 @@
80
79
  "webpack-merge": "^5.8.0",
81
80
  "webpack": "^5.88.0",
82
81
  "@module-federation/enhanced": "~0.6.0",
83
- "@nx/devkit": "0.0.0-pr-27804-bc6b179",
84
- "@nx/js": "0.0.0-pr-27804-bc6b179",
85
- "@nx/eslint": "0.0.0-pr-27804-bc6b179",
86
- "@nx/webpack": "0.0.0-pr-27804-bc6b179",
87
- "@nx/web": "0.0.0-pr-27804-bc6b179",
88
- "@nx/workspace": "0.0.0-pr-27804-bc6b179",
82
+ "@nx/devkit": "0.0.0-pr-27957-a99d5ea",
83
+ "@nx/js": "0.0.0-pr-27957-a99d5ea",
84
+ "@nx/eslint": "0.0.0-pr-27957-a99d5ea",
85
+ "@nx/webpack": "0.0.0-pr-27957-a99d5ea",
86
+ "@nx/web": "0.0.0-pr-27957-a99d5ea",
87
+ "@nx/workspace": "0.0.0-pr-27957-a99d5ea",
89
88
  "piscina": "^4.4.0",
90
- "@nrwl/angular": "0.0.0-pr-27804-bc6b179"
89
+ "@nrwl/angular": "0.0.0-pr-27957-a99d5ea"
91
90
  },
92
91
  "peerDependencies": {
93
92
  "@angular-devkit/build-angular": ">= 16.0.0 < 19.0.0",
@@ -43,7 +43,8 @@ async function applicationGeneratorInternal(tree, schema) {
43
43
  }
44
44
  await (0, lib_1.addLinting)(tree, options);
45
45
  await (0, lib_1.addUnitTestRunner)(tree, options);
46
- await (0, lib_1.addE2e)(tree, options);
46
+ const e2ePort = await (0, lib_1.addE2e)(tree, options);
47
+ (0, lib_1.addServeStaticTarget)(tree, options, options.e2eTestRunner !== 'none' ? e2ePort : options.port);
47
48
  (0, lib_1.updateEditorTsConfig)(tree, options);
48
49
  (0, lib_1.setGeneratorDefaults)(tree, options);
49
50
  if (options.rootProject) {
@@ -1,3 +1,3 @@
1
1
  import { Tree } from '@nx/devkit';
2
2
  import type { NormalizedSchema } from './normalized-schema';
3
- export declare function addE2e(tree: Tree, options: NormalizedSchema): Promise<void>;
3
+ export declare function addE2e(tree: Tree, options: NormalizedSchema): Promise<number>;
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.addE2e = addE2e;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const versions_1 = require("../../../utils/versions");
6
- const version_utils_1 = require("../../utils/version-utils");
7
6
  const target_defaults_utils_1 = require("@nx/devkit/src/generators/target-defaults-utils");
8
7
  async function addE2e(tree, options) {
9
8
  // since e2e are separate projects, default to adding plugins
@@ -11,8 +10,6 @@ async function addE2e(tree, options) {
11
10
  const addPlugin = process.env.NX_ADD_PLUGINS !== 'false' &&
12
11
  nxJson.useInferencePlugins !== false;
13
12
  const e2eWebServerInfo = getAngularE2EWebServerInfo(tree, options.name, options.port);
14
- // TODO: This can call `@nx/web:static-config` generator when ready
15
- addFileServerTarget(tree, options, 'serve-static', e2eWebServerInfo.e2ePort);
16
13
  if (options.e2eTestRunner === 'cypress') {
17
14
  const { configurationGenerator } = (0, devkit_1.ensurePackage)('@nx/cypress', versions_1.nxVersion);
18
15
  (0, devkit_1.addProjectConfiguration)(tree, options.e2eProjectName, {
@@ -70,26 +67,7 @@ async function addE2e(tree, options) {
70
67
  await (0, target_defaults_utils_1.addE2eCiTargetDefaults)(tree, '@nx/playwright/plugin', '^build', (0, devkit_1.joinPathFragments)(options.e2eProjectRoot, 'playwright.config.ts'));
71
68
  }
72
69
  }
73
- }
74
- function addFileServerTarget(tree, options, targetName, e2ePort) {
75
- if (!options.skipPackageJson) {
76
- (0, devkit_1.addDependenciesToPackageJson)(tree, {}, { '@nx/web': versions_1.nxVersion });
77
- }
78
- const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
79
- const isUsingApplicationBuilder = angularMajorVersion >= 17 && options.bundler === 'esbuild';
80
- const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, options.name);
81
- projectConfig.targets[targetName] = {
82
- executor: '@nx/web:file-server',
83
- options: {
84
- buildTarget: `${options.name}:build`,
85
- port: e2ePort,
86
- staticFilePath: isUsingApplicationBuilder
87
- ? (0, devkit_1.joinPathFragments)(options.outputPath, 'browser')
88
- : undefined,
89
- spa: true,
90
- },
91
- };
92
- (0, devkit_1.updateProjectConfiguration)(tree, options.name, projectConfig);
70
+ return e2eWebServerInfo.e2ePort;
93
71
  }
94
72
  function getAngularE2EWebServerInfo(tree, projectName, portOverride) {
95
73
  const nxJson = (0, devkit_1.readNxJson)(tree);
@@ -0,0 +1,3 @@
1
+ import { Tree } from '@nx/devkit';
2
+ import type { NormalizedSchema } from './normalized-schema';
3
+ export declare function addServeStaticTarget(tree: Tree, options: NormalizedSchema, port: number): void;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addServeStaticTarget = addServeStaticTarget;
4
+ const devkit_1 = require("@nx/devkit");
5
+ const versions_1 = require("../../../utils/versions");
6
+ const version_utils_1 = require("../../utils/version-utils");
7
+ function addServeStaticTarget(tree, options, port) {
8
+ addFileServerTarget(tree, options, 'serve-static', port);
9
+ }
10
+ function addFileServerTarget(tree, options, targetName, e2ePort) {
11
+ if (!options.skipPackageJson) {
12
+ (0, devkit_1.addDependenciesToPackageJson)(tree, {}, { '@nx/web': versions_1.nxVersion });
13
+ }
14
+ const { major: angularMajorVersion } = (0, version_utils_1.getInstalledAngularVersionInfo)(tree);
15
+ const isUsingApplicationBuilder = angularMajorVersion >= 17 && options.bundler === 'esbuild';
16
+ const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, options.name);
17
+ projectConfig.targets[targetName] = {
18
+ executor: '@nx/web:file-server',
19
+ options: {
20
+ buildTarget: `${options.name}:build`,
21
+ port: e2ePort,
22
+ staticFilePath: isUsingApplicationBuilder
23
+ ? (0, devkit_1.joinPathFragments)(options.outputPath, 'browser')
24
+ : undefined,
25
+ spa: true,
26
+ },
27
+ };
28
+ (0, devkit_1.updateProjectConfiguration)(tree, options.name, projectConfig);
29
+ }
@@ -10,3 +10,4 @@ export * from './normalized-schema';
10
10
  export * from './set-app-strict-default';
11
11
  export * from './set-generator-defaults';
12
12
  export * from './update-editor-tsconfig';
13
+ export * from './add-serve-static-target';
@@ -13,3 +13,4 @@ tslib_1.__exportStar(require("./normalized-schema"), exports);
13
13
  tslib_1.__exportStar(require("./set-app-strict-default"), exports);
14
14
  tslib_1.__exportStar(require("./set-generator-defaults"), exports);
15
15
  tslib_1.__exportStar(require("./update-editor-tsconfig"), exports);
16
+ tslib_1.__exportStar(require("./add-serve-static-target"), exports);
@@ -2,22 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.angularInitGenerator = angularInitGenerator;
4
4
  const devkit_1 = require("@nx/devkit");
5
- const add_plugin_1 = require("@nx/devkit/src/utils/add-plugin");
6
5
  const version_utils_1 = require("../utils/version-utils");
7
- const plugin_1 = require("../../plugins/plugin");
8
6
  async function angularInitGenerator(tree, options) {
9
7
  ignoreAngularCacheDirectory(tree);
10
8
  const installTask = installAngularDevkitCoreIfMissing(tree, options);
11
- // For Angular inference plugin, we only want it during import since our
12
- // generators do not use `angular.json`, and `nx init` should split
13
- // `angular.json` into multiple `project.json` files -- as this is preferred
14
- // by most folks we've talked to.
15
- options.addPlugin ??= process.env.NX_RUNNING_NX_IMPORT === 'true';
16
- if (options.addPlugin) {
17
- await (0, add_plugin_1.addPlugin)(tree, await (0, devkit_1.createProjectGraphAsync)(), '@nx/angular/plugin', plugin_1.createNodesV2, {
18
- targetNamePrefix: ['', 'angular:', 'angular-'],
19
- }, options.updatePackageScripts);
20
- }
21
9
  if (!options.skipFormat) {
22
10
  await (0, devkit_1.formatFiles)(tree);
23
11
  }
@@ -3,7 +3,4 @@ export interface Schema {
3
3
  skipInstall?: boolean;
4
4
  skipPackageJson?: boolean;
5
5
  keepExistingVersions?: boolean;
6
- /* internal */
7
- addPlugin?: boolean;
8
- updatePackageScripts?: boolean;
9
6
  }
@@ -6,12 +6,14 @@ function addMfEnvToTargetDefaultInputs(tree) {
6
6
  const nxJson = (0, devkit_1.readNxJson)(tree);
7
7
  const webpackExecutor = '@nx/angular:webpack-browser';
8
8
  const mfEnvVar = 'NX_MF_DEV_REMOTES';
9
+ const inputs = [
10
+ ...(nxJson.namedInputs && 'production' in nxJson.namedInputs
11
+ ? ['production', '^production']
12
+ : ['default', '^default']),
13
+ ];
9
14
  nxJson.targetDefaults ??= {};
10
15
  nxJson.targetDefaults[webpackExecutor] ??= {};
11
- nxJson.targetDefaults[webpackExecutor].inputs ??= [
12
- 'production',
13
- '^production',
14
- ];
16
+ nxJson.targetDefaults[webpackExecutor].inputs ??= inputs;
15
17
  nxJson.targetDefaults[webpackExecutor].dependsOn ??= ['^build'];
16
18
  let mfEnvVarExists = false;
17
19
  for (const input of nxJson.targetDefaults[webpackExecutor].inputs) {
@@ -20,12 +20,18 @@ async function default_1(tree) {
20
20
  }
21
21
  const nxJson = (0, devkit_1.readNxJson)(tree);
22
22
  const nxMFDevRemotesEnvVar = 'NX_MF_DEV_REMOTES';
23
+ const inputs = [
24
+ ...(nxJson.namedInputs && 'production' in nxJson.namedInputs
25
+ ? ['production', '^production']
26
+ : ['default', '^default']),
27
+ { env: nxMFDevRemotesEnvVar },
28
+ ];
23
29
  if (!nxJson.targetDefaults ||
24
30
  !nxJson.targetDefaults?.['@nx/angular:webpack-browser']) {
25
31
  nxJson.targetDefaults ??= {};
26
32
  nxJson.targetDefaults['@nx/angular:webpack-browser'] = {
27
33
  cache: true,
28
- inputs: ['production', '^production', { env: nxMFDevRemotesEnvVar }],
34
+ inputs,
29
35
  dependsOn: ['^build'],
30
36
  };
31
37
  }
package/plugin.d.ts DELETED
@@ -1 +0,0 @@
1
- export { createNodesV2 } from './src/plugins/plugin';
package/plugin.js DELETED
@@ -1,5 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createNodesV2 = void 0;
4
- var plugin_1 = require("./src/plugins/plugin");
5
- Object.defineProperty(exports, "createNodesV2", { enumerable: true, get: function () { return plugin_1.createNodesV2; } });
@@ -1,19 +0,0 @@
1
- import { type CreateNodesV2 } from '@nx/devkit';
2
- export interface AngularPluginOptions {
3
- targetNamePrefix?: string;
4
- }
5
- type AngularTargetConfiguration = {
6
- builder: string;
7
- options?: Record<string, any>;
8
- configurations?: Record<string, any>;
9
- defaultConfiguration?: string;
10
- };
11
- export type AngularProjectConfiguration = {
12
- projectType: 'application' | 'library';
13
- root: string;
14
- sourceRoot?: string;
15
- architect?: Record<string, AngularTargetConfiguration>;
16
- targets?: Record<string, AngularTargetConfiguration>;
17
- };
18
- export declare const createNodesV2: CreateNodesV2<AngularPluginOptions>;
19
- export {};
@@ -1,416 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createNodesV2 = void 0;
4
- const tslib_1 = require("tslib");
5
- const devkit_1 = require("@nx/devkit");
6
- const calculate_hash_for_create_nodes_1 = require("@nx/devkit/src/utils/calculate-hash-for-create-nodes");
7
- const get_named_inputs_1 = require("@nx/devkit/src/utils/get-named-inputs");
8
- const js_1 = require("@nx/js");
9
- const node_fs_1 = require("node:fs");
10
- const node_path_1 = require("node:path");
11
- const posix = tslib_1.__importStar(require("node:path/posix"));
12
- const devkit_internals_1 = require("nx/src/devkit-internals");
13
- const cache_directory_1 = require("nx/src/utils/cache-directory");
14
- const knownExecutors = {
15
- appShell: new Set(['@angular-devkit/build-angular:app-shell']),
16
- build: new Set([
17
- '@angular-devkit/build-angular:application',
18
- '@angular/build:application',
19
- '@angular-devkit/build-angular:browser-esbuild',
20
- '@angular-devkit/build-angular:browser',
21
- '@angular-devkit/build-angular:ng-packagr',
22
- ]),
23
- devServer: new Set(['@angular-devkit/build-angular:dev-server']),
24
- extractI18n: new Set(['@angular-devkit/build-angular:extract-i18n']),
25
- prerender: new Set([
26
- '@angular-devkit/build-angular:prerender',
27
- '@nguniversal/builders:prerender',
28
- ]),
29
- server: new Set(['@angular-devkit/build-angular:server']),
30
- serveSsr: new Set([
31
- '@angular-devkit/build-angular:ssr-dev-server',
32
- '@nguniversal/builders:ssr-dev-server',
33
- ]),
34
- test: new Set(['@angular-devkit/build-angular:karma']),
35
- };
36
- const pmc = (0, devkit_1.getPackageManagerCommand)();
37
- function readProjectsCache(cachePath) {
38
- return (0, node_fs_1.existsSync)(cachePath) ? (0, devkit_1.readJsonFile)(cachePath) : {};
39
- }
40
- function writeProjectsToCache(cachePath, results) {
41
- (0, devkit_1.writeJsonFile)(cachePath, results);
42
- }
43
- exports.createNodesV2 = [
44
- '**/angular.json',
45
- async (configFiles, options, context) => {
46
- const optionsHash = (0, devkit_internals_1.hashObject)(options);
47
- const cachePath = (0, node_path_1.join)(cache_directory_1.workspaceDataDirectory, `angular-${optionsHash}.hash`);
48
- const projectsCache = readProjectsCache(cachePath);
49
- try {
50
- return await (0, devkit_1.createNodesFromFiles)((configFile, options, context) => createNodesInternal(configFile, options, context, projectsCache), configFiles, options, context);
51
- }
52
- finally {
53
- writeProjectsToCache(cachePath, projectsCache);
54
- }
55
- },
56
- ];
57
- async function createNodesInternal(configFilePath, options, context, projectsCache) {
58
- const angularWorkspaceRoot = (0, node_path_1.dirname)(configFilePath);
59
- // Do not create a project if package.json isn't there
60
- const siblingFiles = (0, node_fs_1.readdirSync)((0, node_path_1.join)(context.workspaceRoot, angularWorkspaceRoot));
61
- if (!siblingFiles.includes('package.json')) {
62
- return {};
63
- }
64
- const hash = await (0, calculate_hash_for_create_nodes_1.calculateHashForCreateNodes)(angularWorkspaceRoot, options, context, [(0, js_1.getLockFileName)((0, devkit_1.detectPackageManager)(context.workspaceRoot))]);
65
- projectsCache[hash] ??= await buildAngularProjects(configFilePath, options, angularWorkspaceRoot, context);
66
- return { projects: projectsCache[hash] };
67
- }
68
- async function buildAngularProjects(configFilePath, options, angularWorkspaceRoot, context) {
69
- const projects = {};
70
- const absoluteConfigFilePath = (0, node_path_1.join)(context.workspaceRoot, configFilePath);
71
- const angularJson = (0, devkit_1.readJsonFile)(absoluteConfigFilePath);
72
- const appShellTargets = [];
73
- const prerenderTargets = [];
74
- for (const [projectName, project] of Object.entries(angularJson.projects ?? {})) {
75
- const targets = {};
76
- const projectTargets = getAngularJsonProjectTargets(project);
77
- if (!projectTargets) {
78
- continue;
79
- }
80
- const namedInputs = (0, get_named_inputs_1.getNamedInputs)(project.root, context);
81
- for (const [_targetName, angularTarget] of Object.entries(projectTargets)) {
82
- const targetName = options?.targetNamePrefix
83
- ? `${options.targetNamePrefix}${_targetName}`
84
- : _targetName;
85
- const externalDependencies = ['@angular/cli'];
86
- targets[targetName] = {
87
- command:
88
- // For targets that are also Angular CLI commands, infer the simplified form.
89
- // Otherwise, use `ng run` to support non-command targets so that they will run.
90
- targetName === 'build' ||
91
- targetName === 'deploy' ||
92
- targetName === 'extract-i18n' ||
93
- targetName === 'e2e' ||
94
- targetName === 'lint' ||
95
- targetName === 'serve' ||
96
- targetName === 'test'
97
- ? `ng ${targetName}`
98
- : `ng run ${projectName}:${targetName}`,
99
- options: { cwd: angularWorkspaceRoot },
100
- metadata: {
101
- technologies: ['angular'],
102
- description: `Run the "${targetName}" target for "${projectName}".`,
103
- help: {
104
- command: `${pmc.exec} ng run ${projectName}:${targetName} --help`,
105
- example: {},
106
- },
107
- },
108
- };
109
- if (knownExecutors.appShell.has(angularTarget.builder)) {
110
- appShellTargets.push({ target: targetName, project: projectName });
111
- }
112
- else if (knownExecutors.build.has(angularTarget.builder)) {
113
- await updateBuildTarget(targetName, targets[targetName], angularTarget, context, angularWorkspaceRoot, project.root, namedInputs);
114
- }
115
- else if (knownExecutors.devServer.has(angularTarget.builder)) {
116
- targets[targetName].metadata.help.example.options = { port: 4201 };
117
- }
118
- else if (knownExecutors.extractI18n.has(angularTarget.builder)) {
119
- targets[targetName].metadata.help.example.options = { format: 'json' };
120
- }
121
- else if (knownExecutors.test.has(angularTarget.builder)) {
122
- updateTestTarget(targets[targetName], angularTarget, context, angularWorkspaceRoot, project.root, namedInputs, externalDependencies);
123
- }
124
- else if (knownExecutors.server.has(angularTarget.builder)) {
125
- updateServerTarget(targets[targetName], angularTarget, context, angularWorkspaceRoot, project.root, namedInputs);
126
- }
127
- else if (knownExecutors.serveSsr.has(angularTarget.builder)) {
128
- targets[targetName].metadata.help.example.options = { port: 4201 };
129
- }
130
- else if (knownExecutors.prerender.has(angularTarget.builder)) {
131
- prerenderTargets.push({ target: targetName, project: projectName });
132
- }
133
- if (targets[targetName].inputs?.length) {
134
- targets[targetName].inputs.push({ externalDependencies });
135
- }
136
- if (angularTarget.configurations) {
137
- for (const configurationName of Object.keys(angularTarget.configurations)) {
138
- targets[targetName].configurations = {
139
- ...targets[targetName].configurations,
140
- [configurationName]: {
141
- command: `ng run ${projectName}:${targetName}:${configurationName}`,
142
- },
143
- };
144
- }
145
- }
146
- if (angularTarget.defaultConfiguration) {
147
- targets[targetName].defaultConfiguration =
148
- angularTarget.defaultConfiguration;
149
- }
150
- }
151
- projects[projectName] = {
152
- projectType: project.projectType,
153
- root: posix.join(angularWorkspaceRoot, project.root),
154
- sourceRoot: project.sourceRoot
155
- ? posix.join(angularWorkspaceRoot, project.sourceRoot)
156
- : undefined,
157
- targets,
158
- };
159
- }
160
- for (const { project, target } of appShellTargets) {
161
- updateAppShellTarget(project, target, projects, angularJson, angularWorkspaceRoot, context);
162
- }
163
- for (const { project, target } of prerenderTargets) {
164
- updatePrerenderTarget(project, target, projects, angularJson);
165
- }
166
- return Object.entries(projects).reduce((acc, [projectName, project]) => {
167
- acc[project.root] = {
168
- projectType: project.projectType,
169
- sourceRoot: project.sourceRoot,
170
- targets: project.targets,
171
- };
172
- return acc;
173
- }, {});
174
- }
175
- function updateAppShellTarget(projectName, targetName, projects, angularJson, angularWorkspaceRoot, context) {
176
- // it must exist since we collected it when processing it
177
- const target = projects[projectName].targets[targetName];
178
- target.metadata.help.example.options = { route: '/some/route' };
179
- const { inputs, outputs } = getBrowserAndServerTargetInputsAndOutputs(projectName, targetName, projects, angularJson);
180
- const outputIndexPath = getAngularJsonProjectTargets(angularJson.projects[projectName])[targetName].options?.outputIndexPath;
181
- if (outputIndexPath) {
182
- const fullOutputIndexPath = (0, node_path_1.join)(context.workspaceRoot, angularWorkspaceRoot, outputIndexPath);
183
- outputs.push(getOutput(fullOutputIndexPath, context.workspaceRoot, angularWorkspaceRoot, angularJson.projects[projectName].root));
184
- }
185
- if (!outputs.length) {
186
- // no outputs were identified for the build or server target, so we don't
187
- // set any Nx cache options
188
- return;
189
- }
190
- target.cache = true;
191
- target.inputs = inputs;
192
- target.outputs = outputs;
193
- }
194
- async function updateBuildTarget(targetName, target, angularTarget, context, angularWorkspaceRoot, projectRoot, namedInputs) {
195
- target.dependsOn = [`^${targetName}`];
196
- if (angularTarget.options?.outputPath) {
197
- const fullOutputPath = (0, node_path_1.join)(context.workspaceRoot, angularWorkspaceRoot, angularTarget.options.outputPath);
198
- target.outputs = [
199
- getOutput(fullOutputPath, context.workspaceRoot, angularWorkspaceRoot, projectRoot),
200
- ];
201
- }
202
- else if (angularTarget.builder === '@angular-devkit/build-angular:ng-packagr') {
203
- const outputs = await getNgPackagrOutputs(angularTarget, angularWorkspaceRoot, projectRoot, context);
204
- if (outputs.length) {
205
- target.outputs = outputs;
206
- }
207
- }
208
- if (target.outputs?.length) {
209
- // make it cacheable if we were able to identify outputs
210
- target.cache = true;
211
- target.inputs =
212
- 'production' in namedInputs
213
- ? ['production', '^production']
214
- : ['default', '^default'];
215
- }
216
- if (angularTarget.builder === '@angular-devkit/build-angular:ng-packagr') {
217
- target.metadata.help.example.options = { watch: true };
218
- }
219
- else {
220
- target.metadata.help.example.options = { localize: true };
221
- }
222
- }
223
- function updateTestTarget(target, angularTarget, context, angularWorkspaceRoot, projectRoot, namedInputs, externalDependencies) {
224
- target.cache = true;
225
- target.inputs =
226
- 'production' in namedInputs
227
- ? ['default', '^production']
228
- : ['default', '^default'];
229
- target.outputs = getKarmaTargetOutputs(angularTarget, angularWorkspaceRoot, projectRoot, context);
230
- externalDependencies.push('karma');
231
- target.metadata.help.example.options = { codeCoverage: true };
232
- }
233
- function updateServerTarget(target, angularTarget, context, angularWorkspaceRoot, projectRoot, namedInputs) {
234
- target.metadata.help.example.options = { localize: true };
235
- if (!angularTarget.options?.outputPath) {
236
- // only make it cacheable if we were able to identify outputs
237
- return;
238
- }
239
- target.cache = true;
240
- target.inputs =
241
- 'production' in namedInputs
242
- ? ['production', '^production']
243
- : ['default', '^default'];
244
- const fullOutputPath = (0, node_path_1.join)(context.workspaceRoot, angularWorkspaceRoot, angularTarget.options.outputPath);
245
- target.outputs = [
246
- getOutput(fullOutputPath, context.workspaceRoot, angularWorkspaceRoot, projectRoot),
247
- ];
248
- }
249
- function updatePrerenderTarget(projectName, targetName, projects, angularJson) {
250
- // it must exist since we collected it when processing it
251
- const target = projects[projectName].targets[targetName];
252
- target.metadata.help.example.options =
253
- getAngularJsonProjectTargets(angularJson.projects[projectName])[targetName]
254
- .builder === '@angular-devkit/build-angular:prerender'
255
- ? { discoverRoutes: false }
256
- : { guessRoutes: false };
257
- const { inputs, outputs } = getBrowserAndServerTargetInputsAndOutputs(projectName, targetName, projects, angularJson);
258
- if (!outputs.length) {
259
- // no outputs were identified for the build or server target, so we don't
260
- // set any Nx cache options
261
- return;
262
- }
263
- target.cache = true;
264
- target.inputs = inputs;
265
- target.outputs = outputs;
266
- }
267
- async function getNgPackagrOutputs(target, angularWorkspaceRoot, projectRoot, context) {
268
- let ngPackageJsonPath = (0, node_path_1.join)(context.workspaceRoot, angularWorkspaceRoot, target.options.project);
269
- const readConfig = async (configPath) => {
270
- if (!(0, node_fs_1.existsSync)(configPath)) {
271
- return undefined;
272
- }
273
- try {
274
- if (configPath.endsWith('.js')) {
275
- const result = await import(configPath);
276
- return result['default'] ?? result;
277
- }
278
- return (0, devkit_1.readJsonFile)(configPath);
279
- }
280
- catch { }
281
- return undefined;
282
- };
283
- let ngPackageJson;
284
- let basePath;
285
- if ((0, node_fs_1.statSync)(ngPackageJsonPath).isDirectory()) {
286
- basePath = ngPackageJsonPath;
287
- ngPackageJson = await readConfig((0, node_path_1.join)(ngPackageJsonPath, 'ng-package.json'));
288
- if (!ngPackageJson) {
289
- ngPackageJson = await readConfig((0, node_path_1.join)(ngPackageJsonPath, 'ng-package.js'));
290
- }
291
- }
292
- else {
293
- basePath = (0, node_path_1.dirname)(ngPackageJsonPath);
294
- ngPackageJson = await readConfig(ngPackageJsonPath);
295
- }
296
- if (!ngPackageJson) {
297
- return [];
298
- }
299
- const destination = ngPackageJson.dest
300
- ? (0, node_path_1.join)(basePath, ngPackageJson.dest)
301
- : (0, node_path_1.join)(basePath, 'dist');
302
- return [
303
- getOutput(destination, context.workspaceRoot, angularWorkspaceRoot, projectRoot),
304
- ];
305
- }
306
- function getKarmaTargetOutputs(target, angularWorkspaceRoot, projectRoot, context) {
307
- const defaultOutput = posix.join('{workspaceRoot}', angularWorkspaceRoot, 'coverage/{projectName}');
308
- if (!target.options?.karmaConfig) {
309
- return [defaultOutput];
310
- }
311
- try {
312
- const { parseConfig } = require('karma/lib/config');
313
- const karmaConfigPath = (0, node_path_1.join)(context.workspaceRoot, angularWorkspaceRoot, projectRoot, target.options.karmaConfig);
314
- const config = parseConfig(karmaConfigPath);
315
- if (config.coverageReporter.dir) {
316
- return [
317
- getOutput(config.coverageReporter.dir, context.workspaceRoot, angularWorkspaceRoot, projectRoot),
318
- ];
319
- }
320
- }
321
- catch {
322
- // we silently ignore any error here and fall back to the default output
323
- }
324
- return [defaultOutput];
325
- }
326
- function getBrowserAndServerTargetInputsAndOutputs(projectName, targetName, projects, angularJson) {
327
- const { browserTarget, serverTarget } = extractBrowserAndServerTargets(angularJson, projectName, targetName);
328
- if (!browserTarget || !serverTarget) {
329
- // if any of these are missing, the target is invalid so we return empty values
330
- return { inputs: [], outputs: [] };
331
- }
332
- const browserTargetInputs = projects[browserTarget.project]?.targets?.[browserTarget.target]?.inputs ??
333
- [];
334
- const serverTargetInputs = projects[serverTarget.project]?.targets?.[serverTarget.target]?.inputs ??
335
- [];
336
- const browserTargetOutputs = projects[browserTarget.project]?.targets?.[browserTarget.target]?.outputs ??
337
- [];
338
- const serverTargetOutputs = projects[serverTarget.project]?.targets?.[serverTarget.target]?.outputs ??
339
- [];
340
- return {
341
- inputs: mergeInputs(...browserTargetInputs, ...serverTargetInputs),
342
- outputs: Array.from(new Set([...browserTargetOutputs, ...serverTargetOutputs])),
343
- };
344
- }
345
- function extractBrowserAndServerTargets(angularJson, projectName, targetName) {
346
- let browserTarget;
347
- let serverTarget;
348
- try {
349
- const targets = getAngularJsonProjectTargets(angularJson.projects[projectName]);
350
- const target = targets[targetName];
351
- let browserTargetSpecifier = target.options?.browserTarget;
352
- if (!browserTargetSpecifier) {
353
- const configuration = Object.values(target.configurations ?? {}).find((config) => !!config.browserTarget);
354
- browserTargetSpecifier = configuration?.browserTarget;
355
- }
356
- if (browserTargetSpecifier) {
357
- browserTarget = targetFromTargetString(browserTargetSpecifier, projectName, targetName);
358
- }
359
- let serverTargetSpecifier = target.options?.serverTarget;
360
- if (!serverTargetSpecifier) {
361
- serverTargetSpecifier = Object.values(target.configurations ?? {}).find((config) => !!config.serverTarget)?.serverTarget;
362
- }
363
- if (serverTargetSpecifier) {
364
- serverTarget = targetFromTargetString(serverTargetSpecifier, projectName, targetName);
365
- }
366
- }
367
- catch { }
368
- return { browserTarget: browserTarget, serverTarget };
369
- }
370
- function mergeInputs(...inputs) {
371
- const stringInputs = new Set();
372
- const externalDependencies = new Set();
373
- for (const input of inputs) {
374
- if (typeof input === 'string') {
375
- stringInputs.add(input);
376
- }
377
- else if ('externalDependencies' in input) {
378
- // we only infer external dependencies, so we don't need to handle the other input definitions
379
- for (const externalDependency of input.externalDependencies) {
380
- externalDependencies.add(externalDependency);
381
- }
382
- }
383
- }
384
- return [
385
- ...stringInputs,
386
- ...(externalDependencies.size
387
- ? [{ externalDependencies: Array.from(externalDependencies) }]
388
- : []),
389
- ];
390
- }
391
- // angular support abbreviated target specifiers, this is adapter from:
392
- // https://github.com/angular/angular-cli/blob/7d9ce246a33c60ec96eb4bf99520f5475716a910/packages/angular_devkit/architect/src/api.ts#L336
393
- function targetFromTargetString(specifier, abbreviatedProjectName, abbreviatedTargetName) {
394
- const tuple = specifier.split(':', 3);
395
- if (tuple.length < 2) {
396
- // invalid target, ignore
397
- return undefined;
398
- }
399
- // we only care about project and target
400
- return {
401
- project: tuple[0] || abbreviatedProjectName || '',
402
- target: tuple[1] || abbreviatedTargetName || '',
403
- };
404
- }
405
- function getOutput(path, workspaceRoot, angularWorkspaceRoot, projectRoot) {
406
- const relativePath = (0, node_path_1.relative)((0, node_path_1.join)(workspaceRoot, angularWorkspaceRoot, projectRoot), path);
407
- if (relativePath.startsWith('..')) {
408
- return posix.join('{workspaceRoot}', (0, node_path_1.join)(angularWorkspaceRoot, projectRoot, relativePath));
409
- }
410
- else {
411
- return posix.join('{projectRoot}', relativePath);
412
- }
413
- }
414
- function getAngularJsonProjectTargets(project) {
415
- return project.architect ?? project.targets;
416
- }