chore(nvim): migrate to toml scopes
```json > Ran tool: `chrome_emulate_cpu` feat(nvim): migrate to toml scopes config
This commit is contained in:
1 parent
9cadee2e32
commit
3692eecdd7
18 files changed
+6
-1226
No files matched your search
@@ -0,0 +1,6 @@
|
||||
[scopes]
|
||||
config = ["lua/config"]
|
||||
lua = ["lua"]
|
||||
nvim = ["."]
|
||||
plugins = ["lua/plugins"]
|
||||
templates = ["templates"]
|
||||
File renamed without changes.
@@ -1,177 +0,0 @@
|
||||
# AstroNvim Plugin Structure
|
||||
|
||||
This document describes the complete plugin structure for your AstroNvim configuration.
|
||||
|
||||
## 📁 Directory Structure
|
||||
|
||||
```
|
||||
lua/plugins/
|
||||
├── README.md # Documentation and guide
|
||||
├── astrocore.lua # Core settings, keymaps, autocmds (23KB)
|
||||
├── astrolsp.lua # LSP, formatting, linting (23KB)
|
||||
├── astroui.lua # UI configuration (8.3KB)
|
||||
├── buildtools.lua # Build tools & dev environment (6.5KB)
|
||||
├── bufferline.lua # Buffer/tab management (2.1KB)
|
||||
├── claude.lua # Claude Code integration (1.3KB)
|
||||
├── neotree.lua # File explorer (15KB)
|
||||
├── _template-custom.lua # Template for custom plugins (disabled)
|
||||
├── _template-filetype.lua # Template for filetype plugins (disabled)
|
||||
├── _template-mason.lua # Template for Mason tools (disabled)
|
||||
├── _template-treesitter.lua # Template for Treesitter (disabled)
|
||||
└── _template-ui.lua # Template for UI plugins (disabled)
|
||||
```
|
||||
|
||||
## 🎯 Active Plugin Files
|
||||
|
||||
### Core Configuration (3 files)
|
||||
|
||||
1. **astrocore.lua** - Core AstroNvim functionality
|
||||
- Session management
|
||||
- Root detection (lsp, git)
|
||||
- Features configuration
|
||||
- Options (vim settings)
|
||||
- **Keymappings** (extensive custom bindings)
|
||||
- **UI toggles** (`<leader>u` prefix)
|
||||
|
||||
2. **astrolsp.lua** - Comprehensive LSP & Tooling (CONSOLIDATED)
|
||||
- LSP configurations (Go, TypeScript, Tailwind, HTML, CSS, Protobuf, JSON, YAML, Lua, Volar)
|
||||
- **Formatting** (Conform.nvim with oxfmt, stylua, rustfmt, taplo)
|
||||
- **Linting** (nvim-lint with oxlint, stylelint, markdownlint)
|
||||
- **Treesitter** configuration
|
||||
- **TypeScript tooling** (typescript-tools, autotag)
|
||||
- **Mason** auto-installation
|
||||
- **Package management** (package-info, crates.nvim)
|
||||
- **Diagnostics UI** (Trouble, lsp_lines, nvim-bqf)
|
||||
|
||||
3. **astroui.lua** - UI/UX Configuration
|
||||
- Colorscheme (cyberdream)
|
||||
- Icons
|
||||
- Statusline (Heirline)
|
||||
- Status components
|
||||
|
||||
### Feature Plugin Files (4 files)
|
||||
|
||||
4. **buildtools.lua** - Development Tools
|
||||
- Treesitter (TOML, YAML, JSON parsers)
|
||||
- SchemaStore (JSON/YAML schemas)
|
||||
- Overseer (task runner for bun, vite)
|
||||
- Trouble (diagnostics)
|
||||
- Gitsigns (git integration)
|
||||
- EditorConfig
|
||||
- DevContainer support
|
||||
|
||||
5. **bufferline.lua** - Buffer Management
|
||||
- Enhanced bufferline with diagnostics
|
||||
- Custom close handlers
|
||||
- Buffer groups support
|
||||
- Icon integration
|
||||
|
||||
6. **claude.lua** - AI Assistant
|
||||
- Claude Code integration
|
||||
- Git root detection
|
||||
- Custom commands and keybindings
|
||||
- File explorer integration
|
||||
|
||||
7. **neotree.lua** - File Explorer
|
||||
- Dynamic pattern filtering
|
||||
- LSP file operations integration
|
||||
- Snacks.rename integration (NEW)
|
||||
- Custom keybindings for git, terminals, docker
|
||||
- Custom commands (format, mason)
|
||||
|
||||
8. **template.lua** - Code Templates (NEW)
|
||||
- Snacks picker integration
|
||||
- 14 essential templates for Cosmos SDK, Protobuf, and Vite+Cloudflare
|
||||
- Smart variable substitution
|
||||
- Filetype-aware template filtering
|
||||
|
||||
## 📝 Template Files (5 files - disabled by default)
|
||||
|
||||
These files are prefixed with `_template-` and disabled with `if true then return {} end`.
|
||||
Remove the first line to activate them.
|
||||
|
||||
1. **_template-custom.lua** - Examples for adding custom plugins
|
||||
2. **_template-filetype.lua** - Filetype-specific configurations (Markdown, Rust, Python, Go, LaTeX)
|
||||
3. **_template-mason.lua** - Mason tool installer customization
|
||||
4. **_template-treesitter.lua** - Treesitter parser configuration
|
||||
5. **_template-ui.lua** - UI plugins and colorscheme examples
|
||||
|
||||
## ✅ Recent Changes
|
||||
|
||||
### Consolidated Files
|
||||
- ✅ **tsx.lua** → Merged into `astrolsp.lua`
|
||||
- ✅ **linting.lua** → Merged into `astrolsp.lua`
|
||||
|
||||
### Added Features
|
||||
- ✅ Snacks.rename integration in `neotree.lua`
|
||||
- ✅ Snacks.toggle keymaps in `astrocore.lua` (`<leader>u` prefix)
|
||||
- ✅ Proper `---@type LazySpec` annotations on all files
|
||||
- ✅ Comprehensive documentation (README.md)
|
||||
- ✅ Template files for common customizations
|
||||
|
||||
### New Toggle Keybindings (`<leader>u`)
|
||||
- `<leader>ud` - Toggle diagnostics
|
||||
- `<leader>un` - Toggle line numbers
|
||||
- `<leader>ur` - Toggle relative numbers
|
||||
- `<leader>uw` - Toggle line wrap
|
||||
- `<leader>us` - Toggle spelling
|
||||
- `<leader>ui` - Toggle inlay hints
|
||||
- `<leader>ut` - Toggle treesitter
|
||||
- `<leader>uc` - Toggle conceal
|
||||
- `<leader>uI` - Toggle indent guides
|
||||
- `<leader>uz` - Toggle zen mode
|
||||
- `<leader>uZ` - Toggle zoom
|
||||
- `<leader>ua` - Toggle animations
|
||||
- `<leader>uS` - Toggle smooth scroll
|
||||
- `<leader>up` - Toggle profiler
|
||||
- `<leader>uh` - Toggle profiler highlights
|
||||
- `<leader>ux` - Toggle dim inactive
|
||||
- `<leader>uf` - Toggle format on save
|
||||
- `<leader>ul` - Toggle LSP lines
|
||||
|
||||
### Template Keybindings
|
||||
- `<C-a><C-t>` - Open template picker (Snacks integration)
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
All plugin files now include:
|
||||
- ✅ Module documentation headers
|
||||
- ✅ `---@type LazySpec` annotations
|
||||
- ✅ Detailed inline comments
|
||||
- ✅ Proper lazy loading strategies
|
||||
|
||||
## 🎓 Quick Reference
|
||||
|
||||
### Adding a New Plugin
|
||||
1. Create a new `.lua` file in `lua/plugins/`
|
||||
2. Add module documentation and `---@type LazySpec`
|
||||
3. Return a table with plugin specifications
|
||||
4. Configure lazy loading (event, cmd, ft, keys)
|
||||
|
||||
### Modifying Existing Config
|
||||
- Core settings → `astrocore.lua`
|
||||
- LSP/formatting/linting → `astrolsp.lua`
|
||||
- UI/statusline → `astroui.lua`
|
||||
- Keymaps → `astrocore.lua` (mappings section)
|
||||
|
||||
### Template Usage
|
||||
1. Copy a template file (remove `_template-` prefix)
|
||||
2. Remove `if true then return {} end` line
|
||||
3. Customize the configuration
|
||||
4. Save and restart Neovim
|
||||
|
||||
## 🔧 Useful Commands
|
||||
- `:Lazy` - Plugin manager
|
||||
- `:Mason` - LSP/tool installer
|
||||
- `:AstroReload` - Reload config
|
||||
- `:ConformInfo` - Format status
|
||||
- `:FormatToggle` - Toggle format on save
|
||||
- `:LspLinesToggle` - Toggle inline diagnostics
|
||||
- `:checkhealth` - Health check
|
||||
|
||||
## 📖 Resources
|
||||
- [AstroNvim Docs](https://docs.astronvim.com)
|
||||
- [lazy.nvim](https://github.com/folke/lazy.nvim)
|
||||
- [AstroCore](https://github.com/AstroNvim/astrocore)
|
||||
- [AstroLSP](https://github.com/AstroNvim/astrolsp)
|
||||
- [Snacks.nvim](https://github.com/folke/snacks.nvim)
|
||||
@@ -1,451 +0,0 @@
|
||||
# Template.nvim Integration
|
||||
|
||||
Complete code template system integrated with Snacks.nvim picker for rapid development.
|
||||
|
||||
## 🎯 Overview
|
||||
|
||||
Integrated template.nvim with custom Snacks picker for quick code scaffolding across your tech stack:
|
||||
- **Cosmos SDK** (Go) - 4 templates
|
||||
- **Protobuf** - 3 templates
|
||||
- **Vite + Cloudflare + TanStack** - 7 templates
|
||||
|
||||
## ⚡ Quick Start
|
||||
|
||||
### Keybindings
|
||||
- **`<C-a><C-t>`** - Open Snacks template picker (primary)
|
||||
- **`<C-a>t`** - Create a new template file
|
||||
- **`<C-a>T`** - Open Telescope template picker (alternative)
|
||||
|
||||
### Commands
|
||||
- `:TemplateSnacks` - Open Snacks picker for templates
|
||||
- `:TemplateCreate <category/filename> [filetype]` - Create new template
|
||||
- `:TemplateTelescope [type=insert|name=template] [filter_ft=true|false]` - Telescope picker
|
||||
- `:Template <name>` - Use native template.nvim command
|
||||
|
||||
### Usage Flow
|
||||
1. Press `<C-a><C-t>` to open picker
|
||||
2. Templates are filtered by current filetype automatically
|
||||
3. Select template from list
|
||||
4. Enter variable name if prompted
|
||||
5. Template is inserted with cursor at `{{_cursor_}}` position
|
||||
|
||||
## 📦 Installation
|
||||
|
||||
### Plugin Configuration
|
||||
Location: `/home/prad/.config/nvim/lua/plugins/template.lua`
|
||||
|
||||
Features:
|
||||
- ✅ Snacks.nvim picker integration
|
||||
- ✅ Smart variable substitution
|
||||
- ✅ Filetype-aware filtering
|
||||
- ✅ Custom template markers
|
||||
- ✅ Interactive variable prompts
|
||||
|
||||
### Keybindings
|
||||
Location: `/home/prad/.config/nvim/lua/plugins/astrocore.lua`
|
||||
|
||||
```lua
|
||||
["<C-a><C-t>"] = { "<cmd>TemplateSnacks<cr>", desc = "Open template picker" }
|
||||
["<C-a>t"] = { function() vim.fn.feedkeys(":TemplateCreate ") end, desc = "Create new template" }
|
||||
["<C-a>T"] = { "<cmd>TemplateTelescope type=insert<cr>", desc = "Template picker (Telescope)" }
|
||||
```
|
||||
|
||||
## 📁 Template Structure
|
||||
|
||||
```
|
||||
~/.config/nvim/templates/
|
||||
├── README.md # Template documentation
|
||||
├── cosmos/ # Cosmos SDK templates
|
||||
│ ├── keeper.go.tpl # Module keeper
|
||||
│ ├── msg_server.go.tpl # Transaction server
|
||||
│ ├── query_server.go.tpl # Query server
|
||||
│ └── handler.go.tpl # Message handler
|
||||
├── proto/ # Protobuf templates
|
||||
│ ├── message.proto.tpl # Basic message
|
||||
│ ├── tx.proto.tpl # Transaction service
|
||||
│ └── query.proto.tpl # Query service
|
||||
└── vite/ # Vite + Cloudflare templates
|
||||
├── worker.ts.tpl # Cloudflare Worker
|
||||
├── pages-function.ts.tpl # Pages Function
|
||||
├── page.tsx.tpl # TanStack Router page
|
||||
├── component.tsx.tpl # React component
|
||||
├── hook.ts.tpl # Custom hook
|
||||
└── api.ts.tpl # TanStack Query API
|
||||
```
|
||||
|
||||
## 🔧 Template Variables
|
||||
|
||||
### Built-in Variables
|
||||
- `{{_date_}}` → `2025-10-22 10:30:15`
|
||||
- `{{_file_name_}}` → `user_service` (from user_service.go)
|
||||
- `{{_camel_case_file_}}` → `UserService`
|
||||
- `{{_upper_file_}}` → `USER_SERVICE`
|
||||
- `{{_author_}}` → `Prad`
|
||||
- `{{_email_}}` → `prad@sonr.io`
|
||||
- `{{_cursor_}}` → Cursor position after insertion
|
||||
|
||||
### Custom Registered Variables (New!)
|
||||
- `{{_path_}}` → `/full/path/to/current/file.go`
|
||||
- `{{_relative_path_}}` → `src/services/file.go`
|
||||
- `{{_dir_}}` → `/full/path/to/current`
|
||||
- `{{_project_}}` → `nvim` (current directory name)
|
||||
|
||||
### Interactive Variables
|
||||
- `{{_variable_}}` → Prompts for custom input
|
||||
- `{{_lua:<expr>_}}` → Execute Lua code
|
||||
|
||||
### Example
|
||||
```go
|
||||
// Template content
|
||||
func New{{_camel_case_file_}}(id string) *{{_variable_}} {
|
||||
{{_cursor_}}
|
||||
}
|
||||
|
||||
// After insertion (file: user_service.go, variable: UserData)
|
||||
func NewUserService(id string) *UserData {
|
||||
| // cursor here
|
||||
}
|
||||
```
|
||||
|
||||
## 📚 Template Reference
|
||||
|
||||
### Cosmos SDK Templates
|
||||
|
||||
#### keeper.go.tpl
|
||||
**Purpose:** Module keeper with state management
|
||||
**Variables:** Module name from filename
|
||||
**Use case:** Starting new Cosmos SDK module
|
||||
|
||||
```go
|
||||
// Creates:
|
||||
type Keeper struct {
|
||||
storeKey sdk.StoreKey
|
||||
cdc codec.BinaryCodec
|
||||
paramstore paramtypes.Subspace
|
||||
}
|
||||
```
|
||||
|
||||
#### msg_server.go.tpl
|
||||
**Purpose:** Transaction message handler
|
||||
**Variables:** Message type name (prompted)
|
||||
**Use case:** Adding new transaction types
|
||||
|
||||
```go
|
||||
// Prompts for: CreatePost
|
||||
// Creates: Msg server with CreatePost handler
|
||||
func (k msgServer) CreatePost(ctx, msg) (*MsgCreatePostResponse, error)
|
||||
```
|
||||
|
||||
#### query_server.go.tpl
|
||||
**Purpose:** Query handler implementation
|
||||
**Variables:** Query method name (prompted)
|
||||
**Use case:** Adding module queries
|
||||
|
||||
```go
|
||||
// Prompts for: GetPost
|
||||
// Creates: Query handler for GetPost
|
||||
func (k queryServer) GetPost(ctx, req) (*QueryGetPostResponse, error)
|
||||
```
|
||||
|
||||
#### handler.go.tpl
|
||||
**Purpose:** Message routing handler
|
||||
**Use case:** Module message dispatcher
|
||||
|
||||
### Protobuf Templates
|
||||
|
||||
#### message.proto.tpl
|
||||
**Purpose:** Basic protobuf message
|
||||
**Variables:** Message name (prompted)
|
||||
**Use case:** Data structures
|
||||
|
||||
```protobuf
|
||||
// Prompts for: Post
|
||||
// Creates:
|
||||
message Post {
|
||||
option (gogoproto.equal) = true;
|
||||
// fields here
|
||||
}
|
||||
```
|
||||
|
||||
#### tx.proto.tpl
|
||||
**Purpose:** Transaction service definition
|
||||
**Variables:** Method name (prompted)
|
||||
**Use case:** Transaction RPC methods
|
||||
|
||||
```protobuf
|
||||
// Prompts for: CreatePost
|
||||
// Creates service with CreatePost RPC
|
||||
service Msg {
|
||||
rpc CreatePost(MsgCreatePost) returns (MsgCreatePostResponse);
|
||||
}
|
||||
```
|
||||
|
||||
#### query.proto.tpl
|
||||
**Purpose:** Query service with REST
|
||||
**Variables:** Method name (prompted)
|
||||
**Use case:** gRPC + HTTP queries
|
||||
|
||||
```protobuf
|
||||
// Prompts for: GetPost
|
||||
// Creates query with HTTP annotation
|
||||
rpc GetPost(QueryGetPostRequest) returns (QueryGetPostResponse) {
|
||||
option (google.api.http).get = "/sonr/module/v1/GetPost";
|
||||
}
|
||||
```
|
||||
|
||||
### Vite + Cloudflare Templates
|
||||
|
||||
#### worker.ts.tpl
|
||||
**Purpose:** Cloudflare Worker
|
||||
**Use case:** Edge compute functions
|
||||
|
||||
```typescript
|
||||
// Creates Worker with Env interface
|
||||
export default {
|
||||
async fetch(request, env, ctx): Promise<Response> {
|
||||
// worker logic
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### pages-function.ts.tpl
|
||||
**Purpose:** Cloudflare Pages Function
|
||||
**Use case:** Pages API routes
|
||||
|
||||
```typescript
|
||||
// Creates Pages Function handler
|
||||
export const onRequest: PagesFunction<Env> = async (context) => {
|
||||
const { request, env, params } = context
|
||||
// function logic
|
||||
}
|
||||
```
|
||||
|
||||
#### page.tsx.tpl
|
||||
**Purpose:** TanStack Router page
|
||||
**Use case:** Full page routes
|
||||
|
||||
```tsx
|
||||
// For file: dashboard.tsx
|
||||
// Creates:
|
||||
export const Route = createFileRoute('/dashboard')({
|
||||
component: DashboardPage,
|
||||
})
|
||||
|
||||
function DashboardPage() {
|
||||
// page component
|
||||
}
|
||||
```
|
||||
|
||||
#### component.tsx.tpl
|
||||
**Purpose:** React component
|
||||
**Use case:** Reusable components
|
||||
|
||||
```tsx
|
||||
// For file: user_card.tsx
|
||||
// Creates:
|
||||
interface UserCardProps { }
|
||||
|
||||
export const UserCard = memo<UserCardProps>(({ }) => {
|
||||
return <div></div>
|
||||
})
|
||||
```
|
||||
|
||||
#### hook.ts.tpl
|
||||
**Purpose:** Custom React hook
|
||||
**Use case:** Reusable logic
|
||||
|
||||
```tsx
|
||||
// For file: use_posts.ts
|
||||
// Creates:
|
||||
interface UsePostsOptions { }
|
||||
|
||||
export function usePosts(options?: UsePostsOptions) {
|
||||
const [data, setData] = useState()
|
||||
// hook logic
|
||||
return { data }
|
||||
}
|
||||
```
|
||||
|
||||
#### api.ts.tpl
|
||||
**Purpose:** TanStack Query API client
|
||||
**Use case:** Full API integration
|
||||
|
||||
```typescript
|
||||
// For file: posts.ts
|
||||
// Creates:
|
||||
- Query keys factory
|
||||
- Fetch functions
|
||||
- usePost(id) hook
|
||||
- useCreatePost() mutation hook
|
||||
```
|
||||
|
||||
## 💡 Workflow Examples
|
||||
|
||||
### Example 1: Creating a Cosmos SDK Message Handler
|
||||
|
||||
**Scenario:** Add a CreatePost transaction to your module
|
||||
|
||||
1. **Create file:** `msg_server_create_post.go`
|
||||
2. **Open picker:** `<C-a><C-t>`
|
||||
3. **Select:** `[cosmos] msg_server.go.tpl`
|
||||
4. **Enter variable:** `CreatePost` when prompted
|
||||
5. **Result:**
|
||||
```go
|
||||
func (k msgServer) CreatePost(goCtx context.Context, msg *types.MsgCreatePost) (*types.MsgCreatePostResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(goCtx)
|
||||
|
||||
// Validate message
|
||||
if err := msg.ValidateBasic(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
| // cursor here
|
||||
|
||||
return &types.MsgCreatePostResponse{}, nil
|
||||
}
|
||||
```
|
||||
|
||||
### Example 2: Creating a TanStack Query API
|
||||
|
||||
**Scenario:** Add API client for posts
|
||||
|
||||
1. **Create file:** `posts.ts`
|
||||
2. **Open picker:** `<C-a><C-t>`
|
||||
3. **Select:** `[vite] api.ts.tpl`
|
||||
4. **Result:** Full API client with:
|
||||
- `postsKeys` query key factory
|
||||
- `fetchPost(id)` function
|
||||
- `createPost(data)` function
|
||||
- `usePost(id)` query hook
|
||||
- `useCreatePost()` mutation hook
|
||||
|
||||
### Example 3: Creating a React Page
|
||||
|
||||
**Scenario:** Add a new dashboard page
|
||||
|
||||
1. **Create file:** `dashboard.tsx`
|
||||
2. **Open picker:** `<C-a><C-t>`
|
||||
3. **Select:** `[vite] page.tsx.tpl`
|
||||
4. **Result:**
|
||||
```tsx
|
||||
export const Route = createFileRoute('/dashboard')({
|
||||
component: DashboardPage,
|
||||
})
|
||||
|
||||
function DashboardPage() {
|
||||
| // cursor here
|
||||
|
||||
return (
|
||||
<div className="container mx-auto px-4 py-8">
|
||||
<h1 className="text-3xl font-bold mb-6">Dashboard</h1>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
## 🎨 Customization
|
||||
|
||||
### Adding New Templates
|
||||
|
||||
#### Quick Method (Recommended)
|
||||
1. Press `<C-a>t` to start TemplateCreate command
|
||||
2. Type category and filename: `vite/form.tsx` or `cosmos/store.go`
|
||||
3. Optional: specify filetype as second argument (defaults to current buffer's filetype)
|
||||
4. Template file is created with filetype marker and opens automatically
|
||||
|
||||
Example:
|
||||
```vim
|
||||
:TemplateCreate vite/form.tsx typescriptreact
|
||||
```
|
||||
|
||||
#### Manual Method
|
||||
1. **Create template file** in templates directory:
|
||||
```bash
|
||||
nvim ~/.config/nvim/templates/vite/form.tsx.tpl
|
||||
```
|
||||
|
||||
2. **Add filetype marker** as first line:
|
||||
```tsx
|
||||
;; typescriptreact
|
||||
```
|
||||
|
||||
3. **Write template** with variables:
|
||||
```tsx
|
||||
;; typescriptreact
|
||||
import { useForm } from 'react-hook-form'
|
||||
|
||||
interface {{_camel_case_file_}}FormData {
|
||||
{{_cursor_}}
|
||||
}
|
||||
|
||||
export function {{_camel_case_file_}}Form() {
|
||||
const { register, handleSubmit } = useForm<{{_camel_case_file_}}FormData>()
|
||||
|
||||
return <form></form>
|
||||
}
|
||||
```
|
||||
|
||||
4. **Use template:** `<C-a><C-t>` → select your template
|
||||
|
||||
### Modifying Configuration
|
||||
|
||||
Edit `lua/plugins/template.lua` to change:
|
||||
- Author name and email
|
||||
- Template directory location
|
||||
- Custom variable processors
|
||||
|
||||
#### Adding Custom Variables
|
||||
```lua
|
||||
-- In lua/plugins/template.lua, add after setup:
|
||||
template.register("{{_custom_var_}}", function()
|
||||
return "your value here"
|
||||
end)
|
||||
```
|
||||
|
||||
Example:
|
||||
```lua
|
||||
-- Add project root detection
|
||||
template.register("{{_git_root_}}", function()
|
||||
return vim.fn.systemlist("git rev-parse --show-toplevel")[1]
|
||||
end)
|
||||
```
|
||||
|
||||
## 📊 Template Statistics
|
||||
|
||||
- **Total Templates:** 14
|
||||
- **Cosmos SDK:** 4 templates
|
||||
- **Protobuf:** 3 templates
|
||||
- **Vite/Cloudflare:** 7 templates
|
||||
- **Lines of Code Saved:** ~300-500 per template usage
|
||||
|
||||
## 🚀 Benefits
|
||||
|
||||
1. **Consistency** - All code follows same patterns
|
||||
2. **Speed** - Scaffold in seconds vs minutes
|
||||
3. **Best Practices** - Templates include proper structure
|
||||
4. **Documentation** - Auto-included author/date info
|
||||
5. **Type Safety** - Proper TypeScript/Go types
|
||||
|
||||
## 📖 Resources
|
||||
|
||||
- Template Documentation: `~/.config/nvim/templates/README.md`
|
||||
- Plugin Source: `~/.config/nvim/lua/plugins/template.lua`
|
||||
- [template.nvim GitHub](https://github.com/glepnir/template.nvim)
|
||||
|
||||
## 🔥 Pro Tips
|
||||
|
||||
1. **Filetype Filtering:** Templates auto-filter by current filetype in Snacks picker
|
||||
2. **Variable Naming:** Use descriptive names for `{{_variable_}}` prompts
|
||||
3. **Nested Directories:** Organize templates in subdirectories (shown as `[category] filename`)
|
||||
4. **Custom Markers:** Register your own variables with `template.register()`
|
||||
5. **Lua Expressions:** Use `{{_lua:vim.fn.getcwd()_}}` for dynamic content
|
||||
6. **Quick Template Creation:** Use `<C-a>t` to quickly create new templates with auto-completion
|
||||
7. **Telescope Alternative:** Use `<C-a>T` for Telescope picker with Snacks backend
|
||||
8. **Path Variables:** Use new `{{_path_}}`, `{{_relative_path_}}`, `{{_dir_}}`, `{{_project_}}` variables
|
||||
|
||||
---
|
||||
|
||||
**Integrated by:** Prad
|
||||
**Date:** 2025-10-22
|
||||
**Total Integration Time:** ~30 minutes
|
||||
**Templates Created:** 14
|
||||
@@ -1,207 +0,0 @@
|
||||
# Code Templates
|
||||
|
||||
Essential templates for modern development with Cosmos SDK, Protobuf, and Vite+Cloudflare.
|
||||
|
||||
## 🚀 Usage
|
||||
|
||||
### Quick Access
|
||||
- **`<C-a><C-t>`** - Open Snacks template picker (primary)
|
||||
- **`<C-a>t`** - Create a new template file
|
||||
- **`<C-a>T`** - Open Telescope template picker (alternative)
|
||||
- `:TemplateSnacks` - Command for Snacks picker
|
||||
- `:TemplateCreate <category/filename> [filetype]` - Create new template
|
||||
- `:TemplateTelescope` - Command for Telescope picker
|
||||
|
||||
### Template Variables
|
||||
|
||||
Templates support the following placeholders:
|
||||
|
||||
#### Built-in Variables
|
||||
- `{{_date_}}` - Current date and time
|
||||
- `{{_cursor_}}` - Cursor position after insertion
|
||||
- `{{_file_name_}}` - Current file name (without extension)
|
||||
- `{{_camel_case_file_}}` - File name converted to CamelCase
|
||||
- `{{_upper_file_}}` - File name in UPPERCASE
|
||||
- `{{_author_}}` - Author name (configured in plugin)
|
||||
- `{{_email_}}` - Email address (configured in plugin)
|
||||
- `{{_variable_}}` - Prompts for custom variable name
|
||||
- `{{_lua:<expr>_}}` - Execute Lua expression
|
||||
|
||||
#### Custom Registered Variables
|
||||
- `{{_path_}}` - Full path to current file
|
||||
- `{{_relative_path_}}` - Relative path to current file
|
||||
- `{{_dir_}}` - Directory of current file
|
||||
- `{{_project_}}` - Current project/directory name
|
||||
|
||||
## 📁 Available Templates
|
||||
|
||||
### Cosmos SDK (Go) - `/cosmos`
|
||||
|
||||
#### `keeper.go.tpl`
|
||||
Creates a Cosmos SDK keeper with store management and parameter store.
|
||||
|
||||
**Use for:** Module keeper implementation
|
||||
**Variables:** Uses `{{_file_name_}}` for module name
|
||||
|
||||
#### `msg_server.go.tpl`
|
||||
Creates a message server implementation for handling transactions.
|
||||
|
||||
**Use for:** Transaction message handlers
|
||||
**Variables:** `{{_variable_}}` for the message type name
|
||||
|
||||
#### `query_server.go.tpl`
|
||||
Creates a query server implementation for handling read queries.
|
||||
|
||||
**Use for:** Query handlers for module state
|
||||
**Variables:** `{{_variable_}}` for the query method name
|
||||
|
||||
#### `handler.go.tpl`
|
||||
Creates a message handler router for the module.
|
||||
|
||||
**Use for:** Main message routing logic
|
||||
|
||||
### Protobuf - `/proto`
|
||||
|
||||
#### `message.proto.tpl`
|
||||
Creates a basic protobuf message definition.
|
||||
|
||||
**Use for:** Data structures and types
|
||||
**Variables:** `{{_variable_}}` for the message name
|
||||
|
||||
#### `tx.proto.tpl`
|
||||
Creates a transaction message service with RPC definitions.
|
||||
|
||||
**Use for:** Transaction (Msg) service definitions
|
||||
**Variables:** `{{_variable_}}` for the transaction method name
|
||||
|
||||
#### `query.proto.tpl`
|
||||
Creates a query service with gRPC and HTTP annotations.
|
||||
|
||||
**Use for:** Query service definitions with REST endpoints
|
||||
**Variables:** `{{_variable_}}` for the query method name
|
||||
|
||||
### Vite + Cloudflare + TanStack - `/vite`
|
||||
|
||||
#### `worker.ts.tpl`
|
||||
Creates a Cloudflare Worker with proper TypeScript types.
|
||||
|
||||
**Use for:** Cloudflare Worker scripts
|
||||
**File type:** TypeScript
|
||||
|
||||
#### `pages-function.ts.tpl`
|
||||
Creates a Cloudflare Pages Function.
|
||||
|
||||
**Use for:** Cloudflare Pages API routes
|
||||
**File type:** TypeScript
|
||||
|
||||
#### `page.tsx.tpl`
|
||||
Creates a TanStack Router page component.
|
||||
|
||||
**Use for:** Full page routes with TanStack Router
|
||||
**File type:** TypeScript React
|
||||
|
||||
#### `component.tsx.tpl`
|
||||
Creates a memoized React component with TypeScript.
|
||||
|
||||
**Use for:** Reusable React components
|
||||
**File type:** TypeScript React
|
||||
|
||||
#### `hook.ts.tpl`
|
||||
Creates a custom React hook with TypeScript.
|
||||
|
||||
**Use for:** Reusable React hooks
|
||||
**File type:** TypeScript
|
||||
|
||||
#### `api.ts.tpl`
|
||||
Creates a TanStack Query API client with CRUD operations.
|
||||
|
||||
**Use for:** API integration with TanStack Query
|
||||
**File type:** TypeScript
|
||||
**Includes:** Query keys, fetch functions, and hooks
|
||||
|
||||
## 💡 Examples
|
||||
|
||||
### Creating a Cosmos SDK Message Server
|
||||
|
||||
1. Create/open a file: `msg_server_create_post.go`
|
||||
2. Press `<C-a><C-t>`
|
||||
3. Select `msg_server.go.tpl`
|
||||
4. Enter variable name when prompted: `CreatePost`
|
||||
5. Template is inserted with all placeholders filled
|
||||
|
||||
### Creating a TanStack Query API
|
||||
|
||||
1. Create/open a file: `posts.ts`
|
||||
2. Press `<C-a><C-t>`
|
||||
3. Select `api.ts.tpl`
|
||||
4. Template creates full API client with:
|
||||
- Query keys
|
||||
- Fetch functions
|
||||
- React hooks for queries and mutations
|
||||
|
||||
### Creating a React Component
|
||||
|
||||
1. Create/open a file: `user_card.tsx`
|
||||
2. Press `<C-a><C-t>`
|
||||
3. Select `component.tsx.tpl`
|
||||
4. Component created with name `UserCard` (auto-converted to CamelCase)
|
||||
|
||||
## 🎨 Customization
|
||||
|
||||
### Adding Your Own Templates
|
||||
|
||||
#### Quick Method (Recommended)
|
||||
1. Press `<C-a>t` to start the TemplateCreate command
|
||||
2. Type category and filename (e.g., `vite/form.tsx`)
|
||||
3. Optional: specify filetype (defaults to current buffer's filetype)
|
||||
4. Template file is created automatically and opens for editing
|
||||
|
||||
Example command:
|
||||
```vim
|
||||
:TemplateCreate vite/form.tsx typescriptreact
|
||||
```
|
||||
|
||||
#### Manual Method
|
||||
1. Create a new `.tpl` file in the templates directory
|
||||
2. Add filetype marker as first line: `;; <filetype>`
|
||||
3. Use template variables as needed
|
||||
4. Save and use with `<C-a><C-t>`
|
||||
|
||||
Example:
|
||||
```typescript
|
||||
;; typescript
|
||||
/**
|
||||
* {{_file_name_}}
|
||||
* @author {{_author_}}
|
||||
* @project {{_project_}}
|
||||
* @path {{_relative_path_}}
|
||||
*/
|
||||
|
||||
export const {{_camel_case_file_}} = {{_cursor_}}
|
||||
```
|
||||
|
||||
### Template Organization
|
||||
|
||||
- Use subdirectories to organize templates by category
|
||||
- Template picker shows category in selection: `[category] filename`
|
||||
- Templates are filtered by current file type automatically
|
||||
|
||||
## 🔧 Configuration
|
||||
|
||||
Edit template configuration in `lua/plugins/template.lua`:
|
||||
|
||||
```lua
|
||||
template.setup {
|
||||
temp_dir = vim.fn.stdpath "config" .. "/templates",
|
||||
author = "Your Name",
|
||||
email = "your.email@example.com",
|
||||
}
|
||||
```
|
||||
|
||||
## 📚 Resources
|
||||
|
||||
- [template.nvim GitHub](https://github.com/glepnir/template.nvim)
|
||||
- [Cosmos SDK Docs](https://docs.cosmos.network/)
|
||||
- [Cloudflare Workers Docs](https://developers.cloudflare.com/workers/)
|
||||
- [TanStack Router](https://tanstack.com/router)
|
||||
- [TanStack Query](https://tanstack.com/query)
|
||||
@@ -1,27 +0,0 @@
|
||||
;; go
|
||||
package {{_file_name_}}
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
"github.com/sonr-io/sonr/x/{{_file_name_}}/keeper"
|
||||
"github.com/sonr-io/sonr/x/{{_file_name_}}/types"
|
||||
)
|
||||
|
||||
// NewHandler returns a handler for {{_file_name_}} module messages
|
||||
func NewHandler(k keeper.Keeper) sdk.Handler {
|
||||
msgServer := keeper.NewMsgServerImpl(k)
|
||||
|
||||
return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
|
||||
ctx = ctx.WithEventManager(sdk.NewEventManager())
|
||||
|
||||
switch msg := msg.(type) {
|
||||
{{_cursor_}}
|
||||
default:
|
||||
errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg)
|
||||
return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
;; go
|
||||
package keeper
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/sonr-io/sonr/x/{{_file_name_}}/types"
|
||||
)
|
||||
|
||||
type Keeper struct {
|
||||
storeKey sdk.StoreKey
|
||||
cdc codec.BinaryCodec
|
||||
paramstore paramtypes.Subspace
|
||||
}
|
||||
|
||||
func NewKeeper(
|
||||
cdc codec.BinaryCodec,
|
||||
storeKey sdk.StoreKey,
|
||||
ps paramtypes.Subspace,
|
||||
) *Keeper {
|
||||
// set KeyTable if it has not already been set
|
||||
if !ps.HasKeyTable() {
|
||||
ps = ps.WithKeyTable(types.ParamKeyTable())
|
||||
}
|
||||
|
||||
return &Keeper{
|
||||
cdc: cdc,
|
||||
storeKey: storeKey,
|
||||
paramstore: ps,
|
||||
}
|
||||
}
|
||||
|
||||
// Logger returns a module-specific logger.
|
||||
func (k Keeper) Logger(ctx sdk.Context) log.Logger {
|
||||
return ctx.Logger().With("module", "x/{{_file_name_}}")
|
||||
}
|
||||
|
||||
{{_cursor_}}
|
||||
@@ -1,43 +0,0 @@
|
||||
;; go
|
||||
package keeper
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/sonr-io/sonr/x/{{_file_name_}}/types"
|
||||
)
|
||||
|
||||
type msgServer struct {
|
||||
Keeper
|
||||
}
|
||||
|
||||
// NewMsgServerImpl returns an implementation of the {{_camel_case_file_}} MsgServer interface
|
||||
// for the provided Keeper.
|
||||
func NewMsgServerImpl(keeper Keeper) types.MsgServer {
|
||||
return &msgServer{Keeper: keeper}
|
||||
}
|
||||
|
||||
var _ types.MsgServer = msgServer{}
|
||||
|
||||
// {{_variable_}} implements types.MsgServer
|
||||
func (k msgServer) {{_variable_}}(goCtx context.Context, msg *types.Msg{{_variable_}}) (*types.Msg{{_variable_}}Response, error) {
|
||||
ctx := sdk.UnwrapSDKContext(goCtx)
|
||||
|
||||
// Validate message
|
||||
if err := msg.ValidateBasic(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
{{_cursor_}}
|
||||
|
||||
// Emit event
|
||||
ctx.EventManager().EmitEvent(
|
||||
sdk.NewEvent(
|
||||
types.EventType{{_variable_}},
|
||||
sdk.NewAttribute(types.AttributeKeyCreator, msg.Creator),
|
||||
),
|
||||
)
|
||||
|
||||
return &types.Msg{{_variable_}}Response{}, nil
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
;; go
|
||||
package keeper
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/sonr-io/sonr/x/{{_file_name_}}/types"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
type queryServer struct {
|
||||
Keeper
|
||||
}
|
||||
|
||||
// NewQueryServerImpl returns an implementation of the {{_camel_case_file_}} QueryServer interface
|
||||
// for the provided Keeper.
|
||||
func NewQueryServerImpl(keeper Keeper) types.QueryServer {
|
||||
return &queryServer{Keeper: keeper}
|
||||
}
|
||||
|
||||
var _ types.QueryServer = queryServer{}
|
||||
|
||||
// {{_variable_}} implements types.QueryServer
|
||||
func (k queryServer) {{_variable_}}(goCtx context.Context, req *types.Query{{_variable_}}Request) (*types.Query{{_variable_}}Response, error) {
|
||||
if req == nil {
|
||||
return nil, status.Error(codes.InvalidArgument, "invalid request")
|
||||
}
|
||||
|
||||
ctx := sdk.UnwrapSDKContext(goCtx)
|
||||
|
||||
{{_cursor_}}
|
||||
|
||||
return &types.Query{{_variable_}}Response{}, nil
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
;; proto
|
||||
syntax = "proto3";
|
||||
package sonr.{{_file_name_}}.v1;
|
||||
|
||||
option go_package = "github.com/sonr-io/sonr/x/{{_file_name_}}/types";
|
||||
|
||||
import "gogoproto/gogo.proto";
|
||||
import "cosmos_proto/cosmos.proto";
|
||||
import "amino/amino.proto";
|
||||
|
||||
// {{_variable_}} defines the {{_variable_}} message
|
||||
message {{_variable_}} {
|
||||
option (gogoproto.equal) = true;
|
||||
option (amino.name) = "sonr/{{_file_name_}}/{{_variable_}}";
|
||||
|
||||
{{_cursor_}}
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
;; proto
|
||||
syntax = "proto3";
|
||||
package sonr.{{_file_name_}}.v1;
|
||||
|
||||
option go_package = "github.com/sonr-io/sonr/x/{{_file_name_}}/types";
|
||||
|
||||
import "gogoproto/gogo.proto";
|
||||
import "google/api/annotations.proto";
|
||||
import "cosmos/base/query/v1beta1/pagination.proto";
|
||||
import "cosmos/query/v1/query.proto";
|
||||
|
||||
// Query defines the gRPC querier service
|
||||
service Query {
|
||||
// {{_variable_}} queries the {{_variable_}}
|
||||
rpc {{_variable_}}(Query{{_variable_}}Request) returns (Query{{_variable_}}Response) {
|
||||
option (cosmos.query.v1.module_query_safe) = true;
|
||||
option (google.api.http).get = "/sonr/{{_file_name_}}/v1/{{_variable_}}";
|
||||
}
|
||||
}
|
||||
|
||||
// Query{{_variable_}}Request is the request type for the Query/{{_variable_}} RPC method
|
||||
message Query{{_variable_}}Request {
|
||||
{{_cursor_}}
|
||||
}
|
||||
|
||||
// Query{{_variable_}}Response is the response type for the Query/{{_variable_}} RPC method
|
||||
message Query{{_variable_}}Response {
|
||||
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
;; proto
|
||||
syntax = "proto3";
|
||||
package sonr.{{_file_name_}}.v1;
|
||||
|
||||
option go_package = "github.com/sonr-io/sonr/x/{{_file_name_}}/types";
|
||||
|
||||
import "gogoproto/gogo.proto";
|
||||
import "cosmos_proto/cosmos.proto";
|
||||
import "cosmos/msg/v1/msg.proto";
|
||||
import "amino/amino.proto";
|
||||
|
||||
// Msg defines the {{_file_name_}} Msg service
|
||||
service Msg {
|
||||
option (cosmos.msg.v1.service) = true;
|
||||
|
||||
// {{_variable_}} defines the {{_variable_}} RPC method
|
||||
rpc {{_variable_}}(Msg{{_variable_}}) returns (Msg{{_variable_}}Response);
|
||||
}
|
||||
|
||||
// Msg{{_variable_}} defines the {{_variable_}} message
|
||||
message Msg{{_variable_}} {
|
||||
option (cosmos.msg.v1.signer) = "creator";
|
||||
option (amino.name) = "sonr/{{_file_name_}}/{{_variable_}}";
|
||||
|
||||
string creator = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];
|
||||
{{_cursor_}}
|
||||
}
|
||||
|
||||
// Msg{{_variable_}}Response defines the {{_variable_}} response
|
||||
message Msg{{_variable_}}Response {}
|
||||
@@ -1,58 +0,0 @@
|
||||
;; typescript
|
||||
/**
|
||||
* {{_camel_case_file_}} API Client
|
||||
* @author {{_author_}}
|
||||
* @created {{_date_}}
|
||||
*/
|
||||
|
||||
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
|
||||
|
||||
// API Types
|
||||
interface {{_camel_case_file_}}Data {
|
||||
{{_cursor_}}
|
||||
}
|
||||
|
||||
// Query Keys
|
||||
export const {{_file_name_}}Keys = {
|
||||
all: ['{{_file_name_}}'] as const,
|
||||
lists: () => [...{{_file_name_}}Keys.all, 'list'] as const,
|
||||
list: (filters: string) => [...{{_file_name_}}Keys.lists(), { filters }] as const,
|
||||
details: () => [...{{_file_name_}}Keys.all, 'detail'] as const,
|
||||
detail: (id: string) => [...{{_file_name_}}Keys.details(), id] as const,
|
||||
}
|
||||
|
||||
// API Functions
|
||||
async function fetch{{_camel_case_file_}}(id: string): Promise<{{_camel_case_file_}}Data> {
|
||||
const response = await fetch(`/api/{{_file_name_}}/${id}`)
|
||||
if (!response.ok) throw new Error('Failed to fetch {{_file_name_}}')
|
||||
return response.json()
|
||||
}
|
||||
|
||||
async function create{{_camel_case_file_}}(data: Partial<{{_camel_case_file_}}Data>): Promise<{{_camel_case_file_}}Data> {
|
||||
const response = await fetch('/api/{{_file_name_}}', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(data),
|
||||
})
|
||||
if (!response.ok) throw new Error('Failed to create {{_file_name_}}')
|
||||
return response.json()
|
||||
}
|
||||
|
||||
// Hooks
|
||||
export function use{{_camel_case_file_}}(id: string) {
|
||||
return useQuery({
|
||||
queryKey: {{_file_name_}}Keys.detail(id),
|
||||
queryFn: () => fetch{{_camel_case_file_}}(id),
|
||||
})
|
||||
}
|
||||
|
||||
export function useCreate{{_camel_case_file_}}() {
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
return useMutation({
|
||||
mutationFn: create{{_camel_case_file_}},
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: {{_file_name_}}Keys.lists() })
|
||||
},
|
||||
})
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
;; typescriptreact
|
||||
/**
|
||||
* {{_camel_case_file_}} Component
|
||||
* @author {{_author_}}
|
||||
* @created {{_date_}}
|
||||
*/
|
||||
|
||||
import { memo } from 'react'
|
||||
|
||||
interface {{_camel_case_file_}}Props {
|
||||
{{_cursor_}}
|
||||
}
|
||||
|
||||
export const {{_camel_case_file_}} = memo<{{_camel_case_file_}}Props>(({ }) => {
|
||||
return (
|
||||
<div>
|
||||
|
||||
</div>
|
||||
)
|
||||
})
|
||||
|
||||
{{_camel_case_file_}}.displayName = '{{_camel_case_file_}}'
|
||||
@@ -1,24 +0,0 @@
|
||||
;; typescript
|
||||
/**
|
||||
* {{_camel_case_file_}} Hook
|
||||
* @author {{_author_}}
|
||||
* @created {{_date_}}
|
||||
*/
|
||||
|
||||
import { useState, useEffect } from 'react'
|
||||
|
||||
interface Use{{_camel_case_file_}}Options {
|
||||
{{_cursor_}}
|
||||
}
|
||||
|
||||
export function use{{_camel_case_file_}}(options?: Use{{_camel_case_file_}}Options) {
|
||||
const [data, setData] = useState()
|
||||
|
||||
useEffect(() => {
|
||||
// Hook logic here
|
||||
}, [])
|
||||
|
||||
return {
|
||||
data,
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
;; typescriptreact
|
||||
/**
|
||||
* {{_camel_case_file_}} Page Component
|
||||
* @author {{_author_}}
|
||||
* @created {{_date_}}
|
||||
*/
|
||||
|
||||
import { createFileRoute } from '@tanstack/react-router'
|
||||
|
||||
export const Route = createFileRoute('/{{_file_name_}}')({
|
||||
component: {{_camel_case_file_}}Page,
|
||||
})
|
||||
|
||||
function {{_camel_case_file_}}Page() {
|
||||
{{_cursor_}}
|
||||
|
||||
return (
|
||||
<div className="container mx-auto px-4 py-8">
|
||||
<h1 className="text-3xl font-bold mb-6">{{_camel_case_file_}}</h1>
|
||||
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
;; typescript
|
||||
/**
|
||||
* Cloudflare Pages Function - {{_file_name_}}
|
||||
* @author {{_author_}}
|
||||
* @created {{_date_}}
|
||||
*/
|
||||
|
||||
interface Env {
|
||||
// Add your environment bindings here
|
||||
}
|
||||
|
||||
export const onRequest: PagesFunction<Env> = async (context) => {
|
||||
const { request, env, params } = context
|
||||
|
||||
{{_cursor_}}
|
||||
|
||||
return new Response(JSON.stringify({ success: true }), {
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
})
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
;; typescript
|
||||
/**
|
||||
* Cloudflare Worker - {{_file_name_}}
|
||||
* @author {{_author_}}
|
||||
* @created {{_date_}}
|
||||
*/
|
||||
|
||||
export interface Env {
|
||||
// Add your environment bindings here
|
||||
// Example: DB: D1Database
|
||||
}
|
||||
|
||||
export default {
|
||||
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
|
||||
const url = new URL(request.url);
|
||||
|
||||
{{_cursor_}}
|
||||
|
||||
return new Response('Hello World!', {
|
||||
headers: { 'Content-Type': 'text/plain' },
|
||||
});
|
||||
},
|
||||
} satisfies ExportedHandler<Env>;
|
||||
Reference in new issue
Block a user