@ianlucas/cs2-lib-inspect 5.0.0 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants.d.ts +16 -0
- package/dist/constants.js +42 -0
- package/dist/constants.js.map +1 -0
- package/dist/generate-inspect-link.d.ts +2 -0
- package/dist/generate-inspect-link.js +85 -0
- package/dist/generate-inspect-link.js.map +1 -0
- package/dist/index.d.ts +5 -17
- package/dist/index.js +4 -118
- package/dist/index.js.map +1 -1
- package/dist/parse-csfloat-item-info.d.ts +40 -0
- package/dist/parse-csfloat-item-info.js +20 -0
- package/dist/parse-csfloat-item-info.js.map +1 -0
- package/dist/parse-gc-inventory-item.d.ts +23 -0
- package/dist/parse-gc-inventory-item.js +91 -0
- package/dist/parse-gc-inventory-item.js.map +1 -0
- package/dist/parse-inspect-link.d.ts +4 -0
- package/dist/parse-inspect-link.js +64 -0
- package/dist/parse-inspect-link.js.map +1 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.js +20 -0
- package/dist/utils.js.map +1 -0
- package/package.json +24 -9
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type CS2ItemTypeValues } from "@ianlucas/cs2-lib";
|
|
2
|
+
export declare const CS2PreviewRarity: {
|
|
3
|
+
"#ded6cc": number;
|
|
4
|
+
"#b0c3d9": number;
|
|
5
|
+
"#5e98d9": number;
|
|
6
|
+
"#4b69ff": number;
|
|
7
|
+
"#8847ff": number;
|
|
8
|
+
"#d32ce6": number;
|
|
9
|
+
"#eb4b4b": number;
|
|
10
|
+
"#e4ae39": number;
|
|
11
|
+
};
|
|
12
|
+
export declare const CS2_PREVIEW_HAS_STICKERS: CS2ItemTypeValues[];
|
|
13
|
+
export declare const CS2_PREVIEW_INSPECTABLE_ITEMS: CS2ItemTypeValues[];
|
|
14
|
+
export declare const CS2_PREVIEW_ATTRIBUTELESS_ITEMS: CS2ItemTypeValues[];
|
|
15
|
+
export declare const CS2_PREVIEW_URL = "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20";
|
|
16
|
+
export declare const CS2_PREVIEW_COMMAND = "csgo_econ_action_preview ";
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) candyboyz, Ian Lucas. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { CS2ItemType, CS2RarityColor } from "@ianlucas/cs2-lib";
|
|
6
|
+
export const CS2PreviewRarity = {
|
|
7
|
+
[CS2RarityColor.Default]: 0,
|
|
8
|
+
[CS2RarityColor.Common]: 1,
|
|
9
|
+
[CS2RarityColor.Uncommon]: 2,
|
|
10
|
+
[CS2RarityColor.Rare]: 3,
|
|
11
|
+
[CS2RarityColor.Mythical]: 4,
|
|
12
|
+
[CS2RarityColor.Legendary]: 5,
|
|
13
|
+
[CS2RarityColor.Ancient]: 6,
|
|
14
|
+
[CS2RarityColor.Immortal]: 7
|
|
15
|
+
};
|
|
16
|
+
export const CS2_PREVIEW_HAS_STICKERS = [
|
|
17
|
+
CS2ItemType.Graffiti,
|
|
18
|
+
CS2ItemType.Patch,
|
|
19
|
+
CS2ItemType.Sticker
|
|
20
|
+
];
|
|
21
|
+
export const CS2_PREVIEW_INSPECTABLE_ITEMS = [
|
|
22
|
+
CS2ItemType.Agent,
|
|
23
|
+
CS2ItemType.Collectible,
|
|
24
|
+
CS2ItemType.Container,
|
|
25
|
+
CS2ItemType.Gloves,
|
|
26
|
+
CS2ItemType.Graffiti,
|
|
27
|
+
CS2ItemType.Keychain,
|
|
28
|
+
CS2ItemType.Melee,
|
|
29
|
+
CS2ItemType.MusicKit,
|
|
30
|
+
CS2ItemType.Patch,
|
|
31
|
+
CS2ItemType.Sticker,
|
|
32
|
+
CS2ItemType.Weapon
|
|
33
|
+
];
|
|
34
|
+
export const CS2_PREVIEW_ATTRIBUTELESS_ITEMS = [
|
|
35
|
+
...CS2_PREVIEW_HAS_STICKERS,
|
|
36
|
+
CS2ItemType.Collectible,
|
|
37
|
+
CS2ItemType.Keychain,
|
|
38
|
+
CS2ItemType.MusicKit
|
|
39
|
+
];
|
|
40
|
+
export const CS2_PREVIEW_URL = "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20";
|
|
41
|
+
export const CS2_PREVIEW_COMMAND = "csgo_econ_action_preview ";
|
|
42
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,WAAW,EAA0B,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC5B,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3B,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1B,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC5B,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;IACxB,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC5B,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;IAC7B,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3B,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAwB;IACzD,WAAW,CAAC,QAAQ;IACpB,WAAW,CAAC,KAAK;IACjB,WAAW,CAAC,OAAO;CACtB,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAwB;IAC9D,WAAW,CAAC,KAAK;IACjB,WAAW,CAAC,WAAW;IACvB,WAAW,CAAC,SAAS;IACrB,WAAW,CAAC,MAAM;IAClB,WAAW,CAAC,QAAQ;IACpB,WAAW,CAAC,QAAQ;IACpB,WAAW,CAAC,KAAK;IACjB,WAAW,CAAC,QAAQ;IACpB,WAAW,CAAC,KAAK;IACjB,WAAW,CAAC,OAAO;IACnB,WAAW,CAAC,MAAM;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAwB;IAChE,GAAG,wBAAwB;IAC3B,WAAW,CAAC,WAAW;IACvB,WAAW,CAAC,QAAQ;IACpB,WAAW,CAAC,QAAQ;CACvB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,oEAAoE,CAAC;AACpG,MAAM,CAAC,MAAM,mBAAmB,GAAG,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) candyboyz, Ian Lucas. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { CS2EconomyItem, CS2InventoryItem, CS2_MIN_SEED, CS2_MIN_STICKER_WEAR } from "@ianlucas/cs2-lib";
|
|
6
|
+
import { Buffer } from "buffer";
|
|
7
|
+
import CRC32 from "crc-32";
|
|
8
|
+
import { CS2PreviewRarity, CS2_PREVIEW_COMMAND, CS2_PREVIEW_HAS_STICKERS, CS2_PREVIEW_URL } from "./constants.js";
|
|
9
|
+
import { CEconItemPreviewDataBlock } from "./Protobufs/cstrike15_gcmessages.js";
|
|
10
|
+
import { floatToBytes } from "./utils.js";
|
|
11
|
+
function getEconomyItemPreviewData(item) {
|
|
12
|
+
const { def, index, rarity, type, tint } = item;
|
|
13
|
+
const hasStickers = CS2_PREVIEW_HAS_STICKERS.includes(type);
|
|
14
|
+
const hasPaintIndex = !hasStickers && !item.isMusicKit();
|
|
15
|
+
const hasKeychains = item.isKeychain();
|
|
16
|
+
return {
|
|
17
|
+
defindex: def,
|
|
18
|
+
keychains: hasKeychains ? [{ stickerId: index, slot: 0 }] : [],
|
|
19
|
+
musicindex: item.isMusicKit() ? index : undefined,
|
|
20
|
+
paintindex: hasPaintIndex ? index : undefined,
|
|
21
|
+
paintseed: item.hasSeed() ? CS2_MIN_SEED : undefined,
|
|
22
|
+
paintwear: item.hasWear() ? floatToBytes(item.getMinimumWear()) : undefined,
|
|
23
|
+
rarity: CS2PreviewRarity[rarity] ?? 0,
|
|
24
|
+
stickers: hasStickers ? [{ tintId: tint, stickerId: index, slot: 0 }] : []
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function getInventoryItemPreviewData(item) {
|
|
28
|
+
const { nameTag, seed, statTrak, stickers, patches, keychains } = item;
|
|
29
|
+
const baseAttributes = getEconomyItemPreviewData(item);
|
|
30
|
+
return {
|
|
31
|
+
...baseAttributes,
|
|
32
|
+
customname: nameTag,
|
|
33
|
+
killeaterscoretype: statTrak !== undefined ? 0 : undefined,
|
|
34
|
+
killeatervalue: statTrak,
|
|
35
|
+
paintseed: item.hasSeed() ? (seed ?? CS2_MIN_SEED) : undefined,
|
|
36
|
+
paintwear: item.hasWear() ? floatToBytes(item.getWear()) : undefined,
|
|
37
|
+
stickers: stickers !== undefined
|
|
38
|
+
? item.someStickers().map(([slot, { id, wear, rotation, x, y, schema }]) => ({
|
|
39
|
+
offsetX: x,
|
|
40
|
+
offsetY: y,
|
|
41
|
+
rotation,
|
|
42
|
+
slot: schema ?? slot,
|
|
43
|
+
stickerId: item.economy.getById(id).index,
|
|
44
|
+
wear: wear ?? CS2_MIN_STICKER_WEAR
|
|
45
|
+
}))
|
|
46
|
+
: patches !== undefined
|
|
47
|
+
? item
|
|
48
|
+
.somePatches()
|
|
49
|
+
.map(([slot, patchId]) => ({ slot, stickerId: item.economy.getById(patchId).index }))
|
|
50
|
+
: baseAttributes.stickers,
|
|
51
|
+
keychains: keychains !== undefined
|
|
52
|
+
? item.someKeychains().map(([slot, { id, x, y, seed }]) => ({
|
|
53
|
+
offsetX: x,
|
|
54
|
+
offsetY: y,
|
|
55
|
+
pattern: seed,
|
|
56
|
+
slot,
|
|
57
|
+
stickerId: item.economy.getById(id).index
|
|
58
|
+
}))
|
|
59
|
+
: item.isKeychain()
|
|
60
|
+
? baseAttributes.keychains.map((keychain) => {
|
|
61
|
+
keychain.pattern = seed;
|
|
62
|
+
return keychain;
|
|
63
|
+
})
|
|
64
|
+
: baseAttributes.keychains
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function generateHex(attributes) {
|
|
68
|
+
const payload = Buffer.concat([Uint8Array.from([0]), CEconItemPreviewDataBlock.toBinary(attributes)]);
|
|
69
|
+
const crc = CRC32.buf(payload);
|
|
70
|
+
const xCrc = (crc & 0xffff) ^ (CEconItemPreviewDataBlock.toBinary(attributes).byteLength * crc);
|
|
71
|
+
const crcBuffer = Buffer.alloc(4);
|
|
72
|
+
crcBuffer.writeUInt32BE((xCrc & 0xffffffff) >>> 0, 0);
|
|
73
|
+
const buffer = Buffer.concat([payload, crcBuffer]);
|
|
74
|
+
return buffer.toString("hex").toUpperCase();
|
|
75
|
+
}
|
|
76
|
+
export function generateInspectLink(item) {
|
|
77
|
+
const attributes = item instanceof CS2InventoryItem ? getInventoryItemPreviewData(item) : getEconomyItemPreviewData(item);
|
|
78
|
+
const hex = generateHex(attributes);
|
|
79
|
+
// There's a char limit for launching the game using the steam:// protocol.
|
|
80
|
+
if (CS2_PREVIEW_URL.length + hex.length > 300) {
|
|
81
|
+
return `${CS2_PREVIEW_COMMAND}${hex}`;
|
|
82
|
+
}
|
|
83
|
+
return `${CS2_PREVIEW_URL}${hex}`;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=generate-inspect-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-inspect-link.js","sourceRoot":"","sources":["../src/generate-inspect-link.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,17 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
"#4b69ff": number;
|
|
7
|
-
"#8847ff": number;
|
|
8
|
-
"#d32ce6": number;
|
|
9
|
-
"#eb4b4b": number;
|
|
10
|
-
"#e4ae39": number;
|
|
11
|
-
};
|
|
12
|
-
export declare const CS2_PREVIEW_HAS_STICKERS: CS2ItemTypeValues[];
|
|
13
|
-
export declare const CS2_PREVIEW_INSPECTABLE_ITEMS: CS2ItemTypeValues[];
|
|
14
|
-
export declare const CS2_PREVIEW_URL = "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20";
|
|
15
|
-
export declare const CS2_PREVIEW_COMMAND = "csgo_econ_action_preview";
|
|
16
|
-
export declare function generateInspectLink(item: CS2EconomyItem | CS2InventoryItem): string;
|
|
17
|
-
export declare function isCommandInspect(inspectLink: string): boolean;
|
|
1
|
+
export { CS2_PREVIEW_ATTRIBUTELESS_ITEMS, CS2_PREVIEW_COMMAND, CS2_PREVIEW_HAS_STICKERS, CS2_PREVIEW_INSPECTABLE_ITEMS, CS2_PREVIEW_URL, CS2PreviewRarity } from "./constants.js";
|
|
2
|
+
export { generateInspectLink } from "./generate-inspect-link.js";
|
|
3
|
+
export { parseCSFloatItemInfo } from "./parse-csfloat-item-info.js";
|
|
4
|
+
export type { CSFloatItemInfo, CSFloatStickerInfo } from "./parse-csfloat-item-info.js";
|
|
5
|
+
export { isCommandInspect, isSteamInspectLink, parseInspectLink } from "./parse-inspect-link.js";
|
package/dist/index.js
CHANGED
|
@@ -2,122 +2,8 @@
|
|
|
2
2
|
* Copyright (c) candyboyz, Ian Lucas. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export const CS2PreviewRarity = {
|
|
10
|
-
[CS2RarityColor.Default]: 0,
|
|
11
|
-
[CS2RarityColor.Common]: 1,
|
|
12
|
-
[CS2RarityColor.Uncommon]: 2,
|
|
13
|
-
[CS2RarityColor.Rare]: 3,
|
|
14
|
-
[CS2RarityColor.Mythical]: 4,
|
|
15
|
-
[CS2RarityColor.Legendary]: 5,
|
|
16
|
-
[CS2RarityColor.Ancient]: 6,
|
|
17
|
-
[CS2RarityColor.Immortal]: 7
|
|
18
|
-
};
|
|
19
|
-
export const CS2_PREVIEW_HAS_STICKERS = [
|
|
20
|
-
CS2ItemType.Graffiti,
|
|
21
|
-
CS2ItemType.MusicKit,
|
|
22
|
-
CS2ItemType.Patch,
|
|
23
|
-
CS2ItemType.Sticker
|
|
24
|
-
];
|
|
25
|
-
export const CS2_PREVIEW_INSPECTABLE_ITEMS = [
|
|
26
|
-
CS2ItemType.Agent,
|
|
27
|
-
CS2ItemType.Collectible,
|
|
28
|
-
CS2ItemType.Container,
|
|
29
|
-
CS2ItemType.Gloves,
|
|
30
|
-
CS2ItemType.Graffiti,
|
|
31
|
-
CS2ItemType.Keychain,
|
|
32
|
-
CS2ItemType.Melee,
|
|
33
|
-
CS2ItemType.MusicKit,
|
|
34
|
-
CS2ItemType.Patch,
|
|
35
|
-
CS2ItemType.Sticker,
|
|
36
|
-
CS2ItemType.Weapon
|
|
37
|
-
];
|
|
38
|
-
export const CS2_PREVIEW_URL = "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20";
|
|
39
|
-
export const CS2_PREVIEW_COMMAND = "csgo_econ_action_preview";
|
|
40
|
-
function floatToBytes(floatValue) {
|
|
41
|
-
const floatArray = new Float32Array(1);
|
|
42
|
-
floatArray[0] = floatValue;
|
|
43
|
-
const byteArray = new Uint32Array(floatArray.buffer);
|
|
44
|
-
return byteArray[0];
|
|
45
|
-
}
|
|
46
|
-
function getEconomyItemPreviewData(item) {
|
|
47
|
-
const { def, index, rarity, type, tint } = item;
|
|
48
|
-
const hasStickers = CS2_PREVIEW_HAS_STICKERS.includes(type);
|
|
49
|
-
const hasPaintIndex = !hasStickers && !item.isMusicKit();
|
|
50
|
-
const hasKeychains = item.isKeychain();
|
|
51
|
-
return {
|
|
52
|
-
defindex: def,
|
|
53
|
-
keychains: hasKeychains ? [{ stickerId: index, slot: 0 }] : [],
|
|
54
|
-
musicindex: item.isMusicKit() ? index : undefined,
|
|
55
|
-
paintindex: hasPaintIndex ? index : undefined,
|
|
56
|
-
paintseed: item.hasSeed() ? CS2_MIN_SEED : undefined,
|
|
57
|
-
paintwear: item.hasWear() ? floatToBytes(item.getMinimumWear()) : undefined,
|
|
58
|
-
rarity: CS2PreviewRarity[rarity] ?? 0,
|
|
59
|
-
stickers: hasStickers ? [{ tintId: tint, stickerId: index, slot: 0 }] : []
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
function getInventoryItemPreviewData(item) {
|
|
63
|
-
const { nameTag, seed, statTrak, stickers, patches, keychains } = item;
|
|
64
|
-
const baseAttributes = getEconomyItemPreviewData(item);
|
|
65
|
-
return {
|
|
66
|
-
...baseAttributes,
|
|
67
|
-
customname: nameTag,
|
|
68
|
-
killeaterscoretype: statTrak !== undefined ? 0 : undefined,
|
|
69
|
-
killeatervalue: statTrak,
|
|
70
|
-
paintseed: item.hasSeed() ? (seed ?? CS2_MIN_SEED) : undefined,
|
|
71
|
-
paintwear: item.hasWear() ? floatToBytes(item.getWear()) : undefined,
|
|
72
|
-
stickers: stickers !== undefined
|
|
73
|
-
? item.someStickers().map(([slot, { id, wear, rotation, x, y }]) => ({
|
|
74
|
-
offsetX: x,
|
|
75
|
-
offsetY: y,
|
|
76
|
-
rotation,
|
|
77
|
-
slot,
|
|
78
|
-
stickerId: item.economy.getById(id).index,
|
|
79
|
-
wear: wear ?? CS2_MIN_STICKER_WEAR
|
|
80
|
-
}))
|
|
81
|
-
: patches !== undefined
|
|
82
|
-
? item
|
|
83
|
-
.somePatches()
|
|
84
|
-
.map(([slot, patchId]) => ({ slot, stickerId: item.economy.getById(patchId).index }))
|
|
85
|
-
: baseAttributes.stickers,
|
|
86
|
-
keychains: keychains !== undefined
|
|
87
|
-
? item.someKeychains().map(([slot, { id, x, y, seed }]) => ({
|
|
88
|
-
offsetX: x,
|
|
89
|
-
offsetY: y,
|
|
90
|
-
pattern: seed,
|
|
91
|
-
slot,
|
|
92
|
-
stickerId: item.economy.getById(id).index
|
|
93
|
-
}))
|
|
94
|
-
: item.isKeychain()
|
|
95
|
-
? baseAttributes.keychains.map((keychain) => {
|
|
96
|
-
keychain.pattern = seed;
|
|
97
|
-
return keychain;
|
|
98
|
-
})
|
|
99
|
-
: baseAttributes.keychains
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
function generateHex(attributes) {
|
|
103
|
-
const payload = Buffer.concat([Uint8Array.from([0]), CEconItemPreviewDataBlock.toBinary(attributes)]);
|
|
104
|
-
const crc = CRC32.buf(payload);
|
|
105
|
-
const xCrc = (crc & 0xffff) ^ (CEconItemPreviewDataBlock.toBinary(attributes).byteLength * crc);
|
|
106
|
-
const crcBuffer = Buffer.alloc(4);
|
|
107
|
-
crcBuffer.writeUInt32BE((xCrc & 0xffffffff) >>> 0, 0);
|
|
108
|
-
const buffer = Buffer.concat([payload, crcBuffer]);
|
|
109
|
-
return buffer.toString("hex").toUpperCase();
|
|
110
|
-
}
|
|
111
|
-
export function generateInspectLink(item) {
|
|
112
|
-
const attributes = item instanceof CS2InventoryItem ? getInventoryItemPreviewData(item) : getEconomyItemPreviewData(item);
|
|
113
|
-
const hex = generateHex(attributes);
|
|
114
|
-
// There's a char limit for launching the game using the steam:// protocol.
|
|
115
|
-
if (CS2_PREVIEW_URL.length + hex.length > 300) {
|
|
116
|
-
return `${CS2_PREVIEW_COMMAND} ${hex}`;
|
|
117
|
-
}
|
|
118
|
-
return `${CS2_PREVIEW_URL}${hex}`;
|
|
119
|
-
}
|
|
120
|
-
export function isCommandInspect(inspectLink) {
|
|
121
|
-
return inspectLink.startsWith(CS2_PREVIEW_COMMAND);
|
|
122
|
-
}
|
|
5
|
+
export { CS2_PREVIEW_ATTRIBUTELESS_ITEMS, CS2_PREVIEW_COMMAND, CS2_PREVIEW_HAS_STICKERS, CS2_PREVIEW_INSPECTABLE_ITEMS, CS2_PREVIEW_URL, CS2PreviewRarity } from "./constants.js";
|
|
6
|
+
export { generateInspectLink } from "./generate-inspect-link.js";
|
|
7
|
+
export { parseCSFloatItemInfo } from "./parse-csfloat-item-info.js";
|
|
8
|
+
export { isCommandInspect, isSteamInspectLink, parseInspectLink } from "./parse-inspect-link.js";
|
|
123
9
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EACH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EACH,+BAA+B,EAC/B,mBAAmB,EACnB,wBAAwB,EACxB,6BAA6B,EAC7B,eAAe,EACf,gBAAgB,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type CS2BaseInventoryItem, CS2EconomyInstance } from "@ianlucas/cs2-lib";
|
|
2
|
+
export interface CSFloatStickerInfo {
|
|
3
|
+
slot: number;
|
|
4
|
+
stickerId: number;
|
|
5
|
+
wear?: number;
|
|
6
|
+
rotation?: number;
|
|
7
|
+
offsetX?: number;
|
|
8
|
+
offsetY?: number;
|
|
9
|
+
tintId?: number;
|
|
10
|
+
pattern?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface CSFloatItemInfo {
|
|
13
|
+
defindex: number;
|
|
14
|
+
paintindex?: number;
|
|
15
|
+
paintseed?: number;
|
|
16
|
+
floatvalue?: number;
|
|
17
|
+
killeatervalue?: number;
|
|
18
|
+
customname?: string;
|
|
19
|
+
musicindex?: number;
|
|
20
|
+
stickers?: CSFloatStickerInfo[];
|
|
21
|
+
keychains?: CSFloatStickerInfo[];
|
|
22
|
+
origin?: number;
|
|
23
|
+
quality?: number;
|
|
24
|
+
rarity?: number;
|
|
25
|
+
floatid?: number;
|
|
26
|
+
imageurl?: string;
|
|
27
|
+
min?: number;
|
|
28
|
+
max?: number;
|
|
29
|
+
weapon_type?: string;
|
|
30
|
+
item_name?: string;
|
|
31
|
+
rarity_name?: string;
|
|
32
|
+
quality_name?: string;
|
|
33
|
+
wear_name?: string;
|
|
34
|
+
full_item_name?: string;
|
|
35
|
+
s?: string;
|
|
36
|
+
a?: string;
|
|
37
|
+
d?: string;
|
|
38
|
+
m?: string;
|
|
39
|
+
}
|
|
40
|
+
export declare function parseCSFloatItemInfo(economy: CS2EconomyInstance, itemInfo: CSFloatItemInfo): CS2BaseInventoryItem;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) candyboyz, Ian Lucas. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { CS2EconomyInstance } from "@ianlucas/cs2-lib";
|
|
6
|
+
import { parseGCInventoryItem } from "./parse-gc-inventory-item.js";
|
|
7
|
+
export function parseCSFloatItemInfo(economy, itemInfo) {
|
|
8
|
+
return parseGCInventoryItem(economy, {
|
|
9
|
+
defindex: itemInfo.defindex,
|
|
10
|
+
paintindex: itemInfo.paintindex,
|
|
11
|
+
paintseed: itemInfo.paintseed,
|
|
12
|
+
floatvalue: itemInfo.floatvalue,
|
|
13
|
+
killeatervalue: itemInfo.killeatervalue,
|
|
14
|
+
customname: itemInfo.customname,
|
|
15
|
+
musicindex: itemInfo.musicindex,
|
|
16
|
+
stickers: itemInfo.stickers ?? [],
|
|
17
|
+
keychains: itemInfo.keychains ?? []
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=parse-csfloat-item-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-csfloat-item-info.js","sourceRoot":"","sources":["../src/parse-csfloat-item-info.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAA6B,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AA0CpE,MAAM,UAAU,oBAAoB,CAAC,OAA2B,EAAE,QAAyB;IACvF,OAAO,oBAAoB,CAAC,OAAO,EAAE;QACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE;QACjC,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,EAAE;KACtC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type CS2BaseInventoryItem, CS2EconomyInstance } from "@ianlucas/cs2-lib";
|
|
2
|
+
export interface CS2GCInventoryItemSticker {
|
|
3
|
+
slot?: number;
|
|
4
|
+
stickerId?: number;
|
|
5
|
+
wear?: number;
|
|
6
|
+
rotation?: number;
|
|
7
|
+
offsetX?: number;
|
|
8
|
+
offsetY?: number;
|
|
9
|
+
tintId?: number;
|
|
10
|
+
pattern?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface CS2GCInventoryItem {
|
|
13
|
+
defindex: number;
|
|
14
|
+
paintindex?: number;
|
|
15
|
+
paintseed?: number;
|
|
16
|
+
floatvalue?: number;
|
|
17
|
+
killeatervalue?: number;
|
|
18
|
+
customname?: string;
|
|
19
|
+
musicindex?: number;
|
|
20
|
+
stickers: CS2GCInventoryItemSticker[];
|
|
21
|
+
keychains: CS2GCInventoryItemSticker[];
|
|
22
|
+
}
|
|
23
|
+
export declare function parseGCInventoryItem(economy: CS2EconomyInstance, data: CS2GCInventoryItem): CS2BaseInventoryItem;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) candyboyz, Ian Lucas. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { CS2EconomyInstance, CS2_MIN_SEED, CS2_MIN_STICKER_WEAR, CS2_MIN_WEAR, CS2_STICKER_WEAR_FACTOR, CS2_WEAR_FACTOR, assert, ensure } from "@ianlucas/cs2-lib";
|
|
6
|
+
import { CS2_PREVIEW_HAS_STICKERS } from "./constants.js";
|
|
7
|
+
import { truncate } from "./utils.js";
|
|
8
|
+
export function parseGCInventoryItem(economy, data) {
|
|
9
|
+
const { defindex, paintindex, paintseed, floatvalue, killeatervalue, customname, musicindex, stickers, keychains } = data;
|
|
10
|
+
let economyItem = economy.itemsAsArray.find((item) => item.def === defindex);
|
|
11
|
+
if (economyItem !== undefined && CS2_PREVIEW_HAS_STICKERS.includes(economyItem.type)) {
|
|
12
|
+
if (stickers.length === 1) {
|
|
13
|
+
// Patch, Sticker, and Graffiti
|
|
14
|
+
economyItem = economy.itemsAsArray.find((item) => item.def === defindex && item.index === stickers[0].stickerId && item.tint === stickers[0].tintId);
|
|
15
|
+
}
|
|
16
|
+
return ensure(economyItem !== undefined ? { id: economyItem.id } : undefined);
|
|
17
|
+
}
|
|
18
|
+
else if (musicindex !== undefined) {
|
|
19
|
+
// Music Kit
|
|
20
|
+
economyItem = economy.itemsAsArray.find((item) => item.isMusicKit() && item.index === musicindex);
|
|
21
|
+
return ensure(economyItem !== undefined ? stripMinValues({ id: economyItem.id, statTrak: killeatervalue }) : undefined);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
if (paintindex !== undefined) {
|
|
25
|
+
economyItem = economy.itemsAsArray.find((item) => item.def === defindex && item.index === paintindex);
|
|
26
|
+
}
|
|
27
|
+
assert(economyItem !== undefined);
|
|
28
|
+
if (economyItem.isKeychain()) {
|
|
29
|
+
return stripMinValues({
|
|
30
|
+
id: economyItem.id,
|
|
31
|
+
seed: keychains[0]?.pattern ?? paintseed
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return stripMinValues({
|
|
35
|
+
id: economyItem.id,
|
|
36
|
+
seed: paintseed,
|
|
37
|
+
wear: floatvalue !== undefined ? truncate(floatvalue, CS2_WEAR_FACTOR) : undefined,
|
|
38
|
+
statTrak: killeatervalue,
|
|
39
|
+
nameTag: customname,
|
|
40
|
+
keychains: keychains.length > 0
|
|
41
|
+
? Object.fromEntries(keychains.map(({ offsetX, offsetY, pattern, slot, stickerId }) => [
|
|
42
|
+
slot,
|
|
43
|
+
{
|
|
44
|
+
id: ensure(economy.itemsAsArray.find((item) => item.isKeychain() && item.index === stickerId)
|
|
45
|
+
?.id),
|
|
46
|
+
seed: pattern,
|
|
47
|
+
x: offsetX,
|
|
48
|
+
y: offsetY
|
|
49
|
+
}
|
|
50
|
+
]))
|
|
51
|
+
: undefined,
|
|
52
|
+
stickers: !economyItem.isAgent() && stickers.length > 0
|
|
53
|
+
? Object.fromEntries(stickers.map(({ slot, stickerId, offsetX, offsetY, wear, rotation }, index) => [
|
|
54
|
+
index,
|
|
55
|
+
{
|
|
56
|
+
id: ensure(economy.itemsAsArray.find((item) => item.isSticker() && item.index === stickerId)
|
|
57
|
+
?.id),
|
|
58
|
+
rotation: rotation !== undefined ? Math.trunc(rotation) : undefined,
|
|
59
|
+
schema: slot,
|
|
60
|
+
wear: wear !== undefined ? truncate(wear, CS2_STICKER_WEAR_FACTOR) : undefined,
|
|
61
|
+
x: offsetX,
|
|
62
|
+
y: offsetY
|
|
63
|
+
}
|
|
64
|
+
]))
|
|
65
|
+
: undefined,
|
|
66
|
+
patches: economyItem.isAgent() && stickers.length > 0
|
|
67
|
+
? Object.fromEntries(stickers.map(({ slot, stickerId }) => [
|
|
68
|
+
slot,
|
|
69
|
+
ensure(economy.itemsAsArray.find((item) => item.isPatch() && item.index === stickerId)?.id)
|
|
70
|
+
]))
|
|
71
|
+
: undefined
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function stripMinValues(item) {
|
|
76
|
+
if (item.seed === CS2_MIN_SEED) {
|
|
77
|
+
item.seed = undefined;
|
|
78
|
+
}
|
|
79
|
+
if (item.wear === CS2_MIN_WEAR) {
|
|
80
|
+
item.wear = undefined;
|
|
81
|
+
}
|
|
82
|
+
if (item.stickers !== undefined) {
|
|
83
|
+
for (const sticker of Object.values(item.stickers)) {
|
|
84
|
+
if (sticker.wear === CS2_MIN_STICKER_WEAR) {
|
|
85
|
+
sticker.wear = undefined;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return item;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=parse-gc-inventory-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-gc-inventory-item.js","sourceRoot":"","sources":["../src/parse-gc-inventory-item.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type CS2BaseInventoryItem, CS2EconomyInstance } from "@ianlucas/cs2-lib";
|
|
2
|
+
export declare function isCommandInspect(inspectLink: string): boolean;
|
|
3
|
+
export declare function isSteamInspectLink(inspectLink: string): boolean;
|
|
4
|
+
export declare function parseInspectLink(economy: CS2EconomyInstance, inspectLink: string): CS2BaseInventoryItem;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) candyboyz, Ian Lucas. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { CS2EconomyInstance } from "@ianlucas/cs2-lib";
|
|
6
|
+
import { Buffer } from "buffer";
|
|
7
|
+
import CRC32 from "crc-32";
|
|
8
|
+
import { CS2_PREVIEW_COMMAND, CS2_PREVIEW_URL } from "./constants.js";
|
|
9
|
+
import { parseGCInventoryItem } from "./parse-gc-inventory-item.js";
|
|
10
|
+
import { CEconItemPreviewDataBlock } from "./Protobufs/cstrike15_gcmessages.js";
|
|
11
|
+
import { bytesToFloat } from "./utils.js";
|
|
12
|
+
export function isCommandInspect(inspectLink) {
|
|
13
|
+
return inspectLink.startsWith(CS2_PREVIEW_COMMAND);
|
|
14
|
+
}
|
|
15
|
+
export function isSteamInspectLink(inspectLink) {
|
|
16
|
+
try {
|
|
17
|
+
const decoded = decodeURI(inspectLink);
|
|
18
|
+
return /^steam:\/\/rungame\/730\/\d+\/[+ ]csgo_econ_action_preview [SM]\d+A\d+D\d+$/.test(decoded);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function parseHex(hexString) {
|
|
25
|
+
// Convert hex string to buffer
|
|
26
|
+
const buffer = Buffer.from(hexString.toLowerCase(), "hex");
|
|
27
|
+
// First byte should be 0
|
|
28
|
+
if (buffer[0] !== 0) {
|
|
29
|
+
throw new Error("Invalid format: First byte should be 0");
|
|
30
|
+
}
|
|
31
|
+
// Extract the data and CRC portions
|
|
32
|
+
const payload = buffer.slice(0, -4); // Everything except last 4 bytes
|
|
33
|
+
const providedCrcBuffer = buffer.slice(-4); // Last 4 bytes
|
|
34
|
+
const providedCrc = providedCrcBuffer.readUInt32BE(0);
|
|
35
|
+
// Extract just the attributes data (removing the first byte)
|
|
36
|
+
const attributesData = payload.slice(1);
|
|
37
|
+
// Verify CRC
|
|
38
|
+
const calculatedCrc = CRC32.buf(payload);
|
|
39
|
+
const calculatedXCrc = (calculatedCrc & 0xffff) ^ (attributesData.byteLength * calculatedCrc);
|
|
40
|
+
const finalCalculatedCrc = (calculatedXCrc & 0xffffffff) >>> 0;
|
|
41
|
+
if (finalCalculatedCrc !== providedCrc) {
|
|
42
|
+
throw new Error("CRC verification failed");
|
|
43
|
+
}
|
|
44
|
+
// Convert the binary data back to CEconItemPreviewDataBlock
|
|
45
|
+
return CEconItemPreviewDataBlock.fromBinary(attributesData);
|
|
46
|
+
}
|
|
47
|
+
export function parseInspectLink(economy, inspectLink) {
|
|
48
|
+
const hex = isCommandInspect(inspectLink)
|
|
49
|
+
? inspectLink.replace(CS2_PREVIEW_COMMAND, "")
|
|
50
|
+
: inspectLink.replace(CS2_PREVIEW_URL, "");
|
|
51
|
+
const attributes = parseHex(hex);
|
|
52
|
+
return parseGCInventoryItem(economy, {
|
|
53
|
+
defindex: attributes.defindex ?? 0,
|
|
54
|
+
paintindex: attributes.paintindex,
|
|
55
|
+
paintseed: attributes.paintseed,
|
|
56
|
+
floatvalue: attributes.paintwear !== undefined ? bytesToFloat(attributes.paintwear) : undefined,
|
|
57
|
+
killeatervalue: attributes.killeatervalue,
|
|
58
|
+
customname: attributes.customname,
|
|
59
|
+
musicindex: attributes.musicindex,
|
|
60
|
+
stickers: attributes.stickers,
|
|
61
|
+
keychains: attributes.keychains
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=parse-inspect-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-inspect-link.js","sourceRoot":"","sources":["../src/parse-inspect-link.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
ADDED
package/dist/utils.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) candyboyz, Ian Lucas. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
export function floatToBytes(floatValue) {
|
|
6
|
+
const floatArray = new Float32Array(1);
|
|
7
|
+
floatArray[0] = floatValue;
|
|
8
|
+
const byteArray = new Uint32Array(floatArray.buffer);
|
|
9
|
+
return byteArray[0];
|
|
10
|
+
}
|
|
11
|
+
export function bytesToFloat(byteValue) {
|
|
12
|
+
const byteArray = new Uint32Array(1);
|
|
13
|
+
byteArray[0] = byteValue;
|
|
14
|
+
const floatArray = new Float32Array(byteArray.buffer);
|
|
15
|
+
return floatArray[0];
|
|
16
|
+
}
|
|
17
|
+
export function truncate(value, factor) {
|
|
18
|
+
return parseFloat(String(value).substring(0, String(factor).length));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC3C,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IACvC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACrD,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC1C,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;IACrC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACzB,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtD,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,MAAc;IAClD,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACzE,CAAC"}
|
package/package.json
CHANGED
|
@@ -2,31 +2,46 @@
|
|
|
2
2
|
"name": "@ianlucas/cs2-lib-inspect",
|
|
3
3
|
"description": "An extension for cs2-lib to create Counter-Strike 2 inspect links",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"
|
|
5
|
+
"author": "Ian Lucas",
|
|
6
|
+
"homepage": "https://github.com/ianlucas/cs2-lib-inspect#readme",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/ianlucas/cs2-lib-inspect.git"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/ianlucas/cs2-lib-inspect/issues"
|
|
13
|
+
},
|
|
6
14
|
"type": "module",
|
|
7
|
-
"main": "dist/index.js",
|
|
15
|
+
"main": "./dist/index.js",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"sideEffects": false,
|
|
8
18
|
"scripts": {
|
|
9
19
|
"docs": "typedoc --out docs src/index.ts",
|
|
10
20
|
"format": "prettier . --write",
|
|
11
21
|
"generate:protobufs": "npx protoc --ts_out ./src/Protobufs --proto_path src/Protobufs src/Protobufs/cstrike15_gcmessages.proto",
|
|
12
22
|
"prepack": "([ -d dist ] && rm -rf dist); tsc",
|
|
23
|
+
"test": "vitest --run --testTimeout 120000",
|
|
13
24
|
"typecheck": "tsc --noEmit",
|
|
14
25
|
"upgrade": "npx npm-check-updates@latest --target minor -u"
|
|
15
26
|
},
|
|
16
27
|
"dependencies": {
|
|
17
|
-
"@protobuf-ts/runtime": "^2.
|
|
28
|
+
"@protobuf-ts/runtime": "^2.11.1",
|
|
18
29
|
"buffer": "^6.0.3",
|
|
19
|
-
"crc-32": "^1.2.2"
|
|
30
|
+
"crc-32": "^1.2.2",
|
|
31
|
+
"vitest": "^4.1.0"
|
|
20
32
|
},
|
|
21
33
|
"peerDependencies": {
|
|
22
34
|
"@ianlucas/cs2-lib": "^7.0.0"
|
|
23
35
|
},
|
|
24
36
|
"devDependencies": {
|
|
25
|
-
"@protobuf-ts/plugin": "^2.
|
|
37
|
+
"@protobuf-ts/plugin": "^2.11.1",
|
|
26
38
|
"@total-typescript/tsconfig": "^1.0.4",
|
|
27
|
-
"prettier": "^3.
|
|
28
|
-
"typedoc": "^0.
|
|
29
|
-
"typescript": "^5.
|
|
39
|
+
"prettier": "^3.8.1",
|
|
40
|
+
"typedoc": "^0.28.17",
|
|
41
|
+
"typescript": "^5.9.3"
|
|
42
|
+
},
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=20"
|
|
30
45
|
},
|
|
31
|
-
"version": "5.
|
|
46
|
+
"version": "5.2.0"
|
|
32
47
|
}
|