Skip to content

Commit

Permalink
various bug fixes & correct package exports
Browse files Browse the repository at this point in the history
  • Loading branch information
PssbleTrngle committed Oct 16, 2023
1 parent c75e278 commit a553de7
Show file tree
Hide file tree
Showing 13 changed files with 156 additions and 124 deletions.
163 changes: 77 additions & 86 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,88 +1,79 @@
{
"name": "@pssbletrngle/data-modifier",
"version": "0.0.0-dev",
"description": "Data Modifier",
"main": "dist/index.js",
"exports": {
".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
},
"./parser": {
"types": "./dist/parser/index.d.ts",
"default": "./dist/parser/index.js"
},
"./parser/create": {
"types": "./dist/parser/create.d.ts",
"default": "./dist/parser/create.js"
},
"./parser/thermal": {
"types": "./dist/parser/thermal.d.ts",
"default": "./dist/parser/thermal.js"
},
"./parser/farmersdelight": {
"types": "./dist/parser/farmersdelight.d.ts",
"default": "./dist/parser/farmersdelight.js"
},
"./parser/adAstra": {
"types": "./dist/parser/adAstra.d.ts",
"default": "./dist/parser/adAstra.js"
},
"./parser/roots": {
"types": "./dist/parser/roots.d.ts",
"default": "./dist/parser/roots.js"
}
},
"types": "./dist/index.d.ts",
"files": [
"dist"
],
"type": "module",
"packageManager": "[email protected]",
"scripts": {
"build": "tsc",
"lint": "eslint \"{src,test}/**/*.ts\"",
"test": "cross-env NODE_OPTIONS=\"--experimental-vm-modules --no-warnings\" jest",
"test:ci": "pnpm run lint && pnpm run test --coverage"
},
"repository": {
"type": "git",
"url": "https://github.com/PssbleTrngle/DataModifier.git"
},
"publishConfig": {
"registry": "https://npm.pkg.github.com"
},
"license": "ISC",
"bugs": {
"url": "https://github.com/PssbleTrngle/DataModifier/issues"
},
"homepage": "https://github.com/PssbleTrngle/DataModifier#readme",
"devDependencies": {
"@types/jest": "^29.5.5",
"@types/lodash-es": "^4.17.9",
"@types/node": "^17.0.45",
"@typescript-eslint/eslint-plugin": "^6.7.4",
"@typescript-eslint/parser": "^6.7.4",
"cross-env": "^7.0.3",
"eslint": "^8.23.0",
"eslint-plugin-jest": "^27.4.2",
"eslint-plugin-require-extensions": "^0.1.3",
"jest": "^29.7.0",
"ts-jest": "^29.1.1"
},
"dependencies": {
"@pssbletrngle/pack-resolver": "1.2.2",
"@pssbletrngle/resource-merger": "1.2.4",
"@types/minimatch": "^3.0.5",
"@types/prettier": "^2.7.0",
"chalk": "^5.0.1",
"json5": "^2.2.3",
"lodash-es": "^4.17.21",
"minimatch": "^5.1.0",
"node-stream-zip": "^1.15.0",
"prettier": "^2.7.1",
"prismarine-nbt": "^2.2.1",
"typescript": "^4.8.2",
"zod": "^3.22.4"
}
"name": "@pssbletrngle/data-modifier",
"version": "0.0.0-dev",
"description": "Data Modifier",
"main": "dist/index.js",
"exports": {
".": "./dist/index.js",
"./parser": "./dist/parser/index.js",
"./parser/botania": "./dist/parser/botania.js",
"./parser/create": "./dist/parser/create.js",
"./parser/thermal": "./dist/parser/thermal.js",
"./parser/farmersdelight": "./dist/parser/farmersdelight.js",
"./parser/adAstra": "./dist/parser/adAstra.js",
"./parser/roots": "./dist/parser/roots.js"
},
"typesVersions": {
"*": {
"parser": ["./dist/parser/index.d.ts"],
"parser/botania": ["./dist/parser/botania.d.ts"],
"parser/create": ["./dist/parser/create.d.ts"],
"parser/thermal": ["./dist/parser/thermal.d.ts"],
"parser/farmersdelight": ["./dist/parser/farmersdelight.d.ts"],
"parser/adAstra": ["./dist/parser/adAstra.d.ts"],
"parser/roots": ["./dist/parser/roots.d.ts"]
}
},
"types": "./dist/index.d.ts",
"files": [
"dist"
],
"type": "module",
"packageManager": "[email protected]",
"scripts": {
"build": "tsc",
"lint": "eslint \"{src,test}/**/*.ts\"",
"test": "cross-env NODE_OPTIONS=\"--experimental-vm-modules --no-warnings\" jest",
"test:ci": "pnpm run lint && pnpm run test --coverage"
},
"repository": {
"type": "git",
"url": "https://github.com/PssbleTrngle/DataModifier.git"
},
"publishConfig": {
"registry": "https://npm.pkg.github.com"
},
"license": "ISC",
"bugs": {
"url": "https://github.com/PssbleTrngle/DataModifier/issues"
},
"homepage": "https://github.com/PssbleTrngle/DataModifier#readme",
"devDependencies": {
"@types/jest": "^29.5.5",
"@types/lodash-es": "^4.17.9",
"@types/node": "^17.0.45",
"@typescript-eslint/eslint-plugin": "^6.7.4",
"@typescript-eslint/parser": "^6.7.4",
"cross-env": "^7.0.3",
"eslint": "^8.23.0",
"eslint-plugin-jest": "^27.4.2",
"eslint-plugin-require-extensions": "^0.1.3",
"jest": "^29.7.0",
"ts-jest": "^29.1.1"
},
"dependencies": {
"@pssbletrngle/pack-resolver": "1.2.2",
"@pssbletrngle/resource-merger": "1.2.4",
"@types/minimatch": "^3.0.5",
"@types/prettier": "^2.7.0",
"chalk": "^5.0.1",
"json5": "^2.2.3",
"lodash-es": "^4.17.21",
"minimatch": "^5.1.0",
"node-stream-zip": "^1.15.0",
"prettier": "^2.7.1",
"prismarine-nbt": "^2.2.1",
"typescript": "^4.8.2",
"zod": "^3.22.4"
}
}
2 changes: 1 addition & 1 deletion src/emit/ruled.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export default class RuledEmitter<TEntry, TRule extends Rule<TEntry>> {

const path = this.pathProvider(id)

const rules = this.rules.filter(it => it.matches(id, recipe, this.logger))
const rules = this.rules.filter(it => it.matches(id, recipe, this.logger.group(path)))
if (rules.length === 0) return

const modified = rules.reduce<TEntry | null>((previous, rule) => previous && rule.modify(previous), recipe)
Expand Down
13 changes: 10 additions & 3 deletions src/error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { ZodError } from 'zod'

export class IllegalShapeError extends Error {
constructor(message: string, readonly input?: unknown) {
super(input ? `${message}: ${JSON.stringify(input)}` : message)
super(message)
}
}

Expand All @@ -12,12 +12,19 @@ export function tryCatching<T>(logger: Logger | undefined, run: () => T): T | nu
return run()
} catch (error) {
if (error instanceof IllegalShapeError) {
logger?.warn((error as Error).message)
if (error.input) logger?.warn(error.message, error.input)
else logger?.warn(error.message)
return null
}

if (error instanceof ZodError) {
logger?.warn(`unknown shape`, error)
const message = error.errors
.map(it => {
if (it.path) return `${it.path.join('.')}: ${it.message}`
else return it.message
})
.join(', ')
logger?.warn(`unknown shape: ${message}`)
return null
}

Expand Down
8 changes: 5 additions & 3 deletions src/loader/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export abstract class JsonLoader<T> implements RegistryProvider<T> {
return fromJson(content)
} catch (error) {
if (error instanceof SyntaxError) {
logger.warn(`unable to parse json: ${error.message}`, content)
logger.warn(`unable to parse json: ${error.message}`)
return null
}
throw error
Expand All @@ -40,10 +40,12 @@ export abstract class JsonLoader<T> implements RegistryProvider<T> {
const { namespace, rest } = match.groups
const id: Id = { namespace, path: rest }

const json = this.tryParseJson(logger.group(path), content.toString())
const grouped = logger.group(path)

const json = this.tryParseJson(grouped, content.toString())
if (!json) return false

const parsed = tryCatching(logger, () => this.parse(logger, json, id))
const parsed = tryCatching(grouped, () => this.parse(grouped, json, id))
if (!parsed) return false

this.registry.set(id, parsed)
Expand Down
13 changes: 5 additions & 8 deletions src/loader/lang.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
import { Id } from '../common/id.js'
import { tryCatching } from '../error.js'
import { JsonLoader } from './index.js'
import { Logger } from '../logger.js'
import { LangDefinition, LangSchema } from '../schema/lang.js'

export default class LangLoader extends JsonLoader<LangDefinition> {
protected parse(logger: Logger, json: unknown, id: Id): LangDefinition | null {
return tryCatching(logger.group(`unable to parse lang file ${id.path}`), () => {
const parsed = LangSchema.parse(json)
const existing = this.registry.get(id)
if (!existing) return parsed
return { ...existing, ...parsed }
})
protected parse(_: Logger, json: unknown, id: Id): LangDefinition | null {
const parsed = LangSchema.parse(json)
const existing = this.registry.get(id)
if (!existing) return parsed
return { ...existing, ...parsed }
}
}
15 changes: 6 additions & 9 deletions src/loader/recipe.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import RootRitualRecipeParser from '../parser/recipe/roots/ritual.js'
import { ShapelessRecipeParser } from '../parser/index.js'
import { Logger } from '../logger.js'
import { IllegalShapeError } from '../error.js'
import IgnoredRecipe from '../parser/recipe/ignored.js'

export interface RecipeLoaderAccessor {
unknownRecipeTypes(): RecipeDefinition[]
Expand Down Expand Up @@ -219,15 +220,11 @@ export default class RecipeLoader extends JsonLoader<Recipe> implements RecipeLo
return null
}

try {
return parser.create(definition, it => {
const parsed = this.parse(logger, it)
if (parsed) return parsed
throw new IllegalShapeError('unable to parse sub-recipe', it)
}) as TRecipe
} catch (error) {
throw new IllegalShapeError(`Failed to parse recipe with type '${definition.type}'`, error)
}
return parser.create(definition, it => {
const parsed = this.parse(logger, it)
if (parsed) return parsed
return new IgnoredRecipe(it)
}) as TRecipe
}

registerParser(recipeType: string, parser: RecipeParser<RecipeDefinition, Recipe>) {
Expand Down
2 changes: 1 addition & 1 deletion src/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export function wrapLogMethods(logMethods: LogMethods): Logger {
}

function grouped(prefix: string | undefined, message: Logable) {
if (prefix) return `${prefix}: ${message}`
if (prefix) return `${prefix} -> ${message}`
return ` ${message}`
}

Expand Down
12 changes: 11 additions & 1 deletion src/parser/botania.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,17 @@ export {
NbtWrapperRecipe,
default as NbtWrapperRecipeParser,
} from './recipe/botania/nbtWrapper.js'
export { OrechidRecipeDefinition, OrechidRecipe, default as OrechidRecipeParser } from './recipe/botania/orechid.js'
export {
OrechidRecipeDefinition,
OrechidRecipe,
default as OrechidRecipeParser,
createBlockInput,
createBlockOutput,
fromBlockInput,
fromBlockOutput,
BlockInput,
BlockOutput,
} from './recipe/botania/orechid.js'
export {
PureDaisyRecipeDefinition,
PureDaisyRecipe,
Expand Down
22 changes: 22 additions & 0 deletions src/parser/recipe/ignored.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { Recipe } from './index.js'
import { IngredientInput } from '../../common/ingredient.js'
import { ResultInput } from '../../common/result.js'
import { RecipeDefinition } from '../../schema/recipe.js'

export default class IgnoredRecipe<T extends RecipeDefinition> extends Recipe<T> {
getIngredients(): IngredientInput[] {
return []
}

getResults(): ResultInput[] {
return []
}

replaceIngredient(): Recipe {
return new IgnoredRecipe(this.definition)
}

replaceResult(): Recipe {
return new IgnoredRecipe(this.definition)
}
}
4 changes: 2 additions & 2 deletions src/rule/lootTable.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Rule, { Modifier } from './index.js'
import { extendLootEntry, LootEntryBase, LootTable } from '../schema/loot.js'
import { encodeId, Id } from '../common/id.js'
import { Id } from '../common/id.js'
import { Logger } from '../logger.js'
import { IngredientInput, Predicate } from '../common/ingredient.js'

Expand Down Expand Up @@ -36,7 +36,7 @@ export default class LootTableRule extends Rule<LootTable> {
}

matches(id: Id, table: LootTable, logger: Logger): boolean {
const prefixed = logger.group(encodeId(id))
const prefixed = logger
return this.idTests.every(test => test(id, prefixed)) && this.outputTests.every(test => hasOutput(test, table))
}
}
11 changes: 5 additions & 6 deletions src/rule/recipe.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { IngredientInput, Predicate } from '../common/ingredient.js'
import { Recipe } from '../parser/recipe/index.js'
import { createId, encodeId, Id } from '../common/id.js'
import { createId, Id } from '../common/id.js'
import { Logger } from '../logger.js'
import Rule, { Modifier } from './index.js'

Expand All @@ -16,13 +16,12 @@ export default class RecipeRule extends Rule<Recipe> {
}

matches(id: Id, recipe: Recipe, logger: Logger): boolean {
const prefixed = logger.group(encodeId(id))
const type = createId(recipe.toJSON().type)
return (
this.idsTests.every(test => test(id, prefixed)) &&
this.typeTests.every(test => test(type, prefixed)) &&
this.ingredientTests.every(test => recipe.getIngredients().some(it => test(it, prefixed))) &&
this.resultTests.every(test => recipe.getResults().some(it => test(it, prefixed)))
this.idsTests.every(test => test(id, logger)) &&
this.typeTests.every(test => test(type, logger)) &&
this.ingredientTests.every(test => recipe.getIngredients().some(it => test(it, logger))) &&
this.resultTests.every(test => recipe.getResults().some(it => test(it, logger)))
)
}
}
9 changes: 8 additions & 1 deletion src/textHelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,14 @@ import { format } from 'prettier'
import json from 'json5'

export function fromJson(input: string) {
return json.parse(input.replaceAll('\r\n', ''))
try {
return json.parse(input)
} catch (e) {
if (e instanceof SyntaxError) {
return json.parse(input.replaceAll('\r\n', ''))
}
throw e
}
}

export function toJson(input: unknown) {
Expand Down
Loading

0 comments on commit a553de7

Please sign in to comment.