v1 release
/ release (push) Successful in 1m8s

This commit is contained in:
2026-02-17 17:36:48 -08:00
parent 9445b59ad5
commit d667000572
10 changed files with 200 additions and 146 deletions
+2 -4
View File
@@ -24,10 +24,8 @@ jobs:
- run: npm config set -- '//gitea.sugoidogo.com/api/packages/sugoidogo/npm/:_authToken' "$PACKAGES_KEY"
env:
PACKAGES_KEY: ${{ secrets.PACKAGES_KEY }}
- run: mv npm-readme.md readme.md
- run: mv src/lib/LICENCE.md licence.md
- run: npm publish
- run: npm run publish
- run: npm run docs
- run: npx wrangler deploy
- run: npx -w lib wrangler deploy
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
+2 -1
View File
@@ -5,4 +5,5 @@ dist
.env
*.tgz
docs
bin
bin
deno.lock
+2 -3
View File
@@ -2,8 +2,7 @@
"type": "module",
"scripts": {
"test": "node scripts/test.ts",
"compile": "node scripts/compile.ts",
"prepack": "tsc"
"compile": "node scripts/compile.ts"
},
"devDependencies": {
"@types/node": "^25.2.3",
@@ -16,4 +15,4 @@
"commander": "^14.0.3",
"dotenv": "^17.3.1"
}
}
}
+21 -14
View File
@@ -1,16 +1,23 @@
import spawnSync from "./spawnSync.ts"
import * as fs from "node:fs"
const deno_targets = [
'x86_64-apple-darwin',
'aarch64-apple-darwin',
'x86_64-pc-windows-msvc',
'x86_64-unknown-linux-gnu',
'aarch64-unknown-linux-gnu'
]
for (const target of deno_targets) {
spawnSync('deno', [
'compile', '--allow-all', '--target', target,
'--output', 'bin/deno/packwiz-extras-' + target,
'--no-check', 'src/main.ts'
], { stdio: 'inherit', shell: true })
}
if (fs.existsSync('dist')) fs.rmSync("dist", { "recursive": true })
spawnSync('deno', ["bundle", "--sourcemap=inline", "--code-splitting", "src/main.ts", "--outdir", "dist"])
fs.copyFileSync('../node_modules/workerless/dist/worker.js', "dist/worker.js")
const deno_targets = [
'x86_64-apple-darwin',
'aarch64-apple-darwin',
'x86_64-pc-windows-msvc',
'x86_64-unknown-linux-gnu',
'aarch64-unknown-linux-gnu'
]
for (const target of deno_targets) {
spawnSync('deno', [
'compile', '--allow-all', '--target', target,
'--output', 'bin/deno/packwiz-extras-' + target,
'--include', 'dist/worker.js',
'--no-check', 'dist/main.js'
//'--no-check', 'src/main.ts'
], { stdio: 'inherit', shell: true })
}
+61 -57
View File
@@ -1,73 +1,77 @@
import { program } from "commander"
import { config } from "dotenv"
import packwiz, { type PackwizPack } from "@sugoidogo/packwiz-extras-lib"
import packwiz from "@sugoidogo/packwiz-extras-lib"
import NodeFileSystemDirectoryHandle from "@sugoidogo/node-file-system-adapter"
const pathSeperatorRegex = /[\\\/]/
try {
const pathSeperatorRegex = /[\\\/]/
config({ 'quiet': true })
config({ 'quiet': true })
async function getPack() {
const packFile: string = program.opts().packFile
const packFilePathSegments = packFile.split(pathSeperatorRegex)
const packFileBasename = packFilePathSegments.pop()
const packFileDirname = packFilePathSegments.join("/")
const packDirectoryHandle = new NodeFileSystemDirectoryHandle(packFileDirname)
return packwiz.loadPack(packDirectoryHandle, packFileBasename)
}
async function getPack() {
const packFile: string = program.opts().packFile
const packFilePathSegments = packFile.split(pathSeperatorRegex)
const packFileBasename = packFilePathSegments.pop()
const packFileDirname = packFilePathSegments.join("/")
const packDirectoryHandle = new NodeFileSystemDirectoryHandle(packFileDirname)
return packwiz.loadPack(packDirectoryHandle, packFileBasename)
}
program.name('packwiz-extras')
.description('extra utilities for packwiz')
.option('--pack-file <string>', 'The modpack file to use', 'pack.toml')
program.name('packwiz-extras')
.description('extra utilities for packwiz')
.option('--pack-file <string>', 'The modpack file to use', 'pack.toml')
const curseforge = program.command('curseforge').alias('cf')
.description('manage curseforge files')
const curseforge = program.command('curseforge').alias('cf')
.description('manage curseforge files')
const cfKey: string[] = ['--api-key <string>',
'Your curseforge api key. This is required by curseforge to access their API. ' +
'Can also be provided via environment variable or .env file as CF_API_KEY',]
const cfKey: string[] = ['--api-key <string>',
'Your curseforge api key. This is required by curseforge to access their API. ' +
'Can also be provided via environment variable or .env file as CF_API_KEY',]
if (process.env.CF_API_KEY) {
curseforge.option(cfKey[0], cfKey[1])
} else {
curseforge.requiredOption(cfKey[0], cfKey[1])
}
if (process.env.CF_API_KEY) {
curseforge.option(cfKey[0], cfKey[1])
} else {
curseforge.requiredOption(cfKey[0], cfKey[1])
}
curseforge.command('detect')
.description('detect and replace files availible on curseforge')
.action(async () => {
const apiKey: string = curseforge.opts().apiKey || process.env.CF_API_KEY
const pack = await getPack()
await pack.findAndReplaceCurseforgeFiles(apiKey)
})
curseforge.command('detect')
.description('detect and replace files availible on curseforge')
.action(async () => {
const apiKey: string = curseforge.opts().apiKey || process.env.CF_API_KEY
const pack = await getPack()
await pack.findAndReplaceCurseforgeFiles(apiKey)
})
curseforge.command('urls')
.description('cache curseforge download urls to speed up packwiz-installer')
.action(async () => {
const apiKey = curseforge.opts().apiKey || process.env.CF_API_KEY
const pack = await getPack()
await pack.cacheCurseforgeDownloadURLs(apiKey)
await pack.savePack()
})
curseforge.command('urls')
.description('cache curseforge download urls to speed up packwiz-installer')
.action(async () => {
const apiKey = curseforge.opts().apiKey || process.env.CF_API_KEY
const pack = await getPack()
await pack.cacheCurseforgeDownloadURLs(apiKey)
await pack.savePack()
})
const modrith = program.command('modrinth').alias('mr')
.description('manage modrinth files')
const modrith = program.command('modrinth').alias('mr')
.description('manage modrinth files')
//modrith.option('--api-key <string>', 'Your modrinth api key, optional.')
modrith.command('detect')
.description('detect and replace files availible on modrinth')
.action(async () => {
const pack = await getPack()
await pack.findAndReplaceModrinthFiles()
})
modrith.command('detect')
.description('detect and replace files availible on modrinth')
.action(async () => {
const pack = await getPack()
await pack.findAndReplaceModrinthFiles()
})
modrith.command('merge')
.description('detect curseforge metafiles which are also availible on modrinth and merge their metadata')
.action(async () => {
const pack = await getPack()
await pack.mergeModrinthMetadata()
await pack.savePack()
})
modrith.command('merge')
.description('detect curseforge metafiles which are also availible on modrinth and merge their metadata')
.action(async () => {
const pack = await getPack()
await pack.mergeModrinthMetadata()
await pack.savePack()
})
await program.parseAsync()
await program.parseAsync()
} catch (error) {
if (error instanceof Error) console.log(error.message)
else console.log(error)
process.exit(1)
}
-3
View File
@@ -9,9 +9,6 @@
"types": [
"node"
],
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"outDir": "dist",
"rewriteRelativeImportExtensions": true,
"erasableSyntaxOnly": true,
+4
View File
@@ -0,0 +1,4 @@
{
"$schema": "https://raw.githubusercontent.com/denoland/deno/refs/heads/main/cli/schemas/config-file.v1.json",
"nodeModulesDir":"none"
}
+57 -21
View File
@@ -77,14 +77,28 @@ async function assertHashMatch(bytes: Uint8Array<ArrayBuffer>, hashFormat: HashF
return true
}
/**
* This object contains all the functionality of packwiz-extras, and is the default export of this library.
*
* All instancing methods (new PackwizPack, loadPack, refreshPack, fetchPack) require a FileSystemDirectoryHandle as their first argument.
*
* In web browsers, you can use [navigator.storage.getDirectory](https://developer.mozilla.org/en-US/docs/Web/API/StorageManager/getDirectory)
* to use browser storage, or [showDirectoryPicker](https://developer.mozilla.org/en-US/docs/Web/API/Window/showDirectoryPicker)
* to allow the user to select a folder on the host system.
*
* In node, you can use [my node file system adapter](https://gitea.sugoidogo.com/sugoidogo/-/packages/npm/@sugoidogo%2Fnode-file-system-adapter)
* (or any pollyfill/ponyfill that provides the Web File System API) to grant this library access to a host folder.
*/
export class PackwizPack {
/** The directory in which all pack files are stored */
packDirectoryHandle: FileSystemDirectoryHandle
/** The name of the {@link PackMetaData} file */
packFileName: Path
packMetaData: PackMetaData
packIndex: PackIndex
/** This object stores the contents of {@link PackFileMetaData} files referenced in the {@link PackIndex} */
packFiles: { [key: Path]: PackFileMetaData | undefined }
/** Creates a new, empty modpack */
constructor(packDirectoryHandle: FileSystemDirectoryHandle, packName: string, versions: PackMetaData["versions"]) {
this.packDirectoryHandle = packDirectoryHandle
this.packFileName = "pack.toml"
@@ -103,9 +117,9 @@ export class PackwizPack {
}
this.packFiles = {}
}
/** Fetches a modpack from an HTTP/HTTPS url */
static async fetchPack(packDirectoryHandle: FileSystemDirectoryHandle, packUrl: Url): Promise<PackwizPack> {
console.debug("fetching pack from "+packUrl)
console.debug("fetching pack from " + packUrl)
const { packMetaData, packFileName } = await fetch(packUrl).then(async response => {
const packFileText = await assertOK(response).text()
const packMetaData = parseTOML(packFileText) as PackMetaData
@@ -147,7 +161,7 @@ export class PackwizPack {
console.log("pack fetched")
return pack
}
/** Loads a modpack from storage */
static async loadPack(packDirectoryHandle: FileSystemDirectoryHandle, packFileName = "pack.toml"): Promise<PackwizPack> {
console.debug("loading pack")
const packMetaData = await getFileHandle(packDirectoryHandle, packFileName).then(async packDirectoryHandle => {
@@ -185,7 +199,7 @@ export class PackwizPack {
console.log("pack loaded")
return pack
}
/** Loads a modpack from storage, ignoring and rebuilding the index so that changes made outside of packwiz(-extras) are included. */
static async refreshPack(packDirectoryHandle: FileSystemDirectoryHandle, packFileName = "pack.toml"): Promise<PackwizPack> {
console.log("refreshing pack")
const { packMetaData, packFileHandle } = await getFileHandle(packDirectoryHandle, packFileName).then(async packDirectoryHandle => {
@@ -236,7 +250,13 @@ export class PackwizPack {
console.log("pack refreshed")
return pack
}
/**
* Saves the in-memory modpack changes to storage.
* You must call this function after making any changes to the pack in order to preserve those changes.
* @param hashes whether to calculate and include file hashes in the output.
* You should only change this to true when saving the pack for serving over HTTP, where hashes are required.
* Otherwise, this option is automatically set from pack options.
*/
async savePack(hashes?: boolean): Promise<PackwizPack> {
console.log("saving changes")
if (typeof hashes !== "boolean") {
@@ -279,7 +299,11 @@ export class PackwizPack {
console.log("changes saved")
return this
}
/**
* Hashes all non-metafiles in the pack and makes a request to curseforge to find matching files.
* Any file that matches is removed from the modpack and replaced with a metafile referencing the curseforge file.
* @param apiKey required to access the curseforge api, can be retreived from [the curseforge console](https://console.curseforge.com/#/api-keys)
*/
async findAndReplaceCurseforgeFiles(apiKey: string): Promise<PackwizPack> {
console.log("finding and replacing curseforge files")
const workerlessPool = new WorkerlessPool()
@@ -298,7 +322,7 @@ export class PackwizPack {
hashPaths.set(hash, entry.file)
})
workerlessPool.terminate()
console.log("requesting info on "+hashPaths.size+" files")
console.log("requesting info on " + hashPaths.size + " files")
const curseforge = new CurseforgeV1Client(apiKey)
const result = await curseforge.getFingerprintsMatchesByGameId(minecrafCurseforgeGameID, [...hashPaths.keys()])
const modIDs: number[] = []
@@ -346,10 +370,13 @@ export class PackwizPack {
this.packIndex.files.splice(i, 1)
}
}
console.log("replaced "+replacedFilePaths.length+" files")
console.log("replaced " + replacedFilePaths.length + " files")
return this.savePack()
}
/**
* Hashes all non-metafiles in the pack and makes a request to modrinth to find matching files.
* Any file that matches is removed from the modpack and replaced with a metafile referencing the modrinth file.
*/
async findAndReplaceModrinthFiles(): Promise<PackwizPack> {
console.log("finding and replacing modrinth files")
const indexPathSegments = this.packMetaData.index.file.split(pathSeperatorRegex)
@@ -366,7 +393,7 @@ export class PackwizPack {
const hash = await getHash(bytes, "sha512") as string
hashPaths.set(hash, entry.file)
})
console.log("requesting info on "+hashPaths.size+" files")
console.log("requesting info on " + hashPaths.size + " files")
const modrinth = new ModrinthV2Client()
const matches = await modrinth.getProjectVersionsByHash([...hashPaths.keys()])
const projectIDs: string[] = []
@@ -420,10 +447,14 @@ export class PackwizPack {
this.packIndex.files.splice(i, 1)
}
}
console.log("replaced "+replacedFilePaths.length+" files")
console.log("replaced " + replacedFilePaths.length + " files")
return this.savePack()
}
/**
* In order to comply with curseforge API requirements, direct download URLs to curseforge files cannot be saved into the pack.
* Instead, you may use this function beforehand to cache the download URLs in memory before attempting to install the pack.
* @param apiKey required to access the curseforge api, can be retreived from [the curseforge console](https://console.curseforge.com/#/api-keys)
*/
async cacheCurseforgeDownloadURLs(apiKey: string): Promise<PackwizPack> {
console.log("caching curseforge download URLs")
const fileIDPaths = new Map<number, Path>()
@@ -431,9 +462,9 @@ export class PackwizPack {
if (!metafiledata.download.mode) continue
fileIDPaths.set(metafiledata.update.curseforge["file-id"], filePath)
}
console.log("requesting info on "+fileIDPaths.size+" files")
console.log("requesting info on " + fileIDPaths.size + " files")
const curseforge = new CurseforgeV1Client(apiKey)
let cachedURLcount=0
let cachedURLcount = 0
for (const file of await curseforge.getFiles([...fileIDPaths.keys()])) {
if (file.downloadUrl) {
cachedURLcount++
@@ -441,10 +472,15 @@ export class PackwizPack {
delete this.packFiles[fileIDPaths.get(file.id)].download.mode
}
}
console.log("cached "+cachedURLcount+" URLs")
console.log("cached " + cachedURLcount + " URLs")
return this
}
/**
* Uses the hashes stored in any non-modrinth metafiles to find files that are also availible from modrinth,
* then adds modrinth metadata (client/server side, download url, etc) to that file.
*
* Useful for metafiles that don't already have that meatadata availible, or for exporting your pack to multiple platforms.
*/
async mergeModrinthMetadata(): Promise<PackwizPack> {
console.log("merging modrinth metadata with curseforge files")
const hashPaths = new Map<Hash, Path>()
@@ -452,14 +488,14 @@ export class PackwizPack {
if (metafiledata.update.modrinth) continue
hashPaths.set(metafiledata.download.hash, filePath)
}
console.log("requesting info on "+hashPaths.size+" files")
console.log("requesting info on " + hashPaths.size + " files")
const modrinth = new ModrinthV2Client()
const matches = await modrinth.getProjectVersionsByHash([...hashPaths.keys()])
const projectIDs: string[] = []
for (const match of Object.values(matches)) projectIDs.push(match.project_id)
const projects = new Map<string, Project>()
for (const project of await modrinth.getProjects(projectIDs)) projects.set(project.id, project)
let mergedFileCount=0
let mergedFileCount = 0
for (const record of Object.entries(matches)) {
const [hash, match] = record
const filePath = hashPaths.get(hash)
@@ -486,7 +522,7 @@ export class PackwizPack {
}
}
}
console.log("merged "+mergedFileCount+" files")
console.log("merged " + mergedFileCount + " files")
return this
}
}
+41 -41
View File
@@ -55,14 +55,14 @@
}
},
"node_modules/@cloudflare/unenv-preset": {
"version": "2.12.1",
"resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.12.1.tgz",
"integrity": "sha512-tP/Wi+40aBJovonSNJSsS7aFJY0xjuckKplmzDs2Xat06BJ68B6iG7YDUWXJL8gNn0gqW7YC5WhlYhO3QbugQA==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.13.0.tgz",
"integrity": "sha512-bT2rnecesLjDBHgouMEPW9EQ7iLE8OG58srMuCEpAGp75xabi6j124SdS8XZ+dzB3sYBW4iQvVeCTCbAnMMVtA==",
"dev": true,
"license": "MIT OR Apache-2.0",
"peerDependencies": {
"unenv": "2.0.0-rc.24",
"workerd": "^1.20260115.0"
"workerd": "^1.20260213.0"
},
"peerDependenciesMeta": {
"workerd": {
@@ -71,9 +71,9 @@
}
},
"node_modules/@cloudflare/workerd-darwin-64": {
"version": "1.20260212.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260212.0.tgz",
"integrity": "sha512-kLxuYutk88Wlo7edp8mlkN68TgZZ9237SUnuX9kNaD5jcOdblUqiBctMRZeRcPsuoX/3g2t0vS4ga02NBEVRNg==",
"version": "1.20260217.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260217.0.tgz",
"integrity": "sha512-t1KRT0j4gwLntixMoNujv/UaS89Q7+MPRhkklaSup5tNhl3zBZOIlasBUSir69eXetqLZu8sypx3i7zE395XXA==",
"cpu": [
"x64"
],
@@ -88,9 +88,9 @@
}
},
"node_modules/@cloudflare/workerd-darwin-arm64": {
"version": "1.20260212.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260212.0.tgz",
"integrity": "sha512-fqoqQWMA1D0ZzDOD8sp0allREM2M8GHdpxMXQ8EdZpZ70z5bJbJ9Vr4qe35++FNIZJspsDHfTw3Xm/M4ELm/dQ==",
"version": "1.20260217.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260217.0.tgz",
"integrity": "sha512-9pEZ15BmELt0Opy79LTxUvbo55QAI4GnsnsvmgBxaQlc4P0dC8iycBGxbOpegkXnRx/LFj51l2zunfTo0EdATg==",
"cpu": [
"arm64"
],
@@ -105,9 +105,9 @@
}
},
"node_modules/@cloudflare/workerd-linux-64": {
"version": "1.20260212.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260212.0.tgz",
"integrity": "sha512-bCSQoZzDzV5MSh4ueWo1DgmOn4Hf3QBu4Yo3eQFXA2llYFIu/sZgRtkEehw1X2/SY5Sn6O0EMCqxJYRf82Wdeg==",
"version": "1.20260217.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260217.0.tgz",
"integrity": "sha512-IrZfxQ4b/4/RDQCJsyoxKrCR+cEqKl81yZOirMOKoRrDOmTjn4evYXaHoLBh2PjUKY1Imly7ZiC6G1p0xNIOwg==",
"cpu": [
"x64"
],
@@ -122,9 +122,9 @@
}
},
"node_modules/@cloudflare/workerd-linux-arm64": {
"version": "1.20260212.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260212.0.tgz",
"integrity": "sha512-GPvp1iiKQodtbUDi6OmR5I0vD75lawB54tdYGtmypuHC7ZOI2WhBmhb3wCxgnQNOG1z7mhCQrzRCoqrKwYbVWQ==",
"version": "1.20260217.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260217.0.tgz",
"integrity": "sha512-RGU1wq69ym4sFBVWhQeddZrRrG0hJM/SlZ5DwVDga/zBJ3WXxcDsFAgg1dToDfildTde5ySXN7jAasSmWko9rg==",
"cpu": [
"arm64"
],
@@ -139,9 +139,9 @@
}
},
"node_modules/@cloudflare/workerd-windows-64": {
"version": "1.20260212.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260212.0.tgz",
"integrity": "sha512-wHRI218Xn4ndgWJCUHH4Zx0YlU5q/o6OmcxXkcw95tJOsQn4lDrhppioPh4eScxJZALf2X+ODeZcyQTCq5exGw==",
"version": "1.20260217.0",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260217.0.tgz",
"integrity": "sha512-4T65u1321z1Zet9n7liQsSW7g3EXM5SWIT7kJ/uqkEtkPnIzZBIowMQgkvL5W9SpGZks9t3mTQj7hiUia8Gq9Q==",
"cpu": [
"x64"
],
@@ -1346,9 +1346,9 @@
}
},
"node_modules/@sugoidogo/node-file-system-adapter": {
"version": "1.0.8",
"resolved": "https://gitea.sugoidogo.com/api/packages/sugoidogo/npm/%40sugoidogo%2Fnode-file-system-adapter/-/1.0.8/node-file-system-adapter-1.0.8.tgz",
"integrity": "sha512-6eW1oFiZdE2kJ4jmMSvh3S1mFWJCNUbPBGXMwXKqsBef/riqqS0fEUbLe/2jzIV2VKt4fTdnj0xqnfUi58pS0Q==",
"version": "1.2.0",
"resolved": "https://gitea.sugoidogo.com/api/packages/sugoidogo/npm/%40sugoidogo%2Fnode-file-system-adapter/-/1.2.0/node-file-system-adapter-1.2.0.tgz",
"integrity": "sha512-OesOjXwP31yg0iWLOE8IgjW0SPZdxsjXPx0wiK1vztgvXzFxSNDi/jYbmJ7WfHGOlOfQGJg/PGjkICCW6W4MTw==",
"dependencies": {
"mime": "^4.1.0"
}
@@ -1729,16 +1729,16 @@
}
},
"node_modules/miniflare": {
"version": "4.20260212.0",
"resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260212.0.tgz",
"integrity": "sha512-Lgxq83EuR2q/0/DAVOSGXhXS1V7GDB04HVggoPsenQng8sqEDR3hO4FigIw5ZI2Sv2X7kIc30NCzGHJlCFIYWg==",
"version": "4.20260217.0",
"resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260217.0.tgz",
"integrity": "sha512-t2v02Vi9SUiiXoHoxLvsntli7N35e/35PuRAYEqHWtHOdDX3bqQ73dBQ0tI12/8ThCb2by2tVs7qOvgwn6xSBQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@cspotcode/source-map-support": "0.8.1",
"sharp": "^0.34.5",
"undici": "7.18.2",
"workerd": "1.20260212.0",
"workerd": "1.20260217.0",
"ws": "8.18.0",
"youch": "4.1.0-beta.10"
},
@@ -1964,9 +1964,9 @@
"license": "Apache-2.0"
},
"node_modules/workerd": {
"version": "1.20260212.0",
"resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260212.0.tgz",
"integrity": "sha512-4B9BoZUzKSRv3pVZGEPh7OX+Q817hpUqAUtz5O0TxJVqo4OsYJAUA/sY177Q5ha/twjT9KaJt2DtQzE+oyCOzw==",
"version": "1.20260217.0",
"resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260217.0.tgz",
"integrity": "sha512-6jVisS6wB6KbF+F9DVoDUy9p7MON8qZCFSaL8OcDUioMwknsUPFojUISu3/c30ZOZ24D4h7oqaahFc5C6huilw==",
"dev": true,
"hasInstallScript": true,
"license": "Apache-2.0",
@@ -1978,11 +1978,11 @@
"node": ">=16"
},
"optionalDependencies": {
"@cloudflare/workerd-darwin-64": "1.20260212.0",
"@cloudflare/workerd-darwin-arm64": "1.20260212.0",
"@cloudflare/workerd-linux-64": "1.20260212.0",
"@cloudflare/workerd-linux-arm64": "1.20260212.0",
"@cloudflare/workerd-windows-64": "1.20260212.0"
"@cloudflare/workerd-darwin-64": "1.20260217.0",
"@cloudflare/workerd-darwin-arm64": "1.20260217.0",
"@cloudflare/workerd-linux-64": "1.20260217.0",
"@cloudflare/workerd-linux-arm64": "1.20260217.0",
"@cloudflare/workerd-windows-64": "1.20260217.0"
}
},
"node_modules/workerless": {
@@ -1995,20 +1995,20 @@
}
},
"node_modules/wrangler": {
"version": "4.65.0",
"resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.65.0.tgz",
"integrity": "sha512-R+n3o3tlGzLK9I4fGocPReOuvcnjhtOL2aCVKkHMeuEwt9pPbOO4FxJtx/ec5cIUG/otRyJnfQGCAr9DplBVng==",
"version": "4.66.0",
"resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.66.0.tgz",
"integrity": "sha512-b9RVIdKai0BXDuYg0iN0zwVnVbULkvdKGP7Bf1uFY2GhJ/nzDGqgwQbCwgDIOhmaBC8ynhk/p22M2jc8tJy+dQ==",
"dev": true,
"license": "MIT OR Apache-2.0",
"dependencies": {
"@cloudflare/kv-asset-handler": "0.4.2",
"@cloudflare/unenv-preset": "2.12.1",
"@cloudflare/unenv-preset": "2.13.0",
"blake3-wasm": "2.1.5",
"esbuild": "0.27.3",
"miniflare": "4.20260212.0",
"miniflare": "4.20260217.0",
"path-to-regexp": "6.3.0",
"unenv": "2.0.0-rc.24",
"workerd": "1.20260212.0"
"workerd": "1.20260217.0"
},
"bin": {
"wrangler": "bin/wrangler.js",
@@ -2021,7 +2021,7 @@
"fsevents": "~2.3.2"
},
"peerDependencies": {
"@cloudflare/workers-types": "^4.20260212.0"
"@cloudflare/workers-types": "^4.20260217.0"
},
"peerDependenciesMeta": {
"@cloudflare/workers-types": {
+10 -2
View File
@@ -2,5 +2,13 @@
"workspaces": [
"lib",
"cli"
]
}
],
"scripts": {
"pretest": "npx -w lib tsc",
"test": "npm -w cli test",
"precompile": "npx -w lib tsc",
"compile": "npm -w cli run compile",
"publish":"npm -w lib publish",
"docs": "npx -w lib typedoc src/index.ts"
}
}