@@ -8,6 +8,7 @@ import util from 'node:util'
88import replacePlugin from '@rollup/plugin-replace'
99import { glob as tinyGlob } from 'tinyglobby'
1010
11+ import { readJson , writeJson } from '@socketsecurity/registry/lib/fs'
1112import { toSortedObject } from '@socketsecurity/registry/lib/objects'
1213import {
1314 fetchPackageManifest ,
@@ -20,7 +21,6 @@ import { naturalCompare } from '@socketsecurity/registry/lib/sorts'
2021
2122import baseConfig from './rollup.base.config.mjs'
2223import constants from '../scripts/constants.js'
23- import { readJson } from '../scripts/utils/fs.js'
2424import { formatObject } from '../scripts/utils/objects.js'
2525import {
2626 getPackageName ,
@@ -34,8 +34,9 @@ const {
3434 MODULE_SYNC ,
3535 REQUIRE ,
3636 ROLLUP_EXTERNAL_SUFFIX ,
37- SOCKET_IS_PUBLISHED ,
38- SOCKET_WITH_SENTRY ,
37+ SOCKET_IS_LEGACY_BUILD ,
38+ SOCKET_IS_PUBLISHED_BUILD ,
39+ SOCKET_IS_SENTRY_BUILD ,
3940 TAP ,
4041 VENDOR ,
4142 depStatsPath,
@@ -45,6 +46,7 @@ const {
4546 rootSrcPath
4647} = constants
4748
49+ const SENTRY_NODE = '@sentry/node'
4850const INSTRUMENT_WITH_SENTRY = 'instrument-with-sentry'
4951const VENDOR_JS = `${ VENDOR } .js`
5052
@@ -85,7 +87,7 @@ function getSocketVersionHash() {
8587 // Mostly for development: confirms the build refreshed. For prod
8688 // builds the git hash should suffice to identify the build.
8789 _socketVersionHash = JSON . stringify (
88- `${ version } :${ gitHash } :${ randomUUID ( ) . split ( '-' ) [ 0 ] } ${ constants . ENV [ SOCKET_IS_PUBLISHED ] ? ':pub' : '' } `
90+ `${ version } :${ gitHash } :${ randomUUID ( ) . split ( '-' ) [ 0 ] } ${ constants . ENV [ SOCKET_IS_PUBLISHED_BUILD ] ? ':pub' : '' } `
8991 )
9092 }
9193 return _socketVersionHash
@@ -119,6 +121,33 @@ async function removeJsFiles(namePattern, srcPath) {
119121 }
120122}
121123
124+ function resetBin ( bin ) {
125+ const tmpBin = {
126+ socket : bin ?. socket ?? bin ?. [ 'socket-with-sentry' ] ,
127+ 'socket-npm' : bin ?. [ 'socket-npm' ] ?? bin ?. [ 'socket-npm-with-sentry' ] ,
128+ 'socket-npx' : bin ?. [ 'socket-npx' ] ?? bin ?. [ 'socket-npx-with-sentry' ]
129+ }
130+ const newBin = {
131+ ...( tmpBin . socket ? { socket : tmpBin . socket } : { } ) ,
132+ ...( tmpBin [ 'socket-npm' ] ? { 'socket-npm' : tmpBin [ 'socket-npm' ] } : { } ) ,
133+ ...( tmpBin [ 'socket-npx' ] ? { 'socket-npx' : tmpBin [ 'socket-npx' ] } : { } )
134+ }
135+ assert (
136+ util . isDeepStrictEqual ( Object . keys ( newBin ) . sort ( naturalCompare ) , [
137+ 'socket' ,
138+ 'socket-npm' ,
139+ 'socket-npx'
140+ ] ) ,
141+ "Update the rollup Legacy and Sentry build's .bin to match the default build."
142+ )
143+ return newBin
144+ }
145+
146+ function resetDependencies ( deps ) {
147+ const { [ SENTRY_NODE ] : _ignored , ...newDeps } = { ...deps }
148+ return newDeps
149+ }
150+
122151async function updateDepStats ( depStats ) {
123152 const editablePkgJson = await readPackageJson ( rootPath , { editable : true } )
124153 const { content : pkgJson } = editablePkgJson
@@ -149,12 +178,12 @@ async function updateDepStats(depStats) {
149178 depStats . esm = toSortedObject ( depStats . esm )
150179 depStats . external = toSortedObject ( depStats . external )
151180 depStats . transitives = toSortedObject ( depStats . transitives )
152- // Lazily access constants.ENV[SOCKET_WITH_SENTRY ].
153- if ( constants . ENV [ SOCKET_WITH_SENTRY ] ) {
181+ // Lazily access constants.ENV[SOCKET_IS_SENTRY_BUILD ].
182+ if ( constants . ENV [ SOCKET_IS_SENTRY_BUILD ] ) {
154183 // Add Sentry as a regular dep for this build.
155- depStats . dependencies [ '@sentry/node' ] = ( await getSentryManifest ( ) ) . version
184+ depStats . dependencies [ SENTRY_NODE ] = ( await getSentryManifest ( ) ) . version
156185 } else {
157- delete depStats . dependencies [ '@sentry/node' ]
186+ delete depStats . dependencies [ SENTRY_NODE ]
158187 }
159188 // Write dep stats.
160189 await fs . writeFile ( depStatsPath , `${ formatObject ( depStats ) } \n` , 'utf8' )
@@ -171,35 +200,30 @@ async function updateDepStats(depStats) {
171200async function updatePackageJson ( ) {
172201 const editablePkgJson = await readPackageJson ( rootPath , { editable : true } )
173202 const { content : pkgJson } = editablePkgJson
174- const dependencies = { ...pkgJson . dependencies }
175- const rawBin = pkgJson . bin ?? { }
176- const tmpBin = {
177- socket : rawBin . socket ?? rawBin [ 'socket-with-sentry' ] ,
178- 'socket-npm' : rawBin [ 'socket-npm' ] ?? rawBin [ 'socket-npm-with-sentry' ] ,
179- 'socket-npx' : rawBin [ 'socket-npx' ] ?? rawBin [ 'socket-npx-with-sentry' ]
180- }
181- const bin = {
182- ...( tmpBin . socket ? { socket : tmpBin . socket } : { } ) ,
183- ...( tmpBin [ 'socket-npm' ] ? { 'socket-npm' : tmpBin [ 'socket-npm' ] } : { } ) ,
184- ...( tmpBin [ 'socket-npx' ] ? { 'socket-npx' : tmpBin [ 'socket-npx' ] } : { } )
185- }
186- assert (
187- util . isDeepStrictEqual ( Object . keys ( bin ) . sort ( naturalCompare ) , [
188- 'socket' ,
189- 'socket-npm' ,
190- 'socket-npx'
191- ] ) ,
192- 'If this fails, make sure to update the rollup sentry override for .bin to match the regular build!'
193- )
194- delete dependencies [ '@sentry/node' ]
203+ const bin = resetBin ( pkgJson . bin )
204+ const dependencies = resetDependencies ( pkgJson . dependencies )
195205 editablePkgJson . update ( {
196206 name : 'socket' ,
197207 description : 'CLI tool for Socket.dev' ,
198208 bin,
199209 dependencies
200210 } )
201- // Lazily access constants.ENV[SOCKET_WITH_SENTRY].
202- if ( constants . ENV [ SOCKET_WITH_SENTRY ] ) {
211+ // Lazily access constants.ENV[SOCKET_IS_LEGACY_BUILD].
212+ if ( constants . ENV [ SOCKET_IS_LEGACY_BUILD ] ) {
213+ editablePkgJson . update ( {
214+ name : '@socketsecurity/cli' ,
215+ bin : {
216+ cli : bin . socket ,
217+ ...bin
218+ } ,
219+ dependencies : {
220+ ...dependencies ,
221+ [ SENTRY_NODE ] : ( await getSentryManifest ( ) ) . version
222+ }
223+ } )
224+ }
225+ // Lazily access constants.ENV[SOCKET_IS_SENTRY_BUILD].
226+ else if ( constants . ENV [ SOCKET_IS_SENTRY_BUILD ] ) {
203227 editablePkgJson . update ( {
204228 name : '@socketsecurity/socket-with-sentry' ,
205229 description :
@@ -211,7 +235,7 @@ async function updatePackageJson() {
211235 } ,
212236 dependencies : {
213237 ...dependencies ,
214- '@sentry/node' : ( await getSentryManifest ( ) ) . version
238+ [ SENTRY_NODE ] : ( await getSentryManifest ( ) ) . version
215239 }
216240 } )
217241 }
@@ -222,20 +246,37 @@ async function updatePackageLockFile() {
222246 if ( ! existsSync ( rootPackageLockPath ) ) {
223247 return
224248 }
225- // Note: This should just replace the first occurrence, even if there are more.
226- const lockSrc = await fs . readFile ( rootPackageLockPath , 'utf8' )
227- let updatedLockSrc = lockSrc . replace (
228- '"name": "@socketsecurity/socket-with-sentry",' ,
229- '"name": "socket",'
230- )
231- // Lazily access constants.ENV[SOCKET_WITH_SENTRY].
232- if ( constants . ENV [ SOCKET_WITH_SENTRY ] ) {
233- updatedLockSrc = lockSrc . replace (
234- '"name": "socket",' ,
235- '"name": "@socketsecurity/socket-with-sentry",'
236- )
249+ const lockJson = await readJson ( rootPackageLockPath )
250+ const rootPkg = lockJson . packages [ '' ]
251+ const bin = resetBin ( rootPkg . bin )
252+ const dependencies = resetDependencies ( rootPkg . dependencies )
253+ const defaultName = 'socket'
254+
255+ lockJson . name = defaultName
256+ rootPkg . name = defaultName
257+ rootPkg . bin = bin
258+ rootPkg . dependencies = dependencies
259+ // Lazily access constants.ENV[SOCKET_IS_LEGACY_BUILD].
260+ if ( constants . ENV [ SOCKET_IS_LEGACY_BUILD ] ) {
261+ const name = '@socketsecurity/cli'
262+ lockJson . name = name
263+ rootPkg . name = name
264+ rootPkg . bin = toSortedObject ( {
265+ cli : bin . socket ,
266+ ...bin
267+ } )
237268 }
238- await fs . writeFile ( rootPackageLockPath , updatedLockSrc , 'utf8' )
269+ // Lazily access constants.ENV[SOCKET_IS_SENTRY_BUILD].
270+ else if ( constants . ENV [ SOCKET_IS_SENTRY_BUILD ] ) {
271+ const name = '@socketsecurity/socket-with-sentry'
272+ lockJson . name = name
273+ rootPkg . name = name
274+ rootPkg . dependencies = toSortedObject ( {
275+ ...dependencies ,
276+ [ SENTRY_NODE ] : ( await getSentryManifest ( ) ) . version
277+ } )
278+ }
279+ await writeJson ( rootPackageLockPath , lockJson , { spaces : 2 } )
239280}
240281
241282export default ( ) => {
@@ -245,8 +286,8 @@ export default () => {
245286 constants : `${ rootSrcPath } /constants.ts` ,
246287 'shadow-bin' : `${ rootSrcPath } /shadow/shadow-bin.ts` ,
247288 'npm-injection' : `${ rootSrcPath } /shadow/npm-injection.ts` ,
248- // Lazily access constants.ENV[SOCKET_WITH_SENTRY ].
249- ...( constants . ENV [ SOCKET_WITH_SENTRY ]
289+ // Lazily access constants.ENV[SOCKET_IS_SENTRY_BUILD ].
290+ ...( constants . ENV [ SOCKET_IS_SENTRY_BUILD ]
250291 ? {
251292 [ INSTRUMENT_WITH_SENTRY ] : `${ rootSrcPath } /${ INSTRUMENT_WITH_SENTRY } .ts`
252293 }
@@ -296,13 +337,17 @@ export default () => {
296337 "process.env['SOCKET_CLI_VERSION']" ( ) {
297338 return JSON . stringify ( getSocketVersionHash ( ) )
298339 } ,
299- "process.env['SOCKET_IS_PUBLISHED']" : JSON . stringify (
300- // Lazily access constants.ENV[SOCKET_IS_PUBLISHED].
301- ! ! constants . ENV [ SOCKET_IS_PUBLISHED ]
340+ "process.env['SOCKET_IS_LEGACY_BUILD']" : JSON . stringify (
341+ // Lazily access constants.ENV[SOCKET_IS_LEGACY_BUILD].
342+ ! ! constants . ENV [ SOCKET_IS_LEGACY_BUILD ]
343+ ) ,
344+ "process.env['SOCKET_IS_PUBLISHED_BUILD']" : JSON . stringify (
345+ // Lazily access constants.ENV[SOCKET_IS_PUBLISHED_BUILD].
346+ ! ! constants . ENV [ SOCKET_IS_PUBLISHED_BUILD ]
302347 ) ,
303- "process.env['SOCKET_WITH_SENTRY ']" : JSON . stringify (
304- // Lazily access constants.ENV[SOCKET_WITH_SENTRY ].
305- ! ! constants . ENV [ SOCKET_WITH_SENTRY ]
348+ "process.env['SOCKET_IS_SENTRY_BUILD ']" : JSON . stringify (
349+ // Lazily access constants.ENV[SOCKET_IS_SENTRY_BUILD ].
350+ ! ! constants . ENV [ SOCKET_IS_SENTRY_BUILD ]
306351 ) ,
307352 "process.env['TAP']" : JSON . stringify (
308353 // Lazily access constants.ENV[TAP].
@@ -379,8 +424,8 @@ export default () => {
379424 ] )
380425 await Promise . all ( [
381426 removeDtsAndMapFiles ( CONSTANTS , distModuleSyncPath ) ,
382- // Lazily access constants.ENV[SOCKET_WITH_SENTRY ].
383- ...( constants . ENV [ SOCKET_WITH_SENTRY ]
427+ // Lazily access constants.ENV[SOCKET_IS_SENTRY_BUILD ].
428+ ...( constants . ENV [ SOCKET_IS_SENTRY_BUILD ]
384429 ? [
385430 moveDtsAndMapFiles (
386431 INSTRUMENT_WITH_SENTRY ,
0 commit comments