update decorators

This commit is contained in:
tresabhi committed 2026-06-23 14:41:44 -05:00
1 parent 81cc43bd08
commit c292ddcd6a
4 files changed
+41 -38

No files matched your search

+1 -5
View File
@@ -11,11 +11,7 @@ export default defineConfig({
vite: { vite: {
server: { allowedHosts: [] }, server: { allowedHosts: [] },
esbuild: { esbuild: { target: "es2022" },
minifyIdentifiers: true,
minifySyntax: false,
minifyWhitespace: true,
},
build: { build: {
rollupOptions: { rollupOptions: {
+16 -14
View File
@@ -82,35 +82,37 @@ export abstract class AbstractAPI {
} }
} }
export function Cache<Arguments extends unknown[]>(disableInDev = false) { export function Cache(disableInDev = false) {
const cache = new WeakMap<object, Map<string, Promise<unknown>>>(); const cache = new WeakMap<object, Map<string, Promise<unknown>>>();
return function ( return function <This, Arguments extends any[], Return>(
_target: unknown, target: (this: This, ...args: Arguments) => Promise<Return>,
_propertyKey: string, // TODO: evaluate if we need context to make the error trace easier
descriptor: PropertyDescriptor, // context: ClassMethodDecoratorContext<
// This,
// (this: This, ...args: Arguments) => Promise<Return>
// >,
) { ) {
const original = descriptor.value; return async function replacementMethod(this: This, ...args: Arguments) {
descriptor.value = function (...args: Arguments) {
const key = args.join("-"); const key = args.join("-");
let thisCache: Map<string, Promise<Return>>;
let thisCache = cache.get(this); if (cache.has(this as object)) {
thisCache = cache.get(this as object) as Map<string, Promise<Return>>;
if (!thisCache) { } else {
thisCache = new Map(); thisCache = new Map();
cache.set(this, thisCache); cache.set(this as object, thisCache);
} }
const disabled = disableInDev && import.meta.env.DEV; const disabled = disableInDev && import.meta.env.DEV;
if (thisCache.has(key) && !disabled) { if (thisCache.has(key) && !disabled) {
return thisCache.get(key); return thisCache.get(key)!;
} }
const promise = (async () => { const promise = (async () => {
try { try {
return await original.apply(this, args); return await target.apply(this, args);
} catch (error) { } catch (error) {
thisCache!.delete(key); thisCache!.delete(key);
throw error; throw error;
+22 -16
View File
@@ -21,7 +21,7 @@ export class ClientAPI extends AbstractAPI {
throw new Error("MetadataAccessor is inaccessible on the client"); throw new Error("MetadataAccessor is inaccessible on the client");
} }
@UnimplementedOnClient @UnimplementedOnClient()
mediaPrefix(): never { mediaPrefix(): never {
throw rejected(); throw rejected();
} }
@@ -85,7 +85,7 @@ export class ClientAPI extends AbstractAPI {
return json; return json;
} }
@UnimplementedOnClient @UnimplementedOnClient()
gameStrings() { gameStrings() {
return rejected(); return rejected();
} }
@@ -98,12 +98,12 @@ export class ClientAPI extends AbstractAPI {
return json; return json;
} }
@UnimplementedOnClient @UnimplementedOnClient()
gameStringGroups() { gameStringGroups() {
return rejected(); return rejected();
} }
@UnimplementedOnClient @UnimplementedOnClient()
avatar() { avatar() {
return rejected(); return rejected();
} }
@@ -112,38 +112,44 @@ export class ClientAPI extends AbstractAPI {
return fetchPB("/api/avatars/all.pb", Avatars); return fetchPB("/api/avatars/all.pb", Avatars);
} }
@UnimplementedOnClient @UnimplementedOnClient()
avatarList() { avatarList() {
return rejected(); return rejected();
} }
@UnimplementedOnClient @UnimplementedOnClient()
background() { background() {
return rejected(); return rejected();
} }
@UnimplementedOnClient @UnimplementedOnClient()
backgrounds() { backgrounds() {
return rejected(); return rejected();
} }
@UnimplementedOnClient @UnimplementedOnClient()
currencyIcon() { currencyIcon() {
return rejected(); return rejected();
} }
@UnimplementedOnClient @UnimplementedOnClient()
stuffIcon() { stuffIcon() {
return rejected(); return rejected();
} }
} }
function UnimplementedOnClient( export function UnimplementedOnClient() {
_target: unknown, return function <This, Arguments extends any[], Return>(
propertyKey: string, _target: (this: This, ...args: Arguments) => Promise<Return>,
descriptor: PropertyDescriptor, context: ClassMethodDecoratorContext<
) { This,
descriptor.value = function () { (this: This, ...args: Arguments) => Promise<Return>
throw new Error(`${propertyKey} is not implemented on the client`); >,
) {
return function () {
throw new Error(
`${String(context.name)} is not implemented on the client`,
);
};
}; };
} }
+2 -3
View File
@@ -15,10 +15,9 @@
"incremental": true, "incremental": true,
"isolatedModules": true, "isolatedModules": true,
"paths": { "paths": {
"@protos/*": ["./packages/closed/protos/*"] "@protos/*": ["./packages/closed/protos/*"],
}, },
"strictNullChecks": true, "strictNullChecks": true,
"experimentalDecorators": true
}, },
"exclude": ["node_modules/**/*", "dist"] "exclude": ["node_modules/**/*", "dist"],
} }