This commit is contained in:
fullex 2025-05-26 08:30:22 +08:00
parent a248517520
commit 9105e0f5c1
20 changed files with 446 additions and 99 deletions

View File

@ -39,6 +39,9 @@ files:
asarUnpack:
- resources/**
- '**/*.{metal,exp,lib}'
extraResources:
- from: 'migrations/sqlite-drizzle'
to: 'migrations/sqlite-drizzle'
win:
executableName: Cherry Studio
artifactName: ${productName}-${version}-${arch}-setup.${ext}

View File

@ -32,6 +32,7 @@ export default defineConfig({
alias: {
'@main': resolve('src/main'),
'@types': resolve('src/renderer/src/types'),
'@storage': resolve('src/main/storage'),
'@shared': resolve('packages/shared')
}
},

5
migrations/README.md Normal file
View File

@ -0,0 +1,5 @@
Using `libsql` as the `sqlite3` driver, and `drizzle` as the ORM and database migration tool
`migrations/sqlite-drizzle` contains auto-generated migration data. Please **DO NOT** modify it.
To generate migrations, use the command `yarn run migrations:generate`

View File

@ -0,0 +1,7 @@
import { defineConfig } from 'drizzle-kit'
export default defineConfig({
out: './migrations/sqlite-drizzle',
schema: './src/main/db/schema/*',
dialect: 'sqlite',
casing: 'snake_case'
})

View File

@ -0,0 +1,10 @@
CREATE TABLE `preference` (
`scope` text NOT NULL,
`key` text NOT NULL,
`value` text,
`created_at` integer,
`updated_at` integer,
`deleted_at` integer
);
--> statement-breakpoint
CREATE INDEX `scope_name_idx` ON `preference` (`scope`,`key`);

View File

@ -0,0 +1,79 @@
{
"version": "6",
"dialect": "sqlite",
"id": "c8c54066-c6f6-404b-a46d-84787ae22485",
"prevId": "00000000-0000-0000-0000-000000000000",
"tables": {
"preference": {
"name": "preference",
"columns": {
"scope": {
"name": "scope",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"key": {
"name": "key",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"value": {
"name": "value",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"created_at": {
"name": "created_at",
"type": "integer",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"updated_at": {
"name": "updated_at",
"type": "integer",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"deleted_at": {
"name": "deleted_at",
"type": "integer",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {
"scope_name_idx": {
"name": "scope_name_idx",
"columns": [
"scope",
"key"
],
"isUnique": false
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
}
},
"views": {},
"enums": {},
"_meta": {
"schemas": {},
"tables": {},
"columns": {}
},
"internal": {
"indexes": {}
}
}

View File

@ -0,0 +1,13 @@
{
"version": "7",
"dialect": "sqlite",
"entries": [
{
"idx": 0,
"version": "6",
"when": 1747914098702,
"tag": "0000_panoramic_morlun",
"breakpoints": true
}
]
}

View File

@ -54,7 +54,8 @@
"format": "prettier --write .",
"lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix",
"postinstall": "electron-builder install-app-deps",
"prepare": "husky"
"prepare": "husky",
"migrations:generate": "drizzle-kit generate --config ./migrations/sqlite-drizzle.config.ts"
},
"dependencies": {
"@cherrystudio/embedjs": "^0.1.31",
@ -71,12 +72,12 @@
"@electron-toolkit/utils": "^3.0.0",
"@electron/notarize": "^2.5.0",
"@langchain/community": "^0.3.36",
"@libsql/client": "^0.15.7",
"@strongtz/win32-arm64-msvc": "^0.4.7",
"@tanstack/react-query": "^5.27.0",
"@types/react-infinite-scroll-component": "^5.0.0",
"archiver": "^7.0.1",
"async-mutex": "^0.5.0",
"better-sqlite3": "^11.10.0",
"color": "^5.0.0",
"diff": "^7.0.0",
"docx": "^9.0.2",
@ -127,7 +128,6 @@
"@shikijs/markdown-it": "^3.4.2",
"@swc/plugin-styled-components": "^7.1.5",
"@tryfabric/martian": "^1.2.4",
"@types/better-sqlite3": "^7.6.13",
"@types/diff": "^7",
"@types/fs-extra": "^11",
"@types/lodash": "^4.17.5",

View File

@ -0,0 +1,35 @@
export interface Preferences {
default: {
test1: string
test2: number
test3: boolean
test4: string[]
test5: {
content1: string
content2: number
}
}
user: {
test1: string
test2: number
test3: boolean
}
}
export const defaultPreferences: Preferences = {
default: {
test1: 'test1',
test2: 1,
test3: true,
test4: ['test4-1', 'test4-2'],
test5: {
content1: 'test5-1',
content2: 2
}
},
user: {
test1: 'test1',
test2: 1,
test3: false
}
}

70
src/main/db/DbService.ts Normal file
View File

@ -0,0 +1,70 @@
import { drizzle } from 'drizzle-orm/libsql'
import { migrate } from 'drizzle-orm/libsql/migrator'
import { app } from 'electron'
import Logger from 'electron-log'
import path from 'path'
import { pathToFileURL } from 'url'
import Seeds from './seed'
import type { DbType } from './types'
const DB_NAME = 'cherrystudio.sqlite'
const MIGRATIONS_BASE_PATH = 'migrations/sqlite-drizzle'
class DbService {
private static instance: DbService
private db: DbType
private constructor() {
this.db = drizzle({
connection: { url: pathToFileURL(path.join(app.getPath('userData'), DB_NAME)).href },
casing: 'snake_case'
})
}
public static getInstance(): DbService {
if (!DbService.instance) {
DbService.instance = new DbService()
}
return DbService.instance
}
public async migrateDb() {
const migrationsFolder = this.getMigrationsFolder()
await migrate(this.db, { migrationsFolder })
}
public getDb(): DbType {
return this.db
}
public async migrateSeed(seedName: keyof typeof Seeds): Promise<boolean> {
try {
const Seed = Seeds[seedName]
await new Seed().migrate(this.db)
return true
} catch (error) {
Logger.error(error)
return false
}
}
/**
* Get the migrations folder based on the app's packaging status
* @returns The path to the migrations folder
*/
private getMigrationsFolder() {
if (app.isPackaged) {
//see electron-builder.yml, extraResources from/to
return path.join(process.resourcesPath, MIGRATIONS_BASE_PATH)
} else {
// in dev/preview, __dirname maybe /out/main
return path.join(__dirname, '../../', MIGRATIONS_BASE_PATH)
}
}
}
// Export a singleton instance
const dbService = DbService.getInstance()
export default dbService

2
src/main/db/README.md Normal file
View File

@ -0,0 +1,2 @@
* All the database table names use **singular** form, snake_casing
* Export table names use `xxxxTable`

View File

@ -0,0 +1,11 @@
import { integer } from 'drizzle-orm/sqlite-core'
const createTimestamp = () => {
return Date.now()
}
export const crudTimestamps = {
createdAt: integer().$defaultFn(createTimestamp),
updatedAt: integer().$defaultFn(createTimestamp).$onUpdateFn(createTimestamp),
deletedAt: integer()
}

View File

@ -0,0 +1,14 @@
import { index, sqliteTable, text } from 'drizzle-orm/sqlite-core'
import { crudTimestamps } from './columnHelpers'
export const preferenceTable = sqliteTable(
'preference',
{
scope: text().notNull(),
key: text().notNull(),
value: text({ mode: 'json' }),
...crudTimestamps
},
(t) => [index('scope_name_idx').on(t.scope, t.key)]
)

View File

@ -0,0 +1,7 @@
import PreferenceSeed from './preferenceSeed'
const seedList = {
preference: PreferenceSeed
}
export default seedList

View File

@ -0,0 +1,47 @@
import { preferenceTable } from '@main/db/schema/preference'
import { defaultPreferences } from '@shared/preferences'
import type { DbType, ISeed } from '../types'
class PreferenceSeed implements ISeed {
async migrate(db: DbType): Promise<void> {
const preferences = await db.select().from(preferenceTable)
// Convert existing preferences to a Map for quick lookup
const existingPrefs = new Map(preferences.map((p) => [`${p.scope}.${p.key}`, p]))
// Collect all new preferences to insert
const newPreferences: Array<{
scope: string
key: string
value: unknown
}> = []
// Process each scope in defaultPreferences
for (const [scope, scopeData] of Object.entries(defaultPreferences)) {
// Process each key-value pair in the scope
for (const [key, value] of Object.entries(scopeData)) {
const prefKey = `${scope}.${key}`
// Skip if this preference already exists
if (existingPrefs.has(prefKey)) {
continue
}
// Add to new preferences array
newPreferences.push({
scope,
key,
value
})
}
}
// If there are new preferences to insert, do it in a transaction
if (newPreferences.length > 0) {
await db.insert(preferenceTable).values(newPreferences)
}
}
}
export default PreferenceSeed

7
src/main/db/types.d.ts vendored Normal file
View File

@ -0,0 +1,7 @@
import type { LibSQLDatabase } from 'drizzle-orm/libsql'
export type DbType = LibSQLDatabase
export interface ISeed {
migrate(db: DbType): Promise<void>
}

View File

@ -1,6 +1,7 @@
import '@main/config'
import { electronApp, optimizer } from '@electron-toolkit/utils'
import dbService from '@main/db/DbService'
import { replaceDevtoolsFont } from '@main/utils/windowUtil'
import { app } from 'electron'
import installExtension, { REACT_DEVELOPER_TOOLS, REDUX_DEVTOOLS } from 'electron-devtools-installer'
@ -20,7 +21,6 @@ import { registerShortcuts } from './services/ShortcutService'
import { TrayService } from './services/TrayService'
import { windowService } from './services/WindowService'
import { setUserDataDir } from './utils/file'
Logger.initialize()
// in production mode, handle uncaught exception and unhandled rejection globally
@ -44,10 +44,13 @@ if (!app.requestSingleInstanceLock()) {
// Portable dir must be setup before app ready
setUserDataDir()
dbService.migrateDb().then(async () => {
await dbService.migrateSeed('preference')
})
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.whenReady().then(async () => {
// Set app user model id for windows
electronApp.setAppUserModelId(import.meta.env.VITE_MAIN_BUNDLE_ID || 'com.kangfenmao.CherryStudio')

View File

@ -0,0 +1 @@
class PrefService {}

View File

@ -17,6 +17,7 @@
"paths": {
"@main/*": ["src/main/*"],
"@types": ["src/renderer/src/types/index.ts"],
"@storage/*": ["src/main/db/*"],
"@shared/*": ["packages/shared/*"]
}
}

219
yarn.lock
View File

@ -3562,6 +3562,19 @@ __metadata:
languageName: node
linkType: hard
"@libsql/client@npm:^0.15.7":
version: 0.15.7
resolution: "@libsql/client@npm:0.15.7"
dependencies:
"@libsql/core": "npm:^0.15.7"
"@libsql/hrana-client": "npm:^0.7.0"
js-base64: "npm:^3.7.5"
libsql: "npm:^0.5.11"
promise-limit: "npm:^2.7.0"
checksum: 10c0/07d5acb77410651e784edb7463ec0ceab99b614d17540ba3a462a810364253b54b4f8d93be659aab8a3351f15d78fe607c8d3359f250f043f50375e4b312ac69
languageName: node
linkType: hard
"@libsql/core@npm:^0.14.0":
version: 0.14.0
resolution: "@libsql/core@npm:0.14.0"
@ -3571,6 +3584,15 @@ __metadata:
languageName: node
linkType: hard
"@libsql/core@npm:^0.15.7":
version: 0.15.7
resolution: "@libsql/core@npm:0.15.7"
dependencies:
js-base64: "npm:^3.7.5"
checksum: 10c0/b6c91467509b2c36bbae1562a6ebbec548a4564223b6315f629ee5665c763f5ad2e347d7d05a002d3b9bfc5f21bd31de04ec26fffa0eb4aff1f7fb67453a726e
languageName: node
linkType: hard
"@libsql/darwin-arm64@npm:0.4.7":
version: 0.4.7
resolution: "@libsql/darwin-arm64@npm:0.4.7"
@ -3578,6 +3600,13 @@ __metadata:
languageName: node
linkType: hard
"@libsql/darwin-arm64@npm:0.5.11":
version: 0.5.11
resolution: "@libsql/darwin-arm64@npm:0.5.11"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@libsql/darwin-x64@npm:0.4.7":
version: 0.4.7
resolution: "@libsql/darwin-x64@npm:0.4.7"
@ -3585,6 +3614,13 @@ __metadata:
languageName: node
linkType: hard
"@libsql/darwin-x64@npm:0.5.11":
version: 0.5.11
resolution: "@libsql/darwin-x64@npm:0.5.11"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@libsql/hrana-client@npm:^0.7.0":
version: 0.7.0
resolution: "@libsql/hrana-client@npm:0.7.0"
@ -3614,6 +3650,20 @@ __metadata:
languageName: node
linkType: hard
"@libsql/linux-arm-gnueabihf@npm:0.5.11":
version: 0.5.11
resolution: "@libsql/linux-arm-gnueabihf@npm:0.5.11"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
"@libsql/linux-arm-musleabihf@npm:0.5.11":
version: 0.5.11
resolution: "@libsql/linux-arm-musleabihf@npm:0.5.11"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
"@libsql/linux-arm64-gnu@npm:0.4.7":
version: 0.4.7
resolution: "@libsql/linux-arm64-gnu@npm:0.4.7"
@ -3621,6 +3671,13 @@ __metadata:
languageName: node
linkType: hard
"@libsql/linux-arm64-gnu@npm:0.5.11":
version: 0.5.11
resolution: "@libsql/linux-arm64-gnu@npm:0.5.11"
conditions: os=linux & cpu=arm64
languageName: node
linkType: hard
"@libsql/linux-arm64-musl@npm:0.4.7":
version: 0.4.7
resolution: "@libsql/linux-arm64-musl@npm:0.4.7"
@ -3628,6 +3685,13 @@ __metadata:
languageName: node
linkType: hard
"@libsql/linux-arm64-musl@npm:0.5.11":
version: 0.5.11
resolution: "@libsql/linux-arm64-musl@npm:0.5.11"
conditions: os=linux & cpu=arm64
languageName: node
linkType: hard
"@libsql/linux-x64-gnu@npm:0.4.7":
version: 0.4.7
resolution: "@libsql/linux-x64-gnu@npm:0.4.7"
@ -3635,6 +3699,13 @@ __metadata:
languageName: node
linkType: hard
"@libsql/linux-x64-gnu@npm:0.5.11":
version: 0.5.11
resolution: "@libsql/linux-x64-gnu@npm:0.5.11"
conditions: os=linux & cpu=x64
languageName: node
linkType: hard
"@libsql/linux-x64-musl@npm:0.4.7":
version: 0.4.7
resolution: "@libsql/linux-x64-musl@npm:0.4.7"
@ -3642,6 +3713,13 @@ __metadata:
languageName: node
linkType: hard
"@libsql/linux-x64-musl@npm:0.5.11":
version: 0.5.11
resolution: "@libsql/linux-x64-musl@npm:0.5.11"
conditions: os=linux & cpu=x64
languageName: node
linkType: hard
"@libsql/win32-x64-msvc@npm:0.4.7":
version: 0.4.7
resolution: "@libsql/win32-x64-msvc@npm:0.4.7"
@ -3649,6 +3727,13 @@ __metadata:
languageName: node
linkType: hard
"@libsql/win32-x64-msvc@npm:0.5.11":
version: 0.5.11
resolution: "@libsql/win32-x64-msvc@npm:0.5.11"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@malept/cross-spawn-promise@npm:^2.0.0":
version: 2.0.0
resolution: "@malept/cross-spawn-promise@npm:2.0.0"
@ -4665,15 +4750,6 @@ __metadata:
languageName: node
linkType: hard
"@types/better-sqlite3@npm:^7.6.13":
version: 7.6.13
resolution: "@types/better-sqlite3@npm:7.6.13"
dependencies:
"@types/node": "npm:*"
checksum: 10c0/c4336e7b92343eb0e988ded007c53fa9887b98a38d61175226e86124a1a2c28b1a4e3892873c5041e350b7bfa2901f85c82db1542c4f0eed1d3a899682c92106
languageName: node
linkType: hard
"@types/cacheable-request@npm:^6.0.1":
version: 6.0.3
resolution: "@types/cacheable-request@npm:6.0.3"
@ -6126,6 +6202,7 @@ __metadata:
"@hello-pangea/dnd": "npm:^16.6.0"
"@kangfenmao/keyv-storage": "npm:^0.1.0"
"@langchain/community": "npm:^0.3.36"
"@libsql/client": "npm:^0.15.7"
"@modelcontextprotocol/sdk": "npm:^1.11.4"
"@mozilla/readability": "npm:^0.6.0"
"@notionhq/client": "npm:^2.2.15"
@ -6135,7 +6212,6 @@ __metadata:
"@swc/plugin-styled-components": "npm:^7.1.5"
"@tanstack/react-query": "npm:^5.27.0"
"@tryfabric/martian": "npm:^1.2.4"
"@types/better-sqlite3": "npm:^7.6.13"
"@types/diff": "npm:^7"
"@types/fs-extra": "npm:^11"
"@types/lodash": "npm:^4.17.5"
@ -6160,7 +6236,6 @@ __metadata:
archiver: "npm:^7.0.1"
async-mutex: "npm:^0.5.0"
axios: "npm:^1.7.3"
better-sqlite3: "npm:^11.10.0"
browser-image-compression: "npm:^2.0.2"
color: "npm:^5.0.0"
dayjs: "npm:^1.11.11"
@ -6888,17 +6963,6 @@ __metadata:
languageName: node
linkType: hard
"better-sqlite3@npm:^11.10.0":
version: 11.10.0
resolution: "better-sqlite3@npm:11.10.0"
dependencies:
bindings: "npm:^1.5.0"
node-gyp: "npm:latest"
prebuild-install: "npm:^7.1.1"
checksum: 10c0/1fffbf9e5fc9d24847a3ecf09491bceab1c294b46ba41df1c449dc20b6f5c5d9d94ff24becd0b1632ee282bd21278b7fea53a5a6215bb99209ded0ae05eda3b0
languageName: node
linkType: hard
"bignumber.js@npm:^9.0.0":
version: 9.2.1
resolution: "bignumber.js@npm:9.2.1"
@ -6913,15 +6977,6 @@ __metadata:
languageName: node
linkType: hard
"bindings@npm:^1.5.0":
version: 1.5.0
resolution: "bindings@npm:1.5.0"
dependencies:
file-uri-to-path: "npm:1.0.0"
checksum: 10c0/3dab2491b4bb24124252a91e656803eac24292473e56554e35bbfe3cc1875332cfa77600c3bac7564049dc95075bf6fcc63a4609920ff2d64d0fe405fcf0d4ba
languageName: node
linkType: hard
"birecord@npm:^0.1.1":
version: 0.1.1
resolution: "birecord@npm:0.1.1"
@ -8880,13 +8935,6 @@ __metadata:
languageName: node
linkType: hard
"detect-libc@npm:^2.0.0":
version: 2.0.4
resolution: "detect-libc@npm:2.0.4"
checksum: 10c0/c15541f836eba4b1f521e4eecc28eefefdbc10a94d3b8cb4c507689f332cc111babb95deda66f2de050b22122113189986d5190be97d51b5a2b23b938415e67c
languageName: node
linkType: hard
"detect-libc@npm:^2.0.1":
version: 2.0.3
resolution: "detect-libc@npm:2.0.3"
@ -10837,13 +10885,6 @@ __metadata:
languageName: node
linkType: hard
"file-uri-to-path@npm:1.0.0":
version: 1.0.0
resolution: "file-uri-to-path@npm:1.0.0"
checksum: 10c0/3b545e3a341d322d368e880e1c204ef55f1d45cdea65f7efc6c6ce9e0c4d22d802d5629320eb779d006fe59624ac17b0e848d83cc5af7cd101f206cb704f5519
languageName: node
linkType: hard
"file-url@npm:^2.0.0":
version: 2.0.2
resolution: "file-url@npm:2.0.2"
@ -13293,6 +13334,45 @@ __metadata:
languageName: node
linkType: hard
"libsql@npm:^0.5.11":
version: 0.5.11
resolution: "libsql@npm:0.5.11"
dependencies:
"@libsql/darwin-arm64": "npm:0.5.11"
"@libsql/darwin-x64": "npm:0.5.11"
"@libsql/linux-arm-gnueabihf": "npm:0.5.11"
"@libsql/linux-arm-musleabihf": "npm:0.5.11"
"@libsql/linux-arm64-gnu": "npm:0.5.11"
"@libsql/linux-arm64-musl": "npm:0.5.11"
"@libsql/linux-x64-gnu": "npm:0.5.11"
"@libsql/linux-x64-musl": "npm:0.5.11"
"@libsql/win32-x64-msvc": "npm:0.5.11"
"@neon-rs/load": "npm:^0.0.4"
detect-libc: "npm:2.0.2"
dependenciesMeta:
"@libsql/darwin-arm64":
optional: true
"@libsql/darwin-x64":
optional: true
"@libsql/linux-arm-gnueabihf":
optional: true
"@libsql/linux-arm-musleabihf":
optional: true
"@libsql/linux-arm64-gnu":
optional: true
"@libsql/linux-arm64-musl":
optional: true
"@libsql/linux-x64-gnu":
optional: true
"@libsql/linux-x64-musl":
optional: true
"@libsql/win32-x64-msvc":
optional: true
checksum: 10c0/94a0b2032ca587dd4442df46dd66ec0e6071fd3289af0bd3a9914472c083f0b6944ba1502aaaa854aac7a0a549d0dcf0e15696d35b0267d8edd09c6fd06c1385
conditions: (os=darwin | os=linux | os=win32) & (cpu=x64 | cpu=arm64 | cpu=wasm32 | cpu=arm)
languageName: node
linkType: hard
"libsql@patch:libsql@npm%3A0.4.7#~/.yarn/patches/libsql-npm-0.4.7-444e260fb1.patch":
version: 0.4.7
resolution: "libsql@patch:libsql@npm%3A0.4.7#~/.yarn/patches/libsql-npm-0.4.7-444e260fb1.patch::version=0.4.7&hash=972e11"
@ -15097,13 +15177,6 @@ __metadata:
languageName: node
linkType: hard
"napi-build-utils@npm:^2.0.0":
version: 2.0.0
resolution: "napi-build-utils@npm:2.0.0"
checksum: 10c0/5833aaeb5cc5c173da47a102efa4680a95842c13e0d9cc70428bd3ee8d96bb2172f8860d2811799b5daa5cbeda779933601492a2028a6a5351c6d0fcf6de83db
languageName: node
linkType: hard
"natural-compare@npm:^1.4.0":
version: 1.4.0
resolution: "natural-compare@npm:1.4.0"
@ -15148,15 +15221,6 @@ __metadata:
languageName: node
linkType: hard
"node-abi@npm:^3.3.0":
version: 3.75.0
resolution: "node-abi@npm:3.75.0"
dependencies:
semver: "npm:^7.3.5"
checksum: 10c0/c43a2409407df3737848fd96202b0a49e15039994aecce963969e9ef7342a8fc544aba94e0bfd8155fb9de5f5fe9a4b6ccad8bf509e7c46caf096fc4491d63f2
languageName: node
linkType: hard
"node-abi@npm:^3.45.0":
version: 3.74.0
resolution: "node-abi@npm:3.74.0"
@ -16378,28 +16442,6 @@ __metadata:
languageName: node
linkType: hard
"prebuild-install@npm:^7.1.1":
version: 7.1.3
resolution: "prebuild-install@npm:7.1.3"
dependencies:
detect-libc: "npm:^2.0.0"
expand-template: "npm:^2.0.3"
github-from-package: "npm:0.0.0"
minimist: "npm:^1.2.3"
mkdirp-classic: "npm:^0.5.3"
napi-build-utils: "npm:^2.0.0"
node-abi: "npm:^3.3.0"
pump: "npm:^3.0.0"
rc: "npm:^1.2.7"
simple-get: "npm:^4.0.0"
tar-fs: "npm:^2.0.0"
tunnel-agent: "npm:^0.6.0"
bin:
prebuild-install: bin.js
checksum: 10c0/25919a42b52734606a4036ab492d37cfe8b601273d8dfb1fa3c84e141a0a475e7bad3ab848c741d2f810cef892fcf6059b8c7fe5b29f98d30e0c29ad009bedff
languageName: node
linkType: hard
"prelude-ls@npm:^1.2.1":
version: 1.2.1
resolution: "prelude-ls@npm:1.2.1"
@ -18440,17 +18482,6 @@ __metadata:
languageName: node
linkType: hard
"simple-get@npm:^4.0.0":
version: 4.0.1
resolution: "simple-get@npm:4.0.1"
dependencies:
decompress-response: "npm:^6.0.0"
once: "npm:^1.3.1"
simple-concat: "npm:^1.0.0"
checksum: 10c0/b0649a581dbca741babb960423248899203165769747142033479a7dc5e77d7b0fced0253c731cd57cf21e31e4d77c9157c3069f4448d558ebc96cf9e1eebcf0
languageName: node
linkType: hard
"simple-update-notifier@npm:2.0.0":
version: 2.0.0
resolution: "simple-update-notifier@npm:2.0.0"