@@ -23,7 +23,11 @@ import {
2323 ENTRY_COMPARTMENT ,
2424 generateCanonicalName ,
2525} from './policy-format.js' ;
26- import { dependencyAllowedByPolicy , makePackagePolicy } from './policy.js' ;
26+ import {
27+ dependencyAllowedByPolicy ,
28+ makePackagePolicy ,
29+ findUnknownCanonicalNames ,
30+ } from './policy.js' ;
2731import { unpackReadPowers } from './powers.js' ;
2832import { search , searchDescriptor } from './search.js' ;
2933import { GenericGraph , makeShortestPath } from './generic-graph.js' ;
@@ -1268,16 +1272,16 @@ const finalizeGraph = (
12681272} ;
12691273
12701274/**
1271- * Returns an array of " issue" objects if any resources referenced in `policy`
1272- * are unknown .
1275+ * Returns an array of issue objects for each unknown canonical name referenced
1276+ * in `policy`, using the precomputed `unknownSet` to drive the check .
12731277 *
12741278 * @param {Set<CanonicalName> } canonicalNames Set of all known canonical names
12751279 * @param {SomePolicy } policy Policy to validate
1280+ * @param {Set<CanonicalName> } unknownSet Set of unknown canonical names from {@link findUnknownCanonicalNames}
12761281 * @returns {Array<{canonicalName: CanonicalName, message: string, path:
1277- * string[], suggestion?: CanonicalName}>} Array of issue objects, or `undefined` if no issues were
1278- * found
1282+ * string[], suggestion?: CanonicalName}>} Array of issue objects
12791283 */
1280- const validatePolicyResources = ( canonicalNames , policy ) => {
1284+ const validatePolicyResources = ( canonicalNames , policy , unknownSet ) => {
12811285 /**
12821286 * Finds a suggestion for `badName` if it is a suffix of any
12831287 * canonical name in `canonicalNames`.
@@ -1299,7 +1303,7 @@ const validatePolicyResources = (canonicalNames, policy) => {
12991303 for ( const [ resourceName , resourcePolicy ] of entries (
13001304 policy . resources ?? { } ,
13011305 ) ) {
1302- if ( ! canonicalNames . has ( resourceName ) ) {
1306+ if ( unknownSet . has ( resourceName ) ) {
13031307 const issueMessage = `Resource ${ q ( resourceName ) } was not found` ;
13041308 const suggestion = findSuggestion ( resourceName ) ;
13051309 const issue = {
@@ -1314,7 +1318,7 @@ const validatePolicyResources = (canonicalNames, policy) => {
13141318 }
13151319 if ( typeof resourcePolicy ?. packages === 'object' ) {
13161320 for ( const packageName of keys ( resourcePolicy . packages ) ) {
1317- if ( ! canonicalNames . has ( packageName ) ) {
1321+ if ( unknownSet . has ( packageName ) ) {
13181322 const issueMessage = `Resource ${ q ( packageName ) } from resource ${ q ( resourceName ) } was not found` ;
13191323 const suggestion = findSuggestion ( packageName ) ;
13201324 const issue = {
@@ -1471,8 +1475,19 @@ export const compartmentMapForNodeModules_ = async (
14711475 // of known canonical names and fire the `unknownCanonicalName` hook for each
14721476 // unknown resource, if found
14731477 if ( policy ) {
1474- const canonicalNames = new Set ( canonicalNameMap . keys ( ) ) ;
1475- const issues = validatePolicyResources ( canonicalNames , policy ) ?? [ ] ;
1478+ const knownCanonicalNames = new Set ( canonicalNameMap . keys ( ) ) ;
1479+ const unknownCanonicalNames = findUnknownCanonicalNames (
1480+ knownCanonicalNames ,
1481+ policy ,
1482+ ) ;
1483+ const issues =
1484+ unknownCanonicalNames . size > 0
1485+ ? validatePolicyResources (
1486+ knownCanonicalNames ,
1487+ policy ,
1488+ unknownCanonicalNames ,
1489+ )
1490+ : [ ] ;
14761491 // Call default handler first if policy exists
14771492 for ( const { message, canonicalName, path, suggestion } of issues ) {
14781493 const hookInput = {
0 commit comments