From 18f65ca4644a827aad210c0c6fe13ea30a713f10 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Tue, 10 Sep 2024 08:39:48 -0700 Subject: [PATCH 01/40] config: create devcontainer.json file --- .devcontainer/devcontainer.json | 59 +++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..a5cebae --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,59 @@ +{ + "name": "@decorators", + "dockerFile": "Dockerfile", + "remoteUser": "vscode", + "features": { + // the basics + "git": "latest", + "sshd": "latest", + "node": "latest", + // github cli + "ghcr.io/devcontainers/features/github-cli:1": {}, + // homebrew (linuxbrew) + "ghcr.io/meaningful-ooo/devcontainer-features/homebrew:2": {}, + // github actions + "ghcr.io/devcontainers-contrib/features/act:1": {}, + "ghcr.io/devcontainers-contrib/features/actionlint:1": {} + }, + "build": {}, + "updateRemoteUserUID": true, + // settings for the vscode editor + "customizations": { + "codespaces": { + "openFiles": [ + "README.md", + "deno.json" + ] + }, + "vscode": { + "settings": { + "deno.enable": true, + "deno.future": true, // TODO(nberlette): remove once deno 2.0 lands + "deno.lint": true, + "deno.codeLens.test": true, + "deno.cacheOnSave": true, + "deno.codeLens.testArgs": ["-A", "--no-check=remote", "--parallel", "--clean", "--doc"], + "editor.tabSize": 2, + "editor.stickyTabStops": true, + "editor.linkedEditing": true, + "editor.minimap.enabled": false, + "[typescript][typescriptreact][javascript][javascriptreact][json][jsonc][markdown]": { + "editor.defaultFormatter": "denoland.vscode-deno", + "editor.formatOnPaste": false, + "editor.formatOnSave": true + } + }, + "extensions": [ + "github.theme", + "github.vscode-github-actions", + "github.copilot", + "denoland.vscode-deno", + "editorconfig.editorconfig", + "redhat.vscode-yaml", + "bierner.markdown-preview-github-styles", + "mutantdino.resourcemonitor" + ] + } + }, + "updateContentCommand": "sudo deno upgrade --canary --force 2>&1" +} From ae0c51575167d8dab860814c91e29deb73b601a9 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Tue, 10 Sep 2024 09:16:53 -0700 Subject: [PATCH 02/40] config: create Dockerfile --- .devcontainer/Dockerfile | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .devcontainer/Dockerfile diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..2a921a6 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,37 @@ +# [Choice] Debian OS version: bullseye, buster +ARG VARIANT=bullseye +FROM --platform=linux/amd64 mcr.microsoft.com/vscode/devcontainers/base:0-${VARIANT} + +# update system packages and cleanup cache +ARG DEBIAN_FRONTEND=noninteractive + +# install gcc, git-extras, gnu coreutils +RUN sudo apt-get -y update \ + && sudo apt-get -y install --no-install-recommends gcc git-extras coreutils \ + && sudo apt-get -y upgrade && sudo rm -rf /var/lib/apt/lists/* + +# install latest deno and upgrade to canary +ENV DENO_INSTALL=/home/${USER:-vscode}/.local DENO_INSTALL_ROOT=${DENO_INSTALL}/bin +RUN curl -fsSL https://deno.land/install.sh | sh \ + && chown ${USER:-vscode} /home/${USER:-vscode}/.local/bin/deno \ + && deno upgrade canary + +# install brew and add to path +RUN /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" \ + && echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/${USER:-vscode}/.bashrc + +# install starship and configure some defaults +ENV STARSHIP_CONFIG=/home/${USER:-vscode}/.config/starship.toml +RUN curl -fsSL https://starship.rs/install.sh | sh -s -- -y \ + && chown ${USER:-vscode} /home/${USER:-vscode}/.local/bin/starship \ + && { \ + echo 'export PATH="$HOME/.local/bin:$PATH";'; \ + echo 'export STARSHIP_CONFIG="${HOME}/.config/starship.toml";'; \ + echo 'test -d "${HOME}/.config" || mkdir -p "${HOME}/.config";'; \ + echo 'test -f "${STARSHIP_CONFIG}" || starship preset -o "${STARSHIP_CONFIG}" tokyo-night;'; \ + echo 'eval "$(starship init bash)";'; \ + } >> /home/${USER:-vscode}/.bashrc + +# install bash completions for deno +RUN sudo mkdir -p /etc/bash_completion.d \ + && deno completions bash > /etc/bash_completion.d/deno.bash From 0e066bef5b6a29bf0dca49491a1b56026cf84e1d Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Tue, 10 Sep 2024 09:18:38 -0700 Subject: [PATCH 03/40] chore: move homebrew from devcontainer to dockerfile --- .devcontainer/devcontainer.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index a5cebae..d47c65c 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -9,8 +9,6 @@ "node": "latest", // github cli "ghcr.io/devcontainers/features/github-cli:1": {}, - // homebrew (linuxbrew) - "ghcr.io/meaningful-ooo/devcontainer-features/homebrew:2": {}, // github actions "ghcr.io/devcontainers-contrib/features/act:1": {}, "ghcr.io/devcontainers-contrib/features/actionlint:1": {} From 157d03b4d479bdcad78e2a6ec4242bfba7efe723 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Tue, 10 Sep 2024 09:35:07 -0700 Subject: [PATCH 04/40] fix: use absolute paths in Dockerfile --- .devcontainer/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 2a921a6..255b82a 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -14,7 +14,7 @@ RUN sudo apt-get -y update \ ENV DENO_INSTALL=/home/${USER:-vscode}/.local DENO_INSTALL_ROOT=${DENO_INSTALL}/bin RUN curl -fsSL https://deno.land/install.sh | sh \ && chown ${USER:-vscode} /home/${USER:-vscode}/.local/bin/deno \ - && deno upgrade canary + && /home/${USER:-vscode}/.local/bin/deno upgrade canary # install brew and add to path RUN /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" \ @@ -34,4 +34,4 @@ RUN curl -fsSL https://starship.rs/install.sh | sh -s -- -y \ # install bash completions for deno RUN sudo mkdir -p /etc/bash_completion.d \ - && deno completions bash > /etc/bash_completion.d/deno.bash + && /home/${USER:-vscode}/.local/bin/deno completions bash > /etc/bash_completion.d/deno.bash From b4fde15168ce65c9bedb861fbcaf0f064421bec0 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Tue, 10 Sep 2024 09:37:57 -0700 Subject: [PATCH 05/40] refactor: remove useless env directive from dockerfile --- .devcontainer/Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 255b82a..748ad81 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -21,7 +21,6 @@ RUN /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/instal && echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/${USER:-vscode}/.bashrc # install starship and configure some defaults -ENV STARSHIP_CONFIG=/home/${USER:-vscode}/.config/starship.toml RUN curl -fsSL https://starship.rs/install.sh | sh -s -- -y \ && chown ${USER:-vscode} /home/${USER:-vscode}/.local/bin/starship \ && { \ From 16b3cf7e404ac83e58d3768f69c08386f59359bb Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Tue, 10 Sep 2024 09:51:39 -0700 Subject: [PATCH 06/40] fix: path and perms issues in dockerfile and devcontainer.json --- .devcontainer/Dockerfile | 3 ++- .devcontainer/devcontainer.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 748ad81..5aa0119 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -21,7 +21,8 @@ RUN /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/instal && echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/${USER:-vscode}/.bashrc # install starship and configure some defaults -RUN curl -fsSL https://starship.rs/install.sh | sh -s -- -y \ +RUN export BIN_DIR=/home/${USER:-vscode}/.local/bin \ + && curl -fsSL https://starship.rs/install.sh | sh -s -- -y \ && chown ${USER:-vscode} /home/${USER:-vscode}/.local/bin/starship \ && { \ echo 'export PATH="$HOME/.local/bin:$PATH";'; \ diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index d47c65c..3b2e97b 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -53,5 +53,5 @@ ] } }, - "updateContentCommand": "sudo deno upgrade --canary --force 2>&1" + "updateContentCommand": "deno upgrade --canary --force 2>&1" } From 150ce7f86c980f4ac2eead61b9f00f9aca2df0b9 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Tue, 10 Sep 2024 18:14:37 +0000 Subject: [PATCH 07/40] fix: correct permissions on deno binary --- .devcontainer/Dockerfile | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 5aa0119..983f1a6 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -4,6 +4,7 @@ FROM --platform=linux/amd64 mcr.microsoft.com/vscode/devcontainers/base:0-${VARI # update system packages and cleanup cache ARG DEBIAN_FRONTEND=noninteractive +ARG USER=vscode # install gcc, git-extras, gnu coreutils RUN sudo apt-get -y update \ @@ -11,27 +12,27 @@ RUN sudo apt-get -y update \ && sudo apt-get -y upgrade && sudo rm -rf /var/lib/apt/lists/* # install latest deno and upgrade to canary -ENV DENO_INSTALL=/home/${USER:-vscode}/.local DENO_INSTALL_ROOT=${DENO_INSTALL}/bin +ENV DENO_INSTALL=/home/${USER}/.local DENO_INSTALL_ROOT=${DENO_INSTALL}/bin RUN curl -fsSL https://deno.land/install.sh | sh \ - && chown ${USER:-vscode} /home/${USER:-vscode}/.local/bin/deno \ - && /home/${USER:-vscode}/.local/bin/deno upgrade canary + && chown ${USER} ${DENO_INSTALL_ROOT}/deno \ + && ${DENO_INSTALL_ROOT-}/deno upgrade canary # install brew and add to path RUN /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" \ - && echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/${USER:-vscode}/.bashrc + && echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/${USER}/.bashrc # install starship and configure some defaults -RUN export BIN_DIR=/home/${USER:-vscode}/.local/bin \ +RUN export BIN_DIR=/home/${USER}/.local/bin \ && curl -fsSL https://starship.rs/install.sh | sh -s -- -y \ - && chown ${USER:-vscode} /home/${USER:-vscode}/.local/bin/starship \ + && chown ${USER} /home/${USER}/.local/bin/starship \ && { \ echo 'export PATH="$HOME/.local/bin:$PATH";'; \ echo 'export STARSHIP_CONFIG="${HOME}/.config/starship.toml";'; \ echo 'test -d "${HOME}/.config" || mkdir -p "${HOME}/.config";'; \ echo 'test -f "${STARSHIP_CONFIG}" || starship preset -o "${STARSHIP_CONFIG}" tokyo-night;'; \ echo 'eval "$(starship init bash)";'; \ - } >> /home/${USER:-vscode}/.bashrc + } >> /home/${USER}/.bashrc # install bash completions for deno RUN sudo mkdir -p /etc/bash_completion.d \ - && /home/${USER:-vscode}/.local/bin/deno completions bash > /etc/bash_completion.d/deno.bash + && /home/${USER}/.local/bin/deno completions bash > /etc/bash_completion.d/deno.bash From e71d8c72d4c5cb8d1b534ac7df54a1780016cde1 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Tue, 10 Sep 2024 11:43:15 -0700 Subject: [PATCH 08/40] fix(internal): fix bad internal types, improve docs --- internal/types.ts | 417 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 388 insertions(+), 29 deletions(-) diff --git a/internal/types.ts b/internal/types.ts index d6b14ea..995dd93 100644 --- a/internal/types.ts +++ b/internal/types.ts @@ -1,55 +1,414 @@ -export type As = T extends U ? U extends T ? U : T - : [T & U] extends [never] ? U & Omit - : T & U; - -export type Is = [T] extends [never] ? [U] extends [never] ? never : U - : T extends unknown ? U - : T extends U ? T - : U; +// deno-lint-ignore-file no-explicit-any ban-types +/** + * @module types + * + * This module provides internal utility types used throughout various projects + * in the `@decorators` namespace. These types are not intended for direct use + * by end users, but are instead used internally to provide type safety and + * consistency across the various projects and modules. They're located in this + * module to avoid redundancy and improve maintainability. + * + * @see https://jsr.io/@decorators for more information and a full list of the + * available packages offered by the `@decorators` project namespace. Thanks! + */ +/** + * Represents a unique symbol that is used to create branded and flavored types + * in TypeScript. This symbol is used to create nominal types and prevent type + * collisions in the type system. + * @see https://michalzalecki.com/nominal-typing-in-typescript/ + * @see {@linkcode Brand} for more information on branded types. + * @see {@linkcode Branded} for a helper type that creates branded types. + * @see {@linkcode Flavor} for more information on flavored types. + * @see {@linkcode Flavored} for a helper type that creates flavored types. + * @category Utility Types + */ export const BRAND: unique symbol = Symbol("BRAND"); + +/** + * Represents a unique symbol that is used to create branded and flavored types + * in TypeScript. This symbol is used to create nominal types and prevent type + * collisions in the type system. + * @see https://michalzalecki.com/nominal-typing-in-typescript/ + * @see {@linkcode Brand} for more information on branded types. + * @see {@linkcode Branded} for a helper type that creates branded types. + * @see {@linkcode Flavor} for more information on flavored types. + * @see {@linkcode Flavored} for a helper type that creates flavored types. + * @category Utility Types + */ export type BRAND = typeof BRAND; +/** + * Represents a unique symbol that can be used to create a simulated partial + * application of type parameters. This is useful for creating branded types + * with a default value for a type parameter. + * @category Utility Types + */ export const NEVER: unique symbol = Symbol("NEVER"); + +/** + * Represents a unique symbol that can be used to create a simulated partial + * application of type parameters. This is useful for creating branded types + * with a default value for a type parameter. + * @category Utility Types + */ export type NEVER = typeof NEVER; -export interface Brand { +/** + * Represents a unique brand for a type, which can be used to create nominal + * types in TypeScript and prevent type collisions. For a less-strict version + * of this type, see the {@linkcode Flavor} interface. + * + * To create a branded type, you can either use the {@linkcode Branded} helper + * type, or manually extend/intersect another type with this interface. The + * {@linkcode A} type parameter is the type that becomes the brand's value, and + * it defaults to `never`. + */ +export interface Brand { readonly [BRAND]: B; } +/** + * Creates a new branded type by intersecting the given type `V` with the + * {@linkcode Brand} interface. This can be used to create nominal types in + * TypeScript and prevent type collisions. + * + * This is an "overloaded" type that can be used in two ways: + * - If only two type arguments are provided, the first type `V` is branded + * with the second type `T` (e.g. `V & Brand`). + * - If three type arguments are provided, the first type `V` is **unioned** + * with type `T`, which is branded with the third type `B`. This is useful + * for creating things like a string literal union with a brand type. It is + * equivalent to `V | Branded`. + * + * @template V The type to brand with the given type `T`. + * @template T The type to brand the given type `V` with. + * @template [B=NEVER] The type that becomes the brand's value. Defaults to the + * special `NEVER` type, which is a unique symbol that can be used to create a + * simulated partial application of type parameters. + * @category Utility Types + */ export type Branded = [B] extends [NEVER] ? V & Brand : V | Branded; -export interface Flavor { +/** + * Represents a unique flavor for a type, which can be used to create nominal + * types in TypeScript and prevent type collisions. For a stricter version of + * this type, see the {@linkcode Brand} interface. + * + * To create a flavored type, you can either use the {@linkcode Flavored} + * helper type, or manually extend/intersect another type with this interface. + * The {@linkcode F} type parameter is the type that becomes the flavor's + * value, and it defaults to `never`. + */ +export interface Flavor { readonly [BRAND]?: F | void; } +/** + * Creates a new flavored type by intersecting the given type `V` with the + * {@linkcode Flavor} interface. This can be used to create nominal types in + * TypeScript and prevent type collisions. + * + * This is an "overloaded" type that can be used in two ways: + * - If only two type arguments are provided, the first type `V` is flavored + * with the second type `T` (e.g. `V & Flavor`). + * - If three type arguments are provided, the first type `V` is **unioned** + * with type `T`, which is flavored with the third type `F`. This is useful + * for creating things like a string literal union with a flavor type. It + * is equivalent to `V | Flavored`. + * + * @template V The type to flavor with the given type `T`. + * @template T The type to flavor the given type `V` with. + * @template [F=NEVER] The type that becomes the flavor's value. Defaults to + * the special `NEVER` type, which is a unique symbol that can be used to + * create a simulated partial application of type parameters. + * @category Utility Types + */ export type Flavored = [F] extends [NEVER] ? V & Flavor : V | Flavored; -// deno-lint-ignore ban-types +/** + * Represents an abstract constructor function (i.e. an abstract class) that + * **cannot** be directly instantiated, but can be extended by other classes. + * + * This is a supertype of the {@linkcode Constructor} type, and therefore it + * typically can be used in place of a constructor type to represent a normal + * concrete class as well. + * + * @template [T=any] The type of the instances created by the constructor. + * @template {readonly unknown[]} [A=readonly any[]] The type of the arguments + * passed to the constructor. + * @category Utility Types + */ +export type AbstractConstructor< + T = any, + A extends readonly unknown[] = readonly any[], +> = abstract new (...args: A) => T; + +/** + * Represents a constructor function that can be used to create new instances + * of a given type {@linkcode T}. Similar to {@linkcode AbstractConstructor}, + * but this represents a concrete class instead of an abstract one. + * + * Values of this type are subtypes of {@linkcode AbstractConstructor}. + * + * @template [T=any] The type of the instances created by the constructor. + * @template {readonly unknown[]} [A=readonly any[]] The type of the arguments + * passed to the constructor. + * @category Utility Types + */ +export type Constructor< + T = any, + A extends readonly unknown[] = readonly any[], +> = { + new (...args: A): T; +}; + +export type Class< + Prototype extends object | null = any, + Args extends readonly unknown[] = readonly any[], + Static extends {} = {}, +> = + & Constructor + & { readonly prototype: Prototype } + & ({} extends Static ? unknown : { + [K in keyof Static as [Static[K]] extends [never] ? never : K]: + & ThisType> + & Static[K]; + }); + +export type AbstractClass< + Prototype extends object | null = any, + Args extends readonly unknown[] = readonly any[], + Static extends {} = {}, +> = + & AbstractConstructor + & { readonly prototype: Prototype } + & ( + {} extends Static ? unknown + : { + [K in keyof Static as [Static[K]] extends [never] ? never : K]: + & ThisType> + & Static[K]; + } + ); + +/** + * Returns a union of the keys of an object `T` whose values are functions. + * This is useful for extracting the keys of a class's methods. + * @template T The object type to extract keys from. + * @category Utility Types + */ +export type FunctionKeys = { + [K in keyof T]: T[K] extends (...args: any) => any ? K : never; +}[keyof T]; + +/** + * Represents an accessor method's property descriptor. which may only have a + * getter and/or setter, a `configurable` flag, and an `enumerable` flag. The + * `value` and `writable` flags are not allowed. + * + * @template T The type of the accessor's value. + * @category Types + */ +export interface AccessorPropertyDescriptor { + get?(): T; + set?(value: T): void; + configurable?: boolean; + enumerable?: boolean; +} + +/** + * If `A` is `never`, `null`, or `undefined`, returns `B`. Otherwise, as long + * as `A` is assignable to `B`, returns `A`. Otherwise, returns `never`. + */ +export type Or = ([A & {}] extends [never] ? B : A) extends + infer V extends B ? V : never; + +/** + * Casts a type `T` to a type `U`, but only if `T` is assignable to `U`. If + * `T` is not assignable to `U`, and if `T & U` results in `never`, then the + * type `U` is intersected with the type `Omit`. This allows for + * partial type casting, where the two types are merged but defer to `U` where + * possible. If `T` is not assignable to `U`, and if `T & U` does not result in + * `never`, then the last resort is to return the intersection of `T` and `U`. + * + * @template T The type to cast to the type `U`. + * @template U The type to cast the type `T` to. + */ +export type As = T extends U ? U extends T ? U : T + : [T & U] extends [never] ? U & Omit + : T & U; + +/** + * Casts a type `T` to a type `U`, but only if `T` is assignable to `U`. If + * `Extract` results in `never`, then the type `U` is returned as is. + * + * @template T The type to cast to the type `U`. + * @template [U=unknown] The type to cast the type `T` to. + * @category Utility Types + */ +export type Is = Or, U>; + +/** + * Represents the mildest form of a branded generic string type. This type is + * used to create string literal unions that accept any string input, but will + * preserve the literal string union members for autocomplete purposes. + * + * For example, using `strings | "foo" | "bar"` for an argument type will allow + * any string to be passed, but will still suggest `"foo"` or `"bar"` as valid + * suggestions in an editor that supports TypeScript's language server. + * + * > **Note**: the lowercase name was chosen for this type to intentionally + * > convey that it is capable of being assigned any `string` value. It also + * > helps distinguish this type from the built-in `string` type, while still + * > being visually similar. + * + * @category Utility Types + */ export type strings = string & {}; -export type properties = Flavored; +/** + * Represents the mildest form of a branded generic number type. This type is + * used to create number literal unions that accept any number input, but will + * preserve the literal number union members for autocomplete purposes. + * + * Similiar to {@linkcode strings}, this type is useful for creating number + * literal unions that accept any number, but will still suggest the literal + * number union members for autocomplete purposes. + * + * > **Note**: the lowercase name was chosen for this type to intentionally + * > convey that it is capable of being assigned any `number` value. It also + * > helps distinguish this type from the built-in `number` type, while still + * > being visually similar. + * + * @category Utility Types + */ +export type numbers = number & {}; -export type KeyOf = - | (Strict extends true ? never : strings) - | (string & keyof T); +/** + * Represents the mildest form of a branded generic symbol type. This type is + * used to create symbol literal unions that accept any symbol input, but will + * preserve the literal symbol union members for autocomplete purposes. + * + * Similiar to {@linkcode strings} and {@linkcode numbers}, this type is useful + * for creating symbol literal unions that accept any symbol, but will still + * suggest the literal symbol union members for autocomplete purposes. + * + * > **Note**: the lowercase name was chosen for this type to intentionally + * > convey that it is capable of being assigned any `symbol` value. It also + * > helps distinguish this type from the built-in `symbol` type, while still + * > being visually similar. + * + * @category Utility Types + */ +// We cannot just intersect `symbol` with `{}`, as this will widen the type to +// `symbol`. Instead, we need to create a new type that is a subtype of symbol, +// with a property that is never used. +export type symbols = symbol & { [BRAND]?: never }; -export type PropKeys = - | (Strict extends true ? never : properties) - | (PropertyKey & keyof T); +/** + * Union of {@linkcode strings}, {@linkcode numbers}, and {@linkcode symbols}, + * this type can be used as an "anchor" type in a literal union of properties. + * This will ensure your literal union is not widened to a `string`, `number`, + * or `symbol` type, but will still accept any of these types as valid inputs. + * + * @category Utility Types + */ +export type PropertyKeys = strings | numbers | symbols; -// deno-lint-ignore no-explicit-any -export type AbstractConstructor = - abstract new (...args: A) => T; +export type { PropertyKeys as properties }; -// deno-lint-ignore no-explicit-any -export type Constructor = { - new (...args: A): T; -}; +/** + * Represents a type that is the union of the values of an object `T`. + */ +export type ValueOf = T[keyof T]; -export type FunctionKeys = keyof { - // deno-lint-ignore no-explicit-any - [K in keyof T as T[K] extends (...args: any[]) => any ? K : never]: K; -}; +/** + * This is a "safe" version of the `keyof` operator, which will only return + * keys that are both assignable to `PropertyKey` and are not `never`. This is + * useful for extracting keys from objects that could potentially be empty, and + * always ensuring the resulting type is at least a `PropertyKey`. + * + * If the {@linkcode Strict} type parameter is set to `false`, the union of + * keys will be "anchored" with the {@linkcode PropertyKeys} branded type, to + * allow for literal key unions to be preserved in autocomplete suggestions. + */ +export type KeyOf = + | (Strict extends true ? never : PropertyKeys) + | Is; + +/** + * Extracts the parameters of + */ +// deno-fmt-ignore +export type ParametersOf = + | [T] extends [never] ? Fallback : ParametersOfWorker< + | T extends (...args: any) => any ? T + : ValueOf extends infer U + ? U extends (...args: any) => any ? U : never + : Fallback, + Fallback + > extends infer A extends readonly unknown[] ? A + : Fallback; + +// deno-fmt-ignore +type ParametersOfWorker = + | T extends (...args: infer A) => any ? Readonly : Fallback; + +export type OptionalParametersOf< + T, + Fallback extends readonly unknown[] = never, +> = [T] extends [never] ? Fallback + : ParametersOf extends infer A extends readonly unknown[] + ? OptionalParametersOfWorker + : Fallback; + +type OptionalParametersOfWorker = + A extends readonly [infer F, ...infer R] + ? IsEqual< + Exclude, + F, + OptionalParametersOfWorker, + [F, ...OptionalParametersOfWorker] + > + : A; + +type OptionalParamsTest1 = OptionalParametersOf<{ + (a: null, c?: boolean | undefined): void; +}>; + +type IsEqual = + (() => T extends A ? 1 : 2) extends () => T extends B ? 1 : 2 ? True + : False; + +/** + * Adds a `void` type to the given type `T`, to become `T | void`. + * + * @category Utility Types + */ +export type Voidable = T | void; + +/** + * The type that can be passed to the {@linkcode MaybeVoidable} type for its + * second type parameter, `V`. @see {@linkcode MaybeVoidable} for more info + * on how these types are used. + * + * @category Utility Types + */ +export type VoidableArgument = boolean | void; + +/** + * Used to determine the return type of a decorator function. If the argument + * {@linkcode V} is `true`, then this resolves to `void | T`. If the argument + * `V` is `false`, it resolves to just `T`. If `V` is `void`, it resolves to + * just `void`. + * + * @template T The type of the return value. + * @template {VoidableArgument} V Whether the return type should include `void`. + * @category Utility Types + */ +export type MaybeVoidable = + | ([V] extends [true] | [void] ? void : never) + | ([V] extends [void] ? never : T); From ae85251979ccd561a939c1b81c217b680e64dddb Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Tue, 10 Sep 2024 18:47:03 +0000 Subject: [PATCH 09/40] fix: lets try this again, Dockerfile --- .devcontainer/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 983f1a6..96ee211 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -12,9 +12,9 @@ RUN sudo apt-get -y update \ && sudo apt-get -y upgrade && sudo rm -rf /var/lib/apt/lists/* # install latest deno and upgrade to canary -ENV DENO_INSTALL=/home/${USER}/.local DENO_INSTALL_ROOT=${DENO_INSTALL}/bin +ENV DENO_INSTALL=/home/${USER}/.local DENO_INSTALL_ROOT=/home/${USER}/.local/bin RUN curl -fsSL https://deno.land/install.sh | sh \ - && chown ${USER} ${DENO_INSTALL_ROOT}/deno \ + && chown ${USER} ${DENO_INSTALL_ROOT-}/deno \ && ${DENO_INSTALL_ROOT-}/deno upgrade canary # install brew and add to path From 8ea6362e1c927684edfcb810a91af0dfe07bf6c4 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Tue, 10 Sep 2024 21:53:29 +0000 Subject: [PATCH 10/40] really getting tired of dockerfiles --- .devcontainer/Dockerfile | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 96ee211..8a082d1 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -12,27 +12,30 @@ RUN sudo apt-get -y update \ && sudo apt-get -y upgrade && sudo rm -rf /var/lib/apt/lists/* # install latest deno and upgrade to canary -ENV DENO_INSTALL=/home/${USER}/.local DENO_INSTALL_ROOT=/home/${USER}/.local/bin -RUN curl -fsSL https://deno.land/install.sh | sh \ +ENV DENO_INSTALL=/usr/local +ENV DENO_INSTALL_ROOT=/usr/local/bin +ENV PATH=${DENO_INSTALL_ROOT}:${PATH} + +RUN curl -fsSL https://deno.land/install.sh | sudo sh \ && chown ${USER} ${DENO_INSTALL_ROOT-}/deno \ - && ${DENO_INSTALL_ROOT-}/deno upgrade canary + && ${DENO_INSTALL_ROOT-}/deno upgrade canary --output=${DENO_INSTALL_ROOT-}/deno # install brew and add to path -RUN /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" \ - && echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/${USER}/.bashrc +ENV HOMEBREW_PREFIX=/home/linuxbrew/.linuxbrew +ENV PATH=${HOMEBREW_PREFIX}/bin:${PATH} + +RUN echo 'export HOMEBREW_PREFIX="${HOMEBREW_PREFIX:-/home/linuxbrew/.linuxbrew}"; ' \ + 'export HOMEBREW_BIN="${HOMEBREW_PREFIX}/bin/brew"; ' \ + 'test -x "$HOMEBREW_PREFIX/bin/brew" || /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"; ' \ + 'eval "$($HOMEBREW_BIN shellenv)"' >> /home/${USER}/.bashrc # install starship and configure some defaults -RUN export BIN_DIR=/home/${USER}/.local/bin \ - && curl -fsSL https://starship.rs/install.sh | sh -s -- -y \ - && chown ${USER} /home/${USER}/.local/bin/starship \ - && { \ - echo 'export PATH="$HOME/.local/bin:$PATH";'; \ - echo 'export STARSHIP_CONFIG="${HOME}/.config/starship.toml";'; \ - echo 'test -d "${HOME}/.config" || mkdir -p "${HOME}/.config";'; \ - echo 'test -f "${STARSHIP_CONFIG}" || starship preset -o "${STARSHIP_CONFIG}" tokyo-night;'; \ - echo 'eval "$(starship init bash)";'; \ - } >> /home/${USER}/.bashrc +RUN curl -fsSL https://starship.rs/install.sh | sh -s -- -y \ + && chown ${USER} /usr/local/bin/starship \ + && echo 'export STARSHIP_CONFIG="${HOME}/.config/starship.toml";' \ + 'test -d "${HOME}/.config" || mkdir -p "${HOME}/.config";' \ + 'test -f "${STARSHIP_CONFIG}" || starship preset -o "${STARSHIP_CONFIG}" tokyo-night;' \ + 'eval "$(starship init bash)";'>> /home/${USER}/.bashrc # install bash completions for deno -RUN sudo mkdir -p /etc/bash_completion.d \ - && /home/${USER}/.local/bin/deno completions bash > /etc/bash_completion.d/deno.bash +RUN sudo mkdir -p /etc/bash_completion.d && deno completions bash > /etc/bash_completion.d/deno.bash From 140fda594e4e16091b5681359f2e19634d686b2c Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Tue, 10 Sep 2024 21:53:59 +0000 Subject: [PATCH 11/40] and devcontainers too --- .devcontainer/devcontainer.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 3b2e97b..86697a4 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -7,6 +7,8 @@ "git": "latest", "sshd": "latest", "node": "latest", + // homebrew + "ghcr.io/meaningful-ooo/devcontainer-features/homebrew:2": {}, // github cli "ghcr.io/devcontainers/features/github-cli:1": {}, // github actions From 82bbcd5fd8f0e99ce53fed5a769a87e0f019e712 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Thu, 19 Sep 2024 18:46:31 +0000 Subject: [PATCH 12/40] refactor(devcontainer): remove Dockerfile entirely --- .devcontainer/Dockerfile | 41 --------------------------------- .devcontainer/devcontainer.json | 9 ++++---- 2 files changed, 4 insertions(+), 46 deletions(-) delete mode 100644 .devcontainer/Dockerfile diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index 8a082d1..0000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -# [Choice] Debian OS version: bullseye, buster -ARG VARIANT=bullseye -FROM --platform=linux/amd64 mcr.microsoft.com/vscode/devcontainers/base:0-${VARIANT} - -# update system packages and cleanup cache -ARG DEBIAN_FRONTEND=noninteractive -ARG USER=vscode - -# install gcc, git-extras, gnu coreutils -RUN sudo apt-get -y update \ - && sudo apt-get -y install --no-install-recommends gcc git-extras coreutils \ - && sudo apt-get -y upgrade && sudo rm -rf /var/lib/apt/lists/* - -# install latest deno and upgrade to canary -ENV DENO_INSTALL=/usr/local -ENV DENO_INSTALL_ROOT=/usr/local/bin -ENV PATH=${DENO_INSTALL_ROOT}:${PATH} - -RUN curl -fsSL https://deno.land/install.sh | sudo sh \ - && chown ${USER} ${DENO_INSTALL_ROOT-}/deno \ - && ${DENO_INSTALL_ROOT-}/deno upgrade canary --output=${DENO_INSTALL_ROOT-}/deno - -# install brew and add to path -ENV HOMEBREW_PREFIX=/home/linuxbrew/.linuxbrew -ENV PATH=${HOMEBREW_PREFIX}/bin:${PATH} - -RUN echo 'export HOMEBREW_PREFIX="${HOMEBREW_PREFIX:-/home/linuxbrew/.linuxbrew}"; ' \ - 'export HOMEBREW_BIN="${HOMEBREW_PREFIX}/bin/brew"; ' \ - 'test -x "$HOMEBREW_PREFIX/bin/brew" || /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"; ' \ - 'eval "$($HOMEBREW_BIN shellenv)"' >> /home/${USER}/.bashrc - -# install starship and configure some defaults -RUN curl -fsSL https://starship.rs/install.sh | sh -s -- -y \ - && chown ${USER} /usr/local/bin/starship \ - && echo 'export STARSHIP_CONFIG="${HOME}/.config/starship.toml";' \ - 'test -d "${HOME}/.config" || mkdir -p "${HOME}/.config";' \ - 'test -f "${STARSHIP_CONFIG}" || starship preset -o "${STARSHIP_CONFIG}" tokyo-night;' \ - 'eval "$(starship init bash)";'>> /home/${USER}/.bashrc - -# install bash completions for deno -RUN sudo mkdir -p /etc/bash_completion.d && deno completions bash > /etc/bash_completion.d/deno.bash diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 86697a4..9ae5432 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,6 +1,6 @@ { "name": "@decorators", - "dockerFile": "Dockerfile", + // "dockerFile": "Dockerfile", "remoteUser": "vscode", "features": { // the basics @@ -9,13 +9,12 @@ "node": "latest", // homebrew "ghcr.io/meaningful-ooo/devcontainer-features/homebrew:2": {}, - // github cli "ghcr.io/devcontainers/features/github-cli:1": {}, - // github actions "ghcr.io/devcontainers-contrib/features/act:1": {}, - "ghcr.io/devcontainers-contrib/features/actionlint:1": {} + "ghcr.io/devcontainers-contrib/features/actionlint:1": {}, + "ghcr.io/prulloac/devcontainer-features/deno:1": {}, + "ghcr.io/deep-space-cartel/devcontainers-features/starship:1": {} }, - "build": {}, "updateRemoteUserUID": true, // settings for the vscode editor "customizations": { From f476523cecd400f243b74772476fb8d0e7643a8e Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 00:49:53 +0000 Subject: [PATCH 13/40] fix: update `workspaces` field to `workspace` in root deno.json --- deno.json | 31 ++++++------------------------- 1 file changed, 6 insertions(+), 25 deletions(-) diff --git a/deno.json b/deno.json index 77d3f91..514b007 100644 --- a/deno.json +++ b/deno.json @@ -1,30 +1,11 @@ { - "name": "@decorators/main", - "version": "0.1.2", - "tasks": { - "test": "deno test --parallel --allow-all --no-check=remote --coverage=.coverage ./packages/**/* ./internal/**/*", - "test:watch": "deno test --watch --parallel --allow-all --no-check=remote --coverage=.coverage ./packages/**/* ./internal/**/*", - "coverage": "deno coverage --html .coverage && mkdir docs && mv .coverage/html docs/coverage", - "coverage:open": "deno task coverage && open docs/coverage/index.html", - "fmt": "deno fmt ./packages/**/* ./internal/**/*", - "fmt:check": "deno fmt --check ./packages/**/* ./internal/**/*", - "fmt:watch": "deno fmt --watch ./packages/**/* ./internal/**/*", - "lint": "deno lint ./packages/**/* ./internal/**/*", - "lint:json": "deno lint --json ./packages/**/* ./internal/**/*", - "lint:watch": "deno lint --watch ./packages/**/* ./internal/**/*", - "docs": "deno doc --html --output=docs --name=decorators ./packages/**/*", - "docs:check": "deno doc --lint ./packages/**/*.ts", - "docs:open": "deno task docs && open docs/index.html", - "prepublish": "deno task fmt:check && deno task test && deno task lint && deno task docs && deno task coverage", - "bump": "deno task prepublish && deno run -Arq ./scripts/bump.ts", - "publish": "deno task bump && deno publish", - "publish:check": "deno task bump --dry-run && deno publish --dry-run", - "publish:major": "deno task bump --major && deno publish", - "publish:minor": "deno task bump --minor && deno publish", - "publish:patch": "deno task bump --patch && deno publish", - "clean": "rm -rf .coverage docs" + "license": "MIT", + "author": { + "name": "Nicholas Berlette", + "email": "nick@berlette.com", + "url": "https://github.com/nberlette/decorators" }, - "workspaces": [ + "workspace": [ "./internal", "./packages/alias", "./packages/bind" From 41aa9532ecf71d335760422c6a92ae773fcac868 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 00:58:39 +0000 Subject: [PATCH 14/40] chore: add tasks and publish config to deno.json --- deno.json | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/deno.json b/deno.json index 514b007..1dc0a91 100644 --- a/deno.json +++ b/deno.json @@ -9,5 +9,39 @@ "./internal", "./packages/alias", "./packages/bind" + ], + "tasks": { + "test:check": "deno test --parallel -A --clean --coverage=.coverage", + "test": "deno task test:check --no-check=remote", + "test:cov": "deno coverage --html .coverage", + "test:nocheck": "deno task test:check --no-check", + "docs": "deno doc --html --name=\"@decorators/$(basename $(pwd))\" mod.ts", + "docs:json": "deno doc --json mod.ts > docs/api.json", + "docs:lint": "deno doc --lint ./[!_.]*.ts", + "docs:test": "deno task test --doc --permit-no-files", + "fmt": "deno fmt --ignore=docs --ignore=.coverage", + "fmt:check": "deno task fmt --check", + "lint": "deno lint --ignore=docs --ignore=.coverage", + "lint:fix": "deno task lint --fix", + "check:all": "deno task lint; deno task docs:lint; deno task fmt:check", + "test:all": "deno task test; deno task docs:test; deno task test:cov", + "prepare": "deno task check:all && deno task test:all && deno task docs", + "publish": "deno task publish:dry && deno publish", + "publish:dry": "deno task prepare && deno publish --dry-run --allow-dirty" + }, + "lock": true, + "vendor": false, + "nodeModulesDir": "auto", + "publish": { + "include": [ + "./{packages,internal}/**/*.{ts,tsx,json,jsonc,md}", + "./{packages,internal}/**/LICENSE" + ], + "exclude": [ + "**/*.test.*" + ] + }, + "exclude": [ + "**/{dist,docs,node_modules}/**" ] } From 7c599ca9b391dd20224c57c0ca9150326ad80bbc Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 07:56:17 +0000 Subject: [PATCH 15/40] chore: add packages/lru to root deno.json --- deno.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deno.json b/deno.json index 1dc0a91..efe83aa 100644 --- a/deno.json +++ b/deno.json @@ -8,7 +8,8 @@ "workspace": [ "./internal", "./packages/alias", - "./packages/bind" + "./packages/bind", + "./packages/lru" ], "tasks": { "test:check": "deno test --parallel -A --clean --coverage=.coverage", From 59dad11abab770fc1a18e0d9e0d616ad54231000 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 07:58:00 +0000 Subject: [PATCH 16/40] feat(lru): add @decorators/lru package --- packages/lru/.DS_Store | Bin 0 -> 6148 bytes packages/lru/LICENSE | 20 + packages/lru/README.md | 728 ++++++++++++++++++ packages/lru/deno.json | 21 + packages/lru/examples/01_basic_keygen_json.ts | 12 + .../lru/examples/02_advanced_keygen_cbor.ts | 159 ++++ .../lru/examples/03_basic_map_override.ts | 37 + packages/lru/examples/04_custom_lru_cache.ts | 50 ++ .../lru/examples/05_advanced_transforms.ts | 57 ++ packages/lru/lru_icon.png | Bin 0 -> 355644 bytes packages/lru/mod.ts | 5 + packages/lru/src/_internal.ts | 49 ++ packages/lru/src/lru_cache.test.ts | 130 ++++ packages/lru/src/lru_cache.ts | 193 +++++ packages/lru/src/lru_decorator.test.ts | 243 ++++++ packages/lru/src/lru_decorator.ts | 334 ++++++++ packages/lru/src/options.ts | 320 ++++++++ packages/lru/src/overrides.ts | 89 +++ packages/lru/src/types.ts | 175 +++++ 19 files changed, 2622 insertions(+) create mode 100644 packages/lru/.DS_Store create mode 100644 packages/lru/LICENSE create mode 100644 packages/lru/README.md create mode 100644 packages/lru/deno.json create mode 100644 packages/lru/examples/01_basic_keygen_json.ts create mode 100644 packages/lru/examples/02_advanced_keygen_cbor.ts create mode 100644 packages/lru/examples/03_basic_map_override.ts create mode 100644 packages/lru/examples/04_custom_lru_cache.ts create mode 100644 packages/lru/examples/05_advanced_transforms.ts create mode 100644 packages/lru/lru_icon.png create mode 100644 packages/lru/mod.ts create mode 100644 packages/lru/src/_internal.ts create mode 100644 packages/lru/src/lru_cache.test.ts create mode 100644 packages/lru/src/lru_cache.ts create mode 100644 packages/lru/src/lru_decorator.test.ts create mode 100644 packages/lru/src/lru_decorator.ts create mode 100644 packages/lru/src/options.ts create mode 100644 packages/lru/src/overrides.ts create mode 100644 packages/lru/src/types.ts diff --git a/packages/lru/.DS_Store b/packages/lru/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..8233d9157aa14f8e6808a144a3cc53df2c0c9656 GIT binary patch literal 6148 zcmeHKze~eV5WZ(xDY|rY41$x3{R@mG1^0@x_6IsNrnD-K8J+zLoJG{tSx`qe|B8Yj z2yTA&?qTvw3r-?>2k*Y*e&jA6&^A) z<^9I=xZbzohWm|nUX$CRfW|bUF7GC}XZtSq6nhBPTMuW_gUd_OymHy=*UPwGl@59L zg0?$YUUT`@_ZI7JUQC``-9mn`_Vft9{ubwdim-v_VE1p7OY%Z z{=H`uyO9B_`E^?R&N;(-^8P9Q*jXR+jTOIb$hLec|RVxF^ zfX_f6w{@QXt=Z>)KS}SD0cGG%F<>fjJ8t5Y+-xnq9M9SiYX^&k<1#^;0_DcBz2H&2 bgk=T3kS~Cd!%Pqsi2evz8dNC*Kgz%d@STog literal 0 HcmV?d00001 diff --git a/packages/lru/LICENSE b/packages/lru/LICENSE new file mode 100644 index 0000000..3177dfe --- /dev/null +++ b/packages/lru/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2025 Nicholas Berlette (https://github.com/nberlette/decorators) + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/lru/README.md b/packages/lru/README.md new file mode 100644 index 0000000..2aca27a --- /dev/null +++ b/packages/lru/README.md @@ -0,0 +1,728 @@ +
+ +[@decorators/lru][JSR] + +[![jsr-score][badge-jsr-score]][badge-jsr-score] +[![jsr-pkg][badge-jsr-pkg]][badge-jsr-pkg] + +# [`@decorators/lru`][JSR] + +#### _"Not your average memoization decorator."_ + +##### Highly configurable. Strong types. Test-friendly. And really fast. + +###### Compatible with Deno, Bun, Node, Cloudflare Workers, and more. + +
+ +--- + +This package provides a powerful and highly configurable decorator factory for +memoizing class methods with a memory-safe LRU (least recently used) cache API. +It supports a wide range of [features] and [options] to help you fine-tune the +cache behavior to your specific needs. + +```ts +import { lru } from "@decorators/lru"; + +class BasicExample { + @lru({ maxSize: 64, ttl: 1000 }) + memoized(arg1: string, arg2: number): string { + return `${arg1}-${arg2}`; + } +} + +const example = new BasicExample(); +console.log(example.memoizedMethod("foo", 42)); // "foo-42" +console.log(example.memoizedMethod("foo", 42)); // "foo-42" (cached) +``` + +Whether you're new to decorators in TypeScript, or a seasoned veteran in the +game, this package aims to elevate your development experience and **_earn its +place_** in your toolbox. + +> **Continue reading to learn about its [usage] and available [features].** +> **_Or jump straight to the [real-world examples] and see it in action!_** + +[features]: #features "Jump to the Features section!" +[usage]: #usage "Jump to the Usage section!" +[real-world examples]: #examples "Jump to the Examples section!" +[options]: #options "Jump to the Options section!" + +## Install + +```sh +deno add jsr:@decorators/lru +``` + +```sh +bunx jsr add @decorators/lru +``` + +```sh +pnpm dlx jsr add @decorators/lru +``` + +```sh +yarn dlx jsr add @decorators/lru +``` + +```sh +npx -y jsr add @decorators/lru +``` + +--- + +## Usage + +Here's a rather contrived example demonstrating the most basic usage of the +`@lru` decorator. If you'd like to see more advanced examples, check out the +[examples section](#examples), which covers several real-world use cases. + +```ts +import { lru } from "@decorators/lru"; + +class Calculator { + @lru({ maxSize: 64, ttl: 1000 }) + fib(n: number): number { + if (n < 2) return n; + return this.fib(n - 1) + this.fib(n - 2); + } +} + +const calc = new Calculator(); +console.log(`Fibonacci(10): ${calc.fib(10)}`); +``` + +> At first glance, this may appear to be another run-of-the-mill memoization +> tool. But don't be fooled. The `@decorators/lru` package is far more powerful +> than your typical simple memoization tool. + +> Aside from supporting all the standard configurations/functionality one would +> come to expect in a tool like this, this package cranks up the heat with +> several distinct [features] of its own, putting it in a league of its own. + +--- + +## Features + +- **TypeScript-First**: Fully typed, well-documented API is a breeze to use. +- **Flexible Caching**: Cache method return values with an LRU strategy (least + recently used) based on the method's arguments at call time. +- **Cache Capacity**: Limit the cache size to a maximum number of entries, + automatically evicting the least recently used entries as needed. + - The default cache capacity is `128` entries. +- **TTL Support**: Automatically expire cache entries after a specified time. +- **Eviction Strategies**: Pick a passive (lazy) or active (scheduled) eviction + strategy to fine-tune the TTL behavior to your project's specific needs. + - The default eviction strategy is `"passive"`. +- **Custom Transformers**: Rehydrate or mutate cached values before returning + them, without sacrificing type safety. Use this to implement more complex + caching strategies, such as [async caching of HTTP responses]. +- **Custom Key Generation**: Custom key generation functions for complex keys + not easily serializable by the default `JSON.stringify`-based keygen. +- **Memory Safe**: Uses an [advanced storage API][storage] to bind the `LRU` + lifetimes to those of their associated class instance (and the class itself). + - This prevents any cache from outliving the class it was created on. + - _See the [storage API section](#storage-api) for a deep dive into this API._ +- **Dependency Injection**: Easily override[^1] internal components (e.g., the + LRU cache class, `Map`, `WeakMap`, `Date`). Designed with test-driven + development as a core focus. + +[storage]: ./#storage-api "View the Storage API section" + +[^1]: See the [storage API section](#storage-api) for more details, examples, + and a cautionary word of warning. + +### Eviction Strategies + +#### `"passive"` (the default) + +Checks and evicts stale entries on each invocation of the memoized method, as +well as on each cache access ("lazy" eviction). This is the strategy used by +practically every other memoization utility, including Python's +`functools.lru_cache` decorator. + +#### `"active"` + +Setting the `eviction` option to `"active"` causes the `@lru` decorator to adopt +a more aggressive approach to cache eviction. + +Instead of lazily evicting entries that have already expired (potentially +lingering in the cache for an extended period of time beyond their expiration +time), the cache mechanism will now spawn (schedule) a dedicated eviction timer +on all new cache entries. + +> [!IMPORTANT] +> +> Using active eviction with very large LRU caches, especially those that see a +> significant level of churn, could potentially result in a performance hit due +> to accumulated overhead of task-scheduling. Exercise caution when using this +> in any performance-sensitive code paths. + +If an entry has not been accessed by the time its TTL expires, it will be +immediately evicted from the cache and the timer cleared. If the entry is +accessed before the timer expires, the timer is cleared and set again for the +new TTL, ensuring the cache's recency behavior is retained. This usually results +in improved memory usage, especially when caching large objects. + +> [!TIP] +> +> It's strongly encouraged that you adjust the `maxSize` and `ttl` options until +> you find the best balance for your specific use case. + +[async caching of HTTP responses]: ./#custom-transform-examples-async-http-caching "View the async caching of HTTP responses example" + +--- + +## API + +### Options + +| Option | Type | Default Value | Description | +| ----------- | ----------------------------------------------------- | ---------------- | ----------------------------------------------------- | +| `maxSize` | `number` | `128` | Maximum number of entries to store in the cache. | +| `ttl` | `number` | `0` | Time-to-live for cache entries, in milliseconds. | +| `eviction` | `"passive"` \| `"active"` | `"passive"` | Eviction strategy to use for expired cache entries. | +| `key` | [`Keygen`](#keygen) | `JSON.stringify` | Custom key generation function. | +| `prepare` | [`Transform`](#transform) | `(x) => x` | Custom preparation function for arguments. | +| `transform` | [`Transform`](#transform) | `(x) => x` | Custom postprocessing function for cached values. | +| `inspect` | `(entry: CacheEntry) => void` | `undefined` | Callback for when an entry is inspected in the cache. | +| `onHit` | `(value: V, key: K, entry: CacheEntry) => void` | `undefined` | Callback for when an entry is hit in the cache. | +| `onMiss` | `(key: K) => void` | `undefined` | Callback for when an entry is missed in the cache. | +| `onEvict` | `(value: V, key: K, entry: CacheEntry) => void` | `undefined` | Callback for when an entry is evicted from the cache. | +| `onRefresh` | `(value: V, key: K, entry: CacheEntry) => void` | `undefined` | Callback for when an entry is refreshed in the cache. | +| `overrides` | [`Overrides`](#overrides) | `{}` | Overrides for testing with custom internal APIs. | + +#### `Keygen` + +```ts +type Keygen = (...args: Params) => CacheKey; + +// where +// Params extends Parameters, +// CacheKey extends string +``` + +#### `Transform` + +```ts +type Transform = ( + value: Input, + key: CacheKey, + entry: CacheEntry, +) => Output; +``` + +#### `Overrides` + +| Option | Type | Description | +| --------- | -------------------- | ---------------------------------------------------------- | +| `Map` | `MapLikeConstructor` | Override the `Map` constructor used for the LRU cache. | +| `WeakMap` | `MapLikeConstructor` | Override the `WeakMap` constructor used for the LRU cache. | +| `LRU` | `MapLikeConstructor` | Override the `LRU` constructor used for the LRU cache. | +| `Date` | `TimeProvider` | Override the `Date` constructor used for the TTL timer. | +| `storage` | `CacheStorage` | Override the storage API used for the LRU cache. | + +--- + +## Examples + +Below are some examples of how to use the `@decorators/lru` package in various +real-world scenarios. These examples are designed to be as realistic as +possible, while still being simple enough to understand. + +There are also a couple of advanced examples that demonstrate (at length) how +one might leverage the `@decorators/lru` package in a more complex application. + +
Custom Keygens (basic demonstration)
+ +The default keygen implementation uses `JSON.stringify` to serialize arguments. + +```ts +import { lru } from "@decorators/lru"; + +class Calculator { + @lru({ + maxSize: 64, + // serialize the first argument only + key: (arg) => JSON.stringify(arg), + }) + square(n: number): number { + return n * n; + } +} +``` + +
+ +
Advanced Keygens using CBOR for complex data
+ +While the default keygen is sufficient for _most_ cases, occasionally it may be +necessary to use a keygen capable of handling complex data types. For example, +caching a method that expects a custom class instance for one or more of its +arguments will more than likely require a custom keygen to handle properly. + +What happens if you don't use a custom keygen? You may end up with poor caching +behavior, as `JSON.stringify` tends to serialize most of the objects it can't +understand into `{}`. No bueno. + +```ts +import { lru } from "jsr:@decorators/lru"; +// using the `@std/cbor` module (compact binary object representation) +import { encodeCbor } from "jsr:@std/cbor"; + +// types for our geospatial service +export interface Review { + user: string; + rating: number; + comment: string; +} + +export type WeekDay = "Mon" | "Tue" | "Wed" | "Thu" | "Fri" | "Sat" | "Sun"; + +/** Business hours for a given day. Measured in 24-hour format. */ +export interface Hours { + open: number; + close: number; +} + +export interface Metadata { + category?: string; + hours?: Record; + reviews?: Review[]; + [key: string]: any; +} + +export class Coordinate { + constructor( + public name: string, + public latitude: number, + public longitude: number, + ) {} + + get distance(): number { + return Math.sqrt( + Math.pow(this.latitude, 2) + Math.pow(this.longitude, 2), + ); + } + + toString(): string { + return `${this.name} (${this.latitude}, ${this.longitude})`; + } +} + +export class GeoPoint extends Coordinate { + constructor( + public type: "restaurant" | "park" | "store" | "landmark", + override name: string, + override latitude: number, + override longitude: number, + public metadata?: Metadata, + ) { + super(name, latitude, longitude); + } + + get rating(): number { + return this.metadata?.reviews?.reduce((sum, r) => sum + r.rating, 0) / + (this.metadata?.reviews?.length ?? 1) ?? 0; + } +} + +export interface SearchFilters { + name?: string; + types?: GeoPoint["type"][]; + price?: [min: number, max: number]; + rating?: number; + // Could have circular references or complex nested structures + metadata?: Partial; +} + +export class SpatialDatabase { + constructor( + protected data: GeoPoint[], + ) {} + + // naive implementation of a custom keygen that can handle complex objects + @lru({ key: (...a) => String.fromCharCode(...encodeCbor(a)) }) + // simulating an expensive geospatial querying operation + query( + location: Coordinate, + radius_km: number, + filters?: SearchFilters, + ): GeoPoint[] { + return this.data.filter((point) => { + if (filters?.types && !filters.types.includes(point.type)) return false; + if (filters?.name && !point.name.includes(filters.name)) return false; + if ((filters?.rating ?? 0) > (point.rating ?? 0)) return false; + if (filters?.price) { + const [min, max] = filters.price; + if (point.price < min || point.price > max) return false; + } + if (filters?.metadata) { + for (const [k, v] of Object.entries(filters.metadata)) { + const pv = point.metadata?.[k]; + if (typeof pv === "undefined") return typeof v === "undefined"; + if (typeof pv !== typeof v) return false; + if (k === "reviews" && v.length !== pv.length) return false; + if (typeof v === "object" && v != null) { + if (JSON.stringify(pv) !== JSON.stringify(v)) return false; + } else if (pv !== v) return false; + } + } + // check if the point is within the radius of the location + const a = point.distance, b = location.distance; + const distance = Math.sqrt(Math.pow(a - b, 2)); + const distance_km = distance * 111.32; // convert to km + return distance_km <= radius_km; + }); + } +} + +const db = new SpatialDatabase([ + new GeoPoint("restaurant", "Carmine's Pizza Henderson", 36.04142, 115.03036, { + reviews: [ + { user: "Alice", rating: 5, comment: "Best pizza ever!" }, + { user: "Bob", rating: 4.25, comment: "Killer cannoli!" }, + ], + }), + new GeoPoint( + "restaurant", + "Raising Cane's Chicken Fingers", + 36.03504, + 115.04634, + { + reviews: [ + { user: "Charlie", rating: 4.5, comment: "Great chicken!" }, + { user: "Dave", rating: 4.75, comment: "Love the fries!" }, + ], + }, + ), + new GeoPoint("store", "Walmart Supercenter", 36.1699, 115.1398), + new GeoPoint("landmark", "The Strip", 36.1147, 115.1728), + new GeoPoint("park", "Red Rock Canyon", 36.1162, 115.4167), + new GeoPoint("park", "Mount Charleston", 36.2784, 115.6405), + new GeoPoint("landmark", "Fremont Street Experience", 36.1699, 115.1415), + new GeoPoint("landmark", "Bellagio Fountains", 36.1126, 115.1767), + new GeoPoint("landmark", "The Sphere", 36.12086, 115.16174), +]); + +console.log(db.query(new Coordinate("home", 36.033, -115.05), 5)); +``` + +
+ +
Custom Map Override using a custom Map class
+ +```ts +import { lru } from "@decorators/lru"; + +class CustomMap extends Map { + constructor(entries?: readonly (readonly [K, V])[] | null) { + super(entries); + console.log("CustomMap created"); + } + + override get(key: K): V | undefined { + console.log(`CustomMap.get(${key})`); + return super.get(key); + } +} + +class Calculator { + @lru({ + maxSize: 64, + // override the Map and WeakMap classes which are used internally to store + // the inner LRU cache without leaking memory + overrides: { + Map: CustomMap, + }, + }) + square(n: number): number { + return n * n; + } +} +``` + +
+ +
Custom LRU Override using a custom LRU class
+ + + +The `@decorators/lru` package provides a built-in LRU cache implementation, +which is sufficiently capable for the majority of use cases. However, if you +need to customize the LRU behavior or add additional functionality, you can +either extend the built-in `LRU` class, or create your own from scratch. The +only requirement is that it must implement the `MapLike` interface. + +Once you've got your custom LRU class ready to go, all that's left to do is pass +it to the `@lru` decorator as the `overrides.LRU` option. + +This example demonstrates how to create a custom LRU cache implementation that +logs all operations to the console. This is useful for debugging and +understanding how the LRU cache works under the hood. + +```ts +import { crypto } from "jsr:@std/crypto@1/crypto"; + +import { lru, type MapLike } from "@decorators/lru"; + +// the default implementation we'll be extending +import { LRU } from "@decorators/lru/cache"; + +class CustomLRU extends LRU implements MapLike { + constructor(maxSize?: number) { + super(maxSize); + console.log(`CustomLRU created with maxSize: ${maxSize}`); + } + + override set(key: K, value: V): this { + console.log(`CustomLRU.set(${key}, ${value})`); + super.set(key, value); + return this; + } + + override has(key: K): boolean { + console.log(`CustomLRU.has(${key})`); + return super.has(key); + } + + override get(key: K): V | undefined { + console.log(`CustomLRU.get(${key})`); + return super.get(key); + } + + override delete(key: K): boolean { + console.log(`CustomLRU.delete(${key})`); + return super.delete(key); + } + + override clear(): void { + console.log("CustomLRU.clear()"); + super.clear(); + } +} + +class Hasher { + @lru({ maxSize: 32, overrides: { LRU: CustomLRU } }) + hash(arg: string): string { + console.log(`Expensive operation called with arg: ${arg}`); + const buf = new TextEncoder().encode(arg); + const sha = crypto.subtle.digestSync("SHA-256", buf); + return Array.from(new Uint8Array(sha)) + .map((b) => b.toString(16).padStart(2, "0")) + .join(""); + } +} + +const hasher = new Hasher(); + +performance.mark("start:uncached"); +console.log("[uncached]", hasher.hash("hello")); +performance.mark("end:uncached"); + +const t1 = performance.measure("end:uncached", "start:uncached"); +console.debug("[uncached]", t1.duration, "ms"); + +performance.mark("start:cached:1"); +console.log("[cached #1]", hasher.hash("hello")); +performance.mark("end:cached:1"); + +const t2 = performance.measure("end:cached:1", "start:cached:1"); +console.debug("[cached #1]", t2.duration, "ms"); + +performance.mark("start:cached:2"); +console.log("[cached #2]", hasher.hash("hello")); +performance.mark("end:cached:2"); + +const t3 = performance.measure("end:cached:2", "start:cached:2"); +console.debug("[cached #2]", t3.duration, "ms"); +``` + +
+ +
Using transform functions for async caching of HTTP responses
+ + + +```ts +import { lru } from "@decorators/lru"; + +class RemoteService { + constructor( + protected baseUrl: string | URL, + protected init?: RequestInit, + ) {} + + @lru({ + transform: async (res) => (await res).clone(), + ttl: 1e4, /* 10 seconds */ + }) + get(url?: string | URL, init?: RequestInit): Promise { + url = new URL(url ?? "", this.baseUrl); + init = { ...this.init, ...init, method: "GET" }; + return globalThis.fetch(url, init); + } + + async getJson( + url?: string | URL, + init?: RequestInit, + ): Promise<{ headers: Headers; body: T }> { + const res = await this.get(url, init); + return { headers: res.headers, body: await res.json() as T }; + } +} + +const api = new RemoteService( + "https://jsonplaceholder.typicode.com/posts/1", + { headers: { "Content-Type": "application/json" } }, +); + +type Post = { userId: number; id: number; title: string; body: string }; + +const post1 = await api.getJson(); // ~400ms (first fetch) +const post2 = await api.getJson(); // ~1ms (cached) + +// wait a hair over 10s for the cache to become stale +await new Promise((r) => setTimeout(r, 10_010)); + +// ... wait >= 10s for the cache to expire ... +const post3 = await api.getJson(); // ~300ms (expired cache, new fetch) + +// check that these are indeed from the same response object +console.assert(post1.headers.get("date") === post2.headers.get("date")); + +// check that post3 is a new response from 10s later +console.assert(post1.headers.get("date") !== post3.headers.get("date")); +console.assert(post2.headers.get("date") !== post3.headers.get("date")); + +// let's take it a step further and double-check the timestamps, just to be +// certain things are working as expected. post2 and post3 should have at least +// 10_000ms difference between their respective "Date" headers: +console.assert( + Date.parse(post3.headers.get("date")) - + Date.parse(post2.headers.get("date")) >= 1e4, +); // OK! +``` + +
+ +--- + +## Advanced Features + +This section describes some of the more advanced features of the +`@decorators/lru` package, including the `overrides` option. It also describes +the multi-layered storage API used to provide memory safety and prevent leaks. + +### Overrides for Test-Driven Development + +If you're a developer who takes testing seriously, you might appreciate this +section more than others. The `@decorators/lru` package is developed with +test-driven development as one of its core focal points. It supports +**complete** overrides for every aspect of its caching-related functionality, +including: + +- Internal APIs used for `Map`, `WeakMap`, and `LRU` are all overridable. +- Inject a custom `Date` implementation for mocking time-based operations. +- Easily roll your own keygen with custom serialization logic. +- Leverage a custom transform function to rehydrate or mutate returned values. +- Provide a custom `LRU` implementation for full control over the cache. +- Override the `Map` and `WeakMap` classes used to store the LRU instances, for + introspective testing and debugging (real-world examples including overriding + the native `WeakMap` with the `IterableWeakMap` from [`@iter/weak-map`], for + inspecting the weakly-held cache entries). + + + +> [!WARNING] +> +> The `overrides` option is considered an expert feature and is not intended to +> be used lightly. **Do _not_** use this unless you are absolutely sure you know +> exactly what this does, and actually have a good reason to use it. + +### Storage API + +The `@decorators/lru` package uses a multi-layered `WeakMap` API to bind the +lifetime of every `LRU` instance to that of its associated class, and +additionally ties it to the lifetime of the class constructor itself. This helps +to ensure no cache outlives the class that created it. + +The general layout of the storage API is as follows: + +1. `WeakMap` - keys are class **constructors**, values are #2. + - `'c` lifetime is bound to that of the class constructor + - When available, the `[Symbol.metadata]` object is used as the key. + - Falls back to the class constructor if metadata is unsupported. + - When a constructor is garbage collected, sections 2-4 will immediately + become candidates for collection as well. +2. `WeakMap` - keys are class **instances**, values are #3. + - `'i` lifetime is bound to that of the class instance. + - When the class instance is garbage collected, its entire cache is also + immediately available for collection as well. +3. `Map` - keys are **memoized method names**, values are #4. (lifetime: `'i`) + - Maintains strong references to the actual `LRU` caches. + - Lifetime is limited to that of the class instance. + - Keys are the property names of the memoized methods, providing fast and + convenient access to the underlying caches. +4. `LRU` - the **actual LRU cache** (lifetime: `'i`). + - One dedicated instance for each memoized method. + - Keys are generated by the `options.key` function. + +
Click here for a visual representation
+
+ +```plaintext +╭╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╮ +╵ 1. WeakMap<'c Constructor<'i T>, WeakMap<'i T, ... >> ╵ +╵ ╔╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╗ ╵ +╵ ╎ 2. WeakMap<'i T, ... > - holds class instances ╎ ╵ +╵ ╎ ┏┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┓ ╎ ╵ +╵ ╎ ┇ 3. Map> - maps key-to-cache ┇ ╎ ╵ +╵ ╎ ┇ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┇ ╎ ╵ +╵ ╎ ┇ ┃ 4. LRU - the actual memoization cache ┃ ┇ ╎ ╵ +╵ ╎ ┇ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┇ ╎ ╵ +╵ ╎ ┗┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┛ ╎ ╵ +╵ ╚╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╝ ╵ +╰╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╯ + + ╴╴ weakly-held ┉┉ strongly-held ━━ memoized +``` + +
+
+ +#### Overriding the Storage API + +As mentioned above, the [`overrides`](#overrides) option allows you to override +any of the constructors used for each of the layers in the storage API. This is +useful for testing, debugging, and introspection. + +Check out the [examples section](#examples) to see a demonstration of how to +override the `Map` constructor for (layer #3) with a custom implementation that +logs to the console whenever a method is called. + +--- + +
+ +##### [MIT] © [Nicholas Berlette]. All rights reserved. + +##### [GitHub] · [Issues] · [JSR] · [NPM] · [Docs] + +[![JSR][badge-jsr]][JSR] + +
+ +[MIT]: https://nick.mit-license.org/2024 "MIT © 2024-2025+ Nicholas Berlette et al. All rights reserved." +[Nicholas Berlette]: https://github.com/nberlette/decorators#readme "View the @decorators monorepo on GitHub" +[GitHub]: https://github.com/nberlette/decorators/tree/main/packages/lru#readme "View the @decorators/lru project on GitHub" +[Issues]: https://github.com/nberlette/decorators/issues?q=is%3Aopen+is%3Aissue+lru "View issues for the @decorators/lru project on GitHub" +[JSR]: https://jsr.io/@decorators/lru/doc "View the @decorators/lru documentation on jsr.io" +[NPM]: https://www.npmjs.com/package/@decorators.ts/lru "View the @decorators/lru package on npm" +[Docs]: https://jsr.io/@decorators/lru/doc "View the @decorators/lru documentation on jsr.io" +[badge-jsr]: https://jsr.io/badges/@decorators "View all of the @decorators packages on jsr.io" +[badge-jsr-pkg]: https://jsr.io/badges/@decorators/lru "View @decorators/lru on jsr.io" +[badge-jsr-score]: https://jsr.io/badges/@decorators/lru/score "View the score for @decorators/lru on jsr.io" +[`@iter/weak-map`]: https://jsr.io/@iter/weak-map "View the @iter/weak-map package on jsr.io" diff --git a/packages/lru/deno.json b/packages/lru/deno.json new file mode 100644 index 0000000..5ecabb4 --- /dev/null +++ b/packages/lru/deno.json @@ -0,0 +1,21 @@ +{ + "name": "@decorators/lru", + "version": "0.1.0", + "license": "MIT", + "author": { + "name": "Nicholas Berlette", + "email": "nick@berlette.com", + "url": "https://github.com/nberlette/decorators" + }, + "exports": { + ".": "./mod.ts", + "./cache": "./src/lru_cache.ts", + "./decorator": "./src/lru_decorator.ts", + "./options": "./src/options.ts", + "./types": "./src/types.ts" + }, + "imports": { + "@std/expect": "jsr:@std/expect@^1.0.13", + "@std/testing": "jsr:@std/testing@^1.0.9" + } +} diff --git a/packages/lru/examples/01_basic_keygen_json.ts b/packages/lru/examples/01_basic_keygen_json.ts new file mode 100644 index 0000000..fb4e7ff --- /dev/null +++ b/packages/lru/examples/01_basic_keygen_json.ts @@ -0,0 +1,12 @@ +import { lru } from "@decorators/lru"; + +export class Calculator { + @lru({ + maxSize: 64, + // serialize the first argument only + key: (arg) => JSON.stringify(arg), + }) + square(n: number): number { + return n * n; + } +} diff --git a/packages/lru/examples/02_advanced_keygen_cbor.ts b/packages/lru/examples/02_advanced_keygen_cbor.ts new file mode 100644 index 0000000..9895179 --- /dev/null +++ b/packages/lru/examples/02_advanced_keygen_cbor.ts @@ -0,0 +1,159 @@ +// deno-lint-ignore-file no-explicit-any +import { lru } from "jsr:@decorators/lru"; +// using the `@std/cbor` module (compact binary object representation) +import { encodeCbor } from "jsr:@std/cbor"; + +// types for our geospatial service +export interface Review { + user: string; + rating: number; + comment: string; + price?: number; +} + +export type WeekDay = "Mon" | "Tue" | "Wed" | "Thu" | "Fri" | "Sat" | "Sun"; + +/** Business hours for a given day. Measured in 24-hour format. */ +export interface Hours { + open: number; + close: number; +} + +export interface Metadata { + category?: string; + hours?: Record; + reviews?: Review[]; + [key: string]: any; +} + +export class Coordinate { + constructor( + public name: string, + public latitude: number, + public longitude: number, + ) {} + + get distance(): number { + return Math.sqrt( + Math.pow(this.latitude, 2) + Math.pow(this.longitude, 2), + ); + } + + toString(): string { + return `${this.name} (${this.latitude}, ${this.longitude})`; + } +} + +export class GeoPoint extends Coordinate { + constructor( + public type: "restaurant" | "park" | "store" | "landmark", + override name: string, + override latitude: number, + override longitude: number, + public metadata?: Metadata, + ) { + super(name, latitude, longitude); + } + + get rating(): number { + return +( + this.metadata?.reviews?.reduce((sum, r) => sum + r.rating, 0) ?? 0 + ) / (this.metadata?.reviews?.length ?? 1); + } + + get price(): number { + return this.metadata?.price ?? ((this.metadata?.reviews?.reduce( + (sum, r) => sum + (r.price ?? 0), + 0, + ) ?? 0) / (this.metadata?.reviews?.length ?? 1)); + } +} + +export interface SearchFilters { + name?: string; + types?: GeoPoint["type"][]; + price?: [min: number, max: number]; + rating?: number; + // Could have circular references or complex nested structures + metadata?: Partial; +} + +export class SpatialDatabase { + constructor( + protected data: GeoPoint[], + ) {} + + // naive implementation of a custom keygen that can handle complex objects + @lru({ key: (...a) => String.fromCharCode(...encodeCbor(a as any)) }) + // simulating an expensive geospatial querying operation + query( + location: Coordinate, + radius_km: number, + filters?: SearchFilters, + ): GeoPoint[] { + return this.data.filter((point) => { + if (filters?.types && !filters.types.includes(point.type)) return false; + if (filters?.name && !point.name.includes(filters.name)) return false; + if ((filters?.rating ?? 0) > (point.rating ?? 0)) return false; + if (filters?.price) { + const [min, max] = filters.price; + if (point.price < min || point.price > max) return false; + } + if (filters?.metadata) { + for (const [k, v] of Object.entries(filters.metadata)) { + const pv = point.metadata?.[k]; + if (typeof pv === "undefined") return typeof v === "undefined"; + if (typeof pv !== typeof v) return false; + if (k === "reviews" && v.length !== pv.length) return false; + if (typeof v === "object" && v != null) { + if (JSON.stringify(pv) !== JSON.stringify(v)) return false; + } else if (pv !== v) return false; + } + } + // check if the point is within the radius of the location + const a = point.distance, b = location.distance; + const distance = Math.sqrt(Math.pow(a - b, 2)); + const distance_km = distance * 111.32; // convert to km + return distance_km <= radius_km; + }); + } +} + +const db = new SpatialDatabase([ + new GeoPoint("restaurant", "Carmine's Pizza Henderson", 36.04142, 115.03036, { + reviews: [ + { user: "Alice", rating: 5, comment: "Best pizza ever!" }, + { user: "Bob", rating: 4.25, comment: "Killer cannoli!" }, + ], + }), + new GeoPoint( + "restaurant", + "Raising Cane's Chicken Fingers", + 36.03504, + 115.04634, + { + reviews: [ + { user: "Charlie", rating: 4.5, comment: "Great chicken!" }, + { user: "Dave", rating: 4.75, comment: "Love the fries!" }, + ], + }, + ), + new GeoPoint("store", "Walmart Supercenter", 36.1699, 115.1398), + new GeoPoint("landmark", "The Strip", 36.1147, 115.1728), + new GeoPoint("park", "Red Rock Canyon", 36.1162, 115.4167), + new GeoPoint("park", "Mount Charleston", 36.2784, 115.6405), + new GeoPoint("landmark", "Fremont Street Experience", 36.1699, 115.1415), + new GeoPoint("landmark", "Bellagio Fountains", 36.1126, 115.1767), + new GeoPoint("landmark", "The Sphere", 36.12086, 115.16174), +]); + +const home = new Coordinate("home", 36.033, -115.05); + +const result1 = db.query(home, 5); +console.assert(result1.length === 2); + +const result2 = db.query(home, 5, { + name: "Carmine's Pizza Henderson", + types: ["restaurant"], +}); +console.assert(result2.length === 1); diff --git a/packages/lru/examples/03_basic_map_override.ts b/packages/lru/examples/03_basic_map_override.ts new file mode 100644 index 0000000..af01eeb --- /dev/null +++ b/packages/lru/examples/03_basic_map_override.ts @@ -0,0 +1,37 @@ +import { lru } from "@decorators/lru"; + +class CustomMap extends Map { + // deno-lint-ignore no-explicit-any + static readonly instances = new Set>(); + + constructor(entries?: readonly (readonly [K, V])[] | null) { + super(entries); + console.log("CustomMap created"); + CustomMap.instances.add(this); + } + + override get(key: K): V | undefined { + console.log(`CustomMap.get(${key})`); + return super.get(key); + } +} + +class Calculator { + @lru({ + maxSize: 64, + // override the internal Map implementation (which is used to associate + // LRU cache instances with the corresponding class method name) + overrides: { Map: CustomMap }, + }) + square(n: number): number { + return n * n; + } +} + +const calc = new Calculator(); + +console.log(calc.square(2)); // computed and cached +console.log(calc.square(2)); // cached + +console.log(calc.square(3)); // computed and cached +console.log(calc.square(3)); // cached diff --git a/packages/lru/examples/04_custom_lru_cache.ts b/packages/lru/examples/04_custom_lru_cache.ts new file mode 100644 index 0000000..0359221 --- /dev/null +++ b/packages/lru/examples/04_custom_lru_cache.ts @@ -0,0 +1,50 @@ +#!/usr/bin/env -S deno run -A --no-check=remote + +import { LRU, lru, type MapLike } from "@decorators/lru"; +import { crypto } from "jsr:@std/crypto@1/crypto"; + +const timer = setTimeout(() => {}, 2_000); +Deno.refTimer(timer); // prevent the event loop from finishing + +class CustomLRU extends LRU implements MapLike { + constructor(maxSize?: number) { + console.log(`[debug] CustomLRU created with maxSize: ${maxSize}`); + super(maxSize); + } + + override get(key: K): V | undefined { + console.log(`[debug] CustomLRU.get(${key})`); + return super.get(key); + } + + override delete(key: K): boolean { + console.log(`[debug] CustomLRU.delete(${key})`); + return super.delete(key); + } +} + +class Hasher { + @lru({ + maxSize: 32, + eviction: "active", + overrides: { LRU: CustomLRU }, + ttl: 1000, + }) + hash(arg: string): string { + const buf = new TextEncoder().encode(arg); + const sha = crypto.subtle.digestSync("SHA3-256", buf); + return Array.from(new Uint8Array(sha)) + .map((b) => b.toString(16).padStart(2, "0")) + .join(""); + } +} + +const hasher = new Hasher(); + +console.time("uncached"); +console.timeLog("uncached", hasher.hash("hello")); +console.timeEnd("uncached"); + +console.time("cached"); +console.timeLog("cached", hasher.hash("hello")); +console.timeEnd("cached"); diff --git a/packages/lru/examples/05_advanced_transforms.ts b/packages/lru/examples/05_advanced_transforms.ts new file mode 100644 index 0000000..f4c64df --- /dev/null +++ b/packages/lru/examples/05_advanced_transforms.ts @@ -0,0 +1,57 @@ +import { lru } from "@decorators/lru"; + +export class RemoteService { + constructor( + protected baseUrl: string | URL, + protected init?: RequestInit, + ) {} + + @lru({ + transform: async (res) => (await res).clone(), + ttl: 1e4, /* 10 seconds */ + }) + get(url?: string | URL, init?: RequestInit): Promise { + url = new URL(url ?? "", this.baseUrl); + init = { ...this.init, ...init, method: "GET" }; + return globalThis.fetch(url, init); + } + + async getJson( + url?: string | URL, + init?: RequestInit, + ): Promise<{ headers: Headers; body: T }> { + const res = await this.get(url, init); + return { headers: res.headers, body: await res.json() as T }; + } +} + +const api = new RemoteService( + "https://jsonplaceholder.typicode.com/posts/1", + { headers: { "Content-Type": "application/json" } }, +); + +type Post = { userId: number; id: number; title: string; body: string }; + +const post1 = await api.getJson(); // ~400ms (first fetch) +const post2 = await api.getJson(); // ~1ms (cached) + +// wait a hair over 10s for the cache to become stale +await new Promise((r) => setTimeout(r, 10_010)); + +// ... wait >= 10s for the cache to expire ... +const post3 = await api.getJson(); // ~300ms (expired cache, new fetch) + +// check that these are indeed from the same response object +console.assert(post1.headers.get("date") === post2.headers.get("date")); + +// check that post3 is a new response from 10s later +console.assert(post1.headers.get("date") !== post3.headers.get("date")); +console.assert(post2.headers.get("date") !== post3.headers.get("date")); + +// let's take it a step further and double-check the timestamps, just to be +// certain things are working as expected. post2 and post3 should have at least +// 10_000ms difference between their respective "Date" headers: +console.assert( + Date.parse(post3.headers.get("date") ?? "") - + Date.parse(post2.headers.get("date") ?? "") >= 1e4, +); // OK! diff --git a/packages/lru/lru_icon.png b/packages/lru/lru_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6bed114347fffc934105049e5c0d913b158c07dc GIT binary patch literal 355644 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 ~A+Y7Q}}WN0-@C38KwfAS(JuKQZw^fi6+B z5Ijt4q6MjJNNZYf#G`pq4pFBTBk|}bm%f!R^ihd%!@J6X?0fsat@s>3UrLR{(^;SV z$nsym`-4kYu3bOk)Rva^;Uh-WuUJT=K+MttFT+%**wAtS5No0cD20!}OB@Om8|80J z95(C#jRl_&lQU}8n7A)N3bG40fwdHz6YqN0RWY2C0m})N zmg-QiL_yZ_ihmMTp30bH7U#e29QHIn!uPp}>%Ppyqy-+4gx;K9!Vti*(ZvSiP_}U1 z)A8-C+X*;xEk{F-fll!t=6Mwi3bM<-b-*uQwK`UVo=K9^j6dAxVWHL?ARTiDvUDHbqed}iLfm@|7`JU@5N z?|?95_$UJOFbSZXRI+JfGFoWN8Jo0__@TPQR8}h_NBYAtW;-3vHazp!U`;ybp>(g3 z@2tgx!@RGhaKoB4yi|>$0^aGbITy>%scefqEv8SO7Q;sli4nxeXv*W&t0t(J%cLn6 zrj~V4Dg;-crB6p+Y-p29fEtoj^z+XHa)`OlLhfh557!Jytb6amJ=+sp4TT8s; z(n}F|2qp@)%&y74rrBX=orQ~6-Jj&%3Yu`l~kQ!YZx4fJ%LARFa`nmE&x)y$A zkB2)MMOTHV8v?j>+frCK_Xkak);?o!pzTkmJMnZXfWYQG-&Mi!BIDl>4!@4wJ*_)d zN5{^U2#__=gB?G}Qrb}_QWBkgCynYf46B8f^p|n%-rW?qFJe-S)dGj&=H8h-iqx3~4^KXS=|O>55CwQ~pN+Tk&W zZFK_%5U>OwJXndg<}6<3qEM)Wd@>q{K!S0`Vk%k_B+h-WJv>4O2noU&t3XP~Is2u2 zla>QbA2vuuM1XC0E=%x^+NzzDM1`QVjMPRYNDyjWS`qx1*R>w+37_w{%#eNw{8mw* zqAb4?>1erb*;L@$k*Sc_YRc&R;-^To-V9(vDb|s{B{VX6?T0Ee9H?;Kiz)m|I3fMn zpIwuoUM1o*17_LQ0Rhp8>$mNRn|}G*_}B+O6^$c;Eku)I50;xYw8?`IUMqyB?w-!Y z!061zu%_b5I&C+=Q#TBV!$=gQI+Lnd+Rg;326MrU?G^5bB}9J9~N8ZCpzLnFr#nZ@Db` z@LRZShyMyAEEW3em6E73nbX02-nr+*9e3TGr|tD4l&}x>vQAp#`)1Ad+D?a{%A!&2 zwys|h|MIy{a9Gkui4b=R%9c#6z~UA*&26ZO&`%%kx5ccd=ERFwan3kHC1E;yikY#H zqnJfs8QucG|NOTSyO|SMyOt=P#H|czI9t^G%$PbO&Oi6O457MZ`&RrfHpJRBYh&4p z6|oATylm-;cx2|x|G8omWoPQnWEAkysY;{tUZ9|rTnmGWYtj-7W*@ZJ%9=4O{uS#u z4eQQXoUA!<(j=A$#>d176L2CO1wX+N%z9{~?X)k81+3KN@5-X$^UUCPE##Qjjy;6iT@d%({}{W~_Tk7!90+JxYelv>XWPQYx;g#bdT3ufc<-I@ z`2DxBwm%XxG228bP{p9y*<;CB2NKpYMvNSW)n{S6>%G^;7e4>_7&~ehjG6I9U;e&S zVZUn&ELZ%?b5-u|xqD_TTD&wyj~kPUffK0)1k|$Si(>B6kCf#E#-+`bO$-@^lCo@Z z{Qc*@6w{|2(L7Vx2#R-=}&b-}`($c8O zS-O4W@^P7zsfZNWAn)$RuARd>m*B%d430s&qMoJ1-c7{X=-vnI zYrRcg4BS4?9St1Gt|DMw+oRAXc(0TM>uorU9H$M+)?OT|p3eES#WvZ_JZ`?tNDn0ysZjet$kNqbZdkXr z?$~KFIAM-p9%>&ofobQpC2=CSsZ6uHm07q1ZG&vgK@^AF?uJ(AbD`G!uCUcgkXjLU zGqkDN97xDP2Eo9Jl6f>RD;Fs~6De-|a$3&1#mb@pyt4*8VJR&>u@~-t#Vb)R2#Py#r36GtlnQ|C@ z0>8cMuDIa*3z8rXAdK=|VMG~fz+5So<}X?n*I)mm_>X`4dQ8HyV8plsIMp??rryRN zYu6K+`eZGdx82I;pmEv7`qU2Py57rmS+CV9X@e)G3Af2UvMzr6H2=Bzu^sEp zP|ThkOe?HkxXSUe6ix4l-(#jsiZB23*Wz#g{;y)vq-jKC^hfR*09`>n6X6>t3$`sG5j^B%DW|oq?-vjYH4qC5$?Q4kGIFSJhkz}?)1HTXEKlItrEibdt^0w{qBTb8=CU##; z@-uc~w7sg#KALIY_FX&K#&ELhZitO25L<~Av1RKvEOfg$a(h>7#)7gF z$4)H3|EpBrG=LD@Q)4JcR1amjW+d@A#$zp-z-J^1z+k=maqQ~fZvakjCH}h=fU4|S zN3D*aY2u|Hq$@_CSu#&v)UKr+)6sbO-FueqrzFG~?`Z1hE;w^MScVR`3l=Pj2OoVR zmabUG*(C$8av`*t&dN^2Yf*$1VDg_=(EVs}v zHCQ1Geh8FuiRrQahS=A_ZbpL`0- z3z12ILm{H$-%bul`uWdpB9IN11ceAMDlipL%{c3s-g4!eqL(|T=^; zKIe9N+vxqqLj~3jwwSgffNfq~%Z}(E-ht6ypL^=ZTq$W z^fsb?V!f7Lcv%>YC`z`Zg);kgIh@HKAKxv?La_+sWKxv!o-=a!hDuT$eqDJYBac*; zgu55Yl1ptW${x_CwO2W%VqibZxBa#covhg2ltu7sWry!cs~KB}dp(qo^pSY3>&18i zXnixx*Mb6L44tBgpnw5W?)XSr#Cik2WPZRHU}>l$4F*7ZgfbkN?L$XTd;6|kTYuqc zaDV*Hx7Y33u{EB3W;ScCW1@xaatg9Cn=Zo7IR9!W-YaGwOqUWJTA6^@;UX!M4WhwX z4~q9>(V(mKeU%57F51xKG>uE}#Z=<F`Rqj*dPxdf1p(#p%umASvC+Vwnaa8-5NzPn z0CA;vzWu;GeIfE0g{eiW^(AwmJS`q}P#L6j2<6x&+gW|g@7kU-vKQE<_R$Z1Ain&S zuf)jV!+-;`5ek(IpKR2_yWnXHR+T4VRzJGvKV!m#>3IG3LWnt#SV~~VVid4F5TZ*7 z_CZr-w`navLCZmbQqUaY5a;qHKQ_-l8N!oxIPlaug;$SS2dc{y^(ZPbKoyi#E0@L# zQ(lX)V@AUeRFG}u9(kgi;7%^1Z{@*?v{8%@>&#Q*n4=Hja220`1I7`6d$H!_y~%`jQO)Z9Lo@_EAfy&?8xH?z02u+?0(QEK?fiQm725+rue4F zz{+-7ooELQ8W2b0k1%A&U~nwF=9A5lYA|_e@@dJDKmX@{3Tn!G!o!v1leIN^CS6ta z_+8~=l;n)qF{61{C9dj!9X2ygJmbP$FETq7M(G$2rR*E67BV@Rn8ACr@OkKq69C7e zcyYIf$Awq*3#{-l`Vub{28vanzzMoCt1nTf_tR-xH6c#B?N@VVbNhnCAxgTD)jp zeE;H~#&^H-?S$QvVpYgA@mFxR;@IflcM!r^Vc9hL^dqgA-IYtHZp{Xqq+=K@_v|Y>OIk>@Q#Zk`;OX+~6zIU1w3%(gsjoKEFLK9eOA+w$ zAt$mbNXnWjoOGW1p{%4lg|&)CS_pEf78zvyz@2q5t}I_gNgiX~mf#`}-!l)g&-<3& zn!~QNBvknvpE(vF6csh`>m=EJaJ#p%)vf2q*4@L0AJFXe88h#hIpyiIX?*$|_-#9* zMZ5N|G~c{&#nyF8daYiyY7hHho4DO*6SMU_6l8!OXX~B=uHe?&S^}%I90g1s6anJw z5Az5}=Cum`YhJ33SZ;zqlYn$OG-V^{5G@pTcv-iRQ8DOXJ_1R1r+}Bx)VB0%P~q5X zUQ!!WdsV|@&?NJ6FpF;$hoUriy$6DmFzxVUhIFVJm!6zH7Y3D*WO7`4FqH(Ff|lQ{ z8IUGB*Sz9ELF+ox3(q_qzxdT};v*mX2(yT;IWY8uu|D_&6jw}S^Ovkm@Az+D{2LAn zi5M}eZ)|`8dFta1mJznIq@ZE|4e|jN909Cfyy~AJF$#0(0|_6(racYq0xt32jM(}P zNZaKz2YVuvat#S;K%iB``Iz?l)Hn>~0NW=(I)unTGTNP2;=>>+BS#I1OMh`ueC->b zivj&daQfrgR1_`0J!P#~wuIORQ{$*(js#aluRB5J&0iQZXV1wU4M!e+NDN@s+=|^9)>Z^l5g2a) z`v2_qK27jvxy9c`&#c#<_FQ4XJf{83wbGQWEX#QTbXMj2p8@j5-1e4r*;`(-D#{Nj zun|~P+PDi+kk;PG?Us36Xp75+R5i=*>bl`!!^MApLiPEAW5UZ#YPWSYW+J<0q45>AbcP;(2ZQ z^t@H?gbK5HC#*y&24DU5e-IkIcjDHWW>=P-Kl+jPah}M2asD@d$S#l7(R)9X6L`2v zmZ)+^)mFS1oZQLN^K?P@S6iIjbM2hA>6mAdk5z&;g(>*++xDb?8hv9QnLk4dQ~m~K z;PNx`l>U(psUBXb8X$GSDfrD;E`dP&Mf(fg6-5BLg?P%?Ei@r6axzER^4U~ofX_*$ z6GeH8yx7U5{KWUI*lR73^4**?BYae#i##c9H5O0_jjWXgM??iaZ8N2{1pFyiOpYj( z2;cYHrCjg%T-mpq1Iv;Rk~bB96p37-hheGwixcyvFBRB0jZDSBPO5d3jrJYO%6kc!2rV;i8z{8iRx3*93Xq_% zEJ-3LLPNN;8aQx;!TPP+*^&KN0|$g|{5359@++>051n^jDlZbZJ_2cZ5OOqOw*fvk@%8xmuP%$<{N{4Zj-7JgY{A2S zI~uY61-rn#dsz)8Q!ve|z~C~1gRBKJc<~`&B+&qib*S7pORqF{;d8)A45r-K0Zw*7 zSWs3WEZVhs(}w6bXh@uJ!U-Hb3Z6koSx*%w)c~`vP(EnTemG^_aT~GRmoCKVQteoV zpb&LUs{_`BDG1FW(VYX4sIJzZm?zP~Cr^2mxDFj~UNov=!MR_xTCzT2eY=!Ufp=-r zG!kdZgrgId5v}drFlDFE1+>P$&9nC%u5AZ5%6Ko|Ui;?S^_vKmH7D+U;9<7Dn2d zwJTOETN+p1a6^3JsQLxe6YvCD#c+QPLESJ=hMqk_eNR{pIR7^VD$;cW9)>BdN85 z!MYO;U|mX3rJMhDXT19SQyC=8Ns-48uOvvg95Q+oV*`sLyvSt;eJF+v8xY4F zb7Tfhnm%I&u{m(Ogn!B7wK_SLOwR5r0j?0u} z4jr;w<$-+AiKP8f+2$k5!=NOy0icp2FHX(+_}ed9Jf`l^J)zm`7M`yVf0HPr*&OTEfkzY_ZHT z;R6~vO+K&nAr*w=`9((gzICJwsNqa}38&ALThh05VVS<4OC7YdI3pHket7zxUcL5f zx^(H%*VnA5yM@OM%7ND$c{z1g*Iolp*|B}=f$Ntqt{*sjWYb=(|l^+xe8YiWVwk*@@Q44 z5N5|(j*Qypc9waIknpMH7D1|@@|kZqBk-xPsr}i(KF>}7R*{%K4m?i+5UI7!vjbD` z(g6;2%S<7_w~@fi_tXjMiUaoZ| z3{`!lkhlLUWTxsJ2l9}?LpbQ@Onf)~%z5@3qJRJXoNNXzvmI65@?J6mtOC-TwAvBj z@ydkfW7_l?IOKMZ&RBd@8gkGwOR{MWZj*~FG%=Mw`(nk4m4s@YoU>F9fU1_3()Yu< zYqV6={J-&C;j{FRy;43^+0}1_uQV&3@|p*Q(bewN?&oucir~K4rwF&gbgHsSiU0j? zj*+bGjn5jxCba%*oZk4W@so0Go2%rtFr^X#z}p#D%a*SunAL0X_q*?p2icCg8t1Hb z?D}ZW35qV`sZdz24NTtx`ZL?Y?{#Ze#iW;>i~H}m7Blr0y#2eQK)WnjgsJ)VMT~UY zqes_Ryl_4y@6GYId+v$z2;kHjzEH0@9$}j^bV`B55?(H|7{5(5h{})JU-_T{L_V{C zErnNIcO!wkc1K5Hf&^6#9Lw^ld+xe3=1!dyo!FA>(vZ|Cs9JcJ)-8yGk3K$r^n?G% zAZzk$`@U3a&3l_vuA9Vb3+m#(uDmW<6DPq4gf64_$~r=Z^ih#UU9_)nD@h5+EsoH1q+Z1@zt#D2G z0nbnde>c?l5iKSZSwqYrd`IZn;GY3E$lS%^}+OR~yb(U{K5)yz*0bY~`1xm)72S^d( zz_D@Gq35O+2-~foEHFy=1)+I5q9!6y!FwW5#Pb6rSx+(9s38ic$>$Q4+Nr@Nk}wd) z3TVq$S+Q+yq0^CV%8a@3(~JHiKL3T!5dwKAGfty<6-Fu?Eh$^;#Im&;;_7Q}jL&}J zTMYE3(X%7(6ZW(o#b7%#_wAIm8-}EHM>rkC!XgoBs&ZLI2#uDd2IxSq2v2yt=Zh6# z3b*anVWk~P!X~`T9cbb!tu72aIhOleyL9dti)OwaC!Ky~>`&ZvrL|&382r#2N-EcW z>yywMv;2$C&cUiervb7kID6=KAn(f=xvSwMIvwFSah0U zfCMRN$@MqA)>o|LT=-{*iGcH(Yr8tvxmC(Tog7?lrxiNQ;tpcrwO?d@8#b=z{P)?! zftZQcuw$k;rrJkUl5WLAWB99Q|C8?uGmYPQ(=y*IW4=^-ka!TLx6GI{SL!iO^?B3U z8o+t`r!`v2lB@E-?HjNnrSE+vWfbPdZSd#VmEmngXwII$D4xcj;J*7FiI*n6%z89^ ziL%$GZ3i+r!=)sMYY%(?PL#D$8vW|n-yL)CEx7N&dt%m<=ktV7oyO|ZYG*6>P*2h( z<#@+2C3EhD61i~hoEUZZSR7+-<22Qi3;V*MSJ;dVq;-PJe4khI+V3jWYN&qZw>07e zX8E$^aor6!v22H&TS!Uy9vIw6=kPAcdVBV0orq!Ev*w$Yy70m#@x&8*28=jt z1i9b6d*|job#rGl9l;uGH^PHXhuL*RkSTmz*Dw}=fT{@zoZ5_*1G3-EfP+A|J30XKk8wKKtb(gU9iItLXKk0x^nQ{hRu3Pg!F2Qx%s*`))@ zY+CbIr7i0aXc-E835Kj7i9eL&%sdAUzx183TnW|t3dqbyqtbFh9`}%IMx3``VH|n* zVR6Y%enbf5v%nS3N3_E=9LobOw7pzUocwD1^3vbNB|rE@j68HGkBQ2LGEk3S!48Cq z+ru8AH)N}%Ak^Af{e7TKtRq~vvD*{0!h3A25>PO)(Q3<4E($yt3->cl&Ep-#Gz^95cb=0JbeEeTodIF@)w4$ktOUsMlZBTS( zvn=x5laGRzwpbCmq=m?1sWttnhk&xso^1a8(+WiS9xvk z-^Mu`Ut4t5qP^9WJB{;I*L!oDrzD?=DwAWwkHdBa=XXqbZF&a8di1d;*@`;{Ae-kh zQ7hK7RRrLHj1L8>w81#$hrFgGP5^>HeZR}io9v7=tCz>K&paMa+TR(%J+^WEBYwj^&g zV7PWGzoZKp`LY$O;s%@#7ZWA5J8SxTxCb+#4eU(B*11D3~(A0qym zHf@o+B^Gfa^-wy9RJ&XTrmE#=((;KT7OXOgsL%dtz3 z^(Z=qHFhF&%MCY1pFx9T(2(K8RVdDGrGbtI#sX%NE?5+gIrezQf6KV(#w%EI*dO{Y zLesV>+$-y_)mOq*zN7$7r*9xr(D~bUD?#V`zH3-z+u$&iHstZ9!s7u&RPnBO6#sTX zj@itm`e1&j!UtZP$NXHR)tdr**GZ`|%}HmvW1OU#^wUDUDB#(u8C#_Ik z*~-6HU@Pe5+lHjJZe^ncr~icttn$q|T}CM}fXY&B?rO^hJGoL>(7C=$vMftH)pR7nVgo09ZDJkV23KD1vMZGWD>P{_5MY^SuJh6m8z^vU zLH42+2OakGdRDlJToGltb~-<^qr`zol&K~`pk3KP89bxbsg`RJ9!I5}qM5xE;5gEG zqiB5YU~o{0B#BO90GvdqWmv84NX-mQPXf+zMPw=ky-~N9$N*GQ)nw--b@6w`yO~WzJ9^?~0g_B$BtT&iR@bq0EGkM?~NgV9V4AFe33FWc8vt=JxqJ$^6C3wU(b zcBmv12j6aidhL}7F=+5GqA^xS+R{vLto1>Mpb6tA6JTio+djL%EF^wvv#MGuwF<%B z+U>J_lQt0GWEFLkGO)S{U)O8Op)3c=h#Z#3A7L z+|3-mMPxVot_5LGh1GVJw(z&ssK#v<$i3>z-WF$DZEvH`-lzZQRpYnc>bj~!{O|oI zOs2Pf>+NA^48NuL&*tX`9A^38IiHCTKATZK=Pz0wFT6N018Y6|{EGyITAj|h%zp4! zlBYN(lJzHk9aEk%X-OU!)Vfu(*tC8%5j`izO*dQ}%NEQg+9A_q7_`oFiinb|Gpn!t zhF?H8ov^T}K&)ho=%ttaKF+`30)iXu$Bqz$4a{A-&s2Ne>*`i{u(#M+&gyp3tu(Q4 z$%?oN3*(}tD>!tlZ?RS})}1A{qzxO^tct(>`7$gdI9|i^r1xCH0$^!t3rlJ{>)Xba zSN}QsbHI`aaZH)2I)$l5Zrlai+?c&|dHnUpn_~5fg|V9*9>)1lV7Z-c3+I#c>Dw=E zy!IM+TEyVt2Sm57L?49abEaDr=*f?j5iTRxPWdYe4ZqU?vxdXUs-V&%UQ>wx7$=)5 z3i4`Ypu#+9MOvj_l~=aSd-kWxy5d&H&y<_U3VFNFtWVyb`KUvyr*PZ5jvW0NT!OZ} z@;aZ{*A;Cl2bFKiMR$Po+^;wOna!FmSg`oX9h+A@Y}VS`G-6y$IT$qhs6#MWym#xC z&Ctcprgh8L#jqg*(?m6Q?tHXmgCdEV(x4Rj0HDUCU@i_ObU26=F{#baAb|nWY>pllmsqwEmNvq7%!Tb6@UVsd8A?b3J}Y2!5M!d0sjKGh^eo-kVAddw+XX<**+ZSM+`J z7&GReIO|>S;vk&`F?rGim~BtmT((;Pa71pEhr_kX3tASp^h^gbedDSAQOr* zj0l*8+mDDAGM|g3H%o7R_sw#?)x89khmF7AEN|oId#@|}S9jj*%{RYS-tez=r!e=s z*5+i?v^)Ed9NRII))5u*r3sVcp@*M{dmeZwW~7y%8OmDMXw4YbqGLIhLAO)vUZ_+H z9E+{ka*9QiAYBvU+H0?jnXgTXR>Wdxi(_mCZ{yt*97zW?=&JspP_3Rixh`HX4+V2e z+;Q){@sWS}Cn7vzDUt{AiZDw>RkC~Eto!ytSLNheTIBr&b<5*MEC$O~tws^$d@C#~yhwroS>V{S1V?V)`mUJ$iORSzj7|zTw(9Yt$LelwrlL_361cvpr3Y!WHu_z^DSJ*aT0X-b@yEndY(I`Jg2>aAMawLtw9aZA9( zYC`OD`pmYdAzHRX;gXG}Iq@q#5+^X7jRag8(3jaYi<`%e9g7naOB9SkhmGxPoUEQ| zNV`!EdSQ<58h74#OIi=MBM3bT*td*-V0cwe2s4`B(4j+7v^o?9-~gxmG_wKAD+Ed! zJ{$`Jrb(S{tUw`IKBe|-HkbRt<5LGv^~r{si+lZO)0sqn?9>GqZ~t4;V-IGF2AL{! zRFz70%c*??Vb>1mj6vT%m4r<(`NgM*VexW0ZT2FPs2+yB4+ zDbVc2)ms5j;nHv4$@gqaN^#z&osy9}!fS?XtX#b|rlCkZ@$@rs@4XMkBTqaVlV6#J z#cexEZWorRIzcmz3G(x4C>KS~u>>je0hi!f>)kG5hRh*);NNchYrKq-+MI2t9q=#F z4DGD7v_dF=r3OdRkp)8p?b^1^cmeb0&W>ZxIh$AmH^phkpO6Y&E@L`wc~8;6SB?w6 z-zrr&DbF2$zSo41-3#N|8*YxZ2U)ORKesgZWI#E6v!khsWpx z4~<{`*H2hJ90*Tydtz;J!kCvLoWP~|9R;EABPVEDq_KDcmpo5kozMxFR%h?YcjaM; zKuZD!g{nM7?o%2JRJ@b@Swn!&N#axv3m*Q=X}8vL5eg4HU){+R%>A zeWpTVJA9T_XUdb$%6pZUmYI__%Fx=OWl>pJ@pRuYzdi$&Y5P<-;GhY+_v9V6QKx=o zg6~?lih;2ntVcyy`QXvlmf=SQLUfpq0&6mtiDAN6AHDnbso%6|OVjx?>h2*-~U86sUmDLxV^4>c1IYs6DA2YV391z-I_ zeECaXz*K!KTCYwvnvM1noozQvF)wGl_8CL-6!PDPZ|v2LgH0 zk0PVSj(AVyq&Vw%>Q)XGwP@~F)&cRUb;WH#9?j{s1SzcI-oYi#Bt{hmVe_~6cgQ$c zUGgz7hwU|-r!fn-O`^@3Rms~P3&UEXmmM&2WQ-U(5Fzg~OCy(m@`}HC7*pwUwcx&e z2E>E+b70ZDsnG=?Z2Sc4q*VHuErVDLRuKO{b}(qr;KJO+y$S#@=$z!~n=i8;eb|T* z(Ulpx76kh@tIe7n^a(J3tGmKfl6R`Ryq0+JiEC>eQAoxfH8zeq>ZrK$p$7@0T$f6N z15)Oza%gH?Mnm1;KvS{@&9rA-dNT}i;(e(nXr zVn0G)u;*g|_f(kL(Raq;XvN8yO;}Th%OpM%Ldwf;d(Ju-hb@>Wv|;ROzMVgJMm+WS z1M$SecVYS4fg^C2?CYHz7?er`{m}%^!9r!VzZB&&`=>KOgtn~P#7>AM@$K*bAPj|k z;Lu?RT`8~#81okDDeV)K|63|q7?;lMp}lD{XU8?y-hjf&VQ55c%mogZxhEc~c6b!? z^r^4JEm!|BT7!$+W($Ch9|fJ`e-Go^gYvGs{`wffmfU*IjFGoy;;SMR@8n(o)W+CE z>c5Fy2Af%0SdFsU6swz)msHPzPs@V7L@?G^y^^a!zbGg^a zmvTgmx}+)`sgxokq(#e-XG{O`Y!w3lp@^Eb1iohwY@IirW~eTtF`>3TiT;VLfHeo?OwNfU9;sYSKYp6=lY2e zqxUKYPmCK^91=$#bqZa3GTx~5P510-x^Ba2LQ1+;Umty$eaV=yC}gKpl`4qU1S`a= z4Jm{KP61s3so)g>YCI-~mIRSR%3qZV5t(J>Gc5`bXM$M-y4scX==_oX4%CqX5@gwF zWt(Kp$ps}rq*Z}7QtKpNB}}WbHUDTWsI)6#>(G&S;dJ_+QnXivjcrz-+q=SF1`?V%77~35{3IbkD5YKGp^nPrReHt385w53%=;JnT@`4@*SK9Qjqo>@=}J0uL$yUGY)q14Fvy zmK!;6rU#Y^myHyOC}TWT!-8?=K!Qxi5Hm#O)GTFciBSc zGcjX-(&x~wOA9_*%l5ljbLPb~4nBJgtHKNv@^u@a8=l#p&I(#U1J!t=n8bnYPE;jz zz7Y#zDY4uLNu}5K&1Y$TOpP*^8*lhqyCdpki16alssu^hwzKpF7hYFdLizcoe-k5=;d>JHY#{I54?YqTr%aA@iJ`R6*AmpM4SnApe+R>;m)X8! zwuWb00UW|&J(V><961L4_E~uj&iO4rawaZKD4PVdn*B>eWpY-O3hQ&+EAO0e`mOcW z8N5Uyr6@-g)VA9^Il)6#3S*9czD2S-yPS;Z)Gzv#2|7y)cb1E+kP!t3VI~$_oASAXN_+};;*EBxEcn}gP$LwNS_rf>l<(qUymIx1oW`bRFB0Sc z(j{eXShXSs4jWDkhSy@^)&32z#YV( z=G+C^=1f4sRN?A`P<`;8JJa9eFqp*_X2?ZxBOmB(3#^+qY>MCi{?GBR|N1ek7yXl2 z+Vu$TTbHm@dg|aES_tYEEsDAG7G{`mkA-hffS69SscSPF1Jit6W=kqq zr9G4;jS5{26lXnJyIM2DHN>u4>o&6MXCaoCiQ`|4InyVTol{ZSZRJZj)3&%;vIiOv zKsh=SnjBYMx_60%^JeGoZ(=R@7nTu+4<4MqcLJ10CR?Uk6-{D9u!>V)-g?_VY1O2& z(EACAJU(u|^$rw~t{H119kVT-{@i6ac|tueoHsYFy!I-<-I^1D-S844rb?fCppl;Y z?Ux5DefBF~kF(D@UHxG%+PL%xVL`Tc3uSwg|MZ{zra#Ve&ySDRgiT+)ay4{_#fs-D zq>6+TCXQkGJ@2$&oAM5L+f24T??2}7=*4*(=YI8~`29CN9UnRGJ)9_7*3NSnQAFvh zrg6@D-WAtg_xt$x$37URoO)LBPA#grBdd*k8ayIEUweIaY+PH%>6iWE@IwxcL)Zy2 zXz(D;ljsfYcR?0)$|0(ybK}O%Y(HKZixw=1+4JVb%sFhWe(@O^NMN)B4<<}H`~+oG zyxIaHV@i8$n`~%9tsTcg#7fRYzAd9E$VY11u%`Tm|^jjvMc`JE%iR(}%zB}Oe zzN_Dn^3VF6AUjd1mQ7SZgsFg14wKSR(h0VF-{izf`QYThyiPQIFX7|c^DlO={Nlt< zSzw*!^PN;~Xot#&a=)N(%v4Oy{nQEx<`a)>t!uk{b z>1#h`t@wMpw{2$eV{`M3>sQA7`Ll^SNoA~~o_@->M8*r_Cq^Ik_-fAA)FT4jL$A;? zgs8JY2_j81Xff_FPjfi4fHFI?PCW5Jnt<9E8*8#G8>S#uW73j91_%~yh-(F6B0#N{ zd=j?`fUu}cD5x#ZJT}nIE?XpvmBF%8sPdh{!VafwzVg1aIL|2m^)G(G5wnLNm}JtF zC8g_VMzVZ|nao`QJLT1>@%umgA+G=PRWb6A(KsA#K^PaMK#k8fq+G{r9Ord5c3R+-$)zUhDY^k-w( z&=Kqbb`aSImRlH^J__Re;~)FyIB4|HeBxHLRIDhm)J~xmTubHc>epL;CvDoFq`Q>j~;%Qy#{*5$TTpN!_rhC>cL z0;V<$vv|j7%~=jA2Pz6Klj(~g-sxJ3q2=_mD3-EJGOTQ!oe6Gb7&0Q2Oc|Z)uJ)^^ z)phCAArCz2=9bH}Ua%b#M$w8G9ftL74IQa$GO?ly>{c&l)*d7ML@*o$TFAclC zc*!!BUKTNPUy0JSi6s=qDC4UY!o~9$q-$}SG$l0PV{iNY>9UMZ#Q~p!bjA=$Byr>^ z3VdwN-Bhm=Q0%3NFUESTeYUbQYw|mBB$f8;y0VooDY4*HTvLt-)F*%G3?6q9a(M;k zjEp{MT>Rjh7i8>$4onW*jX*c#q`-HYAUzFm)HtcW@0+aKPnD9_(XLIKcf`YwJjU_t zPq9_Ddny4%pGv%_4&vHUm!u(6e#y_!4d9Sl|`L8lWIpZX*qAej87d}%qIdSuOW8W|* zgTAiPyCW`HQ*H`=jfD^ERv zdDzHNd$x1t_luKWZOW^stY19iv4{`4kE2Q#(t{V)pZKA#T+A%*JN4UD4z@P;@Simd zl*NnYQ)pYv#a%g-?pXG3Pi6ghIkP{vYiYtLrtdUoKr}X3&rFf*Y`qffDgdsVsPVNz zi^)L)pb|}4a$r^uNY1Kkq)FkZDa1TpYi@EjVh2m0)}atlGt)UpBC&p9F@Nb4EeFM+ zL~SZNj%O+_IkV-N!dQm-^kXl^71#ZanBgBLpJsOzkiwwU7E{RcEitWLx0z*x`{I|s z|3gfhH#-jK*Dt+%4Q!-xpfIRr#n~9)0qeO%5qwqyM`cAk`poTpcD6XO4pVB0JonqY z5|FzOY_p0*r4Sf+$a@M9!$WJ*l4zgAyLt4XN5*G9^~re0@yBzoP5kH2e-YPSc^QsR zeKJ5tPTR#k+OxuX+_~?9$ux`afAyZpCE^J8*NyZ4bx$ zK6rWzM#)&QViix|2;?bC2oSWyiYZgC?@#@oFTw1@!vU@Wu$72=RXXI@lj48_4#bnZAG4o6xiwV~3q@%ybvq7ZR>|0)u{^MeaVhM^xA#cwb!#`` z(axFnC+O^S$cN;Nv`PAu+=(!Ll|!IB6><-Ob`&9}z!ufOKM$TP$|2glX?e-bZ z;pq06eQO&`)s?>;i}ISubL!$}zqu@yQpNB=JQC#N^p4<5TCH5a)mW^Bgg*Um5&U-e#SQZ{g98kB<=NN4#mG4{Nv-6}Hwg3s&~NupOVL#q4sKFn)ae zg>n7JL-)qW1K=S5vL454d9Y*FveFvBs}1}XSs*`FZYf*jyD3nq$M&bSni_qt$P&jK zknoN;&xtMVDKbkXp%Av?K-d8SIk9B(ZRq`0#wVk#{Yx1ZA58AVENnMliuT9(9vrDHFm(83! z9#k;es&pY2evrdW)LdzxTCo*r@^kHP2eX2uF#1`uX5nCRV4BRWSOBcZylO9U74KV^ zrd*L#W}U8uz&s_W+H-*wao)Fqemmp!9g}6}mOPMZKE2*$>QbxE+^S~&R0Mdg;8deh z(eO|b3DSJ6n-_37*CBAI-nEP&}d1*Q<$<0N(f$?J~yuY z>rL^Ci!Y8rSPO=szyaZg+KUtT=>Ip#h^h$F^w-t*u|+F+5O}ye=ShPuK4pGP!K+kFdjg^DTFLh z1^}~UD`4}s&EwWv{+7qco_6X9;7s$Hv}Iv$Ocg9|y!+pO*-n*$Qjgj<`?8OEM~oV| zf1Gs6Dew6#Y$0lWkf!dhMKW6$7`O! ze)F%2T0P}$CC0{v%^bW_kAgJ|4Pe_8S~7Y zzc{YD_QqJjfk=iQuZK^i1FK^neD1-->-OlCoYQdY%{NEg%*oNAOE>uM=6v6t7eDR} z=-an<%$qeM{^Q3#VL1UaJwVxa{t;H;EMMh9tmb|C!1GZy5a8(97bazd!tJcvZ&|q< z3zt4gN(Y1+{KhSmO|fK1Px3)eF)Z|hg1|E^LEBa@i@HFZAUX~m-Yq)6ylC+`s$xQ`~j?7_s4tAJ~KY@(ND&=zI8sk8b&4j!YFO|EzTsD z(irdf+iyPHuUcl?YX8m5B(ix78HgVQpW}&l^3cPN#D87->v-+uiE;2@hoK;>OFEYC zIyP*R^japkwAryi`;{d*nSthYvR3FS!0k^by22(5VpbTGQ}S!&j`>u|E6aj(pwM^g zqt-w3I_@n~I12A81**JwRJ97e%LOS*bL^EJ4qA~tU&FFf8Q}eGOh|>_@>D3aDkwLE z)yZbI4=7b`)^e>_>(}wuTknt2 zhm6AHxGSAzHldO3WDvVXT^-yUXJIVel%vV*1N+kNYH#+ z1VSF%gr&!2uw*d8MO|4oWL_9$saLActEyVQ#fOTMEzI1E4H<-vPdYcbBxODBzG=(v zcGTqoK}K$rVaNni$R~Xk8qMV|X8q0iv_kN=VaGrl`~=#vOwtZTx*gxGu}J7KZa^4D zZwkADWncmnKSfIW4MjWV;1A+Un6+9t@?>nSQ2zWDrWS0Y-pY=t1uSh&dHF?-CB8eJ ze)t~N*QY0)c0?&?O`DPtOaJ1cV2Qs4KiSs}{iA>`IMIQ2F{b(rYuCmZSf+k`*=6zZ zkK*IfyB{k_#hgwjB)oZoWVS)UWE~|{mxY6H&-$yIwLG>jmlF9s<@FitNVqY5ExO^) zC9YJMnu2fTlRI0CzUZ!=yZ&}tESg~~gI+~3pj>%@#XI&pbN~ye)psi1ucRV--{q0Pj7n28Ai})}6*Xv^SQ+`Q@@^ta$ zyY_v`F((OhhUF;qElhqdztpl@#%-DK3Wt+~YNF*cKl<(X?c}UjeUx*?0U_J~b@DLl zO{=0X)@WEbeXg~*w9R@WCp^PP?Js`n=Pg{=l!&?0kNxMfe>e4sCuDNkrD|#1xKs`X z9&pq+3OKO|b~Hj1qa3I$7E6G_VC1=F6ErkO(w{6Z&CUEGD z1GXE1UsQN3H3t|&K;^M5UdW3VFO7*4Ue3TZ{h2k1w;V7+0JAEvl%B2NvTxs*ct<#M zXgN%|q8tj#vK(;TahiO`@yEq`FmtxUy!p@r4-%UK=N<01Cv2{Cm&%lxZ7d(1wS>1| z!*7d}L7*fsc6M=;xHM+eMZ+_Ix;p3yZ~r?jcK$UXImOP(h_YGqgssbC&l0i5k>2_51HRg?jU*BR^zEKRdmKY!-Q z$K&?fZzndv3%cmcEV?C(&f*NoE_2UvsZ+rZ>g-DX*tWgx6E=gMb?VeUmM>Yv zxdUtCtoOb*esamr<11hIQXDdJ6c)x}9ZO-)7${DPr3~TDVl6s9j3KTvFTWe7#69hE zd^;KNe38eWdKQP}+taer&J+4TcOmiX7+x^tt=%>pOgnJd1P{qm0JD! z8MK8ax3gnFAC%kfxIGSFqE?U9O<`lP0x0jS;Pl(uri6`pmt*0)@%DQ-ZE;PkU9}=6 zKl>!{AF#a22jL}d*Ukx3_MyU<_VA&S8hua}1*dJr+Ys*dt!&wLCd+jnj&817u{xf9 z^rbjr>=A@?=9~*)m$nLhmG}D+Bc&%3my|R4%sfI`p!cln0&}@%FIcC2T{V{K^Zjgb zmQj1#g7_2#n{mxd`FNI9Jt_8@tFDMag9b64v}6|NJ=V=go-k? zmel~wwx>@IGDBXq2`5SY!E$^e(-inx8RQT0{UR4#TF_z+T9^=NK@cyw6h_r5^-dD? z(@`N;j%v-Z3$h<5OUs1G->Kx#Hv;cBk`RiLC>g3b>vWuEzF9IQ_!((%Xs9GN8-aD z{&2kK{qKusUYNjXUA=QXBxi%Xqei0;6fnbJnnaQ_7zd4JT3hP1!ZTZ4;7Z}(`b#cT z_ynZcSVM)X1u67R3Kl!g&R4tD*+UK0dm>W{fk~&wqCGJq10I?CHr8r8Fr%}Lxdueb zeb2P8ZgKqXk5@$hK?5PA?y(bOE?gkt+i|*U!mP5H!d2p; zEN7Z(hql=@9x-d@S1`$-Q&|8E|xCGuU>@--r zW_9e(u7ioMOl5s^MjUtK0rZ>79Ice3ib3Yq_#6%H74RNapUn>#n&Wy^~KrBlOM(RnJXkl58vRqj@ zcqP%785;gbGAxdf6up%IQ~?QydHq! z)-!td?o0o+hhejXKv^o;j+-1u&@v+cc!gc1Qp}cCRd|-h3&OMLH~uj@wCQ{Ks!zRF zrAF6{F7v571WKz5-elQXPW7(e4TS<7*$hhLxJV_4-&?k9h!sm$;hVB7)?n$HI%9g& z&6(OzLR+ICw(p(Q=zFvc`pNbrwv&%pNkjhX!aMmCe0fk=cYJgf%$=2w4;%N6_~w_s z7AKE8DSEQ}BlMbRC1?3arbb12r*^kI+vjhUwIPpfrW_|kD^{ z9Im-LhO$Dw$d;b(OL3;WHYfzweN*WZ#r=x(5eA1wjXbgw3C`B5u3q-Z&ad z*A9eRS_~*Fhk@{MQ8gvO1*GJo+?2~b`_lNBF=q}tvGBFPf;+Nkg;+s5UWF4fqS z-St?_#Je~Gc4;_gXDXAxlRO3GTs&`GgO3_DNRPdH4~%8&H^i5}dvW~wlJCZ-{w$+F zw<=7+mSZ7tCAy?pZswd-jF!4{{PWAaD#BZttZm_VYH3O3vIV{ot@t=zeY+|%tsVR} zm2pre8T#OOK%Rakpa1MycfpQT(0#>l3zZn+H~P$>;j1sh}w9EK__dL?*a|Anpy6w}~Ae`m&^~C9nB~K|D9baaDPu?63?Kgbm28fkTEReXeCGTwdL( zWt(M$Z)?`B zPmfT=ql14pW@MS31H>Ri63|wo0#cTyl@w|aki{p_abKjU6>0{xGm4;;_%x}rivVQ% zo&r-Mvx9W#a>kt&0gz?K`JPC&^IWskdCzxcEnwq1zte zG>@&`1&(c}@M`MShd^aYT-d2vZETweQW=s+#9QvwM%&HU{E{#DRUw-_e_o6jI2beG z!)c~#%e@_Ry2P#pP-VnE(7Sy*I2;dic$t08CJ9ZZQj!C~!HLBLGk*Q3odhImi|@e% zOzxwiV{0|mGK32qnYT&}g=8DOd)jH^2%ma&eD?GI5<`a!CraYty{{#%oB=|($&8xE z)mQu>KJtlA#h^jMU`X}{R-P=DH9lsF;;tJC+fz?J&p!Ei@xJ%IJN6$nBJpec#PdIr zWJPb4EW=i%xgQPt_;;KThaGV!Yoi~F`|i0vF8=Yw`KsZ2yLIaV9c&}cy<0LFGcxmh z+bot+>H)M`JG@UTK)6nsTXz{i1y>hnp+) zAwQl7&)Fnw-tUIFM$s4yfpgRRa@kMqsR3wG7{Z8El6`8JIi0p|mD2(9Uc> zl({*D(DQk5ln8Doy29;lv;k>x*)>~rb+^NyFi;4luaH-x{F$0b-w^I*f4Snv+8S#@}TpH)R^PTi1 zsG!U}SoP%C=H3_7hTnD+c%8jyaoqpt6VVxK-r7|w*|{_mp8y4xeq2~9lSeVe`If(^ z99Tx_cNEjzU>srScE=Rzl$*0yc{02{eGq_aJC4nRhaCWoH;qevcTHUMy)Q>U=v986 zlO@U&9y?R~?M-M)@GBLA%^-3<@XnmMAf|Ep?TQunb#2#*Tolb#t(p_Tw{Hw3VB4U< z{i64NJ)#xwWj|!urBrFe^7OfBO&dS)iBB+@+8p0H|0h@p56K;7)dWr%kol>ktm7Bw zKFd`8$fq|FF*qlu4lH}%aH8u3)5(+LRC(tZ&i<&$5zBKDY+jv?^$Rg?$+L@zAr!|ra8g#bSQZ6KOO}(~ z%~-tGuV0U`hzVNTHZ^yH4^rx_siJW~8aJ*4K^k@BNrUVAj7M2xw$&bvcY_G%Y zheov(ji(FiI8&!g!}QgjQ@D~)bUHw*fev*NOezT6%fT*D@XtouSZBkM zvIykM|EUDnK)0nR*d-eogv`axQRs_h_clvpGD)@6fYAOb$B&ARdtYUK1%94Wm-lU74o=!3ytd1C?BFyBAs~$jVT^yR2&-{y zQXw&<^OwK;#Ta|op)hLHJYdS%i74S0#iS$9I<&^CuevIJh=5zhHYxWsI~ZJ7HBV6t zRAO2t;}|kx6a%hbOrN_rBPRCk-Bm78!@2nj?)`3@=#qrn0Xd4btqtq8#)GUE_wCb{ zWeTD+!d$Y$vrYv8iX@ChVxIKU3pi`_$R!5Lt=9T&lkZ4V?V!Ic^wR|5!MmK)w_iU7 zJvb(d&ok`Y^(PyVP~T_vL9+?X|O3LfQ8#dA+S zg5a5&YsBlY?rcEV8qT#X+ZHto8_7}Ft-Cqv_U>FrWfGxfKDTE&u7t%Uog)40e?9`F zFjB-;G=UT-&r~uPUzAgQyF3N2gkh@ms{|Obm~G00&h>jY>&RMIGPPshx{*2Cpd_nI%g7uXIYxoRKJ_EKi9dcgCQR}Z+nKmzY|C3Z z5&OYlNJ|zj05|L6sIyLui+_4iod3&zB-2y*+ob7@4(w`iM-laQ23E^Rd)&s88MI6tq@v*2|IF}=zZ;n+cN$tB5iWnYi zIc6^Oflz@y_9Ix=!a1|zga7);_}+K^Jx@m5g#xV=u$GgG_E-{RLG1*fg0^nE z_hAAG)e!@rZOnT8wOH`_cqUw|NhhCi`>T;=p&2JDLIIBCMYd5I^;7U}$!16l0xR@E zE9L#$*vh(T^CtLXQ_f526)V?njj6BBj6s8XM-LQg2UWgZ0bWW<7_HOxFIll6ZocE* z`27_(#-qn4l?g(r_?fh5 zA2>R7Qk2(tFJ%~TSAJuehu_8OTqZffE6Hockf#hCG8E_DMX|W94hvDUCaetHxOVA+ ziSfbFO^NHi#}>aaF`cnOHAovn%~`n(wL%HTNN}q;^L{hY0Q(Q=6L;T!6Jcn-5#Rp$ zm*V0dekaBperyW7O85$VGCj)F^kak5WP`9Y@wfqDxn+?~O2qP41wkg{dunXCW|E!A zJ54eDxWz*u3nEM+T$GyEdhLuv6tK%QGEtu$QDE`g*-g<5x3exR^4znnfW_;9@?kj1 zG{wsfwknph5w>pKz;B!=^-Z82JIFPmhPdAdU59oGJQ#oqNjqkGMQcVFCIeJKDuPki zs-PMhVGb@6Sf1vx1Z-7v_rT*hnam) zbSKCOh~K5UO; z;vKi$6lcBrT$U!rFgSH!RER-Kv`2QnT~jLkrsLXUPdyWLOP0i$XPg?t1`o*gxHQlR z!bVUfHS@c)xzU3+xs>S@#+z?3CR$+@K4i>cF?#>e@!oUKiAV5)zW%Q_#`p=ukRWvc z_Fg>*A5H&mU}nM>sjACT?2&>wg|EM|d$^Y6mIN+z*5#vx!6Up|V5N{rsdV~|j*?G3 z@?b4LmWNKP-S+I3=MKmmd$SF%BM~X{9hD~NS;pjS$8n(_{t5$c9$ z&fo>28o&I?J^Kl824z0rr{#Nvtb;fI>hkO2 z#fg*RtDpOH90aeD|5x;#4dstK-;nA0I(*{eABmf9yep14isc!`Tl&tS6jc*gd9cgd z3TP*9LY>I=FJ)JgKJldm&+io0JS)jv4J?uJz7st0rxH3H z6_3hG{g0H7`YY(C7py8&{iJf@ICVr=tMyx!6AgWUs%46{?2=fzq%OuDdm_toJ2`!G znd1&2*A9N)YH7lI>u8F&wd!(iU3g(rKJ~|)`}v>ZCHn2{8`rV4yc?OwOh)E_)~Y72 zQ`GKV+hZNG)ol=#vlM4=3m49aPk;8S*?`|%`j;4U*hmluvCw%6Y7vo)hu(Bx*eJdjwA||GG28b#HB2uCkxkX#^n8~dSEN9;(@}Hfg5}_b1=G4Mw)xa_Vi_A#D zZ`mSUrYIaH^C`5|+SagbO{U%qGn*d$EnB$1R7aETv28QU2%A|_z$;fmc2GF@TN7Wv zfEY$@RBM*7R6eXrqN3}VS-HHTGa>?9i9!9zR%oa9#Z_C{qoT5oLrsLu`>spxL9y6Q zpp!N*z%39{3mmw<{OQlc(PNK7EAK&>C^Axo1j&Dzsz}RqR2h&bw>|&-OYzG~e;N1Q z`L`H4Vq{uJY^x?R;k2Jp(^mY_@3zIIjvl=S#_4CC%js%;*paa<-v6Fc;_Ney$hxdD z$w?GT%u)-2{iKqb2ORN^bmfdyi%)a>G|oExv^e_cqcJI$I2vg}2L~kyv7baYf2$#y zw`xzy^_%@I{Z-z#UjG@zZYhCRCQY8mAwl=VU;cPy!>fJz_0N9X%z;6|o@1iCPM*@@ zR1ko>RKAbC4iiYvaC3uPUzIMB-eDlpip<=xVE`fnSP>kaP#sCZEEcIjZZad&voyZjaNSt&tmgcbC!TyRo*`C% z*0{Fq-OOp4xE3hf^HY0`ujL^=hZ3k z@Le~u#OmR4W%;fRv&wb|5v>P>FTv&LEP1AaO+n>edxMmvW1VsVevwZGVa4&AI$7KflC}k869T(D~er&c~cpN8M0kjHlRp}LK zp6hSsuC0_mWHztKF`?{o3Bj>!Jtk#`PLNcW$#G|&$WImi$~=`5^I4yR$_cgB2w}1; zCzbB#(ITw{-dzu4k3SKs@alN|g%|fAPnxvq(sOsOUfoZe{Pg|LQjw#Bg`|BF9lR$! zG9@}XJx4GVN?d+yy;@fX7|b4!v;!f!1Lu%ILq^BtfBaQ^3I*Y7=YK9Pz2rx6&|$|G zp#V}PaFOGBxypb8M6BBY9qS|%%P+#zb;)fx!^yr@U^u9G&y)gQhK6>X8X1`+G6kFE z+HsX4p&!9U%;>GPMr8R6Q1U9c)A__}h&~kxI@Gpn?$+d}KxgAR$YusdyLX`dZpX(U z_P~6T&>&V60(}>JPcLzYMuxGa49j#jA@fyQ3uAVulAC9mP$`yfD8kN5pKBU2_=Q#x ziD*40<2DdkCr(^@1&{XkzWc2B;^#jXLkAAbIBH-LC0&?RCjI6gTaqX%7u>VY9gGJbvOj(*_YpevMDSCejNLHAB{vx%b_cpR zu>MY%V<$~`o?Qxcar#+jMGv+_?jbPKcKS-QaYMf|sPcdo1oiC%gPAn>wRkuAM~xbW zl0kWi=o*d+)+;m>7#sb~tc`v*zLd5SS=>xT2Bf+6+P~j`{G58~Y4OD`ewlzuFUNDw zJsp4k!(K(fS)?<08O~;Qf8-dTJegeLp6@)1qUPjPuqw=1S=O7EnHk2BvxVYF<$V=} zmW)d+QRy7TxO03-_cAMI_badh)yb7JhJKTTN*>(sqRj@!cMZA%%iGOQfe z^dkc!nNmT0tshdF0fg;NSb#gn5Wg#&RBbQWvOVol`ecMgyIW0=pmpj5-MhuN2y^WD zCkGyQAfEAE%Glsh6`#V%LD@-Bl&n%`R@^`fiR*IfZT}`e0)E@P1^)2LtJC7K$DWKu z%a^8Q)w3Y9TuI|;`Gf|cLTDEY50M?Wp~$}Q+*1hVTL`Pd7GoOBQZC={p45&C4xEs+ zC2FGr$n?lF&!u9ZbFO@*M#>J?w@miGaBgR&{MeJv640)WB}ons!+CkZ9B6?;Tr%1X za2Z!bVFdmGB;WHg1!1|B0xxN5H?wQ|7(`beD~kK6x}+N?Sl5Nv}JOfnB3BO3Uu?=YyJ$~oRBcP zOrs1@Xq(Gfd$E|5S-r9+w-eF_DkUmO=1Cb;6Wa1TqXtX-I^oOz^qp}sCZBK1(zD6Q zw-!AGx~GR$es+#$cfaMN2RWvqA>BE#Y)@UnC5)C^EFty%v~4Z04XHsnxR6_ZFm2Q;kR<3msks*f@+gzS&*ZGm zbM7}om0NHyV#*zZhV36$pdftVE8mW9eea_9`9;5q!;c;~rRTCWCgIGgTTU zQq)8xUd^2noej1cJEK|(NE0#7QfUB5c5+4nqkc6h5iYhwy2CKFT#%?1mCt}#%}-;U zL}`85&Kd*F`eb4xw}MD`T1oN__3lDT-i@XYdbkH+Lmb9E$gPGhC2(#1DhVnZDl*oQ z8aKkjWPQR~1{RU#5E3c~dI8&J_t3-!~N_{@!Y>JzWL4nLkx8+Bb1{O%^D6|vKAyi_W7(1w@y9=25yu{TOdNm0(FBX(#5jNuR@ING-#LD*U5j4?bS-+T7}GyQn}s)uTKtU%;9*4?g5<96}m!Gx2%&2!8 zQqzJhIV(s^W`4Va`)W%J5Hz%w9SADK5Of!U0WA6s8Xmv@^>5;fU;k=+{aas(U;g}8 zG3JQTn1nl|IVGKdpmrOqQ=<(|lQWG;;ZQSSsyt}wFNazn$no|UjIv%+X5g+FwZjDF za>TA?#bZ-#OGsVEk$AI1xwZrRt(jZ|ClgFzR3c1i?olgCuYEfi6I&_>AbbyI*438(9uh?y(S^y_n+D$-I_#2=7d?|KuKf3sX(CJp$Mq}>_Jcqqt|H>AwvtE zJF8T)RB=i_3!YD6E%U-3{~-FR7yx5BVcKuNU74pulI_q*Z05{4gaW=YF1_rE7}~oV zN}Q%(Oo9-&^||dPPZFbk@gZ(C4<oyYM>`3#DWf^}zN zbO@gUtAgbX_5DBm5cdsj23`zXs=){*X5WPC@ul?Ltq9D@zH_Pt;n?vtEBz~?ggZqj(8Jl<0Ygs0Rp*(Z%M`~#P7 z3loJkE-v$OBkw6GNsaH(Q>8|Mr~%>~ogH;VZpWB(ysTsSa_!3Hv9{!ncYf@=IPH{^ zjoRPjMG(b;r7PmzhaP3jW6{8Y z(ZE}a=FI|OoW9tqBXm(5$Q^(3F%<)sKNU(AEKG%-%7j8RxU`%3;H`U_3q7!7O~7tM z-Wt{cOo3+_$x=wyuHBFm{1D!}yZ4X3CEwSkPK}v38Mdz9#!|#Qwzn>VM{31%39LIg zsa`q?Fcbw@?O2#^p~j!l&#aVi}diLl?TSl*B~`>}lr{~SlW<2cD3ci`av@6z}G&%Vz&N3sdzUh=K2;)2Vr;u$kwJechc zgDJIVCZGUTaN5|T>}yZcD1%HbNWmmxvqMA-pQ_^&u$HGLr^t5Z?r(*jYoRIve*CRs zP!Xu+dhex{XD2XdW$wozB1c<#=K_m!-&2^VJ?iyv|TG`)tCw>;1p?Hny^zlZCt2 zxRuKlnaW_X(%iPlJIj_g#`nMfgZS3J|0vGt*9!{@`|2@&g3=@&%N0Lm@D~mF)XCy( zl%`ue3m@ zh&yHu!J}reJLaipo{bHgx8+HS-MV1*r{)v3m!#q;E!rJ&ivLP~qS6+ZRsL^_FOanr8NoSE=2em-wa#lVK1fM&Nf83kAug_jJC!TGEyr22abxV0 zYDVkCPC@8Bg`e-Fup+;T0f$v2Ri@Gm5DHOKPaJg}p81P+OpfjIq{t!c^x_+DvwdCT!`J53pZ5jyJ9o#W!MZmc7!<_QjiTDxgo>_gCZ z1*c{%mK@&W9ZQpo8gQ%&6WHB5x28N$L6SeF6CjG3hp>72sdeiVsKwa29h>4pJophO zMTlc108iq@$(Y~5sg>BtsfPqA`^;}WmT4XZyKs4JKF5U?Q7t_xVk!eBEp^H?%aF!g zPEfAo1QtA5PMPo;ikp}V(l3g~*`r1gn`LioT(>q3v8?3IqAoo-)T(2rssbMm! zc(vsK!amiOS+RnTv(?B&_etzr*|@4p^FBY+dfS48dYJqEy=qTrMYzrmI_sSH)<6DR zeEM^rj6eJQSK~Wh*9QTU809G7F=M1)SAc4%Py>^}OMsqTAQ4ov{USIejsm;L_ui31 z1Tmt+Dujs~pBcAWfqjrQNd=8-Id+1MAX*wUb2&q^(>kFD>3<;MIjFtw-~`LrK`I`_ z&grrNCMO7@E&EjyM-W3wEb=<%2ib6rV^O_dUy zYge6_2_0bzkZloe%RE5adiUYvHr9FtPwRp(3ae%DpW3l}u=c)a(Gs>Q{v;lH_+dr1da+lWJ?Tpq#JT5PmP%2d zzCGfehn`F)o{Pr}<2~9XYvEl>w1_JCyD5>O)QMU6o$rcAA9;)rs&B=iY&U0GG;n^$ zR%pof@rHT*vUT9nZKT~W-L55A&|P;dinqV}1B6{ZCkIMeeax9$j+bbcRv-6~cfo0P z`;HwfvE0iHW)?Gv*TuQ#oSmj>;VQH4QkTC=s-SMk!m4M#?z_3w$uw)(#CxKd-@SYE z&CdlFTo||Ac3XV)E4Sm}zJkx3I8%H|8o>;guy{ zW^VCE6l6JxfNIQ?R?VC}mvdm2q?6%cw*G3e&R|f?hgx@Jyf_JiPx?vpSr|$B)lt=* zQo<^q(Nd}~^jQiuXi**|FY}(uYs`mXMsg!dQ~Z|XFATD>(Na(K!0!Socs?B45azLI zW*luh0&4;5?370@2vB(=f#i~(I+gpfROWJyzuHi@3fW=8ZtvwBj)QMxV#+;}Y_)s3G1n3uMP&RqA@1>Jp`pT89@CtFQ0O?ZzK3onLD(_jF zRsqMY6EFF?->(Xq`?dD>-D@DrqXg)@vL6XfY7)Dj}(CP_D97 z`Bujmv(Ho@ROXDcG3LT?L}u+A^XJdYB?V#gFt0A%d!roGwd=HNF9NMOy~=XH`U|{O z25-?4PC>kmLbd+O4zU~3xrgT`*}vPaBm1!f;fCqr7zl2U6Uxxx{ofuS_(n2lA$2M)AwWM>^bq%pWew) zu+K(4aH?z^p+8)oFNCU<0L363$~0dAr85!AkkDkZbagQn@K6TK&%|dP%=y_zAH*qe zFv~|HX^X)-j>pgMc{sX%{6jHpaL*)u=N>Itm}s=j(~@|tmHpPY-4c^0y%5)4cMZE< zRudI)I3C0t7UYYGV25L^0Ny*wa#Uybsk`+0$bEOl#g|_jS6}r8tOVVeA+T(c0~=+> zI*=F+IP?P;8}07gK31(<9gQm+W6YS*@%pP?7w4QkvIr_`qt2|Y3EtBFrut87#Bcs# zF}6a)0#2r+EADDS?B1nkbRX9<&L4L{;&K-ueYX;nX8rp0v2ej6&ZU^f_xxD2U}1T= z_O~a_xezm#LyAI-O_Os9X>05+Sf-sCN>Y>J__ zn^Seo6aFhmJaRZKR4_`JV=_F(@%l|$hq%dn z%j$9*m0GMFOTSII=It}D^KT8-+V!vdDsPmRc8yofU( zH(3ton*vd5K_-xy^ue>#5g3aK2hRprw|aRz_V^>QdG#`mkRHf*#KH;>(uvibURhN( z0vw~1_rN*MZQ^?PKR)UCxcS=gISeYRsr6wgu8mP?vq0|OsttK<--CyR%h$vUFT6zD z!{SF}gMZq{&;$C9N!c@nJg+VV9h9y!UEpUNYa)3QNHbDQ-w8^9mbS(85h9F zz>ZzpnCZ{u#Nb_Yo zhPojHI*SIo&fA7oAKAwYkC|#G2(Dpd|MU)~e-5TvtviO1P$ zM`rH|F@>SqjZ{wD_G2}9@*ptF?Cb!ym!wre1p>m8I2DdUq?z8|uGLt!W|d+waO(|Q zQ}`z#`+l<`3hWLfJ`TV{GIgt=NkmC*a^NI3ED#W{u?!ppsX$2(T>D}!Gk^!9O`SZc zQsX@b43QmyNx~3DVN+Xo7elry{TbB6QEX5k3?Nl-ERFC!Wp`z!wPgN+cy7W3W&mAd z00Dy9@}9dGG*`?9I?vHxb zg_EQO%9`x^-*KwOkHrd?Rmq%O;^|Aj`WZLo+_>>gH)8!V*vq!ut+9UH`eZwO&a-jxpC#(+WiyDvUC)o!eCK^in@P4Iec&uDym6FvpA`+G9fu9x|Aye?u_Q zch4x1HIWO9&b$hoj)Fo0Wh^FaDT$lQ&d|Wr&xqz`Q|{&rzv0TUD792$Z~dknF?IS3 zgzF0&&AuDFb|>U6TmHyHZ{_&09`j2l3NXi)&V2j#?}90E4xiOBXp9Eagcqm8_$#ltUSH?xTQTopQ6H6%sfoa2*-FW>! z%WkbQ7VJ5*!5xO0Eund#9&TJ(wf9>y%)G=uA;JjCqj;b$P z;H&nU*pTL&z?!O@qRH~B?SLbP4`Yis@WL|yszt_f>AOzCwi5BzcWjfqPOFjE7VOxu zUvnuytAOP|n<{zo^TZ1X@jVqR^D7q|7YcpN{1vYiugWMb9pXI|6Y^W%DfXjFLpf2- zz3BzVt!a;KvRuoe=Gr>A6}RI?l0RDf0bUFN01b0#i$HSAh!NBjP>KB(dA$VQGBCK% z^kdus+L&6C4sdPJum(2tVw>Z?#s@$4v3U18-<|8MJDDMQh|NhY2q35}4lOoRgxcYV zuWX>mwL>(?tJ!HO5V`3c4O9v^30MY|GiYE^OSG)i#z0a!deA1o%JS8g%leFj0#?-4 z_;xlTk~PZ+M_JdA`LUkltke5k>)&7pstHXy?%Eqazx)39_#eKHP|G;XFkmJ2-<(Pw2l#pCjl~Dy z-uM#h@xT1VUC}UXBq4TLdCn!8mL>5{`47W&nV}y{=V1K!2j7mH-}aukAe*6h?2K&s(sVu&gW6lHkd0!-fw>=_zY_GOP+mEg|^bUBj|% z3qsaei686ZR>I~C#LroShece$41*mrZvC`vJ6I;s@oL42<@s5(m}89R%q6^e5in=M zSZDZic7Eubl)fg^m3>?Lw$AMJ8VsfPYc$|Po@(vjagHsICqJ+k1>o1D(a=ak!%!5x zhB$BBc`>|USo9k>AcHh@V;#8%{veQLQ*u7%&$L!ri9h%l*0{=+@HM@`V{mo)y((wP zRF!%9-4+FKnY3LGXt1rokp%W-A1&R9_e∨ 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⋘ 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 z zG!M3Q8xImR|0EjYNuUy#b_1n@l=%s{lD|w#!NB(RUX_u>m3_!Ea69DkRcqsoLx(cx zL(pWBvmS9m++#!OcnS^H4je#VJn?6lJDI>G^CNMKcFuml9n6eE0j`7oYmn zr{nZfPR$e9JejQSys2hOfzFhr42nowgY9$zgYf646Tp`dNPhr9u@^fM)~s0>zrN*H zan+Sq#qi-HX+PbW0xObcA$+b>*g;MhU8CE}VD+2Z?&WCdnK(Ck88#5(u+^{@&@?zR z-O)w+<@h%V%ZvQU`qCKLj>e$_H#YQ$bH=?S&K`GeyzaU;$0z^tGdL}IHtxCSp7`x= z?h0)0N?;~1a`+Hv;!rLJC2h!fbEGO!>?0)rTh&%lhVPw0*jB$ckX#rulxD~r3k&px z>FY9_sgHcb2PQdQ_a2od3IbR$oZ7_VgDSp986VRd0zJ z6>i30uMRK0{EE2d)vso`>m@N_k8qHVR_I+w zv!Cs&dIhZ8-etYI&^n{SzWS=GSq9w|Z^JnA+zBt?J-jQw!6Ttl*XT1{=20-X0}X)!mdB5) zDV1lY7WP09yi~hupI|%KZVC?aWResdqA-OBm(t;z8bPT>q%C5jH1u4u%>e%BMU#MZ6nQkd{Jct%vvCD$-#Ip@ zU8sW^a_Q7E?B6+&W1?bSQ>V>{m%L>lh5MJI&lSvTsGg1eO6pLK3@K=H^w%s34VLev(aZ<&!jU2 zqJs>`o|MXtpiOUj)0>oVo5NAU0oKG>Bo*9gBN_4qU^0A^2LM;H(J{^Hg)?LQylF9@ zu^0O^u|L2F>E7Qy7!5tHiBm=(t%_s@dYhtdNY`&&d+9x(U%dOXpT@b);JE8sKZ-F} z(Y8HE2ivC_8Afi$Ag&$4f=g$pyGJu%+?1T{E;8zZOt$N}Ob2q0crqU4>27)G;J$I^ zZNH5xuX+WC@m$S0*c0i%J5V#?rj&KsloBNlFsyVdj?19JGg^UMdxOJxdRT5JWAtOy zB|RzH!5n;?ouz=m$w+nrA+PNhn6D+_ON`mUsZOdUYYxr(Bvc4XqB110^IpqZ3ETW6 zKEL-H&@Gl@^rZ?t2TJm94-SlFmNG5jlE(Biu>%$Sg2f9nUxg1*r|*gVM_l-+123t! z1B1u@x`lH25>9UX@)zTV8$J|$d-X=Z12=rvZFU-h!Q@;?O26H9Zo3(S@~RD6aqjZ# zc<|oe<>4vyGENpy7nfHPTdti-jmv&)7`kWYyYtpx#M$Rx#6W*8GoYRb2ukA8ut0L5 zUBL$JB>s`kIm2KT-o?KCy&uQf90mRI%ZnP|4Zo@92Vc^jC zcY_ zp9AyOZpds~U@c|U5SFVGnx+&CuDSO0@$tX>7$={OLx^?_-Mlfd6Ep`8{uT5V+Ak9X zp)yGS+~t7WHtmQmd(|~Dch+n?=k-n=lFOmim;b89>&c0!)!4{O_T#Y4Zw`p^!5nzx z6U1@i;h5oRiE6Uk1>lxk`E}uP<*#t)sOK=uq#oGiU&Y?3(1m3h3hd>+0g6xum zwHF`qRdMTm4&LxjVU?$=$ z)tY${s%2=Lo0B<~dk(OKu!MuaUVRPQ6bBB*8|&lvGno`U`wz`?EIP7_fLxNy4$A}i z=S09(uVJymg$nB0QlDBdXnsW`#|X-APoLR~k?@M1P4W59e}b0m)-=i0nLnK~6-L14n&I+gi{mR_{c3y!ChTdHE|sXB za|V)aN*R`8xrY%FYzw9E#Vgmx&wg=peDPnu%NDEw*@=>&QYYio!TOZom9iNR?HuAo zyf&bYeg4^}ICghlT=j~V(|#k9@I50QM_rIAaRJ1WD(%pR0IZWIonf6mWA?n5^4#>e z;JkC<6<1z?qoYxvqLfGW6j$n70gxAQTZh(g*6Yjlw_~q$Jrq)`ht=xV)HBXM_a*t; z0}Xx@HMh$;FHD~vPd@o%Jdf{&7qA*{32o7m3`;t9ZB}7QL%CG{gO?PT?FJN4V56K; zTH-77$xZ+s`QWdF)-|c$@g41x8JORRLcxV)lz%18i$p$A2F>qGQ>SYNs`;z!U1oJ? z20FR5tP^eDK6gBjflwsJOtk5 z76if}mSfv63)LoRFWUl_&YBswGFdr%V0ZLjo1zmEjlU}rt;%wswCoDLypKFX#*+s> z@bS;a$3ODn7&T%D^|SL7UXg>Lg;vR$(!SE+8}&+b^+c6;caE7l8`CHYS6Bh#HHU=t5@N)s(oC4{cAJ+ z?Z5qPEMu2fuOTDJ5y6BwOed>0CIbpAtz&WAC4m+^`KAs9t^%v?vb`NoSh{kXq)YgV zInDU5zW&8r3f@FpJomypvP6T8ty&X1yyP#dmM_okln8d7sbCO+iR7b%gT8(H=1VHS z`A`R}{xhzU91Mz|4I@J~lIv$(dSFn9|L@f=JQeLa_lu4LM@65`J!0dWRdL5p9*(AW zzJh(Vjhr6ryTJy}$ZW3`F9|oeT`R(m{#^#Lu#& zUdqo830wIiqC~1_^`8ahKi+AB;Oz3iF1FEtjP|tj&`~4eiH9CU3OpQ_V#xO#-T+sw zUd>>O-)ba2)8@Jw*-GpVi0vsmRoIjzF(-{?hbj%E+Rb%0)jxKkR87$lyc(1QQ)(rx zYjFl;1ViR!sXP~+BT*P1MnZWqN`(t?Ac0%Hop0anLosOd(D=mXz7${h^p3dbqKl#j zTaCIfFs2p*^|hA8D^{&!E%Dy?(l@^s{Sji)>!Z>z%+uWk5~Fyo86PhY1R6NncyWB- zh8yC2@BaYqjGJ;Mrhrrj1+Rkh6y-8My^PJ7yC}ZFqN#9Cn(|~j{m+7RkZP?d&{H3@MLc!J|NDrc zqw;qF>$~rL@B6Uc-V{rgEQ|#U=f)Q+GNDL~@*wjq9 zyyCTR{=jN8z$~d&GS#GdE}Wn>THXZQEM=JTO(y_`pX#9;cpuD%9C;uasRsmq^aw z%i8$)=Uo&hjUAps1qyAIW>&E6A`DxUhHRY;MB5zKY z^VSzyai@xWRU8XrmoDtUfS}A@UM(Ft@Y^=Ijgj1}qnZZ!uRAkLtFHomL8wJJ0ID=P z)IZEJX65H{a`5TU?*`Tue~PUZZiW#IM$ieIM7kVN!7I?MLV4Tr!uB_6)`v0yuykEs z3#a1(f9zawn6_E8Vp)9hhu?{@XPv`D_)u)v!ji({)8m|x0~p8HhRF_?ooLNB;3Tjc zf+?siPCr_Tgqm7~n@>Oe2A_C6pAC*n5K@NKODQMT& z18oI+Y#F2uGiVMQb8<|2?3pCCv(7#zx3tWiy8sV-ec1JYm_?||k$?_C6k44oaWJDz z4FCj^YI_Px=@)qHJd$|A3PcXl4iFMstv$%Pkbg?KR8YY}r$uEpLPbRrNRseWsk&yC z@Z_JWEl8)7+KyRM9}KcS_?Ewj3t#=RIQNWG^GIdO)53V=%9Zh(N1u#+ix$PmQ^z1U z;^Q2LG(~7(0f4$u)0B3FRg}6;Su?@wUiSvJ=%LOBXYv^dQQRugDk0l2Ijcr!@c7Wl zPd^j?`JX?IsWWHC@Lo-6Bz6cU;K1e}mdwt2RH1HDA8UNq-|DM4*VjWMLc*+R&&I+f zi`g4|NsJtM68O=;44Q($sOPc*mXRu4Fno~C-nDzrq}eB)oWk1fthn$c=f_1Cp2u17 zgL3J_)|Tnypi&q5Kfa1d@R=Zit4c^PTg!3wHK6Z+{9QER5(Lm)@rjRZ!aiX`TDH$% z8DiS=Q}EAmKdyt1c7W7_HRulLAP{5g*u?jJ}J~%}bA#-Y=d%H*UZ4_Sn95Woir3jwxrTM*~}W zVu9Wq>#tVvFtlXfHvERIh%b5Rgc!?KUMD*?xP4P@_+lZKsrYOkQMh(@mYafp^~+o1 zD}Q@q3}Yvg%OrUS7%lFhMxG{{MtksDZ7Ag7W%8m5orxrEYdzKWX@IEXF0Vc-C}^9I z#)|fXLX_1chqk0_1w@i(9u9QIsd-dVnDw$w8Ho$e$rXJD7Hcfe6F;sBmvl5rT{ z744wSS~#%a1SP?$0ZM52F!Y@326gVz@IpiTb{w6ja?H8D%pC>{0j9v9h@7p;V8dGW znhgs9uxAVye^u=7Gcpb^gWbCOVDug}ge8Vo#n{oDriCET4udkaZ2S3XT`$X$&@|X+ zkI~?Y84Kb+KL6!dH)nZ_9*U|B_1h7Q9aBy3ypG5^l(3_fI#ftB6YJz4WIPFge{99f zYYyV5R1TtQ*}oq`g`qS+yen6%M@2a{E@ald7GDUDJTWOoqN0;%9F%Mj2hjaAwkkC9 zl;EAYwMC*VaE?6XjzDBau73ft0)Von4aj=QXG+pvk=NTCcN1DI-2+bxRm^LRJEV8 zG)}_~Vf^?D(D)RU>;VJ;u#^nJV$!=^b}b(G@AfTEwcCa(VqHF8`qE3-{x|`5rD(m# zy%rKI^Y_CeEF$Z_6G|JG6xBU5C8^WFPS{$9gBjcgBZKIJ{S`+lAdR|RWE(3voib}ex`>#U2f@zB|VH6`ZXO=hO!k+`A zv|g3~>UUL}(mwV{RpV+lbV9aw*QTR0YV~y91uuyUCY&E*#*B&KBZhH2_emUfH8f|N zGHdyQK~NNWa*!4dXsyPSBvH)^n%~*(b*OKP)}(&h`g%-7^Ar5Z*Zi{H(7a*umhCYc z+&}p6qqt~a!jfA<&W5FH2#z#DOo_H50<(gV{nWvvBbtuw+qQ6M)bsJc-M125SGfAb zCcJuPP4j@@y~uWyZyzW<%kZz#OmJm^bKa&#)E6D{KOp$vClO&c066~fqY2<*cejOkyN{|%wVg445cjJ@7lFB)~;F>ZJUNh-|?44n<1mn zhc}_l*b{w542svi;}T{A1ET@!&o<2T4k7F-^@Hc6F^SO?r#48~E9WnbpZ?>&#*%xV z3y+09sFaLQlE5)2(Fzb5d9Fr<7XN*l|@^SjSV%T1_{ZA=L%nJ^tK ziH+J7LprJg&ax8|Cugf5!G9t{0Zd805WGY{*-Fwf8i>H)HyQh8TMNtz&D|R{U5n>m{D2 zQRaE$*7F3R)b|7*s#oHZjPjp27sl;a**4<1}#!#pgbR#GP1^yA|%@i!X``C!809hCrW5>6Ans*(%3@TNo8NnyXp=UkTPPtC%om z%N&>QUfOU6&W$#+9I+n3a2?kA%U7(#E@TDQRk3>Anpm}JRjkAl-~aESLzg(`%+oQz z8jyAr!$%CylP-th467GjJypH-V7=BYvNaa7p8~k*YVl#473P?P*<2+DK10D*Y1=vv z`AHq>+Z1@}hx%huab040nNMVHpEJIL` zeNRVgdSvb2uXn87*e1UC<-d#fzwd3)zeiJ{U6CUKN#MG=)NF8^RS@-Q2O8387|Z_j zXTOU7{O2#m$dgWELbp5D)H~;ZPu<`j_D2ca)k|^sY&vSGQq(R8X>=Ex=Nq2%?}_rsKJz<=0HsTDIACg8pJq0xAYKsXlbvc z8SYcdL;S)!T{ZyT1D4@{Ae4Mf`LF~D}Wn>gSyRA zsNafVbPvt;5iEx#`T~7WW4g7?*ew>gD02oXD-?r z-~P+*#F-q}wSV`T7}>vb?AW>?o}Kz^oIGgo!A@Ozx9`x<@ynBL`}e>3eZoP)!Ji|; zCtUkqU78x-+2+uG$86LN48{(?G>(nnPh++s9N4%=7-YA_Cf4rT_UIRV&bu-?4;q6? zqcPSYbsuDV;oIMTHCtpxMrYE3Et4doZIr|lb2mTPcj@VR?p+YScdjT;eCI!AX7Q0fBHa?So$Ma)~UfEm?7oDrdofZ=ULFj$R^gFfNiPI?4~RA84ns&=%V z{-^|@u!M5o^4E`5gyxsFVM}cBW(T!ns_xv&fH~@vadGCjv)RFc>W=j^mq84|npf)T zjLsmwlY#Ti8O~NzsNGNxpMUAK>+r2<`EOZ&M`qKhs%Uk20 zC{2m$-V;t*%TZml-lm-#kfhtzc(6&5@!Ou&7Y9uHZ0SWc-i%p-%rSpF+Q0v} z0I$k{vcyiIgIlj=QSt*mXw$HpQ|p#3U4etK$?P(j!wIIFF)G8K3w1HRf_VlKN`w66 zk+d|NdF9R`Xl?7ZP1w7zt?`k2VQTth=uvo1<{~CqW20nQ@-3fg+HLhE>Dg3HMC5~q z5xj?tI5oB$?iBBR)9d0r?|OTjF?J-ovq~y?iJ%#>?{VFY06hz%!@C}OFuwVdpT*Xx zPsE6^r^l`xOdc2%#fzF%`-#lIf&SD1O+gPlJMP{IJuzeMM*DVUIkOEDj~!b#b9^v1 zNmRZqe5dT>(oV{mH|4>*r4eaa>wjs@0nzW;Cm0e=$}+93B8n9foxvYwLTP_@uuhzj zXAuZl zIJtZR6#5SFEExI7qD6~i%&1Xu=2_$DOIzZe2kwilY-#Nc&uoKXym?Xq%7s>-7X=0B zq;6lY<(@in?>JDu^I9L)#fQ|s3cnMrHV8UxsYfUJ-JE4>;_8pTJzoCKw=!nomj~2n z@V=L}{LPPEh(~^UUz|M(+mOvmV@SWom_Os`Q3_aAop*LjQ{$D2E_Ki>de&OKy z>vf}dXwW&YdTZCl#-F!q1ICUVVFiGOp>YzSAgcUBGO_U>K%Wgew{M9}YnDaZ-e?fU zy)+sJoDqjQc8i^d@vaE-deggK6Bk@ID!MqpA7EBYLG31JI_)dTkGW*Rw3|N9x`WNYd$p;5R_va>ZMq`?vi52F%y?b88M z4T#1m8e6W%kNI2Q@eT}(dc)8C!KbID!k9gto;@bQ=m);YX*nwBpvD>So;>UGMAWKsnC@^TXf zTJz@4!%xBUcs863Z{r{+`jn1?ASPgkPI7<}92q#jlu$}tBn?lGJa}*)&TbZlR1Yl|J|~SGQ{Os*e8+)CVb8{VqiuE zZ9C=C5%qIW?aC5}gZF~j&qbe8#>e>6PiA7W7fbhbancZc-Y^SQuM0pq=o zc-sY@OJB`|fCi_PAdkcB~+%B&Cqv89o`AlyT123Jaxe3jAj47zob! zHP?waMY~KIX;1*wEYk^y@!1Xj5n+ha_`p5Jy< zqD%Y6cxLi^))kv#$mo92iHf%;Yqyul9CF)X5velYP8=37>YTHq$LS;DsoNfa;rB=* zNRK2=$w^FSgBB#)5TMtW{Ji(CL1L@egAGC%*)}#BgO;7a*}Qpmff+o*_Quhu)X!k= z^m+z7XAT}XlIv6uxkTkp>C&t9PKn!wv;o0|L8e<&W7HD@6<5X;CZ$v%w6oX7JA$1a zx`?Ox%V2s5SNwKl5H?P&M$?91AKupr$)EzmC%d!t-MhANZp98H{OxJfsi#Qebb_FY zk&rGmRSzD*&FmabWE>VB_`v()6QBG@y!zEw=Q^+h`F;T1#PY!1Km1`VUbTaznl`a@ z*FH{w+(YMUVusj@*-%e9Tl+MmTZzrX>Xpl4`xcl5gKerWMKnQT&rT`+t6(b~AN<}D zr{(*JVizW2ySTr*Go5+Wl0`B5h39j|qxErawF1ZD&CpC0K1+1c0{@(uXmzZhvv~0m zb~j89kFVZ?mpHe;dQN=@+O|1RrXl}QryAn&wmDYb{Qerf*w&>HYvJBCJQDy*aH1H+w* zd4uKv06+jqL_t(8(xrWi>|yNcFw6GUp7&F(RSFXt|fK z%5N0VVCziXQj5Ud7GBuIB&jLpyf7u&_v#ye_xFDvpTF@_ zct?F_y!?vGncN+ShaQ=jOB;L9#6l8f0t0<$GoXMV?KvTGA|~(iR|h9XPJ9ZzN(9!m z7)dJ#sAUir&GiP+rZK)+S=IezQY9_&6L#_!N7AGGrr1Q4WeqhI3L(Z3wz|H#%t3hy z9NNp6f6|9J+PLOrSykUtGqw$l+h!&tS6p@(9#H!*u00*kOnfYQpe@k-bf-=%FQYAT zC=f<9r{b2Zyp+1u?JVro&mL--{LP3-3-TTLDES<*-@%*PG0t{Cvps*+n)tID-W6B9 z=bad*BN70+!i8eVe)4?c@kKH3f!Un;*d-3{;zZu|`(qt~Yj-9+U6@ERj#63mOh@Ld zocru;6?9w*n0eFck5Czoj2eH{Ll|vbamb~G!_{Wp@-1f>IUA?C*|=G2;OE+gL378h z&8VK&v4;!G>XR>whLg^Y_Be>yPa~{_m|yYg332)5XCk>$*-CA+9}qD|NbP}qLq>B@ ziX+T;;K}&@$G#W?d$RKZtI&N&y6uz2pnB(V!0A+77}#YY9(yR>=YH@_L@*m!<`V5(5Zb%{ir?Eo)!rt>ejEKWW3 z%-oMGMLClJh?2_bBki64$UbL*Fnjkh`+gq|iQLZBr%&%V{fyHvemsjMhv5vKIGU-- zE$g4;P~~aM9UEF|bo7@K#XUMkd3v$*CyM(=zXR_Dqt##Qe_Z17rgam^qe|dgerQQ$ zPWId5f}{TlLff1|o#4Z_sFN4imz@zS9PD5QyN6|=bQ%ONYX{sTMxDy`@;>k! zY;S;lAIk@OVcQ29Ir)@6-N?+mD_V`V4C?z(^&f^$?Zf^G{!V=v6yZV6zMYKpbVfR> z_~7`vfBITnd)>8cCmo}Sa|%mLQxH7%#Mi$5ZQQB<0B1m$zbuC1U~W5urDK9i2%Qlm z6$|j|gTCy7E2;Z2K@>HYZ(bw0zEQIfpGmro5|Y5EK#^(1~L_ zw?>LHcPH5{@@RRlldT-!MJBiuo#tVA+DfPy@ZO(rWvH6PWx7sm3zq_%Ji3hFWNsOg zphgb%I-f(Wtj|67J`mg1Z^G!1b6qIYZT>EA6wkeO82Gm3^J_MawIlKKwIKx$2Y)dp zeAN|Znte)M-iCJPLK&O|fvwK`m22a=kNv`j=%og zJ#kvwebM>Q_SnCEF34RMo0lw#K?D0^!%l0q>j?52SZ#0f>!*MFoi`U~%HI|-uJzl? zE^E)U>2PE3Awy`qD}mEGS<4I#a<#-~-6VjT)%dLOo^DP%;wO49b_hFHtVqOkV$XSp zF1?~N8iW^~nHPKMrGrQGXPpwl;Jys#Na0l@x<$=~x59%)V$pojneoumljHEJE%>nS z265Bz_(!AySav>hQPl*v5KnU;iVac4On9kA2H)GDs?A*{@sz?|NP{z{PXl>v@y>Tn z3>wfEhdMK01`rG7q}8bso{d3S!l~*$OQ2k5Q7Pqv3kUSnG9XbW0}x3B-%IEcrjn)B zvr5Ls)BU|+O2yNs=fBH zh(UbQ#&z+@Pv00{`pQ@04R3f|j2<-#%?K`1HP%FEvHkQTuy)Jlcyi*zSc7&!EzX9u zt766C#TehJD6po+uvXq!nYdjhZ=z)-+kZ0892Aw}F;fvGyI(uxtMcvVfA>3Egr_<7GC@t`(L58{r|13|Kwk z^qs-W0hUqsA`l#AGIR)y!9fIsGz^4iIrw-KyI?J&POpFKyW)F4`eD53^{U&q+IIg|=O($E5-Fd| zv)4PsXCiQ7ze%oA(*e)s*WA~9F!0`Ysoko0V;V66V>|eFTLibxXrtz?UKdw?>^*Vi zyWgJm(TP>s)nJHEty60-@!kb7_n{>*d??QA)-H|1+c(69)eE8r_424`g%^ZD)G+J< zh{Lm1&Yf~g0iygB`s2gWrOCGrH+7xgsY9m^Fj#a(RnGXw@I%8Ym3fu%H3xvJA5|_M zg2H63Hu^rStoN*2MbzRJx3No4W?u*hb63WObz5S<$f400FH*WVZqGWOb^#Ko-tJUI zh&CppF=*(3IFt3@7Z%NpRWp}I4}20hh$fRrL4f!bj!mD8OaQZCY@C94UlFtUeF_ph zI-uIP4(t+2cV-fvrnUv^@Ket?lNsokn1^+*oF~;)5VH+whf%VWNRzqHIHq?mws}in zIxUf~QzGWQY1BAKi2nR$UIL~z!ww|@7aN5#V-V-YwG7kSsncl_2ymuua?30A@k(Z_ zPxZv5@G@pKTQFYy&__QOU;XE=#T(xEhB)=)u_?{FRn#R0k!M;vl%018>yzL3$CKpf628*}|hSkoC;YNPV(1K=f6l zZ0D?WHVDZx)DJD!LT~kVuPtqvPZXB;D@aJ@Nma0&=$ejL=FfVLC4w@WP!O`S8{ZNR zQg^R(N#MyYTo^3xYzt>>bsD!XO_@49o_=a_ZZGt?15C0L>x?>95_eWSbA|}>pYL8I z_~j4%UL@%WU!S-nYNwVY3$mslCLd0e#ql|0n^~u-9yPq#pDO6RH&2^3o0qH6Gl`#G zEcmU}uQ`6JcQ#Jxy_Qn{%&;Y6x&xHw%+od7x*Y-|>D}om^Pz_xjoWU!BOZ9sg zR2g|U266|}y3fl(l1{--DaSfnjshndCD4`w5mznK7onbg$C}$n}2*FExn}W*#ynZQAWT7;euVjE>O` zbf)h*gLUlHSHFAR-AcFz?Z)1nTj;ObVn3SK11w8A7&`;Euk^y8c{%-h=b=vV@8A3P z_{1kZ7H6C^3V4{UQ-7&Oxbg>{?Hk=#%4^49^Sz(kidI+0NbRk#3^1y`G@_~hV<}wSr+2r53w8eLkm`2wklb`<- z3JQNlU;!3gALrx@;X_TZLY0+N=&#FCm~n!(4w_km4c6=5a6N)RznD1jiI_6!F%AwK zfsn{yNyHH`a=*;Saw~)tff_I>{+A8R$J8wF&hLIZLR$-`e+%xw0q+!eQfuINs$hVz z;~W0!L-EqLy&3*$o#+$f;b87@1r4N`H+yIN4EWJ6?98HLWv&5Ma zr@fJeNk#(ES`YJUfWTZM)2K0x4S~VI*FjTal>j9GJGLi4)&p05Q-UU*LV@{8G|ps& zTa{&NVIfJ250aPvBvyA^tX#Y(UiX%_#5e!_yYWtpEl(M9QmX#+b*>qa2sSO*C%#0T zYqL|P&x%{W`>p7XGn%p|+xDPiStsz)o|%biPM1<#v$Vy5FuN8Rjq;DdzNhadg?7q`S+zq=3L1dFh^ z@5B+cebRm;4a9)Bh=rCY-uVZMv&{-fwk8?!tc`_UD)%z;UcPKmOnl;zc#{c&96Ya6xZ7c#G-ley0^b8e)7Zb z#;dNn5<3(QN}`-nA8-Pkpt>1svE$1&^sPx#C&kuf3vw-7UZxg6&8I?vyJK`G?0Yo; z=HNF&EkM}1q9OSsd8!>y$dEVq&B>U3RNicwD@75vQIxE?$oNc7=#r@3=G8ES?{|`VD1#EBu*a zU^kRU8##`YUxJW-nrVtS=9yy^_$WL~;Kgsju?FAXr{SUP%dZ1M7^sm}?3fUQZC%wSZw_r|x~$0_VGEG{wGbpCZxm0O906nVvse zD8cl;Jo!eoc3Yf3w8!`VHfH^M*q`44L&dfY7(c;im3F2q-4OjTe(Be@i?~Rs)R}0K zK9$fI?l2XX5W2FLckD$MAmQ$aS-+SR{m1AMlEEApk|A>yx2;1WJ74gj`sO9ybCZol zA|ZD>qHAH!+8tap!fL~e`N_v0j!`F_9OKVBKelp`+U!NkIJVb4tYt=T11kiijR5bI zge67?@BX5=aBytG zq@ILFy6H^k>a38kYGuruF_~?AxD!Wfpn6!#YK0u}Y~7MBGP{JZ$`}{{(kOsS8kQZ< zOelV-umrm|ojxJsiP(7L)a zVA-;zcmRDO9(&-P*n-VM4^-`*QtKqbu4LtkCUwiAK5wG==k2qL)o=OgQ@C5sl zgP{TfQFDu`gRlm{CBXmC@Tm>hiqoZixcA-10Y^J95Z<|Eee6SXz!oBm)o|1X>nEqw z?72mC#nOfG*)M!CKL59$kFg_%!&55yOdMISLM>@iR+T2aSv&gnEIgvlWczn7{94HG zgil;LFe|vp^WocV1OlHCaQJ3C`-(=LrD>cbktgx9d_HC# zJjn}f#~hn@Z(h=g2Asv_pNLwl`G=4Z+Iho|0Hax z7Q`L5{1W_e@F3nzb2cvzqrI$fEfkn{9mG+>P`&UuzXF$OYM~YoX^%qBye{=2Zw(MT z_UIbBS@K=prBmGSg};fjFMnCu=IPr?52O(Qfy|2Ujo*)V%yaV$$qYd5B8iAxJj>-wpyb9CA>BDh^t*2<5%L|4+VPLhR{sIHvssi`kRLl>SVoVHA!G$nfX?H%LK zpO7$2eEPW<*soU-wzCSg^By~_XSA9aRsTDXNx%}M4dbBhJBdY&f#2*LrNb56YGk7T zQ3um0RG6I$D^-Mo5|T72n+0= zcdL@+%lxx`B7k4g9^fX#Rhbovj<5KC^9|XZFe}UYza1>=*zn&fCp)G&R5^hg>AKd! zh%dBV1*4{(b(hE(jg2BK2$M@qSAN`By#S($r3{!L4pJ_72M8Ts~S4`qoR{)r74_Y9xtkezovm+MFa&SNVcPiW7NZ zmP`H3BLm-ET2Z4=<3@anE3sreNh$|ut3lqz&vA+m@+I%}2y2@*U|{MbX6D?5(YI$$ zhQK$Hcl-G5?RUnksZU4W0mI?#@HNtn{UoY+qQ208tZu1cj(M!_aqa$Pm)Zg%SZrg@Nc>0jvMc-w2p~1d+5lZ z-sNylTu<(dwR0Yh0f+ZRx)pf^ACI#DtezjN_p$oI-hPoN@ZtwEkpO zkj_|KC9D3EKpd_G`e$Jp5dC;TpQg`>8TFW$3Y4Q(v)oL_9yDhXtLY~rMftOJ5gS_&H{%LD(EpV}ST!IL`SSHKS)d0HKCXSBqB z7IswL;!*tlX+hmimA}wK1Zp?CA(6LjgV2O=))No^E~fV$7-ynB96f3byD@MmrJV(& zVX4Aqu=aT`QRhv8OA4}mgj0=zM_tP#_hIn0c=<}amo0+19ghA8mZO=O4IVN$h7TLU z$%2Dfx9y6+z@Sid_EHXIRrSsC$+v{#ao`t!t-lnQ%bU99RR;gVOY2fvvMP9~A!&Kv za#!^+nQ3z%Rjcfhnbu67IDS$z*3p$mtFOTa$?7$@lLnuQ7cIuXa8sstHl&eW{{hVA zWYlCT!>oq2%qbzWJ#?&wE)aQ-cYQsf3F}74gIr$y$Z-Mb<^9 zhF2X%bG9+RD+nYXqp!<%6_#xe2VVzM9&+H%fs(X-ch;`v)WO*xPi%L@$yIfZfrBdl zjGJziGnQGwPb+#6HR3^Sf_@uxuB5%2kP43)O#K(g7d7ToSm=OTYvC1#E_;~&=Ixs~ zhhToZ=JkJ;F1_c@og4SwaU0w55jF=7Lt9|}j3Wvi;M<8$jZ<+X4JWRuHYj|ndS4?E zpiEbUh59A%n^wWayc<{wMNpf+c0-(X-7DhtH@qJ=?}K6w8Z2#UTH2`apH8G%wr+R) zzdxTE!-n*WeVf+D{*|+1$MWZ*Yv=ZCOJye-OD?3$HV}p4ri6q!&sMmJ7yb;jKB_z& z|Cb(pQ`>zTZ<@EebLa1L>Dc~r5GF%)dUrS`cGX2dd?^;7jX~Y>3-$w;s)(grt5?;! z3+u^s(;tl9NJdTUCvO-uEXE*B-uB>}SdSsm6|Xuo2KQv0ms1@Re4vpYJyuzo&~sMD z#tv9)z9j|@=pWzz#6QH)em$d+EqQyl;nV|IM05sPkoKZc_>(Z&sF^G9)eTh2q5JU- z6_p)@)f5dVCAK3N{On~w?>BG+s>QqWY=f(>y*A$efp^FE|Lq$w?!5D|(bOEM>eJV_ zwbz1I9H=r=HRixyOR^$Jf_B?u!b_cqn%`Y7lu1~&R|!p<1lJTL^ddNDw_q7C5;>yz zW!zG4&+3*fdrWrLn>?}r{#s6{dLc09${G#LUAQ2=`OR+_qX;kvcDV#W2AE|)9<)OJ+`?)(dtgLQp-njO^s{Ix8d>_`JQ7r~W5t^%0 zw442`Ky*}X0N8(Yjpo47E3rMd=G6=0F?O-O`g<8c#vYGRZ^F zatdE{cegC_FF`~Jsn6a669b9x(N$6?=t%#uUutx=Z0QoTKF`O7Rm(DYHx8Gx-5q2c zR_k0#-bX)W{^i37|7IVx?*8CO4o(mVeL&$*Z2|3=*P=Pla4vgH(p)Jkc>-DkuWA<^ z+zc&{l$w`5RO;;jX4T8`X*<;7JyJ0E00zn*`p^f_>Z+AQK%yK|)IakrIh3n3r?8@R zysmk7pbdM7<;UlyJQpXQc4m56bge%7GB|ZYB{kMYm2Q*Hi5ptHJm?7Cm&>cfElaJ3 z()mzFwB6cP8N_>PVi7JB9O{XdTf(iEJi|Qqt62b_3W%1cQMYMbHq1OI%cWSg3L02z zci>q;dVg#HkMr;v*?U0Gc=v}tnCI?1_`rQJbJ}xxE&_}V{^hnv#|G&Q!jawuutI#f zxBU90-+A!4e&?f&T)oVRDE%X++rV_hKF?08LkKSO@hp5Dliy3;c75)?(hWd+g=v4Mv))2i8Y(|#t*+g5jXb(;t0m3yO+<5eJiJPBJyTj%=gEeqV^-;MY>D=TD2?p z!b>(O9B?{pLR#0r>+cKJgx=q?d*6}6AK?&=b3l$P9@41tks|_(VXT|j zM{5_Chfs}g+PI$e?A_5c^4#b(=Hh7AZ)_as+%49S_25xG zbEpGihMnq&4oV7V`Jhv_fAGg6uZ zy5~1!LsEVN+5jcvT!$t}@1yIFS40&h>;wlL2hKUxb zxhzYV#=K;fwpLr}=`zO|<1dYW`NuEC87B{A@GEP9X}NBs3=G&1&0&Nlw@htg-|r8< z|DSQ=Cq5AahYrDOAX_Ds>45I|V0jQTKVf%9<95(`1|U7y5fwP>z=auWl%$m~b3%y0 zy3q*yoN+K%gA->O9kfuOFth~IlyoicUgS<%pj>-<^Gmv&9HF0a%A z$sApS-M1HGUF;$Tvj=$?T7?1q`{7`w7uUWRmLl|O1PVRdA^n+u>zebJAxm#YSpC-G z3#|2<=Cs~qqWX*1`fFW^Sg-Jv-&ztRK8RlEKzabWI(h3Xt9!k9dbp2j@onsl*U8x0 z^-L7B2#gq3MJgOF_@537u6x`NqNWnR)0WV+xvtJnBNyZL5dO9Olb??Ax`^rfQ zbeWt##`iw|*hpwc+M~hh8w=;nj{6>;7+1aYVtjgF3&ndCdL@2IpSyQ_VREZR8O~f4 zN0zPK7I)zX<-rFZjP_`Nm(HKVgiU8{EYI;1Zzj@dT@k3E4f!!`Z+6~Wms%T8FOymq z<6ECDxa&?^0NO#p0Bog3G6gj=A;@E-LHm(c`H%06pTYtC)-j+i%X0U!RBT22utcOQ z@mbGJj+ejYwQ<(D9Mq=Rf$-kHl#gUP#%*acpYNhf=_e zOYLeKS8d)G|MJZz{|ZlE`s1Xov1?Cwds&ilvdd}9&>L1K z+*7v$9U8iJz>DsOC*Se!-@P7Ff}8P>oZu$VfA|j~3c^gEQLpLVv*+!sxv&%^QjUhV zWJ9N|`iG4xaTs(o)H>KX#Hj=AHdHyg_8pEU1cRm#16)1qy+-mwk!d>afD-*x>3 z9OBX^efuj+9%4yge|rZN6d!4<$UAyq6UbY=U|Ia&%l{m!9-9%PhYyGYc=SucsHD(5 zBLYIp0TP7U$!g&s;S**@Lx`}zZ#&R1Bx!FiXBMp&LRHa?skS=8cFb+@kxzd-eFNNz zm$gkWyWztIA@p##4_?w_MyjHcIKhL<28vdP?K~2T(-+BJVi6|{7&2Nrm$M{^-p(Si zJA-LLHRd_#GK%a(rZyeg1UsIR`vDJ^BL4R18h`eRE8;VM_0c%>l;PPLB(uv}L(<8h zSkjxUdsp%#ayo;Dk<9sqt_#i9OaSK3uw^g>1>;d6+zsUGKuRt09Z+X!z!4q zbLY2caq>I_@!~%H9vM4^Nn_)fVCrscPOzK6tb5Nju)!F{X{H`&owM4R-QG-EO$dMr z43qzrIZLYLteYOAJ99cWMr&I;O6H+M9L~nDz+QGF+zWmW?B`qu=(wG-%7>cuoiys1 z4elcX^-zX>KD0ni`T~Jm*1Q)EyoqZop|2sX-od&b61O(Ip2X^KQ4h*{JCll6v2oX` zWy^Bh-K1K^Pb4%A4ZKw7jrf_k2^MkqJea zE=oepPx6v-K;B8^fV)c*JsZQrfK(3TCwb^}8;cdbC{UY+!>eQHz--;LKK{=qKNoL% z+i!9J9SR4$UUoG#tmURD1UA{foCsLT+J2-rmNLiSmhapek3PASiEhlzI@%uF)~`*` zX)nLXuu>kG%b`Xa>a-$~y5*I345w2*6j@ddXObR-+hv88*-J}-yx?%1b=kLq3QVd{ zST56%m$HL_EHq!SZam}Xc{tJ<_!Q1V$m-2ocg1Vo^eTq>X2v7zlzH!uf5;Hh6uu+J z2xF(GVGtcraRFMg@dy4=nSR=IMdGPIGrUHr2%KwMq+_)`Wrd_cNvpru0Az&4u$|7%W=B7e<`0(-g{AV7FbsM^3_JlFfzGi70 z-E?mp+4fM39>T^=9QxGQ%=so*KBS|hDR5Gh118#6%0YMckzarGyPx^O^PcyC!HXAv zAS>^wi0E7tTW3Pc!gW$bP?jVrfoO z4TJQ`sE6BG3U(+4PhJqiWHRfG8KaL*eJO&N`QlSxE3CGKL`jwp?{lfPYFp3nz z`fB-bP=z#L)8^K|u5<3~qT#24npl##XZyN%^V{FWe$}($uG@ZqX?}go<7CGp3`IEc zPm`gIy&#ykwVqgm$cv%{<3qIO=2&8y#2|PZiZbIDfq)=TKuGWk0xLV0MB7SO^ zn$$dKX%Dk)=Px{;v8LvjNpJKuuX+V5EiS~2JsDRMO7=SxB=tb*z9zwEMih~S#ca$2{5*8TN| zKO7GuD8BveTi8H~IWkzGX!i2kyfe>7NtnSQPt#)3q{%dBtgxZ%$EYg>wXo}CdhsEA z*;5pr`pQqGaY)>X)4WPUmf6Aqwp}BV6H?G+Ds)7pNsv>s|apSI}+>b77#2HlCV@ zJwCgu)5Dxp0@!g6#j1_HA5?DI+En}xqZG8K#Vi{Pgp@*AMZj6>Dgg@hqNJJ|DqoF@ zg2v<%DM+V)F0O=4fBb|uEoX_V!e8==%9VM^f10U1(Q+4?d97c&29xn)B`NA|40UXZ zX`#z}t+y&G@-7rrs;|#C1Jv+TzNfJqn6Q+ptgv2H28tpHPxuU+MG>$UjFJaD`iTd5 z#rZ|@m~|kJ7)L&m_vIVS^VW$p;f6m+GvrzGMa>7Mk!faQ2koF(?%BCD{`PZUj5ojW z^-Kmw7E`Y}vdHoa2NakMSr@|&+qUnGB@BuE@JBz2R+dIKF>Iz1f2@<;S~(T8u^Mr< zu4{!?3#z7lEk(+O!ViVE?6{ece$tM;e#1!Xmd83(0X97wcgvRL=|el|m&VhsYd@~QCB%U%6{0<_LzW;?MJ>Fn9kKzaF>$;iqHn z)eBko!^wzD%9Gf13OtF@>e7#Oo}?p;5TC^A?1ljhmIN)0Mj_JVo0Er{WmKEkg^WLVRJ?+2AGf5MIq+=QnYb0uCJH?q=e=x-t+yyjoNBYkn^; zd=O}yH2BLnS21X2-L!r~Tz1vv@pm8pWL$F5GuRRFVNPnij2=7tJkSftbM8^O@Ty4GjwDj3h%+yD ziZc!ouo2X(zHHdoC1qkmFUS=(u55=*zpUl zz7wqfktl_i(8 z>0@F#Kk?U3lRnqh!xB%v(sJrwhUS(^qWnlXo3Y@m$D%g!?78up-+D_dy5dp-(9u99 zX>D$F!nRRs2TYztbg(Pp=6`x9o_y*^oPl-y$fh;XzUpD_OV|mMt(=iXjm&8}&X9_< zqyjEpyh?`vx`QtV4<4Eg2&c2YY~4@4dh7F^_dF~Ii&H=sN~<&e#dq;SYuwh++c0b? zTIfxz!5s#JD569ipHs)=ULlp6&1^bD;cDVfM2S`YbL?16jS3k=E8pFX*&dUlYC|&< zGbDl$5aN=@Hh{O`F>$6FnIL%R$axlmY4D$wq*=$t#m$QrKI1}8hMXCTKk}UzJ;$SC zA$GncOja7Pgi4rXR4c)6zUQ6qrkk#MsKd%_5>Sp4LVyl4jAh;PV@nnzJcBJZub?8B z^?&c(F=O@_z(%8psnuRvY3Pf|ONJHty60x)B~9{Uk3oj9m!^<#nVs)y(9XV<$s~M% zR5&UmZ5Sj3dv*H{xXtuQG2pE-GO!>e@7}V`st@UV@{jR;88?L;&o-`KAFo6>e&*AkiF3|8i`wSJ^Sg{m~;%ximUL*X51 zW(0?94U<;Mhc>gcU(kzt>3b+pu7`KdLta<{==FCp_oUOwfsDuZKxfvO`m&9`2Y5Mw zYsApu9N@wc%?P5=2werQW5k+p-EhdV=MHw#I6_lPiu~qqj6hhI;@L7-_vwI9I;v@c zfR(?2%A>!j5LB(RlVF{f&{SC@x=`46@7@t>SFd7Uf(PQZ@7}@|-%qi0bsO6oV^QJK z+M|-=1jqh_3q%9+$sDtO24tR|{jsXoyjf@Ih?6n+ab~%6UGoR5lMgYC$4v((hx-%Yn?CR<#A!l{bH17Af#+6R2p_I1o|mo3@dJ|&mtF9OguikoXcQ1tpN_1S*D!df}eF~ zT(PX|QF-#4&uNVy2NesQ@syLwrA^zmWvA--FT4&q7)d8?aV)v}PA0K)yg1f2HUxrH z>8uK&I83^TzU3AuabV^yYf@f@k)i8D5Y(|Pd30m%gmDgUWU&$vMT1;H{B37 z{^9S%8Rwpx3V}*YnMiLQl#z6K%KB9?IMCJ|-}=fU@x){M;*80oqjT%#=v@D3bZvPs z8oGC|Y@HKyo0%`u$ceI)+xX%*%Rn*(Ow(>;(Z%4#V?AAax9r~avF^Pa_ino6l0mV8 zZ43YG_v3Q?=hPd4Gi(*c%5T&gB?t>BD5kX`BHS1Mm7mA!S%ZjrFWt{ zs-aF3xkSW}MaSX&G~!3noV#n=_Lz$~|Jvu@05ffmAKZ3(ESf(Xp*fUZOxe{e&0Gq> zB*M~rQ8HFx1Bu>-*a?j`HZ|ed5IC-@0wGS_{YrP3wf38~vTp=h`%J6{ z4eUtiL@;-G%lM?1rBZ352YW73rq!15teDL*7_3CP3ud@1ifpX#hAT;h{-{j)9Z3z>cdAh8-( z^*tjd50t0=U-Om*j8jswyj~~Al_o4pDGyLo`5H&bD%PZU6@mg+0at%r$)}{bqD% z>K+}NHg6>cM=%Q`(LLNKtw+d>9RG(uJ?LlGj%^I-?ur>qWELLfguH$frNMJfE z__!Sp`|v=B-M$eUx}dKfE`4tE@jc9fAXxw@nJUP>WVp>tax-g+aj-hC^|Mi7|p${xfhRf($ETWC`cJg z!E$SNpPjSgghY1;Z5-6p+cacoV`talCCeAzauqphF)-I8k}7*%e|gszdDz6+-x$?0 z`X)5ew1TMR$oMiCsOdwRNxPZG(_LYf0q_uCEfNLeXa~ZU-pn9+K-12O;WICY=E*bT z1d}Uv?Ku)-*cI_@Z@)g~%>}8yexbAKj2`NNsJ36!DItRB>|V?fE7I@!%5hVA(x%c3Vv+(WkxmOY}g6o3|@QR znnV>W3IPRzrfh|arn5av{PHaIQB3ZfI(r_wV~qqyXx8M+fItyYyfq$YG7n|$Uk^Atw0A(cm6kLAeg;fx6ir+?XdA}*yV^V>8Id3Ar+PGHDMQc_ zPgU5=F=6vN`AGcf=`#^{&LWh@FN6?0JmDZNbs2}FjHSPn*#H40bnWlUNL0jt@7Rl&p6DWlXe_#Cg-C*k@)iN3zeDJ{cM<$DXIvgS3+eRpLogIh|Xu zbN86|RV$X$sW_CUH!8!F#qxu&dVrb3A1-Zl2-d^x>{uuVgvrL;j*cBQ`9ApwS*CLy zgD^{f4jm|8q=&NWta5{LKs?gBaQe<;;@-Ji`&k0pMn2EK=IXQtE`4fgJcvbi^r%Vf zyMvq)&&0Fgw7#;@Cq6IPgO_5g!&({0#HHROSRpL5n_;T3NelQV52742QlGsjGegL4 z3kShXeAdPBhIjma%(>vause}f59`*nG7WNpAFMm^tQB(0)+6zWPuJODO67nJhkR}vH00QjAu-owzb4%fq%X; zjIJQU-a#`Bcr%uQhC!S>cz91XutRBdJ@HK9+Ov62Jg{t2%$PSb#!RMyp}-^%wKS45 zMdgkfm&7@F?wnX~{@L;4dmfC&)-KYZp@caSHcOLiMM%OIA!sGlQ1euAmjqG1D1dq5 z%Dn8!K!}5w)p~?RVfcu_arnsLclC0ei>oG_8{syvZu~(a zNjqdlu~Cc=w)>c*wQb7=wzl4%CgU{G0*^!_qxSc9RA?%p22AFwWgvwHLTo5we|}f% z_nr(5v*$DK!f#I@HCoGV9g&7ZK4P|}ge-SKKz^%-UBtcLD5A*8xF%B9kDvX-E&aUf zk%}BI;(fySu}qdb9Q*d}j{ozqkHtUGP-AKz5|8{NJ6k9f|jkPP6F&XaBJk)Cslejvm z8z;GDuUKW4yqmz2CVWY=%xo8UU^98kV`k}U-m=v8$ob1p#lH?!1%BEszn2KrH{xctTgjGyfEY+>2$vA;0ox5WZ1qIoF7EOv)Zv3M=lJ51!to6*n_;O*Uwx z?r1zvybrVO`c{ zrHg*k8CQR6&E>#0SoP%GVx2NRd`B4ZQyL9J(_q4DX#oJPf@3oBKk-_4l$^=i=gcmD z(ozS0q%UhS6=U+9Fm7B-9zTw=6+CaiIYh`%IvFQubdwLM*D^Pz5M&!x#udw!vPCo7 z;v)lH0&2srBA|1aX+Oi1Za~Cbwd~jkxf8GDG0TvX1W|GdpW6aZ`h}Zt{J7Utj zGvX*X9YS2Kds!anL^xFPbi76nG_!p9!T8M0kHy&Tp`5UZC1k^jXkYtabZvcz&TkvT zdMzjh?x|9&wn-V}Eu4LznS<{Mw~9z3RomOp*4}zY+pf*G$DBD0v1wBgV1zBD6N-Pm zld5|MkDh(ah!M@-;W*$?03xM{HC$gF<@I#GBDmn7Ah?QS<8C4%%*lJ5OeE}NaBRq! z*)jTzOQL!DqUeUOw(r^(Cm3^i(|@}mF1ipc5K3}Rp^a|lP9jpn$r_b!B)Wpg(lR+j91Dd@g{t{I-Aty%-piSC(umf=|PYk zWwK(k8XAAC2am>!Uwj>t0H?%~B};Nm`)H0(rjr5V*%K~l=fuKVDKIIBK6mz_XKkZu zrRK&UfR%!XFy2RVnwmWanb@9yCcE8i^V-Tp7xAl*p+5m02E~|3(_;kVYfKkO{Cc8d z=i$~k$QZ3XGiy(Q;4!84?9Erkb4*bxlM(#O`5RP_!cXDiyagM^vII?`h+oCvPBt_x zdp}wUQs|LR&D5sPEARAbxGZDI2gX3~i3j+D@>x&C9BSGGt$Kvql_DaPyLhnRvVl%` zttFj`!KRJt^ZA>%e4BcC2}+imqY%Qf5not*zW@IF%r8E zvtc_fH=p7XUs6Ig6d+jGsb|f?-JMQuEcHJQ%h>E$GdV7N94jP7)7UYdPhAb=#7FDd z-UGjcFL}5(g*bQafN6?HKUsS7RKR3ofxkOv7R{m`xWpN+i7n!v&RM3~S?+#E4pvG! z^2s~(M>@GfpM3?GPgAd8IjK*`&Bj!UGC;k6ubSV*v5J5_KWW6JhP(IdiaqqSHgDb- zo7v5;c1^=ZVup4We^IF2HeD-0O4EcUb1A`jJYDI`_f#jEevzwjCN3Nlti_$EDGf%c z%R(bXInckR@r(y==zP{+9Lf7y0YM%OW!Y7*&Z`NYwgh#W<<8E8PO!HAL8?|caqlIM zrJNF4LjFP{8TC@TN;bF?{td9h0|IQD~5x@4(wg$71XD z);P|dC2x5zdly{yJm#w*A6Y-1^@H599Kul=Z-<%b{9#$rExBiF0Czx$zkKt~4Kara zhCQqR>fF384nFmxII-&yb`fUBVU{w3WOxi*BO_AwS{CqP`ofX?#+?QtpL0Ic;2|eG zvb(*r^O|i>GNB|sK!6Vv0w&+8WPEtxu3+DSI$O2vylj9E*nsZp1?)O!Blv1 zQFZ$3($9B@GM@=+O!83&rplSiz&dX>AUY1>2lX;(kVat-%PX(B{_2=HYgRn^_+z;p z>=?$J${4CZ((r3Gqyo#tBPJKZ1YQachZOwQ#?r9d8X0`agIaY&cQQhELq895}W~ zGNm4=3z?tKSr5WwUe-WTnRU&3(Z=y6qUY4xGuymrL%jT^*T(z*?9Wgr&n5kmhH$2G z1r8t^EIv=fJKyn#aqqqN#zZD8x;#%IWcpcKgs1Slo$Shb@Dip!|NbyGNF_dZaif&O zLwa&zpjL!|ZtTR#DQG zqkia#YVmR@q=G#sK%!K4Fn7QMZ}vN6uxn?W;Gm#%(A7AsJ2}6oQUv;VQrJ^i7r0A= z0l$`Uz-#^ZFDVCgoEihA{MK280|}7w>u;k~&?DAL%*070pj8Z0W{5At@~6`;EeSN3 zR+s!^dh(EsWD*A*q?}Aj11hcSl!@6pr|~p9`Ks`Xor)qi9Lmtuam-7;Fm3BXCBpeN zg{Lh8$^rX#jGr(m6@+2KTT(d?p2qA5I0wm-DZ3fcaVN=jv1jW>hPPRxkAiJF_UxxH zoSJ*BuuqMOfIAQlM@Cz|69{DgoSP!;NP{W@%D7|Dg!0hNiSQ-A5y{~>6{qZ|fIBUx zPE?n5bf)33gw~TLmS1~X<(d`C;-xpfg5}0jV)=>{@!&l_iIHr7-An_U${G!+4Q2My zrH`tTvn~^Fl?U=5^Y8{9{BG4LC5oibpMT>3kcv|dAMx7EghPibHm%wj7rp5PasAug z7Lymv&+x&r(5z>|UjzW{-QCdvcwMqdeN*ISa4j#mk{O#*^u2>M;wrPs7 zl!bV!7jFM9mkL7jgemVHHgv>CsKC?>ASW~GbJ;sK+eGZZPkNO1f^eZjz&TEk6+k5> z%rv+x&vUB4@sTs5W#M@-c*>&a88R|W#K$n(zWR4w7?(V2W{d)&T-r!VZjUQbX1fpJ zxjaSldiQ~jxb1VFj~{>F^D+PO`Rug-!?2uk5Cn?k%1s=yaf9IP%_wr~9=-`CqZ7_b zPys28lLP~C3oisqf>;p_!HkTjF@}HOU>gn6c`^HpIkA4@2FCYyBJd|j5vu)@5i zuhqbVRkHXbXM<`Z>Nf>|!wNPG*-+vqT=h~WhZI^-BsAfxAQTjXVIE3v6KjOT$W@oi z^o7G7z7u)u!DK^VnaHOmuw-uX$_9yV#`DtI8*#i;lnbW~mO{*QjbAGQ3NCSGkEd2J ztRrF7q;L7MXUyILgWOT0m$;-Q#uY+_Bk@e%JZ#wOa!5h>jr8pyxwZDXwQCZ-kAD0U z@y0j4iAHv84kHMsILV$>B?#`n@4k5Nd;cUJUh-f}#@f@$>5b01FH~wWm5`{yXTtRl zY1J;7v3{xU*&z8-DZj;={1NuzN4$tj%hZE#?dV{c8Z*F|3VupT5wjMa6O)6HhQ z_6Nog3SB8jJ`KQse)b*6uGtY#={Ft2n}@kr2R7i+xkF%%>ub%DR&=RESI?ZLiiIb+HBuq)`l|ww9O6dV{`&p5*bJvd8x_$#` z(THKa$&LegIAo&5aSTHerem4RS8Jk5tQ`$q!i2x_&N7KY8~-vV$>CDYi~z2*O7by> zQGr`})>&q0!C_Qs3G^k+DmV6^w5V)7?<#ud;BN8apKzMuiWoa_dXD?c$A$*8+)F1? zt3l!z9#C0Oc@QR@b*AE+Ie4=k`QD&>$GJPNRxy`#Y9&y4bvUqzPTJnqwrFQRnb*Ga z9dXeMu8X0}-)PS*s%f7R2I`bEc8qTxso2BoBN~P>fimL9-*__azkM|m@7Zt-<)?GU znrPjyBzh05h?b%72TB=5zyWuXrtOdOF-qBl)9fI3j#Ys?SGE_+aYp1l7uURGQH*h7tvyVT z<6$KBEbRNsMplBmr1f@m#RKf}^^HIOWK12`62oc0d(l2lFhS4N4>G6cWqa8umByzK zMG62KFyAx<`JScZrv51S9FmkaOMLg%(R{}G0BCOZKS)}9gPqpocAKi6V{2p@`!yIv6@St)uMBt8rr_1+$m+pn$b*hfr72mjczRu~H;_mKTLCl}He3FV2m2?BUtV z?*dLuz#Y(-b2kp7JRQfZjMzUdBtOs7gJdjsE1M*h@+quAM%E(&Q@mKAqFH?Nn9qF) z>T$CBg*ZPsXwsZX4@{+Q?CYTY=>aJ)X!cH6AGDWqF34TKqTti`Q#UrE*027S7s^W@_0#erzu3q%VoG+Ip9j17O&;)Wy$P%Q zW#e1JS1TNbQ_*%(V0Io<8gMpjO0Pl4%O;dd=h;YqDzfeEZFFu9N5}r{grNasYw-dW za3(H=M}6b?HS(wz2Gck>h`d-%!+q!I7slv$MkVOCD18~`5W++k=-dUchT zWihUkuYI=C++o)8jle1)KP_9mA)a~uA~t%vBzNPy{r0>M^|Injr@837J9Y}yfLTzzTW z#5oN!JV{YLLfKDxAsz|x4^1>sX7FPkwoA(Wj(xpx_ji`E3EMU%(4!17IMWe^XdXB16D-?$2Z9WK$Yw_@04h$v^7iy>i*k^kpZ23xB+@*o z%NDL1!gFa#7nEtJwvzSb+Mwz$>E#XLEMS9k=u-gFTjcv&#iaf?&e(*zV5&O27 z%2@^0lf6(%V-04SLr@fj;rlE({fiI$d8}QvCMT@6q38e#u!$uZ%a`H`lMV0~=zp5$ z%Ij%2;c*u~O|=u*7Wvxiu1=+9`}S?@TKNPM7&qqr847N3Cq4L^%nrVU!}%ZLP4lWa z5cl~^ou|3k-ec10)2$Cr1L&9Z$o=LKxGqssX|bUy79uK3AccoU#b+CQ|7?it5ngou zd1?Axy?lA*Hfz=#&R1X=oniYVv#&N(g+58H-{F_&0Q(f|ciTe+| z*Dfau65j99xdBc{!5+USNKv(r46~`?wZZ3G)c=w)w+|{th3D91WcWL zyrg+!)RT{eIhAJ{bkpM9xLS?8XRo^AIeAaGYF;&6!^oo!^LVgZvGk}!WKxvMJ}oka z9_-O0DxL#y+&Day23tny%et`xCY(8^2w5?L$+ub#tv%(5GNhS9e^dyBJsU2<%e%&t zmy6shG7Qg@d%~J=$Va+yTWysGi>yLq{_gPTwQoN|Pz*y|clC2)-rV`I48{IOx82G) z1!HpO&>>9JOCBL@)7Ltn^y8(lc0S=}Jz6LE9Z&svwg$wxcvNoaCv7Hf4MUwdp|MdV z1?6tb-qyJOt*?sby!NIT#Sl$5$hF=ne#Wg5P7quUo^?ukwsGrLABb<={3KR2ES_v> z-M)Ek99*@8eScO(Qyk#vWv#h(0);_Y4%{@5%2Sb}WRo6E+&mM0i$=J#Z27HWP%kpQ zvAyl!t-Dt|{4$G>Fj;8>T%p7P9{-L*=m^N5K6aw(vu#U-nt0`wQBFKqpn z1@m1rG=hNALx&K_2^{6FTzMg!yMP0eGYcNhmWF*#%TBO9WZikdTTQl4zr&AAP( z)i=4kNL6I{XLV1RJw497>dJU*+49)=6;(O1>xy_);9i4G)At8U%P&NoW1C*m^yW8&Ro}&uOKOnT-B%ow?rwUtA(pD z$Z&}o^0NWfVjzR*6vEkvWKncrd(^CjabcR*% zr;=bfdAB#6ga=&u>nD+``K!1HS7By^B+sQ+C4k_?_*{ll2{4ag%rduE(1nGiLDM)( zy1J=?Zq)Jw)W2W@|V97Z+hKp+2`SCS{n|t--9q_DAG0_nIz7v?~I(^ z2{OQyIK^Y&^MD{HJ(`3)`9lZx#`Q0FL0oX&`I(245*N&ypLM+kIvMHy2r8RIuu;)j zx8mF(7;()l701Le-<20-h=}FD^u&h3A49>jdoB!fLLY+M&43(-^+?yLQ>QT*asnqs zPGtG(XmIR?N+X!#GLmq^iBDWEPX@K;(uAU`6-IoN9-oSd^G6EZIhisv>Xb^28!=C^4Z7{&S&{cUb3;Y&W&$6e#`kke6z8w<6AiE%y9h| zIZ9gK)zt_NTMR}9&LMHBf1^<4xVdX~;{!hO08=w464d-__5xJzy!9M7BfFOHs1DLxM@?=o@ z{3w(Kt7npD{}JvQ!uVDLlT(iD-Jhp54rLv`S_5(`R^GcdP9SurEto<1Bt6t(d}55W3k6W%Jr~9Ne=h4(!_%qcBxA)1a81`rll}*NG7XQxVZ`)rdSY(qOmx? zpW^yx7XN|Irv&SN%_OiAVeOeWe}0T(Nz!qwKF1iN_pqhuSUZL>X1i?ZQ#8F?lzB{;fb%yWKQPwE}f9LisdEnH6gZnVc9wa}ux@A)*ty028n*C;jYUzuq)YkEyUy>~ z8-||b3+bQ0iNB;_@Tp?MjW|^!$#-enhS_v8O}skZYrU5S(Hbl@X&woDitOsy!c;ICj+Z_> z%0D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
@J>e%Tl8I{?|=$%P)UC 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 M07*qoM6N<$f-F9wr~m)} literal 0 HcmV?d00001 diff --git a/packages/lru/mod.ts b/packages/lru/mod.ts new file mode 100644 index 0000000..272e7d3 --- /dev/null +++ b/packages/lru/mod.ts @@ -0,0 +1,5 @@ +export * from "./src/lru_cache.ts"; +export * from "./src/lru_decorator.ts"; +export * from "./src/types.ts"; + +export { default } from "./src/lru_decorator.ts"; diff --git a/packages/lru/src/_internal.ts b/packages/lru/src/_internal.ts new file mode 100644 index 0000000..4ee3c9a --- /dev/null +++ b/packages/lru/src/_internal.ts @@ -0,0 +1,49 @@ +// deno-lint-ignore-file no-explicit-any +import type { Keygen } from "./options.ts"; +import type { CacheKey } from "./types.ts"; + +/** + * Generic class method signature used by {@linkcode ClassMethodDecorator}. + * + * @category Types + * @internal + */ +export type ClassMethod< + This, + Args extends readonly any[] = any[], + Return = any, +> = (this: This, ...args: Args) => Return; + +/** + * Generic method decorator signature returned by the {@linkcode lru} + * decorator. + * + * @category Types + * @internal + */ +export type ClassMethodDecorator> = { + (target: Value, ctx: ClassMethodDecoratorContext): Value | void; +}; + +/** + * Custom extension of the native `ClassAccessorDecoratorContext` object, with + * stronger type inference for the `name` property. Thanks to the significant + * recent advancements TypeScript's type safety + * + * Which provides us with literal types for various properties of a decorator's + * context object **_at compile time_**, we can simply drop this type in as a + * replacement for the standard context object, giving us the ability to infer + * literal property names of the item being decorated. + */ +export interface NamedAccessorDecoratorContext< + This, + Value, + Name extends PropertyKey = PropertyKey, +> extends Omit, "name"> { + name: Name; +} + +const JSON = globalThis.JSON; + +/** @internal */ +export const defaultKey: Keygen = (...args) => JSON.stringify(args) as CacheKey; diff --git a/packages/lru/src/lru_cache.test.ts b/packages/lru/src/lru_cache.test.ts new file mode 100644 index 0000000..2a064e3 --- /dev/null +++ b/packages/lru/src/lru_cache.test.ts @@ -0,0 +1,130 @@ +import { describe, it } from "@std/testing/bdd"; +import { expect } from "@std/expect"; + +import { LRU } from "@decorators/lru"; + +describe("LRU (class)", () => { + it("should be a class named 'LRU'", () => { + expect(LRU).toBeInstanceOf(Function); + expect(LRU.name).toBe("LRU"); + }); + + it("should store the values", () => { + const cache = new LRU(3); + cache.set("a", 1).set("b", 2).set("c", 3); + expect(cache.get("a")).toBe(1); + expect(cache.get("b")).toBe(2); + expect(cache.get("c")).toBe(3); + }); + + it("should accurately reflect changes in the cache size", () => { + const cache = new LRU(3); + expect(cache.size).toBe(0); + cache.set("a", 1); + expect(cache.size).toBe(1); + cache.set("b", 2); + expect(cache.size).toBe(2); + cache.set("c", 3); + expect(cache.size).toBe(3); + cache.delete("a"); + expect(cache.size).toBe(2); + }); + + it("should not exceed the maximum size", () => { + const cache = new LRU(3); + expect(cache.maxSize).toBe(3); + expect(cache.size).toBe(0); + cache.set("a", 1); + expect(cache.size).toBe(1); + cache.set("b", 2); + expect(cache.size).toBe(2); + cache.set("c", 3); + expect(cache.size).toBe(3); + cache.set("d", 4); + expect(cache.size).toBe(3); + expect(cache.get("a")).toBe(undefined); + }); + + it("should indicate whether or not it contains a key", () => { + const cache = new LRU(3); + cache.set("a", 1); + expect(cache.has("a")).toBe(true); + expect(cache.has("b")).toBe(false); + cache.delete("a"); + expect(cache.has("a")).toBe(false); + expect(cache.has("b")).toBe(false); + cache.set("b", 2); + expect(cache.has("b")).toBe(true); + expect(cache.has("a")).toBe(false); + cache.clear(); + expect(cache.has("a")).toBe(false); + expect(cache.has("b")).toBe(false); + expect(cache.size).toBe(0); + expect(cache.get("a")).toBe(undefined); + expect(cache.get("b")).toBe(undefined); + }); + + it("should support deleting a key from the cache", () => { + const cache = new LRU(3); + cache.set("a", 1); + expect(cache.size).toBe(1); + expect(cache.get("a")).toBe(1); + expect(cache.delete("a")).toBe(true); + expect(cache.size).toBe(0); + expect(cache.get("a")).toBe(undefined); + }); + + it("should clear the cache", () => { + const cache = new LRU(3); + cache.set("a", 1).set("b", 2).set("c", 3); + expect(cache.size).toBe(3); + expect(cache.clear()).toBe(undefined); + expect(cache.size).toBe(0); + expect(cache.get("a")).toBe(undefined); + expect(cache.get("b")).toBe(undefined); + expect(cache.get("c")).toBe(undefined); + }); + + it("should evict the least recently used values", () => { + const cache = new LRU(2); + cache.set("a", 1).set("b", 2).set("c", 3); + expect(cache.has("a")).toBe(false); + expect(cache.get("a")).toBe(undefined); + expect(cache.get("b")).toBe(2); + expect(cache.get("c")).toBe(3); + }); + + it("should update the order of the keys", () => { + const cache = new LRU(2); + cache.set("a", 1).set("b", 2); + // Access "a" so it becomes most-recent. + cache.get("a"); + cache.set("c", 3); + expect(cache.get("a")).toBe(1); + expect(cache.get("b")).toBe(undefined); + expect(cache.get("c")).toBe(3); + }); + + it("should remove the key", () => { + const cache = new LRU(); + cache.set("a", 1); + // Our API uses delete, not remove. + cache.delete("a"); + expect(cache.get("a")).toBe(undefined); + expect(cache.delete("b")).toBe(false); + }); + + it("should clear the cache", () => { + const cache = new LRU(); + cache.set("a", 1).set("b", 2); + cache.clear(); + expect(cache.get("a")).toBe(undefined); + expect(cache.get("b")).toBe(undefined); + }); + + it("should render the cache as a string when inspected", () => { + const cache = new LRU(3); + cache.set("a", 1).set("b", 2); + expect(Deno.inspect(cache)).toBe('LRU(2/3) { "a" => 1, "b" => 2 }'); + }); +}); diff --git a/packages/lru/src/lru_cache.ts b/packages/lru/src/lru_cache.ts new file mode 100644 index 0000000..388862b --- /dev/null +++ b/packages/lru/src/lru_cache.ts @@ -0,0 +1,193 @@ +/** + * This module provides the {@linkcode LRU} cache which the {@linkcode lru} + * decorator uses as its default mechanism for storing cached values. + * + * @example + * ```ts + * import { LRU } from "@decorators/lru/cache"; + * + * const cache = new LRU(2); + * + * cache.set("a", 1); + * cache.set("b", 2); + * cache.set("c", 3); // "a" is evicted + * console.log(cache.get("a")); // undefined + * ``` + * @module cache + */ +import type { MapLike } from "./types.ts"; + +const kInspect: unique symbol = Symbol.for("Deno.customInspect"); + +/** + * A generic Least Recently Used (LRU) cache. + * + * This class implements a simple LRU cache using a JavaScript Map. + * When a new key is inserted and the cache is full, the oldest key is + * evicted. + * + * @example + * ```ts + * import { LRU } from "@decorators/lru/cache"; + * + * const cache = new LRU(3); + * cache.set("a", 1); + * cache.set("b", 2); + * cache.set("c", 3); + * console.log(cache.get("a")); // 1 (and "a" becomes most-recent) + * cache.set("d", 4); // "b" is evicted (the oldest) + * console.log(cache.has("b")); // false + * ``` + * + * @category Caching + * @tags LRU, cache + */ +export class LRU implements MapLike { + #cache = new Map(); + #maxSize = 128; + + /** + * Creates an instance of LRU. + * + * @param maxSize - The maximum number of entries to store. + * @returns A new LRU instance. + * @example + * ```ts + * import { LRU } from "@decorators/lru/cache"; + * + * const cache = new LRU(128); + * ``` + */ + constructor(maxSize?: number) { + if (maxSize != null) this.#maxSize = +maxSize >>> 0; + + Object.defineProperty(this, kInspect, { + value: this[kInspect].bind(this), + enumerable: false, + configurable: true, + writable: false, + }); + } + + /** Returns the number of entries currently stored in the cache. */ + get size(): number { + return this.#cache.size; + } + + /** Returns the maxSize of this cache instance. */ + get maxSize(): number { + return this.#maxSize; + } + + /** + * Retrieves a value from the cache and updates its recency. + * + * @param key - The key to retrieve. + * @returns The cached value if present; otherwise, undefined. + * @example + * ```ts + * import { LRU } from "@decorators/lru/cache"; + * + * const cache = new LRU(128); + * + * const value = cache.get("a"); + * + * if (value !== undefined) console.log("Cached:", value); + * ``` + */ + get(key: K): V | undefined { + if (this.#cache.has(key)) { + const value = this.#cache.get(key)!; + // update recency: remove and reinsert + this.#cache.delete(key); + this.#cache.set(key, value); + return value; + } + } + + /** + * Checks if a key exists in the cache. + * + * @param key The key to check. + * @returns `true` if the key is in the cache; otherwise, `false`. + * @example + * ```ts + * import { LRU } from "@decorators/lru/cache"; + * + * const cache = new LRU(128); + * + * if (cache.has("a")) { + * console.log("Key 'a' exists!"); + * } + * ``` + */ + has(key: K): boolean { + return this.#cache.has(key); + } + + /** + * Inserts or updates a key-value pair in the cache. If the cache exceeds its + * maxSize, the oldest entry is removed. + * + * @param key - The key to insert/update. + * @param value - The value to associate with the key. + * @returns This LRU instance. + * + * @example + * ```ts + * import { LRU } from "@decorators/lru/cache"; + * + * const cache = new LRU(128); + * + * cache.set("b", 2); + * ``` + */ + set(key: K, value: V): this { + if (this.#cache.has(key)) { + this.#cache.delete(key); + } else if (this.#cache.size >= this.#maxSize) { + // Remove the least-recently used (first) key. + const oldestKey = this.#cache.keys().next().value; + if (typeof oldestKey !== "undefined") this.#cache.delete(oldestKey); + } + this.#cache.set(key, value); + return this; + } + + /** + * Removes a key from the cache. + * + * @param key - The key to remove. + * @returns `true` if the key was removed; otherwise, `false`. + * + * @example + * ```ts + * import { LRU } from "@decorators/lru/cache"; + * + * const cache = new LRU(128); + * + * cache.set("a", 1); + * cache.delete("a"); // true + * cache.delete("a"); // false + * ``` + */ + delete(key: K): boolean { + return this.#cache.delete(key); + } + + /** Clears the cache, removing all entries. */ + clear(): void { + this.#cache.clear(); + } + + /** @internal */ + [kInspect]( + inspect: (value: unknown, options: Deno.InspectOptions) => string, + options: Deno.InspectOptions, + ): string { + const name = this.constructor.name || "LRU"; + const text = inspect(this.#cache, options); + const label = `${name}(${this.size}/${this.maxSize})`; + return text.replace(/\bMap\s*\(\d+\)/, label); + } +} diff --git a/packages/lru/src/lru_decorator.test.ts b/packages/lru/src/lru_decorator.test.ts new file mode 100644 index 0000000..71be264 --- /dev/null +++ b/packages/lru/src/lru_decorator.test.ts @@ -0,0 +1,243 @@ +// deno-lint-ignore-file no-explicit-any +import { describe, it } from "@std/testing/bdd"; +import { expect } from "@std/expect"; + +import lru, { LRU } from "@decorators/lru"; + +describe("lru (decorator)", () => { + it("should be a function named 'lru'", () => { + expect(lru).toBeInstanceOf(Function); + expect(lru.name).toBe("lru"); + }); + + it("should cache the result of a method", () => { + let computeCount = 0; + class Test { + @lru() + fib(n: number): number { + computeCount++; + return n < 2 ? n : this.fib(n - 1) + this.fib(n - 2); + } + } + const t = new Test(); + const res1 = t.fib(5); + const res2 = t.fib(5); + expect(res1).toBe(res2); + // Caching should reduce the number of computations. + expect(computeCount).toBeLessThan(10); + }); + + it("should support a custom key generator", () => { + let computeCount = 0; + const customKey = function (...args: any[]): string { + return args.join("-"); + }; + class Test { + @lru({ key: customKey }) + compute(a: number, b: number): number { + computeCount++; + return a + b; + } + } + const t = new Test(); + expect(t.compute(1, 2)).toBe(3); + expect(t.compute(1, 2)).toBe(3); + expect(computeCount).toBe(1); + }); + + it("should support TTL for passive eviction", async () => { + let computeCount = 0; + class Test { + @lru({ ttl: 100 }) + add(a: number, b: number): number { + computeCount++; + return a + b; + } + } + const t = new Test(); + const res1 = t.add(1, 2); + expect(res1).toBe(3); + expect(computeCount).toBe(1); + + // Immediate subsequent call should hit cache. + const res2 = t.add(1, 2); + expect(res2).toBe(3); + expect(computeCount).toBe(1); + + // Wait for TTL to expire. + await new Promise((resolve) => setTimeout(resolve, 150)); + const res3 = t.add(1, 2); + expect(res3).toBe(3); + expect(computeCount).toBe(2); + }); + + it("should support active eviction", async () => { + let computeCount = 0; + class Test { + @lru({ ttl: 100, eviction: "active" }) + mult(a: number, b: number): number { + computeCount++; + return a * b; + } + } + const t = new Test(); + const res1 = t.mult(2, 3); + expect(res1).toBe(6); + expect(computeCount).toBe(1); + + // Wait for TTL to expire and allow active eviction to remove the cache entry. + await new Promise((resolve) => setTimeout(resolve, 150)); + const res2 = t.mult(2, 3); + expect(res2).toBe(6); + expect(computeCount).toBe(2); + }); + + it("should apply transform function", () => { + let computeCount = 0; + class Test { + @lru({ transform: (val) => val * 2 }) + add(a: number, b: number): number { + computeCount++; + return a + b; + } + } + const t = new Test(); + const res1 = t.add(1, 2); + expect(res1).toBe(6); // (1+2)*2 = 6 + const res2 = t.add(1, 2); + expect(res2).toBe(6); + expect(computeCount).toBe(1); + }); + + describe("Overrides and Edge Cases", () => { + it("should use a custom LRU implementation override", () => { + // Custom LRU that counts its instantiations. + class CustomLRU extends LRU { + static instanceCount = 0; + constructor(maxSize?: number) { + super(maxSize); + CustomLRU.instanceCount++; + } + } + + let computeCount = 0; + class TestCustomLRU { + @lru({ overrides: { LRU: CustomLRU } }) + compute(n: number): number { + computeCount++; + return n * 2; + } + } + + const instance = new TestCustomLRU(); + expect(instance.compute(5)).toBe(10); + expect(instance.compute(5)).toBe(10); + expect(computeCount).toBe(1); + expect(CustomLRU.instanceCount).toBe(1); + }); + + it("should use a custom Date override to control TTL behavior", async () => { + // Fake Date that always returns a fixed time. + const fixedTime = 1_600_000_000_000; + class FakeDate extends Date { + // deno-lint-ignore constructor-super + constructor(value?: string | number | Date) { + if (arguments.length === 0) { + super(fixedTime); + } else { + super(value!); + } + } + static override now(): number { + return fixedTime; + } + } + + let computeCount = 0; + class TestFakeDate { + @lru({ ttl: 100, eviction: "passive", overrides: { Date: FakeDate } }) + add(a: number, b: number): number { + computeCount++; + return a + b; + } + } + + const instance = new TestFakeDate(); + expect(instance.add(1, 2)).toBe(3); + expect(computeCount).toBe(1); + + // Even after waiting, FakeDate.now() remains fixed, so the cached value remains valid. + await new Promise((resolve) => setTimeout(resolve, 150)); + expect(instance.add(1, 2)).toBe(3); + expect(computeCount).toBe(1); + }); + + it("should use a custom storage override", () => { + // Use a custom storage container (a plain Map) instead of the default. + const customStorage = new Map(); + let computeCount = 0; + class TestCustomStorage { + @lru({ overrides: { storage: customStorage } }) + multiply(a: number, b: number): number { + computeCount++; + return a * b; + } + } + + const instance = new TestCustomStorage(); + expect(instance.multiply(2, 3)).toBe(6); + expect(instance.multiply(2, 3)).toBe(6); + expect(computeCount).toBe(1); + expect(customStorage.size).toBeGreaterThan(0); + }); + + it("should use custom Map and WeakMap overrides", () => { + // Dummy Map and WeakMap that count instantiations. + class DummyMap extends Map { + static instanceCount = 0; + constructor(entries?: Iterable | null) { + super(entries); + DummyMap.instanceCount++; + } + } + class DummyWeakMap extends WeakMap { + static instanceCount = 0; + constructor(entries?: readonly (readonly [K, V])[]) { + super(entries); + DummyWeakMap.instanceCount++; + } + } + + let computeCount = 0; + class TestDummyOverrides { + @lru({ overrides: { Map: DummyMap, WeakMap: DummyWeakMap } }) + subtract(a: number, b: number): number { + computeCount++; + return a - b; + } + } + + const instance = new TestDummyOverrides(); + expect(instance.subtract(5, 3)).toBe(2); + expect(instance.subtract(5, 3)).toBe(2); + expect(computeCount).toBe(1); + expect(DummyMap.instanceCount).toBeGreaterThan(0); + expect(DummyWeakMap.instanceCount).toBeGreaterThan(0); + }); + + it("should correctly apply the transform function", () => { + let computeCount = 0; + class TestTransform { + @lru({ transform: (val) => val * 2 }) + add(a: number, b: number): number { + computeCount++; + return a + b; + } + } + const instance = new TestTransform(); + expect(instance.add(3, 4)).toBe(14); + expect(instance.add(3, 4)).toBe(14); + expect(computeCount).toBe(1); + }); + }); +}); diff --git a/packages/lru/src/lru_decorator.ts b/packages/lru/src/lru_decorator.ts new file mode 100644 index 0000000..41c3dcc --- /dev/null +++ b/packages/lru/src/lru_decorator.ts @@ -0,0 +1,334 @@ +// deno-lint-ignore-file no-explicit-any +/** + * This module provides a Stage 3 decorator factory for caching method calls + * using an advanced Least Recently Used (LRU) strategy with TTL support. + * + * ## Background + * + * Modeled after Python’s `@lru_cache` decorator, this decorator caches the + * target method's return values based on the arguments it receives. + * + * ## Caching + * + * The core caching logic lives in a dedicated {@link LRU} cache instance + * created for each decorated method. The cache is a simple key-value store + * which evicts the least recently used entry when it reaches maxSize. + * + * ### Structure + * + * To prevent memory leaks, all cache instances are contained within two layers + * of ephemeral weak maps: an outer WeakMap that is keyed by the class itself, + * which holds an inner WeakMap keyed by the `this` context (the class instance + * or constructor, for static methods). Inside the inner map, a `Map` is used + * to associate LRU instances with the property keys of the decorated methods. + * + * This structure ensures that no LRU cache can outlive the class that it is + * associated with, effectively tying it to the lifetime of the class instance + * and that of the class itself. This means cache entries can be automatically + * garbage collected once the class is no longer reachable by the program. + * + * ### Key Generation + * + * Keys are generated by serializing the method's arguments with `options.key`, + * which uses `JSON.stringify` by default. This can be overridden by passing a + * custom key generation function. + * + * #### Keygen Determinism + * + * When providing a custom key generator, always ensure it is deterministic and + * capable of serializing the argument types that the decorated method expects. + * This is crucial for cache hit detection and key matching. + * + * ## Options + * + * The decorator accepts an options bag with the following properties: + * + * - `key`: Custom key generator (default: {@link defaultKey}) + * - `maxSize`: Maximum number of entries to cache (default: `128`) + * - `overrides`: Custom API overrides (for testing and advanced use-cases) + * - `transform`: Post-processing function for cached values. + * - `ttl`: Optional time-to-live in milliseconds for each cache entry. + * - `eviction`: Eviction strategy to control when expired entries are removed. + * + * @example Real-world LRU-cached fetch API with TTL and custom keygen: + * ```ts no-eval + * import { lru } from "@decorators/lru"; + * + * class FetchService { + * constructor(protected init?: RequestInit) {} + * + * @lru({ + * key: (url) => url.toString(), + * transform: async (res) => (await res).clone(), + * ttl: 5_000, // cache entries expire after 5 seconds + * }) + * fetch(url: string | URL): Promise { + * return globalThis.fetch(url, this.init); + * } + * } + * + * // ensuring our fetch service is cached and TTL'd as expected + * const f = new FetchService({ headers: { "accept": "application/json" } }); + * + * // first fetch is uncached and takes longer + * let a = performance.now(); + * await (await f.fetch("https://jsonplaceholder.typicode.com/posts/6")).json(); + * console.log(performance.now() - a, "ms"); // ~300ms (uncached) + * + * // subsequent fetch is cached and faster + * a = performance.now(); + * await (await f.fetch("https://jsonplaceholder.typicode.com/posts/6")).json(); + * console.log(performance.now() - a, "ms"); // ~1.8ms (cached) + * + * // ... a few seconds later (5s TTL) ... + * a = performance.now(); + * await (await f.fetch("https://jsonplaceholder.typicode.com/posts/6")).json(); + * console.log(performance.now() - a, "ms"); // ~200ms (re-cached) + * ``` + * @module lru + */ +import { + type ClassMethod, + type ClassMethodDecorator, + defaultKey, +} from "./_internal.ts"; +import type { EvictionStrategy, Options } from "./options.ts"; +import defaults from "./overrides.ts"; +import type { + CacheEntry, + CacheKey, + ExtendedCacheEntry, + MapLike, + MapLikeConstructor, +} from "./types.ts"; + +lru.defaultOptions = { + maxSize: 128, + key: defaultKey, + transform: (value) => value, + ttl: 0, + eviction: "passive" as EvictionStrategy, + overrides: { ...defaults }, +} satisfies Options; + +/** + * Stage 3 decorator factory that caches the result of a method call using a + * Least Recently Used (LRU) caching strategy, with optional TTL support and + * configurable eviction strategies. + * + * See the module-level documentation for in-depth examples and usage patterns. + * + * @template {object} This The type of the `this` context at runtime. If the + * method is static, this is the class constructor; otherwise, this will be the + * type of the class instance. + * @template {ClassMethod} Value The target call signature. + * @template {readonly any[]} Args The method's argument signature, as a tuple. + * @template [Return] The method's return type. + * @param [options] Configuration options for the cache. + * @returns A method decorator. + * + * @example LRU-cached Fibonacci method with TTL and active eviction: + * ```ts ignore + * import { lru } from "@decorators/lru"; + * + * class Calculator { + * @lru({ maxSize: 64, ttl: 1000, eviction: "active" }) + * fib(n = 2): number { + * if (n < 2) return n; + * return this.fib(n - 1) + this.fib(n - 2); + * } + * } + * + * const calc = new Calculator(); + * console.log(calc.fib(8)); // computed and cached + * ``` + * @category Decorators + * @tags LRU, cache + */ +export function lru< + This extends object, + Value extends ClassMethod, + Args extends readonly any[] = Parameters, + Return = ReturnType, +>( + options?: Options, Return>, +): ClassMethodDecorator { + const { + maxSize = 128, + key: getKey = defaultKey, + overrides = {}, + eviction = "passive", + // onClear = () => {}, + onEvict = () => {}, + onRefresh = () => {}, + onHit = () => {}, + onMiss = () => {}, + inspect = () => {}, + prepare = (value) => value, + transform = (value) => value, + ttl = 0, + // shouldEvict = ({ age, expiresAt = 0 }) => (expiresAt && age > expiresAt), + } = (options ?? {}) as Options; + + const keygen = getKey as (this: This, ...args: Args) => CacheKey; + + const { + Date = defaults.Date, + LRU = defaults.LRU, + Map = defaults.Map as MapLikeConstructor, + WeakMap = defaults.WeakMap as MapLikeConstructor, + storage = defaults.storage, + } = { ...defaults, ...overrides }; + + if (typeof keygen !== "function") { + throw new TypeError("Function expected: options.key"); + } + + return function (method, context) { + let caches: + | MapLike>> + | undefined; + let cache: MapLike> | undefined; + + // Initialize the cache storage for the current context. + context.addInitializer(getCache); + + const fn = function (this: This, ...args: Args): Return { + const key = keygen.call(this, ...args); + cache = getCache.call(this); // in case of a context change + + let evicted = false; + + let entry = cache.get(key); + if (entry?.expiresAt && Date.now() > entry.expiresAt) { + evicted = true; + // Entry has expired, remove it from the cache. + onEvict.call(this, entry.value, key, entry); + // If the entry has expired, clear any active timer. + if (entry.timer) clearTimeout(entry.timer); + cache.delete(key); + entry = undefined; + } + + if (!entry) { + // cache miss + if (!evicted) onMiss.call(this, key); + const value = method.call(this, ...args); + entry = createEntry.call(this, { key, value }); + } else if (!evicted) { + // cache hit + onHit.call(this, entry.value, key, entry); + if (entry.timer) { + // Clear any existing timer before setting a new one. + clearTimeout(entry.timer); + } + } + + // cache hit + if (evicted) onRefresh.call(this, entry.value, key, entry); + + // if a pre-processor is provided, apply it to the value. + const originalValue = entry.value; + const prepared = prepare.call(this, entry.value, key, entry); + entry.value = prepared ?? originalValue; + + if (ttl > 0) setCacheTimer.call(this, entry, ttl); + + // update recency: remove and reinsert + cache.delete(key); + cache.set(key, entry); + + const finalizedValue = transform(entry.value, key, entry); + + inspect.call(this, { + ...entry, + ttl, + originalValue, + finalizedValue, + cache, + }); + + return finalizedValue; + } as Value; + + // let's obscure the fact we've memoized this method + return Object.defineProperties(fn, { + ...Object.getOwnPropertyDescriptors(method), + toString: { + value: method.toString.bind(method), + configurable: true, + }, + }); + + function createEntry< + T extends + & Omit, "age" | "createdAt" | "expiresAt"> + & Partial>, + >( + this: This | void, + entry: T, + ): T & CacheEntry { + const cache2 = cache ?? ( + typeof this === "undefined" ? undefined : getCache.call(this) + ); + const createdAt = entry.createdAt ?? Date.now(); + const expiresAt = entry.expiresAt ?? 0; + + return { + cache: cache2, + ...entry, + createdAt, + expiresAt, + get age() { + return Date.now() - (this.createdAt ??= createdAt); + }, + }; + } + + function setCacheTimer( + this: This, + entry: CacheEntry, + ttl: number, + ) { + const newExpiration = Date.now() + ttl; + entry.expiresAt = newExpiration; + if (eviction === "active") { + // Clear any existing timer before setting a new one. + entry.timer && clearTimeout(entry.timer); + // Set a timer to remove the entry after TTL expires. + entry.timer = setTimeout(() => { + onEvict.call(this, entry.value, entry.key, entry); + + // TODO(nberlette): is this line really needed? + cache ??= getCache.call(this); + cache.delete(entry.key); + + // cleanup the entry and dipose of the timer handle. + clearTimeout(entry.timer); + + entry.timer = entry.expiresAt = entry.value = undefined!; + }, ttl); + } + } + + // hoisted helper functions + function getCacheStorage(key: object) { + return storage.get(key) ?? storage.set(key, new WeakMap()).get(key)!; + } + + function getCache(this: This, p = context.name) { + // Prefer using the decorator metadata object as a key. + let key: object = context.metadata; + // Fallback to the constructor if metadata is not supported. + key ??= context.static ? this : this.constructor; + // Retrieve/initialize the outer weak map for the class constructor. + const outer = getCacheStorage(key); + if (!(caches ??= outer.get(this))) outer.set(this, caches = new Map()); + // Retrieve/initialize the actual LRU cache for this method. + if (!(cache ??= caches.get(p))) caches.set(p, cache = new LRU(maxSize)); + return cache; + } + }; +} + +export default lru; diff --git a/packages/lru/src/options.ts b/packages/lru/src/options.ts new file mode 100644 index 0000000..d7b06ab --- /dev/null +++ b/packages/lru/src/options.ts @@ -0,0 +1,320 @@ +// deno-lint-ignore-file no-explicit-any +import type { Overrides } from "./overrides.ts"; +import type { CacheEntry, CacheKey, ExtendedCacheEntry } from "./types.ts"; + +/** + * Eviction strategy for the {@linkcode lru} decorator. + * + * - `"passive"`: Expired entries are removed lazily on access. + * - `"active"`: Expired entries are removed actively using timers. + * + * @category Types + */ +export type EvictionStrategy = "passive" | "active"; + +// deno-lint-ignore ban-types +export type strings = string & {}; + +/** + * Custom function to generate a cache key from the method arguments. + * + * @category Types + */ +export type Keygen< + This extends object = any, + Args extends readonly any[] = any[], +> = (this: This, ...args: Args) => CacheKey | strings; + +/** + * Custom transformer function for post-processing cached values. This is the + * type signature for the `transform` option in the {@linkcode lru} decorator. + * + * @template I The input type of the cached value. + * @template [O=I] The output type of the transformed value. + * + * @category Types + */ +export type Transformer = ( + value: I, + key: CacheKey, + entry: CacheEntry, +) => O; + +/** + * Options for configuring the {@linkcode lru} decorator. + * + * @category Options + */ +export interface Options< + This extends object = object, + Args extends readonly unknown[] = any[], + Return = any, +> { + /** + * Controls the strategy for removing entries from the cache when they have + * expired. + * + * - `"passive"`: Expired entries are removed lazily on access. + * - `"active"`: Expired entries are removed actively using timers. + * + * @default {"passive"} + */ + eviction?: EvictionStrategy | undefined; + /** + * Custom function to generate a cache key from the method arguments. + * + * @default {defaultKey} (uses JSON.stringify) + */ + key?: Keygen | undefined; + /** + * Maximum number of entries to store in the cache. + * + * @default {128} + */ + maxSize?: number | undefined; + /** + * Custom callback to be invoked whenever an entry is evicted from the cache. + * This can be used to perform additional cleanup or logging. + * + * @example + * ```ts + * import { lru } from "@decorators/lru"; + * + * class Database { + * @lru({ ttl: 5e3, onEvict: (k, v) => console.log(`evicted ${k}: ${v}`) }) + * transaction_id(key: string): string { + * return `${key}_${Math.random().toString(36).slice(2)}`; + * } + * } + * + * const db = new Database(); + * + * db.transaction_id("user_1"); // "user_1_cdcu78j" + * db.transaction_id("user_1"); // "user_1_cdcu78j" + * // wait 5 seconds + * db.transaction_id("user_2"); // "user_2_3j8d7k9" + * // Logs: "evicted user_1_cdcu78j" + * ``` + */ + onEvict?( + this: This, + value: Return, + key: CacheKey, + entry: CacheEntry, + ): void; + + /** + * Custom callback to be invoked whenever an entry is refreshed in the cache. + * This can be used to perform additional actions or logging. + * + * @example + * ```ts + * import { lru } from "@decorators/lru"; + * + * class Database { + * @lru({ ttl: 5e3, onRefresh: (k, v) => console.log(`refreshed ${k}: ${v}`) }) + * transaction_id(key: CacheKey): string { + * return `${key}_${Math.random().toString(36).slice(2)}`; + * } + * } + * + * const db = new Database(); + * + * db.transaction_id("user_1"); // "user_1_cdcu78j" + * db.transaction_id("user_1"); // "user_1_cdcu78j" + * // wait 5 seconds + * db.transaction_id("user_2"); // "user_2_3j8d7k9" + * // Logs: "refreshed user_1_cdcu78j" + * ``` + */ + onRefresh?( + this: This, + value: Return, + key: CacheKey, + entry: CacheEntry, + ): void; + + // /** + // * Custom predicate function to determine whether a cache entry should be + // * evicted. This can be used to implement custom eviction policies. + // * + // * @example + // * ```ts + // * import { lru } from "@decorators/lru"; + // * + // * class MyService { + // * @lru({ + // * key: (url) => url.toString(), + // * shouldEvict(key, value, entry) { + // * return entry.age > 10_000 + // * }, + // * }) + // * fetch(url: string | URL): Promise { + // * return globalThis.fetch(url); + // * } + // * } + // * ``` + // */ + // shouldEvict?( + // this: This, + // entry: CacheEntry, + // ): boolean; + + // /** + // * Optional function to be called when the cache is cleared. This can be used + // * to perform additional cleanup or logging. + // * + // * @example + // * ```ts + // * import { lru } from "@decorators/lru"; + // * + // * class MyService { + // * @lru({ onClear: () => console.log("Cache cleared!") }) + // * fetch(url: string | URL): Promise { + // * return globalThis.fetch(url); + // * } + // * } + // * ``` + // */ + // onClear?(this: This): void; + + /** + * Optional function to be called on a cache hit. This can be used to + * perform additional actions or logging. + */ + onHit?( + this: This, + value: Return, + key: CacheKey, + entry: CacheEntry, + ): void; + + /** + * Optional function to be called on a cache miss. This can be used to + * perform additional actions or logging. + */ + onMiss?(this: This, key: CacheKey): void; + + /** + * Optional inspection function which is called whenever a cache entry is + * accessed, and invoked with the key, value, entry object, and the cache + * instance itself as arguments. The function and its return value have no + * effect on the cache itself, it is purely for passive inspection. + */ + inspect?( + this: This, + entry: ExtendedCacheEntry, + ): void; + + /** + * Custom API overrides for the cache implementation. This is primarily for + * dependency injection and testing purposes. + * + * **Warning**: This option is intended for advanced use-cases and testing + * purposes. It should be used with caution, and only if you really know how + * it works. Incorrect usage **will** break the caching mechanism entirely. + */ + overrides?: Overrides | undefined; + + /** + * Optional pre-processing function, which can be used to transform values + * **before** they are stored in the cache, and after they are computed by + * the original (memoized) method. + * + * This can be used to implement advanced cache behaviors which require + * the values to be transformed or otherwise processed before they are + * stored in the cache. For example, you might want to compress the value + * before storing it, or convert it to a different format. + * + * @remarks + * **Note**: It's important to note that due to the current design of the + * decorators proposal, it's not possible to transform the type of the value + * to something that is not assignable to the original type. This limitation + * was an intentional decision by the decorators proposal authors, but it has + * received some criticism and is being considered for future revisions. For + * now, however, compile-time type transformations are not supported. + * + * This means that the `prepare` function must return the same type of value + * as it receives, and must be compatible with the original method signature. + * That being said, it _is_ possible to transform these values at runtime to + * any type you want (theoretically), due to JavaScript's dynamic nature. But + * the TypeScript compiler will not be able to infer this, and will either + * raise a compiler error or simply fail to recognize the transformed type. + * @example + * ```ts + * import { lru } from "@decorators/lru"; + * + * class MyService { + * @lru({ + * prepare: async (res) => { + * const clone = (await res).clone(); + * // update the response headers + * clone.headers.set("x-lru-cache", "true"); + * return clone; + * }, + * // this option is critical when we are caching an HTTP Response. + * // if we don't clone it before we return it, it will be consumed + * // and become totally useless after the first access. + * transform: async (res) => (await res).clone(), + * }) + * fetch(url: string | URL): Promise { + * return globalThis.fetch(url); + * } + * } + * ``` + */ + prepare?: Transformer | undefined; + + /** + * Optional post-processing function, which can be used to transform values + * after they are retrieved from the cache, but before they are returned. + * + * This can be used to implement more advanced cache behaviors, such as + * caching an HTTP response, which requires cloning the cached value before + * returning it. Without a transform function, the cached value would only be + * valid for a single use, and any subsequent access would throw an error due + * to the response being consumed. + * + * @remarks + * **Note**: It's important to note that due to the current design of the + * decorators proposal, it's not possible to transform the type of the value + * to something that is not assignable to the original type. This limitation + * was an intentional decision by the decorators proposal authors, but it has + * received some criticism and is being considered for future revisions. For + * now, however, compile-time type transformations are not supported. + * + * This means that the transform function must return the same type of value + * as it receives, and must be compatible with the original method signature. + * That being said, it _is_ possible to transform these values at runtime to + * any type you want (theoretically), due to JavaScript's dynamic nature. But + * the TypeScript compiler will not be able to infer this, and will either + * raise a compiler error or simply fail to recognize the transformed type. + * @example + * ```ts + * import { lru } from "@decorators/lru"; + * + * class FetchService { + * constructor(protected init?: RequestInit) {} + * + * @lru({ + * key: (url) => url.toString(), + * transform: async (res) => (await res).clone(), + * ttl: 5_000, // cache entries expire after 5 seconds + * }) + * fetch(url: string | URL): Promise { + * return globalThis.fetch(url, this.init); + * } + * } + * ``` + */ + transform?: Transformer | undefined; + + /** + * Optional time-to-live (TTL) in milliseconds for each cache entry. If set, + * cache entries that haven't been accessed within the provided time window + * will be removed from the cache. + * + * @default {0} (entries do not expire) + */ + ttl?: number | undefined; +} diff --git a/packages/lru/src/overrides.ts b/packages/lru/src/overrides.ts new file mode 100644 index 0000000..91f000f --- /dev/null +++ b/packages/lru/src/overrides.ts @@ -0,0 +1,89 @@ +import { LRU } from "./lru_cache.ts"; +import type { + CacheContainer, + LruLikeConstructor, + MapLikeConstructor, + TimeProvider, +} from "./types.ts"; + +/** + * Custom overrides for the {@linkcode lru} decorator, allowing for dependency + * injection and testing of the cache implementation. + * + * - `Date` - {@linkcode TimeProvider} for time-based operations. + * - `LRU` - {@linkcode LruLikeConstructor} override for the `LRU` class + * - `Map` - {@linkcode MapLikeConstructor} override for the `Map` class + * - `WeakMap` - {@linkcode MapLikeConstructor} override for `WeakMap` + * - `storage` - {@linkcode CacheContainer} override for the storage instance. + * + * **Warning**: These options are intended for advanced use-cases and should be + * used with caution, as they can easily break the decorator if not implemented + * correctly. It's usually best to leave these as the default values. + * + * @category Options + * @tags Overrides + */ +export interface Overrides { + /** + * The LRU cache implementation to use. Defaults to the {@link LRU} class + * included with this library. + * + * @default {LRU} + */ + LRU?: LruLikeConstructor | undefined; + /** + * The Map implementation to use. Defaults to the global `Map` class. + * + * @default {globalThis.Map} + */ + Map?: MapLikeConstructor | undefined; + /** + * The WeakMap implementation to use. Defaults to the global `WeakMap` class. + * + * @default {globalThis.WeakMap} + */ + WeakMap?: MapLikeConstructor | undefined; + /** + * The `Date` constructor to use for time-based operations. + * + * @default {globalThis.Date} + */ + Date?: TimeProvider | undefined; + /** + * Custom storage implementation for the cache. This is a multi-layered map + * structure used to store the cache containers for each class constructor. + * + * The default implementation uses a WeakMap for the outer layer, a WeakMap + * for the inner layer, a Map for the property-to-LRU mapping, and (finally!) + * the actual LRU cache for the decorated method. + * + * The structure looks like this: + * ```ts ignore + * WeakMap // <- LRU cache (key: keygen result) + * >, + * >, + * > + * ``` + */ + storage?: CacheContainer | undefined; +} + +const WeakMap = globalThis.WeakMap; +const Map = globalThis.Map; +const Date = globalThis.Date; + +/** @internal */ +const storage: CacheContainer = new WeakMap(); + +export const defaults = { + storage: storage as CacheContainer, + WeakMap: WeakMap as MapLikeConstructor, + Map: Map as MapLikeConstructor, + Date: Date as TimeProvider, + LRU: LRU as LruLikeConstructor, +} as const satisfies Required; + +export default defaults; diff --git a/packages/lru/src/types.ts b/packages/lru/src/types.ts new file mode 100644 index 0000000..9bdff34 --- /dev/null +++ b/packages/lru/src/types.ts @@ -0,0 +1,175 @@ +// deno-lint-ignore-file no-explicit-any + +const kCacheKey: unique symbol = Symbol("cacheKey"); +type kCacheKey = typeof kCacheKey; + +interface IsCacheKey { + readonly [kCacheKey]: never; +} + +/** + * Represents a cache key used by the internal {@linkcode LRU} cache + * implementation. This is a serialized representation of the arguments passed + * to the decorated method, and is used to uniquely identify the cached value. + * The {@linkcode Keygen} function generates values of this type. + * + * @remarks + * This is a nominal (branded) string type, which is distinct from a regular + * string. This allows us to use the `CacheKey` type in a type-safe manner, + * and ensure that we're dealing with a key that's been generated by the + * {@linkcode Keygen} function, rather than an arbitrary string. + * + * @category Types + */ +export type CacheKey = string & IsCacheKey; + +/** + * A cached entry record that holds the actual value and, optionally, + * an expiration timestamp in milliseconds as well as a timer handle for + * active eviction. + * + * @template T The type of the cached value. + * @category Types + * @internal + */ +export interface CacheEntry { + /** The key used to store the entry in the cache. */ + key: CacheKey; + + /** The cached value. */ + value: T; + + /** The entry's age, in milliseconds since it was created. */ + readonly age: number; + + /** + * The time this entry was created, in milliseconds since the epoch. + * + * This does not necessarily reflect the **_first_** time the entry was + * created, but rather the most recent time it was refreshed/recreated. + */ + createdAt: number; + + /** + * Optional expiration timestamp (in milliseconds since the epoch). + * If present, the entry expires when Date.now() exceeds this value. + */ + expiresAt?: number | undefined; + + /** Optional timer handle used for active eviction. */ + timer?: ReturnType | undefined; +} + +/** + * An extended cache entry record that holds the original value (before + * any pre-processing steps), the stored value (after pre-processing), + * and the final value (after any transformations), along with a reference + * to the LRU cache instance itself. + * + * @template T The type of the cached value. + * @category Types + */ +export interface ExtendedCacheEntry extends CacheEntry { + /** The cache instance itself. */ + cache: MapLike>; + /** The key used to store the entry in the cache. */ + key: CacheKey; + /** The value stored in the cache, after calling the `prepare` function to + * apply any transformations. */ + value: T; + /** The original value that was generated by the decorated method. */ + originalValue: T; + /** The final value that is actually being returned to the caller, after + * applying any transformations from the `transform` function. */ + finalizedValue: T; + /** The TTL (time-to-live) of the entry, in milliseconds. If no TTL is + * set, this will be `0`. */ + ttl: number; +} + +/** + * Deeply-nested cache storage structure for the {@linkcode lru} decorator. + * + * @category Types + */ +export type CacheContainer< + T extends object = object, + K extends PropertyKey = PropertyKey, + V = any, +> = MapLike>>>; + +/** + * The minimal representation of a {@linkcode Date} constructor required for + * time-based operations (e.g. TTL evictions) in the {@linkcode lru} decorator. + * + * This type only requires the presence of a `now()` method, which must return + * a number representing the current time in milliseconds. The global `Date` + * object is the default implementation for this interface. + * + * This is primarily used for testing and dependency injection purposes, and is + * the type expected by the `Date` option in the {@linkcode Overrides} object. + * + * @category Types + * @tags Overrides + */ +export interface TimeProvider { + /** Returns the current time in milliseconds since the epoch. */ + now(): number; +} + +/** + * Represents a constructor of {@linkcode LRU} instances. This is primarily + * used for testing and dependency injection purposes. It is the type expected + * by the `LRU` option in the {@linkcode Overrides} object. + * + * @category Types + * @tags Overrides + */ +export interface LruLikeConstructor { + /** Creates a new instance of the LRU cache. */ + new (maxSize: number): MapLike; +} + +/** + * Represents the minimal required API for the internal keyed collections used + * by the {@linkcode lru} decorator to store cached values. This interface is + * intentionally minimal and generic by design, for maximum flexibility. + * + * This type is implemented by the {@linkcode LRU} class as well as the global + * `Map` and `WeakMap` APIs. Together these form a multi-layer, memory-safe + * data structure that is used as the default cache storage mechanism. + * + * @remarks + * If you plan on using a custom cache implementation with the {@linkcode lru} + * decorator, or want to override the internal `Map` or `WeakMap` constructors + * for advanced testing/debugging purposes, any classes you provide for those + * overrides must implement this interface to be considered compatible. + * + * @category Types + * @tags Overrides + */ +export interface MapLike { + /** Gets the number of entries in the cache. */ + get(key: K): V | undefined; + /** Sets a value in the cache. */ + set(key: K, value: V): this; + /** Checks if a key exists in the cache. */ + has(key: K): boolean; + /** Deletes a key from the cache. */ + delete(key: K): boolean; +} + +/** + * Represents a constructor of {@linkcode MapLike} instances. This is primarily + * used for testing and dependency injection purposes. It is the type expected + * by the `Map` and `WeakMap` options in the {@linkcode Overrides} object. + * + * @category Types + * @tags Overrides + */ +export interface MapLikeConstructor { + /** Creates a new instance of the map. */ + new (): MapLike; + /** Creates a new instance of the map with the given entries. */ + new (entries?: [K, V][] | undefined): MapLike; +} From 65d7a5b8dc0b54132ea4b97108e103c982c476a4 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 07:58:40 +0000 Subject: [PATCH 17/40] chore: remove .DS_Store -_- --- packages/lru/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 packages/lru/.DS_Store diff --git a/packages/lru/.DS_Store b/packages/lru/.DS_Store deleted file mode 100644 index 8233d9157aa14f8e6808a144a3cc53df2c0c9656..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKze~eV5WZ(xDY|rY41$x3{R@mG1^0@x_6IsNrnD-K8J+zLoJG{tSx`qe|B8Yj z2yTA&?qTvw3r-?>2k*Y*e&jA6&^A) z<^9I=xZbzohWm|nUX$CRfW|bUF7GC}XZtSq6nhBPTMuW_gUd_OymHy=*UPwGl@59L zg0?$YUUT`@_ZI7JUQC``-9mn`_Vft9{ubwdim-v_VE1p7OY%Z z{=H`uyO9B_`E^?R&N;(-^8P9Q*jXR+jTOIb$hLec|RVxF^ zfX_f6w{@QXt=Z>)KS}SD0cGG%F<>fjJ8t5Y+-xnq9M9SiYX^&k<1#^;0_DcBz2H&2 bgk=T3kS~Cd!%Pqsi2evz8dNC*Kgz%d@STog From deb0245b770b60ac98de4cf9c5543742a5574202 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 08:52:08 +0000 Subject: [PATCH 18/40] chore(docs): update root README.md with new lru package --- .gitignore | 17 ++++++++++ README.md | 92 ++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 93 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 6836292..d1df8b6 100644 --- a/.gitignore +++ b/.gitignore @@ -130,3 +130,20 @@ dist .pnp.* *.lock* *-lock.* + +# Windows system files +Thumbs.db +ehthumbs.db +Icon? +Desktop.ini +$RECYCLE.BIN/ +# macOS system files +.AppleDouble +.LSOverride +.DS_Store +# Thumbnails +._* +# Files that might appear on external disk +.Spotlight-V100 +.Trashes +.VolumeIcon.icns diff --git a/README.md b/README.md index 818106d..6d3cc39 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,21 @@ -# [![@][@]decorators][docs] +
+ +# [@decorators][jsr] Monorepo for packages published under the [`@decorators/*`][JSR] scope on [JSR]. +
+ --- ## Packages -#### [`@decorators/alias`][@decorators/alias] +### [`@decorators/alias`] -> Alias class members to simplify stack traces. +Create aliases between class members and simplify stack traces. + +- **[➥ API Documentation](https://jsr.io/@decorators/alias)** +- **[➥ View the README](./packages/alias/README.md)** ```ts import { alias } from "@decorators/alias"; @@ -39,20 +46,27 @@ console.assert(foo.qux === foo.bar); // OK console.assert(foo.nurp === foo.bar); // OK ``` -#### [`@decorators/bind`][@decorators/bind] +--- + +### [`@decorators/bind`] + +Bind methods, getters, and setters to the appropriate context object, with +support for static members and inheritance. -> Bind methods, getters, and setters to the appropriate context object, with -> support for static members and inheritance. +- **[➥ API Documentation](https://jsr.io/@decorators/bind)** +- **[➥ View the README](./packages/bind/README.md)** ```ts import { bind } from "@decorators/bind"; class Foo { - @bind bar(): Foo { + @bind + bar(): Foo { return this; } - @bind static self(): typeof Foo { + @bind + static self(): typeof Foo { return this; } } @@ -64,22 +78,68 @@ console.log(bar() instanceof Foo); // true --- +### [`@decorators/lru`] + +Highly configurable LRU cache decorator for class methods, with support for TTL, +max size, custom key generation, pre- and post-processing, lifecycle event +handlers, and much more. + +- **[➥ API Documentation](https://jsr.io/@decorators/lru)** +- **[➥ View the README](./packages/lru/README.md)** + +```ts +import { lru } from "@decorators/lru"; + +class BasicExample { + @lru({ maxSize: 64, ttl: 1000 }) + memoized(arg1: string, arg2: number): string { + return `${arg1}-${arg2}`; + } +} + +const example = new BasicExample(); +console.log(example.memoizedMethod("foo", 42)); // "foo-42" +console.log(example.memoizedMethod("foo", 42)); // "foo-42" (cached) +``` + +--- + +### Contributing + +Contributions are warmly welcomed! Please read the [Contributing Guide] for +details on our code of conduct, and the process for submitting pull requests. + +If you find a bug, please [open an issue] and we will get to it as soon as +possible. Alternatively, if you feel up to fixing it yourself, please create the +issue anyways (so we can track it) and submit a pull request with the fix! + +--- + +### Further Reading + +- **[TC39 Decorators Proposal]** - The official TC39 proposal for decorators. +- **[Stage 3 Decorators in Deno]** - A microsite we created that's dedicated to + cover the [TC39 decorators proposal] and its landmark implementation in Deno. + +--- +
-##### **[MIT]** © **[Nicholas Berlette]**. All rights reserved. +##### [MIT] © [Nicholas Berlette]. All rights reserved. -###### [GitHub] · [Issues] · [Docs] +###### [GitHub] · [Issues] · [JSR]
-[@decorators/alias]: https://github.com/nberlette/decorators/tree/main/packages/alias#readme "Check out '@decorators/alias' and more over at the GitHub monorepo!" -[@decorators/bind]: https://github.com/nberlette/decorators/tree/main/packages/bind#readme "Check out '@decorators/bind' and more over at the GitHub monorepo!" -[GitHub]: https://github.com/nberlette/decorators/tree/main/packages/bind#readme "Check out all the '@decorators/*' packages over at the GitHub monorepo!" +[`@decorators/alias`]: https://jsr.io/@decorators/alias "Check out the '@decorators/alias' package" +[`@decorators/bind`]: https://jsr.io/@decorators/bind "Check out the '@decorators/bind' package" +[`@decorators/lru`]: https://jsr.io/@decorators/lru "Check out the '@decorators/lru' package" +[GitHub]: https://github.com/nberlette/decorators#readme "Check out all the '@decorators/*' packages over at the GitHub monorepo!" [MIT]: https://nick.mit-license.org "MIT © 2024+ Nicholas Berlette. All rights reserved." [Nicholas Berlette]: https://github.com/nberlette "Nicholas Berlette on GitHub" [Issues]: https://github.com/nberlette/decorators/issues "GitHub Issue Tracker for '@decorators/*' packages" [Open an Issue]: https://github.com/nberlette/decorators/issues/new?assignees=nberlette&labels=bugs&title=%5Bbind%5D+ "Found a bug? Let's squash it!" -[Docs]: https://n.berlette.com/decorators "View @decorators API docs" [JSR]: https://jsr.io/@decorators "View @decorators/* packages on JSR" -[Stage 3 Decorators]: https://github.com/tc39/proposal-decorators "TC39 Proposal: Decorators" -[@]: https://api.iconify.design/streamline:mail-sign-at-email-at-sign-read-address.svg?width=2.5rem&height=1.4rem&color=%23fb0 +[TC39 Decorators Proposal]: https://github.com/tc39/proposal-decorators "TC39 Proposal: Decorators" +[Stage 3 Decorators in Deno]: https://decorators.deno.dev "Stage 3 Decorators in Deno" +[Contributing Guide]: ./.github/CONTRIBUTING.md "Contributing Guide" From 6515d2221a46ac34579d96dd353ce82c0f057e28 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 09:27:29 +0000 Subject: [PATCH 19/40] docs: add contributor code of conduct --- .github/CODE_OF_CONDUCT.md | 131 +++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 .github/CODE_OF_CONDUCT.md diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..b7abc00 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,131 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or advances of + any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, + without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official email address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at [INSERT CONTACT +METHOD]. All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations From e102e7d15142e9ac4033c65de0c027140842d4d6 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 09:27:46 +0000 Subject: [PATCH 20/40] docs: add contribution guidelines file --- .github/CONTRIBUTING.md | 145 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 .github/CONTRIBUTING.md diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..f3b5809 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,145 @@ +# Contributing Guide + +Thank you for your interest in contributing to the @decorators monorepo. Your +contributions make this project better for everyone! + +## How to Contribute + +### Reporting Issues + +- Check the [issue tracker](https://github.com/nberlette/decorators/issues) to + see if the issue already exists. +- When reporting a new issue, provide a descriptive title and clear steps to + reproduce the problem. + +### Proposing Changes + +1. [Open an Issue] to discuss your proposed changes. + - This helps us understand the context and purpose of your changes. + - If your change is a bug fix, please include the issue number in your + description (e.g., `Fixes #123`). + +2. Fork the repository and clone it to your local machine. + +```bash +gh repo fork --clone nberlette/decorators +``` + +3. Create a feature branch for your specific change. Keep it focused. + +```bash +git checkout -b feature/your-feature +``` + +4. Commit your changes following the [conventional commit format]. + +````bash + git add . # or `git add ` + git commit -m "feat: your-feature" + +```bash + git add . # or `git add ` + git commit -m "Add feature: your-feature" +```` + +5. Push your branch and open a pull request. + +```bash +git push origin feature/your-feature +``` + +6. In your pull request, provide a clear description of the changes and why they + are necessary. Include any relevant issue numbers and links to related + discussions or documentation. + +7. Request a review from the maintainers. + +[conventional commit format]: https://www.conventionalcommits.org/en/v1.0.0/#specification "Conventional Commits Specification" + +Please ensure: + +- Each pull request addresses a single issue. +- Your changes include appropriate tests and documentation if applicable. +- Your code adheres to the repository’s [style guidelines]. +- Your commit messages follow the [conventional commit format]. +- Your code is well-documented and easy to understand. +- Each new feature is accompanied by a corresponding test. + - A good rule of thumb is: 1 new `.ts` file = 1 new `.test.ts` file. +- You have run the tests and they all pass. + +## Style Guidelines + +We follow the same code style as the [Deno project](https://deno.land), and use +the [Deno CLI](https://docs.deno.com/go/cli) for linting, formatting, testing, +benchmarking, documentation, and more. + +### Code Style and Formatting + +- Lines are limited to 80 characters. +- Use 2 spaces for indentation, no tabs. +- Use double quotes for strings. +- Use semicolons at the end of statements. +- Arrow functions should have parentheses around the parameters. +- Always include explicit return types and parameter types on public functions + and methods. Use `as const` on literals when possible. +- Avoid using `any` type. Use specific types, generics, or `unknown` instead. + +### Other Guidelines and Best Practices + +- Use `const` and `let` instead of `var`. + +### Documentation + +We use the `deno doc` tool for generating documentation, as does [JSR], our main +distribution channel for packages in the `@decorators/*` namespace. + +Deno's documentation tool requires JSDoc comments and type annotations to be on +all public APIs. Some of the rules we follow are: + +- Wrap JSDoc comments to 80 characters as well. +- Use `@param` and `@returns` in JSDoc comments. +- Use `@example` in JSDoc comments for examples. +- Use `@see` in JSDoc comments for references. +- Use `@category` and `@tags` in JSDoc comments for categorization. +- Each module file must begin with a `@module` doc comment. +- Internal modules and features can be commented with `@internal`. + +### Code of Conduct + +All contributors are expected to follow the guidelines outlined in our +[Code of Conduct](./CODE_OF_CONDUCT.md). Please report any unacceptable +behavior. + +### Testing + +Before submitting your pull request, make sure all tests pass: + +```bash +npm install +npm run test +``` + +## License + +By contributing to this project, you agree that your contributions will be +licensed under the [MIT License](https://nick.mit-license.org/2024). + +--- + +We appreciate your support and look forward to your contributions! + +
+ +**[MIT]** © **[Nicholas Berlette]**. All rights reserved. + +[GitHub] · [Issues] · [JSR] + +
+ +[MIT]: https://nick.mit-license.org "MIT © 2024+ Nicholas Berlette. All rights reserved." +[Nicholas Berlette]: https://github.com/nberlette "Nicholas Berlette on GitHub" +[GitHub]: https://github.com/nberlette/decorators#readme "Check out all the '@decorators/*' packages over at the GitHub monorepo!" +[Issues]: https://github.com/nberlette/decorators/issues "GitHub Issue Tracker for '@decorators/*' packages" +[Open an Issue]: https://github.com/nberlette/decorators/issues/new "Open an Issue on nberlette/decorators" +[JSR]: https://jsr.io/@decorators "View @decorators/* packages on JSR" +[Code of Conduct]: ./CODE_OF_CONDUCT.md "Code of Conduct" From 1e36de38abd4c96089250bcc8329b5dc445c0b72 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 09:32:53 +0000 Subject: [PATCH 21/40] docs(lru): update and improve readme --- packages/lru/README.md | 105 +++++++++++++++++++++++++++-------------- 1 file changed, 69 insertions(+), 36 deletions(-) diff --git a/packages/lru/README.md b/packages/lru/README.md index 2aca27a..1b01a8b 100644 --- a/packages/lru/README.md +++ b/packages/lru/README.md @@ -2,16 +2,17 @@ [@decorators/lru][JSR] -[![jsr-score][badge-jsr-score]][badge-jsr-score] -[![jsr-pkg][badge-jsr-pkg]][badge-jsr-pkg] - # [`@decorators/lru`][JSR] -#### _"Not your average memoization decorator."_ +Highly configurable. Strong types. Test-friendly. And really +fast. + +Compatible with Deno, Bun, Node, Cloudflare Workers, and +more. -##### Highly configurable. Strong types. Test-friendly. And really fast. +![jsr-score][badge-jsr-score] ![jsr-pkg][badge-jsr-pkg] -###### Compatible with Deno, Bun, Node, Cloudflare Workers, and more. +"Not your average memoization decorator." @@ -98,14 +99,14 @@ console.log(`Fibonacci(10): ${calc.fib(10)}`); > tool. But don't be fooled. The `@decorators/lru` package is far more powerful > than your typical simple memoization tool. -> Aside from supporting all the standard configurations/functionality one would -> come to expect in a tool like this, this package cranks up the heat with -> several distinct [features] of its own, putting it in a league of its own. - --- ## Features +Aside from supporting all the standard configurations/functionality one would +come to expect in a tool like this, this package cranks up the heat with several +distinct [features] of its own, putting it in a league of its own. + - **TypeScript-First**: Fully typed, well-documented API is a breeze to use. - **Flexible Caching**: Cache method return values with an LRU strategy (least recently used) based on the method's arguments at call time. @@ -125,14 +126,14 @@ console.log(`Fibonacci(10): ${calc.fib(10)}`); lifetimes to those of their associated class instance (and the class itself). - This prevents any cache from outliving the class it was created on. - _See the [storage API section](#storage-api) for a deep dive into this API._ -- **Dependency Injection**: Easily override[^1] internal components (e.g., the - LRU cache class, `Map`, `WeakMap`, `Date`). Designed with test-driven - development as a core focus. +- **Dependency Injection**: Easily override internal components (e.g., the LRU + cache class, `Map`, `WeakMap`, `Date`). Designed with test-driven development + as a core focus. [storage]: ./#storage-api "View the Storage API section" -[^1]: See the [storage API section](#storage-api) for more details, examples, - and a cautionary word of warning. +> See the [storage API section](#storage-api) for more details on Dependency +> Injection, the [overrides](#overrides) feature, and a cautionary warning. ### Eviction Strategies @@ -153,7 +154,7 @@ lingering in the cache for an extended period of time beyond their expiration time), the cache mechanism will now spawn (schedule) a dedicated eviction timer on all new cache entries. -> [!IMPORTANT] +> [!NOTE] > > Using active eviction with very large LRU caches, especially those that see a > significant level of churn, could potentially result in a performance hit due @@ -198,24 +199,39 @@ in improved memory usage, especially when caching large objects. ```ts type Keygen = (...args: Params) => CacheKey; - -// where -// Params extends Parameters, -// CacheKey extends string ``` +Describes a key generation function that takes the method arguments and returns +a cache key as a string. The default implementation uses `JSON.stringify`. + #### `Transform` ```ts -type Transform = ( +typ`e Transform = ( value: Input, key: CacheKey, entry: CacheEntry, ) => Output; ``` +Describes a transformation function that takes the cached value, the cache key, +and the cache entry as its arguments, and returns a transformed value. + +> [!NOTE] +> +> The type of the output value currently must be the same as that of the input +> value, due to design decisions made in the Decorators Proposal. +> +> This may change in the future, so this type accepts a second type parameter to +> specify separate input and output types, in case that becomes possible. + #### `Overrides` +Allows you to override the internal APIs used by the `@lru` decorator for more +advanced use cases, such as mocking and testing. This is an advanced feature +that should be used with caution. It ~~can~~ **_will_** lead to unexpected +behavior if it's not used correctly. + | Option | Type | Description | | --------- | -------------------- | ---------------------------------------------------------- | | `Map` | `MapLikeConstructor` | Override the `Map` constructor used for the LRU cache. | @@ -224,6 +240,14 @@ type Transform = ( | `Date` | `TimeProvider` | Override the `Date` constructor used for the TTL timer. | | `storage` | `CacheStorage` | Override the storage API used for the LRU cache. | + + +> [!WARNING] +> +> The `overrides` option is considered an expert feature and is not intended to +> be used lightly. **_Do not use this option_** if you do not know **exactly** +> what it does, what it _can_ do, and actually have a good reason to use it. + --- ## Examples @@ -259,9 +283,11 @@ class Calculator {
Advanced Keygens using CBOR for complex data
While the default keygen is sufficient for _most_ cases, occasionally it may be -necessary to use a keygen capable of handling complex data types. For example, -caching a method that expects a custom class instance for one or more of its -arguments will more than likely require a custom keygen to handle properly. +necessary to use a keygen capable of handling complex data types. + +For example, caching a method that expects a custom class instance for one or +more of its arguments will more than likely require a custom keygen to handle +properly. What happens if you don't use a custom keygen? You may end up with poor caching behavior, as `JSON.stringify` tends to serialize most of the objects it can't @@ -634,13 +660,7 @@ including: the native `WeakMap` with the `IterableWeakMap` from [`@iter/weak-map`], for inspecting the weakly-held cache entries). - - -> [!WARNING] -> -> The `overrides` option is considered an expert feature and is not intended to -> be used lightly. **Do _not_** use this unless you are absolutely sure you know -> exactly what this does, and actually have a good reason to use it. +> **See the [`Overrides` section](#overrides) for more details on this API.** ### Storage API @@ -707,11 +727,13 @@ logs to the console whenever a method is called.
-##### [MIT] © [Nicholas Berlette]. All rights reserved. +**[MIT]** © **[Nicholas Berlette]**. All rights reserved. -##### [GitHub] · [Issues] · [JSR] · [NPM] · [Docs] +[GitHub] · [Issues] · [JSR] · [Docs] -[![JSR][badge-jsr]][JSR] + + +![JSR][badge-jsr]
@@ -719,10 +741,21 @@ logs to the console whenever a method is called. [Nicholas Berlette]: https://github.com/nberlette/decorators#readme "View the @decorators monorepo on GitHub" [GitHub]: https://github.com/nberlette/decorators/tree/main/packages/lru#readme "View the @decorators/lru project on GitHub" [Issues]: https://github.com/nberlette/decorators/issues?q=is%3Aopen+is%3Aissue+lru "View issues for the @decorators/lru project on GitHub" -[JSR]: https://jsr.io/@decorators/lru/doc "View the @decorators/lru documentation on jsr.io" -[NPM]: https://www.npmjs.com/package/@decorators.ts/lru "View the @decorators/lru package on npm" +[JSR]: htps://jsr.io/@decorators/lru/doc "View the @decorators/lru documentation on jsr.io" [Docs]: https://jsr.io/@decorators/lru/doc "View the @decorators/lru documentation on jsr.io" [badge-jsr]: https://jsr.io/badges/@decorators "View all of the @decorators packages on jsr.io" [badge-jsr-pkg]: https://jsr.io/badges/@decorators/lru "View @decorators/lru on jsr.io" [badge-jsr-score]: https://jsr.io/badges/@decorators/lru/score "View the score for @decorators/lru on jsr.io" [`@iter/weak-map`]: https://jsr.io/@iter/weak-map "View the @iter/weak-map package on jsr.io" + +``` +``` + +``` +``` + +``` +``` + +``` +``` From 6f8b6abac97c24eeb379a97ef9d6838c1a29778a Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 09:33:18 +0000 Subject: [PATCH 22/40] fix(lru): add missing overrides entrypoint --- packages/lru/deno.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/lru/deno.json b/packages/lru/deno.json index 5ecabb4..2675c96 100644 --- a/packages/lru/deno.json +++ b/packages/lru/deno.json @@ -12,6 +12,7 @@ "./cache": "./src/lru_cache.ts", "./decorator": "./src/lru_decorator.ts", "./options": "./src/options.ts", + "./overrides": "./src/overrides.ts", "./types": "./src/types.ts" }, "imports": { From 00d4e471aa4b4333d5ceda878316e0c70b5db977 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 09:33:50 +0000 Subject: [PATCH 23/40] docs(lru): add module doc to main entrypoint --- packages/lru/mod.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/lru/mod.ts b/packages/lru/mod.ts index 272e7d3..062f8db 100644 --- a/packages/lru/mod.ts +++ b/packages/lru/mod.ts @@ -1,3 +1,6 @@ +/** + * @module lru + */ export * from "./src/lru_cache.ts"; export * from "./src/lru_decorator.ts"; export * from "./src/types.ts"; From a6589731fb6f9080027d34f5afb562a16d0412cd Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 09:34:11 +0000 Subject: [PATCH 24/40] fix(lru): add missing exports to root module --- packages/lru/mod.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/lru/mod.ts b/packages/lru/mod.ts index 062f8db..9985791 100644 --- a/packages/lru/mod.ts +++ b/packages/lru/mod.ts @@ -3,6 +3,8 @@ */ export * from "./src/lru_cache.ts"; export * from "./src/lru_decorator.ts"; +export * from "./src/overrides.ts"; +export * from "./src/options.ts"; export * from "./src/types.ts"; export { default } from "./src/lru_decorator.ts"; From 1d3182ff1fb1ba4e150e773df4f5f67dc3ee85b6 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 09:34:43 +0000 Subject: [PATCH 25/40] docs(lru): add all missing module docs --- packages/lru/src/lru_decorator.ts | 2 +- packages/lru/src/options.ts | 7 +++++++ packages/lru/src/overrides.ts | 11 +++++++++++ packages/lru/src/types.ts | 7 ++++++- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/lru/src/lru_decorator.ts b/packages/lru/src/lru_decorator.ts index 41c3dcc..24a621d 100644 --- a/packages/lru/src/lru_decorator.ts +++ b/packages/lru/src/lru_decorator.ts @@ -85,7 +85,7 @@ * await (await f.fetch("https://jsonplaceholder.typicode.com/posts/6")).json(); * console.log(performance.now() - a, "ms"); // ~200ms (re-cached) * ``` - * @module lru + * @module decorator */ import { type ClassMethod, diff --git a/packages/lru/src/options.ts b/packages/lru/src/options.ts index d7b06ab..e4e65a1 100644 --- a/packages/lru/src/options.ts +++ b/packages/lru/src/options.ts @@ -1,4 +1,11 @@ // deno-lint-ignore-file no-explicit-any +/** + * This module contains the types and interfaces used for configuring the + * options of the LRU cache decorator. + * + * @module options + */ + import type { Overrides } from "./overrides.ts"; import type { CacheEntry, CacheKey, ExtendedCacheEntry } from "./types.ts"; diff --git a/packages/lru/src/overrides.ts b/packages/lru/src/overrides.ts index 91f000f..e0e961b 100644 --- a/packages/lru/src/overrides.ts +++ b/packages/lru/src/overrides.ts @@ -1,3 +1,14 @@ +/** + * This module provides the types and default values for the custom overrides + * capability of the `@decorators/lru` library. It allows advanced users to + * customize the internal APIs used by the caching mechanisms, giving a much + * higher degree of flexibility and control over the caching behavior. + * + * This is especially useful for testing, where you might want to inject + * different implementations of the cache or storage mechanisms. + * + * @module overrides + */ import { LRU } from "./lru_cache.ts"; import type { CacheContainer, diff --git a/packages/lru/src/types.ts b/packages/lru/src/types.ts index 9bdff34..017d52c 100644 --- a/packages/lru/src/types.ts +++ b/packages/lru/src/types.ts @@ -1,5 +1,10 @@ // deno-lint-ignore-file no-explicit-any - +/** + * This module contains type definitions and interfaces used by the + * `@decorators/lru` library. + * + * @module types + */ const kCacheKey: unique symbol = Symbol("cacheKey"); type kCacheKey = typeof kCacheKey; From 7f16e8bb683d78802bb1f8a3818ae5c96be4b8b4 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 09:42:21 +0000 Subject: [PATCH 26/40] chore: bump @decorators/lru to 0.1.1 --- packages/lru/deno.json | 2 +- packages/lru/src/overrides.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/lru/deno.json b/packages/lru/deno.json index 2675c96..6947615 100644 --- a/packages/lru/deno.json +++ b/packages/lru/deno.json @@ -1,6 +1,6 @@ { "name": "@decorators/lru", - "version": "0.1.0", + "version": "0.1.1", "license": "MIT", "author": { "name": "Nicholas Berlette", diff --git a/packages/lru/src/overrides.ts b/packages/lru/src/overrides.ts index e0e961b..ff69b37 100644 --- a/packages/lru/src/overrides.ts +++ b/packages/lru/src/overrides.ts @@ -95,6 +95,6 @@ export const defaults = { Map: Map as MapLikeConstructor, Date: Date as TimeProvider, LRU: LRU as LruLikeConstructor, -} as const satisfies Required; +} as const; export default defaults; From 1851337f33a46ed29b1b2f3232c44f6a3dcc6bf5 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 01:49:21 -0800 Subject: [PATCH 27/40] fix(lru): fix typo in JSR links in README.md --- packages/lru/README.md | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/packages/lru/README.md b/packages/lru/README.md index 1b01a8b..bbad226 100644 --- a/packages/lru/README.md +++ b/packages/lru/README.md @@ -691,7 +691,6 @@ The general layout of the storage API is as follows: - Keys are generated by the `options.key` function.
Click here for a visual representation
-
```plaintext ╭╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╮ @@ -710,7 +709,6 @@ The general layout of the storage API is as follows: ╴╴ weakly-held ┉┉ strongly-held ━━ memoized ``` -
#### Overriding the Storage API @@ -733,29 +731,19 @@ logs to the console whenever a method is called. -![JSR][badge-jsr] +[![JSR][badge-jsr]][JSR] -
+
+ [MIT]: https://nick.mit-license.org/2024 "MIT © 2024-2025+ Nicholas Berlette et al. All rights reserved." [Nicholas Berlette]: https://github.com/nberlette/decorators#readme "View the @decorators monorepo on GitHub" [GitHub]: https://github.com/nberlette/decorators/tree/main/packages/lru#readme "View the @decorators/lru project on GitHub" [Issues]: https://github.com/nberlette/decorators/issues?q=is%3Aopen+is%3Aissue+lru "View issues for the @decorators/lru project on GitHub" -[JSR]: htps://jsr.io/@decorators/lru/doc "View the @decorators/lru documentation on jsr.io" +[JSR]: https://jsr.io/@decorators/lru/doc "View the @decorators/lru documentation on jsr.io" [Docs]: https://jsr.io/@decorators/lru/doc "View the @decorators/lru documentation on jsr.io" [badge-jsr]: https://jsr.io/badges/@decorators "View all of the @decorators packages on jsr.io" [badge-jsr-pkg]: https://jsr.io/badges/@decorators/lru "View @decorators/lru on jsr.io" [badge-jsr-score]: https://jsr.io/badges/@decorators/lru/score "View the score for @decorators/lru on jsr.io" [`@iter/weak-map`]: https://jsr.io/@iter/weak-map "View the @iter/weak-map package on jsr.io" -``` -``` - -``` -``` - -``` -``` - -``` -``` From fb7a14e407702b4484ab2d6f072aebcfc1da6f31 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 01:50:47 -0800 Subject: [PATCH 28/40] chore: bump @decorators/lru to 0.1.2 --- packages/lru/deno.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lru/deno.json b/packages/lru/deno.json index 6947615..7c55a9c 100644 --- a/packages/lru/deno.json +++ b/packages/lru/deno.json @@ -1,6 +1,6 @@ { "name": "@decorators/lru", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT", "author": { "name": "Nicholas Berlette", From 51748f8ddc88b67619b43d9909cea66ecf4ea477 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 09:56:53 +0000 Subject: [PATCH 29/40] fix(internal): remove @type/is dependency and restructure --- internal/mod.ts | 12 ++- internal/{ => src}/assert.ts | 16 ++-- internal/src/guards.ts | 147 ++++++++++++++++++++++++++++++++++ internal/{ => src}/helpers.ts | 3 + internal/{ => src}/types.ts | 33 +++++--- 5 files changed, 189 insertions(+), 22 deletions(-) rename internal/{ => src}/assert.ts (89%) create mode 100644 internal/src/guards.ts rename internal/{ => src}/helpers.ts (98%) rename internal/{ => src}/types.ts (93%) diff --git a/internal/mod.ts b/internal/mod.ts index 0827c1f..a850f7b 100644 --- a/internal/mod.ts +++ b/internal/mod.ts @@ -1,4 +1,8 @@ -export * from "./assert.ts"; -export * from "./helpers.ts"; -export type * from "./types.ts"; -export type { Is } from "./types.ts"; +/** + * @module internal + * @internal + */ +export * from "./src/assert.ts"; +export * from "./src/guards.ts"; +export * from "./src/helpers.ts"; +export * from "./src/types.ts"; diff --git a/internal/assert.ts b/internal/src/assert.ts similarity index 89% rename from internal/assert.ts rename to internal/src/assert.ts index 59e4d75..f87142a 100644 --- a/internal/assert.ts +++ b/internal/src/assert.ts @@ -1,6 +1,7 @@ -import { is } from "jsr:@type/is@0.1.0"; - -export * from "jsr:@type/is@0.1.0"; +/** + * @module assert + */ +import { isError } from "./guards.ts"; /** * Asserts that a given {@link condition} is met, and throws an error if not. @@ -19,9 +20,10 @@ export * from "jsr:@type/is@0.1.0"; * @param condition The condition to assert. * @param [message] An optional message or error object to provide more context * about the failure and the expected condition. - * @param [stackCrawlMark] An optional function reference to use as the starting - * point for the stack trace. Any stack frames above this function are omitted. - * If not provided, the `assert` function itself is used as the starting point. + * @param [stackCrawlMark] An optional function reference to use as the + * starting point for the stack trace. Any stack frames above this function are + * omitted. If not provided, the `assert` function itself is used as the + * starting point. * @throws If the condition is not met, an error is thrown with the provided * @example * ```ts @@ -70,7 +72,7 @@ export function assert( ErrorType: typeof Error = TypeError, ): asserts condition { if (!condition) { - const error = is.error(message) ? message : new ErrorType( + const error = isError(message) ? message : new ErrorType( message ?? "Assertion failed. No additional context provided.", ); Error.captureStackTrace?.(error, stackCrawlMark ?? assert); diff --git a/internal/src/guards.ts b/internal/src/guards.ts new file mode 100644 index 0000000..54d6ce0 --- /dev/null +++ b/internal/src/guards.ts @@ -0,0 +1,147 @@ +// deno-lint-ignore-file ban-types +/** + * @module guards + */ +import type { unknowns } from "./types.ts"; + +const toString = globalThis.Object.prototype.toString; +const Symbol: typeof globalThis.Symbol = globalThis.Symbol; +const SymbolToStringTag: typeof Symbol.toStringTag = Symbol.toStringTag; + +export function isObject(it: unknown): it is object { + return typeof it === "object" && it !== null; +} + +export function isFunction(it: unknown): it is Function { + return typeof it === "function"; +} + +/** + * Checks if the given value appears to be an object or function with the + * expected `Object.prototype.toString` tag. This can be produced either + * by a `Symbol.toStringTag` value, or internally by the JavaScript engine. + * + * This guard makes no attempts to verify the provenance or origin of the + * tag value, it simply verifies that the value produces the expected tag. + * + * @param it The value to check. + * @param tag The expected `Object.prototype.toString` tag (without `[object`, `]`). + * @returns `true` if the value appears to be an object or function with the + * expected `Object.prototype.toString` tag. + * @example + * ```ts + * isTagged(new Error(), "Error"); // true + * isTagged(new Array(), "Array"); // true + * isTagged(new Map(), "Map"); // true + * isTagged(new Set(), "Set"); // true + * isTagged(new WeakMap(), "WeakMap"); // true + * isTagged(new WeakSet(), "WeakSet"); // true + * isTagged(new Date(), "Date"); // true + * ``` + */ +export function isTagged( + it: unknown, + tag: T, +): it is { [Symbol.toStringTag]: T } { + return (isObject(it) || isFunction(it)) && + toString.call(it) === `[object ${tag}]`; +} + +/** + * Checks if the given value appears to be a native object with the given tag, + * such as `Error`, `Array`, `Arguments`, etc. + * + * This builds on the `isTagged` function (which simply checks if a value is an + * object/function that produces the expected `Object.prototype.toString` tag), + * and adds an additional refinement step to verify that it does not have any + * `Symbol.toStringTag` property. Only native objects are capable of producing + * a custom `toStringTag` value without having a `Symbol.toStringTag` somewhere + * in their prototype chain. + * + * @param it The value to check. + * @param tag The expected `Object.prototype.toString` tag (without `[object`, + * `]`). + * @returns `true` if the value appears to be a native object with the given + * tag. + * @example + * ```ts + * isTaggedNative(new Error(), "Error"); // true + * isTaggedNative(new Array(), "Array"); // true + * + * // despite being a native object, `Map` defines a `Symbol.toStringTag`: + * isTaggedNative(new Map(), "Map"); // false + * + * (function foo(){ + * // simple way to validate for an `Arguments` implementation: + * console.assert(isTaggedNative(arguments, "Arguments")); + * })() + * ``` + */ +export function isTaggedNative( + it: unknown, + tag: Tag, +): it is T & { [Symbol.toStringTag]?: never } { + return isTagged(it, tag) && typeof it[SymbolToStringTag] === "undefined"; +} + +/** + * Checks if the given value appears to be a native `Error` object. + */ +export function isNativeError(x: unknown): x is Error { + if ("isError" in Error && isFunction(Error.isError)) return Error.isError(x); + return isTaggedNative(x, "Error"); +} + +/** + * Checks if the given value appears to be an `Error` object. + * + * This is a more permissive check than `isNativeError`, which only checks for + * native `Error` objects. This will also return true for any object that + * inherits from `Error`, including custom error classes. + * + * @param it The value to check. + * @returns `true` if the value appears to be an `Error` object. + */ +export function isError(it: unknown): it is Error { + return isNativeError(it) || (isObject(it) && it instanceof Error); +} + +/** + * Checks if the given value appears to be a native `Array` object. + * + * This is a more permissive check than `isTagged`, which only checks for + * native `Array` objects. This will also return true for any object that + * inherits from `Array`, including custom array-like classes. + * + * @param it The value to check. + * @returns `true` if the value appears to be an `Array` object. + */ +export function isArray(it: unknown): it is unknown[]; +export function isArray(it: ArrayLike | unknowns): it is T[]; +export function isArray( + it: ArrayLike | unknowns, + test: (it: unknown) => it is T, +): it is T[]; +export function isArray( + it: unknown, + test?: (it: unknown) => it is T, +): it is T[]; +export function isArray( + it: unknown, + test?: (it: unknown) => it is T, +): it is T[] { + if (isTaggedNative(it, "Array")) { + if (typeof test === "function") { + const a = it as ArrayLike; + for (let i = 0; i < a.length; i++) { + if (!test(a[i])) return false; + } + } + return true; + } + return false; +} + +export function isArguments(it: unknown): it is IArguments { + return isTaggedNative(it, "Arguments"); +} diff --git a/internal/helpers.ts b/internal/src/helpers.ts similarity index 98% rename from internal/helpers.ts rename to internal/src/helpers.ts index d007437..6cbc307 100644 --- a/internal/helpers.ts +++ b/internal/src/helpers.ts @@ -1,3 +1,6 @@ +/** + * @module helpers + */ import { assert } from "./assert.ts"; /** diff --git a/internal/types.ts b/internal/src/types.ts similarity index 93% rename from internal/types.ts rename to internal/src/types.ts index 995dd93..d46c727 100644 --- a/internal/types.ts +++ b/internal/src/types.ts @@ -161,9 +161,8 @@ export type AbstractConstructor< export type Constructor< T = any, A extends readonly unknown[] = readonly any[], -> = { - new (...args: A): T; -}; +> // @ts-ignore easter egg + = new (this: "whoa bro wtfydlol", ...args: A) => T; export type Class< Prototype extends object | null = any, @@ -320,6 +319,23 @@ export type PropertyKeys = strings | numbers | symbols; export type { PropertyKeys as properties }; +/** + * Equivalent to the builtin `unknown` type, but supports usage in places where + * `unknown` would "poison" the type, widening it into `unknown`. + * + * For example, if you use `unknown` in any union, it automatically becomes + * `unknown`. This is a bit of a nuisance with generic type parameters, where + * sometimes you want to say that you don't know what the type is exactly, but + * you do know what a couple possibilities are. + * + * That's exactly what this type is for. It can be used as a constituent of any + * union and it will not widen that union to `unknown`. If it's intersected + * with another type, it will behave just like the real `unknown`, which is to + * say it will effectively do nothing, and resolve to the other member it is + * being intersected with. + */ +export type unknowns = {} | null | undefined; + /** * Represents a type that is the union of the values of an object `T`. */ @@ -366,20 +382,15 @@ export type OptionalParametersOf< : Fallback; type OptionalParametersOfWorker = - A extends readonly [infer F, ...infer R] - ? IsEqual< + A extends readonly [infer F, ...infer R] ? IsEqual< Exclude, F, OptionalParametersOfWorker, [F, ...OptionalParametersOfWorker] > - : A; - -type OptionalParamsTest1 = OptionalParametersOf<{ - (a: null, c?: boolean | undefined): void; -}>; + : A; -type IsEqual = +export type IsEqual = (() => T extends A ? 1 : 2) extends () => T extends B ? 1 : 2 ? True : False; From d135facc207df2748ba66cbf8b0a304c71d680d7 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 09:58:08 +0000 Subject: [PATCH 30/40] fix(internal): remove leftover piece of stupidity :D --- internal/src/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/src/types.ts b/internal/src/types.ts index d46c727..f286f2c 100644 --- a/internal/src/types.ts +++ b/internal/src/types.ts @@ -162,7 +162,7 @@ export type Constructor< T = any, A extends readonly unknown[] = readonly any[], > // @ts-ignore easter egg - = new (this: "whoa bro wtfydlol", ...args: A) => T; + = new (...args: A) => T; export type Class< Prototype extends object | null = any, From b2a623913ff9245bc63aa3d886c2c3f1886f60d7 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 09:58:34 +0000 Subject: [PATCH 31/40] chore(internal): update license to 2025 --- internal/LICENSE | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/internal/LICENSE b/internal/LICENSE index c34c878..85edf02 100644 --- a/internal/LICENSE +++ b/internal/LICENSE @@ -1,21 +1,20 @@ MIT License -Copyright (c) 2024 Nicholas Berlette (https://github.com/nberlette) +Copyright (c) 2024-2025+ Nicholas Berlette (https://github.com/nberlette) -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From fe4671e3ff32409d52037ffce6bddf87c4f6246c Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Fri, 7 Mar 2025 09:59:12 +0000 Subject: [PATCH 32/40] chore(internal): update deno.json + bump version --- internal/deno.json | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/internal/deno.json b/internal/deno.json index 0885678..529a4e6 100644 --- a/internal/deno.json +++ b/internal/deno.json @@ -1,13 +1,17 @@ { "name": "@decorators/internal", - "version": "0.1.2", + "version": "0.2.0", + "license": "MIT", + "author": { + "name": "Nicholas Berlette", + "email": "nick@berlette.com", + "url": "https://github.com/nberlette/decorators" + }, "exports": { ".": "./mod.ts", - "./assert": "./assert.ts", - "./helpers": "./helpers.ts", - "./types": "./types.ts" - }, - "publish": { - "include": ["*.ts", "*.json", "*.md", "LICENSE"] + "./assert": "./src/assert.ts", + "./guards": "./src/guards.ts", + "./helpers": "./src/helpers.ts", + "./types": "./src/types.ts" } } From 2505d1216368e88123885b650cfdadaa786ef2c1 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Sun, 9 Mar 2025 22:15:37 +0000 Subject: [PATCH 33/40] config(devcontainer): add Dockerfile --- .devcontainer/Dockerfile | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .devcontainer/Dockerfile diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..ab4420d --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,36 @@ +ARG VARIANT=bullseye +FROM --platform=linux/amd64 mcr.microsoft.com/vscode/devcontainers/base:0-${VARIANT} + +ARG DEBIAN_FRONTEND=noninteractive + +RUN /bin/bash -c "$(curl -fsSL https://deno.land/install.sh)" + +RUN sudo apt-get -y update \ + && sudo apt-get -y install --no-install-recommends gcc git-extras \ + && sudo apt-get -y upgrade \ + && sudo rm -rf /var/lib/apt/lists/* + +# default preset used for the starship terminal prompt. +# acceptable values are "bracketed-segments", "gruvbox-rainbow", "jetpack", "nerd-font-symbols", "no-empty-icons", "no-nerd-font", "no-runtime-versions", "pastel-powerline", "plain-text-symbols", "pure-preset", "tokyo-night" +ENV STARSHIP_PRESET="gruvbox-rainbow" HOME=/home/${USER:-vscode} + +# add some extensions to the bottom of the .bashrc file, to ensure homebrew is +# configured correctly, install the starship CLI (if needed), and configure its +# preset configuration if none is defined yet. also adds a couple aliases. +RUN cat <<-'__END__' >> ${HOME}/.bashrc \ + if [[ ":$PATH:" != *":$HOMEBREW_PREFIX:"* ]]; then \ + export PATH="$HOMEBREW_PREFIX/bin:$PATH"; \ + eval "$(brew shellenv)"; \ + fi \ + command -v starship &>/dev/null \ + || brew install starship &>/dev/null; \ + eval "$(starship init bash)"; \ + [ -f "$HOME/.config/starship.toml" ] \ + || starship preset '${STARSHIP_PRESET-}' -o $HOME/.config/starship.toml; \ + alias ll="ls -AlhFo --color=auto --si --group-directories-first --time-style=long-iso --file-type"; \ + alias dq="deno repl -qA --v8-flags=--expose-gc,--harmony"; \ + alias d="deno"; \ +__END__ + +RUN sudo mkdir -p /etc/bash_completion.d \ + && deno completions bash > /etc/bash_completion.d/deno.bash From 8d641dc0d6ab214c369b9fc025da85abcfce7826 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Sun, 9 Mar 2025 22:16:11 +0000 Subject: [PATCH 34/40] refactor(devcontainer): update devcontainer.json config --- .devcontainer/devcontainer.json | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 9ae5432..d476e54 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -12,8 +12,7 @@ "ghcr.io/devcontainers/features/github-cli:1": {}, "ghcr.io/devcontainers-contrib/features/act:1": {}, "ghcr.io/devcontainers-contrib/features/actionlint:1": {}, - "ghcr.io/prulloac/devcontainer-features/deno:1": {}, - "ghcr.io/deep-space-cartel/devcontainers-features/starship:1": {} + "ghcr.io/prulloac/devcontainer-features/deno:1": {} }, "updateRemoteUserUID": true, // settings for the vscode editor @@ -27,16 +26,15 @@ "vscode": { "settings": { "deno.enable": true, - "deno.future": true, // TODO(nberlette): remove once deno 2.0 lands "deno.lint": true, "deno.codeLens.test": true, "deno.cacheOnSave": true, - "deno.codeLens.testArgs": ["-A", "--no-check=remote", "--parallel", "--clean", "--doc"], + "deno.codeLens.testArgs": ["-A", "--no-check=remote", "--parallel", "--clean", "--doc", "--permit-no-files", "--coverage=.coverage", "--hide-stacktraces"], "editor.tabSize": 2, "editor.stickyTabStops": true, "editor.linkedEditing": true, "editor.minimap.enabled": false, - "[typescript][typescriptreact][javascript][javascriptreact][json][jsonc][markdown]": { + "[typescript][typescriptreact][javascript][javascriptreact][json][jsonc][markdown][html][css][vue][svelte][astro][njk][handlebars][yaml]": { "editor.defaultFormatter": "denoland.vscode-deno", "editor.formatOnPaste": false, "editor.formatOnSave": true From ccd4e820422a74af3d6481abfbe33f7660be20fc Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Mon, 10 Mar 2025 02:49:29 +0000 Subject: [PATCH 35/40] fix(devcontainer): maybe this time it will actually work --- .devcontainer/Dockerfile | 34 +++++++-------------------------- .devcontainer/devcontainer.json | 30 ++++++++++------------------- 2 files changed, 17 insertions(+), 47 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index ab4420d..cf9d0a5 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -3,34 +3,14 @@ FROM --platform=linux/amd64 mcr.microsoft.com/vscode/devcontainers/base:0-${VARI ARG DEBIAN_FRONTEND=noninteractive -RUN /bin/bash -c "$(curl -fsSL https://deno.land/install.sh)" +# install deno +ENV DENO_INSTALL=/usr/local +RUN /bin/bash -c "$(curl -fsSL https://deno.land/install.sh)" \ + && chown ${USER:-vscode} /usr/local/bin/deno +# update system packages, install gcc and git-extras, cleanup cache RUN sudo apt-get -y update \ && sudo apt-get -y install --no-install-recommends gcc git-extras \ - && sudo apt-get -y upgrade \ - && sudo rm -rf /var/lib/apt/lists/* + && sudo apt-get -y upgrade && sudo rm -rf /var/lib/apt/lists/* -# default preset used for the starship terminal prompt. -# acceptable values are "bracketed-segments", "gruvbox-rainbow", "jetpack", "nerd-font-symbols", "no-empty-icons", "no-nerd-font", "no-runtime-versions", "pastel-powerline", "plain-text-symbols", "pure-preset", "tokyo-night" -ENV STARSHIP_PRESET="gruvbox-rainbow" HOME=/home/${USER:-vscode} - -# add some extensions to the bottom of the .bashrc file, to ensure homebrew is -# configured correctly, install the starship CLI (if needed), and configure its -# preset configuration if none is defined yet. also adds a couple aliases. -RUN cat <<-'__END__' >> ${HOME}/.bashrc \ - if [[ ":$PATH:" != *":$HOMEBREW_PREFIX:"* ]]; then \ - export PATH="$HOMEBREW_PREFIX/bin:$PATH"; \ - eval "$(brew shellenv)"; \ - fi \ - command -v starship &>/dev/null \ - || brew install starship &>/dev/null; \ - eval "$(starship init bash)"; \ - [ -f "$HOME/.config/starship.toml" ] \ - || starship preset '${STARSHIP_PRESET-}' -o $HOME/.config/starship.toml; \ - alias ll="ls -AlhFo --color=auto --si --group-directories-first --time-style=long-iso --file-type"; \ - alias dq="deno repl -qA --v8-flags=--expose-gc,--harmony"; \ - alias d="deno"; \ -__END__ - -RUN sudo mkdir -p /etc/bash_completion.d \ - && deno completions bash > /etc/bash_completion.d/deno.bash +RUN echo 'PATH="$HOMEBREW_PREFIX/bin:$PATH"; eval "$(brew shellenv 2>/dev/null)"; if command -v starship &>/dev/null || brew install starship 2>/dev/null; then eval "$(starship init bash)"; fi;' >> /home/${USER:-vscode}/.bashrc diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index d476e54..4f238c0 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,44 +1,31 @@ { "name": "@decorators", - // "dockerFile": "Dockerfile", + "dockerFile": "Dockerfile", "remoteUser": "vscode", "features": { - // the basics "git": "latest", "sshd": "latest", "node": "latest", - // homebrew - "ghcr.io/meaningful-ooo/devcontainer-features/homebrew:2": {}, "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/meaningful-ooo/devcontainer-features/homebrew:2": {}, "ghcr.io/devcontainers-contrib/features/act:1": {}, - "ghcr.io/devcontainers-contrib/features/actionlint:1": {}, - "ghcr.io/prulloac/devcontainer-features/deno:1": {} + "ghcr.io/devcontainers-contrib/features/actionlint:1": {} }, - "updateRemoteUserUID": true, // settings for the vscode editor "customizations": { - "codespaces": { - "openFiles": [ - "README.md", - "deno.json" - ] - }, "vscode": { "settings": { "deno.enable": true, "deno.lint": true, "deno.codeLens.test": true, "deno.cacheOnSave": true, - "deno.codeLens.testArgs": ["-A", "--no-check=remote", "--parallel", "--clean", "--doc", "--permit-no-files", "--coverage=.coverage", "--hide-stacktraces"], "editor.tabSize": 2, "editor.stickyTabStops": true, "editor.linkedEditing": true, "editor.minimap.enabled": false, - "[typescript][typescriptreact][javascript][javascriptreact][json][jsonc][markdown][html][css][vue][svelte][astro][njk][handlebars][yaml]": { - "editor.defaultFormatter": "denoland.vscode-deno", - "editor.formatOnPaste": false, - "editor.formatOnSave": true - } + "editor.defaultFormatter": "denoland.vscode-deno", + "editor.formatOnPaste": false, + "editor.formatOnSave": true }, "extensions": [ "github.theme", @@ -46,11 +33,14 @@ "github.copilot", "denoland.vscode-deno", "editorconfig.editorconfig", + "vsls-contrib.gistfs", "redhat.vscode-yaml", + "antfu.browse-lite", "bierner.markdown-preview-github-styles", "mutantdino.resourcemonitor" ] } }, - "updateContentCommand": "deno upgrade --canary --force 2>&1" + "postCreateCommand": "if command -v deno &>/dev/null; then\ndeno upgrade --canary;\ndeno completions bash > /etc/bash_completion.d/deno.bash; fi;", + "postAttachCommand": ". /home/vscode/.bashrc" } From 429e2f78c5eed626a91e3ee43007b54b1ca37f1f Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Mon, 10 Mar 2025 06:22:46 +0000 Subject: [PATCH 36/40] chore(*): bump copyright year in all licenses --- LICENSE | 27 +++++++++++++-------------- packages/alias/LICENSE | 27 +++++++++++++-------------- packages/bind/LICENSE | 27 +++++++++++++-------------- packages/lru/LICENSE | 2 +- 4 files changed, 40 insertions(+), 43 deletions(-) diff --git a/LICENSE b/LICENSE index 56ea05a..232649a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,20 @@ -MIT License +The MIT License (MIT) -Copyright (c) 2024 Nicholas Berlette (https://github.com/nberlette) +Copyright (c) 2024-2025 Nicholas Berlette (https://github.com/nberlette) -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/alias/LICENSE b/packages/alias/LICENSE index c34c878..232649a 100644 --- a/packages/alias/LICENSE +++ b/packages/alias/LICENSE @@ -1,21 +1,20 @@ -MIT License +The MIT License (MIT) -Copyright (c) 2024 Nicholas Berlette (https://github.com/nberlette) +Copyright (c) 2024-2025 Nicholas Berlette (https://github.com/nberlette) -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/bind/LICENSE b/packages/bind/LICENSE index c34c878..232649a 100644 --- a/packages/bind/LICENSE +++ b/packages/bind/LICENSE @@ -1,21 +1,20 @@ -MIT License +The MIT License (MIT) -Copyright (c) 2024 Nicholas Berlette (https://github.com/nberlette) +Copyright (c) 2024-2025 Nicholas Berlette (https://github.com/nberlette) -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/lru/LICENSE b/packages/lru/LICENSE index 3177dfe..89967cc 100644 --- a/packages/lru/LICENSE +++ b/packages/lru/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2025 Nicholas Berlette (https://github.com/nberlette/decorators) +Copyright (c) 2025 Nicholas Berlette (https://github.com/nberlette) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in From 9e885903758ae2d5ea6ee19932bb07e8541c5fa6 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Mon, 10 Mar 2025 06:57:39 +0000 Subject: [PATCH 37/40] fix(bind): remove hard-coded jsr specifier --- packages/bind/mod.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bind/mod.ts b/packages/bind/mod.ts index b7c379a..49d9b3a 100644 --- a/packages/bind/mod.ts +++ b/packages/bind/mod.ts @@ -75,7 +75,7 @@ import { assert, setFunctionProperties, -} from "jsr:@decorators/internal@^0.1.1"; +} from "@decorators/internal"; /** * Stage 3 Decorator to bind a class method to its instance or constructor, From 8bf1d2127b8f6808fd00ea5d1d00e41924a89736 Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Mon, 10 Mar 2025 06:58:30 +0000 Subject: [PATCH 38/40] chore(bind): fmt --- packages/bind/mod.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/bind/mod.ts b/packages/bind/mod.ts index 49d9b3a..2652431 100644 --- a/packages/bind/mod.ts +++ b/packages/bind/mod.ts @@ -72,10 +72,7 @@ * console.log(example.value); // ✔️ no error * ``` */ -import { - assert, - setFunctionProperties, -} from "@decorators/internal"; +import { assert, setFunctionProperties } from "@decorators/internal"; /** * Stage 3 Decorator to bind a class method to its instance or constructor, From 568f3a6aae5b7f2684c89571015bc8428e9bd57c Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Mon, 10 Mar 2025 06:59:15 +0000 Subject: [PATCH 39/40] chore(bind): fmt readme, update deno.json --- packages/bind/README.md | 6 +++--- packages/bind/deno.json | 11 ++++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/bind/README.md b/packages/bind/README.md index 40f48eb..8baffb0 100644 --- a/packages/bind/README.md +++ b/packages/bind/README.md @@ -192,10 +192,10 @@ export function bind( #### Parameters -| Name | Info | -| :------------ | :-------------------------------------------------------------- | +| Name | Info | +| :------------ | :------------------------------------------------------------------ | | **`getter`** | The target **getter** to bind to the class instance or constructor. | -| **`context`** | The getter-specific decorator context object. | +| **`context`** | The getter-specific decorator context object. | #### Returns diff --git a/packages/bind/deno.json b/packages/bind/deno.json index 1ec9a3c..b9c8dd3 100644 --- a/packages/bind/deno.json +++ b/packages/bind/deno.json @@ -1,9 +1,14 @@ { "name": "@decorators/bind", "version": "0.1.2", + "license": "MIT", + "author": { + "name": "Nicholas Berlette", + "email": "nick@berlette.com", + "url": "https://github.com/nberlette/decorators" + }, "exports": "./mod.ts", - "publish": { - "include": ["*.ts", "*.md", "*.json", "LICENSE"], - "exclude": ["*.test.*"] + "imports": { + "@decorators/internal": "jsr:@decorators/internal@^0.2.0" } } From 249f137857254ac6f1c64be27b7ee3e283a611ba Mon Sep 17 00:00:00 2001 From: Nicholas Berlette Date: Mon, 10 Mar 2025 07:06:30 +0000 Subject: [PATCH 40/40] chore(bind): bump version to 0.2.0 --- packages/bind/deno.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bind/deno.json b/packages/bind/deno.json index b9c8dd3..94e1a25 100644 --- a/packages/bind/deno.json +++ b/packages/bind/deno.json @@ -1,6 +1,6 @@ { "name": "@decorators/bind", - "version": "0.1.2", + "version": "0.2.0", "license": "MIT", "author": { "name": "Nicholas Berlette",