Compare commits
	
		
			3 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| dc0ba32801 | |||
| 4d1c06c5be | |||
| 8b1e9d1cf6 | 
| @@ -1,10 +1,10 @@ | |||||||
| { | { | ||||||
|   "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", | 	"$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", | ||||||
|   "changelog": "@changesets/cli/changelog", | 	"changelog": "@changesets/cli/changelog", | ||||||
|   "commit": false, | 	"commit": false, | ||||||
|   "fixed": [], | 	"fixed": [], | ||||||
|   "linked": [], | 	"linked": [], | ||||||
|   "access": "public", | 	"access": "public", | ||||||
|   "baseBranch": "main", | 	"baseBranch": "main", | ||||||
|   "updateInternalDependencies": "patch" | 	"updateInternalDependencies": "patch" | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								.zed/settings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								.zed/settings.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | { | ||||||
|  | 	"lsp": { | ||||||
|  | 		"biome": { | ||||||
|  | 			"settings": { | ||||||
|  | 				"config_path": "./biome.json" | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -16,17 +16,22 @@ This repository is a continuation of [Gregory Bouteiller's zod-pocketbase](https | |||||||
| ## Changes from Original | ## Changes from Original | ||||||
|  |  | ||||||
| ### Project Structure | ### Project Structure | ||||||
|  | - Added `flake.nix` for **NixOS** development environment. | ||||||
| - Removed `doc/`, `playground/` and monorepo configuration | - Removed `doc/`, `playground/` and monorepo configuration | ||||||
| - Replaced `pnpm` and `node` in favor of `bun` | - Replaced `pnpm` and `node` in favor of `bun` | ||||||
| - Switched `.github/` to `.gitea/` and `gh` to `tea` | - Switched `.github/` to `.gitea/` and `gh` to `tea` | ||||||
|  | - Switched from `eslint` and `prettier` to `biome`. | ||||||
|  |  | ||||||
| ### Dependencies & Code | ### Dependencies & Code | ||||||
| - Migrated from `tsup` to `tsdown` | - Migrated from `tsup` to `tsdown` | ||||||
| - Updated all npm dependencies (except `zod`, which was only updated to the latest 3 version) | - Updated all npm dependencies | ||||||
| - Removed unused dependencies | - Removed unused dependencies | ||||||
| - Fixed `getPocketbase` function in `sdk.ts` to match the latest PocketBase version | - Fixed `getPocketbase` function in `sdk.ts` to match the latest PocketBase version | ||||||
| - Implemented most TODOs left in `content.ts` | - Implemented most TODOs left in `content.ts` | ||||||
|  |  | ||||||
|  | ### Not working (yet) | ||||||
|  | - Expanding `Relation` field with type `Multiple` is not working for now. Try to avoid using it. | ||||||
|  |  | ||||||
| ## License | ## License | ||||||
|  |  | ||||||
| [MIT License](./LICENSE) | [MIT License](./LICENSE) | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ export type BaseModel = z.infer<typeof BaseModel>; | |||||||
| export const AdminModel = z.object({ | export const AdminModel = z.object({ | ||||||
|   ...BaseModel.shape, |   ...BaseModel.shape, | ||||||
|   avatar: z.string(), |   avatar: z.string(), | ||||||
|   email: z.string().email(), |   email: z.email(), | ||||||
| }); | }); | ||||||
| export type AdminModel = z.infer<typeof AdminModel>; | export type AdminModel = z.infer<typeof AdminModel>; | ||||||
|  |  | ||||||
| @@ -37,7 +37,7 @@ export type RecordModel = z.infer<typeof RecordModel>; | |||||||
| export const pbJsonField = (maxSizeInBytes: number = 1048576) => { | export const pbJsonField = (maxSizeInBytes: number = 1048576) => { | ||||||
|   const literalSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]); |   const literalSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]); | ||||||
|   const jsonSchema: z.ZodType<any> = z.lazy(() => |   const jsonSchema: z.ZodType<any> = z.lazy(() => | ||||||
|     z.union([literalSchema, z.array(jsonSchema), z.record(jsonSchema)]) |     z.union([literalSchema, z.array(jsonSchema), z.record(z.string(), jsonSchema)]) | ||||||
|   ); |   ); | ||||||
|  |  | ||||||
|   const stringTransform = z.string() |   const stringTransform = z.string() | ||||||
| @@ -55,7 +55,7 @@ export const pbJsonField = (maxSizeInBytes: number = 1048576) => { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|       const num = Number(val); |       const num = Number(val); | ||||||
|       if (!isNaN(num) && isFinite(num) && val.trim() !== '') |       if (!Number.isNaN(num) && Number.isFinite(num) && val.trim() !== '') | ||||||
|         return num; |         return num; | ||||||
|  |  | ||||||
|       if (val.startsWith('"') && val.endsWith('"')) |       if (val.startsWith('"') && val.endsWith('"')) | ||||||
|   | |||||||
							
								
								
									
										41
									
								
								biome.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								biome.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | |||||||
|  | { | ||||||
|  | 	"$schema": "https://biomejs.dev/schemas/2.2.6/schema.json", | ||||||
|  | 	"vcs": { "enabled": false, "clientKind": "git", "useIgnoreFile": false }, | ||||||
|  | 	"files": { | ||||||
|  | 		"ignoreUnknown": false, | ||||||
|  | 		"includes": ["**", "!**/node_modules", "!**/assets/stubs/index.ts", "!**/dist"] | ||||||
|  | 	}, | ||||||
|  | 	"formatter": { | ||||||
|  | 		"enabled": true, | ||||||
|  | 		"formatWithErrors": false, | ||||||
|  | 		"indentStyle": "tab", | ||||||
|  | 		"indentWidth": 2, | ||||||
|  | 		"lineEnding": "lf", | ||||||
|  | 		"lineWidth": 100, | ||||||
|  | 		"attributePosition": "auto", | ||||||
|  | 		"bracketSameLine": false, | ||||||
|  | 		"bracketSpacing": true, | ||||||
|  | 		"expand": "auto", | ||||||
|  | 		"useEditorconfig": true | ||||||
|  | 	}, | ||||||
|  | 	"linter": { "enabled": true, "rules": { "recommended": true } }, | ||||||
|  | 	"javascript": { | ||||||
|  | 		"formatter": { | ||||||
|  | 			"jsxQuoteStyle": "double", | ||||||
|  | 			"quoteProperties": "asNeeded", | ||||||
|  | 			"trailingCommas": "all", | ||||||
|  | 			"semicolons": "asNeeded", | ||||||
|  | 			"arrowParentheses": "always", | ||||||
|  | 			"bracketSameLine": false, | ||||||
|  | 			"quoteStyle": "single", | ||||||
|  | 			"attributePosition": "auto", | ||||||
|  | 			"bracketSpacing": true | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	"html": { "formatter": { "selfCloseVoidElements": "always" } }, | ||||||
|  | 	"overrides": [{ "includes": ["**/*.ts", "**/*.tsx"] }], | ||||||
|  | 	"assist": { | ||||||
|  | 		"enabled": true, | ||||||
|  | 		"actions": { "source": { "organizeImports": "on" } } | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										264
									
								
								bun.lock
									
									
									
									
									
								
							
							
						
						
									
										264
									
								
								bun.lock
									
									
									
									
									
								
							| @@ -5,23 +5,21 @@ | |||||||
|       "name": "zod-pocketbase-continue", |       "name": "zod-pocketbase-continue", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|         "@clack/prompts": "^0.11.0", |         "@clack/prompts": "^0.11.0", | ||||||
|         "c12": "^3.3.0", |         "c12": "^3.3.1", | ||||||
|         "citty": "^0.1.6", |         "citty": "^0.1.6", | ||||||
|         "es-toolkit": "^1.40.0", |         "es-toolkit": "^1.40.0", | ||||||
|       }, |       }, | ||||||
|       "devDependencies": { |       "devDependencies": { | ||||||
|  |         "@biomejs/biome": "2.2.6", | ||||||
|         "@changesets/cli": "^2.29.7", |         "@changesets/cli": "^2.29.7", | ||||||
|         "@types/node": "^24.7.1", |         "@types/node": "^24.8.1", | ||||||
|         "@typescript-eslint/parser": "^8.46.0", |  | ||||||
|         "eslint": "^9.37.0", |  | ||||||
|         "pocketbase": "^0.26.2", |         "pocketbase": "^0.26.2", | ||||||
|         "prettier": "^3.6.2", |         "tsdown": "^0.15.8", | ||||||
|         "tsdown": "^0.15.6", |         "zod": "^4.1.12", | ||||||
|         "zod": "^3.25.76", |  | ||||||
|       }, |       }, | ||||||
|       "peerDependencies": { |       "peerDependencies": { | ||||||
|         "pocketbase": "^0.26.2", |         "pocketbase": "^0.26.2", | ||||||
|         "zod": "^3.25.76", |         "zod": "^4.1.12", | ||||||
|       }, |       }, | ||||||
|     }, |     }, | ||||||
|   }, |   }, | ||||||
| @@ -38,6 +36,24 @@ | |||||||
|  |  | ||||||
|     "@babel/types": ["@babel/types@7.28.4", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q=="], |     "@babel/types": ["@babel/types@7.28.4", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q=="], | ||||||
|  |  | ||||||
|  |     "@biomejs/biome": ["@biomejs/biome@2.2.6", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.2.6", "@biomejs/cli-darwin-x64": "2.2.6", "@biomejs/cli-linux-arm64": "2.2.6", "@biomejs/cli-linux-arm64-musl": "2.2.6", "@biomejs/cli-linux-x64": "2.2.6", "@biomejs/cli-linux-x64-musl": "2.2.6", "@biomejs/cli-win32-arm64": "2.2.6", "@biomejs/cli-win32-x64": "2.2.6" }, "bin": { "biome": "bin/biome" } }, "sha512-yKTCNGhek0rL5OEW1jbLeZX8LHaM8yk7+3JRGv08my+gkpmtb5dDE+54r2ZjZx0ediFEn1pYBOJSmOdDP9xtFw=="], | ||||||
|  |  | ||||||
|  |     "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.2.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-UZPmn3M45CjTYulgcrFJFZv7YmK3pTxTJDrFYlNElT2FNnkkX4fsxjExTSMeWKQYoZjvekpH5cvrYZZlWu3yfA=="], | ||||||
|  |  | ||||||
|  |     "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.2.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-HOUIquhHVgh/jvxyClpwlpl/oeMqntlteL89YqjuFDiZ091P0vhHccwz+8muu3nTyHWM5FQslt+4Jdcd67+xWQ=="], | ||||||
|  |  | ||||||
|  |     "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.2.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-BpGtuMJGN+o8pQjvYsUKZ+4JEErxdSmcRD/JG3mXoWc6zrcA7OkuyGFN1mDggO0Q1n7qXxo/PcupHk8gzijt5g=="], | ||||||
|  |  | ||||||
|  |     "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.2.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-TjCenQq3N6g1C+5UT3jE1bIiJb5MWQvulpUngTIpFsL4StVAUXucWD0SL9MCW89Tm6awWfeXBbZBAhJwjyFbRQ=="], | ||||||
|  |  | ||||||
|  |     "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.2.6", "", { "os": "linux", "cpu": "x64" }, "sha512-1HaM/dpI/1Z68zp8ZdT6EiBq+/O/z97a2AiHMl+VAdv5/ELckFt9EvRb8hDHpk8hUMoz03gXkC7VPXOVtU7faA=="], | ||||||
|  |  | ||||||
|  |     "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.2.6", "", { "os": "linux", "cpu": "x64" }, "sha512-1ZcBux8zVM3JhWN2ZCPaYf0+ogxXG316uaoXJdgoPZcdK/rmRcRY7PqHdAos2ExzvjIdvhQp72UcveI98hgOog=="], | ||||||
|  |  | ||||||
|  |     "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.2.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-h3A88G8PGM1ryTeZyLlSdfC/gz3e95EJw9BZmA6Po412DRqwqPBa2Y9U+4ZSGUAXCsnSQE00jLV8Pyrh0d+jQw=="], | ||||||
|  |  | ||||||
|  |     "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.2.6", "", { "os": "win32", "cpu": "x64" }, "sha512-yx0CqeOhPjYQ5ZXgPfu8QYkgBhVJyvWe36as7jRuPrKPO5ylVDfwVtPQ+K/mooNTADW0IhxOZm3aPu16dP8yNQ=="], | ||||||
|  |  | ||||||
|     "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.0.13", "", { "dependencies": { "@changesets/config": "^3.1.1", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg=="], |     "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.0.13", "", { "dependencies": { "@changesets/config": "^3.1.1", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg=="], | ||||||
|  |  | ||||||
|     "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.9", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ=="], |     "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.9", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ=="], | ||||||
| @@ -82,32 +98,6 @@ | |||||||
|  |  | ||||||
|     "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], |     "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], | ||||||
|  |  | ||||||
|     "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], |  | ||||||
|  |  | ||||||
|     "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], |  | ||||||
|  |  | ||||||
|     "@eslint/config-array": ["@eslint/config-array@0.21.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ=="], |  | ||||||
|  |  | ||||||
|     "@eslint/config-helpers": ["@eslint/config-helpers@0.4.0", "", { "dependencies": { "@eslint/core": "^0.16.0" } }, "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog=="], |  | ||||||
|  |  | ||||||
|     "@eslint/core": ["@eslint/core@0.16.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q=="], |  | ||||||
|  |  | ||||||
|     "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], |  | ||||||
|  |  | ||||||
|     "@eslint/js": ["@eslint/js@9.37.0", "", {}, "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg=="], |  | ||||||
|  |  | ||||||
|     "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], |  | ||||||
|  |  | ||||||
|     "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.0", "", { "dependencies": { "@eslint/core": "^0.16.0", "levn": "^0.4.1" } }, "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A=="], |  | ||||||
|  |  | ||||||
|     "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], |  | ||||||
|  |  | ||||||
|     "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], |  | ||||||
|  |  | ||||||
|     "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], |  | ||||||
|  |  | ||||||
|     "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], |  | ||||||
|  |  | ||||||
|     "@inquirer/external-editor": ["@inquirer/external-editor@1.0.2", "", { "dependencies": { "chardet": "^2.1.0", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ=="], |     "@inquirer/external-editor": ["@inquirer/external-editor@1.0.2", "", { "dependencies": { "chardet": "^2.1.0", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ=="], | ||||||
|  |  | ||||||
|     "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], |     "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], | ||||||
| @@ -130,100 +120,66 @@ | |||||||
|  |  | ||||||
|     "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], |     "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], | ||||||
|  |  | ||||||
|     "@oxc-project/types": ["@oxc-project/types@0.94.0", "", {}, "sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw=="], |     "@oxc-project/types": ["@oxc-project/types@0.95.0", "", {}, "sha512-vACy7vhpMPhjEJhULNxrdR0D943TkA/MigMpJCHmBHvMXxRStRi/dPtTlfQ3uDwWSzRpT8z+7ImjZVf8JWBocQ=="], | ||||||
|  |  | ||||||
|     "@quansync/fs": ["@quansync/fs@0.1.5", "", { "dependencies": { "quansync": "^0.2.11" } }, "sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA=="], |     "@quansync/fs": ["@quansync/fs@0.1.5", "", { "dependencies": { "quansync": "^0.2.11" } }, "sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA=="], | ||||||
|  |  | ||||||
|     "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-beta.43", "", { "os": "android", "cpu": "arm64" }, "sha512-TP8bcPOb1s6UmY5syhXrDn9k0XkYcw+XaoylTN4cJxf0JOVS2j682I3aTcpfT51hOFGr2bRwNKN9RZ19XxeQbA=="], |     "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-beta.44", "", { "os": "android", "cpu": "arm64" }, "sha512-g9ejDOehJFhxC1DIXQuZQ9bKv4lRDioOTL42cJjFjqKPl1L7DVb9QQQE1FxokGEIMr6FezLipxwnzOXWe7DNPg=="], | ||||||
|  |  | ||||||
|     "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.43", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kuVWnZsE4vEjMF/10SbSUyzucIW2zmdsqFghYMqy+fsjXnRHg0luTU6qWF8IqJf4Cbpm9NEZRnjIEPpAbdiSNQ=="], |     "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.44", "", { "os": "darwin", "cpu": "arm64" }, "sha512-PxAW1PXLPmCzfhfKIS53kwpjLGTUdIfX4Ht+l9mj05C3lYCGaGowcNsYi2rdxWH24vSTmeK+ajDNRmmmrK0M7g=="], | ||||||
|  |  | ||||||
|     "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.43", "", { "os": "darwin", "cpu": "x64" }, "sha512-u9Ps4sh6lcmJ3vgLtyEg/x4jlhI64U0mM93Ew+tlfFdLDe7yKyA+Fe80cpr2n1mNCeZXrvTSbZluKpXQ0GxLjw=="], |     "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.44", "", { "os": "darwin", "cpu": "x64" }, "sha512-/CtQqs1oO9uSb5Ju60rZvsdjE7Pzn8EK2ISAdl2jedjMzeD/4neNyCbwyJOAPzU+GIQTZVyrFZJX+t7HXR1R/g=="], | ||||||
|  |  | ||||||
|     "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.43", "", { "os": "freebsd", "cpu": "x64" }, "sha512-h9lUtVtXgfbk/tnicMpbFfZ3DJvk5Zn2IvmlC1/e0+nUfwoc/TFqpfrRRqcNBXk/e+xiWMSKv6b0MF8N+Rtvlg=="], |     "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.44", "", { "os": "freebsd", "cpu": "x64" }, "sha512-V5Q5W9c4+2GJ4QabmjmVV6alY97zhC/MZBaLkDtHwGy3qwzbM4DYgXUbun/0a8AH5hGhuU27tUIlYz6ZBlvgOA=="], | ||||||
|  |  | ||||||
|     "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43", "", { "os": "linux", "cpu": "arm" }, "sha512-IX2C6bA6wM2rX/RvD75ko+ix9yxPKjKGGq7pOhB8wGI4Z4fqX5B1nDHga/qMDmAdCAR1m9ymzxkmqhm/AFYf7A=="], |     "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.44", "", { "os": "linux", "cpu": "arm" }, "sha512-X6adjkHeFqKsTU0FXdNN9HY4LDozPqIfHcnXovE5RkYLWIjMWuc489mIZ6iyhrMbCqMUla9IOsh5dvXSGT9o9A=="], | ||||||
|  |  | ||||||
|     "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43", "", { "os": "linux", "cpu": "arm64" }, "sha512-mcjd57vEj+CEQbZAzUiaxNzNgwwgOpFtZBWcINm8DNscvkXl5b/s622Z1dqGNWSdrZmdjdC6LWMvu8iHM6v9sQ=="], |     "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.44", "", { "os": "linux", "cpu": "arm64" }, "sha512-kRRKGZI4DXWa6ANFr3dLA85aSVkwPdgXaRjfanwY84tfc3LncDiIjyWCb042e3ckPzYhHSZ3LmisO+cdOIYL6Q=="], | ||||||
|  |  | ||||||
|     "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.43", "", { "os": "linux", "cpu": "arm64" }, "sha512-Pa8QMwlkrztTo/1mVjZmPIQ44tCSci10TBqxzVBvXVA5CFh5EpiEi99fPSll2dHG2uT4dCOMeC6fIhyDdb0zXA=="], |     "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.44", "", { "os": "linux", "cpu": "arm64" }, "sha512-hMtiN9xX1NhxXBa2U3Up4XkVcsVp2h73yYtMDY59z9CDLEZLrik9RVLhBL5QtoX4zZKJ8HZKJtWuGYvtmkCbIQ=="], | ||||||
|  |  | ||||||
|     "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.43", "", { "os": "linux", "cpu": "x64" }, "sha512-BgynXKMjeaX4AfWLARhOKDetBOOghnSiVRjAHVvhiAaDXgdQN8e65mSmXRiVoVtD3cHXx/cfU8Gw0p0K+qYKVQ=="], |     "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.44", "", { "os": "linux", "cpu": "x64" }, "sha512-rd1LzbpXQuR8MTG43JB9VyXDjG7ogSJbIkBpZEHJ8oMKzL6j47kQT5BpIXrg3b5UVygW9QCI2fpFdMocT5Kudg=="], | ||||||
|  |  | ||||||
|     "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.43", "", { "os": "linux", "cpu": "x64" }, "sha512-VIsoPlOB/tDSAw9CySckBYysoIBqLeps1/umNSYUD8pMtalJyzMTneAVI1HrUdf4ceFmQ5vARoLIXSsPwVFxNg=="], |     "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.44", "", { "os": "linux", "cpu": "x64" }, "sha512-qI2IiPqmPRW25exXkuQr3TlweCDc05YvvbSDRPCuPsWkwb70dTiSoXn8iFxT4PWqTi71wWHg1Wyta9PlVhX5VA=="], | ||||||
|  |  | ||||||
|     "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-beta.43", "", { "os": "none", "cpu": "arm64" }, "sha512-YDXTxVJG67PqTQMKyjVJSddoPbSWJ4yRz/E3xzTLHqNrTDGY0UuhG8EMr8zsYnfH/0cPFJ3wjQd/hJWHuR6nkA=="], |     "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-beta.44", "", { "os": "none", "cpu": "arm64" }, "sha512-+vHvEc1pL5iJRFlldLC8mjm6P4Qciyfh2bh5ZI6yxDQKbYhCHRKNURaKz1mFcwxhVL5YMYsLyaqM3qizVif9MQ=="], | ||||||
|  |  | ||||||
|     "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.43", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.7" }, "cpu": "none" }, "sha512-3M+2DmorXvDuAIGYQ9Z93Oy1G9ETkejLwdXXb1uRTgKN9pMcu7N+KG2zDrJwqyxeeLIFE22AZGtSJm3PJbNu9Q=="], |     "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.44", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.7" }, "cpu": "none" }, "sha512-XSgLxRrtFj6RpTeMYmmQDAwHjKseYGKUn5LPiIdW4Cq+f5SBSStL2ToBDxkbdxKPEbCZptnLPQ/nfKcAxrC8Xg=="], | ||||||
|  |  | ||||||
|     "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43", "", { "os": "win32", "cpu": "arm64" }, "sha512-/B1j1pJs33y9ywtslOMxryUPHq8zIGu/OGEc2gyed0slimJ8fX2uR/SaJVhB4+NEgCFIeYDR4CX6jynAkeRuCA=="], |     "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.44", "", { "os": "win32", "cpu": "arm64" }, "sha512-cF1LJdDIX02cJrFrX3wwQ6IzFM7I74BYeKFkzdcIA4QZ0+2WA7/NsKIgjvrunupepWb1Y6PFWdRlHSaz5AW1Wg=="], | ||||||
|  |  | ||||||
|     "@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43", "", { "os": "win32", "cpu": "ia32" }, "sha512-29oG1swCz7hNP+CQYrsM4EtylsKwuYzM8ljqbqC5TsQwmKat7P8ouDpImsqg/GZxFSXcPP9ezQm0Q0wQwGM3JA=="], |     "@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.44", "", { "os": "win32", "cpu": "ia32" }, "sha512-5uaJonDafhHiMn+iEh7qUp3QQ4Gihv3lEOxKfN8Vwadpy0e+5o28DWI42DpJ9YBYMrVy4JOWJ/3etB/sptpUwA=="], | ||||||
|  |  | ||||||
|     "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.43", "", { "os": "win32", "cpu": "x64" }, "sha512-eWBV1Ef3gfGNehxVGCyXs7wLayRIgCmyItuCZwYYXW5bsk4EvR4n2GP5m3ohjnx7wdiY3nLmwQfH2Knb5gbNZw=="], |     "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.44", "", { "os": "win32", "cpu": "x64" }, "sha512-vsqhWAFJkkmgfBN/lkLCWTXF1PuPhMjfnAyru48KvF7mVh2+K7WkKYHezF3Fjz4X/mPScOcIv+g6cf6wnI6eWg=="], | ||||||
|  |  | ||||||
|     "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.43", "", {}, "sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ=="], |     "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.44", "", {}, "sha512-g6eW7Zwnr2c5RADIoqziHoVs6b3W5QTQ4+qbpfjbkMJ9x+8Og211VW/oot2dj9dVwaK/UyC6Yo+02gV+wWQVNg=="], | ||||||
|  |  | ||||||
|     "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], |     "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], | ||||||
|  |  | ||||||
|     "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], |     "@types/node": ["@types/node@24.8.1", "", { "dependencies": { "undici-types": "~7.14.0" } }, "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q=="], | ||||||
|  |  | ||||||
|     "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], |  | ||||||
|  |  | ||||||
|     "@types/node": ["@types/node@24.7.2", "", { "dependencies": { "undici-types": "~7.14.0" } }, "sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA=="], |  | ||||||
|  |  | ||||||
|     "@typescript-eslint/parser": ["@typescript-eslint/parser@8.46.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.46.1", "@typescript-eslint/types": "8.46.1", "@typescript-eslint/typescript-estree": "8.46.1", "@typescript-eslint/visitor-keys": "8.46.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA=="], |  | ||||||
|  |  | ||||||
|     "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.46.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.46.1", "@typescript-eslint/types": "^8.46.1", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg=="], |  | ||||||
|  |  | ||||||
|     "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.46.1", "", { "dependencies": { "@typescript-eslint/types": "8.46.1", "@typescript-eslint/visitor-keys": "8.46.1" } }, "sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A=="], |  | ||||||
|  |  | ||||||
|     "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.46.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g=="], |  | ||||||
|  |  | ||||||
|     "@typescript-eslint/types": ["@typescript-eslint/types@8.46.1", "", {}, "sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ=="], |  | ||||||
|  |  | ||||||
|     "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.46.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.46.1", "@typescript-eslint/tsconfig-utils": "8.46.1", "@typescript-eslint/types": "8.46.1", "@typescript-eslint/visitor-keys": "8.46.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg=="], |  | ||||||
|  |  | ||||||
|     "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.46.1", "", { "dependencies": { "@typescript-eslint/types": "8.46.1", "eslint-visitor-keys": "^4.2.1" } }, "sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA=="], |  | ||||||
|  |  | ||||||
|     "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], |  | ||||||
|  |  | ||||||
|     "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], |  | ||||||
|  |  | ||||||
|     "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], |  | ||||||
|  |  | ||||||
|     "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], |     "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], | ||||||
|  |  | ||||||
|     "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], |     "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], | ||||||
|  |  | ||||||
|     "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], |  | ||||||
|  |  | ||||||
|     "ansis": ["ansis@4.2.0", "", {}, "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig=="], |     "ansis": ["ansis@4.2.0", "", {}, "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig=="], | ||||||
|  |  | ||||||
|     "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], |     "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], | ||||||
|  |  | ||||||
|     "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], |     "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], | ||||||
|  |  | ||||||
|     "ast-kit": ["ast-kit@2.1.3", "", { "dependencies": { "@babel/parser": "^7.28.4", "pathe": "^2.0.3" } }, "sha512-TH+b3Lv6pUjy/Nu0m6A2JULtdzLpmqF9x1Dhj00ZoEiML8qvVA9j1flkzTKNYgdEhWrjDwtWNpyyCUbfQe514g=="], |     "ast-kit": ["ast-kit@2.1.3", "", { "dependencies": { "@babel/parser": "^7.28.4", "pathe": "^2.0.3" } }, "sha512-TH+b3Lv6pUjy/Nu0m6A2JULtdzLpmqF9x1Dhj00ZoEiML8qvVA9j1flkzTKNYgdEhWrjDwtWNpyyCUbfQe514g=="], | ||||||
|  |  | ||||||
|     "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], |  | ||||||
|  |  | ||||||
|     "better-path-resolve": ["better-path-resolve@1.0.0", "", { "dependencies": { "is-windows": "^1.0.0" } }, "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g=="], |     "better-path-resolve": ["better-path-resolve@1.0.0", "", { "dependencies": { "is-windows": "^1.0.0" } }, "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g=="], | ||||||
|  |  | ||||||
|     "birpc": ["birpc@2.6.1", "", {}, "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ=="], |     "birpc": ["birpc@2.6.1", "", {}, "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ=="], | ||||||
|  |  | ||||||
|     "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], |  | ||||||
|  |  | ||||||
|     "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], |     "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], | ||||||
|  |  | ||||||
|     "c12": ["c12@3.3.0", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^17.2.2", "exsolve": "^1.0.7", "giget": "^2.0.0", "jiti": "^2.5.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.0.0", "pkg-types": "^2.3.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-K9ZkuyeJQeqLEyqldbYLG3wjqwpw4BVaAqvmxq3GYKK0b1A/yYQdIcJxkzAOWcNVWhJpRXAPfZFueekiY/L8Dw=="], |     "c12": ["c12@3.3.1", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^17.2.3", "exsolve": "^1.0.7", "giget": "^2.0.0", "jiti": "^2.6.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.0.0", "pkg-types": "^2.3.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-LcWQ01LT9tkoUINHgpIOv3mMs+Abv7oVCrtpMRi1PaapVEpWoMga5WuT7/DqFTu7URP9ftbOmimNw1KNIGh9DQ=="], | ||||||
|  |  | ||||||
|     "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], |     "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], | ||||||
|  |  | ||||||
|     "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], |  | ||||||
|  |  | ||||||
|     "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], |  | ||||||
|  |  | ||||||
|     "chardet": ["chardet@2.1.0", "", {}, "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA=="], |     "chardet": ["chardet@2.1.0", "", {}, "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA=="], | ||||||
|  |  | ||||||
|     "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], |     "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], | ||||||
| @@ -232,12 +188,6 @@ | |||||||
|  |  | ||||||
|     "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], |     "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], | ||||||
|  |  | ||||||
|     "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], |  | ||||||
|  |  | ||||||
|     "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], |  | ||||||
|  |  | ||||||
|     "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], |  | ||||||
|  |  | ||||||
|     "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], |     "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], | ||||||
|  |  | ||||||
|     "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], |     "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], | ||||||
| @@ -246,8 +196,6 @@ | |||||||
|  |  | ||||||
|     "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], |     "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], | ||||||
|  |  | ||||||
|     "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], |  | ||||||
|  |  | ||||||
|     "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], |     "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], | ||||||
|  |  | ||||||
|     "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], |     "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], | ||||||
| @@ -268,51 +216,21 @@ | |||||||
|  |  | ||||||
|     "es-toolkit": ["es-toolkit@1.40.0", "", {}, "sha512-8o6w0KFmU0CiIl0/Q/BCEOabF2IJaELM1T2PWj6e8KqzHv1gdx+7JtFnDwOx1kJH/isJ5NwlDG1nCr1HrRF94Q=="], |     "es-toolkit": ["es-toolkit@1.40.0", "", {}, "sha512-8o6w0KFmU0CiIl0/Q/BCEOabF2IJaELM1T2PWj6e8KqzHv1gdx+7JtFnDwOx1kJH/isJ5NwlDG1nCr1HrRF94Q=="], | ||||||
|  |  | ||||||
|     "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], |  | ||||||
|  |  | ||||||
|     "eslint": ["eslint@9.37.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.4.0", "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.37.0", "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig=="], |  | ||||||
|  |  | ||||||
|     "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], |  | ||||||
|  |  | ||||||
|     "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], |  | ||||||
|  |  | ||||||
|     "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], |  | ||||||
|  |  | ||||||
|     "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], |     "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], | ||||||
|  |  | ||||||
|     "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], |  | ||||||
|  |  | ||||||
|     "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], |  | ||||||
|  |  | ||||||
|     "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], |  | ||||||
|  |  | ||||||
|     "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], |  | ||||||
|  |  | ||||||
|     "exsolve": ["exsolve@1.0.7", "", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="], |     "exsolve": ["exsolve@1.0.7", "", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="], | ||||||
|  |  | ||||||
|     "extendable-error": ["extendable-error@0.1.7", "", {}, "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg=="], |     "extendable-error": ["extendable-error@0.1.7", "", {}, "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg=="], | ||||||
|  |  | ||||||
|     "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], |  | ||||||
|  |  | ||||||
|     "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], |     "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], | ||||||
|  |  | ||||||
|     "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], |  | ||||||
|  |  | ||||||
|     "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], |  | ||||||
|  |  | ||||||
|     "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], |     "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], | ||||||
|  |  | ||||||
|     "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], |     "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], | ||||||
|  |  | ||||||
|     "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], |  | ||||||
|  |  | ||||||
|     "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], |     "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], | ||||||
|  |  | ||||||
|     "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], |     "find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], | ||||||
|  |  | ||||||
|     "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], |  | ||||||
|  |  | ||||||
|     "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], |  | ||||||
|  |  | ||||||
|     "fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], |     "fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], | ||||||
|  |  | ||||||
| @@ -320,16 +238,12 @@ | |||||||
|  |  | ||||||
|     "giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="], |     "giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="], | ||||||
|  |  | ||||||
|     "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], |     "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], | ||||||
|  |  | ||||||
|     "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], |  | ||||||
|  |  | ||||||
|     "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], |     "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], | ||||||
|  |  | ||||||
|     "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], |     "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], | ||||||
|  |  | ||||||
|     "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], |  | ||||||
|  |  | ||||||
|     "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], |     "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], | ||||||
|  |  | ||||||
|     "human-id": ["human-id@4.1.2", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg=="], |     "human-id": ["human-id@4.1.2", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg=="], | ||||||
| @@ -338,10 +252,6 @@ | |||||||
|  |  | ||||||
|     "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], |     "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], | ||||||
|  |  | ||||||
|     "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], |  | ||||||
|  |  | ||||||
|     "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], |  | ||||||
|  |  | ||||||
|     "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], |     "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], | ||||||
|  |  | ||||||
|     "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], |     "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], | ||||||
| @@ -356,25 +266,13 @@ | |||||||
|  |  | ||||||
|     "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], |     "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], | ||||||
|  |  | ||||||
|     "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], |     "js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], | ||||||
|  |  | ||||||
|     "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], |     "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], | ||||||
|  |  | ||||||
|     "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], |  | ||||||
|  |  | ||||||
|     "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], |  | ||||||
|  |  | ||||||
|     "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], |  | ||||||
|  |  | ||||||
|     "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], |     "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], | ||||||
|  |  | ||||||
|     "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], |     "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], | ||||||
|  |  | ||||||
|     "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], |  | ||||||
|  |  | ||||||
|     "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], |  | ||||||
|  |  | ||||||
|     "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], |  | ||||||
|  |  | ||||||
|     "lodash.startcase": ["lodash.startcase@4.4.0", "", {}, "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg=="], |     "lodash.startcase": ["lodash.startcase@4.4.0", "", {}, "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg=="], | ||||||
|  |  | ||||||
| @@ -384,29 +282,23 @@ | |||||||
|  |  | ||||||
|     "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], |     "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], | ||||||
|  |  | ||||||
|     "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], |  | ||||||
|  |  | ||||||
|     "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], |     "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], | ||||||
|  |  | ||||||
|     "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], |     "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], | ||||||
|  |  | ||||||
|     "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], |  | ||||||
|  |  | ||||||
|     "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], |     "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], | ||||||
|  |  | ||||||
|     "nypm": ["nypm@0.6.2", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.2", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "tinyexec": "^1.0.1" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g=="], |     "nypm": ["nypm@0.6.2", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.2", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "tinyexec": "^1.0.1" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g=="], | ||||||
|  |  | ||||||
|     "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], |     "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], | ||||||
|  |  | ||||||
|     "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], |  | ||||||
|  |  | ||||||
|     "outdent": ["outdent@0.5.0", "", {}, "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q=="], |     "outdent": ["outdent@0.5.0", "", {}, "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q=="], | ||||||
|  |  | ||||||
|     "p-filter": ["p-filter@2.1.0", "", { "dependencies": { "p-map": "^2.0.0" } }, "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw=="], |     "p-filter": ["p-filter@2.1.0", "", { "dependencies": { "p-map": "^2.0.0" } }, "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw=="], | ||||||
|  |  | ||||||
|     "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], |     "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], | ||||||
|  |  | ||||||
|     "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], |     "p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], | ||||||
|  |  | ||||||
|     "p-map": ["p-map@2.1.0", "", {}, "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="], |     "p-map": ["p-map@2.1.0", "", {}, "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="], | ||||||
|  |  | ||||||
| @@ -414,8 +306,6 @@ | |||||||
|  |  | ||||||
|     "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="], |     "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="], | ||||||
|  |  | ||||||
|     "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], |  | ||||||
|  |  | ||||||
|     "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], |     "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], | ||||||
|  |  | ||||||
|     "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], |     "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], | ||||||
| @@ -436,11 +326,7 @@ | |||||||
|  |  | ||||||
|     "pocketbase": ["pocketbase@0.26.2", "", {}, "sha512-WA8EOBc3QnSJh8rJ3iYoi9DmmPOMFIgVfAmIGux7wwruUEIzXgvrO4u0W2htfQjGIcyezJkdZOy5Xmh7SxAftw=="], |     "pocketbase": ["pocketbase@0.26.2", "", {}, "sha512-WA8EOBc3QnSJh8rJ3iYoi9DmmPOMFIgVfAmIGux7wwruUEIzXgvrO4u0W2htfQjGIcyezJkdZOy5Xmh7SxAftw=="], | ||||||
|  |  | ||||||
|     "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], |     "prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], | ||||||
|  |  | ||||||
|     "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], |  | ||||||
|  |  | ||||||
|     "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], |  | ||||||
|  |  | ||||||
|     "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], |     "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], | ||||||
|  |  | ||||||
| @@ -458,9 +344,9 @@ | |||||||
|  |  | ||||||
|     "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], |     "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], | ||||||
|  |  | ||||||
|     "rolldown": ["rolldown@1.0.0-beta.43", "", { "dependencies": { "@oxc-project/types": "=0.94.0", "@rolldown/pluginutils": "1.0.0-beta.43", "ansis": "=4.2.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.43", "@rolldown/binding-darwin-arm64": "1.0.0-beta.43", "@rolldown/binding-darwin-x64": "1.0.0-beta.43", "@rolldown/binding-freebsd-x64": "1.0.0-beta.43", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.43", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.43", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.43", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.43", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.43", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.43", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.43", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.43", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.43", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.43" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-6RcqyRx0tY1MlRLnjXPp/849Rl/CPFhzpGGwNPEPjKwqBMqPq/Rbbkxasa8s0x+IkUk46ty4jazb5skZ/Vgdhw=="], |     "rolldown": ["rolldown@1.0.0-beta.44", "", { "dependencies": { "@oxc-project/types": "=0.95.0", "@rolldown/pluginutils": "1.0.0-beta.44" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.44", "@rolldown/binding-darwin-arm64": "1.0.0-beta.44", "@rolldown/binding-darwin-x64": "1.0.0-beta.44", "@rolldown/binding-freebsd-x64": "1.0.0-beta.44", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.44", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.44", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.44", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.44", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.44", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.44", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.44", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.44", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.44", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.44" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-gcqgyCi3g93Fhr49PKvymE8PoaGS0sf6ajQrsYaQ8o5de6aUEbD6rJZiJbhOfpcqOnycgsAsUNPYri1h25NgsQ=="], | ||||||
|  |  | ||||||
|     "rolldown-plugin-dts": ["rolldown-plugin-dts@0.16.11", "", { "dependencies": { "@babel/generator": "^7.28.3", "@babel/parser": "^7.28.4", "@babel/types": "^7.28.4", "ast-kit": "^2.1.2", "birpc": "^2.6.1", "debug": "^4.4.3", "dts-resolver": "^2.1.2", "get-tsconfig": "^4.10.1", "magic-string": "^0.30.19" }, "peerDependencies": { "@ts-macro/tsc": "^0.3.6", "@typescript/native-preview": ">=7.0.0-dev.20250601.1", "rolldown": "^1.0.0-beta.9", "typescript": "^5.0.0", "vue-tsc": "~3.1.0" }, "optionalPeers": ["@ts-macro/tsc", "@typescript/native-preview", "typescript", "vue-tsc"] }, "sha512-9IQDaPvPqTx3RjG2eQCK5GYZITo203BxKunGI80AGYicu1ySFTUyugicAaTZWRzFWh9DSnzkgNeMNbDWBbSs0w=="], |     "rolldown-plugin-dts": ["rolldown-plugin-dts@0.16.12", "", { "dependencies": { "@babel/generator": "^7.28.3", "@babel/parser": "^7.28.4", "@babel/types": "^7.28.4", "ast-kit": "^2.1.3", "birpc": "^2.6.1", "debug": "^4.4.3", "dts-resolver": "^2.1.2", "get-tsconfig": "^4.12.0", "magic-string": "^0.30.19" }, "peerDependencies": { "@ts-macro/tsc": "^0.3.6", "@typescript/native-preview": ">=7.0.0-dev.20250601.1", "rolldown": "^1.0.0-beta.9", "typescript": "^5.0.0", "vue-tsc": "~3.1.0" }, "optionalPeers": ["@ts-macro/tsc", "@typescript/native-preview", "typescript", "vue-tsc"] }, "sha512-9dGjm5oqtKcbZNhpzyBgb8KrYiU616A7IqcFWG7Msp1RKAXQ/hapjivRg+g5IYWSiFhnk3OKYV5T4Ft1t8Cczg=="], | ||||||
|  |  | ||||||
|     "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], |     "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], | ||||||
|  |  | ||||||
| @@ -486,10 +372,6 @@ | |||||||
|  |  | ||||||
|     "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], |     "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], | ||||||
|  |  | ||||||
|     "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], |  | ||||||
|  |  | ||||||
|     "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], |  | ||||||
|  |  | ||||||
|     "term-size": ["term-size@2.2.1", "", {}, "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg=="], |     "term-size": ["term-size@2.2.1", "", {}, "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg=="], | ||||||
|  |  | ||||||
|     "tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], |     "tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], | ||||||
| @@ -500,14 +382,10 @@ | |||||||
|  |  | ||||||
|     "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], |     "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], | ||||||
|  |  | ||||||
|     "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], |     "tsdown": ["tsdown@0.15.8", "", { "dependencies": { "ansis": "^4.2.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.3", "diff": "^8.0.2", "empathic": "^2.0.0", "hookable": "^5.5.3", "rolldown": "latest", "rolldown-plugin-dts": "^0.16.12", "semver": "^7.7.3", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.15", "tree-kill": "^1.2.2", "unconfig": "^7.3.3" }, "peerDependencies": { "@arethetypeswrong/core": "^0.18.1", "publint": "^0.3.0", "typescript": "^5.0.0", "unplugin-lightningcss": "^0.4.0", "unplugin-unused": "^0.5.0" }, "optionalPeers": ["@arethetypeswrong/core", "publint", "typescript", "unplugin-lightningcss", "unplugin-unused"], "bin": { "tsdown": "dist/run.mjs" } }, "sha512-A9CY3lO2SC6G5wyQV38cNdPkDmCoIQ6zYVd+lLnEGH09BxNRTJkCHfb7cBeBxZYJDYGFtgg/3yBpEryYJjBd+Q=="], | ||||||
|  |  | ||||||
|     "tsdown": ["tsdown@0.15.7", "", { "dependencies": { "ansis": "^4.2.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.3", "diff": "^8.0.2", "empathic": "^2.0.0", "hookable": "^5.5.3", "rolldown": "latest", "rolldown-plugin-dts": "^0.16.11", "semver": "^7.7.3", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.15", "tree-kill": "^1.2.2", "unconfig": "^7.3.3" }, "peerDependencies": { "@arethetypeswrong/core": "^0.18.1", "publint": "^0.3.0", "typescript": "^5.0.0", "unplugin-lightningcss": "^0.4.0", "unplugin-unused": "^0.5.0" }, "optionalPeers": ["@arethetypeswrong/core", "publint", "typescript", "unplugin-lightningcss", "unplugin-unused"], "bin": { "tsdown": "dist/run.mjs" } }, "sha512-uFaVgWAogjOMqjY+CQwrUt3C6wzy6ynt82CIoXymnbS17ipUZ8WDXUceJjkislUahF/BZc5+W44Ue3p2oWtqUg=="], |  | ||||||
|  |  | ||||||
|     "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], |     "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], | ||||||
|  |  | ||||||
|     "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], |  | ||||||
|  |  | ||||||
|     "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], |     "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], | ||||||
|  |  | ||||||
|     "unconfig": ["unconfig@7.3.3", "", { "dependencies": { "@quansync/fs": "^0.1.5", "defu": "^6.1.4", "jiti": "^2.5.1", "quansync": "^0.2.11" } }, "sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA=="], |     "unconfig": ["unconfig@7.3.3", "", { "dependencies": { "@quansync/fs": "^0.1.5", "defu": "^6.1.4", "jiti": "^2.5.1", "quansync": "^0.2.11" } }, "sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA=="], | ||||||
| @@ -516,54 +394,18 @@ | |||||||
|  |  | ||||||
|     "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], |     "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], | ||||||
|  |  | ||||||
|     "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], |  | ||||||
|  |  | ||||||
|     "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], |     "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], | ||||||
|  |  | ||||||
|     "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], |     "zod": ["zod@4.1.12", "", {}, "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ=="], | ||||||
|  |  | ||||||
|     "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], |  | ||||||
|  |  | ||||||
|     "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], |  | ||||||
|  |  | ||||||
|     "@changesets/apply-release-plan/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], |  | ||||||
|  |  | ||||||
|     "@changesets/parse/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], |  | ||||||
|  |  | ||||||
|     "@changesets/write/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], |  | ||||||
|  |  | ||||||
|     "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], |  | ||||||
|  |  | ||||||
|     "@manypkg/find-root/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], |     "@manypkg/find-root/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], | ||||||
|  |  | ||||||
|     "@manypkg/find-root/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], |  | ||||||
|  |  | ||||||
|     "@manypkg/find-root/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], |     "@manypkg/find-root/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], | ||||||
|  |  | ||||||
|     "@manypkg/get-packages/@changesets/types": ["@changesets/types@4.1.0", "", {}, "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw=="], |     "@manypkg/get-packages/@changesets/types": ["@changesets/types@4.1.0", "", {}, "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw=="], | ||||||
|  |  | ||||||
|     "@manypkg/get-packages/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], |     "@manypkg/get-packages/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], | ||||||
|  |  | ||||||
|     "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], |  | ||||||
|  |  | ||||||
|     "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], |  | ||||||
|  |  | ||||||
|     "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], |  | ||||||
|  |  | ||||||
|     "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], |     "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], | ||||||
|  |  | ||||||
|     "p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], |  | ||||||
|  |  | ||||||
|     "read-yaml-file/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], |  | ||||||
|  |  | ||||||
|     "@changesets/parse/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], |  | ||||||
|  |  | ||||||
|     "@manypkg/find-root/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], |  | ||||||
|  |  | ||||||
|     "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], |  | ||||||
|  |  | ||||||
|     "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], |  | ||||||
|  |  | ||||||
|     "@manypkg/find-root/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,22 +0,0 @@ | |||||||
| import typescript from "@typescript-eslint/eslint-plugin"; |  | ||||||
| import typescriptParser from "@typescript-eslint/parser"; |  | ||||||
|  |  | ||||||
| export default [ |  | ||||||
|   { |  | ||||||
|     files: ["**/*.ts", "**/*.tsx"], |  | ||||||
|     languageOptions: { |  | ||||||
|       parser: typescriptParser, |  | ||||||
|       parserOptions: { |  | ||||||
|         ecmaVersion: "latest", |  | ||||||
|         sourceType: "module", |  | ||||||
|         project: "./tsconfig.json", |  | ||||||
|       }, |  | ||||||
|     }, |  | ||||||
|     plugins: { |  | ||||||
|       "@typescript-eslint": typescript, |  | ||||||
|     }, |  | ||||||
|     rules: { |  | ||||||
|       ...typescript.configs.recommended.rules, |  | ||||||
|     }, |  | ||||||
|   }, |  | ||||||
| ]; |  | ||||||
							
								
								
									
										31
									
								
								flake.nix
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								flake.nix
									
									
									
									
									
								
							| @@ -17,7 +17,6 @@ | |||||||
