code for search in github

This commit is contained in:
Raduan77
2024-11-28 09:51:03 +01:00
parent 77e22c5c3e
commit 4ac78a996c
3 changed files with 639 additions and 272 deletions

View File

@@ -1,10 +1,10 @@
import { z } from 'zod';
import { z } from "zod";
// Base schemas for common types
export const GitHubAuthorSchema = z.object({
name: z.string(),
email: z.string(),
date: z.string()
date: z.string(),
});
// Repository related schemas
@@ -15,7 +15,7 @@ export const GitHubOwnerSchema = z.object({
avatar_url: z.string(),
url: z.string(),
html_url: z.string(),
type: z.string()
type: z.string(),
});
export const GitHubRepositorySchema = z.object({
@@ -35,7 +35,7 @@ export const GitHubRepositorySchema = z.object({
git_url: z.string(),
ssh_url: z.string(),
clone_url: z.string(),
default_branch: z.string()
default_branch: z.string(),
});
// File content schemas
@@ -50,7 +50,7 @@ export const GitHubFileContentSchema = z.object({
url: z.string(),
git_url: z.string(),
html_url: z.string(),
download_url: z.string()
download_url: z.string(),
});
export const GitHubDirectoryContentSchema = z.object({
@@ -62,35 +62,35 @@ export const GitHubDirectoryContentSchema = z.object({
url: z.string(),
git_url: z.string(),
html_url: z.string(),
download_url: z.string().nullable()
download_url: z.string().nullable(),
});
export const GitHubContentSchema = z.union([
GitHubFileContentSchema,
z.array(GitHubDirectoryContentSchema)
z.array(GitHubDirectoryContentSchema),
]);
// Operation schemas
export const FileOperationSchema = z.object({
path: z.string(),
content: z.string()
content: z.string(),
});
// Tree and commit schemas
export const GitHubTreeEntrySchema = z.object({
path: z.string(),
mode: z.enum(['100644', '100755', '040000', '160000', '120000']),
type: z.enum(['blob', 'tree', 'commit']),
mode: z.enum(["100644", "100755", "040000", "160000", "120000"]),
type: z.enum(["blob", "tree", "commit"]),
size: z.number().optional(),
sha: z.string(),
url: z.string()
url: z.string(),
});
export const GitHubTreeSchema = z.object({
sha: z.string(),
url: z.string(),
tree: z.array(GitHubTreeEntrySchema),
truncated: z.boolean()
truncated: z.boolean(),
});
export const GitHubCommitSchema = z.object({
@@ -102,12 +102,14 @@ export const GitHubCommitSchema = z.object({
message: z.string(),
tree: z.object({
sha: z.string(),
url: z.string()
url: z.string(),
}),
parents: z.array(z.object({
sha: z.string(),
url: z.string()
}))
parents: z.array(
z.object({
sha: z.string(),
url: z.string(),
})
),
});
// Reference schema
@@ -118,8 +120,8 @@ export const GitHubReferenceSchema = z.object({
object: z.object({
sha: z.string(),
type: z.string(),
url: z.string()
})
url: z.string(),
}),
});
// Input schemas for operations
@@ -127,7 +129,7 @@ export const CreateRepositoryOptionsSchema = z.object({
name: z.string(),
description: z.string().optional(),
private: z.boolean().optional(),
auto_init: z.boolean().optional()
auto_init: z.boolean().optional(),
});
export const CreateIssueOptionsSchema = z.object({
@@ -135,7 +137,7 @@ export const CreateIssueOptionsSchema = z.object({
body: z.string().optional(),
assignees: z.array(z.string()).optional(),
milestone: z.number().optional(),
labels: z.array(z.string()).optional()
labels: z.array(z.string()).optional(),
});
export const CreatePullRequestOptionsSchema = z.object({
@@ -144,12 +146,12 @@ export const CreatePullRequestOptionsSchema = z.object({
head: z.string(),
base: z.string(),
maintainer_can_modify: z.boolean().optional(),
draft: z.boolean().optional()
draft: z.boolean().optional(),
});
export const CreateBranchOptionsSchema = z.object({
ref: z.string(),
sha: z.string()
sha: z.string(),
});
// Response schemas for operations
@@ -164,21 +166,23 @@ export const GitHubCreateUpdateFileResponseSchema = z.object({
committer: GitHubAuthorSchema,
message: z.string(),
tree: z.object({
sha: z.string(),
url: z.string()
}),
parents: z.array(z.object({
sha: z.string(),
url: z.string(),
html_url: z.string()
}))
})
}),
parents: z.array(
z.object({
sha: z.string(),
url: z.string(),
html_url: z.string(),
})
),
}),
});
export const GitHubSearchResponseSchema = z.object({
total_count: z.number(),
incomplete_results: z.boolean(),
items: z.array(GitHubRepositorySchema)
items: z.array(GitHubRepositorySchema),
});
// Fork related schemas
@@ -188,14 +192,14 @@ export const GitHubForkParentSchema = z.object({
owner: z.object({
login: z.string(),
id: z.number(),
avatar_url: z.string()
avatar_url: z.string(),
}),
html_url: z.string()
html_url: z.string(),
});
export const GitHubForkSchema = GitHubRepositorySchema.extend({
parent: GitHubForkParentSchema,
source: GitHubForkParentSchema
source: GitHubForkParentSchema,
});
// Issue related schemas
@@ -206,7 +210,7 @@ export const GitHubLabelSchema = z.object({
name: z.string(),
color: z.string(),
default: z.boolean(),
description: z.string().optional()
description: z.string().optional(),
});
export const GitHubIssueAssigneeSchema = z.object({
@@ -214,7 +218,7 @@ export const GitHubIssueAssigneeSchema = z.object({
id: z.number(),
avatar_url: z.string(),
url: z.string(),
html_url: z.string()
html_url: z.string(),
});
export const GitHubMilestoneSchema = z.object({
@@ -226,7 +230,7 @@ export const GitHubMilestoneSchema = z.object({
number: z.number(),
title: z.string(),
description: z.string(),
state: z.string()
state: z.string(),
});
export const GitHubIssueSchema = z.object({
@@ -251,7 +255,7 @@ export const GitHubIssueSchema = z.object({
created_at: z.string(),
updated_at: z.string(),
closed_at: z.string().nullable(),
body: z.string()
body: z.string(),
});
// Pull Request related schemas
@@ -260,7 +264,7 @@ export const GitHubPullRequestHeadSchema = z.object({
ref: z.string(),
sha: z.string(),
user: GitHubIssueAssigneeSchema,
repo: GitHubRepositorySchema
repo: GitHubRepositorySchema,
});
export const GitHubPullRequestSchema = z.object({
@@ -285,12 +289,12 @@ export const GitHubPullRequestSchema = z.object({
assignee: GitHubIssueAssigneeSchema.nullable(),
assignees: z.array(GitHubIssueAssigneeSchema),
head: GitHubPullRequestHeadSchema,
base: GitHubPullRequestHeadSchema
base: GitHubPullRequestHeadSchema,
});
const RepoParamsSchema = z.object({
owner: z.string().describe("Repository owner (username or organization)"),
repo: z.string().describe("Repository name")
repo: z.string().describe("Repository name"),
});
export const CreateOrUpdateFileSchema = RepoParamsSchema.extend({
@@ -298,81 +302,288 @@ export const CreateOrUpdateFileSchema = RepoParamsSchema.extend({
content: z.string().describe("Content of the file"),
message: z.string().describe("Commit message"),
branch: z.string().describe("Branch to create/update the file in"),
sha: z.string().optional()
.describe("SHA of the file being replaced (required when updating existing files)")
sha: z
.string()
.optional()
.describe(
"SHA of the file being replaced (required when updating existing files)"
),
});
export const SearchRepositoriesSchema = z.object({
query: z.string().describe("Search query (see GitHub search syntax)"),
page: z.number().optional().describe("Page number for pagination (default: 1)"),
perPage: z.number().optional().describe("Number of results per page (default: 30, max: 100)")
page: z
.number()
.optional()
.describe("Page number for pagination (default: 1)"),
perPage: z
.number()
.optional()
.describe("Number of results per page (default: 30, max: 100)"),
});
export const CreateRepositorySchema = z.object({
name: z.string().describe("Repository name"),
description: z.string().optional().describe("Repository description"),
private: z.boolean().optional().describe("Whether the repository should be private"),
autoInit: z.boolean().optional().describe("Initialize with README.md")
private: z
.boolean()
.optional()
.describe("Whether the repository should be private"),
autoInit: z.boolean().optional().describe("Initialize with README.md"),
});
export const GetFileContentsSchema = RepoParamsSchema.extend({
path: z.string().describe("Path to the file or directory"),
branch: z.string().optional().describe("Branch to get contents from")
branch: z.string().optional().describe("Branch to get contents from"),
});
export const PushFilesSchema = RepoParamsSchema.extend({
branch: z.string().describe("Branch to push to (e.g., 'main' or 'master')"),
files: z.array(z.object({
path: z.string().describe("Path where to create the file"),
content: z.string().describe("Content of the file")
})).describe("Array of files to push"),
message: z.string().describe("Commit message")
files: z
.array(
z.object({
path: z.string().describe("Path where to create the file"),
content: z.string().describe("Content of the file"),
})
)
.describe("Array of files to push"),
message: z.string().describe("Commit message"),
});
export const CreateIssueSchema = RepoParamsSchema.extend({
title: z.string().describe("Issue title"),
body: z.string().optional().describe("Issue body/description"),
assignees: z.array(z.string()).optional().describe("Array of usernames to assign"),
assignees: z
.array(z.string())
.optional()
.describe("Array of usernames to assign"),
labels: z.array(z.string()).optional().describe("Array of label names"),
milestone: z.number().optional().describe("Milestone number to assign")
milestone: z.number().optional().describe("Milestone number to assign"),
});
export const CreatePullRequestSchema = RepoParamsSchema.extend({
title: z.string().describe("Pull request title"),
body: z.string().optional().describe("Pull request body/description"),
head: z.string().describe("The name of the branch where your changes are implemented"),
base: z.string().describe("The name of the branch you want the changes pulled into"),
draft: z.boolean().optional().describe("Whether to create the pull request as a draft"),
maintainer_can_modify: z.boolean().optional()
.describe("Whether maintainers can modify the pull request")
head: z
.string()
.describe("The name of the branch where your changes are implemented"),
base: z
.string()
.describe("The name of the branch you want the changes pulled into"),
draft: z
.boolean()
.optional()
.describe("Whether to create the pull request as a draft"),
maintainer_can_modify: z
.boolean()
.optional()
.describe("Whether maintainers can modify the pull request"),
});
export const ForkRepositorySchema = RepoParamsSchema.extend({
organization: z.string().optional()
.describe("Optional: organization to fork to (defaults to your personal account)")
organization: z
.string()
.optional()
.describe(
"Optional: organization to fork to (defaults to your personal account)"
),
});
export const CreateBranchSchema = RepoParamsSchema.extend({
branch: z.string().describe("Name for the new branch"),
from_branch: z.string().optional()
.describe("Optional: source branch to create from (defaults to the repository's default branch)")
from_branch: z
.string()
.optional()
.describe(
"Optional: source branch to create from (defaults to the repository's default branch)"
),
});
// Search Response Schemas
export const SearchCodeItemSchema = z.object({
name: z.string(),
path: z.string(),
sha: z.string(),
url: z.string(),
git_url: z.string(),
html_url: z.string(),
repository: GitHubRepositorySchema,
score: z.number(),
});
export const SearchCodeResponseSchema = z.object({
total_count: z.number(),
incomplete_results: z.boolean(),
items: z.array(SearchCodeItemSchema),
});
export const SearchIssueItemSchema = z.object({
url: z.string(),
repository_url: z.string(),
labels_url: z.string(),
comments_url: z.string(),
events_url: z.string(),
html_url: z.string(),
id: z.number(),
node_id: z.string(),
number: z.number(),
title: z.string(),
user: GitHubIssueAssigneeSchema,
labels: z.array(GitHubLabelSchema),
state: z.string(),
locked: z.boolean(),
assignee: GitHubIssueAssigneeSchema.nullable(),
assignees: z.array(GitHubIssueAssigneeSchema),
comments: z.number(),
created_at: z.string(),
updated_at: z.string(),
closed_at: z.string().nullable(),
body: z.string(),
score: z.number(),
pull_request: z
.object({
url: z.string(),
html_url: z.string(),
diff_url: z.string(),
patch_url: z.string(),
})
.optional(),
});
export const SearchIssuesResponseSchema = z.object({
total_count: z.number(),
incomplete_results: z.boolean(),
items: z.array(SearchIssueItemSchema),
});
export const SearchUserItemSchema = z.object({
login: z.string(),
id: z.number(),
node_id: z.string(),
avatar_url: z.string(),
gravatar_id: z.string(),
url: z.string(),
html_url: z.string(),
followers_url: z.string(),
following_url: z.string(),
gists_url: z.string(),
starred_url: z.string(),
subscriptions_url: z.string(),
organizations_url: z.string(),
repos_url: z.string(),
events_url: z.string(),
received_events_url: z.string(),
type: z.string(),
site_admin: z.boolean(),
score: z.number(),
});
export const SearchUsersResponseSchema = z.object({
total_count: z.number(),
incomplete_results: z.boolean(),
items: z.array(SearchUserItemSchema),
});
// Search Input Schemas
export const SearchCodeSchema = z.object({
q: z.string().describe("Search query (see GitHub code search syntax)"),
sort: z
.enum(["", "indexed"])
.optional()
.describe("Sort field (only 'indexed' is supported)"),
order: z
.enum(["asc", "desc"])
.optional()
.describe("Sort order (asc or desc)"),
per_page: z
.number()
.min(1)
.max(100)
.optional()
.describe("Results per page (max 100)"),
page: z.number().min(1).optional().describe("Page number"),
});
export const SearchIssuesSchema = z.object({
q: z.string().describe("Search query (see GitHub issues search syntax)"),
sort: z
.enum([
"comments",
"reactions",
"reactions-+1",
"reactions--1",
"reactions-smile",
"reactions-thinking_face",
"reactions-heart",
"reactions-tada",
"interactions",
"created",
"updated",
])
.optional()
.describe("Sort field"),
order: z
.enum(["asc", "desc"])
.optional()
.describe("Sort order (asc or desc)"),
per_page: z
.number()
.min(1)
.max(100)
.optional()
.describe("Results per page (max 100)"),
page: z.number().min(1).optional().describe("Page number"),
});
export const SearchUsersSchema = z.object({
q: z.string().describe("Search query (see GitHub users search syntax)"),
sort: z
.enum(["followers", "repositories", "joined"])
.optional()
.describe("Sort field"),
order: z
.enum(["asc", "desc"])
.optional()
.describe("Sort order (asc or desc)"),
per_page: z
.number()
.min(1)
.max(100)
.optional()
.describe("Results per page (max 100)"),
page: z.number().min(1).optional().describe("Page number"),
});
// Export types
export type GitHubAuthor = z.infer<typeof GitHubAuthorSchema>;
export type GitHubFork = z.infer<typeof GitHubForkSchema>;
export type GitHubIssue = z.infer<typeof GitHubIssueSchema>;
export type GitHubPullRequest = z.infer<typeof GitHubPullRequestSchema>;export type GitHubRepository = z.infer<typeof GitHubRepositorySchema>;
export type GitHubPullRequest = z.infer<typeof GitHubPullRequestSchema>;
export type GitHubRepository = z.infer<typeof GitHubRepositorySchema>;
export type GitHubFileContent = z.infer<typeof GitHubFileContentSchema>;
export type GitHubDirectoryContent = z.infer<typeof GitHubDirectoryContentSchema>;
export type GitHubDirectoryContent = z.infer<
typeof GitHubDirectoryContentSchema
>;
export type GitHubContent = z.infer<typeof GitHubContentSchema>;
export type FileOperation = z.infer<typeof FileOperationSchema>;
export type GitHubTree = z.infer<typeof GitHubTreeSchema>;
export type GitHubCommit = z.infer<typeof GitHubCommitSchema>;
export type GitHubReference = z.infer<typeof GitHubReferenceSchema>;
export type CreateRepositoryOptions = z.infer<typeof CreateRepositoryOptionsSchema>;
export type CreateRepositoryOptions = z.infer<
typeof CreateRepositoryOptionsSchema
>;
export type CreateIssueOptions = z.infer<typeof CreateIssueOptionsSchema>;
export type CreatePullRequestOptions = z.infer<typeof CreatePullRequestOptionsSchema>;
export type CreatePullRequestOptions = z.infer<
typeof CreatePullRequestOptionsSchema
>;
export type CreateBranchOptions = z.infer<typeof CreateBranchOptionsSchema>;
export type GitHubCreateUpdateFileResponse = z.infer<typeof GitHubCreateUpdateFileResponseSchema>;
export type GitHubSearchResponse = z.infer<typeof GitHubSearchResponseSchema>;
export type GitHubCreateUpdateFileResponse = z.infer<
typeof GitHubCreateUpdateFileResponseSchema
>;
export type GitHubSearchResponse = z.infer<typeof GitHubSearchResponseSchema>;
export type SearchCodeItem = z.infer<typeof SearchCodeItemSchema>;
export type SearchCodeResponse = z.infer<typeof SearchCodeResponseSchema>;
export type SearchIssueItem = z.infer<typeof SearchIssueItemSchema>;
export type SearchIssuesResponse = z.infer<typeof SearchIssuesResponseSchema>;
export type SearchUserItem = z.infer<typeof SearchUserItemSchema>;
export type SearchUsersResponse = z.infer<typeof SearchUsersResponseSchema>;