@nx/angular 19.7.2 → 19.8.0-beta.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/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": "19.7.2",
3
+ "version": "19.8.0-beta.0",
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,6 +22,7 @@
22
22
  "./executors.json": "./executors.json",
23
23
  "./generators": "./generators.js",
24
24
  "./executors": "./executors.js",
25
+ "./plugin": "./plugin.js",
25
26
  "./tailwind": "./tailwind.js",
26
27
  "./module-federation": "./module-federation/index.js",
27
28
  "./src/utils": "./src/utils/index.js",
@@ -69,7 +70,7 @@
69
70
  },
70
71
  "dependencies": {
71
72
  "@phenomnomnominal/tsquery": "~5.0.1",
72
- "@typescript-eslint/type-utils": "^7.16.0",
73
+ "@typescript-eslint/type-utils": "^8.0.0",
73
74
  "chalk": "^4.1.0",
74
75
  "find-cache-dir": "^3.3.2",
75
76
  "magic-string": "~0.30.2",
@@ -79,14 +80,14 @@
79
80
  "webpack-merge": "^5.8.0",
80
81
  "webpack": "^5.88.0",
81
82
  "@module-federation/enhanced": "~0.6.0",
82
- "@nx/devkit": "19.7.2",
83
- "@nx/js": "19.7.2",
84
- "@nx/eslint": "19.7.2",
85
- "@nx/webpack": "19.7.2",
86
- "@nx/web": "19.7.2",
87
- "@nx/workspace": "19.7.2",
83
+ "@nx/devkit": "19.8.0-beta.0",
84
+ "@nx/js": "19.8.0-beta.0",
85
+ "@nx/eslint": "19.8.0-beta.0",
86
+ "@nx/webpack": "19.8.0-beta.0",
87
+ "@nx/web": "19.8.0-beta.0",
88
+ "@nx/workspace": "19.8.0-beta.0",
88
89
  "piscina": "^4.4.0",
89
- "@nrwl/angular": "19.7.2"
90
+ "@nrwl/angular": "19.8.0-beta.0"
90
91
  },
