Skip to content

Commit 6f2b0cb

Browse files
committed
🛠️ Fix #230
1 parent 7cfc4ca commit 6f2b0cb

File tree

5 files changed

+131
-31
lines changed

5 files changed

+131
-31
lines changed

src/components/blueprintSettingsDialog.svelte

Lines changed: 91 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
<script lang="ts" context="module">
22
import { Valuable } from '../util/stores'
33
import { translate } from '../util/translation'
4-
import { resolveEnvVariables } from '../util/misc'
54
import { MINECRAFT_REGISTRY } from '../systems/minecraft/registryManager'
65
76
import Checkbox from './dialogItems/checkbox.svelte'
@@ -19,6 +18,7 @@
1918
import KoFiImage from '../assets/kofi_s_tag_white.webp'
2019
2120
import fontUrl from '../assets/MinecraftFull.ttf'
21+
import { resolvePath } from '../util/fileUtil'
2222
if (![...document.fonts.keys()].some(v => v.family === 'MinecraftFull')) {
2323
void new FontFace('MinecraftFull', fontUrl, {}).load().then(font => {
2424
document.fonts.add(font)
@@ -163,7 +163,19 @@
163163
}
164164
165165
function dataPackFolderChecker(value: string): { type: string; message: string } {
166-
value = resolveEnvVariables(value)
166+
let path: string
167+
try {
168+
path = resolvePath(value)
169+
} catch (e) {
170+
console.error(e)
171+
return {
172+
type: 'error',
173+
message: translate(
174+
'dialog.blueprint_settings.data_pack.error.folder_does_not_exist',
175+
),
176+
}
177+
}
178+
console.log(path)
167179
switch (true) {
168180
case value === '':
169181
return {
@@ -172,26 +184,26 @@
172184
'dialog.blueprint_settings.data_pack.error.no_folder_selected',
173185
),
174186
}
175-
case !fs.existsSync(value):
187+
case !fs.existsSync(path):
176188
return {
177189
type: 'error',
178190
message: translate(
179191
'dialog.blueprint_settings.data_pack.error.folder_does_not_exist',
180192
),
181193
}
182-
case !fs.statSync(value).isDirectory():
194+
case !fs.statSync(path).isDirectory():
183195
return {
184196
type: 'error',
185197
message: translate('dialog.blueprint_settings.data_pack.error.not_a_folder'),
186198
}
187-
case !fs.existsSync(PathModule.join(value, 'pack.mcmeta')):
199+
case !fs.existsSync(PathModule.join(path, 'pack.mcmeta')):
188200
return {
189201
type: 'error',
190202
message: translate(
191203
'dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta',
192204
),
193205
}
194-
case !fs.existsSync(PathModule.join(value, 'data')):
206+
case !fs.existsSync(PathModule.join(path, 'data')):
195207
return {
196208
type: 'error',
197209
message: translate(
@@ -204,6 +216,19 @@
204216
}
205217
206218
function resourcePackFolderChecker(value: string): { type: string; message: string } {
219+
let path: string
220+
try {
221+
path = resolvePath(value)
222+
} catch (e) {
223+
console.error(e)
224+
return {
225+
type: 'error',
226+
message: translate(
227+
'dialog.blueprint_settings.resource_pack.error.folder_does_not_exist',
228+
),
229+
}
230+
}
231+
console.log(path)
207232
switch (true) {
208233
case value === '':
209234
return {
@@ -212,28 +237,28 @@
212237
'dialog.blueprint_settings.resource_pack.error.no_folder_selected',
213238
),
214239
}
215-
case !fs.existsSync(value):
240+
case !fs.existsSync(path):
216241
return {
217242
type: 'error',
218243
message: translate(
219244
'dialog.blueprint_settings.resource_pack.error.folder_does_not_exist',
220245
),
221246
}
222-
case !fs.statSync(value).isDirectory():
247+
case !fs.statSync(path).isDirectory():
223248
return {
224249
type: 'error',
225250
message: translate(
226251
'dialog.blueprint_settings.resource_pack.error.not_a_folder',
227252
),
228253
}
229-
case !fs.existsSync(PathModule.join(value, 'pack.mcmeta')):
254+
case !fs.existsSync(PathModule.join(path, 'pack.mcmeta')):
230255
return {
231256
type: 'error',
232257
message: translate(
233258
'dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta',
234259
),
235260
}
236-
case !fs.existsSync(PathModule.join(value, 'assets')):
261+
case !fs.existsSync(PathModule.join(path, 'assets')):
237262
return {
238263
type: 'error',
239264
message: translate(
@@ -246,6 +271,19 @@
246271
}
247272
248273
function advancedResourcePackFileChecker(value: string): { type: string; message: string } {
274+
let path: string
275+
try {
276+
path = resolvePath(value)
277+
} catch (e) {
278+
console.error(e)
279+
return {
280+
type: 'error',
281+
message: translate(
282+
'dialog.blueprint_settings.advanced_resource_pack_file.error.file_does_not_exist',
283+
),
284+
}
285+
}
286+
console.log(path)
249287
switch (true) {
250288
case value === '':
251289
return {
@@ -254,14 +292,14 @@
254292
'dialog.blueprint_settings.advanced_resource_pack_file.error.no_file_selected',
255293
),
256294
}
257-
case !fs.existsSync(value):
295+
case !fs.existsSync(path):
258296
return {
259297
type: 'error',
260298
message: translate(
261299
'dialog.blueprint_settings.advanced_resource_pack_file.error.file_does_not_exist',
262300
),
263301
}
264-
case !fs.statSync(value).isFile():
302+
case !fs.statSync(path).isFile():
265303
return {
266304
type: 'error',
267305
message: translate(
@@ -274,6 +312,17 @@
274312
}
275313
276314
function jsonFileChecker(value: string): { type: string; message: string } {
315+
let path: string
316+
try {
317+
path = resolvePath(value)
318+
} catch (e) {
319+
console.error(e)
320+
return {
321+
type: 'error',
322+
message: translate('dialog.blueprint_settings.json_file.error.file_does_not_exist'),
323+
}
324+
}
325+
console.log(path)
277326
switch (true) {
278327
case value === '':
279328
return {
@@ -282,7 +331,7 @@
282331
'dialog.blueprint_settings.json_file.error.no_file_selected',
283332
),
284333
}
285-
case fs.existsSync(value) && !fs.statSync(value).isFile():
334+
case fs.existsSync(path) && !fs.statSync(path).isFile():
286335
return {
287336
type: 'error',
288337
message: translate('dialog.blueprint_settings.json_file.error.not_a_file'),
@@ -293,6 +342,19 @@
293342
}
294343
295344
function advancedResourcePackFolderChecker(value: string): { type: string; message: string } {
345+
let path: string
346+
try {
347+
path = resolvePath(value)
348+
} catch (e) {
349+
console.error(e)
350+
return {
351+
type: 'error',
352+
message: translate(
353+
'dialog.blueprint_settings.advanced_resource_pack_folder.error.folder_does_not_exist',
354+
),
355+
}
356+
}
357+
console.log(path)
296358
switch (true) {
297359
case value === '':
298360
return {
@@ -301,14 +363,14 @@
301363
'dialog.blueprint_settings.advanced_resource_pack_folder.error.no_folder_selected',
302364
),
303365
}
304-
case !fs.existsSync(value):
366+
case !fs.existsSync(path):
305367
return {
306368
type: 'error',
307369
message: translate(
308370
'dialog.blueprint_settings.advanced_resource_pack_folder.error.folder_does_not_exist',
309371
),
310372
}
311-
case !fs.statSync(value).isDirectory():
373+
case !fs.statSync(path).isDirectory():
312374
return {
313375
type: 'error',
314376
message: translate(
@@ -321,6 +383,19 @@
321383
}
322384
323385
function zipChecker(value: string): { type: string; message: string } {
386+
let path: string
387+
try {
388+
path = resolvePath(value)
389+
} catch (e) {
390+
console.error(e)
391+
return {
392+
type: 'error',
393+
message: translate(
394+
'dialog.blueprint_settings.data_pack_zip.error.file_does_not_exist',
395+
),
396+
}
397+
}
398+
console.log(path)
324399
switch (true) {
325400
case value === '':
326401
return {
@@ -329,7 +404,7 @@
329404
'dialog.blueprint_settings.resource_pack_zip.error.no_file_selected',
330405
),
331406
}
332-
case fs.existsSync(value) && !fs.statSync(value).isFile():
407+
case fs.existsSync(path) && !fs.statSync(path).isFile():
333408
return {
334409
type: 'error',
335410
message: translate(

src/systems/exporter.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { blueprintSettingErrors } from '../blueprintSettings'
33
import { openBlueprintSettingsDialog } from '../interface/blueprintSettingsDialog'
44
import { PROGRESS_DESCRIPTION, openExportProgressDialog } from '../interface/exportProgressDialog'
55
import { openUnexpectedErrorDialog } from '../interface/unexpectedErrorDialog'
6-
import { resolveEnvVariables } from '../util/misc'
6+
import { resolvePath } from '../util/fileUtil'
77
import { translate } from '../util/translation'
88
import { Variant } from '../variants'
99
import { hashAnimations, renderProjectAnimations } from './animationRenderer'
@@ -26,8 +26,8 @@ async function actuallyExportProject(forceSave = true) {
2626

2727
let textureExportFolder: string, modelExportFolder: string, displayItemPath: string
2828

29-
const resourcePackFolder = resolveEnvVariables(aj.resource_pack)
30-
const dataPackFolder = resolveEnvVariables(aj.data_pack)
29+
const resourcePackFolder = resolvePath(aj.resource_pack)
30+
const dataPackFolder = resolvePath(aj.data_pack)
3131

3232
if (aj.enable_plugin_mode) {
3333
modelExportFolder = PathModule.join(

src/util/fileUtil.ts

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,39 @@ export function isJsonPath(path: string): boolean {
77
}
88

99
export function isFunctionTagPath(path: string): boolean {
10-
return path.endsWith('.json') && path.includes(`tags${PathModule.sep}function`)
10+
return (
11+
path.endsWith('.json') &&
12+
(path.includes(`tags\\function`) || path.includes(`tags/function`))
13+
)
14+
}
15+
16+
export function resolveEnvVariables(path: string) {
17+
return path.replace(/%([^%]+)%/g, function (_, key: string) {
18+
if (!process.env[key]) {
19+
throw new Error('Environment variable ' + key + ' does not exist.')
20+
}
21+
return process.env[key]!
22+
})
23+
}
24+
25+
export function isRelativePath(path: string) {
26+
return path.startsWith('./') || path.startsWith('../')
27+
}
28+
29+
export function resolveRelativePath(path: string) {
30+
if (!Project?.save_path) return
31+
const saveFolder = PathModule.dirname(Project.save_path)
32+
return PathModule.resolve(saveFolder, path)
33+
}
34+
35+
export function resolvePath(path: string): string {
36+
if (isRelativePath(path)) {
37+
const newPath = resolveRelativePath(path)
38+
if (!newPath) {
39+
throw new Error(`Failed to resolve relative path '${path}'`)
40+
}
41+
path = newPath
42+
}
43+
44+
return normalizePath(resolveEnvVariables(path))
1145
}

src/util/misc.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,6 @@ export function roundToNth(n: number, x: number) {
3838
return Math.round(n * x) / x
3939
}
4040

41-
export function resolveEnvVariables(path: string) {
42-
return path.replace(/%([^%]+)%/g, function (_, key: string) {
43-
if (!process.env[key]) {
44-
throw new Error('Environment variable ' + key + ' does not exist.')
45-
}
46-
return process.env[key]!
47-
})
48-
}
49-
5041
export function floatToHex(n: number) {
5142
return Number((255 * n).toFixed(0))
5243
.toString(16)

test_blueprints/armor_stand.ajblueprint

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
"display_item": "minecraft:white_dye",
1818
"custom_model_data_offset": 0,
1919
"enable_advanced_resource_pack_settings": false,
20-
"resource_pack": "C:\\Users\\SnaveSutit\\AppData\\Roaming\\com.modrinth.theseus\\profiles\\Animated Java Dev\\resourcepacks\\resourcepack",
20+
"resource_pack": "../dist/resourcepack",
2121
"display_item_path": "",
2222
"model_folder": "",
2323
"texture_folder": "",
2424
"enable_advanced_data_pack_settings": false,
25-
"data_pack": "C:\\Users\\SnaveSutit\\AppData\\Roaming\\com.modrinth.theseus\\profiles\\Animated Java Dev\\saves\\Animated Java Dev\\datapacks\\datapack",
25+
"data_pack": "../dist/datapack",
2626
"summon_commands": "",
2727
"interpolation_duration": 1,
2828
"teleportation_duration": 1,

0 commit comments

Comments
 (0)