|       let |       let | ||||||
|         pkgs = nixpkgs.legacyPackages.${system}; |         pkgs = nixpkgs.legacyPackages.${system}; | ||||||
|         bun = pkgs.bun; |         bun = pkgs.bun; | ||||||
|  |  | ||||||
|       in |       in | ||||||
|       { |       { | ||||||
|         devShells.default = pkgs.mkShell { |         devShells.default = pkgs.mkShell { | ||||||
| @@ -26,7 +25,6 @@ | |||||||
|             git |             git | ||||||
|             nodejs_24 |             nodejs_24 | ||||||
|             tea |             tea | ||||||
|             # nodePackages.node-inspector |  | ||||||
|           ]; |           ]; | ||||||
|  |  | ||||||
|           shellHook = '' |           shellHook = '' | ||||||
| @@ -36,9 +34,13 @@ | |||||||
|             echo "" |             echo "" | ||||||
|             echo "Available commands:" |             echo "Available commands:" | ||||||
|             echo "  bun install           - Install dependencies" |             echo "  bun install           - Install dependencies" | ||||||
|             echo "  bun run dev           - Start development" |             echo "  bun run dev           - Start development (build with --watch flag)" | ||||||
|             echo "  bun build             - Build with Bun's bundler" |             echo "  bun run build         - Build library" | ||||||
|             echo "  tea releases create   - Create Gitea release" |             echo "  bun run lint          - Run Biome check" | ||||||
|  |             echo "  bun run lint:w        - Run Biome check (with --write)" | ||||||
|  |             echo "  bun run format        - Run Biome format" | ||||||
|  |             echo "  bun run format:w      - Run Biome format (with --write)" | ||||||
|  |             echo "  bun run release       - Run release script" | ||||||
|             echo "" |             echo "" | ||||||
|  |  | ||||||
|             if [ ! -d "node_modules" ]; then |             if [ ! -d "node_modules" ]; then | ||||||
| @@ -50,25 +52,6 @@ | |||||||
|           NODE_ENV = "development"; |           NODE_ENV = "development"; | ||||||
|           BUN_RUNTIME = "bun"; |           BUN_RUNTIME = "bun"; | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         packages.default = pkgs.stdenv.mkDerivation { |  | ||||||
|           name = "zod-pocketbase-continue"; |  | ||||||
|           src = ./.; |  | ||||||
|  |  | ||||||
|           buildInputs = [ bun ]; |  | ||||||
|  |  | ||||||
|           buildPhase = '' |  | ||||||
|             export HOME=$TMPDIR |  | ||||||
|             bun install --frozen-lockfile |  | ||||||
|             bun run build |  | ||||||
|           ''; |  | ||||||
|  |  | ||||||
|           installPhase = '' |  | ||||||
|             mkdir -p $out |  | ||||||
|             cp -r dist $out/ |  | ||||||
|             cp package.json $out/ |  | ||||||
|           ''; |  | ||||||
|         }; |  | ||||||
|       } |       } | ||||||
|     ); |     ); | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										134
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										134
									
								
								package.json
									
									
									
									
									
								
							| @@ -1,73 +1,65 @@ | |||||||
