Skip to content

Commit 08f859a

Browse files
committed
chore: merge dota-lua-types and panorama-types repositories
2 parents 26747df + fef0f4b commit 08f859a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+6818
-666
lines changed

.editorconfig

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ charset = utf-8
88
trim_trailing_whitespace = true
99
insert_final_newline = true
1010

11-
[{types,normalized}/**/*]
11+
[packages/*/{types,normalized}/**/*]
1212
indent_size = 4

.eslintignore

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
/transformer.*
2-
!/transformer.ts
3-
/types/*.generated.d.ts
1+
/packages/*/types/*.generated.d.ts
2+
/packages/*/transformer/*
3+
!/packages/*/transformer/index.ts

.eslintrc.json

+2-7
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
{
22
"extends": "@ark120202/eslint-config/node",
33
"parserOptions": {
4-
"project": [
5-
"tsconfig.json",
6-
"build/tsconfig.json",
7-
"types/tsconfig.json",
8-
"normalized/tsconfig.json"
9-
]
4+
"project": ["build/tsconfig.json", "packages/*/{,types,normalized}/tsconfig.json"]
105
},
116
"overrides": [
127
{
13-
"files": "{types,normalized}/**/*",
8+
"files": "packages/*/{types,normalized}/**/*",
149
"rules": {
1510
"no-plusplus": "off",
1611
"no-var": "off",

.gitignore

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
node_modules
2-
/types/*.generated.d.ts
3-
/enum-mappings.json
4-
/transformer.*
5-
!/transformer.ts
2+
*.tsbuildinfo
3+
/packages/*/enum-mappings.json
4+
/packages/*/types/*.generated.d.ts
5+
/packages/*/transformer/*
6+
!/packages/*/transformer/index.ts

.prettierignore

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/enum-mappings.json
2-
/transformer.*
3-
!/transformer.ts
4-
/types/*.generated.d.ts
1+
/packages/*/enum-mappings.json
2+
/packages/*/types/*.generated.d.ts
3+
/packages/*/transformer/*
4+
!/packages/*/transformer/index.ts

LICENSE

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) ark120202
3+
Copyright (c) ModDota
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

README.md

+1-78
Original file line numberDiff line numberDiff line change
@@ -1,78 +1 @@
1-
# Dota Lua Types
2-
3-
TypeScript definitions for Dota 2 Lua API, designed to be used with
4-
[TypeScriptToLua](https://github.com/TypeScriptToLua/TypeScriptToLua).
5-
6-
## Installation
7-
8-
1. Get package from npm
9-
10-
```shell
11-
yarn add -D dota-lua-types
12-
# or
13-
npm install -D dota-lua-types
14-
```
15-
16-
2. Modify your `tsconfig.json`
17-
18-
```json
19-
{
20-
"compilerOptions": {
21-
"types": ["dota-lua-types"],
22-
"plugins": [{ "transform": "dota-lua-types/transformer" }]
23-
}
24-
}
25-
```
26-
27-
## Enums
28-
29-
This package includes 2 versions of enum types - raw and normalized. Raw types are included with
30-
`"types": ["dota-lua-types"]`. They are defined using original engine names and have no structural
31-
changes. This makes the code using some enums compatible with Panorama, however it leads to
32-
repetition and requires you to use inconsistent standard names.
33-
34-
Normalized enum types can be included with `"types": ["dota-lua-types/normalized"]`. With these
35-
types, enums have consistent names and have no repeated parts. For example, instead of
36-
`EDOTA_ModifyGold_Reason.DOTA_ModifyGold_Unspecified` you have to write
37-
`ModifyGoldReason.UNSPECIFIED`.
38-
39-
Both type versions define aliases for alternative names, so libraries created with one version would
40-
be compatible with a different one.
41-
42-
## Notes
43-
44-
- You can explore the same data in readable form on
45-
[dota-data](https://dota-data.netlify.com/vscripts/) page.
46-
47-
- To extend standard classes you can use declaration merging:
48-
49-
```ts
50-
interface CDOTA_BaseNPC {
51-
log(message: string): void;
52-
}
53-
54-
CDOTA_BaseNPC.log = function(message) {
55-
print(`${this.GetUnitName()} says: ${message}`);
56-
};
57-
58-
HeroList.GetHero(0)!.log('Hello world');
59-
```
60-
61-
- All Dota classes there are declared as interfaces. To extend them you can use
62-
[utilities](https://gist.github.com/ark120202/f9ccd1076887664e8e8cb7e7d78fd7d1)
63-
64-
```ts
65-
import { BaseAbility, BaseModifier, registerAbility, registerModifier } from './utils';
66-
67-
@registerAbility('ability_test')
68-
export class Test extends BaseAbility {
69-
GetIntrinsicModifierName = () => TestModifier.name;
70-
}
71-
72-
@registerModifier('ability_test_modifier')
73-
export class TestModifier extends BaseModifier {
74-
OnCreated() {
75-
print('Test modifier created');
76-
}
77-
}
78-
```
1+
# Dota 2 TypeScript declarations

build/index.ts

+20-9
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
11
import fs from 'fs-extra';
22
import path from 'path';
3-
import { generated } from './generate';
4-
import { generatedEnumMappings } from './generate/enums/mappings';
3+
import { generatedLua } from './lua';
4+
import { generatedEnumMappings } from './lua/enums/mappings';
5+
import { generatedPanorama } from './panorama';
56

6-
fs.outputFileSync(
7-
path.resolve(__dirname, '../enum-mappings.json'),
8-
JSON.stringify(generatedEnumMappings, null, 2),
9-
);
7+
const write = (packageName: string, type: string, content: string) =>
8+
fs.outputFile(
9+
path.resolve(__dirname, `../packages/${packageName}/types/${type}.generated.d.ts`),
10+
content,
11+
);
1012

11-
for (const [type, content] of Object.entries(generated)) {
12-
fs.outputFileSync(path.resolve(__dirname, `../types/${type}.generated.d.ts`), content);
13-
}
13+
Promise.all([
14+
...Object.entries(generatedLua).map(([t, c]) => write('dota-lua-types', t, c)),
15+
...Object.entries(generatedPanorama).map(([t, c]) => write('panorama-types', t, c)),
16+
fs.outputJson(
17+
path.resolve(__dirname, '../packages/dota-lua-types/enum-mappings.json'),
18+
generatedEnumMappings,
19+
{ spaces: 4 },
20+
),
21+
]).catch(error => {
22+
console.error(error);
23+
process.exit(1);
24+
});
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

build/generate/index.ts renamed to build/lua/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { generatedEnums, generatedEnumsNormalized } from './enums';
33
import { generatedEvents } from './events';
44
import { generatedModifierProperties } from './modifier-properties';
55

6-
export const generated = {
6+
export const generatedLua = {
77
enums: generatedEnums,
88
'enums-normalized': generatedEnumsNormalized,
99
events: generatedEvents,

build/generate/utils.ts renamed to build/lua/utils.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -217,9 +217,10 @@ export function getFunction<T extends CallableDeclaration>(
217217

218218
const prettierConfig: prettier.Options = {
219219
parser: 'typescript',
220-
...prettier.resolveConfig.sync(path.resolve(__dirname, '../../types/_.generated.d.ts'), {
221-
editorconfig: true,
222-
}),
220+
...prettier.resolveConfig.sync(
221+
path.resolve(__dirname, '../../packages/dota-lua-types/types/_.generated.d.ts'),
222+
{ editorconfig: true },
223+
),
223224
};
224225

225226
export const emit = (

build/panorama/enums.ts

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import enums from 'dota-data/files/panorama/enums';
2+
import { emit, withDescription } from './utils';
3+
4+
export const generatedEnums = emit(
5+
enums
6+
.map(({ name: enumName, members }) => {
7+
const memberTypes = members
8+
.map(({ name, description, value }) => withDescription(`${name} = ${value}`, description))
9+
.join(',\n');
10+
11+
return `declare enum ${enumName} {${memberTypes}}`;
12+
})
13+
.join('\n\n'),
14+
);

build/panorama/events.ts

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import events from 'dota-data/files/events';
2+
import _ from 'lodash';
3+
import { emit, withDescription } from './utils';
4+
5+
const eventTypeMap: Record<string, string> = {
6+
bool: '0 | 1',
7+
byte: 'number',
8+
short: 'number',
9+
int: 'number',
10+
long: 'number',
11+
float: 'number',
12+
uint64: 'number',
13+
local: 'any',
14+
};
15+
16+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
17+
export const getEventType = (type: string) => eventTypeMap[type] ?? type;
18+
19+
const gameEventDeclarations = (() => {
20+
const members = _.uniqBy(
21+
Object.values(events).flatMap(group => Object.entries(group)),
22+
// `player_connect` and `hltv_chat` are duplicated
23+
([name]) => name,
24+
).map(([eventName, event]) =>
25+
withDescription(
26+
`${eventName}: ${
27+
event.fields.length === 0 ? 'object' : `${_.upperFirst(_.camelCase(eventName))}Event`
28+
}`,
29+
event.description,
30+
),
31+
);
32+
return `interface GameEventDeclarations {${members}}`;
33+
})();
34+
35+
const eventTypes = Object.values(events)
36+
.flatMap(group => Object.entries(group))
37+
.map(([eventName, event]) => {
38+
const interfaceName = `${_.upperFirst(_.camelCase(eventName))}Event`;
39+
40+
if (event.fields.length === 0) {
41+
return '';
42+
}
43+
44+
const members = event.fields
45+
.map(field =>
46+
withDescription(`${field.name}: ${getEventType(field.type)}`, field.description),
47+
)
48+
.join('\n');
49+
50+
return withDescription(`interface ${interfaceName} {${members}}`, event.description);
51+
})
52+
.join('\n\n');
53+
54+
export const generatedEvents = emit(gameEventDeclarations + eventTypes);

build/panorama/index.ts

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { generatedEnums } from './enums';
2+
import { generatedEvents } from './events';
3+
4+
export const generatedPanorama = {
5+
enums: generatedEnums,
6+
events: generatedEvents,
7+
};

build/panorama/utils.ts

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import path from 'path';
2+
import prettier from 'prettier';
3+
import wordwrap from 'wordwrap';
4+
5+
export const withDescription = (declaration: string, description = '') => {
6+
if (!description) return declaration;
7+
description = wrapDescription(description);
8+
description = description.replace(/^/gm, ' * ');
9+
description = `/**\n${description}\n*/\n`;
10+
return description + declaration;
11+
};
12+
13+
export const wrapDescription = (description: string, start = 0) =>
14+
wordwrap({ stop: 80, start })(description.replace(/\n/g, '\n\n'));
15+
16+
const prettierConfig: prettier.Options = {
17+
parser: 'typescript',
18+
...prettier.resolveConfig.sync(
19+
path.resolve(__dirname, '../../packages/panorama-types/types/_.generated.d.ts'),
20+
{ editorconfig: true },
21+
),
22+
};
23+
24+
// There is some instability in comment formatting
25+
export const emit = (content: string) =>
26+
prettier.format(prettier.format(content, prettierConfig), prettierConfig);

lerna.json

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"version": "independent",
3+
"npmClient": "yarn",
4+
"useWorkspaces": true,
5+
"command": {
6+
"version": {
7+
"message": "chore(release): publish"
8+
}
9+
}
10+
}

normalized/tsconfig.json

-4
This file was deleted.

0 commit comments

Comments
 (0)