mirror of
https://github.com/GoogleChromeLabs/squoosh.git
synced 2025-11-14 17:49:52 +00:00
# Conflicts: # codecs/cpp.Dockerfile # codecs/imagequant/example.html # codecs/webp/dec/webp_dec.d.ts # codecs/webp/dec/webp_dec.js # codecs/webp/dec/webp_dec.wasm # codecs/webp/enc/webp_enc.d.ts # codecs/webp/enc/webp_enc.js # codecs/webp/enc/webp_enc.wasm # package-lock.json # package.json # src/codecs/tiny.webp # src_old/codecs/encoders.ts # src_old/codecs/processor-worker/tiny.avif # src_old/codecs/processor-worker/tiny.webp # src_old/codecs/tiny.webp # src_old/components/compress/index.tsx # src_old/lib/util.ts # src_old/sw/util.ts
58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
// This file contains the utils that are needed for the very first rendering of the page. They're
|
|
// here because WebPack isn't quite smart enough to split things in the same file.
|
|
|
|
/**
|
|
* A decorator that binds values to their class instance.
|
|
* @example
|
|
* class C {
|
|
* @bind
|
|
* foo () {
|
|
* return this;
|
|
* }
|
|
* }
|
|
* let f = new C().foo;
|
|
* f() instanceof C; // true
|
|
*/
|
|
export function bind(
|
|
target: any,
|
|
propertyKey: string,
|
|
descriptor: PropertyDescriptor,
|
|
) {
|
|
return {
|
|
// the first time the prototype property is accessed for an instance,
|
|
// define an instance property pointing to the bound function.
|
|
// This effectively "caches" the bound prototype method as an instance property.
|
|
get() {
|
|
const bound = descriptor.value.bind(this);
|
|
Object.defineProperty(this, propertyKey, {
|
|
value: bound,
|
|
});
|
|
return bound;
|
|
},
|
|
};
|
|
}
|
|
|
|
/** Creates a function ref that assigns its value to a given property of an object.
|
|
* @example
|
|
* // element is stored as `this.foo` when rendered.
|
|
* <div ref={linkRef(this, 'foo')} />
|
|
*/
|
|
export function linkRef<T>(obj: any, name: string) {
|
|
const refName = `$$ref_${name}`;
|
|
let ref = obj[refName];
|
|
if (!ref) {
|
|
ref = obj[refName] = (c: T) => {
|
|
obj[name] = c;
|
|
};
|
|
}
|
|
return ref;
|
|
}
|
|
|
|
// Edge doesn't support `new File`, so here's a hacky alternative.
|
|
// https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/9551546/
|
|
export class Fileish extends Blob {
|
|
constructor(data: any[], public name: string, opts?: BlobPropertyBag) {
|
|
super(data, opts);
|
|
}
|
|
}
|