Skip to content

Commit e03f47d

Browse files
authored
Cresultify socket optimize (#615)
* Cresultify socket optimize * CResult updateLockfile
1 parent 6d3eaaa commit e03f47d

File tree

8 files changed

+155
-53
lines changed

8 files changed

+155
-53
lines changed

src/commands/fix/cmd-fix.mts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,14 @@ const config: CliCommandConfig = {
8282
},
8383
help: (command, config) => `
8484
Usage
85-
$ ${command}
85+
$ ${command} [options] [CWD=.]
8686
8787
Options
8888
${getFlagListOutput(config.flags, 6)}
89+
90+
Examples
91+
$ ${command}
92+
$ ${command} ./proj/tree --autoMerge
8993
`,
9094
}
9195

@@ -109,12 +113,12 @@ async function run(
109113

110114
const { autopilot, json, markdown } = cli.flags
111115
let { autoMerge, rangeStyle, test } = cli.flags
112-
// TODO: impl json/md further
113116
const outputKind = getOutputKind(json, markdown)
114117
let [cwd = '.'] = cli.input
115118
// Note: path.resolve vs .join:
116119
// If given path is absolute then cwd should not affect it.
117120
cwd = path.resolve(process.cwd(), cwd)
121+
118122
if (autopilot) {
119123
autoMerge = true
120124
test = true

src/commands/fix/cmd-fix.test.mts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ describe('socket fix', async () => {
1717
"Update dependencies with "fixable" Socket alerts
1818
1919
Usage
20-
$ socket fix
20+
$ socket fix [options] [CWD=.]
2121
2222
Options
2323
--autoMerge Enable auto-merge for pull requests that Socket opens.
@@ -38,7 +38,11 @@ describe('socket fix', async () => {
3838
* preserve - Retain the existing version range style as-is
3939
* tilde - Use ~ range for patch/minor updates (e.g. ~1.2.3)
4040
--test Verify the fix by running unit tests
41-
--testScript The test script to run for each fix attempt"
41+
--testScript The test script to run for each fix attempt
42+
43+
Examples
44+
$ socket fix
45+
$ socket fix ./proj/tree --autoMerge"
4246
`,
4347
)
4448
expect(`\n ${stderr}`).toMatchInlineSnapshot(`
Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { logger } from '@socketsecurity/registry/lib/logger'
2-
import { pluralize } from '@socketsecurity/registry/lib/words'
32

43
import { addOverrides } from './add-overrides.mts'
54
import { CMD_NAME } from './shared.mts'
@@ -8,21 +7,23 @@ import constants from '../../constants.mts'
87
import { cmdPrefixMessage } from '../../utils/cmd.mts'
98
import { detectAndValidatePackageEnvironment } from '../../utils/package-environment.mts'
109

11-
const { VLT } = constants
10+
import type { CResult } from '../../types.mts'
1211

13-
function createActionMessage(
14-
verb: string,
15-
overrideCount: number,
16-
workspaceCount: number,
17-
): string {
18-
return `${verb} ${overrideCount} Socket.dev optimized ${pluralize('override', overrideCount)}${workspaceCount ? ` in ${workspaceCount} ${pluralize('workspace', workspaceCount)}` : ''}`
19-
}
12+
const { VLT } = constants
2013

2114
export async function applyOptimization(
2215
cwd: string,
2316
pin: boolean,
2417
prod: boolean,
25-
) {
18+
): Promise<
19+
CResult<{
20+
addedCount: number
21+
updatedCount: number
22+
pkgJsonChanged: boolean
23+
updatedInWorkspaces: number
24+
addedInWorkspaces: number
25+
}>
26+
> {
2627
const result = await detectAndValidatePackageEnvironment(cwd, {
2728
cmdName: CMD_NAME,
2829
logger,
@@ -32,21 +33,17 @@ export async function applyOptimization(
3233
if (!result.ok) {
3334
return result
3435
}
35-
3636
const pkgEnvDetails = result.data
37-
if (!pkgEnvDetails) {
38-
// TODO: probably not necessary
39-
return
40-
}
4137

4238
if (pkgEnvDetails.agent === VLT) {
43-
logger.warn(
44-
cmdPrefixMessage(
39+
return {
40+
ok: false,
41+
message: 'Unsupported',
42+
cause: cmdPrefixMessage(
4543
CMD_NAME,
4644
`${VLT} does not support overrides. Soon, though ⚡`,
4745
),
48-
)
49-
return
46+
}
5047
}
5148

5249
// Lazily access constants.spinner.
@@ -66,22 +63,26 @@ export async function applyOptimization(
6663
const pkgJsonChanged = addedCount > 0 || updatedCount > 0
6764

6865
if (pkgJsonChanged || pkgEnvDetails.features.npmBuggyOverrides) {
69-
await updateLockfile(pkgEnvDetails, { cmdName: CMD_NAME, logger, spinner })
66+
const result = await updateLockfile(pkgEnvDetails, {
67+
cmdName: CMD_NAME,
68+
logger,
69+
spinner,
70+
})
71+
if (!result.ok) {
72+
return result
73+
}
7074
}
7175

7276
spinner.stop()
7377

74-
if (updatedCount > 0) {
75-
logger?.log(
76-
`${createActionMessage('Updated', updatedCount, state.updatedInWorkspaces.size)}${addedCount ? '.' : '🚀'}`,
77-
)
78-
}
79-
if (addedCount > 0) {
80-
logger?.log(
81-
`${createActionMessage('Added', addedCount, state.addedInWorkspaces.size)} 🚀`,
82-
)
83-
}
84-
if (!pkgJsonChanged) {
85-
logger?.log('Scan complete. No Socket.dev optimized overrides applied.')
78+
return {
79+
ok: true,
80+
data: {
81+
addedCount,
82+
updatedCount,
83+
pkgJsonChanged,
84+
updatedInWorkspaces: state.updatedInWorkspaces.size,
85+
addedInWorkspaces: state.addedInWorkspaces.size,
86+
},
8687
}
8788
}

src/commands/optimize/cmd-optimize.mts

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
import path from 'node:path'
2+
13
import { logger } from '@socketsecurity/registry/lib/logger'
24

3-
import { applyOptimization } from './apply-optimization.mts'
5+
import { handleOptimize } from './handle-optimize.mts'
46
import constants from '../../constants.mts'
57
import { commonFlags } from '../../flags.mts'
8+
import { getOutputKind } from '../../utils/get-output-kind.mts'
69
import { meowOrExit } from '../../utils/meow-with-subcommands.mts'
710
import { getFlagListOutput } from '../../utils/output-formatting.mts'
811

@@ -29,14 +32,14 @@ const config: CliCommandConfig = {
2932
},
3033
help: (command, config) => `
3134
Usage
32-
$ ${command}
35+
$ ${command} [options] [CWD=.]
3336
3437
Options
3538
${getFlagListOutput(config.flags, 6)}
3639
3740
Examples
3841
$ ${command}
39-
$ ${command} --pin
42+
$ ${command} ./proj/tree --pin
4043
`,
4144
}
4245

@@ -58,18 +61,23 @@ async function run(
5861
parentName,
5962
})
6063

61-
// TODO: impl json/md
62-
63-
const cwd = process.cwd()
64+
const { json, markdown } = cli.flags
65+
const { pin, prod } = cli.flags
66+
const outputKind = getOutputKind(json, markdown)
67+
let [cwd = '.'] = cli.input
68+
// Note: path.resolve vs .join:
69+
// If given path is absolute then cwd should not affect it.
70+
cwd = path.resolve(process.cwd(), cwd)
6471

6572
if (cli.flags['dryRun']) {
6673
logger.log(DRY_RUN_BAILING_NOW)
6774
return
6875
}
6976

70-
await applyOptimization(
77+
await handleOptimize({
7178
cwd,
72-
Boolean(cli.flags['pin']),
73-
Boolean(cli.flags['prod']),
74-
)
79+
pin: Boolean(pin),
80+
outputKind,
81+
prod: Boolean(prod),
82+
})
7583
}

src/commands/optimize/cmd-optimize.test.mts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ describe('socket optimize', async () => {
1919
"Optimize dependencies with @socketregistry overrides
2020
2121
Usage
22-
$ socket optimize
22+
$ socket optimize [options] [CWD=.]
2323
2424
Options
2525
--help Print this help
@@ -28,7 +28,7 @@ describe('socket optimize', async () => {
2828
2929
Examples
3030
$ socket optimize
31-
$ socket optimize --pin"
31+
$ socket optimize ./proj/tree --pin"
3232
`,
3333
)
3434
expect(`\n ${stderr}`).toMatchInlineSnapshot(`
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { applyOptimization } from './apply-optimization.mts'
2+
import { outputOptimizeResult } from './output-optimize-result.mts'
3+
4+
import type { OutputKind } from '../../types.mts'
5+
6+
export async function handleOptimize({
7+
cwd,
8+
outputKind,
9+
pin,
10+
prod,
11+
}: {
12+
cwd: string
13+
outputKind: OutputKind
14+
pin: boolean
15+
prod: boolean
16+
}) {
17+
const result = await applyOptimization(cwd, pin, prod)
18+
19+
await outputOptimizeResult(result, outputKind)
20+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { logger } from '@socketsecurity/registry/lib/logger'
2+
import { pluralize } from '@socketsecurity/registry/lib/words'
3+
4+
import { failMsgWithBadge } from '../../utils/fail-msg-with-badge.mts'
5+
import { serializeResultJson } from '../../utils/serialize-result-json.mts'
6+
7+
import type { CResult, OutputKind } from '../../types.mts'
8+
9+
export async function outputOptimizeResult(
10+
result: CResult<{
11+
addedCount: number
12+
updatedCount: number
13+
pkgJsonChanged: boolean
14+
updatedInWorkspaces: number
15+
addedInWorkspaces: number
16+
}>,
17+
outputKind: OutputKind,
18+
) {
19+
if (!result.ok) {
20+
process.exitCode = result.code ?? 1
21+
}
22+
23+
if (outputKind === 'json') {
24+
logger.log(serializeResultJson(result))
25+
return
26+
}
27+
if (!result.ok) {
28+
logger.fail(failMsgWithBadge(result.message, result.cause))
29+
return
30+
}
31+
32+
const data = result.data
33+
34+
if (data.updatedCount > 0) {
35+
logger?.log(
36+
`${createActionMessage('Updated', data.updatedCount, data.updatedInWorkspaces)}${data.addedCount ? '.' : '🚀'}`,
37+
)
38+
}
39+
if (data.addedCount > 0) {
40+
logger?.log(
41+
`${createActionMessage('Added', data.addedCount, data.addedInWorkspaces)} 🚀`,
42+
)
43+
}
44+
if (!data.pkgJsonChanged) {
45+
logger?.log('Scan complete. No Socket.dev optimized overrides applied.')
46+
}
47+
48+
logger.log('')
49+
logger.success('Finished!')
50+
logger.log('')
51+
}
52+
53+
function createActionMessage(
54+
verb: string,
55+
overrideCount: number,
56+
workspaceCount: number,
57+
): string {
58+
return `${verb} ${overrideCount} Socket.dev optimized ${pluralize('override', overrideCount)}${workspaceCount ? ` in ${workspaceCount} ${pluralize('workspace', workspaceCount)}` : ''}`
59+
}

src/commands/optimize/update-lockfile.mts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import { debugFn } from '@socketsecurity/registry/lib/debug'
12
import { Spinner } from '@socketsecurity/registry/lib/spinner'
23

34
import constants from '../../constants.mts'
45
import { runAgentInstall } from '../../utils/agent.mts'
56
import { cmdPrefixMessage } from '../../utils/cmd.mts'
67

8+
import type { CResult } from '../../types.mts'
79
import type { EnvDetails } from '../../utils/package-environment.mts'
810
import type { Logger } from '@socketsecurity/registry/lib/logger'
911

@@ -18,7 +20,7 @@ export type UpdateLockfileOptions = {
1820
export async function updateLockfile(
1921
pkgEnvDetails: EnvDetails,
2022
options: UpdateLockfileOptions,
21-
) {
23+
): Promise<CResult<unknown>> {
2224
const {
2325
cmdName = '',
2426
logger,
@@ -42,17 +44,21 @@ export async function updateLockfile(
4244
}
4345
} catch (e) {
4446
spinner?.stop()
45-
logger?.fail(
46-
cmdPrefixMessage(
47+
debugFn(e)
48+
return {
49+
ok: false,
50+
message: 'Update failed',
51+
cause: cmdPrefixMessage(
4752
cmdName,
4853
`${pkgEnvDetails.agent} install failed to update ${pkgEnvDetails.lockName}`,
4954
),
50-
)
51-
logger?.error(e)
55+
}
5256
}
5357
if (isSpinning) {
5458
spinner?.start()
5559
} else {
5660
spinner?.stop()
5761
}
62+
63+
return { ok: true, data: undefined }
5864
}

0 commit comments

Comments
 (0)