91
92
  "peerDependencies": {
92
93
  "@angular-devkit/build-angular": ">= 16.0.0 < 19.0.0",
package/plugin.d.ts ADDED
@@ -0,0 +1 @@
1
+ export { createNodesV2 } from './src/plugins/plugin';
package/plugin.js ADDED
@@ -0,0 +1,5 @@
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; } });
@@ -8,6 +8,7 @@ const global_eslint_config_1 = require("@nx/eslint/src/generators/init/global-es
8
8
  const eslint_file_1 = require("@nx/eslint/src/generators/utils/eslint-file");
9
9
  const add_angular_eslint_dependencies_1 = require("./lib/add-angular-eslint-dependencies");
10
10
  const buildable_project_1 = require("./lib/buildable-project");
11
+ const flat_config_1 = require("@nx/eslint/src/utils/flat-config");
11
12
  async function addLintingGenerator(tree, options) {
12
13
  const tasks = [];
13
14
  const rootProject = options.projectRoot === '.' || options.projectRoot === '';
@@ -32,21 +33,11 @@ async function addLintingGenerator(tree, options) {
32
33
  const hasParserOptions = tree
33
34
  .read((0, devkit_1.joinPathFragments)(options.projectRoot, eslintFile), 'utf8')
34
35
  .includes(`${options.projectRoot}/tsconfig.*?.json`);
35
- (0, eslint_file_1.replaceOverridesInLintConfig)(tree, options.projectRoot, [
36
- ...(rootProject ? [global_eslint_config_1.typeScriptOverride, global_eslint_config_1.javaScriptOverride] : []),
37
- {
36
+ if ((0, flat_config_1.useFlatConfig)(tree)) {
37
+ (0, eslint_file_1.addPredefinedConfigToFlatLintConfig)(tree, options.projectRoot, 'flat/angular');
38
+ (0, eslint_file_1.addPredefinedConfigToFlatLintConfig)(tree, options.projectRoot, 'flat/angular-template');
39
+ (0, eslint_file_1.addOverrideToLintConfig)(tree, options.projectRoot, {
38
40
  files: ['*.ts'],
39
- ...(hasParserOptions
40
- ? {
41
- parserOptions: {
42
- project: [`${options.projectRoot}/tsconfig.*?.json`],
43
- },
44
- }
45
- : {}),
46
- extends: [
47
- 'plugin:@nx/angular',
48
- 'plugin:@angular-eslint/template/process-inline-templates',
49
- ],
50
41
  rules: {
51
42
  '@angular-eslint/directive-selector': [
52
43
  'error',
@@ -65,28 +56,92 @@ async function addLintingGenerator(tree, options) {
65
56
  },
66
57
  ],
67
58
  },
68
- },
69
- {
59
+ });
60
+ (0, eslint_file_1.addOverrideToLintConfig)(tree, options.projectRoot, {
70
61
  files: ['*.html'],
71
- extends: ['plugin:@nx/angular-template'],
72
- /**
73
- * Having an empty rules object present makes it more obvious to the user where they would
74
- * extend things from if they needed to
75
- */
76
62
  rules: {},
77
- },
78
- ...((0, buildable_project_1.isBuildableLibraryProject)(tree, options.projectName)
79
- ? [
80
- {
81
- files: ['*.json'],
82
- parser: 'jsonc-eslint-parser',
83
- rules: {
84
- '@nx/dependency-checks': 'error',
85
- },
63
+ });
64
+ if ((0, buildable_project_1.isBuildableLibraryProject)(tree, options.projectName)) {
65
+ (0, eslint_file_1.addOverrideToLintConfig)(tree, '', {
66
+ files: ['*.json'],
67
+ parser: 'jsonc-eslint-parser',
68
+ rules: {
69
+ '@nx/dependency-checks': [
70
+ 'error',
71
+ {
72
+ // With flat configs, we don't want to include imports in the eslint js/cjs/mjs files to be checked
73
+ ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs}'],
74
+ },
75
+ ],
76
+ },
77
+ });
78
+ }
79
+ }
80
+ else {
81
+ (0, eslint_file_1.replaceOverridesInLintConfig)(tree, options.projectRoot, [
82
+ ...(rootProject ? [global_eslint_config_1.typeScriptOverride, global_eslint_config_1.javaScriptOverride] : []),
83
+ {
84
+ files: ['*.ts'],
85
+ ...(hasParserOptions
86
+ ? {
87
+ parserOptions: {
88
+ project: [`${options.projectRoot}/tsconfig.*?.json`],
89
+ },
90
+ }
91
+ : {}),
92
+ extends: [
93
+ 'plugin:@nx/angular',
94
+ 'plugin:@angular-eslint/template/process-inline-templates',
95
+ ],
96
+ rules: {
97
+ '@angular-eslint/directive-selector': [
98
+ 'error',
99
+ {
100
+ type: 'attribute',
101
+ prefix: (0, string_utils_1.camelize)(options.prefix),
102
+ style: 'camelCase',
103
+ },
104
+ ],
105
+ '@angular-eslint/component-selector': [
106
+ 'error',
107
+ {
108
+ type: 'element',
109
+ prefix: (0, string_utils_1.dasherize)(options.prefix),
110
+ style: 'kebab-case',
111
+ },
112
+ ],
86
113
  },
87
- ]
88
- : []),
89
- ]);
114
+ },
115
+ {
116
+ files: ['*.html'],
117
+ extends: ['plugin:@nx/angular-template'],
118
+ /**
119
+ * Having an empty rules object present makes it more obvious to the user where they would
120
+ * extend things from if they needed to
121
+ */
122
+ rules: {},
123
+ },
124
+ ...((0, buildable_project_1.isBuildableLibraryProject)(tree, options.projectName)
125
+ ? [
126
+ {
127
+ files: ['*.json'],
128
+ parser: 'jsonc-eslint-parser',
129
+ rules: {
130
+ '@nx/dependency-checks': [
131
+ 'error',
132
+ {
133
+ // With flat configs, we don't want to include imports in the eslint js/cjs/mjs files to be checked
134
+ ignoredFiles: [
135
+ '{projectRoot}/eslint.config.{js,cjs,mjs}',
136
+ ],
137
+ },
138
+ ],
139
+ },
140
+ },
141
+ ]
142
+ : []),
143
+ ]);
144
+ }
90
145
  }
91
146
  if (!options.skipPackageJson) {
92
147
  const installTask = (0, add_angular_eslint_dependencies_1.addAngularEsLintDependencies)(tree, options.projectName);
@@ -4,14 +4,19 @@ exports.addAngularEsLintDependencies = addAngularEsLintDependencies;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const version_utils_1 = require("../../utils/version-utils");
6
6
  const buildable_project_1 = require("./buildable-project");
7
+ const flat_config_1 = require("@nx/eslint/src/utils/flat-config");
7
8
  function addAngularEsLintDependencies(tree, projectName) {
8
9
  const compatVersions = (0, version_utils_1.versions)(tree);
9
10
  const angularEslintVersionToInstall = compatVersions.angularEslintVersion;
10
- const devDependencies = {
11
- '@angular-eslint/eslint-plugin': angularEslintVersionToInstall,
12
- '@angular-eslint/eslint-plugin-template': angularEslintVersionToInstall,
13
- '@angular-eslint/template-parser': angularEslintVersionToInstall,
14
- };
11
+ const devDependencies = (0, flat_config_1.useFlatConfig)(tree)
12
+ ? {
13
+ 'angular-eslint': angularEslintVersionToInstall,
14
+ }
15
+ : {
16
+ '@angular-eslint/eslint-plugin': angularEslintVersionToInstall,
17
+ '@angular-eslint/eslint-plugin-template': angularEslintVersionToInstall,
18
+ '@angular-eslint/template-parser': angularEslintVersionToInstall,
19
+ };
15
20
  if ('typescriptEslintVersion' in compatVersions) {
16
21
  devDependencies['@typescript-eslint/utils'] =
17
22
  compatVersions.typescriptEslintVersion;
@@ -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,10 +2,22 @@
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");
5
6
  const version_utils_1 = require("../utils/version-utils");
7
+ const plugin_1 = require("../../plugins/plugin");
6
8
  async function angularInitGenerator(tree, options) {
7
9
  ignoreAngularCacheDirectory(tree);
8
10
  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
+ }
9
21
  if (!options.skipFormat) {
10
22
  await (0, devkit_1.formatFiles)(tree);
11
23
  }
@@ -3,4 +3,7 @@ export interface Schema {
3
3
  skipInstall?: boolean;
4
4
  skipPackageJson?: boolean;
5
5
  keepExistingVersions?: boolean;
6
+ /* internal */
7
+ addPlugin?: boolean;
8
+ updatePackageScripts?: boolean;
6
9
  }
@@ -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
  }
@@ -0,0 +1,19 @@
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 {};
@@ -0,0 +1,418 @@
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 [angularTargetName, angularTarget] of Object.entries(projectTargets)) {
82
+ const nxTargetName = options?.targetNamePrefix
83
+ ? `${options.targetNamePrefix}${angularTargetName}`
84
+ : angularTargetName;
85
+ const externalDependencies = ['@angular/cli'];
86
+ targets[nxTargetName] = {
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
+ angularTargetName === 'build' ||
91
+ angularTargetName === 'deploy' ||
92
+ angularTargetName === 'extract-i18n' ||
93
+ angularTargetName === 'e2e' ||
94
+ angularTargetName === 'lint' ||
95
+ angularTargetName === 'serve' ||
96
+ angularTargetName === 'test'
97
+ ? `ng ${angularTargetName}`
98
+ : `ng run ${projectName}:${angularTargetName}`,
99
+ options: { cwd: angularWorkspaceRoot },
100
+ metadata: {
101
+ technologies: ['angular'],
102
+ description: `Run the "${angularTargetName}" target for "${projectName}".`,
103
+ help: {
104
+ command: `${pmc.exec} ng run ${projectName}:${angularTargetName} --help`,
105
+ example: {},
106
+ },
107
+ },
108
+ };
109
+ if (knownExecutors.appShell.has(angularTarget.builder)) {
110
+ appShellTargets.push({ target: nxTargetName, project: projectName });
111
+ }
112
+ else if (knownExecutors.build.has(angularTarget.builder)) {
113
+ await updateBuildTarget(nxTargetName, targets[nxTargetName], angularTarget, context, angularWorkspaceRoot, project.root, namedInputs);
114
+ }
115
+ else if (knownExecutors.devServer.has(angularTarget.builder)) {
116
+ targets[nxTargetName].metadata.help.example.options = { port: 4201 };
117
+ }
118
+ else if (knownExecutors.extractI18n.has(angularTarget.builder)) {
119
+ targets[nxTargetName].metadata.help.example.options = {
120
+ format: 'json',
121
+ };
122
+ }
123
+ else if (knownExecutors.test.has(angularTarget.builder)) {
124
+ updateTestTarget(targets[nxTargetName], angularTarget, context, angularWorkspaceRoot, project.root, namedInputs, externalDependencies);
125
+ }
126
+ else if (knownExecutors.server.has(angularTarget.builder)) {
127
+ updateServerTarget(targets[nxTargetName], angularTarget, context, angularWorkspaceRoot, project.root, namedInputs);
128
+ }
129
+ else if (knownExecutors.serveSsr.has(angularTarget.builder)) {
130
+ targets[nxTargetName].metadata.help.example.options = { port: 4201 };
131
+ }
132
+ else if (knownExecutors.prerender.has(angularTarget.builder)) {
133
+ prerenderTargets.push({ target: nxTargetName, project: projectName });
134
+ }
135
+ if (targets[nxTargetName].inputs?.length) {
136
+ targets[nxTargetName].inputs.push({ externalDependencies });
137
+ }
138
+ if (angularTarget.configurations) {
139
+ for (const configurationName of Object.keys(angularTarget.configurations)) {
140
+ targets[nxTargetName].configurations = {
141
+ ...targets[nxTargetName].configurations,
142
+ [configurationName]: {
143
+ command: `ng run ${projectName}:${angularTargetName}:${configurationName}`,
144
+ },
145
+ };
146
+ }
147
+ }
148
+ if (angularTarget.defaultConfiguration) {
149
+ targets[nxTargetName].defaultConfiguration =
150
+ angularTarget.defaultConfiguration;
151
+ }
152
+ }
153
+ projects[projectName] = {
154
+ projectType: project.projectType,
155
+ root: posix.join(angularWorkspaceRoot, project.root),
156
+ sourceRoot: project.sourceRoot
157
+ ? posix.join(angularWorkspaceRoot, project.sourceRoot)
158
+ : undefined,
159
+ targets,
160
+ };
161
+ }
162
+ for (const { project, target } of appShellTargets) {
163
+ updateAppShellTarget(project, target, projects, angularJson, angularWorkspaceRoot, context);
164
+ }
165
+ for (const { project, target } of prerenderTargets) {
166
+ updatePrerenderTarget(project, target, projects, angularJson);
167
+ }
168
+ return Object.entries(projects).reduce((acc, [projectName, project]) => {
169
+ acc[project.root] = {
170
+ projectType: project.projectType,
171
+ sourceRoot: project.sourceRoot,
172
+ targets: project.targets,
173
+ };
174
+ return acc;
175
+ }, {});
176
+ }
177
+ function updateAppShellTarget(projectName, targetName, projects, angularJson, angularWorkspaceRoot, context) {
178
+ // it must exist since we collected it when processing it
179
+ const target = projects[projectName].targets[targetName];
180
+ target.metadata.help.example.options = { route: '/some/route' };
181
+ const { inputs, outputs } = getBrowserAndServerTargetInputsAndOutputs(projectName, targetName, projects, angularJson);
182
+ const outputIndexPath = getAngularJsonProjectTargets(angularJson.projects[projectName])[targetName].options?.outputIndexPath;
183
+ if (outputIndexPath) {
184
+ const fullOutputIndexPath = (0, node_path_1.join)(context.workspaceRoot, angularWorkspaceRoot, outputIndexPath);
185
+ outputs.push(getOutput(fullOutputIndexPath, context.workspaceRoot, angularWorkspaceRoot, angularJson.projects[projectName].root));
186
+ }
187
+ if (!outputs.length) {
188
+ // no outputs were identified for the build or server target, so we don't
189
+ // set any Nx cache options
190
+ return;
191
+ }
192
+ target.cache = true;
193
+ target.inputs = inputs;
194
+ target.outputs = outputs;
195
+ }
196
+ async function updateBuildTarget(targetName, target, angularTarget, context, angularWorkspaceRoot, projectRoot, namedInputs) {
197
+ target.dependsOn = [`^${targetName}`];
198
+ if (angularTarget.options?.outputPath) {
199
+ const fullOutputPath = (0, node_path_1.join)(context.workspaceRoot, angularWorkspaceRoot, angularTarget.options.outputPath);
200
+ target.outputs = [
201
+ getOutput(fullOutputPath, context.workspaceRoot, angularWorkspaceRoot, projectRoot),
202
+ ];
203
+ }
204
+ else if (angularTarget.builder === '@angular-devkit/build-angular:ng-packagr') {
205
+ const outputs = await getNgPackagrOutputs(angularTarget, angularWorkspaceRoot, projectRoot, context);
206
+ if (outputs.length) {
207
+ target.outputs = outputs;
208
+ }
209
+ }
210
+ if (target.outputs?.length) {
211
+ // make it cacheable if we were able to identify outputs
212
+ target.cache = true;
213
+ target.inputs =
214
+ 'production' in namedInputs
215
+ ? ['production', '^production']
216
+ : ['default', '^default'];
217
+ }
218
+ if (angularTarget.builder === '@angular-devkit/build-angular:ng-packagr') {
219
+ target.metadata.help.example.options = { watch: true };
220
+ }
221
+ else {
222
+ target.metadata.help.example.options = { localize: true };
223
+ }
224
+ }
225
+ function updateTestTarget(target, angularTarget, context, angularWorkspaceRoot, projectRoot, namedInputs, externalDependencies) {
226
+ target.cache = true;
227
+ target.inputs =
228
+ 'production' in namedInputs
229
+ ? ['default', '^production']
230
+ : ['default', '^default'];
231
+ target.outputs = getKarmaTargetOutputs(angularTarget, angularWorkspaceRoot, projectRoot, context);
232
+ externalDependencies.push('karma');
233
+ target.metadata.help.example.options = { codeCoverage: true };
234
+ }
235
+ function updateServerTarget(target, angularTarget, context, angularWorkspaceRoot, projectRoot, namedInputs) {
236
+ target.metadata.help.example.options = { localize: true };
237
+ if (!angularTarget.options?.outputPath) {
238
+ // only make it cacheable if we were able to identify outputs
239
+ return;
240
+ }
241
+ target.cache = true;
242
+ target.inputs =
243
+ 'production' in namedInputs
244
+ ? ['production', '^production']
245
+ : ['default', '^default'];
246
+ const fullOutputPath = (0, node_path_1.join)(context.workspaceRoot, angularWorkspaceRoot, angularTarget.options.outputPath);
247
+ target.outputs = [
248
+ getOutput(fullOutputPath, context.workspaceRoot, angularWorkspaceRoot, projectRoot),
249
+ ];
250
+ }
251
+ function updatePrerenderTarget(projectName, targetName, projects, angularJson) {
252
+ // it must exist since we collected it when processing it
253
+ const target = projects[projectName].targets[targetName];
254
+ target.metadata.help.example.options =
255
+ getAngularJsonProjectTargets(angularJson.projects[projectName])[targetName]
256
+ .builder === '@angular-devkit/build-angular:prerender'
257
+ ? { discoverRoutes: false }
258
+ : { guessRoutes: false };
259
+ const { inputs, outputs } = getBrowserAndServerTargetInputsAndOutputs(projectName, targetName, projects, angularJson);
260
+ if (!outputs.length) {
261
+ // no outputs were identified for the build or server target, so we don't
262
+ // set any Nx cache options
263
+ return;
264
+ }
265
+ target.cache = true;
266
+ target.inputs = inputs;
267
+ target.outputs = outputs;
268
+ }
269
+ async function getNgPackagrOutputs(target, angularWorkspaceRoot, projectRoot, context) {
270
+ let ngPackageJsonPath = (0, node_path_1.join)(context.workspaceRoot, angularWorkspaceRoot, target.options.project);
271
+ const readConfig = async (configPath) => {
272
+ if (!(0, node_fs_1.existsSync)(configPath)) {
273
+ return undefined;
274
+ }
275
+ try {
276
+ if (configPath.endsWith('.js')) {
277
+ const result = await import(configPath);
278
+ return result['default'] ?? result;
279
+ }
280
+ return (0, devkit_1.readJsonFile)(configPath);
281
+ }
282
+ catch { }
283
+ return undefined;
284
+ };
285
+ let ngPackageJson;
286
+ let basePath;
287
+ if ((0, node_fs_1.statSync)(ngPackageJsonPath).isDirectory()) {
288
+ basePath = ngPackageJsonPath;
289
+ ngPackageJson = await readConfig((0, node_path_1.join)(ngPackageJsonPath, 'ng-package.json'));
290
+ if (!ngPackageJson) {
291
+ ngPackageJson = await readConfig((0, node_path_1.join)(ngPackageJsonPath, 'ng-package.js'));
292
+ }
293
+ }
294
+ else {
295
+ basePath = (0, node_path_1.dirname)(ngPackageJsonPath);
296
+ ngPackageJson = await readConfig(ngPackageJsonPath);
297
+ }
298
+ if (!ngPackageJson) {
299
+ return [];
300
+ }
301
+ const destination = ngPackageJson.dest
302
+ ? (0, node_path_1.join)(basePath, ngPackageJson.dest)
303
+ : (0, node_path_1.join)(basePath, 'dist');
304
+ return [
305
+ getOutput(destination, context.workspaceRoot, angularWorkspaceRoot, projectRoot),
306
+ ];
307
+ }
308
+ function getKarmaTargetOutputs(target, angularWorkspaceRoot, projectRoot, context) {
309
+ const defaultOutput = posix.join('{workspaceRoot}', angularWorkspaceRoot, 'coverage/{projectName}');
310
+ if (!target.options?.karmaConfig) {
311
+ return [defaultOutput];
312
+ }
313
+ try {
314
+ const { parseConfig } = require('karma/lib/config');
315
+ const karmaConfigPath = (0, node_path_1.join)(context.workspaceRoot, angularWorkspaceRoot, projectRoot, target.options.karmaConfig);
316
+ const config = parseConfig(karmaConfigPath);
317
+ if (config.coverageReporter.dir) {
318
+ return [
319
+ getOutput(config.coverageReporter.dir, context.workspaceRoot, angularWorkspaceRoot, projectRoot),
320
+ ];
321
+ }
322
+ }
323
+ catch {
324
+ // we silently ignore any error here and fall back to the default output
325
+ }
326
+ return [defaultOutput];
327
+ }
328
+ function getBrowserAndServerTargetInputsAndOutputs(projectName, targetName, projects, angularJson) {
329
+ const { browserTarget, serverTarget } = extractBrowserAndServerTargets(angularJson, projectName, targetName);
330
+ if (!browserTarget || !serverTarget) {
331
+ // if any of these are missing, the target is invalid so we return empty values
332
+ return { inputs: [], outputs: [] };
333
+ }
334
+ const browserTargetInputs = projects[browserTarget.project]?.targets?.[browserTarget.target]?.inputs ??
335
+ [];
336
+ const serverTargetInputs = projects[serverTarget.project]?.targets?.[serverTarget.target]?.inputs ??
337
+ [];
338
+ const browserTargetOutputs = projects[browserTarget.project]?.targets?.[browserTarget.target]?.outputs ??
339
+ [];
340
+ const serverTargetOutputs = projects[serverTarget.project]?.targets?.[serverTarget.target]?.outputs ??
341
+ [];
342
+ return {
343
+ inputs: mergeInputs(...browserTargetInputs, ...serverTargetInputs),
344
+ outputs: Array.from(new Set([...browserTargetOutputs, ...serverTargetOutputs])),
345
+ };
346
+ }
347
+ function extractBrowserAndServerTargets(angularJson, projectName, targetName) {
348
+ let browserTarget;
349
+ let serverTarget;
350
+ try {
351
+ const targets = getAngularJsonProjectTargets(angularJson.projects[projectName]);
352
+ const target = targets[targetName];
353
+ let browserTargetSpecifier = target.options?.browserTarget;
354
+ if (!browserTargetSpecifier) {
355
+ const configuration = Object.values(target.configurations ?? {}).find((config) => !!config.browserTarget);
356
+ browserTargetSpecifier = configuration?.browserTarget;
357
+ }
358
+ if (browserTargetSpecifier) {
359
+ browserTarget = targetFromTargetString(browserTargetSpecifier, projectName, targetName);
360
+ }
361
+ let serverTargetSpecifier = target.options?.serverTarget;
362
+ if (!serverTargetSpecifier) {
363
+ serverTargetSpecifier = Object.values(target.configurations ?? {}).find((config) => !!config.serverTarget)?.serverTarget;
364
+ }
365
+ if (serverTargetSpecifier) {
366
+ serverTarget = targetFromTargetString(serverTargetSpecifier, projectName, targetName);
367
+ }
368
+ }
369
+ catch { }
370
+ return { browserTarget: browserTarget, serverTarget };
371
+ }
372
+ function mergeInputs(...inputs) {
373
+ const stringInputs = new Set();
374
+ const externalDependencies = new Set();
375
+ for (const input of inputs) {
376
+ if (typeof input === 'string') {
377
+ stringInputs.add(input);
378
+ }
379
+ else if ('externalDependencies' in input) {
380
+ // we only infer external dependencies, so we don't need to handle the other input definitions
381
+ for (const externalDependency of input.externalDependencies) {
382
+ externalDependencies.add(externalDependency);
383
+ }
384
+ }
385
+ }
386
+ return [
387
+ ...stringInputs,
388
+ ...(externalDependencies.size
389
+ ? [{ externalDependencies: Array.from(externalDependencies) }]
390
+ : []),
391
+ ];
392
+ }
393
+ // angular support abbreviated target specifiers, this is adapter from:
394
+ // https://github.com/angular/angular-cli/blob/7d9ce246a33c60ec96eb4bf99520f5475716a910/packages/angular_devkit/architect/src/api.ts#L336
395
+ function targetFromTargetString(specifier, abbreviatedProjectName, abbreviatedTargetName) {
396
+ const tuple = specifier.split(':', 3);
397
+ if (tuple.length < 2) {
398
+ // invalid target, ignore
399
+ return undefined;
400
+ }
401
+ // we only care about project and target
402
+ return {
403
+ project: tuple[0] || abbreviatedProjectName || '',
404
+ target: tuple[1] || abbreviatedTargetName || '',
405
+ };
406
+ }
407
+ function getOutput(path, workspaceRoot, angularWorkspaceRoot, projectRoot) {
408
+ const relativePath = (0, node_path_1.relative)((0, node_path_1.join)(workspaceRoot, angularWorkspaceRoot, projectRoot), path);
409
+ if (relativePath.startsWith('..')) {
410
+ return posix.join('{workspaceRoot}', (0, node_path_1.join)(angularWorkspaceRoot, projectRoot, relativePath));
411
+ }
412
+ else {
413
+ return posix.join('{projectRoot}', relativePath);
414
+ }
415
+ }
416
+ function getAngularJsonProjectTargets(project) {
417
+ return project.architect ?? project.targets;
418
+ }
@@ -14,7 +14,7 @@ export declare const typesExpressVersion = "4.17.14";
14
14
  export declare const browserSyncVersion = "^3.0.0";
15
15
  export declare const moduleFederationNodeVersion = "~2.5.0";
16
16
  export declare const moduleFederationEnhancedVersion = "~0.6.0";
17
- export declare const angularEslintVersion = "^18.0.1";
17
+ export declare const angularEslintVersion = "^18.3.0";
18
18
  export declare const typescriptEslintVersion = "^7.16.0";
19
19
  export declare const tailwindVersion = "^3.0.2";
20
20
  export declare const postcssVersion = "^8.4.5";
@@ -17,7 +17,7 @@ exports.typesExpressVersion = '4.17.14';
17
17
  exports.browserSyncVersion = '^3.0.0';
18
18
  exports.moduleFederationNodeVersion = '~2.5.0';
19
19
  exports.moduleFederationEnhancedVersion = '~0.6.0';
20
- exports.angularEslintVersion = '^18.0.1';
20
+ exports.angularEslintVersion = '^18.3.0';
21
21
  exports.typescriptEslintVersion = '^7.16.0';
22
22
  exports.tailwindVersion = '^3.0.2';
23
23
  exports.postcssVersion = '^8.4.5';