Skip to content

Commit cbc0a34

Browse files
committed
Add SOCKET_IS_LEGACY_BUILD
1 parent c381fcb commit cbc0a34

File tree

8 files changed

+134
-85
lines changed

8 files changed

+134
-85
lines changed

.config/rollup.base.config.mjs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ const {
3737
ROLLUP_ENTRY_SUFFIX,
3838
ROLLUP_EXTERNAL_SUFFIX,
3939
SLASH_NODE_MODULES_SLASH,
40-
SOCKET_WITH_SENTRY,
4140
VENDOR,
4241
babelConfigPath,
4342
rootPackageJsonPath,

.config/rollup.dist.config.mjs

Lines changed: 100 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import util from 'node:util'
88
import replacePlugin from '@rollup/plugin-replace'
99
import { glob as tinyGlob } from 'tinyglobby'
1010

11+
import { readJson, writeJson } from '@socketsecurity/registry/lib/fs'
1112
import { toSortedObject } from '@socketsecurity/registry/lib/objects'
1213
import {
1314
fetchPackageManifest,
@@ -20,7 +21,6 @@ import { naturalCompare } from '@socketsecurity/registry/lib/sorts'
2021

2122
import baseConfig from './rollup.base.config.mjs'
2223
import constants from '../scripts/constants.js'
23-
import { readJson } from '../scripts/utils/fs.js'
2424
import { formatObject } from '../scripts/utils/objects.js'
2525
import {
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'
4850
const INSTRUMENT_WITH_SENTRY = 'instrument-with-sentry'
4951
const 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+
122151
async 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) {
171200
async 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

241282
export 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,

.github/workflows/provenance.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,15 @@ jobs:
2121
scope: "@socketsecurity"
2222
- run: npm install -g npm@latest
2323
- run: npm ci
24-
- run: SOCKET_IS_PUBLISHED=1 npm run build:dist
24+
- run: SOCKET_IS_PUBLISHED_BUILD=1 npm run build:dist
2525
- run: npm publish --provenance --access public
2626
env:
2727
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
28-
- run: SOCKET_IS_PUBLISHED=1 SOCKET_WITH_SENTRY=1 npm run build:dist
28+
- run: SOCKET_IS_PUBLISHED_BUILD=1 SOCKET_IS_LEGACY_BUILD=1 npm run build:dist
29+
- run: npm publish --provenance --access public
30+
env:
31+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
32+
- run: SOCKET_IS_PUBLISHED_BUILD=1 SOCKET_IS_SENTRY_BUILD=1 npm run build:dist
2933
- run: npm publish --provenance --access public
3034
env:
3135
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

bin/cli.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ const { DIST_TYPE } = constants
99

1010
if (
1111
DIST_TYPE === 'require' &&
12-
// The '@rollup/plugin-replace' will replace 'process.env.SOCKET_WITH_SENTRY'.
13-
!process.env['SOCKET_WITH_SENTRY']
12+
// The '@rollup/plugin-replace' will replace 'process.env.SOCKET_IS_SENTRY_BUILD'.
13+
!process.env['SOCKET_IS_SENTRY_BUILD']
1414
) {
1515
// Lazily access constants.distPath.
1616
require(`${constants.distPath}/cli.js`)
@@ -26,8 +26,8 @@ if (
2626
[
2727
// Lazily access constants.nodeNoWarningsFlags.
2828
...constants.nodeNoWarningsFlags,
29-
// The '@rollup/plugin-replace' will replace 'process.env.SOCKET_WITH_SENTRY'.
30-
...(process.env['SOCKET_WITH_SENTRY']
29+
// The '@rollup/plugin-replace' will replace 'process.env.SOCKET_IS_SENTRY_BUILD'.
30+
...(process.env['SOCKET_IS_SENTRY_BUILD']
3131
? [
3232
'--require',
3333
// Lazily access constants.instrumentWithSentryPath.

scripts/constants.js

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,28 @@ const MODULE_SYNC = 'module-sync'
1717
const REQUIRE = 'require'
1818
const ROLLUP_ENTRY_SUFFIX = '?commonjs-entry'
1919
const ROLLUP_EXTERNAL_SUFFIX = '?commonjs-external'
20-
const SOCKET_IS_PUBLISHED = 'SOCKET_IS_PUBLISHED'
21-
const SOCKET_WITH_SENTRY = 'SOCKET_WITH_SENTRY'
20+
const SOCKET_IS_LEGACY_BUILD = 'SOCKET_IS_LEGACY_BUILD'
21+
const SOCKET_IS_PUBLISHED_BUILD = 'SOCKET_IS_PUBLISHED_BUILD'
22+
const SOCKET_IS_SENTRY_BUILD = 'SOCKET_IS_SENTRY_BUILD'
2223
const SLASH_NODE_MODULES_SLASH = '/node_modules/'
2324
const TAP = 'TAP'
2425
const VENDOR = 'vendor'
2526

26-
const LAZY_ENV = () =>
27-
Object.freeze({
27+
const LAZY_ENV = () => {
28+
const { env } = process
29+
return Object.freeze({
2830
// Lazily access registryConstants.ENV.
2931
...registryConstants.ENV,
30-
// Flag set to determine if this is the published package build.
31-
[SOCKET_IS_PUBLISHED]: envAsBoolean(process.env[SOCKET_IS_PUBLISHED]),
32+
// Flag set to determine if this is the Legacy build.
33+
[SOCKET_IS_LEGACY_BUILD]: envAsBoolean(env[SOCKET_IS_LEGACY_BUILD]),
34+
// Flag set to determine if this is a published build.
35+
[SOCKET_IS_PUBLISHED_BUILD]: envAsBoolean(env[SOCKET_IS_PUBLISHED_BUILD]),
3236
// Flag set to determine if this is the Sentry build.
33-
[SOCKET_WITH_SENTRY]: envAsBoolean(process.env[SOCKET_WITH_SENTRY]),
37+
[SOCKET_IS_SENTRY_BUILD]: envAsBoolean(env[SOCKET_IS_SENTRY_BUILD]),
3438
// Flag set when running in Node-tap.
35-
[TAP]: envAsBoolean(process.env[TAP])
39+
[TAP]: envAsBoolean(env[TAP])
3640
})
41+
}
3742

3843
const lazyBabelConfigPath = () =>
3944
// Lazily access constants.rootConfigPath.
@@ -78,8 +83,9 @@ const constants = createConstantsObject(
7883
ROLLUP_ENTRY_SUFFIX,
7984
ROLLUP_EXTERNAL_SUFFIX,
8085
SLASH_NODE_MODULES_SLASH,
81-
SOCKET_IS_PUBLISHED,
82-
SOCKET_WITH_SENTRY,
86+
SOCKET_IS_LEGACY_BUILD,
87+
SOCKET_IS_PUBLISHED_BUILD,
88+
SOCKET_IS_SENTRY_BUILD,
8389
TAP,
8490
VENDOR,
8591
babelConfigPath: undefined,

scripts/utils/fs.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict'
22

3-
const { promises: fs, statSync } = require('node:fs')
3+
const { statSync } = require('node:fs')
44
const path = require('node:path')
55

66
function findUpSync(name, { cwd = process.cwd() }) {
@@ -22,11 +22,6 @@ function findUpSync(name, { cwd = process.cwd() }) {
2222
return undefined
2323
}
2424

25-
async function readJson(filepath) {
26-
return JSON.parse(await fs.readFile(filepath, 'utf8'))
27-
}
28-
2925
module.exports = {
30-
findUpSync,
31-
readJson
26+
findUpSync
3227
}

src/instrument-with-sentry.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ const {
1313

1414
const debugging = constants.ENV.SOCKET_CLI_DEBUG
1515

16-
// The '@rollup/plugin-replace' will replace 'process.env.SOCKET_WITH_SENTRY'.
17-
if (process.env['SOCKET_WITH_SENTRY']) {
16+
// The '@rollup/plugin-replace' will replace 'process.env.SOCKET_IS_SENTRY_BUILD'.
17+
if (process.env['SOCKET_IS_SENTRY_BUILD']) {
1818
setSentry(Sentry)
1919
if (debugging) {
2020
console.log('[DEBUG] Setting up Sentry...')
@@ -31,8 +31,8 @@ if (process.env['SOCKET_WITH_SENTRY']) {
3131
})
3232
Sentry.setTag(
3333
'environment',
34-
// The '@rollup/plugin-replace' will replace 'process.env.SOCKET_IS_PUBLISHED'.
35-
process.env['SOCKET_IS_PUBLISHED'] ? 'pub' : process.env['NODE_ENV']
34+
// The '@rollup/plugin-replace' will replace 'process.env.SOCKET_IS_PUBLISHED_BUILD'.
35+
process.env['SOCKET_IS_PUBLISHED_BUILD'] ? 'pub' : process.env['NODE_ENV']
3636
)
3737
Sentry.setTag('debugging', debugging)
3838
Sentry.setTag(

0 commit comments

Comments
 (0)