Move remaining .d.ts files to .ts (#5208)

* Update CRDT protobuf generation to create a .ts file

* Move remaining .d.ts files to .ts

* Fix remaining type errors

* Ignore .d.ts files so we don't accidentally use them in the future

* Add release notes
This commit is contained in:
Julian Dominguez-Schatz
2025-07-03 14:59:21 -04:00
committed by GitHub
parent c1d70722b8
commit 7b71374e79
15 changed files with 121 additions and 80 deletions

3
.gitignore vendored
View File

@@ -60,3 +60,6 @@ fly.toml
# TypeScript cache
build/
# .d.ts files aren't type-checked with skipLibCheck set to true
*.d.ts

View File

@@ -18,4 +18,9 @@ protoc --plugin="protoc-gen-ts=../../node_modules/.bin/protoc-gen-ts" \
../../node_modules/.bin/prettier --write src/proto/*.d.ts
for file in src/proto/*.d.ts; do
{ echo "/* eslint-disable @typescript-eslint/no-namespace */"; sed 's/export class/export declare class/g' "$file"; } > "${file%.d.ts}.ts"
rm "$file"
done
echo 'One more step! Find the `var global = ...` declaration in src/proto/sync_pb.js and change it to `var global = globalThis;`'

View File

@@ -11,7 +11,7 @@
"scripts": {
"build:node": "tsc --p tsconfig.dist.json",
"proto:generate": "./bin/generate-proto",
"build": "rm -rf dist && yarn run build:node && cp src/proto/sync_pb.d.ts dist/src/proto/",
"build": "rm -rf dist && yarn run build:node",
"test": "vitest --globals"
},
"dependencies": {
@@ -20,6 +20,8 @@
"uuid": "^11.1.0"
},
"devDependencies": {
"@types/google-protobuf": "^3.15.12",
"protoc-gen-js": "^3.21.4-4",
"ts-protoc-gen": "^0.15.0",
"typescript": "^5.8.3",
"vitest": "^3.2.4"

View File

@@ -157,9 +157,9 @@ proto.EncryptedData.prototype.toObject = function(opt_includeInstance) {
*/
proto.EncryptedData.toObject = function(includeInstance, msg) {
var f, obj = {
iv: msg.getIv_asB64(),
authtag: msg.getAuthtag_asB64(),
data: msg.getData_asB64()
iv: msg.getIv_asB64(),
authtag: msg.getAuthtag_asB64(),
data: msg.getData_asB64()
};
if (includeInstance) {
@@ -419,10 +419,10 @@ proto.Message.prototype.toObject = function(opt_includeInstance) {
*/
proto.Message.toObject = function(includeInstance, msg) {
var f, obj = {
dataset: jspb.Message.getFieldWithDefault(msg, 1, ""),
row: jspb.Message.getFieldWithDefault(msg, 2, ""),
column: jspb.Message.getFieldWithDefault(msg, 3, ""),
value: jspb.Message.getFieldWithDefault(msg, 4, "")
dataset: jspb.Message.getFieldWithDefault(msg, 1, ""),
row: jspb.Message.getFieldWithDefault(msg, 2, ""),
column: jspb.Message.getFieldWithDefault(msg, 3, ""),
value: jspb.Message.getFieldWithDefault(msg, 4, "")
};
if (includeInstance) {
@@ -639,9 +639,9 @@ proto.MessageEnvelope.prototype.toObject = function(opt_includeInstance) {
*/
proto.MessageEnvelope.toObject = function(includeInstance, msg) {
var f, obj = {
timestamp: jspb.Message.getFieldWithDefault(msg, 1, ""),
isencrypted: jspb.Message.getBooleanFieldWithDefault(msg, 2, false),
content: msg.getContent_asB64()
timestamp: jspb.Message.getFieldWithDefault(msg, 1, ""),
isencrypted: jspb.Message.getBooleanFieldWithDefault(msg, 2, false),
content: msg.getContent_asB64()
};
if (includeInstance) {
@@ -860,12 +860,12 @@ proto.SyncRequest.prototype.toObject = function(opt_includeInstance) {
*/
proto.SyncRequest.toObject = function(includeInstance, msg) {
var f, obj = {
messagesList: jspb.Message.toObjectList(msg.getMessagesList(),
messagesList: jspb.Message.toObjectList(msg.getMessagesList(),
proto.MessageEnvelope.toObject, includeInstance),
fileid: jspb.Message.getFieldWithDefault(msg, 2, ""),
groupid: jspb.Message.getFieldWithDefault(msg, 3, ""),
keyid: jspb.Message.getFieldWithDefault(msg, 5, ""),
since: jspb.Message.getFieldWithDefault(msg, 6, "")
fileid: jspb.Message.getFieldWithDefault(msg, 2, ""),
groupid: jspb.Message.getFieldWithDefault(msg, 3, ""),
keyid: jspb.Message.getFieldWithDefault(msg, 5, ""),
since: jspb.Message.getFieldWithDefault(msg, 6, "")
};
if (includeInstance) {
@@ -1140,9 +1140,9 @@ proto.SyncResponse.prototype.toObject = function(opt_includeInstance) {
*/
proto.SyncResponse.toObject = function(includeInstance, msg) {
var f, obj = {
messagesList: jspb.Message.toObjectList(msg.getMessagesList(),
messagesList: jspb.Message.toObjectList(msg.getMessagesList(),
proto.MessageEnvelope.toObject, includeInstance),
merkle: jspb.Message.getFieldWithDefault(msg, 2, "")
merkle: jspb.Message.getFieldWithDefault(msg, 2, "")
};
if (includeInstance) {

View File

@@ -1,9 +1,10 @@
/* eslint-disable @typescript-eslint/no-namespace */
// package:
// file: sync.proto
import * as jspb from 'google-protobuf';
export class EncryptedData extends jspb.Message {
export declare class EncryptedData extends jspb.Message {
getIv(): Uint8Array | string;
getIv_asU8(): Uint8Array;
getIv_asB64(): string;
@@ -48,7 +49,7 @@ export namespace EncryptedData {
};
}
export class Message extends jspb.Message {
export declare class Message extends jspb.Message {
getDataset(): string;
setDataset(value: string): void;
@@ -88,7 +89,7 @@ export namespace Message {
};
}
export class MessageEnvelope extends jspb.Message {
export declare class MessageEnvelope extends jspb.Message {
getTimestamp(): string;
setTimestamp(value: string): void;
@@ -129,7 +130,7 @@ export namespace MessageEnvelope {
};
}
export class SyncRequest extends jspb.Message {
export declare class SyncRequest extends jspb.Message {
clearMessagesList(): void;
getMessagesList(): Array<MessageEnvelope>;
setMessagesList(value: Array<MessageEnvelope>): void;
@@ -178,7 +179,7 @@ export namespace SyncRequest {
};
}
export class SyncResponse extends jspb.Message {
export declare class SyncResponse extends jspb.Message {
clearMessagesList(): void;
getMessagesList(): Array<MessageEnvelope>;
setMessagesList(value: Array<MessageEnvelope>): void;

View File

@@ -1,19 +0,0 @@
import { type CSSObject } from '@emotion/css/dist/declarations/src/create-instance';
// Allow images to be imported
declare module '*.png';
declare module 'react' {
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
interface CSSProperties extends CSSObject {}
}
declare global {
function __resetWorld(): void;
namespace PlaywrightTest {
interface Matchers<R> {
toMatchThemeScreenshots(): Promise<R>;
}
}
}

View File

@@ -0,0 +1,16 @@
import '@playwright/test';
// Allow images to be imported
declare module '*.png';
declare global {
function __resetWorld(): void;
// eslint-disable-next-line @typescript-eslint/no-namespace
namespace PlaywrightTest {
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
interface Matchers<R> {
toMatchThemeScreenshots(): Promise<R>;
}
}
}

View File

@@ -1,6 +1,6 @@
// @ts-strict-ignore
import { GlobalPrefsJson } from '../../../../types/prefs';
import * as T from '../index.d';
import * as T from '../index-types';
const store: GlobalPrefsJson = {};

View File

@@ -0,0 +1,35 @@
import type { GlobalPrefsJson } from '../../../types/prefs';
export declare function init(opts?: { persist?: boolean }): void;
export type Init = typeof init;
export declare function getItem<K extends keyof GlobalPrefsJson>(
key: K,
): Promise<GlobalPrefsJson[K]>;
export type GetItem = typeof getItem;
export declare function setItem<K extends keyof GlobalPrefsJson>(
key: K,
value: GlobalPrefsJson[K],
): Promise<void>;
export type SetItem = typeof setItem;
export declare function removeItem(key: keyof GlobalPrefsJson): Promise<void>;
export type RemoveItem = typeof removeItem;
export declare function multiGet<K extends readonly (keyof GlobalPrefsJson)[]>(
keys: K,
): Promise<{ [P in K[number]]: GlobalPrefsJson[P] }>;
export type MultiGet = typeof multiGet;
export declare function multiSet<K extends keyof GlobalPrefsJson>(
keyValues: Array<[K, GlobalPrefsJson[K]]>,
): Promise<void>;
export type MultiSet = typeof multiSet;
export declare function multiRemove(
keys: (keyof GlobalPrefsJson)[],
): Promise<void>;
export type MultiRemove = typeof multiRemove;

View File

@@ -1,35 +0,0 @@
import { GlobalPrefs, GlobalPrefsJson } from '../../../types/prefs';
export function init(opts?: { persist?: boolean }): void;
export type Init = typeof init;
type InferType<K extends keyof GlobalPrefsJson> = GlobalPrefs[K];
export function getItem<K extends keyof GlobalPrefsJson>(
key: K,
): Promise<GlobalPrefsJson[K]>;
export type GetItem = typeof getItem;
export function setItem<K extends keyof GlobalPrefsJson>(
key: K,
value: GlobalPrefsJson[K],
): Promise<void>;
export type SetItem = typeof setItem;
export function removeItem(key: keyof GlobalPrefsJson): Promise<void>;
export type RemoveItem = typeof removeItem;
export function multiGet<K extends readonly (keyof GlobalPrefsJson)[]>(
keys: K,
): Promise<{ [P in K[number]]: GlobalPrefsJson[P] }>;
export type MultiGet = typeof multiGet;
export function multiSet<K extends keyof GlobalPrefsJson>(
keyValues: Array<[K, GlobalPrefsJson[K]]>,
): Promise<void>;
export type MultiSet = typeof multiSet;
export function multiRemove(keys: (keyof GlobalPrefsJson)[]): Promise<void>;
export type MultiRemove = typeof multiRemove;

View File

@@ -5,7 +5,7 @@ import { join } from 'path';
import { GlobalPrefsJson } from '../../../types/prefs';
import * as lootFs from '../fs';
import * as T from './index.d';
import * as T from './index-types';
const getStorePath = () => join(lootFs.getDataDir(), 'global-store.json');
let store: GlobalPrefsJson;

View File

@@ -2,7 +2,7 @@
import { GlobalPrefsJson } from '../../../types/prefs';
import { getDatabase } from '../indexeddb';
import * as T from './index.d';
import * as T from './index-types';
export const init: T.Init = function () {};

View File

@@ -0,0 +1,6 @@
---
category: Maintenance
authors: [jfdoming]
---
Move remaining .d.ts files to .ts

View File

@@ -67,8 +67,10 @@ __metadata:
version: 0.0.0-use.local
resolution: "@actual-app/crdt@workspace:packages/crdt"
dependencies:
"@types/google-protobuf": "npm:^3.15.12"
google-protobuf: "npm:^3.21.4"
murmurhash: "npm:^2.0.1"
protoc-gen-js: "npm:^3.21.4-4"
ts-protoc-gen: "npm:^0.15.0"
typescript: "npm:^5.8.3"
uuid: "npm:^11.1.0"
@@ -6550,6 +6552,13 @@ __metadata:
languageName: node
linkType: hard
"@types/google-protobuf@npm:^3.15.12":
version: 3.15.12
resolution: "@types/google-protobuf@npm:3.15.12"
checksum: 10/a5c5f09a3fc4bc6a9339df29f4a32daf77c37f2bce6e8aa7b949fae19829a87c351786b7401eb45ea643dfa98d5155ffd9dd637c3ec61f69a30979bd67f6954e
languageName: node
linkType: hard
"@types/hast@npm:^3.0.0":
version: 3.0.4
resolution: "@types/hast@npm:3.0.4"
@@ -7633,6 +7642,13 @@ __metadata:
languageName: unknown
linkType: soft
"adm-zip@npm:0.5.10":
version: 0.5.10
resolution: "adm-zip@npm:0.5.10"
checksum: 10/c5ab79b77114d8277f0cbfd6cca830198d6c7ee4971f6960f48e08cd2375953b11dc71729b7f396abd51d2d6cce8c862fad185ea90cb2c84ab5161c37ed1b099
languageName: node
linkType: hard
"adm-zip@npm:0.5.16":
version: 0.5.16
resolution: "adm-zip@npm:0.5.16"
@@ -16523,6 +16539,17 @@ __metadata:
languageName: node
linkType: hard
"protoc-gen-js@npm:^3.21.4-4":
version: 3.21.4-4
resolution: "protoc-gen-js@npm:3.21.4-4"
dependencies:
adm-zip: "npm:0.5.10"
bin:
protoc-gen-js: cli.js
checksum: 10/43d5469195fb28ecbb6e2f387601c22d7a032aaffd5eadee10e02ca4a6b6361bfb54e83fe220b6eef36a27011421f3a0ef86e163116273d71ab9158d31980c3b
languageName: node
linkType: hard
"proxy-addr@npm:^2.0.7":
version: 2.0.7
resolution: "proxy-addr@npm:2.0.7"