1
0
Fork 0

Merge pull request #2054 from qucchia/master

Auto-generate types
master
Gordon Williams 2022-07-22 10:47:46 +01:00 committed by GitHub
commit ac563fa5bd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 12056 additions and 849 deletions

View File

@ -22,9 +22,6 @@ jobs:
- name: Install typescript dependencies
working-directory: ./typescript
run: npm ci
- name: Build types
working-directory: ./typescript
run: npm run build:types
- name: Build all TS apps and widgets
working-directory: ./typescript
run: npm run build

View File

@ -1,13 +1,7 @@
# BangleTS
# Bangle.ts
A generic project setup for compiling apps from Typescript to Bangle.js ready, readable Javascript.
It includes types for _some_ of the modules and globals that are exposed for apps to use.
The goal is to have types for everything, but that will take some time. Feel free to help out by contributing!
## Using the types
All currently typed modules can be found in `/typescript/types`.
The typing is an ongoing process. If anything is still missing, you can add it! It will automatically be available in your TS files.
A generic project setup for compiling apps from Typescript to Bangle.js ready, readable JavaScript.
The types are now automatically generated by a script (see below), although they are still a work-in-progress.
## Compilation
@ -26,4 +20,14 @@ to install the project's build tools, and:
npm run build
```
To build all Typescript apps and widgets. The last command will generate the `app.js` files containing the transpiled code for the BangleJS.
To build all Typescript apps and widgets. The last command will generate the `app.js` files containing the transpiled code for the Bangle.js.
## Generating types
To generate the types, ensure this repository and [Espruino](https://github.com/espruino/Espruino) are in the same folder. From the Espruino folder run:
```
node scripts/build_types.js
```
This will update the file in `types/main.d.ts`.

View File

@ -7,10 +7,89 @@
"": {
"name": "Bangle.ts",
"version": "0.0.1",
"dependencies": {
"node-fetch": "^3.2.9"
},
"devDependencies": {
"typescript": "4.5.2"
}
},
"node_modules/data-uri-to-buffer": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
"integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==",
"engines": {
"node": ">= 12"
}
},
"node_modules/fetch-blob": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
"integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/jimmywarting"
},
{
"type": "paypal",
"url": "https://paypal.me/jimmywarting"
}
],
"dependencies": {
"node-domexception": "^1.0.0",
"web-streams-polyfill": "^3.0.3"
},
"engines": {
"node": "^12.20 || >= 14.13"
}
},
"node_modules/formdata-polyfill": {
"version": "4.0.10",
"resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
"integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
"dependencies": {
"fetch-blob": "^3.1.2"
},
"engines": {
"node": ">=12.20.0"
}
},
"node_modules/node-domexception": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
"integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/jimmywarting"
},
{
"type": "github",
"url": "https://paypal.me/jimmywarting"
}
],
"engines": {
"node": ">=10.5.0"
}
},
"node_modules/node-fetch": {
"version": "3.2.9",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.9.tgz",
"integrity": "sha512-/2lI+DBecVvVm9tDhjziTVjo2wmTsSxSk58saUYP0P/fRJ3xxtfMDY24+CKTkfm0Dlhyn3CSXNL0SoRiCZ8Rzg==",
"dependencies": {
"data-uri-to-buffer": "^4.0.0",
"fetch-blob": "^3.1.4",
"formdata-polyfill": "^4.0.10"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/node-fetch"
}
},
"node_modules/typescript": {
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz",
@ -23,14 +102,64 @@
"engines": {
"node": ">=4.2.0"
}
},
"node_modules/web-streams-polyfill": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
"integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
"engines": {
"node": ">= 8"
}
}
},
"dependencies": {
"data-uri-to-buffer": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
"integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA=="
},
"fetch-blob": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
"integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
"requires": {
"node-domexception": "^1.0.0",
"web-streams-polyfill": "^3.0.3"
}
},
"formdata-polyfill": {
"version": "4.0.10",
"resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
"integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
"requires": {
"fetch-blob": "^3.1.2"
}
},
"node-domexception": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
"integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="
},
"node-fetch": {
"version": "3.2.9",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.9.tgz",
"integrity": "sha512-/2lI+DBecVvVm9tDhjziTVjo2wmTsSxSk58saUYP0P/fRJ3xxtfMDY24+CKTkfm0Dlhyn3CSXNL0SoRiCZ8Rzg==",
"requires": {
"data-uri-to-buffer": "^4.0.0",
"fetch-blob": "^3.1.4",
"formdata-polyfill": "^4.0.10"
}
},
"typescript": {
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz",
"integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==",
"dev": true
},
"web-streams-polyfill": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
"integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q=="
}
}
}

View File

@ -1,13 +1,15 @@
{
"name": "Bangle.ts",
"description": "Bangle.js Typescript Project Setup and Types",
"author": "Sebastian Di Luzio <sebastian@diluz.io> (https://diluz.io)",
"author": "Sebastian Di Luzio <sebastian@diluz.io> (https://diluz.io) and qucchia <qucchia0@gmail.com> (https://github.com/qucchia)",
"version": "0.0.1",
"devDependencies": {
"typescript": "4.5.2"
},
"scripts": {
"build": "tsc",
"build:types": "tsc ./types/main.d.ts"
"build": "tsc"
},
"dependencies": {
"node-fetch": "^3.2.9"
}
}

View File

@ -8,6 +8,7 @@
"noImplicitOverride": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noLib": true,
"noUncheckedIndexedAccess": true,
"noUnusedLocals": true,
"noUnusedParameters": true,

View File

@ -1,211 +0,0 @@
type Accel = {
x: number;
y: number;
z: number;
diff: number;
td: number;
mag: number;
};
type Mag = {
x: number;
y: number;
z: number;
dx: number;
dy: number;
dz: number;
heading: number;
};
type GPS = {
lat: number;
lon: number;
alt: number;
speed: number;
course: number;
time: Date;
stallites: number;
fix: number;
hdop: number;
};
type HealthStatus = {
movement: number;
steps: number;
bpm: number;
bpmConfidence: number;
};
type BangleOptions = {
wakeOnBTN1: boolean;
wakeOnBTN2: boolean;
wakeOnBTN3: boolean;
wakeOnFaceUp: boolean;
wakeOnTouch: boolean;
wakeOnTwist: boolean;
twistThreshold: number;
twistMaxY: number;
twistTimeout: number;
gestureStartThresh: number;
gestureEndThresh: number;
gestureInactiveCount: number;
gestureMinLength: number;
powerSave: boolean;
lockTimeout: number;
lcdPowerTimeout: number;
backlightTimeout: number;
hrmPollInterval: number;
};
type Optional<T> = {
[key in keyof T]?: T[key];
};
type LCDMode = "direct" | "doublebuffered" | "120x120" | "80x80";
declare const Bangle: {
accelRd: ((register: any, length: number) => number[]) &
((register: any) => number);
accelWr: (register: any, data: number[] | number) => void;
appRect: {
x: number;
y: number;
w: number;
h: number;
x2: number;
y2: number;
};
beep: (time?: number, frequency?: number) => Promise<void>;
buzz: (time?: number, strength?: number) => Promise<void>;
compassRd: ((register: any, length: number) => number[]) &
((register: any) => number);
compassWr: (register: any, data: number[] | number) => void;
dbg: () => any;
drawWidgets: () => void;
F_BEEPSET: boolean;
getAccel: () => Accel;
getCompass: () => Mag;
getGPSFix: () => GPS;
getHealthStatus: (range?: "current" | "last" | "day") => HealthStatus;
getLCDMode: () => LCDMode;
getLogo: () => string;
getOptions: () => BangleOptions;
getStepCount: () => number;
hrmRd: ((register: any, length: number) => number[]) &
((register: any) => number);
ioWr: (mask: Pin, isOn: boolean) => void;
isCharging: () => boolean;
isCompassOn: () => boolean;
isGPSOn: () => boolean;
isHRMOn: () => boolean;
isLCDOn: () => boolean;
isLocked: () => boolean;
lcdWr: (register: any, data: number[] | number) => void;
loadWidgets: () => void;
off: () => void;
on: ((event: "accel", listener: (xyz: Accel) => void) => void) &
((
event: "aiGesture",
listener: (
gesture: string | number | undefined,
weights: number[]
) => void
) => void) &
((event: "charging", listener: (charging: boolean) => void) => void) &
((
event: "drag",
listener: (event: {
x: number;
y: number;
dx: number;
dy: number;
b: number;
}) => void
) => void) &
((event: "faceUp", listener: (up: boolean) => void) => void) &
((event: "gesture", listener: (xyz: Int8Array) => void) => void) &
((event: "GPS", listener: (gps: GPS) => void) => void) &
((
event: "GPS-raw",
listener: (nmea: string, dataLoss: boolean) => void
) => void) &
((event: "health", listener: (info: HealthStatus) => void) => void) &
((
event: "HRM",
listener: (hrm: {
bpm: number;
confidence: number;
raw: Uint8Array;
}) => void
) => void) &
((
event: "HRM-raw",
listener: (hrm: {
raw: number;
filt: number;
bpm: number;
confidence: number;
}) => void
) => void) &
((event: "lcdPower", listener: (on: boolean) => void) => void) &
((event: "lock", listener: (on: boolean) => void) => void) &
((event: "mag", listener: (mag: Mag) => void) => void) &
((event: "midnight", listener: () => void) => void) &
((
event: "pressure",
listener: (info: {
temperature: number;
pressure: number;
altitude: number;
}) => void
) => void) &
((event: "step", listener: (up: number) => void) => void) &
((event: "swipe", listener: (direction: number) => void) => void) &
((
event: "tap",
listener: (data: {
dir: string;
double: boolean;
x: number;
y: number;
z: number;
}) => void
) => void) &
((
event: "touch",
listener: (button: number, xy: { x: number; y: number }) => void
) => void) &
((event: "twist", listener: () => void) => void);
project: (latlon: { lat: number; lon: number }) => { x: number; y: number };
resetCompass: () => void;
setCompassPower: (isOn: boolean, appID: string) => boolean;
setGPSPower: (isOn: boolean, appID: string) => boolean;
setHRMPower: (isOn: boolean, appID: string) => boolean;
setLCDBrightness: (brightness: number) => void;
setLCDMode: (mode?: LCDMode) => void;
setLCDOffset: (y: number) => void;
setLCDPower: (isOn: boolean, appID: string) => boolean;
setLCDTimeout: (timeout: number) => void;
setLocked: (isLocked: boolean) => void;
setOptions: (options: Optional<BangleOptions>) => void;
setPollInterval: (timeout: number) => void;
setStepCount: (timeout: number) => void;
setUI: (
type?:
| "updown"
| "leftright"
| "clock"
| "clockupdown"
| {
mode: "custom";
back?: () => void;
touch?: (n: number, e: number) => void;
swipe?: (dir: number) => void;
drag?: (e: number) => void;
btn?: (n: number) => void;
},
callback?: (direction: number) => void
) => void;
showLauncher: () => void;
softOff: () => void;
};

View File

@ -1,59 +0,0 @@
/*~ This file declares the Espruino utility class.
*~ Reference: https://banglejs.com/reference#E
*/
declare const E: {
showAlert: (() => Promise<undefined>) &
((message: string, title?: string) => Promise<number>);
showMenu: (() => undefined) &
((menu: {
// The "" value includes menu options.
""?: {
title?: string;
back?: () => void;
selected?: number;
fontHeight?: number;
x?: number;
y?: number;
x2?: number;
y2?: number;
cB?: number;
cF?: number;
cHB?: number;
cHF?: number;
predraw?: (gfx: GraphicsApi) => void;
preflip?: (gfx: GraphicsApi, less: boolean, more: boolean) => void;
} & {
// All the other key-value pairs are menu items.
[key: string]:
| undefined
| (() => void)
| {
value: boolean;
format?: (value: boolean) => string;
onchange?: (value: boolean) => void;
}
| {
value: number;
min?: number;
max?: number;
step?: number;
format?: (value: number) => string;
onchange?: (value: number) => void;
};
};
}) => {
draw: () => void;
move: () => void;
select: () => void;
});
showPrompt: (() => Promise<undefined>) &
(<T extends any = boolean>(
message: string,
options?: {
title?: string;
buttons?: { [key: string]: T };
img?: string;
}
) => Promise<T>);
};

View File

@ -1,216 +0,0 @@
/*~ This file declares the Espruino globals.
*~ Reference: https://banglejs.com/reference#_global
*/
/* Note: The following don't have to be declared as they are
* already part of regular JavaScript:
* btoa
* clearInterval
* clearTimeout
* decodeURIComponent
* encodeURIComponent
* eval
* Infinity
* isFinite
* isNaN
* NaN
* parseFloat
* parseInt
* setInterval
* setTimeout
*/
// Pins
declare type Pin = number;
declare type PinMode =
| "analog"
| "input"
| "intupt_pullup"
| "intupt_pulldown"
| "output"
| "opendrain"
| "af_output"
| "af_opendrain";
declare const BTN: 24;
declare const BTN1: 24;
declare const BTN2: 22;
declare const BTN3: 23;
declare const BTN4: 11;
declare const BTN5: 16;
declare const VIBRATE: 13;
declare function getPinMode(pin: Pin): PinMode;
declare function pinMode(
pin: Pin,
mode?: PinMode | "auto",
automatic?: boolean
): void;
// Analog pins
/**
* Get the analog value of the given pin.
* This is different to Arduino which only returns an integer between 0 and 1023.
* However only pins connected to an ADC will work (see the datasheet).
* **Note**: if you didn't call `pinMode` beforehand then this function will also reset pin's state to "analog".
* @param {number} pin - The pin to use.
* @returns {number} The analog Value of the Pin between 0 and 1.
* @url https://banglejs.com/reference#l__global_analogRead
*/
declare function analogRead(pin: Pin): number;
/**
* Set the analog Value of a pin. It will be output using PWM.
* **Note**: if you didn't call pinMode beforehand then this function will also reset pin's state to "output".
* @param {number} pin - The pin to use.
* @param {number} value - A value between 0 and 1.
* @param {object} [options] - Additonal options.
* @param {number} [options.freq] - Pulse frequency in Hz, e.g. 10 - specifying a frequency will force PWM output, even if the pin has a DAC.
* @param {boolean} [options.soft] - If true software PWM is used if hardware is not available.
* @param {boolean} [options.forceSoft] - If true software PWM is used even if hardware PWM or a DAC is available.
*/
declare function analogWrite(
pin: Pin,
value: number,
options?: { freq?: number; soft?: boolean; forceSoft?: boolean }
): void;
// Digital pins
declare const HIGH: 1;
declare const LOW: 0;
declare function digitalPulse(pin: Pin, value: boolean, time: number): void;
declare function digitalRead(pin: Pin | Pin[]): number;
declare function digitalWrite(pin: Pin, value: boolean): void;
declare function digitalWrite(pin: Pin[], value: number): void;
declare function digitalWrite(
pin: {
write: (value: boolean) => void;
},
value: boolean
): void;
// Other globals
declare function atob(base64Data: string): string;
declare function btoa(binaryData: string): string;
declare function changeInterval(id: number, time: number): void;
declare function dump(): void;
declare function echo(echoOn: boolean): void;
declare function edit(funcName: string | Function): void;
declare function getSerial(): number;
declare function getTime(): number;
declare const global: any; //TODO define better
declare const I2C1: I2C;
declare function load(file?: string): void;
declare function peek8(address: number, count?: 1): number;
declare function peek8(address: number, count: number): Uint8Array;
declare function peek16(address: number, count?: 1): number;
declare function peek16(address: number, count: number): Uint16Array;
declare function peek32(address: number, count?: 1): number;
declare function peek32(address: number, count: number): Uint32Array;
declare function poke8(address: number, value: number): void;
declare function poke16(address: number, value: number): void;
declare function poke32(address: number, value: number): void;
declare function print(...args: any[]): void;
declare const Serial1: Serial;
declare const Bluetooth: Serial;
declare const LoopbackA: Serial;
declare const LoopbackB: Serial;
declare function require(module: "heatshrink"): {
decompress: (compressedString: string) => string;
};
declare function require(module: "Storage"): Storage;
declare type Module = "heatshrink" | "Storage";
declare function reset(clearFlash?: true): void;
declare function setInterval(id: any): void;
declare function setBusyIndicator(pin?: Pin): void;
declare function setSleepIndicator(pin?: Pin): void;
declare function setTime(time: number): void;
type Data =
| number
| string
| Array<Data>
| ArrayBuffer
| { data: Data; count: number }
| { callback: () => Data };
declare function shiftOut(
pins: Pin | Pin[],
options: { clk: Pin; repeat?: number },
data: Data
): void;
declare const SPI1: SPIInstance;
declare const Terminal: Serial;
declare function trace(root?: number): void;
// Watches
declare function clearWatch(id?: number): void;
declare const setWatch: ((
callback:
| ((obj: { state: boolean; time: number; lastTime: number }) => void)
| string,
pin: number,
options?:
| boolean
| number
| {
repeat?: boolean;
edge?: "rising" | "falling" | "both";
debounce?: number;
irq?: boolean;
}
) => number) &
// If a data option is specified, the callback will also have one.
((
callback:
| ((obj: {
state: boolean;
time: number;
lastTime: number;
data: any; // TODO: Specify data type
}) => void)
| string,
pin: number,
options?: {
data: number;
repeat?: boolean;
edge?: "rising" | "falling" | "both";
debounce?: number;
irq?: boolean;
}
) => number);

View File

@ -1,266 +0,0 @@
/*~ This file declares the Graphics class.
*~ Reference: https://banglejs.com/reference#Graphics
*/
type Image = {
width: number;
height: number;
buffer: ArrayBuffer | string;
bpp?: number;
transparent?: number;
palette?: Uint16Array;
};
type Theme = {
fg: number;
bg: number;
fg2: number;
bg2: number;
fgH: number;
bgH: number;
dark: boolean;
};
type Layer = {
x: number;
y: number;
image: string | Image | ArrayBuffer;
scale?: number;
rotate?: number;
center?: boolean;
repeat?: boolean;
nobounds?: boolean;
};
type GraphicsApi = {
asBMP: () => string | undefined;
asImage: ((type: "object" | undefined) => object) &
((type: "string") => string);
asURL: () => string | undefined;
blit: (options: {
x1: number;
y1: number;
w: number;
h: number;
x2: number;
y2: number;
setModified?: boolean;
}) => GraphicsApi;
buffer: ArrayBuffer;
clear: (reset?: boolean) => GraphicsApi;
clearRect: ((x1: number, y1: number, x2: number, y2: number) => GraphicsApi) &
((options: {
x: number;
y: number;
x2: number;
y2: number;
}) => GraphicsApi) &
((options: { x: number; y: number; w: number; h: number }) => GraphicsApi);
createArrayBuffer: (
width: number,
height: number,
bpp: number,
options?: {
zigzag?: boolean;
vertical_byte?: boolean;
msb?: boolean;
interleavex?: boolean;
color_order?: "rgb" | "rbg" | "grb" | "gbr" | "brg" | "bgr";
}
) => GraphicsApi;
createCallback: (
width: number,
height: number,
bpp: number,
callback: ((x: number, y: number, colour: number) => void) & {
setPixel: (x: number, y: number, colour: number) => void;
fillRect: (
x1: number,
y1: number,
x2: number,
y2: number,
colour: number
) => void;
}
) => GraphicsApi;
createImage: (str: string) => Image;
drawCircle: (x: number, y: number, radius: number) => GraphicsApi;
drawCircleAA: (x: number, y: number, radius: number) => GraphicsApi;
drawEllipse: (x1: number, y1: number, x2: number, y2: number) => GraphicsApi;
drawImage: (
image: string | Image | ArrayBuffer,
xOffset: number,
yOffset: number,
options?: {
rotate?: number;
scale?: number;
frame?: number;
}
) => GraphicsApi;
drawImages: (
layers: [Layer?, Layer?, Layer?],
options?: {
x: number;
y: number;
width: number;
height: number;
}
) => GraphicsApi;
drawLine: (x1: number, y1: number, x2: number, y2: number) => GraphicsApi;
drawLineAA: (x1: number, y1: number, x2: number, y2: number) => GraphicsApi;
// TODO: Somehow define that poly must have an even number of items
drawPoly: (poly: number[], closed?: boolean) => GraphicsApi;
drawPolyAA: (poly: number[], closed?: boolean) => GraphicsApi;
drawRect: (x1: number, y1: number, x2: number, y2: number) => GraphicsApi;
drawString: (
str: string | number | boolean,
x: number,
y: number,
solid?: boolean
) => GraphicsApi;
dump: () => void;
fillCircle: (x: number, y: number, radius: number) => GraphicsApi;
fillEllipse: (x1: number, y1: number, x2: number, y2: number) => GraphicsApi;
fillPoly: (poly: number[], closed?: boolean) => GraphicsApi;
fillPolyAA: (poly: number[], closed?: boolean) => GraphicsApi;
fillRect: (x1: number, y1: number, x2: number, y2: number) => GraphicsApi;
flip: (all?: boolean) => GraphicsApi;
getBgColor: () => number;
getBPP: () => number;
getColor: () => number;
getFont: () => string;
getFontHeight: () => number;
getFonts: () => string[];
getHeight: () => number;
getInstance: () => GraphicsApi | undefined;
getModified: (
reset?: boolean
) => { x1: number; y1: number; x2: number; y2: number } | undefined;
getPixel: (x: number, y: number) => number;
getWidth: () => number;
imageMetrics: (image: string | GraphicsApi | Image | ArrayBuffer) =>
| {
width: number;
height: number;
bpp: number;
transparent: number;
}
| undefined;
lineTo: (x: number, y: number) => GraphicsApi;
moveTo: (x: number, y: number) => GraphicsApi;
quadraticBezier: (
vertices: [
x0: number,
y0: number,
x1: number,
y1: number,
x2: number,
y2: number
],
points?: number
) => number[];
reset: () => GraphicsApi;
scroll: (x: number, y: number) => GraphicsApi;
setBgColor: ((color: string) => GraphicsApi) &
((color: number) => GraphicsApi) &
((r: number, g: number, b: number) => GraphicsApi);
setClipRect: (x1: number, y1: number, x2: number, y2: number) => GraphicsApi;
setColor: ((color: string) => GraphicsApi) &
((color: number) => GraphicsApi) &
((r: number, g: number, b: number) => GraphicsApi);
setFont: (name?: string, size?: number) => GraphicsApi;
setFontAlign: (
x: -1 | 0 | 1,
y: -1 | 0 | 1,
rotation?: 0 | 1 | 2 | 3
) => GraphicsApi;
setFontBitmap: () => GraphicsApi;
setFontCustom: (
bitmap: ArrayBuffer,
firstChar: number,
width: number | string,
height: number
) => GraphicsApi;
setFontVector: (size: number) => GraphicsApi;
setPixel: (
x: number,
y: number,
colour: number | string | undefined
) => GraphicsApi;
setRotation: (rotation: 0 | 1 | 2 | 3, reflect?: boolean) => GraphicsApi;
setTheme: (theme: Theme) => GraphicsApi;
stringMetrics: (str: string) => { width: number; height: number };
stringWidth: (str: string) => number;
theme: Theme;
toColor: ((color: string) => number) &
((color: number) => number) &
((r: number, g: number, b: number) => number);
transformVertices: (
verts: number[],
transformation:
| { x?: number; y?: number; scale?: number; rotate?: number }
| [number, number, number, number, number, number] // 2D transformation matrix
) => number[];
wrapString: (str: string, maxWidth: number) => string[];
};

View File

@ -1,7 +0,0 @@
/*~ This file declares the I2c class.
*~ Reference: https://banglejs.com/reference#I2C
*/
declare class I2C {
constructor();
}

File diff suppressed because it is too large Load Diff

22
typescript/types/other.d.ts vendored Normal file
View File

@ -0,0 +1,22 @@
// Bangle.js globals
declare const g: Graphics;
type WidgetArea = "tl" | "tr" | "bl" | "br";
type Widget = {
area: WidgetArea;
width: number;
draw: (this: { x: number; y: number }) => void;
};
declare const WIDGETS: { [key: string]: Widget };
// Required for TypeScript to work properly
interface NewableFunction extends Function {}
interface CallableFunction extends Function {}
interface IArguments {
[index: number]: any;
length: number;
callee: Function;
}
// Helper type
type Exclude<T, U> = T extends U ? never : T;

View File

@ -1 +0,0 @@
declare type Serial = {};

View File

@ -1,24 +0,0 @@
declare type SPI = {
find(pin: Pin): SPIInstance | undefined;
new (): SPIInstance;
};
type TOrArray<T> = T | TOrArray<T>[];
type TArrObj<T> = T | TArrObj<T>[] | { data: TArrObj<T>; count: number };
type NumStrArr = TOrArray<number | string>;
declare type SPIInstance = {
send(data: TArrObj<number | string>, nss_pin: number): any;
send4bit(data: NumStrArr, bit0: number, bit1: number, nss_pin: number): void;
send8bit(data: NumStrArr, bit0: number, bit1: number, nss_pin: number): void;
setup(options: {
sck?: Pin;
miso?: Pin;
mosi?: Pin;
baud?: number;
mode?: 0 | 1 | 2 | 3;
order?: "msb" | "lsb";
bits?: number;
}): void;
write(...data: Array<Data | Pin>): void;
};

View File

@ -1,29 +0,0 @@
type FileData = string | Array<any> | Object;
declare interface Storage {
compact: () => void;
erase: (name: string) => void;
eraseAll: () => void;
getFree: () => number;
hash: (regex?: RegExp) => number; // More specifically it returns Uint32
list: (regex?: RegExp, filter?: { sf: boolean }) => string[];
open: (name: string, mode: "r" | "w" | "a") => StorageFile;
read: (name: string, offset?: number, length?: number) => string | undefined;
readArrayBuffer: (name: string) => ArrayBuffer | undefined;
readJSON: (name: string, noExceptions?: boolean) => any;
write: (
name: string,
data: FileData,
offset?: number,
size?: number
) => boolean;
writeJSON: (name: string, data: any) => boolean;
}
declare interface StorageFile {
erase: () => void;
getLength: () => number;
read: (len: number) => string | undefined;
readLine: () => string | undefined;
write: (data: FileData) => string;
}