@@ -37,15 +37,21 @@ try {
37
37
const pubTokenPromise = sdkPromise . then ( ( { getDefaultKey, FREE_API_KEY } ) => getDefaultKey ( ) || FREE_API_KEY )
38
38
const apiKeySettingsPromise = sdkPromise . then ( async ( { setupSdk } ) => {
39
39
const sdk = await setupSdk ( )
40
- const result = await sdk . getSettings ( )
40
+ const orgResult = await sdk . getOrganizations ( )
41
+ if ( ! orgResult . success ) throw new Error ( 'failed to fetch organizations info' )
42
+ const orgs = Object . values ( orgResult . data . organizations )
43
+ const result = await sdk . postSettings ( orgs . map ( id => ( { organization : id } ) ) )
41
44
if ( ! result . success ) throw new Error ( 'failed to fetch API key settings' )
42
- return result . data
45
+ return {
46
+ orgs,
47
+ settings : result . data
48
+ }
43
49
} )
44
50
45
51
/** @type {Promise<{ defaultRules: import('../utils/settings.js').IssueRules, orgRules: { id: string, issueRules: import('../utils/settings.js').IssueRules }[] }> } */
46
- const orgSettingsPromise = settingsPromise . then ( async ( { getSetting, updateSetting } ) => {
52
+ const orgSettingsPromise = settingsPromise . then ( async ( { getSetting } ) => {
47
53
const enforcedOrgs = getSetting ( 'enforcedOrgs' )
48
- const settings = await apiKeySettingsPromise
54
+ const { orgs , settings } = await apiKeySettingsPromise
49
55
50
56
/**
51
57
* @param {import('../utils/settings.js').IssueRules[string] } rule
@@ -80,32 +86,50 @@ const orgSettingsPromise = settingsPromise.then(async ({ getSetting, updateSetti
80
86
return merged
81
87
}
82
88
83
- const mergeDefaults = ( rules ) => {
84
- const out = { ...rules }
85
- for ( const rule in settings . defaultIssueRules ) {
86
- const defaultedRule = out [ rule ]
87
- if (
88
- ! ( rule in out ) || (
89
- typeof defaultedRule === 'object' &&
90
- defaultedRule . action === 'defer'
91
- ) ) {
92
- out [ rule ] = settings . defaultIssueRules [ rule ]
93
- }
89
+ const mergeDefaults = ( a , b ) => {
90
+ const merged = { ...a }
91
+ for ( const rule in b ) {
92
+ const defaultedRule = merged [ rule ]
93
+ if (
94
+ ! ( rule in merged ) || (
95
+ typeof defaultedRule === 'object' &&
96
+ defaultedRule . action === 'defer'
97
+ ) ) {
98
+ merged [ rule ] = b [ rule ]
99
+ }
100
+ }
101
+ return merged
102
+ }
103
+
104
+ /** @type {Record<string, import('../utils/settings.js').IssueRules> } */
105
+ const baseOrgRules = { }
106
+ for ( let i = 0 ; i < orgs . length ; ++ i ) {
107
+ const orgID = orgs [ i ] . id
108
+ const entry = settings . entries [ i ]
109
+ /** @type {import('../utils/settings.js').IssueRules } */
110
+ let issueRules = { }
111
+ let target = entry . start
112
+ while ( target !== null ) {
113
+ issueRules = mergeDefaults ( issueRules , entry . settings [ target ] . issueRules )
114
+ target = entry . settings [ target ] . deferTo
94
115
}
95
- return out
116
+ baseOrgRules [ orgID ] = issueRules
96
117
}
97
118
119
+ const defaults = settings . defaults . issueRules
120
+
98
121
const enforcedRules = enforcedOrgs
99
- . map ( org => settings . organizations [ org ] )
122
+ . map ( org => baseOrgRules [ org ] )
123
+ . filter ( rules => rules )
100
124
. reduce ( ( a , b ) => mergeRules ( a , b ) )
101
125
102
126
return {
103
- defaultRules : mergeDefaults ( enforcedRules ) ,
104
- orgRules : Object . values ( settings . organizations ) . map ( ( { id, name, issueRules } ) => {
127
+ defaultRules : mergeDefaults ( enforcedRules , defaults ) ,
128
+ orgRules : orgs . map ( ( { id, name } ) => {
105
129
return {
106
130
id,
107
131
name,
108
- issueRules : mergeDefaults ( mergeRules ( issueRules , enforcedRules ) )
132
+ issueRules : mergeDefaults ( mergeRules ( baseOrgRules [ id ] , enforcedRules ) , defaults )
109
133
}
110
134
} )
111
135
}
@@ -450,13 +474,13 @@ async function packagesHaveRiskyIssues (registry, pkgs, ora = null, input, outpu
450
474
const pkgDatas = [ ]
451
475
try {
452
476
const orgSettings = await orgSettingsPromise
453
- if ( orgSettings . length > 1 ) {
477
+ if ( orgSettings . orgRules . length > 1 ) {
454
478
throw new Error ( 'multi-organization API keys not supported' )
455
479
}
456
480
// TODO: determine org based on cwd
457
- const rules = orgSettings . length
458
- ? orgSettings [ 0 ] . issueRules
459
- : ( await apiKeySettingsPromise ) . defaultIssueRules
481
+ const rules = orgSettings . orgRules . length
482
+ ? orgSettings . orgRules [ 0 ] . issueRules
483
+ : orgSettings . defaultRules
460
484
461
485
for await ( const pkgData of batchScan ( pkgs . map ( pkg => pkg . pkgid ) ) ) {
462
486
let failures = [ ]
0 commit comments