| { | { | ||||||
|   "name": "zod-pocketbase-continue", | 	"name": "zod-pocketbase-continue", | ||||||
|   "version": "0.5.0", | 	"version": "0.6.1", | ||||||
|   "description": "Zod tooling for your PocketBase instance.", | 	"description": "Zod tooling for your PocketBase instance.", | ||||||
|   "author": { | 	"author": { | ||||||
|     "email": "garandplg@garandplg.com", | 		"email": "garandplg@garandplg.com", | ||||||
|     "name": "Garand_PLG", | 		"name": "Garand_PLG", | ||||||
|     "url": "https://gitea.garandplg.com" | 		"url": "https://gitea.garandplg.com" | ||||||
|   }, | 	}, | ||||||
|   "license": "MIT", | 	"license": "MIT", | ||||||
|   "keywords": [ | 	"keywords": ["pocketbase", "schemas", "typescript", "typegen", "type generation", "zod"], | ||||||
|     "pocketbase", | 	"homepage": "https://gitea.garandplg.com/GarandPLG/zod-pocketbase-continue", | ||||||
|     "schemas", | 	"publishConfig": { | ||||||
|     "typescript", | 		"access": "public" | ||||||
|     "typegen", | 	}, | ||||||
|     "type generation", | 	"type": "module", | ||||||
|     "zod" | 	"sideEffects": false, | ||||||
|   ], | 	"packageManager": "bun@1.2.23", | ||||||
|   "homepage": "https://gitea.garandplg.com/GarandPLG/zod-pocketbase-continue", | 	"engines": { | ||||||
|   "publishConfig": { | 		"node": ">=24.9.0" | ||||||
|     "access": "public" | 	}, | ||||||
|   }, | 	"main": "dist/index.js", | ||||||
|   "type": "module", | 	"bin": { | ||||||
|   "sideEffects": false, | 		"zod-pocketbase-continue": "dist/server/cli.js" | ||||||
|   "packageManager": "bun@1.2.23", | 	}, | ||||||
|   "engines": { | 	"exports": { | ||||||
|     "node": ">=24.9.0" | 		".": { | ||||||
|   }, | 			"types": "./dist/index.d.ts", | ||||||
|   "main": "dist/index.js", | 			"default": "./dist/index.js" | ||||||
|   "bin": { | 		}, | ||||||
|     "zod-pocketbase-continue": "dist/server/cli.js" | 		"./server": { | ||||||
|   }, | 			"types": "./dist/server/index.d.ts", | ||||||
|   "exports": { | 			"default": "./dist/server/index.js" | ||||||
|     ".": { | 		} | ||||||
|       "types": "./dist/index.d.ts", | 	}, | ||||||
|       "default": "./dist/index.js" | 	"files": ["dist", "assets"], | ||||||
|     }, | 	"scripts": { | ||||||
|     "./server": { | 		"dev": "tsdown --watch", | ||||||
|       "types": "./dist/server/index.d.ts", | 		"build": "tsdown", | ||||||
|       "default": "./dist/server/index.js" | 		"changeset": "changeset", | ||||||
|     } | 		"release": "bun scripts/release.mjs", | ||||||
|   }, | 		"lint": "biome check .", | ||||||
|   "files": [ | 		"lint:w": "biome check --write .", | ||||||
|     "dist", | 		"format": "biome format .", | ||||||
|     "assets" | 		"format:w": "biome format --write ." | ||||||
|   ], | 	}, | ||||||
|   "scripts": { | 	"dependencies": { | ||||||
|     "dev": "tsdown --watch", | 		"@clack/prompts": "^0.11.0", | ||||||
|     "build": "tsdown", | 		"c12": "^3.3.1", | ||||||
|     "changeset": "changeset", | 		"citty": "^0.1.6", | ||||||
|     "release": "bun scripts/release.mjs" | 		"es-toolkit": "^1.40.0" | ||||||
|   }, | 	}, | ||||||
|   "dependencies": { | 	"devDependencies": { | ||||||
|     "@clack/prompts": "^0.11.0", | 		"@biomejs/biome": "2.2.6", | ||||||
|     "c12": "^3.3.0", | 		"@changesets/cli": "^2.29.7", | ||||||
|     "citty": "^0.1.6", | 		"@types/node": "^24.8.1", | ||||||
|     "es-toolkit": "^1.40.0" | 		"pocketbase": "^0.26.2", | ||||||
|   }, | 		"tsdown": "^0.15.8", | ||||||
|   "devDependencies": { | 		"zod": "^4.1.12" | ||||||
|     "@changesets/cli": "^2.29.7", | 	}, | ||||||
|     "@types/node": "^24.7.1", | 	"peerDependencies": { | ||||||
|     "@typescript-eslint/parser": "^8.46.0", | 		"pocketbase": "^0.26.2", | ||||||
|     "eslint": "^9.37.0", | 		"zod": "^4.1.12" | ||||||
|     "pocketbase": "^0.26.2", | 	} | ||||||
|     "prettier": "^3.6.2", |  | ||||||
|     "tsdown": "^0.15.6", |  | ||||||
|     "zod": "^3.25.76" |  | ||||||
|   }, |  | ||||||
|   "peerDependencies": { |  | ||||||
|     "pocketbase": "^0.26.2", |  | ||||||
|     "zod": "^3.25.76" |  | ||||||
|   } |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,4 +0,0 @@ | |||||||
| /** @type {import("prettier").Config} */ |  | ||||||
| export default { |  | ||||||
|   printWidth: 140, |  | ||||||
| }; |  | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| import { spawn } from "node:child_process"; | import { spawn } from 'node:child_process' | ||||||
| import { resolve } from "node:path"; | import { resolve } from 'node:path' | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * |  * | ||||||
| @@ -9,41 +9,41 @@ import { resolve } from "node:path"; | |||||||
|  * @returns {Promise<string>} |  * @returns {Promise<string>} | ||||||
|  */ |  */ | ||||||
| const run = async (command, ...args) => { | const run = async (command, ...args) => { | ||||||
|   const cwd = resolve(); | 	const cwd = resolve() | ||||||
|   return new Promise((resolve) => { | 	return new Promise((resolve) => { | ||||||
|     const cmd = spawn(command, args, { | 		const cmd = spawn(command, args, { | ||||||
|       stdio: ["inherit", "pipe", "pipe"], // Inherit stdin, pipe stdout, pipe stderr | 			stdio: ['inherit', 'pipe', 'pipe'], // Inherit stdin, pipe stdout, pipe stderr | ||||||
|       shell: true, | 			shell: true, | ||||||
|       cwd, | 			cwd, | ||||||
|     }); | 		}) | ||||||
|  |  | ||||||
|     let output = ""; | 		let output = '' | ||||||
|  |  | ||||||
|     cmd.stdout.on("data", (data) => { | 		cmd.stdout.on('data', (data) => { | ||||||
|       process.stdout.write(data.toString()); | 			process.stdout.write(data.toString()) | ||||||
|       output += data.toString(); | 			output += data.toString() | ||||||
|     }); | 		}) | ||||||
|  |  | ||||||
|     cmd.stderr.on("data", (data) => { | 		cmd.stderr.on('data', (data) => { | ||||||
|       process.stderr.write(data.toString()); | 			process.stderr.write(data.toString()) | ||||||
|     }); | 		}) | ||||||
|  |  | ||||||
|     cmd.on("close", () => { | 		cmd.on('close', () => { | ||||||
|       resolve(output); | 			resolve(output) | ||||||
|     }); | 		}) | ||||||
|   }); | 	}) | ||||||
| }; | } | ||||||
|  |  | ||||||
| const main = async () => { | const main = async () => { | ||||||
|   await run("bun changeset version"); | 	await run('bun changeset version') | ||||||
|   await run("git add ."); | 	await run('git add .') | ||||||
|   await run('git commit -m "chore: update version"'); | 	await run('git commit -m "chore: update version"') | ||||||
|   await run("git push"); | 	await run('git push') | ||||||
|   await run("bun run build"); | 	await run('bun run build') | ||||||
|   await run("bun changeset publish"); | 	await run('bun changeset publish') | ||||||
|   await run("git push --follow-tags"); | 	await run('git push --follow-tags') | ||||||
|   const tag = (await run("git describe --abbrev=0")).replace("\n", ""); | 	const tag = (await run('git describe --abbrev=0')).replace('\n', '') | ||||||
|   await run(`tea releases create --tag ${tag} --title "${tag}"`); | 	await run(`tea releases create --tag ${tag} --title "${tag}"`) | ||||||
| }; | } | ||||||
|  |  | ||||||
| main(); | main() | ||||||
|   | |||||||
							
								
								
									
										124
									
								
								src/config.ts
									
									
									
									
									
								
							
							
						
						
									
										124
									
								
								src/config.ts
									
									
									
									
									
								
							| @@ -1,66 +1,88 @@ | |||||||
| import { pascalCase, snakeCase } from "es-toolkit"; | import { pascalCase, snakeCase } from 'es-toolkit' | ||||||
| import { z } from "zod"; | import { z } from 'zod' | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Default config values. |  * Default config values. | ||||||
|  */ |  */ | ||||||
| export const defaultConfig = { | export const defaultConfig = { | ||||||
|   ignore: [], | 	ignore: [], | ||||||
|   nameEnum: (name: string) => snakeCase(name).toUpperCase(), | 	nameEnum: (name: string) => snakeCase(name).toUpperCase(), | ||||||
|   nameEnumField: (collectionName: string, fieldName: string) => `${collectionName}${pascalCase(fieldName)}`, | 	nameEnumField: (collectionName: string, fieldName: string) => | ||||||
|   nameEnumSchema: (name: string) => pascalCase(name), | 		`${collectionName}${pascalCase(fieldName)}`, | ||||||
|   nameEnumType: (name: string) => pascalCase(name), | 	nameEnumSchema: (name: string) => pascalCase(name), | ||||||
|   nameEnumValues: (name: string) => `${name}Values`, | 	nameEnumType: (name: string) => pascalCase(name), | ||||||
|   nameRecordSchema: (name: string) => `${pascalCase(name)}Record`, | 	nameEnumValues: (name: string) => `${name}Values`, | ||||||
|   nameRecordType: (name: string) => `${pascalCase(name)}Record`, | 	nameRecordSchema: (name: string) => `${pascalCase(name)}Record`, | ||||||
|   output: "./zod-pocketbase-continue.ts", | 	nameRecordType: (name: string) => `${pascalCase(name)}Record`, | ||||||
| }; | 	output: './zod-pocketbase-continue.ts', | ||||||
|  | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Schema for the PocketBase credentials. |  * Schema for the PocketBase credentials. | ||||||
|  */ |  */ | ||||||
| export const Credentials = z.object({ | export const Credentials = z.object({ | ||||||
|   adminEmail: z.string().email(), | 	adminEmail: z.email(), | ||||||
|   adminPassword: z.string(), | 	adminPassword: z.string(), | ||||||
|   url: z.string().url(), | 	url: z.url(), | ||||||
| }); | }) | ||||||
| export type Credentials = z.infer<typeof Credentials>; | export type Credentials = z.infer<typeof Credentials> | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Schema for the config file. |  * Schema for the config file. | ||||||
|  */ |  */ | ||||||
| export const Config = z.object({ | export const Config = z.object({ | ||||||
|   ...Credentials.partial().shape, | 	...Credentials.partial().shape, | ||||||
|   ignore: z.string().array().default(defaultConfig.ignore), | 	ignore: z.string().array().default(defaultConfig.ignore), | ||||||
|   nameEnum: z | 	nameEnum: z | ||||||
|     .function(z.tuple([z.string()]), z.string()) | 		.function({ | ||||||
|     .optional() | 			input: [z.string()], | ||||||
|     .transform((f) => f ?? defaultConfig.nameEnum), | 			output: z.string(), | ||||||
|   nameEnumField: z | 		}) | ||||||
|     .function(z.tuple([z.string(), z.string()]), z.string()) | 		.optional() | ||||||
|     .optional() | 		.transform((f) => f ?? defaultConfig.nameEnum), | ||||||
|     .transform((f) => f ?? defaultConfig.nameEnumField), | 	nameEnumField: z | ||||||
|   nameEnumSchema: z | 		.function({ | ||||||
|     .function(z.tuple([z.string()]), z.string()) | 			input: [z.string(), z.string()], | ||||||
|     .optional() | 			output: z.string(), | ||||||
|     .transform((f) => f ?? defaultConfig.nameEnumSchema), | 		}) | ||||||
|   nameEnumType: z | 		.optional() | ||||||
|     .function(z.tuple([z.string()]), z.string()) | 		.transform((f) => f ?? defaultConfig.nameEnumField), | ||||||
|     .optional() | 	nameEnumSchema: z | ||||||
|     .transform((f) => f ?? defaultConfig.nameEnumType), | 		.function({ | ||||||
|   nameEnumValues: z | 			input: [z.string()], | ||||||
|     .function(z.tuple([z.string()]), z.string()) | 			output: z.string(), | ||||||
|     .optional() | 		}) | ||||||
|     .transform((f) => f ?? defaultConfig.nameEnumValues), | 		.optional() | ||||||
|   nameRecordSchema: z | 		.transform((f) => f ?? defaultConfig.nameEnumSchema), | ||||||
|     .function(z.tuple([z.string()]), z.string()) | 	nameEnumType: z | ||||||
|     .optional() | 		.function({ | ||||||
|     .transform((f) => f ?? defaultConfig.nameRecordSchema), | 			input: [z.string()], | ||||||
|   nameRecordType: z | 			output: z.string(), | ||||||
|     .function(z.tuple([z.string()]), z.string()) | 		}) | ||||||
|     .optional() | 		.optional() | ||||||
|     .transform((f) => f ?? defaultConfig.nameRecordType), | 		.transform((f) => f ?? defaultConfig.nameEnumType), | ||||||
|   output: z.string().default(defaultConfig.output), | 	nameEnumValues: z | ||||||
| }); | 		.function({ | ||||||
| export type Config = z.input<typeof Config>; | 			input: [z.string()], | ||||||
| export type ResolvedConfig = z.infer<typeof Config>; | 			output: z.string(), | ||||||
|  | 		}) | ||||||
|  | 		.optional() | ||||||
|  | 		.transform((f) => f ?? defaultConfig.nameEnumValues), | ||||||
|  | 	nameRecordSchema: z | ||||||
|  | 		.function({ | ||||||
|  | 			input: [z.string()], | ||||||
|  | 			output: z.string(), | ||||||
|  | 		}) | ||||||
|  | 		.optional() | ||||||
|  | 		.transform((f) => f ?? defaultConfig.nameRecordSchema), | ||||||
|  | 	nameRecordType: z | ||||||
|  | 		.function({ | ||||||
|  | 			input: [z.string()], | ||||||
|  | 			output: z.string(), | ||||||
|  | 		}) | ||||||
|  | 		.optional() | ||||||
|  | 		.transform((f) => f ?? defaultConfig.nameRecordType), | ||||||
|  | 	output: z.string().default(defaultConfig.output), | ||||||
|  | }) | ||||||
|  | export type Config = z.input<typeof Config> | ||||||
|  | export type ResolvedConfig = z.infer<typeof Config> | ||||||
|   | |||||||
							
								
								
									
										292
									
								
								src/content.ts
									
									
									
									
									
								
							
							
						
						
									
										292
									
								
								src/content.ts
									
									
									
									
									
								
							| @@ -1,171 +1,203 @@ | |||||||
| import { sortBy } from "es-toolkit"; | import { sortBy } from 'es-toolkit' | ||||||
| import type { CollectionModel, CollectionField } from "pocketbase"; | import type { CollectionField, CollectionModel } from 'pocketbase' | ||||||
| import type { GenerateOpts } from "@/server/utils.ts"; | import type { GenerateOpts } from '@/server/utils.ts' | ||||||
|  |  | ||||||
| export function stringifyContent(collections: CollectionModel[], opts: GenerateOpts) { | export function stringifyContent(collections: CollectionModel[], opts: GenerateOpts) { | ||||||
|   function getCollectionSelectFields() { | 	function getCollectionSelectFields() { | ||||||
|     return collections.flatMap((collection) => | 		return collections.flatMap((collection) => | ||||||
|       collection.fields | 			collection.fields | ||||||
|         .filter((field: CollectionField) => field.type === "select") | 				.filter((field: CollectionField) => field.type === 'select') | ||||||
|         .map((field: CollectionField) => ({ | 				.map((field: CollectionField) => ({ | ||||||
|           name: opts.nameEnumField(collection.name, field.name), | 					name: opts.nameEnumField(collection.name, field.name), | ||||||
|           values: ((field as any).values ?? []) as string[], | 					values: ((field as any).values ?? []) as string[], | ||||||
|         })), | 				})), | ||||||
|     ); | 		) | ||||||
|   } | 	} | ||||||
|  |  | ||||||
|   function stringifyEnum({ name, values }: SelectField) { | 	function stringifyEnum({ name, values }: SelectField) { | ||||||
|     const valuesName = opts.nameEnumValues(name); | 		const valuesName = opts.nameEnumValues(name) | ||||||
|     const schemaName = opts.nameEnumSchema(name); | 		const schemaName = opts.nameEnumSchema(name) | ||||||
|     const enumName = opts.nameEnum(name); | 		const enumName = opts.nameEnum(name) | ||||||
|     const typeName = opts.nameEnumType(name); | 		const typeName = opts.nameEnumType(name) | ||||||
|     return `export const ${valuesName} = [\n\t${values.map((value) => `"${value}"`).join(",\n\t")},\n] as const;\nexport const ${schemaName} = z.enum(${valuesName});\nexport type ${typeName} = z.infer<typeof ${schemaName}>;\nexport const ${enumName} = ${schemaName}.enum;`; | 		return `export const ${valuesName} = [\n\t${values.map((value) => `"${value}"`).join(',\n\t')},\n] as const;\nexport const ${schemaName} = z.enum(${valuesName});\nexport type ${typeName} = z.infer<typeof ${schemaName}>;\nexport const ${enumName} = ${schemaName}.enum;` | ||||||
|   } | 	} | ||||||
|  |  | ||||||
|   function stringifyRecord({ name, fields }: CollectionModel) { | 	function stringifyRecord({ name, fields }: CollectionModel) { | ||||||
|     const schemaName = opts.nameRecordSchema(name); | 		const schemaName = opts.nameRecordSchema(name) | ||||||
|     const typeName = opts.nameRecordType(name); | 		const typeName = opts.nameRecordType(name) | ||||||
|  |  | ||||||
|     const systemFields = new Set(["id", "created", "updated", "collectionId", "collectionName", "expand", "password", "tokenKey"]); | 		const systemFields = new Set([ | ||||||
|  | 			'id', | ||||||
|  | 			'created', | ||||||
|  | 			'updated', | ||||||
|  | 			'collectionId', | ||||||
|  | 			'collectionName', | ||||||
|  | 			'expand', | ||||||
|  | 			'password', | ||||||
|  | 			'tokenKey', | ||||||
|  | 		]) | ||||||
|  |  | ||||||
|     const customFields = fields.filter((field) => !systemFields.has(field.name)); | 		const customFields = fields.filter((field) => !systemFields.has(field.name)) | ||||||
|     const fieldStrings = sortBy(customFields, ["name"]).map((field) => stringifyField(field, name)); | 		const fieldStrings = sortBy(customFields, ['name']).map((field) => stringifyField(field, name)) | ||||||
|  |  | ||||||
|     return `export const ${schemaName} = z.object({\n\t...RecordModel.omit({ expand: true }).shape,\n\tcollectionName: z.literal("${name}"),\n\t${fieldStrings.join(",\n\t")},\n});\nexport type ${typeName} = z.infer<typeof ${schemaName}>;`; | 		return `export const ${schemaName} = z.object({\n\t...RecordModel.omit({ expand: true }).shape,\n\tcollectionName: z.literal("${name}"),\n\t${fieldStrings.join(',\n\t')},\n});\nexport type ${typeName} = z.infer<typeof ${schemaName}>;` | ||||||
|   } | 	} | ||||||
|  |  | ||||||
|   function stringifySchemasEntry({ name }: CollectionModel) { | 	function stringifySchemasEntry({ name }: CollectionModel) { | ||||||
|     return `["${name}", ${opts.nameRecordSchema(name)}]`; | 		return `["${name}", ${opts.nameRecordSchema(name)}]` | ||||||
|   } | 	} | ||||||
|  |  | ||||||
|   function stringifyService({ name }: CollectionModel) { | 	function stringifyService({ name }: CollectionModel) { | ||||||
|     return `\t\tcollection(idOrName: "${name}"): RecordService<z.input<typeof ${opts.nameRecordSchema(name)}>>;`; | 		return `\t\tcollection(idOrName: "${name}"): RecordService<z.input<typeof ${opts.nameRecordSchema(name)}>>;` | ||||||
|   } | 	} | ||||||
|  |  | ||||||
|   function stringifyField(field: CollectionField, collectionName: string) { | 	function stringifyField(field: CollectionField, collectionName: string) { | ||||||
|     let schema: string; | 		let schema: string | ||||||
|     switch (field.type) { | 		switch (field.type) { | ||||||
|       case "bool": | 			case 'bool': | ||||||
|         schema = "z.boolean()"; | 				schema = 'z.boolean()' | ||||||
|         break; | 				break | ||||||
|  |  | ||||||
|       case "date": | 			case 'date': { | ||||||
|         const minConstraintDate = field.min ? `.min(new Date("${field.min}"))` : ""; | 				const minConstraintDate = field.min ? `.min(new Date("${field.min}"))` : '' | ||||||
|         const maxConstraintDate = field.max ? `.max(new Date("${field.max}"))` : ""; | 				const maxConstraintDate = field.max ? `.max(new Date("${field.max}"))` : '' | ||||||
|  |  | ||||||
|         schema = `z.string().pipe(z.coerce.date()${minConstraintDate}${maxConstraintDate})`; | 				schema = `z.coerce.date()${minConstraintDate}${maxConstraintDate}` | ||||||
|         break; | 				break | ||||||
|  | 			} | ||||||
|  |  | ||||||
|       case "editor": | 			case 'editor': | ||||||
|         // TODO: implement convertUrls | 				// TODO: implement convertUrls | ||||||
|         schema = "z.string()"; | 				schema = 'z.string()' | ||||||
|         break; | 				break | ||||||
|  |  | ||||||
|       case "email": | 			case 'email': { | ||||||
|         const onlyDomainsConstraint = createDomainConstraint(field.onlyDomains, true, "email"); | 				const onlyDomainsConstraint = createDomainConstraint(field.onlyDomains, true, 'email') | ||||||
|         const exceptDomainsConstraint = createDomainConstraint(field.exceptDomains, false, "email"); | 				const exceptDomainsConstraint = createDomainConstraint(field.exceptDomains, false, 'email') | ||||||
|  |  | ||||||
|         schema = `z.string().email()${onlyDomainsConstraint}${exceptDomainsConstraint}`; | 				schema = `z.email()${onlyDomainsConstraint}${exceptDomainsConstraint}` | ||||||
|         break; | 				break | ||||||
|  | 			} | ||||||
|  |  | ||||||
|       case "file": | 			case 'file': { | ||||||
|         const maxSelectFile: number = field.maxSelect; | 				const maxSelectFile: number = field.maxSelect | ||||||
|         const maxSizeFile: number = field.maxSize; | 				const maxSizeFile: number = field.maxSize | ||||||
|         const mimeTypesArray: string[] = field.mimeTypes || []; | 				const mimeTypesArray: string[] = field.mimeTypes || [] | ||||||
|         // const protectedFile: boolean = field.protected; | 				// const protectedFile: boolean = field.protected; | ||||||
|         // const thumbsFileArray: string[] = field.thumbs || []; | 				// const thumbsFileArray: string[] = field.thumbs || []; | ||||||
|  |  | ||||||
|         const fileFieldMaxSelect = maxSelectFile ? `.max(${maxSelectFile})` : ""; | 				const fileFieldMaxSelect = maxSelectFile ? `.max(${maxSelectFile})` : '' | ||||||
|         const fileFieldTypeArray = maxSelectFile === 1 ? "" : `.array()${fileFieldMaxSelect}`; | 				const fileFieldTypeArray = maxSelectFile === 1 ? '' : `.array()${fileFieldMaxSelect}` | ||||||
|  |  | ||||||
|         let fileValidation = "z.instanceof(File)"; | 				const fileMaxSizeFile = maxSizeFile ? `.max(${maxSizeFile})` : '' | ||||||
|  | 				const fileMimeTypesArray = | ||||||
|  | 					mimeTypesArray.length > 0 ? `.mime(${JSON.stringify(mimeTypesArray)})` : '' | ||||||
|  |  | ||||||
|         if (maxSizeFile) fileValidation += `.refine((file) => file.size <= ${maxSizeFile}, { message: "File size too large" })`; | 				const baseFileSchema = `z.union([z.string(), z.file()${fileMaxSizeFile}${fileMimeTypesArray}])` | ||||||
|  | 				schema = `${baseFileSchema}${fileFieldTypeArray}` | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  |  | ||||||
|         if (mimeTypesArray.length > 0) | 			case 'json': | ||||||
|           fileValidation += `.refine((file) => ${JSON.stringify(mimeTypesArray)}.includes(file.type), { message: "Invalid file type" })`; | 				schema = field.maxSize > 0 ? `pbJsonField(${field.maxSize})` : 'pbJsonField()' | ||||||
|  | 				break | ||||||
|  |  | ||||||
|         const baseFileSchema = `z.union([z.string(), ${fileValidation}])`; | 			case 'number': { | ||||||
|         schema = `${baseFileSchema}${fileFieldTypeArray}`; | 				const maxNumber = field.maxNumber ? `.max(${field.maxNumber})` : '' | ||||||
|         break; | 				const minNumber = field.minNumber ? `.min(${field.minNumber})` : '' | ||||||
|  | 				const noDecimal = field.noDecimal ? '.int()' : '' | ||||||
|  |  | ||||||
|       case "json": | 				schema = `z.number()${noDecimal}${minNumber}${maxNumber}` | ||||||
|         schema = field.maxSize > 0 ? `pbJsonField(${field.maxSize})` : "pbJsonField()"; | 				break | ||||||
|         break; | 			} | ||||||
|  |  | ||||||
|       case "number": | 			case 'relation': { | ||||||
|         const maxNumber = field.maxNumber ? `.max(${field.maxNumber})` : ""; | 				// TODO: implement cascadeDelete, displayFields, multiple records query | ||||||
|         const minNumber = field.minNumber ? `.min(${field.minNumber})` : ""; | 				const multiple = | ||||||
|         const noDecimal = field.noDecimal ? ".int()" : ""; | 					field.maxSelect === 1 ? '' : `.array().min(${field.minSelect}).max(${field.maxSelect})` | ||||||
|  | 				const isOptional = | ||||||
|  | 					field.required || field.maxSelect !== 1 | ||||||
|  | 						? `` | ||||||
|  | 						: `.transform((id: string) => id === "" ? undefined : id)` | ||||||
|  |  | ||||||
|         schema = `z.number()${noDecimal}${minNumber}${maxNumber}`; | 				schema = `z.string()${isOptional}${multiple}` | ||||||
|         break; | 				break | ||||||
|  | 			} | ||||||
|  |  | ||||||
|       case "relation": | 			case 'select': { | ||||||
|         // TODO: implement cascadeDelete, displayFields, multiple records query | 				const maxSelect = field.maxSelect === 1 ? '' : `.array().max(${field.maxSelect})` | ||||||
|         const multiple = field.maxSelect === 1 ? "" : `.array().min(${field.minSelect}).max(${field.maxSelect})`; |  | ||||||
|         const isOptional = field.required || field.maxSelect !== 1 ? `` : `.transform((id: string) => id === "" ? undefined : id)`; |  | ||||||
|  |  | ||||||
|         schema = `z.string()${isOptional}${multiple}`; | 				schema = `${opts.nameEnumSchema(opts.nameEnumField(collectionName, field.name))}${maxSelect}` | ||||||
|         break; | 				break | ||||||
|  | 			} | ||||||
|  |  | ||||||
|       case "select": | 			case 'text': { | ||||||
|         const maxSelect = field.maxSelect === 1 ? "" : `.array().max(${field.maxSelect})`; | 				const patternText = | ||||||
|  | 					field.pattern && field.pattern.trim() !== '' | ||||||
|  | 						? `.regex(new RegExp("${field.pattern.replace(/"/g, '\\"')}"))` | ||||||
|  | 						: '' | ||||||
|  | 				const maxText = field.max ? `.max(${field.max})` : '' | ||||||
|  | 				const minText = field.min ? `.min(${field.min})` : '' | ||||||
|  |  | ||||||
|         schema = `${opts.nameEnumSchema(opts.nameEnumField(collectionName, field.name))}${maxSelect}`; | 				schema = `z.string()${minText}${maxText}${patternText}` | ||||||
|         break; | 				break | ||||||
|  | 			} | ||||||
|  |  | ||||||
|       case "text": | 			case 'url': { | ||||||
|         const patternText = | 				const onlyDomainsUrlConstraint = createDomainConstraint(field.onlyDomains, true, 'url') | ||||||
|           field.pattern && field.pattern.trim() !== "" ? `.regex(new RegExp("${field.pattern.replace(/"/g, '\\"')}"))` : ""; | 				const exceptDomainsUrlConstraint = createDomainConstraint(field.exceptDomains, false, 'url') | ||||||
|         const maxText = field.max ? `.max(${field.max})` : ""; |  | ||||||
|         const minText = field.min ? `.min(${field.min})` : ""; |  | ||||||
|  |  | ||||||
|         schema = `z.string()${minText}${maxText}${patternText}`; | 				schema = `z.url()${onlyDomainsUrlConstraint}${exceptDomainsUrlConstraint}` | ||||||
|         break; | 				break | ||||||
|  | 			} | ||||||
|  |  | ||||||
|       case "url": | 			case 'geoPoint': | ||||||
|         const onlyDomainsUrlConstraint = createDomainConstraint(field.onlyDomains, true, "url"); | 				schema = | ||||||
|         const exceptDomainsUrlConstraint = createDomainConstraint(field.exceptDomains, false, "url"); | 					'z.object({ lat: z.number().min(-90).max(90), lon: z.number().min(-180).max(180) })' | ||||||
|  | 				break | ||||||
|  |  | ||||||
|         schema = `z.string().url()${onlyDomainsUrlConstraint}${exceptDomainsUrlConstraint}`; | 			default: | ||||||
|         break; | 				console.warn( | ||||||
|  | 					`Unknown field type "${field.type}" for field "${field.name}". Using z.any() as fallback.`, | ||||||
|  | 				) | ||||||
|  | 				schema = 'z.any()' | ||||||
|  | 				break | ||||||
|  | 		} | ||||||
|  | 		return `${field.name}: ${schema}${(field as any).required ? '' : '.optional()'}` | ||||||
|  | 	} | ||||||
|  |  | ||||||
|       case "geoPoint": | 	/* Helpers */ | ||||||
|         schema = "z.object({ lat: z.number().min(-90).max(90), lon: z.number().min(-180).max(180) })"; |  | ||||||
|         break; |  | ||||||
|  |  | ||||||
|       default: | 	const createDomainConstraint = ( | ||||||
|         console.warn(`Unknown field type "${field.type}" for field "${field.name}". Using z.any() as fallback.`); | 		domains: string[], | ||||||
|         schema = "z.any()"; | 		isWhitelist: boolean, | ||||||
|         break; | 		type: 'email' | 'url', | ||||||
|     } | 	) => { | ||||||
|     return `${field.name}: ${schema}${(field as any).required ? "" : ".optional()"}`; | 		if (!domains?.length) return '' | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /* Helpers */ | 		const domainsList = domains.map((domain) => `"${domain}"`).join(', ') | ||||||
|  | 		const messageType = isWhitelist | ||||||
|  | 			? "isn't one of the allowed ones" | ||||||
|  | 			: 'is one of the disallowed ones' | ||||||
|  | 		const negation = isWhitelist ? '' : '!' | ||||||
|  |  | ||||||
|   const createDomainConstraint = (domains: string[], isWhitelist: boolean, type: "email" | "url") => { | 		const domainExtraction = | ||||||
|     if (!domains?.length) return ""; | 			type === 'email' | ||||||
|  | 				? 'const domain = value.split("@")[1];' | ||||||
|  | 				: 'const domain = new URL(value).hostname;' | ||||||
|  |  | ||||||
|     const domainsList = domains.map((domain) => `"${domain}"`).join(", "); | 		const errorHandling = type === 'url' ? 'try { ' : '' | ||||||
|     const messageType = isWhitelist ? "isn't one of the allowed ones" : "is one of the disallowed ones"; | 		const errorCatch = type === 'url' ? ' } catch { return false; }' : '' | ||||||
|     const negation = isWhitelist ? "" : "!"; |  | ||||||
|  |  | ||||||
|     const domainExtraction = type === "email" ? 'const domain = value.split("@")[1];' : "const domain = new URL(value).hostname;"; | 		return `.refine((value: string) => { ${errorHandling}${domainExtraction} const domainsArray = [${domainsList}]; return domain && ${negation}domainsArray.includes(domain);${errorCatch} }, { message: "Invalid ${type}, domain ${messageType}" })` | ||||||
|  | 	} | ||||||
|  |  | ||||||
|     const errorHandling = type === "url" ? "try { " : ""; | 	return { | ||||||
|     const errorCatch = type === "url" ? " } catch { return false; }" : ""; | 		collectionNames: `[\n\t${collections.map(({ name }) => `"${name}"`).join(',\n\t')},\n]`, | ||||||
|  | 		enums: getCollectionSelectFields().map(stringifyEnum).join('\n\n'), | ||||||
|     return `.refine((value: string) => { ${errorHandling}${domainExtraction} const domainsArray = [${domainsList}]; return domain && ${negation}domainsArray.includes(domain);${errorCatch} }, { message: "Invalid ${type}, domain ${messageType}" })`; | 		records: `${collections.map(stringifyRecord).join('\n\n')}\n\nexport const records = new Map<Collection, z.ZodObject>([\n\t${collections.map(stringifySchemasEntry).join(',\n\t')},\n]);`, | ||||||
|   }; | 		services: collections.map(stringifyService).join('\n'), | ||||||
|  | 	} | ||||||
|   return { |  | ||||||
|     collectionNames: `[\n\t${collections.map(({ name }) => `"${name}"`).join(",\n\t")},\n]`, |  | ||||||
|     enums: getCollectionSelectFields().map(stringifyEnum).join("\n\n"), |  | ||||||
|     records: `${collections.map(stringifyRecord).join("\n\n")}\n\nexport const records = new Map<Collection, z.AnyZodObject>([\n\t${collections.map(stringifySchemasEntry).join(",\n\t")},\n]);`, |  | ||||||
|     services: collections.map(stringifyService).join("\n"), |  | ||||||
|   }; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| export type SelectField = { name: string; values: string[] }; | export type SelectField = { name: string; values: string[] } | ||||||
|   | |||||||
| @@ -1,30 +1,45 @@ | |||||||
| import type { default as Pocketbase, SendOptions } from "pocketbase"; | import type { default as Pocketbase, SendOptions } from 'pocketbase' | ||||||
| import { fullListOptionsFrom, optionsFrom } from "@/options.ts"; | import type { ZodObject } from 'zod' | ||||||
| import type { AnyZodRecord, RecordFullListOpts, RecordIdRef, RecordRef, RecordSlugRef } from "@/types.ts"; | import { fullListOptionsFrom, optionsFrom } from '@/options.ts' | ||||||
| import { AnyRecordsList } from "@/schemas.ts"; | import type { RecordsList } from '@/schemas.ts' | ||||||
| import type { RecordsList } from "@/schemas.ts"; | import { AnyRecordsList } from '@/schemas.ts' | ||||||
|  | import type { RecordFullListOpts, RecordIdRef, RecordRef, RecordSlugRef } from '@/types.ts' | ||||||
|  |  | ||||||
| export function helpersFrom({ fetch, pocketbase }: HelpersFromOpts) { | export function helpersFrom({ fetch, pocketbase }: HelpersFromOpts) { | ||||||
|   async function getRecord<C extends string, S extends AnyZodRecord>(ref: RecordSlugRef<C>, opts: GetRecordOpts<S>): Promise<S["_output"]>; | 	async function getRecord<C extends string, S extends ZodObject>( | ||||||
|   async function getRecord<C extends string, S extends AnyZodRecord>(ref: RecordIdRef<C>, opts: GetRecordOpts<S>): Promise<S["_output"]>; | 		ref: RecordSlugRef<C>, | ||||||
|   async function getRecord<C extends string, S extends AnyZodRecord>(ref: RecordRef<C>, opts: GetRecordOpts<S>) { | 		opts: GetRecordOpts<S>, | ||||||
|     const { schema } = opts; | 	): Promise<S['_output']> | ||||||
|     const sdkOpts = { ...optionsFrom(schema), ...(fetch ? { fetch } : {}) }; | 	async function getRecord<C extends string, S extends ZodObject>( | ||||||
|     const unsafeRecord = await ("id" in ref | 		ref: RecordIdRef<C>, | ||||||
|       ? pocketbase.collection(ref.collection).getOne(ref.id, sdkOpts) | 		opts: GetRecordOpts<S>, | ||||||
|       : pocketbase.collection(ref.collection).getFirstListItem(`slug = "${ref.slug}"`, sdkOpts)); | 	): Promise<S['_output']> | ||||||
|     return schema.parseAsync(unsafeRecord); | 	async function getRecord<C extends string, S extends ZodObject>( | ||||||
|   } | 		ref: RecordRef<C>, | ||||||
|  | 		opts: GetRecordOpts<S>, | ||||||
|  | 	) { | ||||||
|  | 		const { schema } = opts | ||||||
|  | 		const sdkOpts = { ...optionsFrom(schema), ...(fetch ? { fetch } : {}) } | ||||||
|  | 		const unsafeRecord = await ('id' in ref | ||||||
|  | 			? pocketbase.collection(ref.collection).getOne(ref.id, sdkOpts) | ||||||
|  | 			: pocketbase.collection(ref.collection).getFirstListItem(`slug = "${ref.slug}"`, sdkOpts)) | ||||||
|  | 		return schema.parseAsync(unsafeRecord) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|   async function getRecords<C extends string, S extends AnyZodRecord>(collection: C, opts: GetRecordsOpts<S>): Promise<RecordsList<S>> { | 	async function getRecords<C extends string, S extends ZodObject>( | ||||||
|     const { schema, ...otherOpts } = opts; | 		collection: C, | ||||||
|     const sdkOpts = { ...fullListOptionsFrom(schema, otherOpts), ...(fetch ? { fetch } : {}) }; | 		opts: GetRecordsOpts<S>, | ||||||
|     const recordsList = await pocketbase.collection(collection).getList(sdkOpts.page, sdkOpts.perPage, sdkOpts); | 	): Promise<RecordsList<S>> { | ||||||
|     return AnyRecordsList.extend({ items: schema.array() }).parseAsync(recordsList); | 		const { schema, ...otherOpts } = opts | ||||||
|   } | 		const sdkOpts = { ...fullListOptionsFrom(schema, otherOpts), ...(fetch ? { fetch } : {}) } | ||||||
|  | 		const recordsList = await pocketbase | ||||||
|  | 			.collection(collection) | ||||||
|  | 			.getList(sdkOpts.page, sdkOpts.perPage, sdkOpts) | ||||||
|  | 		return AnyRecordsList.extend({ items: schema.array() }).parseAsync(recordsList) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|   return { getRecord, getRecords }; | 	return { getRecord, getRecords } | ||||||
| } | } | ||||||
| export type GetRecordOpts<S extends AnyZodRecord> = { schema: S }; | export type GetRecordOpts<S extends ZodObject> = { schema: S } | ||||||
| export type GetRecordsOpts<S extends AnyZodRecord> = RecordFullListOpts<S> & { schema: S }; | export type GetRecordsOpts<S extends ZodObject> = RecordFullListOpts<S> & { schema: S } | ||||||
| export type HelpersFromOpts = { fetch?: SendOptions["fetch"]; pocketbase: Pocketbase }; | export type HelpersFromOpts = { fetch?: SendOptions['fetch']; pocketbase: Pocketbase } | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								src/index.ts
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								src/index.ts
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| export * from "./config.js"; | export * from '@/config.js' | ||||||
| export * from "./helpers.js"; | export * from '@/helpers.js' | ||||||
| export * from "./options.js"; | export * from '@/options.js' | ||||||
| export * from "./schemas.js"; | export * from '@/schemas.js' | ||||||
| export * from "./types.ts"; | export * from '@/types.ts' | ||||||
| export * from "./utils.js"; | export * from '@/utils.js' | ||||||
|   | |||||||
							
								
								
									
										155
									
								
								src/options.ts
									
									
									
									
									
								
							
							
						
						
									
										155
									
								
								src/options.ts
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| import { z } from "zod"; | import type { ZodObject } from 'zod' | ||||||
| import type { AnyZodObject, ZodTypeAny } from "zod"; | import { z } from 'zod' | ||||||
| import type { AnyZodRecord, RecordFullListOpts, RecordListOpts } from "@/types.ts"; | import type { RecordFullListOpts, RecordListOpts } from '@/types.ts' | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Extends the given schema with the given expansion. |  * Extends the given schema with the given expansion. | ||||||
| @@ -8,10 +8,10 @@ import type { AnyZodRecord, RecordFullListOpts, RecordListOpts } from "@/types.t | |||||||
|  * @param shape - The shape of the expansion |  * @param shape - The shape of the expansion | ||||||
|  * @returns A new schema extended with the given expansion |  * @returns A new schema extended with the given expansion | ||||||
|  */ |  */ | ||||||
| export function expandFrom<S extends AnyZodRecord>(schema: S) { | export function expandFrom<S extends ZodObject<any, any>>(schema: S) { | ||||||
|   return expandFromRec(schema) | 	return expandFromRec(schema) | ||||||
|     .sort((k1, k2) => (k1 < k2 ? -1 : 1)) | 		.sort((k1, k2) => (k1 < k2 ? -1 : 1)) | ||||||
|     .join(","); | 		.join(',') | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -20,10 +20,10 @@ export function expandFrom<S extends AnyZodRecord>(schema: S) { | |||||||
|  * @param shape - The shape of the expansion |  * @param shape - The shape of the expansion | ||||||
|  * @returns A new schema extended with the given expansion |  * @returns A new schema extended with the given expansion | ||||||
|  */ |  */ | ||||||
| export function fieldsFrom<S extends AnyZodRecord>(schema: S) { | export function fieldsFrom<S extends ZodObject<any, any>>(schema: S) { | ||||||
|   return fieldsFromRec(schema) | 	return fieldsFromRec(schema) | ||||||
|     .sort((k1, k2) => (k1 < k2 ? -1 : 1)) | 		.sort((k1, k2) => (k1 < k2 ? -1 : 1)) | ||||||
|     .join(","); | 		.join(',') | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -32,8 +32,8 @@ export function fieldsFrom<S extends AnyZodRecord>(schema: S) { | |||||||
|  * @param shape - The shape of the expansion |  * @param shape - The shape of the expansion | ||||||
|  * @returns A new schema extended with the given expansion |  * @returns A new schema extended with the given expansion | ||||||
|  */ |  */ | ||||||
| export function optionsFrom<S extends AnyZodRecord>(schema: S) { | export function optionsFrom<S extends ZodObject<any, any>>(schema: S) { | ||||||
|   return { expand: expandFrom(schema), fields: fieldsFrom(schema) }; | 	return { expand: expandFrom(schema), fields: fieldsFrom(schema) } | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -42,9 +42,9 @@ export function optionsFrom<S extends AnyZodRecord>(schema: S) { | |||||||
|  * @param shape - The shape of the expansion |  * @param shape - The shape of the expansion | ||||||
|  * @returns A new schema extended with the given expansion |  * @returns A new schema extended with the given expansion | ||||||
|  */ |  */ | ||||||
| export function listOptionsFrom<S extends AnyZodRecord>(schema: S, opts: RecordListOpts<S>) { | export function listOptionsFrom<S extends ZodObject<any, any>>(schema: S, opts: RecordListOpts<S>) { | ||||||
|   const { page = 1, perPage = 30, ...rest } = opts; | 	const { page = 1, perPage = 30, ...rest } = opts | ||||||
|   return { ...optionsFrom(schema), page, perPage, ...rest }; | 	return { ...optionsFrom(schema), page, perPage, ...rest } | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -53,46 +53,101 @@ export function listOptionsFrom<S extends AnyZodRecord>(schema: S, opts: RecordL | |||||||
|  * @param shape - The shape of the expansion |  * @param shape - The shape of the expansion | ||||||
|  * @returns A new schema extended with the given expansion |  * @returns A new schema extended with the given expansion | ||||||
|  */ |  */ | ||||||
| export function fullListOptionsFrom<S extends AnyZodRecord>(schema: S, opts: RecordFullListOpts<S>) { | export function fullListOptionsFrom<S extends ZodObject<any, any>>( | ||||||
|   const { page = 1, perPage = 200, skipTotal = true, ...rest } = opts; | 	schema: S, | ||||||
|   return listOptionsFrom(schema, { page, perPage, skipTotal, ...rest }); | 	opts: RecordFullListOpts<S>, | ||||||
|  | ) { | ||||||
|  | 	const { page = 1, perPage = 200, skipTotal = true, ...rest } = opts | ||||||
|  | 	return listOptionsFrom(schema, { page, perPage, skipTotal, ...rest }) | ||||||
| } | } | ||||||
|  |  | ||||||
| function expandFromRec<S extends ZodTypeAny>(schema: S, prefix = "") { | function expandFromRec<S>(schema: S, prefix = '') { | ||||||
|   let expands: string[] = []; | 	let expands: string[] = [] | ||||||
|   const shape = getObjectSchemaDescendant(schema)?.shape; | 	const shape = getObjectSchemaDescendant(schema)?.shape | ||||||
|   if (!shape || !("expand" in shape)) return []; | 	if (!shape || !('expand' in shape)) return [] | ||||||
|   for (const [key, value] of Object.entries(getObjectSchemaDescendant(shape.expand)!.shape)) { | 	for (const [key, value] of Object.entries(getObjectSchemaDescendant(shape.expand)!.shape)) { | ||||||
|     expands = [...expands, `${prefix}${key}`]; | 		expands = [...expands, `${prefix}${key}`] | ||||||
|     if (hasObjectSchemaDescendant(value)) expands = [...expands, ...expandFromRec(getObjectSchemaDescendant(value)!, `${prefix}${key}.`)]; | 		if (hasObjectSchemaDescendant(value)) | ||||||
|   } | 			expands = [ | ||||||
|   return expands; | 				...expands, | ||||||
|  | 				...expandFromRec(getObjectSchemaDescendant(value)!, `${prefix}${key}.`), | ||||||
|  | 			] | ||||||
|  | 	} | ||||||
|  | 	return expands | ||||||
| } | } | ||||||
|  |  | ||||||
| function fieldsFromRec<S extends z.ZodTypeAny>(schema: S, prefix = "") { | function fieldsFromRec<S>(schema: S, prefix = '') { | ||||||
|   let fields: string[] = []; | 	let fields: string[] = [] | ||||||
|   const shape = getObjectSchemaDescendant(schema)?.shape; | 	const shape = getObjectSchemaDescendant(schema)?.shape | ||||||
|   if (!shape) return []; | 	if (!shape) return [] | ||||||
|   for (const [key, value] of Object.entries(shape)) { | 	for (const [key, value] of Object.entries(shape)) { | ||||||
|     fields = [ | 		fields = [ | ||||||
|       ...fields, | 			...fields, | ||||||
|       ...(hasObjectSchemaDescendant(value) ? fieldsFromRec(getObjectSchemaDescendant(value)!, `${prefix}${key}.`) : [`${prefix}${key}`]), | 			...(hasObjectSchemaDescendant(value) | ||||||
|     ]; | 				? fieldsFromRec(getObjectSchemaDescendant(value)!, `${prefix}${key}.`) | ||||||
|   } | 				: [`${prefix}${key}`]), | ||||||
|   return fields.sort((k1, k2) => (k1 < k2 ? -1 : 1)); | 		] | ||||||
|  | 	} | ||||||
|  | 	return fields.sort((k1, k2) => (k1 < k2 ? -1 : 1)) | ||||||
| } | } | ||||||
|  |  | ||||||
| function hasObjectSchemaDescendant(value: unknown): value is z.ZodTypeAny { | function hasObjectSchemaDescendant(value: unknown): value is any { | ||||||
|   if (value instanceof z.ZodEffects) return hasObjectSchemaDescendant(value.innerType()); | 	// Handle ZodPipe | ||||||
|   if (value instanceof z.ZodArray) return hasObjectSchemaDescendant(value.element); | 	if (value && typeof value === 'object' && 'constructor' in value) { | ||||||
|   if (value instanceof z.ZodOptional) return hasObjectSchemaDescendant(value.unwrap()); | 		const valueConstructor = value.constructor | ||||||
|   return value instanceof z.ZodObject; | 		if (valueConstructor?.name === 'ZodPipe') { | ||||||
|  | 			const inputSchema = (value as any)._def?.in | ||||||
|  | 			if (inputSchema) return hasObjectSchemaDescendant(inputSchema) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Handle ZodTransform | ||||||
|  | 	if (value && typeof value === 'object' && 'constructor' in value) { | ||||||
|  | 		const valueConstructor = value.constructor | ||||||
|  | 		if (valueConstructor?.name === 'ZodTransform') { | ||||||
|  | 			const innerSchema = | ||||||
|  | 				(value as any)._def?.input || (value as any)._def?.schema || (value as any).sourceType | ||||||
|  | 			if (innerSchema) return hasObjectSchemaDescendant(innerSchema) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Handle ZodArray | ||||||
|  | 	if (value instanceof z.ZodArray) return hasObjectSchemaDescendant((value as any).element) | ||||||
|  |  | ||||||
|  | 	// Handle ZodOptional | ||||||
|  | 	if (value instanceof z.ZodOptional) return hasObjectSchemaDescendant((value as any).unwrap()) | ||||||
|  |  | ||||||
|  | 	return value instanceof z.ZodObject | ||||||
| } | } | ||||||
|  |  | ||||||
| function getObjectSchemaDescendant<S extends z.ZodTypeAny>(schema: S): AnyZodObject | undefined { | function getObjectSchemaDescendant<S>(schema: S): ZodObject | undefined { | ||||||
|   if (schema instanceof z.ZodEffects) return getObjectSchemaDescendant(schema.innerType()); | 	// Handle ZodPipe | ||||||
|   if (schema instanceof z.ZodArray) return getObjectSchemaDescendant(schema.element); | 	if (schema && typeof schema === 'object' && 'constructor' in schema) { | ||||||
|   if (schema instanceof z.ZodOptional) return getObjectSchemaDescendant(schema.unwrap()); | 		const schemaConstructor = schema.constructor | ||||||
|   if (schema instanceof z.ZodObject) return schema; | 		if (schemaConstructor?.name === 'ZodPipe') { | ||||||
|   return; | 			const inputSchema = (schema as any)._def?.in | ||||||
|  | 			if (inputSchema) return getObjectSchemaDescendant(inputSchema) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Handle ZodTransform | ||||||
|  | 	if (schema && typeof schema === 'object' && 'constructor' in schema) { | ||||||
|  | 		const schemaConstructor = schema.constructor | ||||||
|  | 		if (schemaConstructor?.name === 'ZodTransform') { | ||||||
|  | 			const innerSchema = | ||||||
|  | 				(schema as any)._def?.input || (schema as any)._def?.schema || (schema as any).sourceType | ||||||
|  | 			if (innerSchema) return getObjectSchemaDescendant(innerSchema) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Handle ZodArray | ||||||
|  | 	if (schema instanceof z.ZodArray) return getObjectSchemaDescendant((schema as any).element) | ||||||
|  |  | ||||||
|  | 	// Handle ZodOptional | ||||||
|  | 	if (schema instanceof z.ZodOptional) return getObjectSchemaDescendant((schema as any).unwrap()) | ||||||
|  |  | ||||||
|  | 	// Handle ZodObject | ||||||
|  | 	if (schema instanceof z.ZodObject) return schema as ZodObject | ||||||
|  |  | ||||||
|  | 	return undefined | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										103
									
								
								src/schemas.ts
									
									
									
									
									
								
							
							
						
						
									
										103
									
								
								src/schemas.ts
									
									
									
									
									
								
							| @@ -1,17 +1,17 @@ | |||||||
| import { z, ZodOptional, ZodEffects } from "zod"; | import type { ZodObject, ZodOptional, ZodRawShape } from 'zod' | ||||||
| import type { AnyZodObject, objectUtil, ZodObject, ZodRawShape } from "zod"; | import { z } from 'zod' | ||||||
| import type { AnyZodRecord, HasRequiredKeys, ZodRecordKeys } from "@/types.ts"; | import type { HasRequiredKeys, ZodRecordKeys } from '@/types.ts' | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Records list schema. |  * Records list schema. | ||||||
|  */ |  */ | ||||||
| export const AnyRecordsList = z.object({ | export const AnyRecordsList = z.object({ | ||||||
|   items: z.any().array(), | 	items: z.any().array(), | ||||||
|   page: z.number().int().min(1), | 	page: z.int().min(1), | ||||||
|   perPage: z.number().int().min(1), | 	perPage: z.int().min(1), | ||||||
|   totalItems: z.number().int().min(-1), | 	totalItems: z.int().min(-1), | ||||||
|   totalPages: z.number().int().min(-1), | 	totalPages: z.int().min(-1), | ||||||
| }); | }) | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Extends the given schema with the given expansion. |  * Extends the given schema with the given expansion. | ||||||
| @@ -19,11 +19,19 @@ export const AnyRecordsList = z.object({ | |||||||
|  * @param shape - The shape of the expansion |  * @param shape - The shape of the expansion | ||||||
|  * @returns A new schema extended with the given expansion |  * @returns A new schema extended with the given expansion | ||||||
|  */ |  */ | ||||||
| export function expand<S extends AnyZodObject, E extends ZodRawShape>(schema: S, shape: E) { | export function expand<S extends ZodObject<any, any>, E extends ZodRawShape>(schema: S, shape: E) { | ||||||
|   const isExpandOptional = Object.entries(shape).every(([, value]) => value instanceof z.ZodOptional); | 	const isExpandOptional = Object.entries(shape).every( | ||||||
|   return z | 		([, value]) => value instanceof z.ZodOptional, | ||||||
|     .object({ ...schema.shape, expand: isExpandOptional ? z.object(shape).optional() : z.object(shape) }) | 	) | ||||||
|     .transform(({ expand, ...rest }) => ({ ...rest, ...(expand ?? {}) })) as ZodObjectExpand<S, E>; | 	return z | ||||||
|  | 		.object({ | ||||||
|  | 			...schema.shape, | ||||||
|  | 			expand: isExpandOptional ? z.object(shape).optional() : z.object(shape), | ||||||
|  | 		}) | ||||||
|  | 		.transform(({ expand, ...rest }) => ({ | ||||||
|  | 			...rest, | ||||||
|  | 			...(expand ?? {}), | ||||||
|  | 		})) as ZodObjectExpand<S, E> | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -32,8 +40,11 @@ export function expand<S extends AnyZodObject, E extends ZodRawShape>(schema: S, | |||||||
|  * @param keys - The keys to keep |  * @param keys - The keys to keep | ||||||
|  * @returns A new schema with only the given keys |  * @returns A new schema with only the given keys | ||||||
|  */ |  */ | ||||||
| export function pick<S extends AnyZodObject, K extends ZodRecordKeys<S>[]>(schema: S, keys: K) { | export function pick<S extends ZodObject<any, any>, K extends ZodRecordKeys<S>[]>( | ||||||
|   return schema.pick(Object.fromEntries(keys.map((key) => [key, true]))) as ZodObjectPick<S, K>; | 	schema: S, | ||||||
|  | 	keys: K, | ||||||
|  | ) { | ||||||
|  | 	return schema.pick(Object.fromEntries(keys.map((key) => [key, true]))) as ZodObjectPick<S, K> | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -43,30 +54,44 @@ export function pick<S extends AnyZodObject, K extends ZodRecordKeys<S>[]>(schem | |||||||
|  * @param shape - The shape of the expansion |  * @param shape - The shape of the expansion | ||||||
|  * @returns A new schema with only the given keys |  * @returns A new schema with only the given keys | ||||||
|  */ |  */ | ||||||
| export function select<S extends AnyZodObject, K extends ZodRecordKeys<S>[], E extends ZodRawShape>( | export function select< | ||||||
|   schema: S, | 	S extends ZodObject<any, any>, | ||||||
|   keys: K, | 	K extends ZodRecordKeys<S>[], | ||||||
|   shape: E, | 	E extends ZodRawShape, | ||||||
| ): ZodObjectExpand<ZodObjectPick<S, K>, E>; | >(schema: S, keys: K, shape: E): ZodObjectExpand<ZodObjectPick<S, K>, E> | ||||||
| export function select<S extends AnyZodObject, K extends ZodRecordKeys<S>[]>(schema: S, keys: K): ZodObjectPick<S, K>; | export function select<S extends ZodObject<any, any>, K extends ZodRecordKeys<S>[]>( | ||||||
| export function select<S extends AnyZodObject, K extends ZodRecordKeys<S>[], E extends ZodRawShape | undefined>( | 	schema: S, | ||||||
|   schema: S, | 	keys: K, | ||||||
|   keys: K, | ): ZodObjectPick<S, K> | ||||||
|   shape?: E, | export function select< | ||||||
| ) { | 	S extends ZodObject<any, any>, | ||||||
|   return shape ? expand(pick(schema, keys), shape) : pick(schema, keys); | 	K extends ZodRecordKeys<S>[], | ||||||
|  | 	E extends ZodRawShape | undefined, | ||||||
|  | >(schema: S, keys: K, shape?: E) { | ||||||
|  | 	return shape ? expand(pick(schema, keys), shape) : pick(schema, keys) | ||||||
| } | } | ||||||
|  |  | ||||||
| export type ZodObjectExpand<S extends AnyZodObject, E extends ZodRawShape> = | export type ZodObjectExpand< | ||||||
|   S extends ZodObject<infer T, infer U, infer C> | 	S extends ZodObject<any, any>, | ||||||
|     ? ZodEffects< | 	E extends ZodRawShape, | ||||||
|         ZodObject<objectUtil.extendShape<T, { expand: HasRequiredKeys<E> extends true ? ZodObject<E> : ZodOptional<ZodObject<E>> }>, U, C>, | > = S extends ZodObject<infer T, infer U> | ||||||
|         ZodObject<objectUtil.extendShape<T, E>, U, C>["_output"] | 	? z.ZodPipe< | ||||||
|       > | 			ZodObject< | ||||||
|     : never; | 				T & { | ||||||
|  | 					expand: HasRequiredKeys<E> extends true ? ZodObject<E> : ZodOptional<ZodObject<E>> | ||||||
|  | 				}, | ||||||
|  | 				U | ||||||
|  | 			>, | ||||||
|  | 			z.ZodTransform<T & E> | ||||||
|  | 		> | ||||||
|  | 	: never | ||||||
|  |  | ||||||
| export type ZodObjectPick<S extends AnyZodObject, K extends ZodRecordKeys<S>[]> = | export type ZodObjectPick< | ||||||
|   S extends ZodObject<infer T, infer U, infer C> ? ZodObject<Pick<T, K[number]>, U, C> : never; | 	S extends ZodObject<any, any>, | ||||||
|  | 	K extends ZodRecordKeys<S>[], | ||||||
|  | > = S extends ZodObject<infer T, infer U> ? ZodObject<Pick<T, K[number]>, U> : never | ||||||
|  |  | ||||||
| export type AnyRecordsList = z.infer<typeof AnyRecordsList>; | export type AnyRecordsList = z.infer<typeof AnyRecordsList> | ||||||
| export type RecordsList<S extends AnyZodRecord> = Omit<AnyRecordsList, "items"> & { items: S["_output"][] }; | export type RecordsList<S extends ZodObject<any, any>> = Omit<AnyRecordsList, 'items'> & { | ||||||
|  | 	items: S['_output'][] | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								src/sdk.ts
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								src/sdk.ts
									
									
									
									
									
								
							| @@ -1,13 +1,13 @@ | |||||||
| import Pocketbase from "pocketbase"; | import Pocketbase from 'pocketbase' | ||||||
| import type { Credentials } from "@/config.ts"; | import type { Credentials } from '@/config.ts' | ||||||
|  |  | ||||||
| let adminPocketbase: Pocketbase; | let adminPocketbase: Pocketbase | ||||||
|  |  | ||||||
| export async function getPocketbase({ adminEmail, adminPassword, url }: Credentials) { | export async function getPocketbase({ adminEmail, adminPassword, url }: Credentials) { | ||||||
|   if (!adminPocketbase) { | 	if (!adminPocketbase) { | ||||||
|     const pocketbase = new Pocketbase(url); | 		const pocketbase = new Pocketbase(url) | ||||||
|     await pocketbase.collection("_superusers").authWithPassword(adminEmail, adminPassword); | 		await pocketbase.collection('_superusers').authWithPassword(adminEmail, adminPassword) | ||||||
|     adminPocketbase = pocketbase; | 		adminPocketbase = pocketbase | ||||||
|   } | 	} | ||||||
|   return adminPocketbase; | 	return adminPocketbase | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,92 +1,125 @@ | |||||||
| #!/usr/bin/env bun | #!/usr/bin/env bun | ||||||
|  |  | ||||||
| import { Config } from "@/config.ts"; | import { existsSync } from 'node:fs' | ||||||
| import type { ResolvedConfig } from "@/config.ts"; | import { | ||||||
| import pkg from "../../package.json" with { type: "json" }; | 	cancel, | ||||||
| import { loadConfig } from "c12"; | 	confirm, | ||||||
| import { defineCommand, runMain } from "citty"; | 	group, | ||||||
| import { cancel, group, intro, log, outro, confirm, text, spinner, multiselect, isCancel } from "@clack/prompts"; | 	intro, | ||||||
| import { fetchCollections } from "@/utils.ts"; | 	isCancel, | ||||||
| import { generate } from "@/server/utils.ts"; | 	log, | ||||||
| import { existsSync } from "node:fs"; | 	multiselect, | ||||||
|  | 	outro, | ||||||
|  | 	spinner, | ||||||
|  | 	text, | ||||||
|  | } from '@clack/prompts' | ||||||
|  | import { loadConfig } from 'c12' | ||||||
|  | import { defineCommand, runMain } from 'citty' | ||||||
|  | import type { ResolvedConfig } from '@/config.ts' | ||||||
|  | import { Config } from '@/config.ts' | ||||||
|  | import { generate } from '@/server/utils.ts' | ||||||
|  | import { fetchCollections } from '@/utils.ts' | ||||||
|  | import pkg from '%/package.json' with { type: 'json' } | ||||||
|  |  | ||||||
| async function getConfig() { | async function getConfig() { | ||||||
|   const { config } = await loadConfig({ name: "zod-pocketbase-continue", rcFile: false, dotenv: true }); | 	const { config } = await loadConfig({ | ||||||
|   const { ZOD_POCKETBASE_ADMIN_EMAIL: adminEmail, ZOD_POCKETBASE_ADMIN_PASSWORD: adminPassword, ZOD_POCKETBASE_URL: url } = process.env; | 		name: 'zod-pocketbase', | ||||||
|   const result = Config.safeParse({ ...config, adminEmail, adminPassword, url }); | 		rcFile: false, | ||||||
|   if (!result.success) { | 		dotenv: true, | ||||||
|     log.error("Invalid fields in your config file."); | 	}) | ||||||
|     onCancel(); | 	const { | ||||||
|   } | 		ZOD_POCKETBASE_ADMIN_EMAIL: adminEmail, | ||||||
|   return result.data!; | 		ZOD_POCKETBASE_ADMIN_PASSWORD: adminPassword, | ||||||
|  | 		ZOD_POCKETBASE_URL: url, | ||||||
|  | 	} = process.env | ||||||
|  | 	const result = Config.safeParse({ ...config, adminEmail, adminPassword, url }) | ||||||
|  | 	if (!result.success) { | ||||||
|  | 		log.error('Invalid fields in your config file.') | ||||||
|  | 		onCancel() | ||||||
|  | 	} | ||||||
|  | 	return result.data! | ||||||
| } | } | ||||||
|  |  | ||||||
| function onCancel() { | function onCancel() { | ||||||
|   cancel("Operation cancelled."); | 	cancel('Operation cancelled.') | ||||||
|   process.exit(0); | 	process.exit(0) | ||||||
| } | } | ||||||
|  |  | ||||||
| async function selectCollections(config: ResolvedConfig) { | async function selectCollections(config: ResolvedConfig) { | ||||||
|   const credentialPrompts = { | 	const credentialPrompts = { | ||||||
|     url: () => text({ message: "What is the url of your pocketbase instance?", initialValue: config.url ?? "" }), | 		url: () => | ||||||
|     adminEmail: () => text({ message: "What is your admin's email?", initialValue: config.adminEmail ?? "" }), | 			text({ | ||||||
|     adminPassword: () => text({ message: "What is your admin's password?", initialValue: config.adminPassword ?? "" }), | 				message: 'What is the url of your pocketbase instance?', | ||||||
|   }; | 				initialValue: config.url ?? '', | ||||||
|   const credentials = await group(credentialPrompts, { onCancel }); | 			}), | ||||||
|   const s = spinner(); | 		adminEmail: () => | ||||||
|   s.start("Fetching collections..."); | 			text({ message: "What is your admin's email?", initialValue: config.adminEmail ?? '' }), | ||||||
|   try { | 		adminPassword: () => | ||||||
|     const allCollections = await fetchCollections(credentials); | 			text({ message: "What is your admin's password?", initialValue: config.adminPassword ?? '' }), | ||||||
|     s.stop("Successfully fetched collections."); | 	} | ||||||
|     const collectionNames = await multiselect({ | 	const credentials = await group(credentialPrompts, { onCancel }) | ||||||
|       message: "What collections do you want to generate schemas for?", | 	const s = spinner() | ||||||
|       options: allCollections.map(({ name: value }) => ({ value })), | 	s.start('Fetching collections...') | ||||||
|       initialValues: allCollections.filter(({ name }) => !config.ignore.includes(name)).map(({ name }) => name), | 	try { | ||||||
|     }); | 		const allCollections = await fetchCollections(credentials) | ||||||
|     if (isCancel(collectionNames)) onCancel(); | 		s.stop('Successfully fetched collections.') | ||||||
|     return allCollections.filter(({ name }) => (collectionNames as string[]).includes(name)); | 		const collectionNames = await multiselect({ | ||||||
|   } catch { | 			message: 'What collections do you want to generate schemas for?', | ||||||
|     s.stop("Failed to fetch collections.Please check your credentials and try again."); | 			options: allCollections.map(({ name: value }) => ({ value })), | ||||||
|     return selectCollections(config); | 			initialValues: allCollections | ||||||
|   } | 				.filter(({ name }) => !config.ignore.includes(name)) | ||||||
|  | 				.map(({ name }) => name), | ||||||
|  | 		}) | ||||||
|  | 		if (isCancel(collectionNames)) onCancel() | ||||||
|  | 		return allCollections.filter(({ name }) => (collectionNames as string[]).includes(name)) | ||||||
|  | 	} catch { | ||||||
|  | 		s.stop('Failed to fetch collections.Please check your credentials and try again.') | ||||||
|  | 		return selectCollections(config) | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| async function setGeneratedFilePath(config: ResolvedConfig) { | async function setGeneratedFilePath(config: ResolvedConfig) { | ||||||
|   const output = await text({ | 	const output = await text({ | ||||||
|     message: "What is the generated file path?", | 		message: 'What is the generated file path?', | ||||||
|     initialValue: config.output, | 		initialValue: config.output, | ||||||
|     validate: (value) => { | 		validate: (value) => { | ||||||
|       if (!value) return "Please enter a path."; | 			if (!value) return 'Please enter a path.' | ||||||
|       if (value[0] !== ".") return "Please enter a relative path."; | 			if (value[0] !== '.') return 'Please enter a relative path.' | ||||||
|       return; | 			return | ||||||
|     }, | 		}, | ||||||
|   }); | 	}) | ||||||
|   if (isCancel(output)) onCancel(); | 	if (isCancel(output)) onCancel() | ||||||
|  |  | ||||||
|   if (existsSync(output as string)) { | 	if (existsSync(output as string)) { | ||||||
|     const confirmed = await confirm({ message: "The file already exists, would you like to overwrite it?" }); | 		const confirmed = await confirm({ | ||||||
|     if (isCancel(confirmed)) onCancel(); | 			message: 'The file already exists, would you like to overwrite it?', | ||||||
|     if (!confirmed) return setGeneratedFilePath(config); | 		}) | ||||||
|   } | 		if (isCancel(confirmed)) onCancel() | ||||||
|  | 		if (!confirmed) return setGeneratedFilePath(config) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|   return output as string; | 	return output as string | ||||||
| } | } | ||||||
|  |  | ||||||
| const main = defineCommand({ | const main = defineCommand({ | ||||||
|   meta: { name: "zod-pocketbase-continue", version: pkg.version, description: "Generate Zod schemas for your pocketbase instance." }, | 	meta: { | ||||||
|   run: async () => { | 		name: 'zod-pocketbase-continue', | ||||||
|     intro(`ZOD POCKETBASE`); | 		version: pkg.version, | ||||||
|     const config = await getConfig(); | 		description: 'Generate Zod schemas for your pocketbase instance.', | ||||||
|     const collections = await selectCollections(config); | 	}, | ||||||
|     const output = await setGeneratedFilePath(config); | 	run: async () => { | ||||||
|  | 		intro(`ZOD POCKETBASE`) | ||||||
|  | 		const config = await getConfig() | ||||||
|  | 		const collections = await selectCollections(config) | ||||||
|  | 		const output = await setGeneratedFilePath(config) | ||||||
|  |  | ||||||
|     const s = spinner(); | 		const s = spinner() | ||||||
|     s.start("Generating your schemas..."); | 		s.start('Generating your schemas...') | ||||||
|     await generate(collections, { ...config, output }); | 		await generate(collections, { ...config, output }) | ||||||
|     s.stop("Schemas successfully generated."); | 		s.stop('Schemas successfully generated.') | ||||||
|  |  | ||||||
|     outro("Operation completed."); | 		outro('Operation completed.') | ||||||
|   }, | 	}, | ||||||
| }); | }) | ||||||
|  |  | ||||||
| runMain(main); | runMain(main) | ||||||
|   | |||||||
| @@ -1 +1 @@ | |||||||
| export * from "./utils.js"; | export * from '@/server/utils.js' | ||||||
|   | |||||||
| @@ -1,19 +1,22 @@ | |||||||
| import { mkdirSync, readFileSync, writeFileSync } from "node:fs"; | import { mkdirSync, readFileSync, writeFileSync } from 'node:fs' | ||||||
| import { dirname, resolve } from "node:path"; | import { dirname, resolve } from 'node:path' | ||||||
| import { fileURLToPath } from "node:url"; | import { fileURLToPath } from 'node:url' | ||||||
| import type { CollectionModel } from "pocketbase"; | import type { CollectionModel } from 'pocketbase' | ||||||
| import { stringifyContent } from "@/content.js"; | import type { ResolvedConfig } from '@/config.ts' | ||||||
| import type { ResolvedConfig } from "@/config.ts"; | import { stringifyContent } from '@/content.js' | ||||||
|  |  | ||||||
| export async function generate(collections: CollectionModel[], opts: GenerateOpts) { | export async function generate(collections: CollectionModel[], opts: GenerateOpts) { | ||||||
|   const stub = readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), "../../assets/stubs/index.ts"), "utf-8"); | 	const stub = readFileSync( | ||||||
|   const { collectionNames, enums, records, services } = stringifyContent(collections, opts); | 		resolve(dirname(fileURLToPath(import.meta.url)), '../../assets/stubs/index.ts'), | ||||||
|   const content = stub | 		'utf-8', | ||||||
|     .replace("@@_COLLECTION_NAMES_@@", collectionNames) | 	) | ||||||
|     .replace("@@_ENUMS_@@", enums) | 	const { collectionNames, enums, records, services } = stringifyContent(collections, opts) | ||||||
|     .replace("@@_RECORDS_@@", records) | 	const content = stub | ||||||
|     .replace("@@_SERVICES_@@", services); | 		.replace('@@_COLLECTION_NAMES_@@', collectionNames) | ||||||
|   mkdirSync(dirname(opts.output), { recursive: true }); | 		.replace('@@_ENUMS_@@', enums) | ||||||
|   writeFileSync(opts.output, content); | 		.replace('@@_RECORDS_@@', records) | ||||||
|  | 		.replace('@@_SERVICES_@@', services) | ||||||
|  | 	mkdirSync(dirname(opts.output), { recursive: true }) | ||||||
|  | 	writeFileSync(opts.output, content) | ||||||
| } | } | ||||||
| export type GenerateOpts = Omit<ResolvedConfig, "adminEmail" | "adminPassword" | "ignore" | "url">; | export type GenerateOpts = Omit<ResolvedConfig, 'adminEmail' | 'adminPassword' | 'ignore' | 'url'> | ||||||
|   | |||||||
							
								
								
									
										48
									
								
								src/types.ts
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								src/types.ts
									
									
									
									
									
								
							| @@ -1,31 +1,33 @@ | |||||||
| import type { AnyZodObject, ZodEffects, ZodOptional, ZodRawShape, ZodTypeAny } from "zod"; | import type { ZodObject, ZodOptional, ZodRawShape, ZodType } from 'zod' | ||||||
|  |  | ||||||
| export type AnyZodRecord = AnyZodObject | ZodEffects<AnyZodObject>; | export type RecordFullListOpts<S extends ZodObject<any, any>> = RecordListOpts<S> & { | ||||||
|  | 	batch?: number | ||||||
|  | } | ||||||
|  |  | ||||||
| export type RecordFullListOpts<S extends AnyZodRecord> = RecordListOpts<S> & { batch?: number }; | export type RecordListOpts<S extends ZodObject<any, any>> = { | ||||||
|  | 	filter?: string | ||||||
|  | 	page?: number | ||||||
|  | 	perPage?: number | ||||||
|  | 	skipTotal?: boolean | ||||||
|  | 	sort?: ZodRecordSort<S> | ||||||
|  | } | ||||||
|  |  | ||||||
| export type RecordListOpts<S extends AnyZodRecord> = { | export type RecordIdRef<C extends string> = { collection: C; id: string } | ||||||
|   filter?: string; | export type RecordSlugRef<C extends string> = { collection: C; slug: string } | ||||||
|   page?: number; | export type RecordRef<C extends string> = RecordIdRef<C> | RecordSlugRef<C> | ||||||
|   perPage?: number; |  | ||||||
|   skipTotal?: boolean; |  | ||||||
|   sort?: ZodRecordSort<S>; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| export type RecordIdRef<C extends string> = { collection: C; id: string }; | export type ZodRecordKeys<S extends ZodObject<any, any>> = Extract<keyof S['_input'], string> | ||||||
| export type RecordSlugRef<C extends string> = { collection: C; slug: string }; |  | ||||||
| export type RecordRef<C extends string> = RecordIdRef<C> | RecordSlugRef<C>; |  | ||||||
|  |  | ||||||
| export type ZodRecordKeys<S extends AnyZodRecord> = Extract<keyof S["_input"], string>; | export type ZodRecordMainKeys<S extends ZodObject<any, any>> = Exclude<ZodRecordKeys<S>, 'expand'> | ||||||
|  |  | ||||||
| export type ZodRecordMainKeys<S extends AnyZodRecord> = Exclude<ZodRecordKeys<S>, "expand">; | export type ZodRecordSort<S extends ZodObject<any, any>> = | ||||||
|  | 	| `${'+' | '-'}${ZodRecordMainKeys<S>}` | ||||||
| export type ZodRecordSort<S extends AnyZodRecord> = `${"+" | "-"}${ZodRecordMainKeys<S>}` | "@random"; | 	| '@random' | ||||||
|  |  | ||||||
| type RequiredKeysOf<S extends ZodRawShape> = Exclude< | type RequiredKeysOf<S extends ZodRawShape> = Exclude< | ||||||
|   { | 	{ | ||||||
|     [Key in keyof S]: S[Key] extends ZodOptional<ZodTypeAny> ? never : Key; | 		[Key in keyof S]: S[Key] extends ZodOptional<ZodType> ? never : Key | ||||||
|   }[keyof S], | 	}[keyof S], | ||||||
|   undefined | 	undefined | ||||||
| >; | > | ||||||
| export type HasRequiredKeys<S extends ZodRawShape> = RequiredKeysOf<S> extends never ? false : true; | export type HasRequiredKeys<S extends ZodRawShape> = RequiredKeysOf<S> extends never ? false : true | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								src/utils.ts
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								src/utils.ts
									
									
									
									
									
								
							| @@ -1,10 +1,10 @@ | |||||||
| import { sortBy } from "es-toolkit"; | import { sortBy } from 'es-toolkit' | ||||||
| import type { CollectionModel } from "pocketbase"; | import type { CollectionModel } from 'pocketbase' | ||||||
| import { getPocketbase } from "@/sdk.js"; | import type { Credentials } from '@/config.ts' | ||||||
| import type { Credentials } from "@/config.ts"; | import { getPocketbase } from '@/sdk.js' | ||||||
|  |  | ||||||
| export async function fetchCollections(credentials: Credentials): Promise<CollectionModel[]> { | export async function fetchCollections(credentials: Credentials): Promise<CollectionModel[]> { | ||||||
|   const pocketbase = await getPocketbase(credentials); | 	const pocketbase = await getPocketbase(credentials) | ||||||
|   const collections = await pocketbase.collections.getFullList(); | 	const collections = await pocketbase.collections.getFullList() | ||||||
|   return sortBy(collections, ["name"]); | 	return sortBy(collections, ['name']) | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										109
									
								
								tsconfig.json
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								tsconfig.json
									
									
									
									
									
								
							| @@ -1,56 +1,57 @@ | |||||||
| { | { | ||||||
|   "$schema": "https://json.schemastore.org/tsconfig", | 	"$schema": "https://json.schemastore.org/tsconfig", | ||||||
|   "compilerOptions": { | 	"compilerOptions": { | ||||||
|     // Enable top-level await, and other modern ESM features. | 		// Enable top-level await, and other modern ESM features. | ||||||
|     "target": "ESNext", | 		"target": "ESNext", | ||||||
|     "module": "NodeNext", | 		"module": "NodeNext", | ||||||
|     // Enable module resolution without file extensions on relative paths, for things like npm package imports. | 		// Enable module resolution without file extensions on relative paths, for things like npm package imports. | ||||||
|     "moduleResolution": "nodenext", | 		"moduleResolution": "nodenext", | ||||||
|     // Allow importing TypeScript files using their native extension (.ts(x)). | 		// Allow importing TypeScript files using their native extension (.ts(x)). | ||||||
|     "allowImportingTsExtensions": true, | 		"allowImportingTsExtensions": true, | ||||||
|     // Enable JSON imports. | 		// Enable JSON imports. | ||||||
|     "resolveJsonModule": true, | 		"resolveJsonModule": true, | ||||||
|     // Enforce the usage of type-only imports when needed, which helps avoiding bundling issues. | 		// Enforce the usage of type-only imports when needed, which helps avoiding bundling issues. | ||||||
|     "verbatimModuleSyntax": true, | 		"verbatimModuleSyntax": true, | ||||||
|     // Ensure that each file can be transpiled without relying on other imports. | 		// Ensure that each file can be transpiled without relying on other imports. | ||||||
|     // This is redundant with the previous option, however it ensures that it's on even if someone disable `verbatimModuleSyntax` | 		// This is redundant with the previous option, however it ensures that it's on even if someone disable `verbatimModuleSyntax` | ||||||
|     "isolatedModules": true, | 		"isolatedModules": true, | ||||||
|     // Astro directly run TypeScript code, no transpilation needed. | 		// Astro directly run TypeScript code, no transpilation needed. | ||||||
|     "noEmit": true, | 		"noEmit": true, | ||||||
|     // Report an error when importing a file using a casing different from another import of the same file. | 		// Report an error when importing a file using a casing different from another import of the same file. | ||||||
|     "forceConsistentCasingInFileNames": true, | 		"forceConsistentCasingInFileNames": true, | ||||||
|     // Properly support importing CJS modules in ESM | 		// Properly support importing CJS modules in ESM | ||||||
|     "esModuleInterop": true, | 		"esModuleInterop": true, | ||||||
|     // Skip typechecking libraries and .d.ts files | 		// Skip typechecking libraries and .d.ts files | ||||||
|     "skipLibCheck": true, | 		"skipLibCheck": true, | ||||||
|     // Allow JavaScript files to be imported | 		// Allow JavaScript files to be imported | ||||||
|     "allowJs": true, | 		"allowJs": true, | ||||||
|     // Allow JSX files (or files that are internally considered JSX, like Astro files) to be imported inside `.js` and `.ts` files. | 		// Allow JSX files (or files that are internally considered JSX, like Astro files) to be imported inside `.js` and `.ts` files. | ||||||
|     "jsx": "preserve", | 		"jsx": "preserve", | ||||||
|     // Enable strict mode. This enables a few options at a time, see https://www.typescriptlang.org/tsconfig#strict for a list. | 		// Enable strict mode. This enables a few options at a time, see https://www.typescriptlang.org/tsconfig#strict for a list. | ||||||
|     "strict": true, | 		"strict": true, | ||||||
|     // Report errors for fallthrough cases in switch statements | 		// Report errors for fallthrough cases in switch statements | ||||||
|     "noFallthroughCasesInSwitch": true, | 		"noFallthroughCasesInSwitch": true, | ||||||
|     // Force functions designed to override their parent class to be specified as `override`. | 		// Force functions designed to override their parent class to be specified as `override`. | ||||||
|     "noImplicitOverride": true, | 		"noImplicitOverride": true, | ||||||
|     // Force functions to specify that they can return `undefined` if a possible code path does not return a value. | 		// Force functions to specify that they can return `undefined` if a possible code path does not return a value. | ||||||
|     "noImplicitReturns": true, | 		"noImplicitReturns": true, | ||||||
|     // Report an error when a variable is declared but never used. | 		// Report an error when a variable is declared but never used. | ||||||
|     "noUnusedLocals": true, | 		"noUnusedLocals": true, | ||||||
|     // Report an error when a parameter is declared but never used. | 		// Report an error when a parameter is declared but never used. | ||||||
|     "noUnusedParameters": true, | 		"noUnusedParameters": true, | ||||||
|     // Force the usage of the indexed syntax to access fields declared using an index signature. | 		// Force the usage of the indexed syntax to access fields declared using an index signature. | ||||||
|     "noUncheckedIndexedAccess": true, | 		"noUncheckedIndexedAccess": true, | ||||||
|     // Report an error when the value `undefined` is given to an optional property that doesn't specify `undefined` as a valid value. | 		// Report an error when the value `undefined` is given to an optional property that doesn't specify `undefined` as a valid value. | ||||||
|     "exactOptionalPropertyTypes": true, | 		"exactOptionalPropertyTypes": true, | ||||||
|     // Report an error for unreachable code instead of just a warning. | 		// Report an error for unreachable code instead of just a warning. | ||||||
|     "allowUnreachableCode": false, | 		"allowUnreachableCode": false, | ||||||
|     // Report an error for unused labels instead of just a warning. | 		// Report an error for unused labels instead of just a warning. | ||||||
|     "allowUnusedLabels": false, | 		"allowUnusedLabels": false, | ||||||
|     "baseUrl": ".", | 		"baseUrl": ".", | ||||||
|     "paths": { | 		"paths": { | ||||||
|       "@/*": ["./src/*"] | 			"@/*": ["./src/*"], | ||||||
|     } | 			"%/*": ["./*"] | ||||||
|   }, | 		} | ||||||
|   "exclude": ["dist", "assets/stubs"] | 	}, | ||||||
|  | 	"exclude": ["dist", "assets/stubs"] | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,19 +1,19 @@ | |||||||
| import { defineConfig } from "tsdown"; | import { defineConfig } from 'tsdown' | ||||||
| import packageJson from "./package.json" with { type: "json" }; | import packageJson from '%/package.json' with { type: 'json' } | ||||||
|  |  | ||||||
| export default defineConfig((options) => { | export default defineConfig((options) => { | ||||||
|   const dev = !!options.watch; | 	const dev = !!options.watch | ||||||
|   return { | 	return { | ||||||
|     entry: ["src/**/*.(ts|js)"], | 		entry: ['src/**/*.(ts|js)'], | ||||||
|     format: ["esm"], | 		format: ['esm'], | ||||||
|     target: "node24", | 		target: 'node24', | ||||||
|     unbundle: true, | 		unbundle: true, | ||||||
|     dts: true, | 		dts: true, | ||||||
|     sourcemap: true, | 		sourcemap: true, | ||||||
|     clean: true, | 		clean: true, | ||||||
|     splitting: false, | 		splitting: false, | ||||||
|     minify: !dev, | 		minify: !dev, | ||||||
|     external: [...Object.keys(packageJson.peerDependencies), "dotenv"], | 		external: [...Object.keys(packageJson.peerDependencies), 'dotenv'], | ||||||
|     tsconfig: "tsconfig.json", | 		tsconfig: 'tsconfig.json', | ||||||
|   }; | 	} | ||||||
| }); | }) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user