├── .changeset ├── README.md └── config.json ├── .github └── workflows │ ├── main.yaml │ └── release.yaml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── CHANGELOG.md ├── LICENSE ├── README.md ├── docker-compose.yml ├── example ├── Database.d.ts ├── collections.json └── index.ts ├── package.json ├── pnpm-lock.yaml ├── src ├── client.ts ├── codegen │ ├── ambient.d.ts │ ├── cli.ts │ ├── index.ts │ └── types.ts ├── filter.ts ├── index.ts ├── select.ts ├── sort.ts └── types.ts ├── tsconfig.json └── tsup.config.ts /.changeset/README.md: -------------------------------------------------------------------------------- 1 | # Changesets 2 | 3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works 4 | with multi-package repos, or single-package repos to help you version and publish your code. You can 5 | find the full documentation for it [in our repository](https://github.com/changesets/changesets) 6 | 7 | We have a quick list of common questions to get you started engaging with this project in 8 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) 9 | -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json", 3 | "changelog": "@changesets/cli/changelog", 4 | "commit": false, 5 | "fixed": [], 6 | "linked": [], 7 | "access": "public", 8 | "baseBranch": "main", 9 | "updateInternalDependencies": "patch", 10 | "ignore": [] 11 | } 12 | -------------------------------------------------------------------------------- /.github/workflows/main.yaml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: 3 | push: 4 | branches: 5 | - '**' 6 | 7 | # cancel in-progress runs on new commits to same PR (gitub.event.number) 8 | concurrency: 9 | group: ${{ github.workflow }}-${{ github.event.number || github.sha }} 10 | cancel-in-progress: true 11 | 12 | permissions: 13 | contents: read # to fetch code (actions/checkout) 14 | 15 | jobs: 16 | build: 17 | runs-on: ubuntu-latest 18 | steps: 19 | - uses: actions/checkout@v3 20 | - uses: pnpm/action-setup@v2 21 | with: 22 | version: 8 23 | 24 | - uses: actions/setup-node@v3 25 | with: 26 | node-version: 20.x 27 | cache: pnpm 28 | 29 | - run: pnpm install --frozen-lockfile 30 | - run: pnpm run lint 31 | - run: pnpm run build 32 | -------------------------------------------------------------------------------- /.github/workflows/release.yaml: -------------------------------------------------------------------------------- 1 | name: Release 2 | on: 3 | push: 4 | branches: 5 | - 'main' 6 | workflow_dispatch: 7 | 8 | concurrency: ${{ github.workflow }}-${{ github.ref }} 9 | 10 | permissions: {} 11 | 12 | jobs: 13 | release: 14 | # prevents this action from running on forks 15 | if: github.repository == 'david-plugge/typed-pocketbase' 16 | permissions: 17 | contents: write # to create release (changesets/action) 18 | pull-requests: write # to create pull request (changesets/action) 19 | runs-on: ubuntu-latest 20 | steps: 21 | - uses: actions/checkout@v3 22 | - uses: pnpm/action-setup@v2 23 | with: 24 | version: 8 25 | 26 | - name: Set up Node 27 | uses: actions/setup-node@v3 28 | with: 29 | node-version: 20.x 30 | cache: pnpm 31 | 32 | - run: | 33 | pnpm install --frozen-lockfile 34 | pnpm run build 35 | 36 | - name: Create a release 37 | id: changesets 38 | uses: changesets/action@v1 39 | with: 40 | version: pnpm ci:version 41 | commit: 'chore: update version' 42 | title: 'chore: update version' 43 | publish: pnpm ci:release 44 | env: 45 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 46 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 47 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | CHANGELOG.md 6 | 7 | # Ignore files for PNPM, NPM and YARN 8 | pnpm-lock.yaml 9 | package-lock.json 10 | yarn.lock 11 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 80, 6 | "tabWidth": 4 7 | } 8 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # typed-pocketbase 2 | 3 | ## 0.1.1 4 | 5 | ### Patch Changes 6 | 7 | - 65ca205: Add main field to package.json 8 | 9 | ## 0.1.0 10 | 11 | ### Minor Changes 12 | 13 | - f462286: custom client 14 | 15 | ### Patch Changes 16 | 17 | - f462286: fix sort param parsing 18 | - f462286: correctly type empty select 19 | - f462286: fix filters 20 | - f462286: realtime support 21 | - f462286: remove cjs bundle 22 | - f462286: only expose supported types for subscribe options 23 | - f462286: account for plural relations 24 | - f462286: allow deleting files by providing null as value 25 | - f462286: make password and passwordConfirm optional on update 26 | - f462286: expand can be undefined 27 | 28 | ## 0.1.0-pre.7 29 | 30 | ### Patch Changes 31 | 32 | - allow deleting files by providing null as value 33 | 34 | ## 0.1.0-pre.6 35 | 36 | ### Patch Changes 37 | 38 | - make password and passwordConfirm optional on update 39 | 40 | ## 0.1.0-pre.5 41 | 42 | ### Patch Changes 43 | 44 | - fix filters 45 | 46 | ## 0.1.0-pre.4 47 | 48 | ### Patch Changes 49 | 50 | - account for plural relations 51 | 52 | ## 0.1.0-pre.3 53 | 54 | ### Patch Changes 55 | 56 | - fix sort param parsing 57 | 58 | ## 0.1.0-pre.2 59 | 60 | ### Patch Changes 61 | 62 | - only expose supported types for subscribe options 63 | 64 | ## 0.1.0-pre.1 65 | 66 | ### Patch Changes 67 | 68 | - realtime support 69 | - remove cjs bundle 70 | - expand can be undefined 71 | 72 | ## 0.1.0-pre.0 73 | 74 | ### Minor Changes 75 | 76 | - custom client 77 | 78 | ## 0.0.9 79 | 80 | ### Patch Changes 81 | 82 | - 670ea7b: test version 83 | 84 | ## 0.0.9-next.0 85 | 86 | ### Patch Changes 87 | 88 | - 2530dd0: test version 89 | 90 | ## 0.0.8 91 | 92 | ### Patch Changes 93 | 94 | - bbadb7c: Fix: Filter with empty and()/or() results in Invalid filter parameters. 95 | 96 | ## 0.0.7 97 | 98 | ### Patch Changes 99 | 100 | - 3c875d8: add shebang 101 | 102 | ## 0.0.6 103 | 104 | ### Patch Changes 105 | 106 | - 4b59926: fix multiple field type 107 | 108 | ## 0.0.5 109 | 110 | ### Patch Changes 111 | 112 | - 19bce54: fix multiple relation type generation 113 | 114 | ## 0.0.4 115 | 116 | ### Patch Changes 117 | 118 | - 7aa71f3: support json fields and Date and URL objects 119 | - 0a96bf9: allow Date type for date fields 120 | 121 | ## 0.0.3 122 | 123 | ### Patch Changes 124 | 125 | - dd52f65: rework codegen cli and support all field types and modifiers 126 | - 4201a28: export TypedRecord 127 | - 5b60b0c: fix entrypoints and file thumbs type when none are specified 128 | - 376dc88: Add expand and nested filter support 129 | 130 | ## 0.0.3-next.3 131 | 132 | ### Patch Changes 133 | 134 | - rework codegen cli and support all field types and modifiers 135 | 136 | ## 0.0.3-next.2 137 | 138 | ### Patch Changes 139 | 140 | - export TypedRecord 141 | 142 | ## 0.0.3-next.1 143 | 144 | ### Patch Changes 145 | 146 | - fix entrypoints and file thumbs type when none are specified 147 | 148 | ## 0.0.3-next.0 149 | 150 | ### Patch Changes 151 | 152 | - Add expand and nested filter support 153 | 154 | ## 0.0.2 155 | 156 | ### Patch Changes 157 | 158 | - 957d47a: fix export type issue 159 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 David Plugge 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # typed-pocketbase 2 | 3 | [![npm](https://img.shields.io/npm/v/typed-pocketbase)](https://www.npmjs.com/package/typed-pocketbase) 4 | ![GitHub top language](https://img.shields.io/github/languages/top/david-plugge/typed-pocketbase) 5 | ![GitHub Workflow Status (with branch)](https://img.shields.io/github/actions/workflow/status/david-plugge/typed-pocketbase/main.yaml?branch=main) 6 | 7 | Add types to the [PocketBase JavaScript SDK](https://github.com/pocketbase/js-sdk). 8 | 9 | ## Installation 10 | 11 | ```bash 12 | # npm 13 | npm i typed-pocketbase 14 | 15 | # pnpm 16 | pnpm i typed-pocketbase 17 | 18 | # yarn 19 | yarn add typed-pocketbase 20 | ``` 21 | 22 | ## Usage 23 | 24 | Generate the types: 25 | 26 | ```bash 27 | npx typed-pocketbase --email admin@mail.com --password supersecretpassword -o Database.d.ts 28 | ``` 29 | 30 | The codegen tool will look for `POCKETBASE_EMAIL` and `POCKETBASE_PASSWORD` environment variables if the email or password are not passed using cli options. 31 | 32 | Create a PocketBase client: 33 | 34 | ```ts 35 | import PocketBase from 'pocketbase'; 36 | import { TypedPocketBase } from 'typed-pocketbase'; 37 | import { Schema } from './Database'; 38 | 39 | const db = new TypedPocketBase('http://localhost:8090'); 40 | ``` 41 | 42 | Enjoy full type-safety: 43 | 44 | ```ts 45 | import { neq } from 'typed-pocketbase'; 46 | 47 | db.from('posts').getFullList({ 48 | select: { 49 | id: true, 50 | title: true, 51 | content: true, 52 | expand: { 53 | owner: { 54 | username: true 55 | } 56 | } 57 | } 58 | sort: '-date', 59 | filter: neq('content', '') 60 | }); 61 | ``` 62 | 63 | ## Selecting fields 64 | 65 | ```ts 66 | const showId = Math.random() < 0.5; 67 | 68 | db.from('posts').getFullList({ 69 | select: { 70 | id: showId, 71 | title: true, 72 | content: true 73 | } 74 | }); 75 | ``` 76 | 77 | ## Filtering columns 78 | 79 | Use the `and`, `or` and other utility functions to filter rows: 80 | 81 | ```ts 82 | import { and, or, eq, gte, lt } from 'typed-pocketbase'; 83 | 84 | // get all posts created in 2022 85 | db.from('posts').getFullList({ 86 | // a "manual" filter is a tuple of length 3 87 | filter: and(['date', '<', '2023-01-01'], ['data', '>=', '2022-01-01']) 88 | }); 89 | 90 | // get all posts expect for those created in 2022 91 | db.from('posts').getFullList({ 92 | filter: or(['date', '>=', '2023-01-01'], ['data', '<', '2022-01-01']) 93 | }); 94 | 95 | // get all posts that were create at '2023-01-01' 96 | db.from('posts').getFullList({ filter: eq('date', '2023-01-01') }); 97 | 98 | // combine or/and with helpers and manual filters 99 | db.from('posts').getFullList({ 100 | filter: or( 101 | // 102 | ['date', '>=', '2023-01-01'], 103 | lt('date', '2022-01-01') 104 | ) 105 | }); 106 | 107 | // conditionally filter rows 108 | // falsy values are excluded 109 | db.from('posts').getFullList({ 110 | filter: and( 111 | // 112 | gte('date', '2022-01-01'), 113 | !untilNow && lt('date', '2023-01-01') 114 | ) 115 | }); 116 | 117 | // filter for columns in relations 118 | // works up to 6 levels deep, including the top level 119 | db.from('posts').getFullList({ 120 | filter: eq('owner.name', 'me') 121 | }); 122 | ``` 123 | 124 | Most filter operators are available as short hand function. 125 | 126 | Visit the [pocketbase documentation](https://pocketbase.io/docs/api-records/) to find out about all filters in the `List/Search records` section. 127 | 128 | ## Sorting rows 129 | 130 | ```ts 131 | db.from('posts').getFullList({ 132 | // sort by descending 'date' 133 | sort: '-date' 134 | }); 135 | 136 | db.from('posts').getFullList({ 137 | // sort by descending 'date' and ascending 'title' 138 | sort: ['-date', '+title'] 139 | }); 140 | 141 | // conditionally sort rows 142 | // falsy values are excluded 143 | db.from('posts').getFullList({ 144 | sort: ['-date', sortTitle && '+title'] 145 | }); 146 | ``` 147 | 148 | ## Expanding 149 | 150 | In `typed-pocketbase` expanding happens automatically when using select. 151 | 152 | ```ts 153 | db.from('posts').getFullList({ 154 | select: { 155 | expand: { 156 | user: true 157 | } 158 | } 159 | }); 160 | 161 | // select nested columns 162 | db.from('posts').getFullList({ 163 | select: { 164 | expand: { 165 | user: { 166 | name: true 167 | avatar: true 168 | } 169 | } 170 | } 171 | }); 172 | 173 | // nested expand 174 | db.from('posts').getFullList({ 175 | select:{ 176 | expand: { 177 | user: { 178 | expand: { 179 | profile: true 180 | } 181 | } 182 | } 183 | } 184 | }); 185 | ``` 186 | 187 | [Back relation expanding](https://pocketbase.io/docs/working-with-relations/#back-relation-expand) is support aswell: 188 | 189 | ```ts 190 | db.from('user').getFullList({ 191 | select: { 192 | expand: { 193 | 'posts(user)': { 194 | title: true, 195 | created: true 196 | } 197 | } 198 | } 199 | }); 200 | ``` 201 | 202 | ## Helper methods: 203 | 204 | ### createSelect 205 | 206 | ```ts 207 | const select = db.from('posts').createSelect({ 208 | id: true, 209 | content: true, 210 | owner: true, 211 | collectionName: true, 212 | asd: true, 213 | expand: { 214 | owner: { 215 | username: true, 216 | email: true 217 | } 218 | } 219 | }); 220 | ``` 221 | 222 | ### createFilter 223 | 224 | ```ts 225 | const filter = db 226 | .from('posts') 227 | .createFilter(or(eq('content', 'bla'), eq('published', true))); 228 | ``` 229 | 230 | ### createSort 231 | 232 | ```ts 233 | const sort = db.from('posts').createSort('+id', '-date'); 234 | ``` 235 | 236 | ## License 237 | 238 | [MIT](https://github.com/david-plugge/typed-pocketbase/blob/main/LICENSE) 239 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | 3 | services: 4 | pocketbase: 5 | image: ghcr.io/muchobien/pocketbase:latest 6 | container_name: pocketbase 7 | restart: unless-stopped 8 | environment: 9 | ENCRYPTION: example #optional 10 | ports: 11 | - '8090:8090' 12 | volumes: 13 | - pb_data:/pb/pb_data 14 | healthcheck: 15 | #optional (recommended) since v0.10.0 16 | test: wget --no-verbose --tries=1 --spider http://localhost:8090/api/health || exit 1 17 | interval: 5s 18 | timeout: 5s 19 | retries: 5 20 | 21 | volumes: 22 | pb_data: 23 | -------------------------------------------------------------------------------- /example/Database.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file was @generated using typed-pocketbase 3 | */ 4 | 5 | // https://pocketbase.io/docs/collections/#base-collection 6 | export interface BaseCollectionResponse { 7 | /** 8 | * 15 characters string to store as record ID. 9 | */ 10 | id: string; 11 | /** 12 | * Date string representation for the creation date. 13 | */ 14 | created: string; 15 | /** 16 | * Date string representation for the creation date. 17 | */ 18 | updated: string; 19 | /** 20 | * The collection id. 21 | */ 22 | collectionId: string; 23 | /** 24 | * The collection name. 25 | */ 26 | collectionName: string; 27 | } 28 | 29 | // https://pocketbase.io/docs/api-records/#create-record 30 | export interface BaseCollectionCreate { 31 | /** 32 | * 15 characters string to store as record ID. 33 | * If not set, it will be auto generated. 34 | */ 35 | id?: string; 36 | } 37 | 38 | // https://pocketbase.io/docs/api-records/#update-record 39 | export interface BaseCollectionUpdate {} 40 | 41 | // https://pocketbase.io/docs/collections/#auth-collection 42 | export interface AuthCollectionResponse extends BaseCollectionResponse { 43 | /** 44 | * The username of the auth record. 45 | */ 46 | username: string; 47 | /** 48 | * Auth record email address. 49 | */ 50 | email: string; 51 | /** 52 | * Whether to show/hide the auth record email when fetching the record data. 53 | */ 54 | emailVisibility: boolean; 55 | /** 56 | * Indicates whether the auth record is verified or not. 57 | */ 58 | verified: boolean; 59 | } 60 | 61 | // https://pocketbase.io/docs/api-records/#create-record 62 | export interface AuthCollectionCreate extends BaseCollectionCreate { 63 | /** 64 | * The username of the auth record. 65 | * If not set, it will be auto generated. 66 | */ 67 | username?: string; 68 | /** 69 | * Auth record email address. 70 | */ 71 | email?: string; 72 | /** 73 | * Whether to show/hide the auth record email when fetching the record data. 74 | */ 75 | emailVisibility?: boolean; 76 | /** 77 | * Auth record password. 78 | */ 79 | password: string; 80 | /** 81 | * Auth record password confirmation. 82 | */ 83 | passwordConfirm: string; 84 | /** 85 | * Indicates whether the auth record is verified or not. 86 | * This field can be set only by admins or auth records with "Manage" access. 87 | */ 88 | verified?: boolean; 89 | } 90 | 91 | // https://pocketbase.io/docs/api-records/#update-record 92 | export interface AuthCollectionUpdate { 93 | /** 94 | * The username of the auth record. 95 | */ 96 | username?: string; 97 | /** 98 | * The auth record email address. 99 | * This field can be updated only by admins or auth records with "Manage" access. 100 | * Regular accounts can update their email by calling "Request email change". 101 | */ 102 | email?: string; 103 | /** 104 | * Whether to show/hide the auth record email when fetching the record data. 105 | */ 106 | emailVisibility?: boolean; 107 | /** 108 | * Old auth record password. 109 | * This field is required only when changing the record password. Admins and auth records with "Manage" access can skip this field. 110 | */ 111 | oldPassword?: string; 112 | /** 113 | * New auth record password. 114 | */ 115 | password: string; 116 | /** 117 | * New auth record password confirmation. 118 | */ 119 | passwordConfirm: string; 120 | /** 121 | * Indicates whether the auth record is verified or not. 122 | * This field can be set only by admins or auth records with "Manage" access. 123 | */ 124 | verified?: boolean; 125 | } 126 | 127 | // https://pocketbase.io/docs/collections/#view-collection 128 | export interface ViewCollectionRecord { 129 | id: string; 130 | } 131 | 132 | // utilities 133 | 134 | type MaybeArray = T | T[]; 135 | 136 | // ===== users ===== 137 | 138 | export interface UsersResponse extends AuthCollectionResponse { 139 | collectionName: 'users'; 140 | name: string; 141 | avatar: string; 142 | } 143 | 144 | export interface UsersCreate extends AuthCollectionCreate { 145 | name?: string; 146 | avatar?: File; 147 | } 148 | 149 | export interface UsersUpdate extends AuthCollectionUpdate { 150 | name?: string; 151 | avatar?: File; 152 | } 153 | 154 | export interface UsersCollection { 155 | type: 'auth'; 156 | collectionId: string; 157 | collectionName: 'users'; 158 | response: UsersResponse; 159 | create: UsersCreate; 160 | update: UsersUpdate; 161 | relations: { 162 | 'posts(owner)': PostsCollection; 163 | }; 164 | } 165 | 166 | // ===== test2 ===== 167 | 168 | export interface Test2Response extends BaseCollectionResponse { 169 | collectionName: 'test2'; 170 | test: string; 171 | } 172 | 173 | export interface Test2Create extends BaseCollectionCreate { 174 | test?: string; 175 | } 176 | 177 | export interface Test2Update extends BaseCollectionUpdate { 178 | test?: string; 179 | } 180 | 181 | export interface Test2Collection { 182 | type: 'base'; 183 | collectionId: string; 184 | collectionName: 'test2'; 185 | response: Test2Response; 186 | create: Test2Create; 187 | update: Test2Update; 188 | relations: { 189 | 'test(relation)': TestCollection; 190 | }; 191 | } 192 | 193 | // ===== test ===== 194 | 195 | export interface TestResponse extends BaseCollectionResponse { 196 | collectionName: 'test'; 197 | test: string; 198 | editor: string; 199 | number: number; 200 | bool: boolean; 201 | email: string; 202 | url: string; 203 | date: string; 204 | select: '' | 'a' | 'b' | 'c' | 'd'; 205 | file: string; 206 | relation: string; 207 | json: any; 208 | } 209 | 210 | export interface TestCreate extends BaseCollectionCreate { 211 | test?: string; 212 | editor?: string; 213 | number?: number; 214 | bool?: boolean; 215 | email?: string; 216 | url?: string | URL; 217 | date?: string | Date; 218 | select?: '' | 'a' | 'b' | 'c' | 'd'; 219 | file?: File; 220 | relation?: string; 221 | json?: any; 222 | } 223 | 224 | export interface TestUpdate extends BaseCollectionUpdate { 225 | test?: string; 226 | editor?: string; 227 | number?: number; 228 | 'number+'?: number; 229 | 'number-'?: number; 230 | bool?: boolean; 231 | email?: string; 232 | url?: string | URL; 233 | date?: string | Date; 234 | select?: '' | 'a' | 'b' | 'c' | 'd'; 235 | file?: File; 236 | relation?: string; 237 | json?: any; 238 | } 239 | 240 | export interface TestCollection { 241 | type: 'base'; 242 | collectionId: string; 243 | collectionName: 'test'; 244 | response: TestResponse; 245 | create: TestCreate; 246 | update: TestUpdate; 247 | relations: { 248 | relation: Test2Collection; 249 | }; 250 | } 251 | 252 | // ===== posts ===== 253 | 254 | export interface PostsResponse extends BaseCollectionResponse { 255 | collectionName: 'posts'; 256 | title: string; 257 | content: string; 258 | published: boolean; 259 | owner: string; 260 | slug: string; 261 | date: string; 262 | } 263 | 264 | export interface PostsCreate extends BaseCollectionCreate { 265 | title: string; 266 | content?: string; 267 | published?: boolean; 268 | owner?: string; 269 | slug: string; 270 | date?: string | Date; 271 | } 272 | 273 | export interface PostsUpdate extends BaseCollectionUpdate { 274 | title?: string; 275 | content?: string; 276 | published?: boolean; 277 | owner?: string; 278 | slug?: string; 279 | date?: string | Date; 280 | } 281 | 282 | export interface PostsCollection { 283 | type: 'base'; 284 | collectionId: string; 285 | collectionName: 'posts'; 286 | response: PostsResponse; 287 | create: PostsCreate; 288 | update: PostsUpdate; 289 | relations: { 290 | owner: UsersCollection; 291 | }; 292 | } 293 | 294 | // ===== Schema ===== 295 | 296 | export type Schema = { 297 | users: UsersCollection; 298 | test2: Test2Collection; 299 | test: TestCollection; 300 | posts: PostsCollection; 301 | }; 302 | -------------------------------------------------------------------------------- /example/collections.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "_pb_users_auth_", 4 | "name": "users", 5 | "type": "auth", 6 | "system": false, 7 | "schema": [ 8 | { 9 | "system": false, 10 | "id": "users_name", 11 | "name": "name", 12 | "type": "text", 13 | "required": false, 14 | "presentable": false, 15 | "unique": false, 16 | "options": { 17 | "min": null, 18 | "max": null, 19 | "pattern": "" 20 | } 21 | }, 22 | { 23 | "system": false, 24 | "id": "users_avatar", 25 | "name": "avatar", 26 | "type": "file", 27 | "required": false, 28 | "presentable": false, 29 | "unique": false, 30 | "options": { 31 | "mimeTypes": [ 32 | "image/jpeg", 33 | "image/png", 34 | "image/svg+xml", 35 | "image/gif", 36 | "image/webp" 37 | ], 38 | "thumbs": null, 39 | "maxSelect": 1, 40 | "maxSize": 5242880, 41 | "protected": false 42 | } 43 | } 44 | ], 45 | "indexes": [], 46 | "listRule": "id = @request.auth.id", 47 | "viewRule": "id = @request.auth.id", 48 | "createRule": "", 49 | "updateRule": "id = @request.auth.id", 50 | "deleteRule": "id = @request.auth.id", 51 | "options": { 52 | "allowEmailAuth": true, 53 | "allowOAuth2Auth": true, 54 | "allowUsernameAuth": true, 55 | "exceptEmailDomains": null, 56 | "manageRule": null, 57 | "minPasswordLength": 8, 58 | "onlyEmailDomains": null, 59 | "onlyVerified": false, 60 | "requireEmail": false 61 | } 62 | }, 63 | { 64 | "id": "33ls010vik702sx", 65 | "name": "test2", 66 | "type": "base", 67 | "system": false, 68 | "schema": [ 69 | { 70 | "system": false, 71 | "id": "8ddvq0tw", 72 | "name": "test", 73 | "type": "text", 74 | "required": false, 75 | "presentable": false, 76 | "unique": false, 77 | "options": { 78 | "min": null, 79 | "max": null, 80 | "pattern": "" 81 | } 82 | } 83 | ], 84 | "indexes": [], 85 | "listRule": null, 86 | "viewRule": null, 87 | "createRule": null, 88 | "updateRule": null, 89 | "deleteRule": null, 90 | "options": {} 91 | }, 92 | { 93 | "id": "83fhlsv1gon0cmg", 94 | "name": "test", 95 | "type": "base", 96 | "system": false, 97 | "schema": [ 98 | { 99 | "system": false, 100 | "id": "zfuw6sof", 101 | "name": "test", 102 | "type": "text", 103 | "required": false, 104 | "presentable": false, 105 | "unique": false, 106 | "options": { 107 | "min": null, 108 | "max": null, 109 | "pattern": "" 110 | } 111 | }, 112 | { 113 | "system": false, 114 | "id": "qgv35ajo", 115 | "name": "editor", 116 | "type": "editor", 117 | "required": false, 118 | "presentable": false, 119 | "unique": false, 120 | "options": { 121 | "convertUrls": false 122 | } 123 | }, 124 | { 125 | "system": false, 126 | "id": "1e5y2axc", 127 | "name": "number", 128 | "type": "number", 129 | "required": false, 130 | "presentable": false, 131 | "unique": false, 132 | "options": { 133 | "min": null, 134 | "max": null, 135 | "noDecimal": false 136 | } 137 | }, 138 | { 139 | "system": false, 140 | "id": "hptn8exo", 141 | "name": "bool", 142 | "type": "bool", 143 | "required": false, 144 | "presentable": false, 145 | "unique": false, 146 | "options": {} 147 | }, 148 | { 149 | "system": false, 150 | "id": "pb6ndpxg", 151 | "name": "email", 152 | "type": "email", 153 | "required": false, 154 | "presentable": false, 155 | "unique": false, 156 | "options": { 157 | "exceptDomains": null, 158 | "onlyDomains": null 159 | } 160 | }, 161 | { 162 | "system": false, 163 | "id": "x2titrzc", 164 | "name": "url", 165 | "type": "url", 166 | "required": false, 167 | "presentable": false, 168 | "unique": false, 169 | "options": { 170 | "exceptDomains": null, 171 | "onlyDomains": null 172 | } 173 | }, 174 | { 175 | "system": false, 176 | "id": "qyvrrpgf", 177 | "name": "date", 178 | "type": "date", 179 | "required": false, 180 | "presentable": false, 181 | "unique": false, 182 | "options": { 183 | "min": "", 184 | "max": "" 185 | } 186 | }, 187 | { 188 | "system": false, 189 | "id": "bmsnitya", 190 | "name": "select", 191 | "type": "select", 192 | "required": false, 193 | "presentable": false, 194 | "unique": false, 195 | "options": { 196 | "maxSelect": 1, 197 | "values": ["a", "b", "c", "d"] 198 | } 199 | }, 200 | { 201 | "system": false, 202 | "id": "gokg1h4f", 203 | "name": "file", 204 | "type": "file", 205 | "required": false, 206 | "presentable": false, 207 | "unique": false, 208 | "options": { 209 | "mimeTypes": [], 210 | "thumbs": [], 211 | "maxSelect": 1, 212 | "maxSize": 5242880, 213 | "protected": false 214 | } 215 | }, 216 | { 217 | "system": false, 218 | "id": "kswhkufu", 219 | "name": "relation", 220 | "type": "relation", 221 | "required": false, 222 | "presentable": false, 223 | "unique": false, 224 | "options": { 225 | "collectionId": "33ls010vik702sx", 226 | "cascadeDelete": false, 227 | "minSelect": null, 228 | "maxSelect": 1, 229 | "displayFields": null 230 | } 231 | }, 232 | { 233 | "system": false, 234 | "id": "qe9d8ctq", 235 | "name": "json", 236 | "type": "json", 237 | "required": false, 238 | "presentable": false, 239 | "unique": false, 240 | "options": { 241 | "maxSize": 2000000 242 | } 243 | } 244 | ], 245 | "indexes": ["CREATE UNIQUE INDEX `idx_iTJ39NK` ON `test` (`relation`)"], 246 | "listRule": null, 247 | "viewRule": null, 248 | "createRule": null, 249 | "updateRule": null, 250 | "deleteRule": null, 251 | "options": {} 252 | }, 253 | { 254 | "id": "vs0t2jp78fg1hbw", 255 | "name": "posts", 256 | "type": "base", 257 | "system": false, 258 | "schema": [ 259 | { 260 | "system": false, 261 | "id": "iayzkqkp", 262 | "name": "title", 263 | "type": "text", 264 | "required": true, 265 | "presentable": false, 266 | "unique": false, 267 | "options": { 268 | "min": null, 269 | "max": null, 270 | "pattern": "" 271 | } 272 | }, 273 | { 274 | "system": false, 275 | "id": "57vqfjrw", 276 | "name": "content", 277 | "type": "editor", 278 | "required": false, 279 | "presentable": false, 280 | "unique": false, 281 | "options": { 282 | "convertUrls": false 283 | } 284 | }, 285 | { 286 | "system": false, 287 | "id": "bv9hckq2", 288 | "name": "published", 289 | "type": "bool", 290 | "required": false, 291 | "presentable": false, 292 | "unique": false, 293 | "options": {} 294 | }, 295 | { 296 | "system": false, 297 | "id": "jf1xoxbn", 298 | "name": "owner", 299 | "type": "relation", 300 | "required": false, 301 | "presentable": false, 302 | "unique": false, 303 | "options": { 304 | "collectionId": "_pb_users_auth_", 305 | "cascadeDelete": false, 306 | "minSelect": null, 307 | "maxSelect": 1, 308 | "displayFields": null 309 | } 310 | }, 311 | { 312 | "system": false, 313 | "id": "av9mjr2g", 314 | "name": "slug", 315 | "type": "text", 316 | "required": true, 317 | "presentable": false, 318 | "unique": false, 319 | "options": { 320 | "min": null, 321 | "max": null, 322 | "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$" 323 | } 324 | }, 325 | { 326 | "system": false, 327 | "id": "gzxmjrwt", 328 | "name": "date", 329 | "type": "date", 330 | "required": false, 331 | "presentable": false, 332 | "unique": false, 333 | "options": { 334 | "min": "", 335 | "max": "" 336 | } 337 | } 338 | ], 339 | "indexes": ["CREATE UNIQUE INDEX `idx_FWAp4S2` ON `posts` (`slug`)"], 340 | "listRule": null, 341 | "viewRule": null, 342 | "createRule": null, 343 | "updateRule": null, 344 | "deleteRule": null, 345 | "options": {} 346 | } 347 | ] 348 | -------------------------------------------------------------------------------- /example/index.ts: -------------------------------------------------------------------------------- 1 | import { Schema } from './Database.js'; 2 | import { TypedPocketBase, eq, or } from '../src/index.js'; 3 | 4 | const db = new TypedPocketBase('http://localhost:8090'); 5 | await db.admins.authWithPassword('admin@example.com', 'secretpassword'); 6 | 7 | { 8 | const posts = await db.from('posts').getFullList({ 9 | select: { 10 | id: true, 11 | title: true, 12 | slug: true, 13 | content: true, 14 | expand: { 15 | owner: { 16 | expand: { 17 | 'posts(owner)': true 18 | } 19 | } 20 | } 21 | }, 22 | sort: '+date', 23 | filter: eq('published', true) 24 | }); 25 | 26 | console.log(posts[0].expand); 27 | } 28 | 29 | { 30 | const posts = await db.from('posts').getFullList({ 31 | select: { 32 | expand: { 33 | owner: true 34 | } 35 | }, 36 | sort: '+date', 37 | filter: eq('owner.email', 'user@test.com') 38 | }); 39 | 40 | console.log(posts[0].expand); 41 | } 42 | 43 | { 44 | const post = await db 45 | .from('posts') 46 | .getFirstListItem(eq('owner.email', 'user@test.com'), { 47 | select: { 48 | expand: { 49 | owner: true 50 | } 51 | } 52 | }); 53 | console.log(post); 54 | } 55 | 56 | { 57 | const sort = db.from('posts').createSort('+id', '-date'); 58 | 59 | const filter = db 60 | .from('posts') 61 | .createFilter(or(eq('content', 'bla'), eq('published', true))); 62 | 63 | const select = db.from('posts').createSelect({ 64 | id: true, 65 | content: true, 66 | owner: true, 67 | collectionName: true, 68 | asd: true, 69 | expand: { 70 | owner: { 71 | username: true, 72 | email: true 73 | } 74 | } 75 | }); 76 | 77 | const posts = await db.from('posts').getFullList({ 78 | filter, 79 | select, 80 | sort 81 | }); 82 | 83 | console.log(posts); 84 | } 85 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typed-pocketbase", 3 | "version": "0.1.1", 4 | "description": "Add types to the PocketBase JavaScript SDK", 5 | "author": "David Plugge", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/david-plugge/typed-pocketbase" 9 | }, 10 | "license": "MIT", 11 | "keywords": [ 12 | "pocketbase", 13 | "types" 14 | ], 15 | "files": [ 16 | "dist", 17 | "src" 18 | ], 19 | "type": "module", 20 | "main": "./dist/client/index.js", 21 | "module": "./dist/client/index.js", 22 | "types": "./dist/client/index.d.ts", 23 | "bin": { 24 | "typed-pocketbase": "dist/codegen/cli.js" 25 | }, 26 | "scripts": { 27 | "build": "tsup", 28 | "lint": "tsc", 29 | "format": "prettier --write .", 30 | "ci:version": "changeset version", 31 | "ci:release": "changeset publish" 32 | }, 33 | "peerDependencies": { 34 | "pocketbase": "^0.21.0" 35 | }, 36 | "dependencies": { 37 | "sade": "^1.8.1" 38 | }, 39 | "devDependencies": { 40 | "@changesets/cli": "^2.27.1", 41 | "@types/node": "^20.11.13", 42 | "pocketbase": "^0.21.0", 43 | "prettier": "^3.2.4", 44 | "tsup": "^8.0.1", 45 | "typescript": "^5.3.3" 46 | } 47 | } -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | sade: 9 | specifier: ^1.8.1 10 | version: 1.8.1 11 | 12 | devDependencies: 13 | '@changesets/cli': 14 | specifier: ^2.27.1 15 | version: 2.27.1 16 | '@types/node': 17 | specifier: ^20.11.13 18 | version: 20.11.13 19 | pocketbase: 20 | specifier: ^0.21.0 21 | version: 0.21.1 22 | prettier: 23 | specifier: ^3.2.4 24 | version: 3.2.4 25 | tsup: 26 | specifier: ^8.0.1 27 | version: 8.0.1(typescript@5.3.3) 28 | typescript: 29 | specifier: ^5.3.3 30 | version: 5.3.3 31 | 32 | packages: 33 | 34 | /@babel/code-frame@7.23.5: 35 | resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} 36 | engines: {node: '>=6.9.0'} 37 | dependencies: 38 | '@babel/highlight': 7.23.4 39 | chalk: 2.4.2 40 | dev: true 41 | 42 | /@babel/helper-validator-identifier@7.22.20: 43 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 44 | engines: {node: '>=6.9.0'} 45 | dev: true 46 | 47 | /@babel/highlight@7.23.4: 48 | resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} 49 | engines: {node: '>=6.9.0'} 50 | dependencies: 51 | '@babel/helper-validator-identifier': 7.22.20 52 | chalk: 2.4.2 53 | js-tokens: 4.0.0 54 | dev: true 55 | 56 | /@babel/runtime@7.23.9: 57 | resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} 58 | engines: {node: '>=6.9.0'} 59 | dependencies: 60 | regenerator-runtime: 0.14.1 61 | dev: true 62 | 63 | /@changesets/apply-release-plan@7.0.0: 64 | resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} 65 | dependencies: 66 | '@babel/runtime': 7.23.9 67 | '@changesets/config': 3.0.0 68 | '@changesets/get-version-range-type': 0.4.0 69 | '@changesets/git': 3.0.0 70 | '@changesets/types': 6.0.0 71 | '@manypkg/get-packages': 1.1.3 72 | detect-indent: 6.1.0 73 | fs-extra: 7.0.1 74 | lodash.startcase: 4.4.0 75 | outdent: 0.5.0 76 | prettier: 2.8.8 77 | resolve-from: 5.0.0 78 | semver: 7.5.4 79 | dev: true 80 | 81 | /@changesets/assemble-release-plan@6.0.0: 82 | resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} 83 | dependencies: 84 | '@babel/runtime': 7.23.9 85 | '@changesets/errors': 0.2.0 86 | '@changesets/get-dependents-graph': 2.0.0 87 | '@changesets/types': 6.0.0 88 | '@manypkg/get-packages': 1.1.3 89 | semver: 7.5.4 90 | dev: true 91 | 92 | /@changesets/changelog-git@0.2.0: 93 | resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} 94 | dependencies: 95 | '@changesets/types': 6.0.0 96 | dev: true 97 | 98 | /@changesets/cli@2.27.1: 99 | resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} 100 | hasBin: true 101 | dependencies: 102 | '@babel/runtime': 7.23.9 103 | '@changesets/apply-release-plan': 7.0.0 104 | '@changesets/assemble-release-plan': 6.0.0 105 | '@changesets/changelog-git': 0.2.0 106 | '@changesets/config': 3.0.0 107 | '@changesets/errors': 0.2.0 108 | '@changesets/get-dependents-graph': 2.0.0 109 | '@changesets/get-release-plan': 4.0.0 110 | '@changesets/git': 3.0.0 111 | '@changesets/logger': 0.1.0 112 | '@changesets/pre': 2.0.0 113 | '@changesets/read': 0.6.0 114 | '@changesets/types': 6.0.0 115 | '@changesets/write': 0.3.0 116 | '@manypkg/get-packages': 1.1.3 117 | '@types/semver': 7.5.6 118 | ansi-colors: 4.1.3 119 | chalk: 2.4.2 120 | ci-info: 3.9.0 121 | enquirer: 2.4.1 122 | external-editor: 3.1.0 123 | fs-extra: 7.0.1 124 | human-id: 1.0.2 125 | meow: 6.1.1 126 | outdent: 0.5.0 127 | p-limit: 2.3.0 128 | preferred-pm: 3.1.2 129 | resolve-from: 5.0.0 130 | semver: 7.5.4 131 | spawndamnit: 2.0.0 132 | term-size: 2.2.1 133 | tty-table: 4.2.3 134 | dev: true 135 | 136 | /@changesets/config@3.0.0: 137 | resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} 138 | dependencies: 139 | '@changesets/errors': 0.2.0 140 | '@changesets/get-dependents-graph': 2.0.0 141 | '@changesets/logger': 0.1.0 142 | '@changesets/types': 6.0.0 143 | '@manypkg/get-packages': 1.1.3 144 | fs-extra: 7.0.1 145 | micromatch: 4.0.5 146 | dev: true 147 | 148 | /@changesets/errors@0.2.0: 149 | resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} 150 | dependencies: 151 | extendable-error: 0.1.7 152 | dev: true 153 | 154 | /@changesets/get-dependents-graph@2.0.0: 155 | resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} 156 | dependencies: 157 | '@changesets/types': 6.0.0 158 | '@manypkg/get-packages': 1.1.3 159 | chalk: 2.4.2 160 | fs-extra: 7.0.1 161 | semver: 7.5.4 162 | dev: true 163 | 164 | /@changesets/get-release-plan@4.0.0: 165 | resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} 166 | dependencies: 167 | '@babel/runtime': 7.23.9 168 | '@changesets/assemble-release-plan': 6.0.0 169 | '@changesets/config': 3.0.0 170 | '@changesets/pre': 2.0.0 171 | '@changesets/read': 0.6.0 172 | '@changesets/types': 6.0.0 173 | '@manypkg/get-packages': 1.1.3 174 | dev: true 175 | 176 | /@changesets/get-version-range-type@0.4.0: 177 | resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} 178 | dev: true 179 | 180 | /@changesets/git@3.0.0: 181 | resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} 182 | dependencies: 183 | '@babel/runtime': 7.23.9 184 | '@changesets/errors': 0.2.0 185 | '@changesets/types': 6.0.0 186 | '@manypkg/get-packages': 1.1.3 187 | is-subdir: 1.2.0 188 | micromatch: 4.0.5 189 | spawndamnit: 2.0.0 190 | dev: true 191 | 192 | /@changesets/logger@0.1.0: 193 | resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} 194 | dependencies: 195 | chalk: 2.4.2 196 | dev: true 197 | 198 | /@changesets/parse@0.4.0: 199 | resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} 200 | dependencies: 201 | '@changesets/types': 6.0.0 202 | js-yaml: 3.14.1 203 | dev: true 204 | 205 | /@changesets/pre@2.0.0: 206 | resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} 207 | dependencies: 208 | '@babel/runtime': 7.23.9 209 | '@changesets/errors': 0.2.0 210 | '@changesets/types': 6.0.0 211 | '@manypkg/get-packages': 1.1.3 212 | fs-extra: 7.0.1 213 | dev: true 214 | 215 | /@changesets/read@0.6.0: 216 | resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} 217 | dependencies: 218 | '@babel/runtime': 7.23.9 219 | '@changesets/git': 3.0.0 220 | '@changesets/logger': 0.1.0 221 | '@changesets/parse': 0.4.0 222 | '@changesets/types': 6.0.0 223 | chalk: 2.4.2 224 | fs-extra: 7.0.1 225 | p-filter: 2.1.0 226 | dev: true 227 | 228 | /@changesets/types@4.1.0: 229 | resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} 230 | dev: true 231 | 232 | /@changesets/types@6.0.0: 233 | resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} 234 | dev: true 235 | 236 | /@changesets/write@0.3.0: 237 | resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} 238 | dependencies: 239 | '@babel/runtime': 7.23.9 240 | '@changesets/types': 6.0.0 241 | fs-extra: 7.0.1 242 | human-id: 1.0.2 243 | prettier: 2.8.8 244 | dev: true 245 | 246 | /@esbuild/aix-ppc64@0.19.12: 247 | resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} 248 | engines: {node: '>=12'} 249 | cpu: [ppc64] 250 | os: [aix] 251 | requiresBuild: true 252 | dev: true 253 | optional: true 254 | 255 | /@esbuild/android-arm64@0.19.12: 256 | resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} 257 | engines: {node: '>=12'} 258 | cpu: [arm64] 259 | os: [android] 260 | requiresBuild: true 261 | dev: true 262 | optional: true 263 | 264 | /@esbuild/android-arm@0.19.12: 265 | resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} 266 | engines: {node: '>=12'} 267 | cpu: [arm] 268 | os: [android] 269 | requiresBuild: true 270 | dev: true 271 | optional: true 272 | 273 | /@esbuild/android-x64@0.19.12: 274 | resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} 275 | engines: {node: '>=12'} 276 | cpu: [x64] 277 | os: [android] 278 | requiresBuild: true 279 | dev: true 280 | optional: true 281 | 282 | /@esbuild/darwin-arm64@0.19.12: 283 | resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} 284 | engines: {node: '>=12'} 285 | cpu: [arm64] 286 | os: [darwin] 287 | requiresBuild: true 288 | dev: true 289 | optional: true 290 | 291 | /@esbuild/darwin-x64@0.19.12: 292 | resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} 293 | engines: {node: '>=12'} 294 | cpu: [x64] 295 | os: [darwin] 296 | requiresBuild: true 297 | dev: true 298 | optional: true 299 | 300 | /@esbuild/freebsd-arm64@0.19.12: 301 | resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} 302 | engines: {node: '>=12'} 303 | cpu: [arm64] 304 | os: [freebsd] 305 | requiresBuild: true 306 | dev: true 307 | optional: true 308 | 309 | /@esbuild/freebsd-x64@0.19.12: 310 | resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} 311 | engines: {node: '>=12'} 312 | cpu: [x64] 313 | os: [freebsd] 314 | requiresBuild: true 315 | dev: true 316 | optional: true 317 | 318 | /@esbuild/linux-arm64@0.19.12: 319 | resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} 320 | engines: {node: '>=12'} 321 | cpu: [arm64] 322 | os: [linux] 323 | requiresBuild: true 324 | dev: true 325 | optional: true 326 | 327 | /@esbuild/linux-arm@0.19.12: 328 | resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} 329 | engines: {node: '>=12'} 330 | cpu: [arm] 331 | os: [linux] 332 | requiresBuild: true 333 | dev: true 334 | optional: true 335 | 336 | /@esbuild/linux-ia32@0.19.12: 337 | resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} 338 | engines: {node: '>=12'} 339 | cpu: [ia32] 340 | os: [linux] 341 | requiresBuild: true 342 | dev: true 343 | optional: true 344 | 345 | /@esbuild/linux-loong64@0.19.12: 346 | resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} 347 | engines: {node: '>=12'} 348 | cpu: [loong64] 349 | os: [linux] 350 | requiresBuild: true 351 | dev: true 352 | optional: true 353 | 354 | /@esbuild/linux-mips64el@0.19.12: 355 | resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} 356 | engines: {node: '>=12'} 357 | cpu: [mips64el] 358 | os: [linux] 359 | requiresBuild: true 360 | dev: true 361 | optional: true 362 | 363 | /@esbuild/linux-ppc64@0.19.12: 364 | resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} 365 | engines: {node: '>=12'} 366 | cpu: [ppc64] 367 | os: [linux] 368 | requiresBuild: true 369 | dev: true 370 | optional: true 371 | 372 | /@esbuild/linux-riscv64@0.19.12: 373 | resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} 374 | engines: {node: '>=12'} 375 | cpu: [riscv64] 376 | os: [linux] 377 | requiresBuild: true 378 | dev: true 379 | optional: true 380 | 381 | /@esbuild/linux-s390x@0.19.12: 382 | resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} 383 | engines: {node: '>=12'} 384 | cpu: [s390x] 385 | os: [linux] 386 | requiresBuild: true 387 | dev: true 388 | optional: true 389 | 390 | /@esbuild/linux-x64@0.19.12: 391 | resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} 392 | engines: {node: '>=12'} 393 | cpu: [x64] 394 | os: [linux] 395 | requiresBuild: true 396 | dev: true 397 | optional: true 398 | 399 | /@esbuild/netbsd-x64@0.19.12: 400 | resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} 401 | engines: {node: '>=12'} 402 | cpu: [x64] 403 | os: [netbsd] 404 | requiresBuild: true 405 | dev: true 406 | optional: true 407 | 408 | /@esbuild/openbsd-x64@0.19.12: 409 | resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} 410 | engines: {node: '>=12'} 411 | cpu: [x64] 412 | os: [openbsd] 413 | requiresBuild: true 414 | dev: true 415 | optional: true 416 | 417 | /@esbuild/sunos-x64@0.19.12: 418 | resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} 419 | engines: {node: '>=12'} 420 | cpu: [x64] 421 | os: [sunos] 422 | requiresBuild: true 423 | dev: true 424 | optional: true 425 | 426 | /@esbuild/win32-arm64@0.19.12: 427 | resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} 428 | engines: {node: '>=12'} 429 | cpu: [arm64] 430 | os: [win32] 431 | requiresBuild: true 432 | dev: true 433 | optional: true 434 | 435 | /@esbuild/win32-ia32@0.19.12: 436 | resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} 437 | engines: {node: '>=12'} 438 | cpu: [ia32] 439 | os: [win32] 440 | requiresBuild: true 441 | dev: true 442 | optional: true 443 | 444 | /@esbuild/win32-x64@0.19.12: 445 | resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} 446 | engines: {node: '>=12'} 447 | cpu: [x64] 448 | os: [win32] 449 | requiresBuild: true 450 | dev: true 451 | optional: true 452 | 453 | /@isaacs/cliui@8.0.2: 454 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 455 | engines: {node: '>=12'} 456 | dependencies: 457 | string-width: 5.1.2 458 | string-width-cjs: /string-width@4.2.3 459 | strip-ansi: 7.1.0 460 | strip-ansi-cjs: /strip-ansi@6.0.1 461 | wrap-ansi: 8.1.0 462 | wrap-ansi-cjs: /wrap-ansi@7.0.0 463 | dev: true 464 | 465 | /@jridgewell/gen-mapping@0.3.3: 466 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 467 | engines: {node: '>=6.0.0'} 468 | dependencies: 469 | '@jridgewell/set-array': 1.1.2 470 | '@jridgewell/sourcemap-codec': 1.4.15 471 | '@jridgewell/trace-mapping': 0.3.22 472 | dev: true 473 | 474 | /@jridgewell/resolve-uri@3.1.1: 475 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 476 | engines: {node: '>=6.0.0'} 477 | dev: true 478 | 479 | /@jridgewell/set-array@1.1.2: 480 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 481 | engines: {node: '>=6.0.0'} 482 | dev: true 483 | 484 | /@jridgewell/sourcemap-codec@1.4.15: 485 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 486 | dev: true 487 | 488 | /@jridgewell/trace-mapping@0.3.22: 489 | resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} 490 | dependencies: 491 | '@jridgewell/resolve-uri': 3.1.1 492 | '@jridgewell/sourcemap-codec': 1.4.15 493 | dev: true 494 | 495 | /@manypkg/find-root@1.1.0: 496 | resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} 497 | dependencies: 498 | '@babel/runtime': 7.23.9 499 | '@types/node': 12.20.55 500 | find-up: 4.1.0 501 | fs-extra: 8.1.0 502 | dev: true 503 | 504 | /@manypkg/get-packages@1.1.3: 505 | resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} 506 | dependencies: 507 | '@babel/runtime': 7.23.9 508 | '@changesets/types': 4.1.0 509 | '@manypkg/find-root': 1.1.0 510 | fs-extra: 8.1.0 511 | globby: 11.1.0 512 | read-yaml-file: 1.1.0 513 | dev: true 514 | 515 | /@nodelib/fs.scandir@2.1.5: 516 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 517 | engines: {node: '>= 8'} 518 | dependencies: 519 | '@nodelib/fs.stat': 2.0.5 520 | run-parallel: 1.2.0 521 | dev: true 522 | 523 | /@nodelib/fs.stat@2.0.5: 524 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 525 | engines: {node: '>= 8'} 526 | dev: true 527 | 528 | /@nodelib/fs.walk@1.2.8: 529 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 530 | engines: {node: '>= 8'} 531 | dependencies: 532 | '@nodelib/fs.scandir': 2.1.5 533 | fastq: 1.17.0 534 | dev: true 535 | 536 | /@pkgjs/parseargs@0.11.0: 537 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 538 | engines: {node: '>=14'} 539 | requiresBuild: true 540 | dev: true 541 | optional: true 542 | 543 | /@rollup/rollup-android-arm-eabi@4.9.6: 544 | resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==} 545 | cpu: [arm] 546 | os: [android] 547 | requiresBuild: true 548 | dev: true 549 | optional: true 550 | 551 | /@rollup/rollup-android-arm64@4.9.6: 552 | resolution: {integrity: sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==} 553 | cpu: [arm64] 554 | os: [android] 555 | requiresBuild: true 556 | dev: true 557 | optional: true 558 | 559 | /@rollup/rollup-darwin-arm64@4.9.6: 560 | resolution: {integrity: sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==} 561 | cpu: [arm64] 562 | os: [darwin] 563 | requiresBuild: true 564 | dev: true 565 | optional: true 566 | 567 | /@rollup/rollup-darwin-x64@4.9.6: 568 | resolution: {integrity: sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==} 569 | cpu: [x64] 570 | os: [darwin] 571 | requiresBuild: true 572 | dev: true 573 | optional: true 574 | 575 | /@rollup/rollup-linux-arm-gnueabihf@4.9.6: 576 | resolution: {integrity: sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==} 577 | cpu: [arm] 578 | os: [linux] 579 | requiresBuild: true 580 | dev: true 581 | optional: true 582 | 583 | /@rollup/rollup-linux-arm64-gnu@4.9.6: 584 | resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==} 585 | cpu: [arm64] 586 | os: [linux] 587 | requiresBuild: true 588 | dev: true 589 | optional: true 590 | 591 | /@rollup/rollup-linux-arm64-musl@4.9.6: 592 | resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==} 593 | cpu: [arm64] 594 | os: [linux] 595 | requiresBuild: true 596 | dev: true 597 | optional: true 598 | 599 | /@rollup/rollup-linux-riscv64-gnu@4.9.6: 600 | resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==} 601 | cpu: [riscv64] 602 | os: [linux] 603 | requiresBuild: true 604 | dev: true 605 | optional: true 606 | 607 | /@rollup/rollup-linux-x64-gnu@4.9.6: 608 | resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==} 609 | cpu: [x64] 610 | os: [linux] 611 | requiresBuild: true 612 | dev: true 613 | optional: true 614 | 615 | /@rollup/rollup-linux-x64-musl@4.9.6: 616 | resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==} 617 | cpu: [x64] 618 | os: [linux] 619 | requiresBuild: true 620 | dev: true 621 | optional: true 622 | 623 | /@rollup/rollup-win32-arm64-msvc@4.9.6: 624 | resolution: {integrity: sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==} 625 | cpu: [arm64] 626 | os: [win32] 627 | requiresBuild: true 628 | dev: true 629 | optional: true 630 | 631 | /@rollup/rollup-win32-ia32-msvc@4.9.6: 632 | resolution: {integrity: sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==} 633 | cpu: [ia32] 634 | os: [win32] 635 | requiresBuild: true 636 | dev: true 637 | optional: true 638 | 639 | /@rollup/rollup-win32-x64-msvc@4.9.6: 640 | resolution: {integrity: sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==} 641 | cpu: [x64] 642 | os: [win32] 643 | requiresBuild: true 644 | dev: true 645 | optional: true 646 | 647 | /@types/estree@1.0.5: 648 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 649 | dev: true 650 | 651 | /@types/minimist@1.2.5: 652 | resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} 653 | dev: true 654 | 655 | /@types/node@12.20.55: 656 | resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} 657 | dev: true 658 | 659 | /@types/node@20.11.13: 660 | resolution: {integrity: sha512-5G4zQwdiQBSWYTDAH1ctw2eidqdhMJaNsiIDKHFr55ihz5Trl2qqR8fdrT732yPBho5gkNxXm67OxWFBqX9aPg==} 661 | dependencies: 662 | undici-types: 5.26.5 663 | dev: true 664 | 665 | /@types/normalize-package-data@2.4.4: 666 | resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} 667 | dev: true 668 | 669 | /@types/semver@7.5.6: 670 | resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} 671 | dev: true 672 | 673 | /ansi-colors@4.1.3: 674 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 675 | engines: {node: '>=6'} 676 | dev: true 677 | 678 | /ansi-regex@5.0.1: 679 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 680 | engines: {node: '>=8'} 681 | dev: true 682 | 683 | /ansi-regex@6.0.1: 684 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 685 | engines: {node: '>=12'} 686 | dev: true 687 | 688 | /ansi-styles@3.2.1: 689 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 690 | engines: {node: '>=4'} 691 | dependencies: 692 | color-convert: 1.9.3 693 | dev: true 694 | 695 | /ansi-styles@4.3.0: 696 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 697 | engines: {node: '>=8'} 698 | dependencies: 699 | color-convert: 2.0.1 700 | dev: true 701 | 702 | /ansi-styles@6.2.1: 703 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 704 | engines: {node: '>=12'} 705 | dev: true 706 | 707 | /any-promise@1.3.0: 708 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 709 | dev: true 710 | 711 | /anymatch@3.1.3: 712 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 713 | engines: {node: '>= 8'} 714 | dependencies: 715 | normalize-path: 3.0.0 716 | picomatch: 2.3.1 717 | dev: true 718 | 719 | /argparse@1.0.10: 720 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 721 | dependencies: 722 | sprintf-js: 1.0.3 723 | dev: true 724 | 725 | /array-buffer-byte-length@1.0.0: 726 | resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} 727 | dependencies: 728 | call-bind: 1.0.5 729 | is-array-buffer: 3.0.2 730 | dev: true 731 | 732 | /array-union@2.1.0: 733 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 734 | engines: {node: '>=8'} 735 | dev: true 736 | 737 | /array.prototype.flat@1.3.2: 738 | resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} 739 | engines: {node: '>= 0.4'} 740 | dependencies: 741 | call-bind: 1.0.5 742 | define-properties: 1.2.1 743 | es-abstract: 1.22.3 744 | es-shim-unscopables: 1.0.2 745 | dev: true 746 | 747 | /arraybuffer.prototype.slice@1.0.2: 748 | resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} 749 | engines: {node: '>= 0.4'} 750 | dependencies: 751 | array-buffer-byte-length: 1.0.0 752 | call-bind: 1.0.5 753 | define-properties: 1.2.1 754 | es-abstract: 1.22.3 755 | get-intrinsic: 1.2.2 756 | is-array-buffer: 3.0.2 757 | is-shared-array-buffer: 1.0.2 758 | dev: true 759 | 760 | /arrify@1.0.1: 761 | resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} 762 | engines: {node: '>=0.10.0'} 763 | dev: true 764 | 765 | /available-typed-arrays@1.0.5: 766 | resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} 767 | engines: {node: '>= 0.4'} 768 | dev: true 769 | 770 | /balanced-match@1.0.2: 771 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 772 | dev: true 773 | 774 | /better-path-resolve@1.0.0: 775 | resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} 776 | engines: {node: '>=4'} 777 | dependencies: 778 | is-windows: 1.0.2 779 | dev: true 780 | 781 | /binary-extensions@2.2.0: 782 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 783 | engines: {node: '>=8'} 784 | dev: true 785 | 786 | /brace-expansion@2.0.1: 787 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 788 | dependencies: 789 | balanced-match: 1.0.2 790 | dev: true 791 | 792 | /braces@3.0.2: 793 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 794 | engines: {node: '>=8'} 795 | dependencies: 796 | fill-range: 7.0.1 797 | dev: true 798 | 799 | /breakword@1.0.6: 800 | resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} 801 | dependencies: 802 | wcwidth: 1.0.1 803 | dev: true 804 | 805 | /bundle-require@4.0.2(esbuild@0.19.12): 806 | resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} 807 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 808 | peerDependencies: 809 | esbuild: '>=0.17' 810 | dependencies: 811 | esbuild: 0.19.12 812 | load-tsconfig: 0.2.5 813 | dev: true 814 | 815 | /cac@6.7.14: 816 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 817 | engines: {node: '>=8'} 818 | dev: true 819 | 820 | /call-bind@1.0.5: 821 | resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} 822 | dependencies: 823 | function-bind: 1.1.2 824 | get-intrinsic: 1.2.2 825 | set-function-length: 1.2.0 826 | dev: true 827 | 828 | /camelcase-keys@6.2.2: 829 | resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} 830 | engines: {node: '>=8'} 831 | dependencies: 832 | camelcase: 5.3.1 833 | map-obj: 4.3.0 834 | quick-lru: 4.0.1 835 | dev: true 836 | 837 | /camelcase@5.3.1: 838 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 839 | engines: {node: '>=6'} 840 | dev: true 841 | 842 | /chalk@2.4.2: 843 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 844 | engines: {node: '>=4'} 845 | dependencies: 846 | ansi-styles: 3.2.1 847 | escape-string-regexp: 1.0.5 848 | supports-color: 5.5.0 849 | dev: true 850 | 851 | /chalk@4.1.2: 852 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 853 | engines: {node: '>=10'} 854 | dependencies: 855 | ansi-styles: 4.3.0 856 | supports-color: 7.2.0 857 | dev: true 858 | 859 | /chardet@0.7.0: 860 | resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} 861 | dev: true 862 | 863 | /chokidar@3.5.3: 864 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 865 | engines: {node: '>= 8.10.0'} 866 | dependencies: 867 | anymatch: 3.1.3 868 | braces: 3.0.2 869 | glob-parent: 5.1.2 870 | is-binary-path: 2.1.0 871 | is-glob: 4.0.3 872 | normalize-path: 3.0.0 873 | readdirp: 3.6.0 874 | optionalDependencies: 875 | fsevents: 2.3.3 876 | dev: true 877 | 878 | /ci-info@3.9.0: 879 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 880 | engines: {node: '>=8'} 881 | dev: true 882 | 883 | /cliui@6.0.0: 884 | resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} 885 | dependencies: 886 | string-width: 4.2.3 887 | strip-ansi: 6.0.1 888 | wrap-ansi: 6.2.0 889 | dev: true 890 | 891 | /cliui@8.0.1: 892 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 893 | engines: {node: '>=12'} 894 | dependencies: 895 | string-width: 4.2.3 896 | strip-ansi: 6.0.1 897 | wrap-ansi: 7.0.0 898 | dev: true 899 | 900 | /clone@1.0.4: 901 | resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} 902 | engines: {node: '>=0.8'} 903 | dev: true 904 | 905 | /color-convert@1.9.3: 906 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 907 | dependencies: 908 | color-name: 1.1.3 909 | dev: true 910 | 911 | /color-convert@2.0.1: 912 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 913 | engines: {node: '>=7.0.0'} 914 | dependencies: 915 | color-name: 1.1.4 916 | dev: true 917 | 918 | /color-name@1.1.3: 919 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 920 | dev: true 921 | 922 | /color-name@1.1.4: 923 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 924 | dev: true 925 | 926 | /commander@4.1.1: 927 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 928 | engines: {node: '>= 6'} 929 | dev: true 930 | 931 | /cross-spawn@5.1.0: 932 | resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} 933 | dependencies: 934 | lru-cache: 4.1.5 935 | shebang-command: 1.2.0 936 | which: 1.3.1 937 | dev: true 938 | 939 | /cross-spawn@7.0.3: 940 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 941 | engines: {node: '>= 8'} 942 | dependencies: 943 | path-key: 3.1.1 944 | shebang-command: 2.0.0 945 | which: 2.0.2 946 | dev: true 947 | 948 | /csv-generate@3.4.3: 949 | resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} 950 | dev: true 951 | 952 | /csv-parse@4.16.3: 953 | resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} 954 | dev: true 955 | 956 | /csv-stringify@5.6.5: 957 | resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} 958 | dev: true 959 | 960 | /csv@5.5.3: 961 | resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} 962 | engines: {node: '>= 0.1.90'} 963 | dependencies: 964 | csv-generate: 3.4.3 965 | csv-parse: 4.16.3 966 | csv-stringify: 5.6.5 967 | stream-transform: 2.1.3 968 | dev: true 969 | 970 | /debug@4.3.4: 971 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 972 | engines: {node: '>=6.0'} 973 | peerDependencies: 974 | supports-color: '*' 975 | peerDependenciesMeta: 976 | supports-color: 977 | optional: true 978 | dependencies: 979 | ms: 2.1.2 980 | dev: true 981 | 982 | /decamelize-keys@1.1.1: 983 | resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} 984 | engines: {node: '>=0.10.0'} 985 | dependencies: 986 | decamelize: 1.2.0 987 | map-obj: 1.0.1 988 | dev: true 989 | 990 | /decamelize@1.2.0: 991 | resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} 992 | engines: {node: '>=0.10.0'} 993 | dev: true 994 | 995 | /defaults@1.0.4: 996 | resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} 997 | dependencies: 998 | clone: 1.0.4 999 | dev: true 1000 | 1001 | /define-data-property@1.1.1: 1002 | resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} 1003 | engines: {node: '>= 0.4'} 1004 | dependencies: 1005 | get-intrinsic: 1.2.2 1006 | gopd: 1.0.1 1007 | has-property-descriptors: 1.0.1 1008 | dev: true 1009 | 1010 | /define-properties@1.2.1: 1011 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 1012 | engines: {node: '>= 0.4'} 1013 | dependencies: 1014 | define-data-property: 1.1.1 1015 | has-property-descriptors: 1.0.1 1016 | object-keys: 1.1.1 1017 | dev: true 1018 | 1019 | /detect-indent@6.1.0: 1020 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 1021 | engines: {node: '>=8'} 1022 | dev: true 1023 | 1024 | /dir-glob@3.0.1: 1025 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1026 | engines: {node: '>=8'} 1027 | dependencies: 1028 | path-type: 4.0.0 1029 | dev: true 1030 | 1031 | /eastasianwidth@0.2.0: 1032 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1033 | dev: true 1034 | 1035 | /emoji-regex@8.0.0: 1036 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1037 | dev: true 1038 | 1039 | /emoji-regex@9.2.2: 1040 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1041 | dev: true 1042 | 1043 | /enquirer@2.4.1: 1044 | resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} 1045 | engines: {node: '>=8.6'} 1046 | dependencies: 1047 | ansi-colors: 4.1.3 1048 | strip-ansi: 6.0.1 1049 | dev: true 1050 | 1051 | /error-ex@1.3.2: 1052 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 1053 | dependencies: 1054 | is-arrayish: 0.2.1 1055 | dev: true 1056 | 1057 | /es-abstract@1.22.3: 1058 | resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} 1059 | engines: {node: '>= 0.4'} 1060 | dependencies: 1061 | array-buffer-byte-length: 1.0.0 1062 | arraybuffer.prototype.slice: 1.0.2 1063 | available-typed-arrays: 1.0.5 1064 | call-bind: 1.0.5 1065 | es-set-tostringtag: 2.0.2 1066 | es-to-primitive: 1.2.1 1067 | function.prototype.name: 1.1.6 1068 | get-intrinsic: 1.2.2 1069 | get-symbol-description: 1.0.0 1070 | globalthis: 1.0.3 1071 | gopd: 1.0.1 1072 | has-property-descriptors: 1.0.1 1073 | has-proto: 1.0.1 1074 | has-symbols: 1.0.3 1075 | hasown: 2.0.0 1076 | internal-slot: 1.0.6 1077 | is-array-buffer: 3.0.2 1078 | is-callable: 1.2.7 1079 | is-negative-zero: 2.0.2 1080 | is-regex: 1.1.4 1081 | is-shared-array-buffer: 1.0.2 1082 | is-string: 1.0.7 1083 | is-typed-array: 1.1.12 1084 | is-weakref: 1.0.2 1085 | object-inspect: 1.13.1 1086 | object-keys: 1.1.1 1087 | object.assign: 4.1.5 1088 | regexp.prototype.flags: 1.5.1 1089 | safe-array-concat: 1.1.0 1090 | safe-regex-test: 1.0.2 1091 | string.prototype.trim: 1.2.8 1092 | string.prototype.trimend: 1.0.7 1093 | string.prototype.trimstart: 1.0.7 1094 | typed-array-buffer: 1.0.0 1095 | typed-array-byte-length: 1.0.0 1096 | typed-array-byte-offset: 1.0.0 1097 | typed-array-length: 1.0.4 1098 | unbox-primitive: 1.0.2 1099 | which-typed-array: 1.1.13 1100 | dev: true 1101 | 1102 | /es-set-tostringtag@2.0.2: 1103 | resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} 1104 | engines: {node: '>= 0.4'} 1105 | dependencies: 1106 | get-intrinsic: 1.2.2 1107 | has-tostringtag: 1.0.0 1108 | hasown: 2.0.0 1109 | dev: true 1110 | 1111 | /es-shim-unscopables@1.0.2: 1112 | resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} 1113 | dependencies: 1114 | hasown: 2.0.0 1115 | dev: true 1116 | 1117 | /es-to-primitive@1.2.1: 1118 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 1119 | engines: {node: '>= 0.4'} 1120 | dependencies: 1121 | is-callable: 1.2.7 1122 | is-date-object: 1.0.5 1123 | is-symbol: 1.0.4 1124 | dev: true 1125 | 1126 | /esbuild@0.19.12: 1127 | resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} 1128 | engines: {node: '>=12'} 1129 | hasBin: true 1130 | requiresBuild: true 1131 | optionalDependencies: 1132 | '@esbuild/aix-ppc64': 0.19.12 1133 | '@esbuild/android-arm': 0.19.12 1134 | '@esbuild/android-arm64': 0.19.12 1135 | '@esbuild/android-x64': 0.19.12 1136 | '@esbuild/darwin-arm64': 0.19.12 1137 | '@esbuild/darwin-x64': 0.19.12 1138 | '@esbuild/freebsd-arm64': 0.19.12 1139 | '@esbuild/freebsd-x64': 0.19.12 1140 | '@esbuild/linux-arm': 0.19.12 1141 | '@esbuild/linux-arm64': 0.19.12 1142 | '@esbuild/linux-ia32': 0.19.12 1143 | '@esbuild/linux-loong64': 0.19.12 1144 | '@esbuild/linux-mips64el': 0.19.12 1145 | '@esbuild/linux-ppc64': 0.19.12 1146 | '@esbuild/linux-riscv64': 0.19.12 1147 | '@esbuild/linux-s390x': 0.19.12 1148 | '@esbuild/linux-x64': 0.19.12 1149 | '@esbuild/netbsd-x64': 0.19.12 1150 | '@esbuild/openbsd-x64': 0.19.12 1151 | '@esbuild/sunos-x64': 0.19.12 1152 | '@esbuild/win32-arm64': 0.19.12 1153 | '@esbuild/win32-ia32': 0.19.12 1154 | '@esbuild/win32-x64': 0.19.12 1155 | dev: true 1156 | 1157 | /escalade@3.1.1: 1158 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1159 | engines: {node: '>=6'} 1160 | dev: true 1161 | 1162 | /escape-string-regexp@1.0.5: 1163 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1164 | engines: {node: '>=0.8.0'} 1165 | dev: true 1166 | 1167 | /esprima@4.0.1: 1168 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 1169 | engines: {node: '>=4'} 1170 | hasBin: true 1171 | dev: true 1172 | 1173 | /execa@5.1.1: 1174 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 1175 | engines: {node: '>=10'} 1176 | dependencies: 1177 | cross-spawn: 7.0.3 1178 | get-stream: 6.0.1 1179 | human-signals: 2.1.0 1180 | is-stream: 2.0.1 1181 | merge-stream: 2.0.0 1182 | npm-run-path: 4.0.1 1183 | onetime: 5.1.2 1184 | signal-exit: 3.0.7 1185 | strip-final-newline: 2.0.0 1186 | dev: true 1187 | 1188 | /extendable-error@0.1.7: 1189 | resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} 1190 | dev: true 1191 | 1192 | /external-editor@3.1.0: 1193 | resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} 1194 | engines: {node: '>=4'} 1195 | dependencies: 1196 | chardet: 0.7.0 1197 | iconv-lite: 0.4.24 1198 | tmp: 0.0.33 1199 | dev: true 1200 | 1201 | /fast-glob@3.3.2: 1202 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 1203 | engines: {node: '>=8.6.0'} 1204 | dependencies: 1205 | '@nodelib/fs.stat': 2.0.5 1206 | '@nodelib/fs.walk': 1.2.8 1207 | glob-parent: 5.1.2 1208 | merge2: 1.4.1 1209 | micromatch: 4.0.5 1210 | dev: true 1211 | 1212 | /fastq@1.17.0: 1213 | resolution: {integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==} 1214 | dependencies: 1215 | reusify: 1.0.4 1216 | dev: true 1217 | 1218 | /fill-range@7.0.1: 1219 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1220 | engines: {node: '>=8'} 1221 | dependencies: 1222 | to-regex-range: 5.0.1 1223 | dev: true 1224 | 1225 | /find-up@4.1.0: 1226 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 1227 | engines: {node: '>=8'} 1228 | dependencies: 1229 | locate-path: 5.0.0 1230 | path-exists: 4.0.0 1231 | dev: true 1232 | 1233 | /find-up@5.0.0: 1234 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1235 | engines: {node: '>=10'} 1236 | dependencies: 1237 | locate-path: 6.0.0 1238 | path-exists: 4.0.0 1239 | dev: true 1240 | 1241 | /find-yarn-workspace-root2@1.2.16: 1242 | resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} 1243 | dependencies: 1244 | micromatch: 4.0.5 1245 | pkg-dir: 4.2.0 1246 | dev: true 1247 | 1248 | /for-each@0.3.3: 1249 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 1250 | dependencies: 1251 | is-callable: 1.2.7 1252 | dev: true 1253 | 1254 | /foreground-child@3.1.1: 1255 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 1256 | engines: {node: '>=14'} 1257 | dependencies: 1258 | cross-spawn: 7.0.3 1259 | signal-exit: 4.1.0 1260 | dev: true 1261 | 1262 | /fs-extra@7.0.1: 1263 | resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} 1264 | engines: {node: '>=6 <7 || >=8'} 1265 | dependencies: 1266 | graceful-fs: 4.2.11 1267 | jsonfile: 4.0.0 1268 | universalify: 0.1.2 1269 | dev: true 1270 | 1271 | /fs-extra@8.1.0: 1272 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 1273 | engines: {node: '>=6 <7 || >=8'} 1274 | dependencies: 1275 | graceful-fs: 4.2.11 1276 | jsonfile: 4.0.0 1277 | universalify: 0.1.2 1278 | dev: true 1279 | 1280 | /fsevents@2.3.3: 1281 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1282 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1283 | os: [darwin] 1284 | requiresBuild: true 1285 | dev: true 1286 | optional: true 1287 | 1288 | /function-bind@1.1.2: 1289 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1290 | dev: true 1291 | 1292 | /function.prototype.name@1.1.6: 1293 | resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} 1294 | engines: {node: '>= 0.4'} 1295 | dependencies: 1296 | call-bind: 1.0.5 1297 | define-properties: 1.2.1 1298 | es-abstract: 1.22.3 1299 | functions-have-names: 1.2.3 1300 | dev: true 1301 | 1302 | /functions-have-names@1.2.3: 1303 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 1304 | dev: true 1305 | 1306 | /get-caller-file@2.0.5: 1307 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1308 | engines: {node: 6.* || 8.* || >= 10.*} 1309 | dev: true 1310 | 1311 | /get-intrinsic@1.2.2: 1312 | resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} 1313 | dependencies: 1314 | function-bind: 1.1.2 1315 | has-proto: 1.0.1 1316 | has-symbols: 1.0.3 1317 | hasown: 2.0.0 1318 | dev: true 1319 | 1320 | /get-stream@6.0.1: 1321 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 1322 | engines: {node: '>=10'} 1323 | dev: true 1324 | 1325 | /get-symbol-description@1.0.0: 1326 | resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} 1327 | engines: {node: '>= 0.4'} 1328 | dependencies: 1329 | call-bind: 1.0.5 1330 | get-intrinsic: 1.2.2 1331 | dev: true 1332 | 1333 | /glob-parent@5.1.2: 1334 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1335 | engines: {node: '>= 6'} 1336 | dependencies: 1337 | is-glob: 4.0.3 1338 | dev: true 1339 | 1340 | /glob@10.3.10: 1341 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 1342 | engines: {node: '>=16 || 14 >=14.17'} 1343 | hasBin: true 1344 | dependencies: 1345 | foreground-child: 3.1.1 1346 | jackspeak: 2.3.6 1347 | minimatch: 9.0.3 1348 | minipass: 7.0.4 1349 | path-scurry: 1.10.1 1350 | dev: true 1351 | 1352 | /globalthis@1.0.3: 1353 | resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} 1354 | engines: {node: '>= 0.4'} 1355 | dependencies: 1356 | define-properties: 1.2.1 1357 | dev: true 1358 | 1359 | /globby@11.1.0: 1360 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1361 | engines: {node: '>=10'} 1362 | dependencies: 1363 | array-union: 2.1.0 1364 | dir-glob: 3.0.1 1365 | fast-glob: 3.3.2 1366 | ignore: 5.3.0 1367 | merge2: 1.4.1 1368 | slash: 3.0.0 1369 | dev: true 1370 | 1371 | /gopd@1.0.1: 1372 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 1373 | dependencies: 1374 | get-intrinsic: 1.2.2 1375 | dev: true 1376 | 1377 | /graceful-fs@4.2.11: 1378 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1379 | dev: true 1380 | 1381 | /grapheme-splitter@1.0.4: 1382 | resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} 1383 | dev: true 1384 | 1385 | /hard-rejection@2.1.0: 1386 | resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} 1387 | engines: {node: '>=6'} 1388 | dev: true 1389 | 1390 | /has-bigints@1.0.2: 1391 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 1392 | dev: true 1393 | 1394 | /has-flag@3.0.0: 1395 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1396 | engines: {node: '>=4'} 1397 | dev: true 1398 | 1399 | /has-flag@4.0.0: 1400 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1401 | engines: {node: '>=8'} 1402 | dev: true 1403 | 1404 | /has-property-descriptors@1.0.1: 1405 | resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} 1406 | dependencies: 1407 | get-intrinsic: 1.2.2 1408 | dev: true 1409 | 1410 | /has-proto@1.0.1: 1411 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 1412 | engines: {node: '>= 0.4'} 1413 | dev: true 1414 | 1415 | /has-symbols@1.0.3: 1416 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1417 | engines: {node: '>= 0.4'} 1418 | dev: true 1419 | 1420 | /has-tostringtag@1.0.0: 1421 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 1422 | engines: {node: '>= 0.4'} 1423 | dependencies: 1424 | has-symbols: 1.0.3 1425 | dev: true 1426 | 1427 | /hasown@2.0.0: 1428 | resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} 1429 | engines: {node: '>= 0.4'} 1430 | dependencies: 1431 | function-bind: 1.1.2 1432 | dev: true 1433 | 1434 | /hosted-git-info@2.8.9: 1435 | resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} 1436 | dev: true 1437 | 1438 | /human-id@1.0.2: 1439 | resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} 1440 | dev: true 1441 | 1442 | /human-signals@2.1.0: 1443 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 1444 | engines: {node: '>=10.17.0'} 1445 | dev: true 1446 | 1447 | /iconv-lite@0.4.24: 1448 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 1449 | engines: {node: '>=0.10.0'} 1450 | dependencies: 1451 | safer-buffer: 2.1.2 1452 | dev: true 1453 | 1454 | /ignore@5.3.0: 1455 | resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} 1456 | engines: {node: '>= 4'} 1457 | dev: true 1458 | 1459 | /indent-string@4.0.0: 1460 | resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} 1461 | engines: {node: '>=8'} 1462 | dev: true 1463 | 1464 | /internal-slot@1.0.6: 1465 | resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} 1466 | engines: {node: '>= 0.4'} 1467 | dependencies: 1468 | get-intrinsic: 1.2.2 1469 | hasown: 2.0.0 1470 | side-channel: 1.0.4 1471 | dev: true 1472 | 1473 | /is-array-buffer@3.0.2: 1474 | resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} 1475 | dependencies: 1476 | call-bind: 1.0.5 1477 | get-intrinsic: 1.2.2 1478 | is-typed-array: 1.1.12 1479 | dev: true 1480 | 1481 | /is-arrayish@0.2.1: 1482 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 1483 | dev: true 1484 | 1485 | /is-bigint@1.0.4: 1486 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 1487 | dependencies: 1488 | has-bigints: 1.0.2 1489 | dev: true 1490 | 1491 | /is-binary-path@2.1.0: 1492 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1493 | engines: {node: '>=8'} 1494 | dependencies: 1495 | binary-extensions: 2.2.0 1496 | dev: true 1497 | 1498 | /is-boolean-object@1.1.2: 1499 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 1500 | engines: {node: '>= 0.4'} 1501 | dependencies: 1502 | call-bind: 1.0.5 1503 | has-tostringtag: 1.0.0 1504 | dev: true 1505 | 1506 | /is-callable@1.2.7: 1507 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1508 | engines: {node: '>= 0.4'} 1509 | dev: true 1510 | 1511 | /is-core-module@2.13.1: 1512 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 1513 | dependencies: 1514 | hasown: 2.0.0 1515 | dev: true 1516 | 1517 | /is-date-object@1.0.5: 1518 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 1519 | engines: {node: '>= 0.4'} 1520 | dependencies: 1521 | has-tostringtag: 1.0.0 1522 | dev: true 1523 | 1524 | /is-extglob@2.1.1: 1525 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1526 | engines: {node: '>=0.10.0'} 1527 | dev: true 1528 | 1529 | /is-fullwidth-code-point@3.0.0: 1530 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1531 | engines: {node: '>=8'} 1532 | dev: true 1533 | 1534 | /is-glob@4.0.3: 1535 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1536 | engines: {node: '>=0.10.0'} 1537 | dependencies: 1538 | is-extglob: 2.1.1 1539 | dev: true 1540 | 1541 | /is-negative-zero@2.0.2: 1542 | resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} 1543 | engines: {node: '>= 0.4'} 1544 | dev: true 1545 | 1546 | /is-number-object@1.0.7: 1547 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 1548 | engines: {node: '>= 0.4'} 1549 | dependencies: 1550 | has-tostringtag: 1.0.0 1551 | dev: true 1552 | 1553 | /is-number@7.0.0: 1554 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1555 | engines: {node: '>=0.12.0'} 1556 | dev: true 1557 | 1558 | /is-plain-obj@1.1.0: 1559 | resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} 1560 | engines: {node: '>=0.10.0'} 1561 | dev: true 1562 | 1563 | /is-regex@1.1.4: 1564 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 1565 | engines: {node: '>= 0.4'} 1566 | dependencies: 1567 | call-bind: 1.0.5 1568 | has-tostringtag: 1.0.0 1569 | dev: true 1570 | 1571 | /is-shared-array-buffer@1.0.2: 1572 | resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} 1573 | dependencies: 1574 | call-bind: 1.0.5 1575 | dev: true 1576 | 1577 | /is-stream@2.0.1: 1578 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1579 | engines: {node: '>=8'} 1580 | dev: true 1581 | 1582 | /is-string@1.0.7: 1583 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 1584 | engines: {node: '>= 0.4'} 1585 | dependencies: 1586 | has-tostringtag: 1.0.0 1587 | dev: true 1588 | 1589 | /is-subdir@1.2.0: 1590 | resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} 1591 | engines: {node: '>=4'} 1592 | dependencies: 1593 | better-path-resolve: 1.0.0 1594 | dev: true 1595 | 1596 | /is-symbol@1.0.4: 1597 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 1598 | engines: {node: '>= 0.4'} 1599 | dependencies: 1600 | has-symbols: 1.0.3 1601 | dev: true 1602 | 1603 | /is-typed-array@1.1.12: 1604 | resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} 1605 | engines: {node: '>= 0.4'} 1606 | dependencies: 1607 | which-typed-array: 1.1.13 1608 | dev: true 1609 | 1610 | /is-weakref@1.0.2: 1611 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 1612 | dependencies: 1613 | call-bind: 1.0.5 1614 | dev: true 1615 | 1616 | /is-windows@1.0.2: 1617 | resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} 1618 | engines: {node: '>=0.10.0'} 1619 | dev: true 1620 | 1621 | /isarray@2.0.5: 1622 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 1623 | dev: true 1624 | 1625 | /isexe@2.0.0: 1626 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1627 | dev: true 1628 | 1629 | /jackspeak@2.3.6: 1630 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 1631 | engines: {node: '>=14'} 1632 | dependencies: 1633 | '@isaacs/cliui': 8.0.2 1634 | optionalDependencies: 1635 | '@pkgjs/parseargs': 0.11.0 1636 | dev: true 1637 | 1638 | /joycon@3.1.1: 1639 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 1640 | engines: {node: '>=10'} 1641 | dev: true 1642 | 1643 | /js-tokens@4.0.0: 1644 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1645 | dev: true 1646 | 1647 | /js-yaml@3.14.1: 1648 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 1649 | hasBin: true 1650 | dependencies: 1651 | argparse: 1.0.10 1652 | esprima: 4.0.1 1653 | dev: true 1654 | 1655 | /json-parse-even-better-errors@2.3.1: 1656 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 1657 | dev: true 1658 | 1659 | /jsonfile@4.0.0: 1660 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 1661 | optionalDependencies: 1662 | graceful-fs: 4.2.11 1663 | dev: true 1664 | 1665 | /kind-of@6.0.3: 1666 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} 1667 | engines: {node: '>=0.10.0'} 1668 | dev: true 1669 | 1670 | /kleur@4.1.5: 1671 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 1672 | engines: {node: '>=6'} 1673 | dev: true 1674 | 1675 | /lilconfig@3.0.0: 1676 | resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} 1677 | engines: {node: '>=14'} 1678 | dev: true 1679 | 1680 | /lines-and-columns@1.2.4: 1681 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1682 | dev: true 1683 | 1684 | /load-tsconfig@0.2.5: 1685 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 1686 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1687 | dev: true 1688 | 1689 | /load-yaml-file@0.2.0: 1690 | resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} 1691 | engines: {node: '>=6'} 1692 | dependencies: 1693 | graceful-fs: 4.2.11 1694 | js-yaml: 3.14.1 1695 | pify: 4.0.1 1696 | strip-bom: 3.0.0 1697 | dev: true 1698 | 1699 | /locate-path@5.0.0: 1700 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1701 | engines: {node: '>=8'} 1702 | dependencies: 1703 | p-locate: 4.1.0 1704 | dev: true 1705 | 1706 | /locate-path@6.0.0: 1707 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1708 | engines: {node: '>=10'} 1709 | dependencies: 1710 | p-locate: 5.0.0 1711 | dev: true 1712 | 1713 | /lodash.sortby@4.7.0: 1714 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 1715 | dev: true 1716 | 1717 | /lodash.startcase@4.4.0: 1718 | resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} 1719 | dev: true 1720 | 1721 | /lru-cache@10.2.0: 1722 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} 1723 | engines: {node: 14 || >=16.14} 1724 | dev: true 1725 | 1726 | /lru-cache@4.1.5: 1727 | resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} 1728 | dependencies: 1729 | pseudomap: 1.0.2 1730 | yallist: 2.1.2 1731 | dev: true 1732 | 1733 | /lru-cache@6.0.0: 1734 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1735 | engines: {node: '>=10'} 1736 | dependencies: 1737 | yallist: 4.0.0 1738 | dev: true 1739 | 1740 | /map-obj@1.0.1: 1741 | resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} 1742 | engines: {node: '>=0.10.0'} 1743 | dev: true 1744 | 1745 | /map-obj@4.3.0: 1746 | resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} 1747 | engines: {node: '>=8'} 1748 | dev: true 1749 | 1750 | /meow@6.1.1: 1751 | resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} 1752 | engines: {node: '>=8'} 1753 | dependencies: 1754 | '@types/minimist': 1.2.5 1755 | camelcase-keys: 6.2.2 1756 | decamelize-keys: 1.1.1 1757 | hard-rejection: 2.1.0 1758 | minimist-options: 4.1.0 1759 | normalize-package-data: 2.5.0 1760 | read-pkg-up: 7.0.1 1761 | redent: 3.0.0 1762 | trim-newlines: 3.0.1 1763 | type-fest: 0.13.1 1764 | yargs-parser: 18.1.3 1765 | dev: true 1766 | 1767 | /merge-stream@2.0.0: 1768 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1769 | dev: true 1770 | 1771 | /merge2@1.4.1: 1772 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1773 | engines: {node: '>= 8'} 1774 | dev: true 1775 | 1776 | /micromatch@4.0.5: 1777 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1778 | engines: {node: '>=8.6'} 1779 | dependencies: 1780 | braces: 3.0.2 1781 | picomatch: 2.3.1 1782 | dev: true 1783 | 1784 | /mimic-fn@2.1.0: 1785 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1786 | engines: {node: '>=6'} 1787 | dev: true 1788 | 1789 | /min-indent@1.0.1: 1790 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 1791 | engines: {node: '>=4'} 1792 | dev: true 1793 | 1794 | /minimatch@9.0.3: 1795 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1796 | engines: {node: '>=16 || 14 >=14.17'} 1797 | dependencies: 1798 | brace-expansion: 2.0.1 1799 | dev: true 1800 | 1801 | /minimist-options@4.1.0: 1802 | resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} 1803 | engines: {node: '>= 6'} 1804 | dependencies: 1805 | arrify: 1.0.1 1806 | is-plain-obj: 1.1.0 1807 | kind-of: 6.0.3 1808 | dev: true 1809 | 1810 | /minipass@7.0.4: 1811 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 1812 | engines: {node: '>=16 || 14 >=14.17'} 1813 | dev: true 1814 | 1815 | /mixme@0.5.10: 1816 | resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} 1817 | engines: {node: '>= 8.0.0'} 1818 | dev: true 1819 | 1820 | /mri@1.2.0: 1821 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 1822 | engines: {node: '>=4'} 1823 | dev: false 1824 | 1825 | /ms@2.1.2: 1826 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1827 | dev: true 1828 | 1829 | /mz@2.7.0: 1830 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1831 | dependencies: 1832 | any-promise: 1.3.0 1833 | object-assign: 4.1.1 1834 | thenify-all: 1.6.0 1835 | dev: true 1836 | 1837 | /normalize-package-data@2.5.0: 1838 | resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} 1839 | dependencies: 1840 | hosted-git-info: 2.8.9 1841 | resolve: 1.22.8 1842 | semver: 5.7.2 1843 | validate-npm-package-license: 3.0.4 1844 | dev: true 1845 | 1846 | /normalize-path@3.0.0: 1847 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1848 | engines: {node: '>=0.10.0'} 1849 | dev: true 1850 | 1851 | /npm-run-path@4.0.1: 1852 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1853 | engines: {node: '>=8'} 1854 | dependencies: 1855 | path-key: 3.1.1 1856 | dev: true 1857 | 1858 | /object-assign@4.1.1: 1859 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1860 | engines: {node: '>=0.10.0'} 1861 | dev: true 1862 | 1863 | /object-inspect@1.13.1: 1864 | resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} 1865 | dev: true 1866 | 1867 | /object-keys@1.1.1: 1868 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1869 | engines: {node: '>= 0.4'} 1870 | dev: true 1871 | 1872 | /object.assign@4.1.5: 1873 | resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} 1874 | engines: {node: '>= 0.4'} 1875 | dependencies: 1876 | call-bind: 1.0.5 1877 | define-properties: 1.2.1 1878 | has-symbols: 1.0.3 1879 | object-keys: 1.1.1 1880 | dev: true 1881 | 1882 | /onetime@5.1.2: 1883 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1884 | engines: {node: '>=6'} 1885 | dependencies: 1886 | mimic-fn: 2.1.0 1887 | dev: true 1888 | 1889 | /os-tmpdir@1.0.2: 1890 | resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} 1891 | engines: {node: '>=0.10.0'} 1892 | dev: true 1893 | 1894 | /outdent@0.5.0: 1895 | resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} 1896 | dev: true 1897 | 1898 | /p-filter@2.1.0: 1899 | resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} 1900 | engines: {node: '>=8'} 1901 | dependencies: 1902 | p-map: 2.1.0 1903 | dev: true 1904 | 1905 | /p-limit@2.3.0: 1906 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1907 | engines: {node: '>=6'} 1908 | dependencies: 1909 | p-try: 2.2.0 1910 | dev: true 1911 | 1912 | /p-limit@3.1.0: 1913 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1914 | engines: {node: '>=10'} 1915 | dependencies: 1916 | yocto-queue: 0.1.0 1917 | dev: true 1918 | 1919 | /p-locate@4.1.0: 1920 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1921 | engines: {node: '>=8'} 1922 | dependencies: 1923 | p-limit: 2.3.0 1924 | dev: true 1925 | 1926 | /p-locate@5.0.0: 1927 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1928 | engines: {node: '>=10'} 1929 | dependencies: 1930 | p-limit: 3.1.0 1931 | dev: true 1932 | 1933 | /p-map@2.1.0: 1934 | resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} 1935 | engines: {node: '>=6'} 1936 | dev: true 1937 | 1938 | /p-try@2.2.0: 1939 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1940 | engines: {node: '>=6'} 1941 | dev: true 1942 | 1943 | /parse-json@5.2.0: 1944 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 1945 | engines: {node: '>=8'} 1946 | dependencies: 1947 | '@babel/code-frame': 7.23.5 1948 | error-ex: 1.3.2 1949 | json-parse-even-better-errors: 2.3.1 1950 | lines-and-columns: 1.2.4 1951 | dev: true 1952 | 1953 | /path-exists@4.0.0: 1954 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1955 | engines: {node: '>=8'} 1956 | dev: true 1957 | 1958 | /path-key@3.1.1: 1959 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1960 | engines: {node: '>=8'} 1961 | dev: true 1962 | 1963 | /path-parse@1.0.7: 1964 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1965 | dev: true 1966 | 1967 | /path-scurry@1.10.1: 1968 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 1969 | engines: {node: '>=16 || 14 >=14.17'} 1970 | dependencies: 1971 | lru-cache: 10.2.0 1972 | minipass: 7.0.4 1973 | dev: true 1974 | 1975 | /path-type@4.0.0: 1976 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1977 | engines: {node: '>=8'} 1978 | dev: true 1979 | 1980 | /picomatch@2.3.1: 1981 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1982 | engines: {node: '>=8.6'} 1983 | dev: true 1984 | 1985 | /pify@4.0.1: 1986 | resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} 1987 | engines: {node: '>=6'} 1988 | dev: true 1989 | 1990 | /pirates@4.0.6: 1991 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1992 | engines: {node: '>= 6'} 1993 | dev: true 1994 | 1995 | /pkg-dir@4.2.0: 1996 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 1997 | engines: {node: '>=8'} 1998 | dependencies: 1999 | find-up: 4.1.0 2000 | dev: true 2001 | 2002 | /pocketbase@0.21.1: 2003 | resolution: {integrity: sha512-0PvCP4pKtxsV9kwldEGyibEvhwOcx9jSCrz3WN5CgPILJfM0z76f1op9WE8/8UgikDsMdRsc5iBLfKintrJS1g==} 2004 | dev: true 2005 | 2006 | /postcss-load-config@4.0.2: 2007 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 2008 | engines: {node: '>= 14'} 2009 | peerDependencies: 2010 | postcss: '>=8.0.9' 2011 | ts-node: '>=9.0.0' 2012 | peerDependenciesMeta: 2013 | postcss: 2014 | optional: true 2015 | ts-node: 2016 | optional: true 2017 | dependencies: 2018 | lilconfig: 3.0.0 2019 | yaml: 2.3.4 2020 | dev: true 2021 | 2022 | /preferred-pm@3.1.2: 2023 | resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} 2024 | engines: {node: '>=10'} 2025 | dependencies: 2026 | find-up: 5.0.0 2027 | find-yarn-workspace-root2: 1.2.16 2028 | path-exists: 4.0.0 2029 | which-pm: 2.0.0 2030 | dev: true 2031 | 2032 | /prettier@2.8.8: 2033 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 2034 | engines: {node: '>=10.13.0'} 2035 | hasBin: true 2036 | dev: true 2037 | 2038 | /prettier@3.2.4: 2039 | resolution: {integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==} 2040 | engines: {node: '>=14'} 2041 | hasBin: true 2042 | dev: true 2043 | 2044 | /pseudomap@1.0.2: 2045 | resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} 2046 | dev: true 2047 | 2048 | /punycode@2.3.1: 2049 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 2050 | engines: {node: '>=6'} 2051 | dev: true 2052 | 2053 | /queue-microtask@1.2.3: 2054 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2055 | dev: true 2056 | 2057 | /quick-lru@4.0.1: 2058 | resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} 2059 | engines: {node: '>=8'} 2060 | dev: true 2061 | 2062 | /read-pkg-up@7.0.1: 2063 | resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} 2064 | engines: {node: '>=8'} 2065 | dependencies: 2066 | find-up: 4.1.0 2067 | read-pkg: 5.2.0 2068 | type-fest: 0.8.1 2069 | dev: true 2070 | 2071 | /read-pkg@5.2.0: 2072 | resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} 2073 | engines: {node: '>=8'} 2074 | dependencies: 2075 | '@types/normalize-package-data': 2.4.4 2076 | normalize-package-data: 2.5.0 2077 | parse-json: 5.2.0 2078 | type-fest: 0.6.0 2079 | dev: true 2080 | 2081 | /read-yaml-file@1.1.0: 2082 | resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} 2083 | engines: {node: '>=6'} 2084 | dependencies: 2085 | graceful-fs: 4.2.11 2086 | js-yaml: 3.14.1 2087 | pify: 4.0.1 2088 | strip-bom: 3.0.0 2089 | dev: true 2090 | 2091 | /readdirp@3.6.0: 2092 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2093 | engines: {node: '>=8.10.0'} 2094 | dependencies: 2095 | picomatch: 2.3.1 2096 | dev: true 2097 | 2098 | /redent@3.0.0: 2099 | resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} 2100 | engines: {node: '>=8'} 2101 | dependencies: 2102 | indent-string: 4.0.0 2103 | strip-indent: 3.0.0 2104 | dev: true 2105 | 2106 | /regenerator-runtime@0.14.1: 2107 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 2108 | dev: true 2109 | 2110 | /regexp.prototype.flags@1.5.1: 2111 | resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} 2112 | engines: {node: '>= 0.4'} 2113 | dependencies: 2114 | call-bind: 1.0.5 2115 | define-properties: 1.2.1 2116 | set-function-name: 2.0.1 2117 | dev: true 2118 | 2119 | /require-directory@2.1.1: 2120 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 2121 | engines: {node: '>=0.10.0'} 2122 | dev: true 2123 | 2124 | /require-main-filename@2.0.0: 2125 | resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} 2126 | dev: true 2127 | 2128 | /resolve-from@5.0.0: 2129 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 2130 | engines: {node: '>=8'} 2131 | dev: true 2132 | 2133 | /resolve@1.22.8: 2134 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 2135 | hasBin: true 2136 | dependencies: 2137 | is-core-module: 2.13.1 2138 | path-parse: 1.0.7 2139 | supports-preserve-symlinks-flag: 1.0.0 2140 | dev: true 2141 | 2142 | /reusify@1.0.4: 2143 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2144 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2145 | dev: true 2146 | 2147 | /rollup@4.9.6: 2148 | resolution: {integrity: sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==} 2149 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 2150 | hasBin: true 2151 | dependencies: 2152 | '@types/estree': 1.0.5 2153 | optionalDependencies: 2154 | '@rollup/rollup-android-arm-eabi': 4.9.6 2155 | '@rollup/rollup-android-arm64': 4.9.6 2156 | '@rollup/rollup-darwin-arm64': 4.9.6 2157 | '@rollup/rollup-darwin-x64': 4.9.6 2158 | '@rollup/rollup-linux-arm-gnueabihf': 4.9.6 2159 | '@rollup/rollup-linux-arm64-gnu': 4.9.6 2160 | '@rollup/rollup-linux-arm64-musl': 4.9.6 2161 | '@rollup/rollup-linux-riscv64-gnu': 4.9.6 2162 | '@rollup/rollup-linux-x64-gnu': 4.9.6 2163 | '@rollup/rollup-linux-x64-musl': 4.9.6 2164 | '@rollup/rollup-win32-arm64-msvc': 4.9.6 2165 | '@rollup/rollup-win32-ia32-msvc': 4.9.6 2166 | '@rollup/rollup-win32-x64-msvc': 4.9.6 2167 | fsevents: 2.3.3 2168 | dev: true 2169 | 2170 | /run-parallel@1.2.0: 2171 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2172 | dependencies: 2173 | queue-microtask: 1.2.3 2174 | dev: true 2175 | 2176 | /sade@1.8.1: 2177 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 2178 | engines: {node: '>=6'} 2179 | dependencies: 2180 | mri: 1.2.0 2181 | dev: false 2182 | 2183 | /safe-array-concat@1.1.0: 2184 | resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} 2185 | engines: {node: '>=0.4'} 2186 | dependencies: 2187 | call-bind: 1.0.5 2188 | get-intrinsic: 1.2.2 2189 | has-symbols: 1.0.3 2190 | isarray: 2.0.5 2191 | dev: true 2192 | 2193 | /safe-regex-test@1.0.2: 2194 | resolution: {integrity: sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==} 2195 | engines: {node: '>= 0.4'} 2196 | dependencies: 2197 | call-bind: 1.0.5 2198 | get-intrinsic: 1.2.2 2199 | is-regex: 1.1.4 2200 | dev: true 2201 | 2202 | /safer-buffer@2.1.2: 2203 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 2204 | dev: true 2205 | 2206 | /semver@5.7.2: 2207 | resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} 2208 | hasBin: true 2209 | dev: true 2210 | 2211 | /semver@7.5.4: 2212 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 2213 | engines: {node: '>=10'} 2214 | hasBin: true 2215 | dependencies: 2216 | lru-cache: 6.0.0 2217 | dev: true 2218 | 2219 | /set-blocking@2.0.0: 2220 | resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} 2221 | dev: true 2222 | 2223 | /set-function-length@1.2.0: 2224 | resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} 2225 | engines: {node: '>= 0.4'} 2226 | dependencies: 2227 | define-data-property: 1.1.1 2228 | function-bind: 1.1.2 2229 | get-intrinsic: 1.2.2 2230 | gopd: 1.0.1 2231 | has-property-descriptors: 1.0.1 2232 | dev: true 2233 | 2234 | /set-function-name@2.0.1: 2235 | resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} 2236 | engines: {node: '>= 0.4'} 2237 | dependencies: 2238 | define-data-property: 1.1.1 2239 | functions-have-names: 1.2.3 2240 | has-property-descriptors: 1.0.1 2241 | dev: true 2242 | 2243 | /shebang-command@1.2.0: 2244 | resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} 2245 | engines: {node: '>=0.10.0'} 2246 | dependencies: 2247 | shebang-regex: 1.0.0 2248 | dev: true 2249 | 2250 | /shebang-command@2.0.0: 2251 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2252 | engines: {node: '>=8'} 2253 | dependencies: 2254 | shebang-regex: 3.0.0 2255 | dev: true 2256 | 2257 | /shebang-regex@1.0.0: 2258 | resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} 2259 | engines: {node: '>=0.10.0'} 2260 | dev: true 2261 | 2262 | /shebang-regex@3.0.0: 2263 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2264 | engines: {node: '>=8'} 2265 | dev: true 2266 | 2267 | /side-channel@1.0.4: 2268 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 2269 | dependencies: 2270 | call-bind: 1.0.5 2271 | get-intrinsic: 1.2.2 2272 | object-inspect: 1.13.1 2273 | dev: true 2274 | 2275 | /signal-exit@3.0.7: 2276 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 2277 | dev: true 2278 | 2279 | /signal-exit@4.1.0: 2280 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 2281 | engines: {node: '>=14'} 2282 | dev: true 2283 | 2284 | /slash@3.0.0: 2285 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2286 | engines: {node: '>=8'} 2287 | dev: true 2288 | 2289 | /smartwrap@2.0.2: 2290 | resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} 2291 | engines: {node: '>=6'} 2292 | hasBin: true 2293 | dependencies: 2294 | array.prototype.flat: 1.3.2 2295 | breakword: 1.0.6 2296 | grapheme-splitter: 1.0.4 2297 | strip-ansi: 6.0.1 2298 | wcwidth: 1.0.1 2299 | yargs: 15.4.1 2300 | dev: true 2301 | 2302 | /source-map@0.8.0-beta.0: 2303 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 2304 | engines: {node: '>= 8'} 2305 | dependencies: 2306 | whatwg-url: 7.1.0 2307 | dev: true 2308 | 2309 | /spawndamnit@2.0.0: 2310 | resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} 2311 | dependencies: 2312 | cross-spawn: 5.1.0 2313 | signal-exit: 3.0.7 2314 | dev: true 2315 | 2316 | /spdx-correct@3.2.0: 2317 | resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} 2318 | dependencies: 2319 | spdx-expression-parse: 3.0.1 2320 | spdx-license-ids: 3.0.16 2321 | dev: true 2322 | 2323 | /spdx-exceptions@2.4.0: 2324 | resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==} 2325 | dev: true 2326 | 2327 | /spdx-expression-parse@3.0.1: 2328 | resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 2329 | dependencies: 2330 | spdx-exceptions: 2.4.0 2331 | spdx-license-ids: 3.0.16 2332 | dev: true 2333 | 2334 | /spdx-license-ids@3.0.16: 2335 | resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} 2336 | dev: true 2337 | 2338 | /sprintf-js@1.0.3: 2339 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 2340 | dev: true 2341 | 2342 | /stream-transform@2.1.3: 2343 | resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} 2344 | dependencies: 2345 | mixme: 0.5.10 2346 | dev: true 2347 | 2348 | /string-width@4.2.3: 2349 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2350 | engines: {node: '>=8'} 2351 | dependencies: 2352 | emoji-regex: 8.0.0 2353 | is-fullwidth-code-point: 3.0.0 2354 | strip-ansi: 6.0.1 2355 | dev: true 2356 | 2357 | /string-width@5.1.2: 2358 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 2359 | engines: {node: '>=12'} 2360 | dependencies: 2361 | eastasianwidth: 0.2.0 2362 | emoji-regex: 9.2.2 2363 | strip-ansi: 7.1.0 2364 | dev: true 2365 | 2366 | /string.prototype.trim@1.2.8: 2367 | resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} 2368 | engines: {node: '>= 0.4'} 2369 | dependencies: 2370 | call-bind: 1.0.5 2371 | define-properties: 1.2.1 2372 | es-abstract: 1.22.3 2373 | dev: true 2374 | 2375 | /string.prototype.trimend@1.0.7: 2376 | resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} 2377 | dependencies: 2378 | call-bind: 1.0.5 2379 | define-properties: 1.2.1 2380 | es-abstract: 1.22.3 2381 | dev: true 2382 | 2383 | /string.prototype.trimstart@1.0.7: 2384 | resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} 2385 | dependencies: 2386 | call-bind: 1.0.5 2387 | define-properties: 1.2.1 2388 | es-abstract: 1.22.3 2389 | dev: true 2390 | 2391 | /strip-ansi@6.0.1: 2392 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2393 | engines: {node: '>=8'} 2394 | dependencies: 2395 | ansi-regex: 5.0.1 2396 | dev: true 2397 | 2398 | /strip-ansi@7.1.0: 2399 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 2400 | engines: {node: '>=12'} 2401 | dependencies: 2402 | ansi-regex: 6.0.1 2403 | dev: true 2404 | 2405 | /strip-bom@3.0.0: 2406 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 2407 | engines: {node: '>=4'} 2408 | dev: true 2409 | 2410 | /strip-final-newline@2.0.0: 2411 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 2412 | engines: {node: '>=6'} 2413 | dev: true 2414 | 2415 | /strip-indent@3.0.0: 2416 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 2417 | engines: {node: '>=8'} 2418 | dependencies: 2419 | min-indent: 1.0.1 2420 | dev: true 2421 | 2422 | /sucrase@3.35.0: 2423 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 2424 | engines: {node: '>=16 || 14 >=14.17'} 2425 | hasBin: true 2426 | dependencies: 2427 | '@jridgewell/gen-mapping': 0.3.3 2428 | commander: 4.1.1 2429 | glob: 10.3.10 2430 | lines-and-columns: 1.2.4 2431 | mz: 2.7.0 2432 | pirates: 4.0.6 2433 | ts-interface-checker: 0.1.13 2434 | dev: true 2435 | 2436 | /supports-color@5.5.0: 2437 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 2438 | engines: {node: '>=4'} 2439 | dependencies: 2440 | has-flag: 3.0.0 2441 | dev: true 2442 | 2443 | /supports-color@7.2.0: 2444 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2445 | engines: {node: '>=8'} 2446 | dependencies: 2447 | has-flag: 4.0.0 2448 | dev: true 2449 | 2450 | /supports-preserve-symlinks-flag@1.0.0: 2451 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2452 | engines: {node: '>= 0.4'} 2453 | dev: true 2454 | 2455 | /term-size@2.2.1: 2456 | resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} 2457 | engines: {node: '>=8'} 2458 | dev: true 2459 | 2460 | /thenify-all@1.6.0: 2461 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 2462 | engines: {node: '>=0.8'} 2463 | dependencies: 2464 | thenify: 3.3.1 2465 | dev: true 2466 | 2467 | /thenify@3.3.1: 2468 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 2469 | dependencies: 2470 | any-promise: 1.3.0 2471 | dev: true 2472 | 2473 | /tmp@0.0.33: 2474 | resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} 2475 | engines: {node: '>=0.6.0'} 2476 | dependencies: 2477 | os-tmpdir: 1.0.2 2478 | dev: true 2479 | 2480 | /to-regex-range@5.0.1: 2481 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2482 | engines: {node: '>=8.0'} 2483 | dependencies: 2484 | is-number: 7.0.0 2485 | dev: true 2486 | 2487 | /tr46@1.0.1: 2488 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 2489 | dependencies: 2490 | punycode: 2.3.1 2491 | dev: true 2492 | 2493 | /tree-kill@1.2.2: 2494 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 2495 | hasBin: true 2496 | dev: true 2497 | 2498 | /trim-newlines@3.0.1: 2499 | resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} 2500 | engines: {node: '>=8'} 2501 | dev: true 2502 | 2503 | /ts-interface-checker@0.1.13: 2504 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 2505 | dev: true 2506 | 2507 | /tsup@8.0.1(typescript@5.3.3): 2508 | resolution: {integrity: sha512-hvW7gUSG96j53ZTSlT4j/KL0q1Q2l6TqGBFc6/mu/L46IoNWqLLUzLRLP1R8Q7xrJTmkDxxDoojV5uCVs1sVOg==} 2509 | engines: {node: '>=18'} 2510 | hasBin: true 2511 | peerDependencies: 2512 | '@microsoft/api-extractor': ^7.36.0 2513 | '@swc/core': ^1 2514 | postcss: ^8.4.12 2515 | typescript: '>=4.5.0' 2516 | peerDependenciesMeta: 2517 | '@microsoft/api-extractor': 2518 | optional: true 2519 | '@swc/core': 2520 | optional: true 2521 | postcss: 2522 | optional: true 2523 | typescript: 2524 | optional: true 2525 | dependencies: 2526 | bundle-require: 4.0.2(esbuild@0.19.12) 2527 | cac: 6.7.14 2528 | chokidar: 3.5.3 2529 | debug: 4.3.4 2530 | esbuild: 0.19.12 2531 | execa: 5.1.1 2532 | globby: 11.1.0 2533 | joycon: 3.1.1 2534 | postcss-load-config: 4.0.2 2535 | resolve-from: 5.0.0 2536 | rollup: 4.9.6 2537 | source-map: 0.8.0-beta.0 2538 | sucrase: 3.35.0 2539 | tree-kill: 1.2.2 2540 | typescript: 5.3.3 2541 | transitivePeerDependencies: 2542 | - supports-color 2543 | - ts-node 2544 | dev: true 2545 | 2546 | /tty-table@4.2.3: 2547 | resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} 2548 | engines: {node: '>=8.0.0'} 2549 | hasBin: true 2550 | dependencies: 2551 | chalk: 4.1.2 2552 | csv: 5.5.3 2553 | kleur: 4.1.5 2554 | smartwrap: 2.0.2 2555 | strip-ansi: 6.0.1 2556 | wcwidth: 1.0.1 2557 | yargs: 17.7.2 2558 | dev: true 2559 | 2560 | /type-fest@0.13.1: 2561 | resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} 2562 | engines: {node: '>=10'} 2563 | dev: true 2564 | 2565 | /type-fest@0.6.0: 2566 | resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} 2567 | engines: {node: '>=8'} 2568 | dev: true 2569 | 2570 | /type-fest@0.8.1: 2571 | resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} 2572 | engines: {node: '>=8'} 2573 | dev: true 2574 | 2575 | /typed-array-buffer@1.0.0: 2576 | resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} 2577 | engines: {node: '>= 0.4'} 2578 | dependencies: 2579 | call-bind: 1.0.5 2580 | get-intrinsic: 1.2.2 2581 | is-typed-array: 1.1.12 2582 | dev: true 2583 | 2584 | /typed-array-byte-length@1.0.0: 2585 | resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} 2586 | engines: {node: '>= 0.4'} 2587 | dependencies: 2588 | call-bind: 1.0.5 2589 | for-each: 0.3.3 2590 | has-proto: 1.0.1 2591 | is-typed-array: 1.1.12 2592 | dev: true 2593 | 2594 | /typed-array-byte-offset@1.0.0: 2595 | resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} 2596 | engines: {node: '>= 0.4'} 2597 | dependencies: 2598 | available-typed-arrays: 1.0.5 2599 | call-bind: 1.0.5 2600 | for-each: 0.3.3 2601 | has-proto: 1.0.1 2602 | is-typed-array: 1.1.12 2603 | dev: true 2604 | 2605 | /typed-array-length@1.0.4: 2606 | resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} 2607 | dependencies: 2608 | call-bind: 1.0.5 2609 | for-each: 0.3.3 2610 | is-typed-array: 1.1.12 2611 | dev: true 2612 | 2613 | /typescript@5.3.3: 2614 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} 2615 | engines: {node: '>=14.17'} 2616 | hasBin: true 2617 | dev: true 2618 | 2619 | /unbox-primitive@1.0.2: 2620 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 2621 | dependencies: 2622 | call-bind: 1.0.5 2623 | has-bigints: 1.0.2 2624 | has-symbols: 1.0.3 2625 | which-boxed-primitive: 1.0.2 2626 | dev: true 2627 | 2628 | /undici-types@5.26.5: 2629 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 2630 | dev: true 2631 | 2632 | /universalify@0.1.2: 2633 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 2634 | engines: {node: '>= 4.0.0'} 2635 | dev: true 2636 | 2637 | /validate-npm-package-license@3.0.4: 2638 | resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 2639 | dependencies: 2640 | spdx-correct: 3.2.0 2641 | spdx-expression-parse: 3.0.1 2642 | dev: true 2643 | 2644 | /wcwidth@1.0.1: 2645 | resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} 2646 | dependencies: 2647 | defaults: 1.0.4 2648 | dev: true 2649 | 2650 | /webidl-conversions@4.0.2: 2651 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 2652 | dev: true 2653 | 2654 | /whatwg-url@7.1.0: 2655 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 2656 | dependencies: 2657 | lodash.sortby: 4.7.0 2658 | tr46: 1.0.1 2659 | webidl-conversions: 4.0.2 2660 | dev: true 2661 | 2662 | /which-boxed-primitive@1.0.2: 2663 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 2664 | dependencies: 2665 | is-bigint: 1.0.4 2666 | is-boolean-object: 1.1.2 2667 | is-number-object: 1.0.7 2668 | is-string: 1.0.7 2669 | is-symbol: 1.0.4 2670 | dev: true 2671 | 2672 | /which-module@2.0.1: 2673 | resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} 2674 | dev: true 2675 | 2676 | /which-pm@2.0.0: 2677 | resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} 2678 | engines: {node: '>=8.15'} 2679 | dependencies: 2680 | load-yaml-file: 0.2.0 2681 | path-exists: 4.0.0 2682 | dev: true 2683 | 2684 | /which-typed-array@1.1.13: 2685 | resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} 2686 | engines: {node: '>= 0.4'} 2687 | dependencies: 2688 | available-typed-arrays: 1.0.5 2689 | call-bind: 1.0.5 2690 | for-each: 0.3.3 2691 | gopd: 1.0.1 2692 | has-tostringtag: 1.0.0 2693 | dev: true 2694 | 2695 | /which@1.3.1: 2696 | resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 2697 | hasBin: true 2698 | dependencies: 2699 | isexe: 2.0.0 2700 | dev: true 2701 | 2702 | /which@2.0.2: 2703 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2704 | engines: {node: '>= 8'} 2705 | hasBin: true 2706 | dependencies: 2707 | isexe: 2.0.0 2708 | dev: true 2709 | 2710 | /wrap-ansi@6.2.0: 2711 | resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} 2712 | engines: {node: '>=8'} 2713 | dependencies: 2714 | ansi-styles: 4.3.0 2715 | string-width: 4.2.3 2716 | strip-ansi: 6.0.1 2717 | dev: true 2718 | 2719 | /wrap-ansi@7.0.0: 2720 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2721 | engines: {node: '>=10'} 2722 | dependencies: 2723 | ansi-styles: 4.3.0 2724 | string-width: 4.2.3 2725 | strip-ansi: 6.0.1 2726 | dev: true 2727 | 2728 | /wrap-ansi@8.1.0: 2729 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 2730 | engines: {node: '>=12'} 2731 | dependencies: 2732 | ansi-styles: 6.2.1 2733 | string-width: 5.1.2 2734 | strip-ansi: 7.1.0 2735 | dev: true 2736 | 2737 | /y18n@4.0.3: 2738 | resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} 2739 | dev: true 2740 | 2741 | /y18n@5.0.8: 2742 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 2743 | engines: {node: '>=10'} 2744 | dev: true 2745 | 2746 | /yallist@2.1.2: 2747 | resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} 2748 | dev: true 2749 | 2750 | /yallist@4.0.0: 2751 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2752 | dev: true 2753 | 2754 | /yaml@2.3.4: 2755 | resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} 2756 | engines: {node: '>= 14'} 2757 | dev: true 2758 | 2759 | /yargs-parser@18.1.3: 2760 | resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} 2761 | engines: {node: '>=6'} 2762 | dependencies: 2763 | camelcase: 5.3.1 2764 | decamelize: 1.2.0 2765 | dev: true 2766 | 2767 | /yargs-parser@21.1.1: 2768 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 2769 | engines: {node: '>=12'} 2770 | dev: true 2771 | 2772 | /yargs@15.4.1: 2773 | resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} 2774 | engines: {node: '>=8'} 2775 | dependencies: 2776 | cliui: 6.0.0 2777 | decamelize: 1.2.0 2778 | find-up: 4.1.0 2779 | get-caller-file: 2.0.5 2780 | require-directory: 2.1.1 2781 | require-main-filename: 2.0.0 2782 | set-blocking: 2.0.0 2783 | string-width: 4.2.3 2784 | which-module: 2.0.1 2785 | y18n: 4.0.3 2786 | yargs-parser: 18.1.3 2787 | dev: true 2788 | 2789 | /yargs@17.7.2: 2790 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 2791 | engines: {node: '>=12'} 2792 | dependencies: 2793 | cliui: 8.0.1 2794 | escalade: 3.1.1 2795 | get-caller-file: 2.0.5 2796 | require-directory: 2.1.1 2797 | string-width: 4.2.3 2798 | y18n: 5.0.8 2799 | yargs-parser: 21.1.1 2800 | dev: true 2801 | 2802 | /yocto-queue@0.1.0: 2803 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2804 | engines: {node: '>=10'} 2805 | dev: true 2806 | -------------------------------------------------------------------------------- /src/client.ts: -------------------------------------------------------------------------------- 1 | import PocketBase, { 2 | ListResult, 3 | OAuth2AuthConfig, 4 | RecordAuthResponse, 5 | RecordOptions, 6 | RecordService, 7 | RecordSubscription, 8 | SendOptions, 9 | UnsubscribeFunc 10 | } from 'pocketbase'; 11 | import { 12 | BaseRecord, 13 | GenericCollection, 14 | GenericSchema, 15 | MaybeArray, 16 | RecordWithExpandToDotPath 17 | } from './types.js'; 18 | import { 19 | ResolveSelectWithExpand, 20 | SelectWithExpand, 21 | resolveSelect 22 | } from './select.js'; 23 | import { Sort } from './sort.js'; 24 | import { Filter, serializeFilter } from './filter.js'; 25 | 26 | export interface ViewCollectionService< 27 | Collection extends GenericCollection, 28 | ExpandedRecord extends BaseRecord = RecordWithExpandToDotPath 29 | > { 30 | collectionName: Collection['collectionName']; 31 | client: PocketBase; 32 | 33 | subscribe | undefined>( 34 | topic: string, 35 | callback: ( 36 | data: RecordSubscription< 37 | ResolveSelectWithExpand 38 | > 39 | ) => void, 40 | options?: { 41 | select?: TSelect; 42 | } & SendOptions 43 | ): Promise; 44 | 45 | getFullList | undefined>( 46 | options?: { 47 | select?: TSelect; 48 | page?: number; 49 | perPage?: number; 50 | sort?: MaybeArray>; 51 | filter?: Filter; 52 | } & SendOptions 53 | ): Promise[]>; 54 | getList = {}>( 55 | page?: number, 56 | perPage?: number, 57 | options?: { 58 | select?: TSelect; 59 | sort?: MaybeArray>; 60 | filter?: Filter; 61 | } & SendOptions 62 | ): Promise>>; 63 | getFirstListItem = {}>( 64 | filter: Filter, 65 | options?: { 66 | select?: TSelect; 67 | sort?: MaybeArray>; 68 | } & SendOptions 69 | ): Promise>; 70 | getOne = {}>( 71 | id: string, 72 | options?: { 73 | select?: TSelect; 74 | } & SendOptions 75 | ): Promise>; 76 | 77 | createFilter(filter: Filter): Filter; 78 | 79 | createSort(...sort: Sort[]): Sort; 80 | 81 | createSelect>(select: T): T; 82 | } 83 | 84 | export interface BaseCollectionService 85 | extends ViewCollectionService { 86 | create = {}>( 87 | bodyParams: Collection['create'], 88 | options?: { 89 | select?: TSelect; 90 | } & SendOptions 91 | ): Promise>; 92 | update = {}>( 93 | id: string, 94 | bodyParams: Collection['update'], 95 | options?: { 96 | select?: TSelect; 97 | } & SendOptions 98 | ): Promise>; 99 | delete(id: string): Promise; 100 | } 101 | 102 | export interface AuthCollectionService 103 | extends BaseCollectionService, 104 | Pick { 105 | authWithPassword = {}>( 106 | usernameOrEmail: string, 107 | password: string, 108 | options?: { 109 | select?: TSelect; 110 | } & SendOptions 111 | ): Promise< 112 | RecordAuthResponse> 113 | >; 114 | authWithOAuth2Code = {}>( 115 | provider: string, 116 | code: string, 117 | codeVerifier: string, 118 | redirectUrl: string, 119 | createData?: { 120 | [key: string]: any; 121 | }, 122 | options?: { 123 | select?: TSelect; 124 | } & SendOptions 125 | ): Promise< 126 | RecordAuthResponse> 127 | >; 128 | authWithOAuth2( 129 | options: Omit & { 130 | createData?: Collection['create']; 131 | } & SendOptions 132 | ): Promise>; 133 | authRefresh = {}>( 134 | options?: { 135 | select?: TSelect; 136 | } & SendOptions 137 | ): Promise< 138 | RecordAuthResponse> 139 | >; 140 | } 141 | 142 | const FORWARD_METHODS = [ 143 | 'unsubscribe', 144 | 145 | 'listAuthMethods', 146 | 'requestPasswordReset', 147 | 'confirmPasswordReset', 148 | 'requestVerification', 149 | 'confirmVerification', 150 | 'requestEmailChange', 151 | 'confirmEmailChange', 152 | 'listExternalAuths', 153 | 'unlinkExternalAuth' 154 | ] as const; 155 | 156 | export class TypedRecordService 157 | implements BaseCollectionService 158 | { 159 | constructor(readonly service: RecordService) { 160 | for (const name of FORWARD_METHODS) { 161 | // @ts-ignore 162 | this[name] = this.service[name].bind(this.service); 163 | } 164 | } 165 | 166 | get client() { 167 | return this.service.client; 168 | } 169 | 170 | get collectionName() { 171 | return this.service.collectionIdOrName; 172 | } 173 | 174 | private prepareOptions({ 175 | select, 176 | filter, 177 | sort, 178 | ...options 179 | }: RecordOptions = {}): RecordOptions { 180 | const { expand, fields } = resolveSelect(select); 181 | 182 | if (fields) options.fields = fields; 183 | if (expand) options.expand = expand; 184 | if (filter) options.filter = serializeFilter(filter) ?? ''; 185 | 186 | if (Array.isArray(sort) && sort.length) { 187 | options.sort = sort.join(','); 188 | } else if (sort) { 189 | options.sort = sort; 190 | } 191 | 192 | return options; 193 | } 194 | 195 | createFilter(filter: Filter>) { 196 | return serializeFilter(filter); 197 | } 198 | 199 | createSort(...sorters: any[]): any { 200 | return sorters.filter((x) => typeof x === 'string').join(','); 201 | } 202 | 203 | createSelect(select: any) { 204 | return select; 205 | } 206 | 207 | subscribe( 208 | topic: string, 209 | callback: (data: RecordSubscription) => void, 210 | options?: SendOptions 211 | ): Promise { 212 | return this.service.subscribe( 213 | topic, 214 | callback, 215 | this.prepareOptions(options) 216 | ); 217 | } 218 | 219 | getFullList(options?: SendOptions) { 220 | return this.service.getFullList(this.prepareOptions(options)); 221 | } 222 | 223 | getList(page?: number, perPage?: number, options?: SendOptions) { 224 | return this.service.getList( 225 | page, 226 | perPage, 227 | this.prepareOptions(options) 228 | ); 229 | } 230 | 231 | getFirstListItem(filter: string, options?: SendOptions) { 232 | return this.service.getFirstListItem( 233 | filter, 234 | this.prepareOptions(options) 235 | ); 236 | } 237 | 238 | getOne( 239 | id: string, 240 | options?: { 241 | select?: any; 242 | } & SendOptions 243 | ): Promise { 244 | return this.service.getOne(id, this.prepareOptions(options)); 245 | } 246 | 247 | create( 248 | bodyParams?: 249 | | { 250 | [key: string]: any; 251 | } 252 | | FormData, 253 | options?: { 254 | select?: any; 255 | } & SendOptions 256 | ) { 257 | return this.service.create(bodyParams, this.prepareOptions(options)); 258 | } 259 | 260 | update( 261 | id: string, 262 | bodyParams?: 263 | | FormData 264 | | { 265 | [key: string]: any; 266 | }, 267 | options?: { 268 | select?: any; 269 | } & SendOptions 270 | ) { 271 | return this.service.update( 272 | id, 273 | bodyParams, 274 | this.prepareOptions(options) 275 | ); 276 | } 277 | 278 | delete(id: string, options?: SendOptions) { 279 | return this.service.delete(id, this.prepareOptions(options)); 280 | } 281 | 282 | authWithPassword( 283 | usernameOrEmail: string, 284 | password: string, 285 | options?: RecordOptions | undefined 286 | ) { 287 | return this.service.authWithPassword( 288 | usernameOrEmail, 289 | password, 290 | this.prepareOptions(options) 291 | ); 292 | } 293 | 294 | authWithOAuth2Code( 295 | provider: string, 296 | code: string, 297 | codeVerifier: string, 298 | redirectUrl: string, 299 | createData?: { [key: string]: any } | undefined, 300 | options?: RecordOptions | undefined 301 | ) { 302 | return this.service.authWithOAuth2Code( 303 | provider, 304 | code, 305 | codeVerifier, 306 | redirectUrl, 307 | createData, 308 | this.prepareOptions(options) 309 | ); 310 | } 311 | 312 | authWithOAuth2(options: OAuth2AuthConfig): Promise { 313 | return this.service.authWithOAuth2(options); 314 | } 315 | 316 | authRefresh(options?: RecordOptions | undefined) { 317 | return this.service.authRefresh(this.prepareOptions(options)); 318 | } 319 | } 320 | 321 | export class TypedPocketBase extends PocketBase { 322 | from< 323 | CollectionName extends keyof Schema, 324 | Collection extends GenericCollection = Schema[CollectionName] 325 | >( 326 | name: CollectionName 327 | ): Collection['type'] extends 'view' 328 | ? ViewCollectionService 329 | : Collection['type'] extends 'base' 330 | ? BaseCollectionService 331 | : AuthCollectionService { 332 | return new TypedRecordService(this.collection(name as string)) as any; 333 | } 334 | } 335 | -------------------------------------------------------------------------------- /src/codegen/ambient.d.ts: -------------------------------------------------------------------------------- 1 | declare const PKG_NAME: string; 2 | declare const PKG_VERSION: string; 3 | -------------------------------------------------------------------------------- /src/codegen/cli.ts: -------------------------------------------------------------------------------- 1 | import sade from 'sade'; 2 | import { generateTypes } from './index.js'; 3 | import { mkdir, writeFile } from 'node:fs/promises'; 4 | import { dirname, resolve } from 'node:path'; 5 | 6 | interface CliOptions { 7 | url?: string; 8 | email?: string; 9 | password?: string; 10 | out?: string; 11 | } 12 | 13 | sade(PKG_NAME, true) 14 | .version(PKG_VERSION) 15 | .describe('Generate types for the PocketBase JavaScript SDK') 16 | .option( 17 | '-u, --url', 18 | 'URL to your hosted pocketbase instance.', 19 | 'http://127.0.0.1:8090' 20 | ) 21 | .option('-e, --email', 'email for an admin pocketbase user.') 22 | .option('-p, --password', 'email for an admin pocketbase user.') 23 | .option( 24 | '-o, --out', 25 | 'path to save the typescript output file (prints to console by default)' 26 | ) 27 | .action( 28 | async ({ 29 | url, 30 | email = process.env.POCKETBASE_EMAIL, 31 | password = process.env.POCKETBASE_PASSWORD, 32 | out 33 | }: CliOptions) => { 34 | if (!url) error(`required option '-u, --url' not specified`); 35 | 36 | if (!email) 37 | error( 38 | `required option '-e, --email' not specified and 'POCKETBASE_EMAIL' env not set` 39 | ); 40 | 41 | if (!password) 42 | error( 43 | `required option '-p, --password' not specified and 'POCKETBASE_PASSWORD' env not set` 44 | ); 45 | 46 | const definition = await generateTypes({ 47 | url, 48 | email, 49 | password 50 | }); 51 | 52 | if (out) { 53 | const file = resolve(out); 54 | await mkdir(dirname(file), { recursive: true }); 55 | await writeFile(file, definition + '\n', 'utf-8'); 56 | } else { 57 | console.log(definition); 58 | } 59 | } 60 | ) 61 | .parse(process.argv); 62 | 63 | function error(msg: string): never { 64 | console.error(msg); 65 | process.exit(); 66 | } 67 | -------------------------------------------------------------------------------- /src/codegen/index.ts: -------------------------------------------------------------------------------- 1 | import PocketBase from 'pocketbase'; 2 | import { Collection, Field } from './types.js'; 3 | 4 | export interface GenerateOptions { 5 | url: string; 6 | email: string; 7 | password: string; 8 | } 9 | 10 | interface Columns { 11 | create: string[]; 12 | update: string[]; 13 | response: string[]; 14 | } 15 | 16 | interface Relation { 17 | name: string; 18 | target: CollectionDefinition; 19 | unique: boolean; 20 | } 21 | 22 | interface CollectionDefinition { 23 | id: string; 24 | name: string; 25 | type: Collection['type']; 26 | typeName: string; 27 | columns: Columns; 28 | relations: Relation[]; 29 | } 30 | 31 | export async function generateTypes({ url, email, password }: GenerateOptions) { 32 | const pb = new PocketBase(url); 33 | await pb.admins.authWithPassword(email, password); 34 | 35 | const collections = await pb.collections.getFullList(); 36 | const definitions = buildCollectionDefinitions(collections); 37 | 38 | const definition = `/** 39 | * This file was @generated using typed-pocketbase 40 | */ 41 | 42 | // https://pocketbase.io/docs/collections/#base-collection 43 | export interface BaseCollectionResponse { 44 | /** 45 | * 15 characters string to store as record ID. 46 | */ 47 | id: string; 48 | /** 49 | * Date string representation for the creation date. 50 | */ 51 | created: string; 52 | /** 53 | * Date string representation for the creation date. 54 | */ 55 | updated: string; 56 | /** 57 | * The collection id. 58 | */ 59 | collectionId: string; 60 | /** 61 | * The collection name. 62 | */ 63 | collectionName: string; 64 | } 65 | 66 | // https://pocketbase.io/docs/api-records/#create-record 67 | export interface BaseCollectionCreate { 68 | /** 69 | * 15 characters string to store as record ID. 70 | * If not set, it will be auto generated. 71 | */ 72 | id?: string; 73 | } 74 | 75 | // https://pocketbase.io/docs/api-records/#update-record 76 | export interface BaseCollectionUpdate {} 77 | 78 | // https://pocketbase.io/docs/collections/#auth-collection 79 | export interface AuthCollectionResponse extends BaseCollectionResponse { 80 | /** 81 | * The username of the auth record. 82 | */ 83 | username: string; 84 | /** 85 | * Auth record email address. 86 | */ 87 | email: string; 88 | /** 89 | * Whether to show/hide the auth record email when fetching the record data. 90 | */ 91 | emailVisibility: boolean; 92 | /** 93 | * Indicates whether the auth record is verified or not. 94 | */ 95 | verified: boolean; 96 | } 97 | 98 | // https://pocketbase.io/docs/api-records/#create-record 99 | export interface AuthCollectionCreate extends BaseCollectionCreate { 100 | /** 101 | * The username of the auth record. 102 | * If not set, it will be auto generated. 103 | */ 104 | username?: string; 105 | /** 106 | * Auth record email address. 107 | */ 108 | email?: string; 109 | /** 110 | * Whether to show/hide the auth record email when fetching the record data. 111 | */ 112 | emailVisibility?: boolean; 113 | /** 114 | * Auth record password. 115 | */ 116 | password: string; 117 | /** 118 | * Auth record password confirmation. 119 | */ 120 | passwordConfirm: string; 121 | /** 122 | * Indicates whether the auth record is verified or not. 123 | * This field can be set only by admins or auth records with "Manage" access. 124 | */ 125 | verified?: boolean; 126 | } 127 | 128 | // https://pocketbase.io/docs/api-records/#update-record 129 | export interface AuthCollectionUpdate { 130 | /** 131 | * The username of the auth record. 132 | */ 133 | username?: string; 134 | /** 135 | * The auth record email address. 136 | * This field can be updated only by admins or auth records with "Manage" access. 137 | * Regular accounts can update their email by calling "Request email change". 138 | */ 139 | email?: string; 140 | /** 141 | * Whether to show/hide the auth record email when fetching the record data. 142 | */ 143 | emailVisibility?: boolean; 144 | /** 145 | * Old auth record password. 146 | * This field is required only when changing the record password. Admins and auth records with "Manage" access can skip this field. 147 | */ 148 | oldPassword?: string; 149 | /** 150 | * New auth record password. 151 | */ 152 | password?: string; 153 | /** 154 | * New auth record password confirmation. 155 | */ 156 | passwordConfirm?: string; 157 | /** 158 | * Indicates whether the auth record is verified or not. 159 | * This field can be set only by admins or auth records with "Manage" access. 160 | */ 161 | verified?: boolean; 162 | } 163 | 164 | // https://pocketbase.io/docs/collections/#view-collection 165 | export interface ViewCollectionRecord { 166 | id: string; 167 | } 168 | 169 | // utilities 170 | 171 | type MaybeArray = T | T[]; 172 | 173 | ${definitions.map(createCollectionTypes).join('\n\n')} 174 | 175 | // ===== Schema ===== 176 | 177 | export type Schema = { 178 | ${definitions 179 | .map(({ name }) => `${name}: ${pascalCase(name)}Collection;`) 180 | .join(`\n\t`)} 181 | };`; 182 | 183 | return definition; 184 | } 185 | 186 | function createCollectionTypes({ 187 | name, 188 | relations, 189 | columns, 190 | type, 191 | typeName 192 | }: CollectionDefinition) { 193 | const prefix = pascalCase(type); 194 | const base = `${prefix}Collection`; 195 | 196 | let out = `// ===== ${name} =====`; 197 | 198 | const { response, create, update } = columns; 199 | 200 | const responseColumns = [`collectionName: '${name}';`, ...response]; 201 | 202 | out += `\n\nexport interface ${typeName}Response extends ${base}Response {\n\t${responseColumns.join( 203 | `\n\t` 204 | )}\n}`; 205 | 206 | if (type !== 'view') { 207 | const createBody = create.length 208 | ? `{\n\t${create.join(`\n\t`)}\n}` 209 | : '{}'; 210 | 211 | out += `\n\nexport interface ${typeName}Create extends ${base}Create ${createBody}`; 212 | 213 | const updateBody = update.length 214 | ? `{\n\t${update.join(`\n\t`)}\n}` 215 | : '{}'; 216 | 217 | out += `\n\nexport interface ${typeName}Update extends ${base}Update ${updateBody}`; 218 | } 219 | 220 | const createRelations = () => { 221 | return relations 222 | .map( 223 | (r) => 224 | `${/^\w+$/.test(r.name) ? r.name : `'${r.name}'`}: ${ 225 | r.target.typeName 226 | }Collection${r.unique ? '' : '[]'};` 227 | ) 228 | .join('\n\t\t'); 229 | }; 230 | 231 | const collectionBody = [ 232 | `type: '${type}';`, 233 | `collectionId: string;`, 234 | `collectionName: '${name}';`, 235 | `response: ${typeName}Response;`, 236 | type !== 'view' && `create: ${typeName}Create;`, 237 | type !== 'view' && `update: ${typeName}Update;`, 238 | `relations: ${ 239 | relations.length === 0 240 | ? 'Record;' 241 | : `{\n\t\t${createRelations()}\n\t};` 242 | }` 243 | ].filter(Boolean); 244 | 245 | out += `\n\nexport interface ${typeName}Collection { 246 | ${collectionBody.join('\n\t')} 247 | }`; 248 | 249 | return out; 250 | } 251 | 252 | function buildCollectionDefinitions(collections: Collection[]) { 253 | const deferred: Array<() => void> = []; 254 | const definitions = new Map(); 255 | 256 | for (const collection of collections) { 257 | const columns: Columns = { 258 | create: [], 259 | update: [], 260 | response: [] 261 | }; 262 | const relations: Relation[] = []; 263 | 264 | for (const field of collection.schema) { 265 | getFieldType(field, columns); 266 | 267 | if (field.type === 'relation') { 268 | deferred.push(() => { 269 | const from = definitions.get(collection.id); 270 | const target = definitions.get(field.options.collectionId); 271 | 272 | if (!from) 273 | throw new Error( 274 | `Collection ${collection.id} not found for relation ${collection.name}.${field.name}` 275 | ); 276 | if (!target) 277 | throw new Error( 278 | `Collection ${field.options.collectionId} not found for relation ${collection.name}.${field.name}` 279 | ); 280 | 281 | relations.push({ 282 | name: field.name, 283 | target, 284 | unique: field.options.maxSelect === 1 285 | }); 286 | 287 | /** 288 | * indirect expand 289 | * @see https://pocketbase.io/docs/expanding-relations/#indirect-expand 290 | */ 291 | 292 | const indicies = collection.indexes.map(parseIndex); 293 | 294 | const isUnique = indicies.some( 295 | (index) => 296 | index && 297 | index.unique && 298 | index.fields.length === 1 && 299 | index.fields[0] === field.name 300 | ); 301 | 302 | target.relations.push({ 303 | name: `${collection.name}(${field.name})`, 304 | target: from, 305 | unique: isUnique 306 | }); 307 | }); 308 | } 309 | } 310 | 311 | definitions.set(collection.id, { 312 | id: collection.id, 313 | name: collection.name, 314 | type: collection.type, 315 | columns, 316 | relations, 317 | typeName: pascalCase(collection.name) 318 | }); 319 | } 320 | 321 | deferred.forEach((c) => c()); 322 | 323 | return Array.from(definitions.values()); 324 | } 325 | 326 | function getFieldType(field: Field, { response, create, update }: Columns) { 327 | const addResponse = (type: string, name = field.name) => 328 | response.push(`${name}: ${type};`); 329 | const addCreate = (type: string, name = field.name) => 330 | create.push(`${name}${field.required ? '' : '?'}: ${type};`); 331 | const addUpdate = (type: string, name = field.name) => 332 | update.push(`${name}?: ${type};`); 333 | const addAll = (type: string) => { 334 | addResponse(type); 335 | addCreate(type); 336 | addUpdate(type); 337 | }; 338 | 339 | switch (field.type) { 340 | case 'text': 341 | case 'editor': // rich text 342 | case 'email': { 343 | addAll('string'); 344 | break; 345 | } 346 | case 'url': { 347 | addCreate('string | URL'); 348 | addUpdate('string | URL'); 349 | addResponse('string'); 350 | break; 351 | } 352 | case 'date': { 353 | addCreate('string | Date'); 354 | addUpdate('string | Date'); 355 | addResponse('string'); 356 | break; 357 | } 358 | case 'number': { 359 | const type = 'number'; 360 | addAll(type); 361 | addUpdate(type, `'${field.name}+'`); 362 | addUpdate(type, `'${field.name}-'`); 363 | break; 364 | } 365 | case 'bool': { 366 | addAll('boolean'); 367 | break; 368 | } 369 | case 'select': { 370 | const single = field.options.maxSelect === 1; 371 | const values = 372 | !field.required && single 373 | ? ['', ...field.options.values] 374 | : field.options.values; 375 | const singleType = values.map((v) => `'${v}'`).join(' | '); 376 | const type = single ? `${singleType}` : `MaybeArray<${singleType}>`; 377 | 378 | addResponse(single ? singleType : `Array<${singleType}>`); 379 | addCreate(type); 380 | addUpdate(type); 381 | if (!single) { 382 | addUpdate(type, `'${field.name}+'`); 383 | addUpdate(type, `'${field.name}-'`); 384 | } 385 | 386 | break; 387 | } 388 | case 'relation': { 389 | const singleType = 'string'; 390 | const single = field.options.maxSelect === 1; 391 | const type = single ? singleType : `MaybeArray<${singleType}>`; 392 | 393 | addResponse(single ? singleType : `Array<${singleType}>`); 394 | addCreate(type); 395 | addUpdate(type); 396 | if (!single) { 397 | addUpdate(type, `'${field.name}+'`); 398 | addUpdate(type, `'${field.name}-'`); 399 | } 400 | break; 401 | } 402 | case 'file': { 403 | const single = field.options.maxSelect === 1; 404 | 405 | addResponse(single ? 'string' : `Array`); 406 | addCreate(single ? `File | null` : `MaybeArray`); 407 | addUpdate(single ? `File | null` : `MaybeArray`); 408 | if (!single) { 409 | addUpdate('string', `'${field.name}-'`); 410 | } 411 | break; 412 | } 413 | case 'json': { 414 | addAll('any'); 415 | break; 416 | } 417 | default: 418 | console.warn(`Unknown type ${(field as { type: string }).type}.`); 419 | console.warn( 420 | `Feel free to open an issue about this warning https://github.com/david-plugge/typed-pocketbase/issues.` 421 | ); 422 | addAll('unknown'); 423 | } 424 | } 425 | 426 | function parseIndex(index: string) { 427 | const match = index.match( 428 | /^CREATE(\s+UNIQUE)?\s+INDEX\s+`(\w+)`\s+ON\s+`(\w+)`\s+\(([\s\S]*)\)$/ 429 | ); 430 | if (!match) return null; 431 | const [_, unique, name, collection, definition] = match; 432 | 433 | const fields = Array.from(definition.matchAll(/`(\S*)`/g)).map((m) => m[1]); 434 | 435 | return { 436 | unique: !!unique, 437 | name, 438 | collection, 439 | fields 440 | }; 441 | } 442 | 443 | function pascalCase(str: string) { 444 | return str 445 | .replace(/[-_]([a-z])/g, (m) => m[1].toUpperCase()) 446 | .replace(/^\w/, (s) => s.toUpperCase()); 447 | } 448 | -------------------------------------------------------------------------------- /src/codegen/types.ts: -------------------------------------------------------------------------------- 1 | import { SchemaField, CollectionModel } from 'pocketbase'; 2 | 3 | export type CollectionType = 'auth' | 'view' | 'base'; 4 | 5 | interface GenericCollection extends CollectionModel { 6 | schema: Field[]; 7 | } 8 | 9 | export interface BaseCollection extends GenericCollection { 10 | type: 'base'; 11 | options: {}; 12 | } 13 | 14 | export interface ViewCollection extends GenericCollection { 15 | type: 'view'; 16 | options: { 17 | query: string; 18 | }; 19 | } 20 | 21 | export interface AuthCollection extends GenericCollection { 22 | type: 'auth'; 23 | options: { 24 | allowEmailAuth: boolean; 25 | allowOAuth2Auth: boolean; 26 | allowUsernameAuth: boolean; 27 | exceptEmailDomains: string[] | null; 28 | onlyEmailDomains: string[] | null; 29 | manageRule: string | null; 30 | minPasswordLength: number; 31 | requireEmail: boolean; 32 | }; 33 | } 34 | 35 | export type Collection = BaseCollection | ViewCollection | AuthCollection; 36 | 37 | export type FieldType = 38 | | 'text' 39 | | 'editor' 40 | | 'number' 41 | | 'bool' 42 | | 'email' 43 | | 'url' 44 | | 'date' 45 | | 'select' 46 | | 'relation' 47 | | 'file' 48 | | 'json'; 49 | 50 | export interface TextField extends SchemaField { 51 | type: 'text'; 52 | options: { 53 | min: number | null; 54 | max: number | null; 55 | pattern: string | null; 56 | }; 57 | } 58 | 59 | export interface EditorField extends SchemaField { 60 | type: 'editor'; 61 | options: { 62 | exceptDomains: []; 63 | onlyDomains: []; 64 | }; 65 | } 66 | 67 | export interface NumberField extends SchemaField { 68 | type: 'number'; 69 | options: { 70 | min: number | null; 71 | max: number | null; 72 | }; 73 | } 74 | 75 | export interface BoolField extends SchemaField { 76 | type: 'bool'; 77 | options: {}; 78 | } 79 | 80 | export interface EmailField extends SchemaField { 81 | type: 'email'; 82 | options: { 83 | exceptDomains: [] | null; 84 | onlyDomains: [] | null; 85 | }; 86 | } 87 | 88 | export interface UrlField extends SchemaField { 89 | type: 'url'; 90 | options: { 91 | exceptDomains: []; 92 | onlyDomains: []; 93 | }; 94 | } 95 | 96 | export interface DateField extends SchemaField { 97 | type: 'date'; 98 | options: { 99 | min: string; 100 | max: string; 101 | }; 102 | } 103 | 104 | export interface SelectField extends SchemaField { 105 | type: 'select'; 106 | options: { 107 | maxSelect: number; 108 | values: string[]; 109 | }; 110 | } 111 | 112 | export interface RelationField extends SchemaField { 113 | type: 'relation'; 114 | options: { 115 | collectionId: string; 116 | cascadeDelete: boolean; 117 | minSelect: number | null; 118 | maxSelect: number; 119 | displayFields: string[] | null; 120 | }; 121 | } 122 | 123 | export interface FileField extends SchemaField { 124 | type: 'file'; 125 | options: { 126 | maxSelect: number; 127 | maxSize: number; 128 | mimeTypes: string[]; 129 | thumbs: string[] | null; 130 | protected: boolean; 131 | }; 132 | } 133 | 134 | export interface JsonField extends SchemaField { 135 | type: 'json'; 136 | options: { 137 | maxSize: number; 138 | }; 139 | } 140 | 141 | export type Field = 142 | | TextField 143 | | EditorField 144 | | NumberField 145 | | BoolField 146 | | EmailField 147 | | UrlField 148 | | DateField 149 | | SelectField 150 | | RelationField 151 | | FileField 152 | | JsonField; 153 | -------------------------------------------------------------------------------- /src/filter.ts: -------------------------------------------------------------------------------- 1 | import type { BaseRecord } from './types.js'; 2 | 3 | type ActualFilter = [ 4 | K, 5 | FilterOperand, 6 | T[K] 7 | ]; 8 | 9 | export type FilterOperand = 10 | | '=' 11 | | '!=' 12 | | '>' 13 | | '>=' 14 | | '<' 15 | | '<=' 16 | | '~' 17 | | '!~' 18 | | '?=' 19 | | '?!=' 20 | | '?>' 21 | | '?>=' 22 | | '?<' 23 | | '?<=' 24 | | '?~' 25 | | '?!~'; 26 | 27 | export type FilterParam = { __record__?: T } & string; 28 | 29 | export type Filter = 30 | | ActualFilter 31 | | FilterParam 32 | | false 33 | | null 34 | | undefined; 35 | 36 | export function serializeFilterTuple([key, op, val]: ActualFilter) { 37 | const type = typeof val; 38 | if (type === 'boolean' || type === 'number') { 39 | val = val.toString(); 40 | } else if (type === 'string') { 41 | val = "'" + val.replace(/'/g, "\\'") + "'"; 42 | } else if (val === null) { 43 | val = 'null'; 44 | } else if (val instanceof Date) { 45 | val = "'" + val.toISOString().replace('T', ' ') + "'"; 46 | } else { 47 | val = "'" + JSON.stringify(val).replace(/'/g, "\\'") + "'"; 48 | } 49 | 50 | return `${String(key)} ${op} ${val}`; 51 | } 52 | 53 | export function serializeFilter(filter: Filter): string | null { 54 | if (!filter) return null; 55 | return Array.isArray(filter) ? serializeFilterTuple(filter) : filter; 56 | } 57 | 58 | export function serializeFilters(filters: Filter[]) { 59 | return filters.filter((val) => !!val).map(serializeFilter); 60 | } 61 | 62 | export function and( 63 | ...filters: Filter[] 64 | ): FilterParam { 65 | const str = serializeFilters(filters).join(' && '); 66 | if (!str.length) return ''; 67 | return `(${str})`; 68 | } 69 | 70 | export function or( 71 | ...filters: Filter[] 72 | ): FilterParam { 73 | const str = serializeFilters(filters).join(' || '); 74 | if (!str.length) return ''; 75 | return `(${str})`; 76 | } 77 | 78 | export function eq( 79 | column: Key, 80 | value: T[Key] 81 | ): FilterParam { 82 | return serializeFilterTuple([column, '=', value]); 83 | } 84 | 85 | export function neq( 86 | column: Key, 87 | value: T[Key] 88 | ): FilterParam { 89 | return serializeFilterTuple([column, '!=', value]); 90 | } 91 | 92 | export function gt( 93 | column: Key, 94 | value: T[Key] 95 | ): FilterParam { 96 | return serializeFilterTuple([column, '>', value]); 97 | } 98 | 99 | export function gte( 100 | column: Key, 101 | value: T[Key] 102 | ): FilterParam { 103 | return serializeFilterTuple([column, '>=', value]); 104 | } 105 | 106 | export function lt( 107 | column: Key, 108 | value: T[Key] 109 | ): FilterParam { 110 | return serializeFilterTuple([column, '<', value]); 111 | } 112 | 113 | export function lte( 114 | column: Key, 115 | value: T[Key] 116 | ): FilterParam { 117 | return serializeFilterTuple([column, '<=', value]); 118 | } 119 | 120 | export function like( 121 | column: Key, 122 | value: T[Key] 123 | ): FilterParam { 124 | return serializeFilterTuple([column, '~', value]); 125 | } 126 | 127 | export function nlike( 128 | column: Key, 129 | value: T[Key] 130 | ): FilterParam { 131 | return serializeFilterTuple([column, '!~', value]); 132 | } 133 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export type { 2 | ResolveSelect, 3 | ResolveSelectWithExpand, 4 | Select, 5 | SelectWithExpand 6 | } from './select.js'; 7 | export { 8 | and, 9 | or, 10 | eq, 11 | gt, 12 | gte, 13 | like, 14 | lt, 15 | lte, 16 | neq, 17 | nlike, 18 | type Filter 19 | } from './filter.js'; 20 | export type { Sort } from './sort.js'; 21 | export type { GenericSchema, GenericCollection, TypedRecord } from './types.js'; 22 | export { 23 | type AuthCollectionService, 24 | type BaseCollectionService, 25 | type ViewCollectionService, 26 | TypedPocketBase, 27 | TypedRecordService 28 | } from './client.js'; 29 | -------------------------------------------------------------------------------- /src/select.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ArrayInnerType, 3 | GenericCollection, 4 | MaybeMakeArray, 5 | Prettify 6 | } from './types.js'; 7 | 8 | export type Select = { 9 | [K in keyof Collection['response']]?: boolean; 10 | }; 11 | 12 | export type SelectWithExpand = 13 | Select & { 14 | expand?: { 15 | [K in keyof Collection['relations']]?: 16 | | SelectWithExpand> 17 | | boolean; 18 | }; 19 | }; 20 | 21 | export type ResolveSelect< 22 | TCollection extends GenericCollection, 23 | TSelect extends Select | undefined 24 | > = 25 | Extract extends never 26 | ? TCollection['response'] 27 | : { 28 | [K in keyof TSelect & 29 | keyof TCollection['response'] as TSelect[K] extends true 30 | ? K 31 | : never]: TCollection['response'][K]; 32 | }; 33 | 34 | export type ResolveSelectWithExpand< 35 | TCollection extends GenericCollection, 36 | TSelect extends Select | undefined 37 | > = Prettify< 38 | ResolveSelect & 39 | ('expand' extends keyof TSelect 40 | ? { 41 | expand?: { 42 | [Relation in keyof TSelect['expand'] & 43 | keyof TCollection['relations'] as TSelect['expand'][Relation] extends false 44 | ? never 45 | : Relation]?: TSelect['expand'][Relation] extends true 46 | ? MaybeMakeArray< 47 | TCollection['relations'][Relation], 48 | ArrayInnerType< 49 | TCollection['relations'][Relation] 50 | >['response'] 51 | > 52 | : TSelect['expand'][Relation] extends object 53 | ? MaybeMakeArray< 54 | TCollection['relations'][Relation], 55 | ResolveSelectWithExpand< 56 | ArrayInnerType< 57 | TCollection['relations'][Relation] 58 | >, 59 | TSelect['expand'][Relation] 60 | > 61 | > 62 | : never; 63 | }; 64 | } 65 | : {}) 66 | >; 67 | 68 | export function resolveSelect(select: any) { 69 | const fieldList: string[] = []; 70 | const expandList: string[] = []; 71 | 72 | if (select) { 73 | (function recurse( 74 | { expand, ...rest }: SelectWithExpand, 75 | fieldsParent: string[] = [], 76 | expandParent: string[] = [] 77 | ) { 78 | if (Object.keys(rest).length === 0) { 79 | fieldList.push([...fieldsParent, '*'].join('.')); 80 | } else { 81 | for (const key in rest) { 82 | if (rest[key]) { 83 | fieldList.push([...fieldsParent, key].join('.')); 84 | } 85 | } 86 | } 87 | 88 | if (expand) { 89 | for (const key in expand) { 90 | const sub = expand[key]; 91 | if (sub === true) { 92 | expandList.push([...expandParent, key].join('.')); 93 | fieldList.push( 94 | [...fieldsParent, 'expand', key, '*'].join('.') 95 | ); 96 | } else if (sub) { 97 | expandList.push([...expandParent, key].join('.')); 98 | recurse( 99 | sub, 100 | [...fieldsParent, 'expand', key], 101 | [...expandParent, key] 102 | ); 103 | } 104 | } 105 | } 106 | })(select); 107 | } else { 108 | fieldList.push('*'); 109 | } 110 | 111 | return { 112 | fields: fieldList.join(','), 113 | expand: expandList.join(',') 114 | }; 115 | } 116 | -------------------------------------------------------------------------------- /src/sort.ts: -------------------------------------------------------------------------------- 1 | import type { BaseRecord } from './types.js'; 2 | 3 | export type Sort = 4 | | `${'+' | '-'}${keyof T & string}` 5 | | false 6 | | null 7 | | undefined; 8 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export type Prettify = T extends infer o ? { [K in keyof o]: o[K] } : never; 2 | export type MaybeArray = T | T[]; 3 | export type MaybeMakeArray = T extends any[] ? Out[] : Out; 4 | export type ArrayInnerType = T extends Array ? V : T; 5 | export type Values = T[keyof T]; 6 | export type Overide = Prettify & B>; 7 | export type RemoveIndex = { 8 | [K in keyof T as string extends K 9 | ? never 10 | : number extends K 11 | ? never 12 | : symbol extends K 13 | ? never 14 | : K]: T[K]; 15 | }; 16 | export type LooseAutocomplete = T | (string & {}); 17 | export type UnionToIntersection = ( 18 | T extends any ? (x: T) => any : never 19 | ) extends (x: infer R) => any 20 | ? R 21 | : never; 22 | 23 | export type BaseRecord = Record; 24 | 25 | export type BaseSystemFields = { 26 | id: string; 27 | created: string; 28 | updated: string; 29 | }; 30 | 31 | export type GenericCollection = { 32 | type: string; 33 | collectionId: string; 34 | collectionName: string; 35 | response: BaseRecord; 36 | create?: BaseRecord; 37 | update?: BaseRecord; 38 | relations: Record; 39 | }; 40 | 41 | export type GenericSchema = { 42 | [K: string]: GenericCollection; 43 | }; 44 | 45 | export type TypedRecord< 46 | Data extends BaseRecord, 47 | Expand extends GenericExpand = {} 48 | > = Data & { 49 | expand: Expand; 50 | }; 51 | 52 | export interface SystemFields { 53 | id: string; 54 | created: string; 55 | update: string; 56 | } 57 | 58 | export type BaseCollectionRecords = Record; 59 | 60 | export type Fields = keyof T['response']; 61 | export type Columns = T['response']; 62 | 63 | export type Expands = { 64 | [K in keyof T['relations']]?: T['relations'][K] extends GenericCollection[] 65 | ? TypedRecord< 66 | T['relations'][K][number], 67 | Expands 68 | >[] 69 | : T['relations'][K] extends GenericCollection 70 | ? TypedRecord> 71 | : never; 72 | }; 73 | 74 | export type GenericExpand = Record< 75 | string, 76 | TypedRecord | TypedRecord[] 77 | >; 78 | 79 | type JoinPath = Parts extends [ 80 | infer A extends string, 81 | ...infer Rest extends string[] 82 | ] 83 | ? Rest['length'] extends 0 84 | ? A 85 | : `${A}.${JoinPath}` 86 | : never; 87 | 88 | type _RecordWithExpandToDotPath< 89 | T extends GenericCollection, 90 | Path extends string[] = [] 91 | > = { 92 | [K in keyof T['response'] as JoinPath< 93 | [...Path, K & string] 94 | >]: T['response'][K]; 95 | } & (Path['length'] extends 4 // Supports up to 6-levels depth nested relations expansion. 96 | ? {} 97 | : UnionToIntersection< 98 | Values<{ 99 | [K in keyof T['relations']]: _RecordWithExpandToDotPath< 100 | ArrayInnerType, 101 | [...Path, K & string] 102 | >; 103 | }> 104 | >); 105 | 106 | export type RecordWithExpandToDotPath = Prettify< 107 | _RecordWithExpandToDotPath 108 | >; 109 | 110 | export type ReservedRecordNames = 'collectionId' | 'collectionName'; 111 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "ts-node": { 3 | "esm": true 4 | }, 5 | "compilerOptions": { 6 | "module": "NodeNext", 7 | "target": "ESNext", 8 | "moduleResolution": "NodeNext", 9 | "forceConsistentCasingInFileNames": true, 10 | "strict": true, 11 | "esModuleInterop": true, 12 | "noEmit": true 13 | }, 14 | "include": ["src"], 15 | "exclude": ["node_modules"] 16 | } 17 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsup'; 2 | import { name, version } from './package.json'; 3 | 4 | export default defineConfig([ 5 | { 6 | entry: ['src/index.ts'], 7 | format: ['esm'], 8 | outDir: 'dist/client', 9 | dts: true, 10 | sourcemap: true, 11 | clean: true 12 | }, 13 | { 14 | entry: ['src/codegen/cli.ts'], 15 | format: ['esm'], 16 | outDir: 'dist/codegen', 17 | dts: false, 18 | sourcemap: false, 19 | clean: true, 20 | banner: { 21 | js: '#!/usr/bin/env node' 22 | }, 23 | define: { 24 | PKG_NAME: JSON.stringify(name), 25 | PKG_VERSION: JSON.stringify(version) 26 | } 27 | } 28 | ]); 29 | --------------------------------------------------------------------------------