Skip to content

Commit b8891d3

Browse files
committed
move pack detection to seperate exported function
1 parent 7e9593e commit b8891d3

File tree

4 files changed

+56
-59
lines changed

4 files changed

+56
-59
lines changed

src/cli/index.ts

+2-46
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,12 @@
11
import { isAxiosError } from 'axios'
22
import chalk from 'chalk'
3-
import { existsSync, readFileSync } from 'fs'
4-
import CurseforgeService, { CurseforgeOptions, validateCurseforgeOptions } from '../curseforge.js'
5-
import PackwizService, { PackwizOptions, validatePackwizOptions } from '../packwiz.js'
63
import WebService, { WebOptions } from '../web.js'
7-
import parseCliOptions, { CliOptions, ReleaseOptions } from './options.js'
8-
9-
function validateRelease<T>(options: T & Partial<ReleaseOptions>): asserts options is T & ReleaseOptions {
10-
if (!options.version) throw new Error('Version missing')
11-
if (!options.changelog) throw new Error('Changelog missing')
12-
if (!options.releaseType) throw new Error('Release-Type missing')
13-
}
4+
import parseCliOptions from './options.js'
145

156
function validateWebOptions<T>(options: T & Partial<WebOptions>): asserts options is T & WebOptions {
167
if (!options.webToken) throw new Error('Web Token missing')
178
}
189

19-
function fromMinecraftInstance(options: CurseforgeOptions) {
20-
const file = options.curseforgePackFile ?? 'minecraftinstance.json'
21-
if (!existsSync(file)) throw new Error(`curseforge manifest file '${file}' does not exist`)
22-
23-
const curseforge = new CurseforgeService(options)
24-
25-
const parsed = JSON.parse(readFileSync(file).toString())
26-
27-
return curseforge.importCurseforgePack(parsed)
28-
}
29-
30-
function fromPackwiz(options: CliOptions & PackwizOptions) {
31-
const service = new PackwizService(options)
32-
return service.importPackwizPack()
33-
}
34-
35-
async function parsePack(options: CliOptions) {
36-
if (options.curseforgePackFile || existsSync('minecraftinstance.json')) {
37-
validateCurseforgeOptions(options)
38-
return fromMinecraftInstance(options)
39-
}
40-
41-
if (options.packwizFile || existsSync('pack.toml')) {
42-
validatePackwizOptions(options)
43-
return fromPackwiz(options)
44-
}
45-
46-
throw new Error('No pack metadata file auto-detected')
47-
}
48-
4910
const options = parseCliOptions()
5011

5112
async function run() {
@@ -57,12 +18,7 @@ async function run() {
5718
}
5819

5920
if (options.params.includes('release')) {
60-
const { mods, version } = await parsePack(options)
61-
62-
if (!options.version) options.version = version
63-
64-
validateRelease(options)
65-
await web.createRelease(mods, options)
21+
await web.parseAndCreateRelease()
6622
}
6723
}
6824

src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export { ReleaseOptions } from './cli/options.js'
22
export { CurseforgeOptions, default as CurseforgeService } from './curseforge.js'
3+
export { parsePack } from './pack.js'
34
export { WebOptions, default as WebService } from './web.js'

src/pack.ts

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { existsSync, readFileSync } from 'fs'
2+
import { CliOptions } from './cli/options.js'
3+
import CurseforgeService, { CurseforgeOptions, validateCurseforgeOptions } from './curseforge.js'
4+
import PackwizService, { PackwizOptions, validatePackwizOptions } from './packwiz.js'
5+
6+
function fromMinecraftInstance(options: CurseforgeOptions) {
7+
const file = options.curseforgePackFile ?? 'minecraftinstance.json'
8+
if (!existsSync(file)) throw new Error(`curseforge manifest file '${file}' does not exist`)
9+
10+
const curseforge = new CurseforgeService(options)
11+
12+
const parsed = JSON.parse(readFileSync(file).toString())
13+
14+
return curseforge.importCurseforgePack(parsed)
15+
}
16+
17+
function fromPackwiz(options: CliOptions & PackwizOptions) {
18+
const service = new PackwizService(options)
19+
return service.importPackwizPack()
20+
}
21+
22+
export async function parsePack(options: CliOptions) {
23+
if (options.curseforgePackFile || existsSync('minecraftinstance.json')) {
24+
validateCurseforgeOptions(options)
25+
return fromMinecraftInstance(options)
26+
}
27+
28+
if (options.packwizFile || existsSync('pack.toml')) {
29+
validatePackwizOptions(options)
30+
return fromPackwiz(options)
31+
}
32+
33+
throw new Error('No pack metadata file auto-detected')
34+
}

src/web.ts

+19-13
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import FormData from 'form-data'
44
import { createReadStream, existsSync, readdirSync, readFileSync } from 'fs'
55
import { basename, extname, join } from 'path'
66
import yaml from 'yaml'
7-
import { ReleaseOptions } from './cli/options.js'
7+
import { CliOptions, ReleaseOptions } from './cli/options.js'
88
import { IMod } from './models/index.js'
9+
import { parsePack } from './pack.js'
910
import type { PackData, Release, WebData } from './types.js'
1011

1112
export interface WebOptions {
@@ -17,12 +18,18 @@ export interface WebOptions {
1718
export const defaultWebDir = 'web'
1819
export const defaultApiUrl = 'https://packs.macarena.ceo/api'
1920

21+
function validateRelease<T>(options: T & Partial<ReleaseOptions>): asserts options is T & ReleaseOptions {
22+
if (!options.version) throw new Error('Version missing')
23+
if (!options.changelog) throw new Error('Changelog missing')
24+
if (!options.releaseType) throw new Error('Release-Type missing')
25+
}
26+
2027
export default class WebService {
2128
private readonly api: AxiosInstance
2229
private readonly dir: string
2330
private readonly baseUrl: string
2431

25-
constructor(options: Readonly<WebOptions>) {
32+
constructor(private readonly options: Readonly<CliOptions & WebOptions>) {
2633
if (!options.webToken) throw new Error('Web Token missing')
2734

2835
this.dir = options.webDir ?? defaultWebDir
@@ -116,6 +123,16 @@ export default class WebService {
116123
})
117124
}
118125

126+
async parseAndCreateRelease() {
127+
const options = { ...this.options }
128+
const { mods, version } = await parsePack(options)
129+
130+
if (!options.version) options.version = version
131+
validateRelease(options)
132+
133+
await this.createRelease(mods, options)
134+
}
135+
119136
async createRelease(mods: IMod[], release: ReleaseOptions) {
120137
const releaseData: Release = {
121138
date: new Date().toISOString(),
@@ -139,14 +156,3 @@ export function readPackData(dir: string): Partial<PackData> | null {
139156
if (!existsSync(file)) return null
140157
return yaml.parse(readFileSync(file).toString())
141158
}
142-
143-
export async function getPackName(options: Partial<WebOptions>) {
144-
if (options.webToken) {
145-
const service = new WebService(options as WebOptions)
146-
const data = await service.getWebData()
147-
return data.name
148-
} else {
149-
const packData = readPackData(options.webDir ?? 'web')
150-
return packData?.name
151-
}
152-
}

0 commit comments

Comments
 (0)