@nx/angular 19.7.3 → 19.8.0-beta.0

Sign up to get free protection for your applications and to get access to all the features.
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.3",
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.3",
83
- "@nx/js": "19.7.3",
84
- "@nx/eslint": "19.7.3",
85
- "@nx/webpack": "19.7.3",
86
- "@nx/web": "19.7.3",
87
- "@nx/workspace": "19.7.3",
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.3"
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';