init
This commit is contained in:
commit
2c0505f16f
|
|
@ -0,0 +1,2 @@
|
|||
.DS_Store
|
||||
references/docs
|
||||
|
|
@ -0,0 +1,760 @@
|
|||
---
|
||||
name: coda-pack-dev
|
||||
description: Use when the user asks about building Coda Packs, creating formulas, sync tables, actions, authentication, schemas, parameters, or any Coda Pack SDK questions.
|
||||
---
|
||||
|
||||
# Coda Pack Development Expert
|
||||
|
||||
Expert assistance for building Coda Packs using the Coda Pack SDK. Provides guidance on formulas, sync tables, actions, authentication, and best practices.
|
||||
|
||||
## What Are Coda Packs?
|
||||
|
||||
Coda Packs are extensions that add new capabilities to Coda documents. They're built using TypeScript/JavaScript and run on Coda's servers as serverless applications.
|
||||
|
||||
### Four Core Extension Types
|
||||
|
||||
1. **Formulas** - Custom functions for calculations or data retrieval
|
||||
2. **Actions** - Special formulas that modify external applications (used in buttons/automations)
|
||||
3. **Column Formats** - Control how values display in tables
|
||||
4. **Sync Tables** - Automated tables that pull data from external sources
|
||||
|
||||
## Pack Structure
|
||||
|
||||
### Basic pack.ts Template
|
||||
|
||||
```typescript
|
||||
import * as coda from "@codahq/packs-sdk";
|
||||
|
||||
export const pack = coda.newPack();
|
||||
|
||||
// Add network domains your pack will access
|
||||
pack.addNetworkDomain("api.example.com");
|
||||
|
||||
// Add formulas, sync tables, etc.
|
||||
```
|
||||
|
||||
## Creating Formulas
|
||||
|
||||
### Formula Anatomy
|
||||
|
||||
```typescript
|
||||
pack.addFormula({
|
||||
name: "FormulaName", // Upper camel case, letters/numbers/underscores only
|
||||
description: "What it does",
|
||||
parameters: [ // Array of parameters
|
||||
coda.makeParameter({
|
||||
type: coda.ParameterType.String,
|
||||
name: "paramName",
|
||||
description: "What this param does",
|
||||
optional: false, // Optional: mark as optional param
|
||||
}),
|
||||
],
|
||||
resultType: coda.ValueType.String, // Return type
|
||||
isAction: false, // Set true for actions (buttons/automations)
|
||||
execute: async function(args, context) {
|
||||
// Your code here
|
||||
return result;
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Parameter Types
|
||||
|
||||
Common parameter types:
|
||||
- `ParameterType.String` - Text values
|
||||
- `ParameterType.Number` - Numeric values
|
||||
- `ParameterType.Boolean` - True/false
|
||||
- `ParameterType.Date` - Date values
|
||||
- `ParameterType.StringArray` - Array of strings
|
||||
- `ParameterType.NumberArray` - Array of numbers
|
||||
- `ParameterType.Html` - HTML content
|
||||
- `ParameterType.Image` - Image URL or data
|
||||
|
||||
### Result Types
|
||||
|
||||
Common result types:
|
||||
- `ValueType.String` - Text
|
||||
- `ValueType.Number` - Numbers
|
||||
- `ValueType.Boolean` - True/false
|
||||
- `ValueType.Array` - Array of values
|
||||
- `ValueType.Object` - Structured object (requires schema)
|
||||
|
||||
### Formula Naming Best Practices
|
||||
|
||||
- **Data sources**: Use plural nouns (`Tasks`, `Users`)
|
||||
- **Transformations**: Use verbs (`Reverse`, `Truncate`)
|
||||
- **Multiple words**: Upper camel case (`BugReport`, `DeletedFiles`)
|
||||
- **Avoid prefixes**: Skip "Get", "Lookup", "Query"
|
||||
- **Unique names**: Must be unique within pack
|
||||
|
||||
⚠️ **Warning**: Renaming formulas breaks existing documents using them!
|
||||
|
||||
### Making HTTP Requests
|
||||
|
||||
```typescript
|
||||
execute: async function([param1, param2], context) {
|
||||
let response = await context.fetcher.fetch({
|
||||
method: "POST",
|
||||
url: "https://api.example.com/endpoint",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
key: "value",
|
||||
}),
|
||||
});
|
||||
|
||||
// Check status
|
||||
if (response.status !== 200) {
|
||||
throw new coda.UserVisibleError("API request failed");
|
||||
}
|
||||
|
||||
// Access response body
|
||||
let data = response.body;
|
||||
return data.result;
|
||||
}
|
||||
```
|
||||
|
||||
## Actions vs Regular Formulas
|
||||
|
||||
**Actions** (`isAction: true`) are formulas designed for buttons and automations:
|
||||
- Can modify external systems (create, update, delete)
|
||||
- Show differently in the formula picker
|
||||
- Used in button formulas and automations
|
||||
|
||||
**Regular formulas** are for calculations and data retrieval:
|
||||
- Should be idempotent (same inputs = same output)
|
||||
- Cached for performance
|
||||
- Used in table columns and document calculations
|
||||
|
||||
## Sync Tables
|
||||
|
||||
### Basic Sync Table Structure
|
||||
|
||||
```typescript
|
||||
// 1. Define schema
|
||||
const ItemSchema = coda.makeObjectSchema({
|
||||
properties: {
|
||||
id: {
|
||||
type: coda.ValueType.Number,
|
||||
fromKey: "id",
|
||||
required: true,
|
||||
},
|
||||
name: {
|
||||
type: coda.ValueType.String,
|
||||
fromKey: "name",
|
||||
required: true,
|
||||
},
|
||||
url: {
|
||||
type: coda.ValueType.String,
|
||||
fromKey: "url",
|
||||
codaType: coda.ValueHintType.Url,
|
||||
},
|
||||
},
|
||||
displayProperty: "name", // Primary column
|
||||
idProperty: "id", // Unique identifier
|
||||
featuredProperties: ["name", "url"], // Show by default
|
||||
});
|
||||
|
||||
// 2. Add sync table
|
||||
pack.addSyncTable({
|
||||
name: "Items",
|
||||
identityName: "Item", // Singular form
|
||||
schema: ItemSchema,
|
||||
formula: {
|
||||
name: "SyncItems",
|
||||
description: "Sync items from API",
|
||||
parameters: [
|
||||
// Optional filter parameters
|
||||
],
|
||||
execute: async function(args, context) {
|
||||
let response = await context.fetcher.fetch({
|
||||
method: "GET",
|
||||
url: "https://api.example.com/items",
|
||||
});
|
||||
|
||||
let items = response.body.items;
|
||||
|
||||
return {
|
||||
result: items, // Array of objects matching schema
|
||||
};
|
||||
},
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Sync Table Key Concepts
|
||||
|
||||
**Identity**: Every sync table needs `identityName` (singular form of table name)
|
||||
|
||||
**Schema Properties**: Define the structure of each row
|
||||
- Use `fromKey` to map API field names to schema properties
|
||||
- Set `required: true` for mandatory fields
|
||||
- Use `displayProperty` for the primary column
|
||||
- Use `idProperty` for unique identification
|
||||
|
||||
**Row Limits**:
|
||||
- Default: 1,000 rows
|
||||
- Maximum: 10,000 rows
|
||||
|
||||
**Continuations**: For paginated results exceeding 60s timeout:
|
||||
|
||||
```typescript
|
||||
execute: async function(args, context) {
|
||||
let url = context.sync.continuation?.nextUrl || "https://api.example.com/items";
|
||||
|
||||
let response = await context.fetcher.fetch({ method: "GET", url });
|
||||
|
||||
let continuation;
|
||||
if (response.body.next_page) {
|
||||
continuation = {
|
||||
nextUrl: response.body.next_page,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
result: response.body.items,
|
||||
continuation: continuation,
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### Dynamic Sync Tables
|
||||
|
||||
For APIs with multiple similar endpoints:
|
||||
|
||||
```typescript
|
||||
pack.addDynamicSyncTable({
|
||||
name: "DynamicTable",
|
||||
getName: async function(context) {
|
||||
// Return table name based on context
|
||||
},
|
||||
getSchema: async function(context) {
|
||||
// Return schema based on selected entity
|
||||
},
|
||||
getDisplayUrl: async function(context) {
|
||||
// Return URL to view the data
|
||||
},
|
||||
listDynamicUrls: async function(context) {
|
||||
// Return list of available tables
|
||||
},
|
||||
formula: {
|
||||
// Same as regular sync table
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
**See [Advanced Sync Tables](references/advanced-sync-tables.md) for:**
|
||||
- Complete dynamic sync table implementation guide
|
||||
- Two-way sync (editable sync tables)
|
||||
- Property options and dynamic dropdowns
|
||||
- Folder organization, search, and manual URL entry
|
||||
|
||||
### Two-Way Sync Tables
|
||||
|
||||
Enable users to edit synced data and push changes back to external sources. Mark columns as editable with `mutable: true` and implement an `executeUpdate` function:
|
||||
|
||||
```typescript
|
||||
const TaskSchema = coda.makeObjectSchema({
|
||||
properties: {
|
||||
id: { type: coda.ValueType.Number, required: true },
|
||||
name: {
|
||||
type: coda.ValueType.String,
|
||||
mutable: true, // Editable column
|
||||
},
|
||||
status: {
|
||||
type: coda.ValueType.String,
|
||||
codaType: coda.ValueHintType.SelectList,
|
||||
options: ["Todo", "In Progress", "Done"],
|
||||
mutable: true,
|
||||
},
|
||||
},
|
||||
displayProperty: "name",
|
||||
idProperty: "id",
|
||||
});
|
||||
|
||||
pack.addSyncTable({
|
||||
name: "Tasks",
|
||||
identityName: "Task",
|
||||
schema: TaskSchema,
|
||||
formula: {
|
||||
name: "SyncTasks",
|
||||
description: "Sync tasks",
|
||||
parameters: [],
|
||||
execute: async function([], context) {
|
||||
// Fetch data from API
|
||||
let response = await context.fetcher.fetch({
|
||||
method: "GET",
|
||||
url: "https://api.example.com/tasks",
|
||||
});
|
||||
return { result: response.body.tasks };
|
||||
},
|
||||
executeUpdate: async function([], context, updates) {
|
||||
// Push changes back to API
|
||||
let results = [];
|
||||
for (let update of updates) {
|
||||
let response = await context.fetcher.fetch({
|
||||
method: "PATCH",
|
||||
url: `https://api.example.com/tasks/${update.previousValue.id}`,
|
||||
body: JSON.stringify({
|
||||
name: update.newValue.name,
|
||||
status: update.newValue.status,
|
||||
}),
|
||||
});
|
||||
results.push(response.body);
|
||||
}
|
||||
return { result: results };
|
||||
},
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
**See [Advanced Sync Tables](references/advanced-sync-tables.md) for:**
|
||||
- Property options (static and dynamic)
|
||||
- Batch updates with `maxUpdateBatchSize`
|
||||
- Error handling in updates
|
||||
- OAuth incremental authorization
|
||||
|
||||
## Authentication
|
||||
|
||||
### Setting Up Authentication
|
||||
|
||||
```typescript
|
||||
// User authentication (most common)
|
||||
pack.setUserAuthentication({
|
||||
type: coda.AuthenticationType.HeaderBearerToken,
|
||||
instructionsUrl: "https://example.com/get-api-key",
|
||||
});
|
||||
|
||||
// Or system authentication (shared credentials)
|
||||
pack.setSystemAuthentication({
|
||||
type: coda.AuthenticationType.HeaderBearerToken,
|
||||
});
|
||||
```
|
||||
|
||||
### Authentication Types
|
||||
|
||||
- **HeaderBearerToken** - Bearer token in Authorization header
|
||||
- **CustomHeaderToken** - Custom header name
|
||||
- **QueryParamToken** - Token in query string
|
||||
- **WebBasic** - Username and password
|
||||
- **OAuth2** - OAuth 2.0 flow
|
||||
- **CodaApiHeaderBearerToken** - For Coda API
|
||||
- **AWSAccessKey** - AWS Signature v4
|
||||
|
||||
### OAuth2 Authentication
|
||||
|
||||
```typescript
|
||||
pack.setUserAuthentication({
|
||||
type: coda.AuthenticationType.OAuth2,
|
||||
authorizationUrl: "https://example.com/oauth/authorize",
|
||||
tokenUrl: "https://example.com/oauth/token",
|
||||
scopes: ["read", "write"],
|
||||
|
||||
// Get account name for the connection
|
||||
getConnectionName: async function(context) {
|
||||
let response = await context.fetcher.fetch({
|
||||
method: "GET",
|
||||
url: "https://api.example.com/me",
|
||||
});
|
||||
return response.body.username;
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Per-Account Endpoints
|
||||
|
||||
For services with account-specific domains:
|
||||
|
||||
```typescript
|
||||
pack.setUserAuthentication({
|
||||
type: coda.AuthenticationType.HeaderBearerToken,
|
||||
|
||||
// Prompt user for their account URL
|
||||
getConnectionName: async function(context) {
|
||||
return context.endpoint || "Unknown";
|
||||
},
|
||||
|
||||
endpointDomain: async function(context) {
|
||||
return context.endpoint;
|
||||
},
|
||||
|
||||
networkDomain: "example.com",
|
||||
});
|
||||
|
||||
// Access endpoint in formulas
|
||||
execute: async function(args, context) {
|
||||
let url = `https://${context.endpoint}/api/endpoint`;
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
## Schemas
|
||||
|
||||
### Object Schema
|
||||
|
||||
```typescript
|
||||
const PersonSchema = coda.makeObjectSchema({
|
||||
properties: {
|
||||
id: { type: coda.ValueType.Number },
|
||||
name: { type: coda.ValueType.String },
|
||||
email: {
|
||||
type: coda.ValueType.String,
|
||||
codaType: coda.ValueHintType.Email,
|
||||
},
|
||||
joinDate: {
|
||||
type: coda.ValueType.String,
|
||||
codaType: coda.ValueHintType.Date,
|
||||
},
|
||||
avatar: {
|
||||
type: coda.ValueType.String,
|
||||
codaType: coda.ValueHintType.ImageReference,
|
||||
},
|
||||
isActive: { type: coda.ValueType.Boolean },
|
||||
},
|
||||
displayProperty: "name",
|
||||
idProperty: "id",
|
||||
featuredProperties: ["name", "email"],
|
||||
});
|
||||
```
|
||||
|
||||
### Value Hints (codaType)
|
||||
|
||||
Make data more interactive:
|
||||
- `ValueHintType.Url` - Clickable links
|
||||
- `ValueHintType.Email` - Email addresses
|
||||
- `ValueHintType.Date` - Date formatting
|
||||
- `ValueHintType.DateTime` - Date and time
|
||||
- `ValueHintType.ImageReference` - Display images
|
||||
- `ValueHintType.ImageAttachment` - Inline images
|
||||
- `ValueHintType.Markdown` - Render markdown
|
||||
- `ValueHintType.Html` - Render HTML
|
||||
|
||||
### Array Schemas
|
||||
|
||||
```typescript
|
||||
// Array of objects
|
||||
const resultType = coda.ValueType.Array;
|
||||
const schema = coda.makeSchema({
|
||||
type: coda.ValueType.Array,
|
||||
items: PersonSchema, // Schema for each item
|
||||
});
|
||||
```
|
||||
|
||||
## Network Domains
|
||||
|
||||
Whitelist domains your pack will access:
|
||||
|
||||
```typescript
|
||||
pack.addNetworkDomain("api.example.com");
|
||||
pack.addNetworkDomain("cdn.example.com");
|
||||
|
||||
// Support subdomains
|
||||
pack.addNetworkDomain("example.com"); // Allows *.example.com
|
||||
```
|
||||
|
||||
## Error Handling
|
||||
|
||||
### User-Visible Errors
|
||||
|
||||
```typescript
|
||||
execute: async function(args, context) {
|
||||
if (!args[0]) {
|
||||
throw new coda.UserVisibleError("Parameter is required");
|
||||
}
|
||||
|
||||
let response = await context.fetcher.fetch({...});
|
||||
|
||||
if (response.status === 404) {
|
||||
throw new coda.UserVisibleError("Item not found");
|
||||
}
|
||||
|
||||
if (response.status !== 200) {
|
||||
throw new coda.UserVisibleError(
|
||||
`API error: ${response.status} - ${response.body.message}`
|
||||
);
|
||||
}
|
||||
|
||||
return response.body;
|
||||
}
|
||||
```
|
||||
|
||||
### Status Code Error
|
||||
|
||||
```typescript
|
||||
// Automatically throw error for non-2xx responses
|
||||
let response = await context.fetcher.fetch({
|
||||
method: "GET",
|
||||
url: "https://api.example.com/endpoint",
|
||||
cacheTtlSecs: 0, // Disable caching
|
||||
throwOnError: true, // Throw on non-2xx status
|
||||
});
|
||||
```
|
||||
|
||||
## Caching
|
||||
|
||||
### Cache Control
|
||||
|
||||
```typescript
|
||||
// Set cache TTL (time-to-live in seconds)
|
||||
let response = await context.fetcher.fetch({
|
||||
method: "GET",
|
||||
url: "https://api.example.com/data",
|
||||
cacheTtlSecs: 300, // Cache for 5 minutes
|
||||
});
|
||||
|
||||
// Disable caching
|
||||
cacheTtlSecs: 0
|
||||
```
|
||||
|
||||
### When to Cache
|
||||
|
||||
- ✅ Reference data (countries, categories)
|
||||
- ✅ Slowly changing data (user profiles)
|
||||
- ❌ Real-time data (stock prices, live scores)
|
||||
- ❌ User-specific data that changes frequently
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Formula Development
|
||||
|
||||
1. **Descriptive names**: Clear, concise, descriptive names
|
||||
2. **Good descriptions**: Explain what the formula does and when to use it
|
||||
3. **Parameter validation**: Check required parameters early
|
||||
4. **Error messages**: Clear, actionable error messages
|
||||
5. **Examples**: Add examples to aid documentation
|
||||
|
||||
```typescript
|
||||
pack.addFormula({
|
||||
name: "ConvertCurrency",
|
||||
description: "Convert amount from one currency to another using current exchange rates",
|
||||
parameters: [
|
||||
coda.makeParameter({
|
||||
type: coda.ParameterType.Number,
|
||||
name: "amount",
|
||||
description: "The amount to convert",
|
||||
}),
|
||||
coda.makeParameter({
|
||||
type: coda.ParameterType.String,
|
||||
name: "from",
|
||||
description: "Source currency code (e.g., USD, EUR)",
|
||||
}),
|
||||
coda.makeParameter({
|
||||
type: coda.ParameterType.String,
|
||||
name: "to",
|
||||
description: "Target currency code (e.g., USD, EUR)",
|
||||
}),
|
||||
],
|
||||
resultType: coda.ValueType.Number,
|
||||
examples: [
|
||||
{ params: [100, "USD", "EUR"], result: 85.50 },
|
||||
{ params: [50, "GBP", "USD"], result: 65.75 },
|
||||
],
|
||||
execute: async function([amount, from, to], context) {
|
||||
// Implementation
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Sync Table Best Practices
|
||||
|
||||
1. **Identity**: Always set `identityName` and `idProperty`
|
||||
2. **Display property**: Choose the most meaningful column
|
||||
3. **Featured properties**: Show 3-5 most important columns by default
|
||||
4. **Continuations**: Handle pagination for large datasets
|
||||
5. **Parameters**: Add filter parameters to reduce API calls
|
||||
|
||||
### API Integration
|
||||
|
||||
1. **Rate limits**: Respect API rate limits
|
||||
2. **Pagination**: Handle paginated responses properly
|
||||
3. **Error handling**: Graceful handling of API errors
|
||||
4. **Authentication**: Use appropriate auth type
|
||||
5. **Caching**: Cache when appropriate to reduce API calls
|
||||
|
||||
### Performance
|
||||
|
||||
1. **Minimize API calls**: Batch requests when possible
|
||||
2. **Use caching**: Cache stable data
|
||||
3. **Optimize schemas**: Only include needed properties
|
||||
4. **Continuations**: Use for large datasets
|
||||
5. **Timeout awareness**: 60-second execution limit
|
||||
|
||||
## Common Patterns
|
||||
|
||||
### Handling API Pagination
|
||||
|
||||
```typescript
|
||||
execute: async function(args, context) {
|
||||
let page = context.sync.continuation?.page || 1;
|
||||
let allItems = context.sync.continuation?.items || [];
|
||||
|
||||
let response = await context.fetcher.fetch({
|
||||
method: "GET",
|
||||
url: `https://api.example.com/items?page=${page}`,
|
||||
});
|
||||
|
||||
allItems = allItems.concat(response.body.items);
|
||||
|
||||
let continuation;
|
||||
if (response.body.has_more) {
|
||||
continuation = {
|
||||
page: page + 1,
|
||||
items: allItems,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
result: allItems,
|
||||
continuation: continuation,
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### Building URLs with Parameters
|
||||
|
||||
```typescript
|
||||
execute: async function([filter, sortBy], context) {
|
||||
let params = new URLSearchParams();
|
||||
if (filter) params.append("filter", filter);
|
||||
if (sortBy) params.append("sort", sortBy);
|
||||
|
||||
let url = `https://api.example.com/items?${params.toString()}`;
|
||||
let response = await context.fetcher.fetch({ method: "GET", url });
|
||||
|
||||
return response.body;
|
||||
}
|
||||
```
|
||||
|
||||
### Transforming API Data
|
||||
|
||||
```typescript
|
||||
execute: async function(args, context) {
|
||||
let response = await context.fetcher.fetch({
|
||||
method: "GET",
|
||||
url: "https://api.example.com/users",
|
||||
});
|
||||
|
||||
// Transform API data to match schema
|
||||
let users = response.body.users.map(user => ({
|
||||
id: user.user_id, // Map API field to schema
|
||||
name: user.full_name,
|
||||
email: user.email_address,
|
||||
isActive: user.status === "active",
|
||||
}));
|
||||
|
||||
return { result: users };
|
||||
}
|
||||
```
|
||||
|
||||
## Development Commands
|
||||
|
||||
```bash
|
||||
# Install dependencies
|
||||
npm install
|
||||
|
||||
# Upload/deploy pack
|
||||
npx coda upload pack.ts --notes "Description of changes"
|
||||
|
||||
# Validate pack
|
||||
npx coda validate pack.ts
|
||||
|
||||
# Execute formula locally (for testing)
|
||||
npx coda execute pack.ts FormulaName param1 param2
|
||||
|
||||
# Create new pack
|
||||
npx coda init
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
### Unit Testing
|
||||
|
||||
```typescript
|
||||
import { executeFormulaFromPackDef } from '@codahq/packs-sdk/dist/development';
|
||||
import { pack } from './pack';
|
||||
|
||||
// Test a formula
|
||||
let result = await executeFormulaFromPackDef(
|
||||
pack,
|
||||
"FormulaName",
|
||||
["param1", "param2"]
|
||||
);
|
||||
|
||||
console.assert(result === expectedValue);
|
||||
```
|
||||
|
||||
### Common Issues
|
||||
|
||||
**"Network domain not whitelisted"**
|
||||
- Add the domain with `pack.addNetworkDomain()`
|
||||
|
||||
**"Formula already exists"**
|
||||
- Formula names must be unique within the pack
|
||||
|
||||
**"Invalid parameter type"**
|
||||
- Check parameter types match expected values
|
||||
|
||||
**"Execution timeout"**
|
||||
- Use continuations for long-running operations
|
||||
- Optimize API calls and data processing
|
||||
|
||||
**"Authentication failed"**
|
||||
- Verify auth configuration
|
||||
- Check user credentials
|
||||
- Ensure proper headers/tokens
|
||||
|
||||
## Resources
|
||||
|
||||
### Official Documentation
|
||||
- **Official Docs**: https://coda.io/packs/build/latest/
|
||||
- **SDK Reference**: https://coda.io/packs/build/latest/reference/sdk/
|
||||
- **Pack Studio**: https://coda.io/packs/build
|
||||
- **Example Packs**: Available in Pack Studio
|
||||
|
||||
### Skill Reference Guides
|
||||
- **[Advanced Sync Tables](references/advanced-sync-tables.md)** - Two-way sync, dynamic tables, property options
|
||||
- **[Quick Examples](references/quick-examples.md)** - Common formula and sync table patterns
|
||||
- **[Troubleshooting](references/troubleshooting.md)** - Common errors and debugging strategies
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Common Imports
|
||||
```typescript
|
||||
import * as coda from "@codahq/packs-sdk";
|
||||
```
|
||||
|
||||
### Pack Initialization
|
||||
```typescript
|
||||
export const pack = coda.newPack();
|
||||
```
|
||||
|
||||
### Add Formula
|
||||
```typescript
|
||||
pack.addFormula({ name, description, parameters, resultType, execute });
|
||||
```
|
||||
|
||||
### Add Sync Table
|
||||
```typescript
|
||||
pack.addSyncTable({ name, identityName, schema, formula });
|
||||
```
|
||||
|
||||
### Make Parameter
|
||||
```typescript
|
||||
coda.makeParameter({ type, name, description, optional });
|
||||
```
|
||||
|
||||
### Make Schema
|
||||
```typescript
|
||||
coda.makeObjectSchema({ properties, displayProperty, idProperty });
|
||||
```
|
||||
|
||||
### Fetch Data
|
||||
```typescript
|
||||
await context.fetcher.fetch({ method, url, headers, body });
|
||||
```
|
||||
|
||||
### Throw Error
|
||||
```typescript
|
||||
throw new coda.UserVisibleError("Error message");
|
||||
```
|
||||
|
|
@ -0,0 +1,592 @@
|
|||
---
|
||||
# Coda Pack SDK Documentation Structure
|
||||
# Complete file tree of all documentation (370+ files)
|
||||
|
||||
root: docs/
|
||||
|
||||
structure:
|
||||
# Main landing page
|
||||
index.md: Home page
|
||||
|
||||
# Agents section
|
||||
agents:
|
||||
index.md: Agents overview
|
||||
development.md: Agent development
|
||||
examples.md: Agent examples
|
||||
quickstart.md: Agent quickstart
|
||||
troubleshooting.md: Agent troubleshooting
|
||||
upgrade.md: Agent upgrade guide
|
||||
features:
|
||||
chat.md: Chat features
|
||||
context.md: Context management
|
||||
mcp.md: MCP (Model Context Protocol)
|
||||
skills.md: Skills system
|
||||
tools.md: Agent tools
|
||||
indexing:
|
||||
index.md: Indexing overview
|
||||
crawling.md: Content crawling
|
||||
incremental.md: Incremental indexing
|
||||
schema.md: Index schema
|
||||
|
||||
# Blog
|
||||
blog:
|
||||
index.md: Blog index
|
||||
posts:
|
||||
new_agent_features.md: New agent features announcement
|
||||
|
||||
# Guides - main documentation
|
||||
guides:
|
||||
overview.md: Pack development overview
|
||||
design.md: Pack design guidelines
|
||||
best-practices.md: Best practices
|
||||
|
||||
# Basics
|
||||
basics:
|
||||
data-types.md: Working with data types
|
||||
fetcher.md: Making HTTP requests
|
||||
authentication:
|
||||
index.md: Authentication overview
|
||||
oauth2.md: OAuth2 authentication
|
||||
aws.md: AWS authentication
|
||||
parameters:
|
||||
index.md: Parameters overview
|
||||
autocomplete.md: Parameter autocomplete
|
||||
|
||||
# Building blocks
|
||||
blocks:
|
||||
formulas.md: Creating formulas
|
||||
actions.md: Building actions
|
||||
cards.md: Creating cards
|
||||
column-formats.md: Custom column formats
|
||||
sync-tables:
|
||||
index.md: Sync tables overview
|
||||
dynamic.md: Dynamic sync tables
|
||||
two-way.md: Two-way sync
|
||||
|
||||
# Advanced topics
|
||||
advanced:
|
||||
schemas.md: Advanced schema patterns
|
||||
caching.md: Caching strategies
|
||||
errors.md: Error handling
|
||||
images.md: Working with images
|
||||
embeds.md: Embedded content
|
||||
timezones.md: Timezone handling
|
||||
.card_schema.md: Card schema (internal)
|
||||
|
||||
# Development
|
||||
development:
|
||||
cli.md: Command line interface
|
||||
testing.md: Testing packs
|
||||
troubleshooting.md: Troubleshooting
|
||||
libraries.md: Using libraries
|
||||
pack-maker-tools.md: Pack maker tools
|
||||
versions.md: Version management
|
||||
|
||||
# Tutorials
|
||||
tutorials:
|
||||
index.md: Tutorials index
|
||||
videos.md: Video tutorials
|
||||
get-started:
|
||||
web.md: Web IDE tutorial
|
||||
cli.md: CLI tutorial
|
||||
github.md: GitHub development
|
||||
gitpod.md: Gitpod development
|
||||
replit.md: Replit development
|
||||
.cli.md: CLI (internal)
|
||||
.cli-before.md: CLI setup (internal)
|
||||
.cli-test.md: CLI testing (internal)
|
||||
.rebuild.md: Rebuild (internal)
|
||||
.use.md: Usage (internal)
|
||||
build:
|
||||
formula.md: Building formulas
|
||||
fetcher.md: Using fetcher
|
||||
sync-table.md: Building sync tables
|
||||
oauth.md: Implementing OAuth
|
||||
|
||||
# Code samples
|
||||
samples:
|
||||
index.md: Samples index
|
||||
|
||||
# Full pack examples
|
||||
full:
|
||||
hello-world.md: Hello World pack
|
||||
cats.md: Cat photos pack
|
||||
math.md: Math pack
|
||||
github.md: GitHub pack
|
||||
todoist.md: Todoist pack
|
||||
daylight.md: Daylight pack
|
||||
dnd.md: D&D pack
|
||||
|
||||
# Topic-specific samples
|
||||
topic:
|
||||
formula.md: Formula examples
|
||||
action.md: Action examples
|
||||
sync-table.md: Sync table examples
|
||||
dynamic-sync-table.md: Dynamic sync table examples
|
||||
two-way.md: Two-way sync examples
|
||||
authentication.md: Authentication examples
|
||||
fetcher.md: Fetcher examples
|
||||
parameter.md: Parameter examples
|
||||
autocomplete.md: Autocomplete examples
|
||||
schema.md: Schema examples
|
||||
data-type.md: Data type examples
|
||||
column-format.md: Column format examples
|
||||
card.md: Card examples
|
||||
image.md: Image examples
|
||||
dates.md: Date handling examples
|
||||
apis.md: API integration examples
|
||||
|
||||
# SDK Reference
|
||||
reference:
|
||||
sdk:
|
||||
index.md: SDK reference index
|
||||
|
||||
# Core SDK
|
||||
core:
|
||||
index.md: Core SDK index
|
||||
|
||||
# Classes
|
||||
classes:
|
||||
PackDefinitionBuilder.md: Pack definition builder
|
||||
UserVisibleError.md: User visible error
|
||||
StatusCodeError.md: Status code error
|
||||
MissingScopesError.md: Missing scopes error
|
||||
ResponseSizeTooLargeError.md: Response size error
|
||||
|
||||
# Enumerations
|
||||
enumerations:
|
||||
AuthenticationType.md: Authentication types
|
||||
ParameterType.md: Parameter types
|
||||
ValueType.md: Value types
|
||||
ValueHintType.md: Value hint types
|
||||
ConnectionRequirement.md: Connection requirements
|
||||
Type.md: Schema types
|
||||
HttpStatusCode.md: HTTP status codes
|
||||
InvocationErrorType.md: Invocation error types
|
||||
InvocationSource.md: Invocation sources
|
||||
PostSetupType.md: Post-setup types
|
||||
OptionsType.md: Options types
|
||||
NetworkConnection.md: Network connection types
|
||||
PermissionSyncMode.md: Permission sync modes
|
||||
EmbeddedContentType.md: Embedded content types
|
||||
AttributionNodeType.md: Attribution node types
|
||||
LinkDisplayType.md: Link display types
|
||||
EmailDisplayType.md: Email display types
|
||||
CurrencyFormat.md: Currency formats
|
||||
DurationUnit.md: Duration units
|
||||
PrecannedDateRange.md: Precanned date ranges
|
||||
ImageCornerStyle.md: Image corner styles
|
||||
ImageOutline.md: Image outlines
|
||||
ImageShapeStyle.md: Image shape styles
|
||||
ScaleIconSet.md: Scale icon sets
|
||||
ToolType.md: Tool types
|
||||
TokenExchangeCredentialsLocation.md: Token exchange locations
|
||||
ScreenAnnotationType.md: Screen annotation types
|
||||
KnowledgeToolSourceType.md: Knowledge tool source types
|
||||
SkillModel.md: Skill models
|
||||
|
||||
# Functions
|
||||
functions:
|
||||
newPack.md: Create new pack
|
||||
makeFormula.md: Make formula
|
||||
makeParameter.md: Make parameter
|
||||
makeSchema.md: Make schema
|
||||
makeObjectSchema.md: Make object schema
|
||||
makeSyncTable.md: Make sync table
|
||||
makeDynamicSyncTable.md: Make dynamic sync table
|
||||
makeMetadataFormula.md: Make metadata formula
|
||||
makeEmptyFormula.md: Make empty formula
|
||||
makeAttributionNode.md: Make attribution node
|
||||
makeReferenceSchemaFromObjectSchema.md: Make reference schema
|
||||
makeTranslateObjectFormula.md: Make translate object formula
|
||||
makeSimpleAutocompleteMetadataFormula.md: Simple autocomplete metadata
|
||||
simpleAutocomplete.md: Simple autocomplete
|
||||
autocompleteSearchObjects.md: Autocomplete search objects
|
||||
generateSchema.md: Generate schema
|
||||
getEffectivePropertyKeysFromSchema.md: Get effective property keys
|
||||
joinUrl.md: Join URL
|
||||
getQueryParams.md: Get query params
|
||||
withQueryParams.md: With query params
|
||||
withIdentity.md: With identity
|
||||
assertCondition.md: Assert condition
|
||||
ensureExists.md: Ensure exists
|
||||
ensureNonEmptyString.md: Ensure non-empty string
|
||||
ensureUnreachable.md: Ensure unreachable
|
||||
|
||||
# Interfaces (100+ interfaces)
|
||||
interfaces:
|
||||
# Core interfaces
|
||||
PackDefinition.md: Pack definition
|
||||
PackVersionDefinition.md: Pack version definition
|
||||
ExecutionContext.md: Execution context
|
||||
SyncExecutionContext.md: Sync execution context
|
||||
UpdateSyncExecutionContext.md: Update sync execution context
|
||||
Fetcher.md: Fetcher interface
|
||||
FetchRequest.md: Fetch request
|
||||
FetchResponse.md: Fetch response
|
||||
Network.md: Network interface
|
||||
TemporaryBlobStorage.md: Temporary blob storage
|
||||
InvocationLocation.md: Invocation location
|
||||
|
||||
# Formula interfaces
|
||||
BaseFormulaDef.md: Base formula definition
|
||||
CommonPackFormulaDef.md: Common pack formula definition
|
||||
PackFormulaDef.md: Pack formula definition
|
||||
ObjectArrayFormulaDef.md: Object array formula definition
|
||||
EmptyFormulaDef.md: Empty formula definition
|
||||
MetadataFormulaObjectResultType.md: Metadata formula result type
|
||||
|
||||
# Parameter interfaces
|
||||
ParamDef.md: Parameter definition
|
||||
RequiredParamDef.md: Required parameter
|
||||
OptionalParamDef.md: Optional parameter
|
||||
CustomAuthParameter.md: Custom auth parameter
|
||||
DynamicOptions.md: Dynamic options
|
||||
PropertyWithOptions.md: Property with options
|
||||
PropertyOptionsExecutionContext.md: Property options context
|
||||
|
||||
# Schema interfaces
|
||||
ObjectSchemaDefinition.md: Object schema definition
|
||||
ObjectSchemaProperty.md: Object schema property
|
||||
ArraySchema.md: Array schema
|
||||
BooleanSchema.md: Boolean schema
|
||||
NumericSchema.md: Numeric schema
|
||||
StringEmbedSchema.md: String embed schema
|
||||
SimpleStringSchema.md: Simple string schema
|
||||
StringWithOptionsSchema.md: String with options
|
||||
ImageSchema.md: Image schema
|
||||
LinkSchema.md: Link schema
|
||||
EmailSchema.md: Email schema
|
||||
CurrencySchema.md: Currency schema
|
||||
DurationSchema.md: Duration schema
|
||||
NumericDurationSchema.md: Numeric duration schema
|
||||
StringDateSchema.md: String date schema
|
||||
StringDateTimeSchema.md: String datetime schema
|
||||
StringTimeSchema.md: String time schema
|
||||
NumericDateSchema.md: Numeric date schema
|
||||
NumericDateTimeSchema.md: Numeric datetime schema
|
||||
NumericTimeSchema.md: Numeric time schema
|
||||
ProgressBarSchema.md: Progress bar schema
|
||||
ScaleSchema.md: Scale schema
|
||||
SliderSchema.md: Slider schema
|
||||
ArrayType.md: Array type
|
||||
Format.md: Format interface
|
||||
|
||||
# Authentication interfaces
|
||||
BaseAuthentication.md: Base authentication
|
||||
NoAuthentication.md: No authentication
|
||||
CustomAuthentication.md: Custom authentication
|
||||
CustomHeaderTokenAuthentication.md: Custom header token
|
||||
HeaderBearerTokenAuthentication.md: Header bearer token
|
||||
MultiHeaderTokenAuthentication.md: Multi-header token
|
||||
QueryParamTokenAuthentication.md: Query param token
|
||||
MultiQueryParamTokenAuthentication.md: Multi-query param token
|
||||
WebBasicAuthentication.md: Web basic auth
|
||||
OAuth2Authentication.md: OAuth2 authentication
|
||||
OAuth2ClientCredentialsAuthentication.md: OAuth2 client credentials
|
||||
CodaApiBearerTokenAuthentication.md: Coda API bearer token
|
||||
AWSAccessKeyAuthentication.md: AWS access key
|
||||
AWSAssumeRoleAuthentication.md: AWS assume role
|
||||
|
||||
# Sync table interfaces
|
||||
SyncTableDef.md: Sync table definition
|
||||
SyncTableOptions.md: Sync table options
|
||||
SyncFormulaDef.md: Sync formula definition
|
||||
SyncFormulaResult.md: Sync formula result
|
||||
DynamicSyncTableDef.md: Dynamic sync table definition
|
||||
DynamicSyncTableOptions.md: Dynamic sync table options
|
||||
SyncBase.md: Sync base
|
||||
SyncFull.md: Full sync
|
||||
SyncIncremental.md: Incremental sync
|
||||
SyncUpdate.md: Sync update
|
||||
UpdateSync.md: Update sync
|
||||
SyncUpdateResult.md: Sync update result
|
||||
SyncTableRelation.md: Sync table relation
|
||||
SyncCompletionMetadata.md: Sync completion metadata
|
||||
SyncCompletionMetadataIncomplete.md: Incomplete sync metadata
|
||||
|
||||
# Identity and indexing
|
||||
Identity.md: Identity interface
|
||||
IdentityDefinition.md: Identity definition
|
||||
PropertyIdentifierDetails.md: Property identifier details
|
||||
CustomIndexDefinition.md: Custom index definition
|
||||
CrawlStrategy.md: Crawl strategy
|
||||
|
||||
# Embedded content
|
||||
EmbeddedContentTool.md: Embedded content tool
|
||||
CopyableBlockEmbeddedContent.md: Copyable block content
|
||||
CarouselViewEmbeddedContent.md: Carousel view content
|
||||
TabViewEmbeddedContent.md: Tab view content
|
||||
|
||||
# Attribution
|
||||
ImageAttributionNode.md: Image attribution node
|
||||
LinkAttributionNode.md: Link attribution node
|
||||
TextAttributionNode.md: Text attribution node
|
||||
|
||||
# Tools and skills
|
||||
PackTool.md: Pack tool
|
||||
ContactResolutionTool.md: Contact resolution tool
|
||||
KnowledgeTool.md: Knowledge tool
|
||||
PackKnowledgeToolSource.md: Pack knowledge source
|
||||
ScreenAnnotationTool.md: Screen annotation tool
|
||||
RewriteScreenAnnotation.md: Rewrite screen annotation
|
||||
Skill.md: Skill interface
|
||||
SkillEntrypoints.md: Skill entrypoints
|
||||
SkillEntrypointConfig.md: Skill entrypoint config
|
||||
SkillModelConfiguration.md: Skill model configuration
|
||||
MCPServer.md: MCP server interface
|
||||
|
||||
# Validation and errors
|
||||
ParameterValidationDetail.md: Parameter validation detail
|
||||
ValidParameterValidationResult.md: Valid parameter validation
|
||||
InvalidParameterValidationResult.md: Invalid parameter validation
|
||||
StatusCodeErrorResponse.md: Status code error response
|
||||
|
||||
# Post-setup and endpoints
|
||||
SetEndpoint.md: Set endpoint
|
||||
RequestHandlerTemplate.md: Request handler template
|
||||
ResponseHandlerTemplate.md: Response handler template
|
||||
|
||||
# Autocomplete
|
||||
SimpleAutocompleteOption.md: Simple autocomplete option
|
||||
|
||||
# Continuation
|
||||
Continuation.md: Continuation interface
|
||||
|
||||
# Type aliases (100+ type aliases)
|
||||
type-aliases:
|
||||
# Formula type aliases
|
||||
Formula.md: Formula type
|
||||
BaseFormula.md: Base formula
|
||||
PackFormulaResult.md: Pack formula result
|
||||
PackFormulaValue.md: Pack formula value
|
||||
StringFormulaDef.md: String formula definition
|
||||
NumericFormulaDef.md: Numeric formula definition
|
||||
BooleanFormulaDef.md: Boolean formula definition
|
||||
ArrayFormulaDef.md: Array formula definition
|
||||
ObjectFormulaDef.md: Object formula definition
|
||||
TypedPackFormula.md: Typed pack formula
|
||||
StringPackFormula.md: String pack formula
|
||||
NumericPackFormula.md: Numeric pack formula
|
||||
BooleanPackFormula.md: Boolean pack formula
|
||||
ObjectPackFormula.md: Object pack formula
|
||||
|
||||
# Schema type aliases
|
||||
Schema.md: Schema type
|
||||
SchemaType.md: Schema type enum
|
||||
NumberSchema.md: Number schema
|
||||
StringSchema.md: String schema
|
||||
StringHintTypes.md: String hint types
|
||||
NumberHintTypes.md: Number hint types
|
||||
BooleanHintTypes.md: Boolean hint types
|
||||
ObjectHintTypes.md: Object hint types
|
||||
ObjectSchemaProperties.md: Object schema properties
|
||||
PropertySchemaOptions.md: Property schema options
|
||||
|
||||
# Sync table type aliases
|
||||
SyncTable.md: Sync table
|
||||
GenericSyncTable.md: Generic sync table
|
||||
GenericDynamicSyncTable.md: Generic dynamic sync table
|
||||
SyncFormula.md: Sync formula
|
||||
GenericSyncFormula.md: Generic sync formula
|
||||
GenericSyncFormulaResult.md: Generic sync formula result
|
||||
Sync.md: Sync type
|
||||
SyncCompletionMetadataResult.md: Sync completion metadata result
|
||||
GenericSyncUpdate.md: Generic sync update
|
||||
GenericSyncUpdateSingleResult.md: Generic sync update single
|
||||
SyncUpdateSingleResult.md: Sync update single result
|
||||
|
||||
# Authentication type aliases
|
||||
Authentication.md: Authentication type
|
||||
AuthenticationDef.md: Authentication definition
|
||||
SystemAuthentication.md: System authentication
|
||||
SystemAuthenticationDef.md: System authentication definition
|
||||
UserAuthenticationDef.md: User authentication definition
|
||||
|
||||
# Metadata type aliases
|
||||
MetadataFormula.md: Metadata formula
|
||||
MetadataFormulaDef.md: Metadata formula definition
|
||||
MetadataFormulaResultType.md: Metadata formula result
|
||||
MetadataFunction.md: Metadata function
|
||||
MetadataContext.md: Metadata context
|
||||
LegacyDefaultMetadataReturnType.md: Legacy metadata return
|
||||
PropertyOptionsMetadataFunction.md: Property options metadata function
|
||||
PropertyOptionsMetadataResult.md: Property options metadata result
|
||||
|
||||
# Parameter type aliases
|
||||
ParamDefs.md: Parameter definitions
|
||||
ParamValues.md: Parameter values
|
||||
ParameterOptions.md: Parameter options
|
||||
ParameterValidationResult.md: Parameter validation result
|
||||
ParamDefFromOptionsUnion.md: Param def from options
|
||||
SuggestedValueType.md: Suggested value type
|
||||
|
||||
# Pack definition type aliases
|
||||
BasicPackDefinition.md: Basic pack definition
|
||||
PackId.md: Pack ID
|
||||
|
||||
# Error type aliases
|
||||
InvocationError.md: Invocation error
|
||||
HttpStatusInvocationError.md: HTTP status error
|
||||
TimeoutInvocationError.md: Timeout error
|
||||
RateLimitExceededInvocationError.md: Rate limit error
|
||||
ResponseTooLargeInvocationError.md: Response too large error
|
||||
UnknownInvocationError.md: Unknown error
|
||||
|
||||
# Formula options type aliases
|
||||
FormulaDefinitionOptions.md: Formula definition options
|
||||
FormulaOptions.md: Formula options
|
||||
|
||||
# Post-setup type aliases
|
||||
PostSetup.md: Post-setup type
|
||||
PostSetupDef.md: Post-setup definition
|
||||
SetEndpointDef.md: Set endpoint definition
|
||||
|
||||
# Attribution type aliases
|
||||
AttributionNode.md: Attribution node
|
||||
|
||||
# Embedded content type aliases
|
||||
EmbeddedContent.md: Embedded content type
|
||||
|
||||
# Indexing type aliases
|
||||
IndexDefinition.md: Index definition
|
||||
BasicIndexedProperty.md: Basic indexed property
|
||||
IndexedProperty.md: Indexed property
|
||||
FilterableProperty.md: Filterable property
|
||||
PropertyIdentifier.md: Property identifier
|
||||
|
||||
# Context type aliases
|
||||
ContextProperties.md: Context properties
|
||||
|
||||
# Screen annotation type aliases
|
||||
ScreenAnnotation.md: Screen annotation
|
||||
|
||||
# Knowledge tool type aliases
|
||||
KnowledgeToolSource.md: Knowledge tool source
|
||||
|
||||
# Skills type aliases
|
||||
PartialSkillDef.md: Partial skill definition
|
||||
|
||||
# Fetch type aliases
|
||||
FetchMethodType.md: Fetch method type
|
||||
|
||||
# Inference type aliases
|
||||
InferrableTypes.md: Inferrable types
|
||||
|
||||
# Variables
|
||||
variables:
|
||||
PropertyLabelValueTemplate.md: Property label value template
|
||||
ValidFetchMethods.md: Valid fetch methods
|
||||
|
||||
# Namespaces
|
||||
namespaces:
|
||||
SvgConstants:
|
||||
index.md: SVG constants
|
||||
variables:
|
||||
DataUrlPrefix.md: Data URL prefix
|
||||
DataUrlPrefixWithDarkModeSupport.md: Data URL with dark mode
|
||||
DarkModeFragmentId.md: Dark mode fragment ID
|
||||
|
||||
# Testing SDK
|
||||
testing:
|
||||
index.md: Testing SDK index
|
||||
|
||||
# Testing functions
|
||||
functions:
|
||||
executeFormulaFromPackDef.md: Execute formula from pack
|
||||
executeFormulaOrSyncWithVM.md: Execute with VM
|
||||
executeSyncFormula.md: Execute sync formula
|
||||
executeSyncFormulaFromPackDef.md: Execute sync from pack
|
||||
executeSyncFormulaFromPackDefSingleIteration.md: Execute single iteration
|
||||
executeMetadataFormula.md: Execute metadata formula
|
||||
newMockExecutionContext.md: New mock execution context
|
||||
newMockSyncExecutionContext.md: New mock sync context
|
||||
newRealFetcherExecutionContext.md: New real fetcher context
|
||||
newRealFetcherSyncExecutionContext.md: New real fetcher sync context
|
||||
newJsonFetchResponse.md: New JSON fetch response
|
||||
|
||||
# Testing interfaces
|
||||
interfaces:
|
||||
MockExecutionContext.md: Mock execution context
|
||||
MockSyncExecutionContext.md: Mock sync execution context
|
||||
ExecuteOptions.md: Execute options
|
||||
ContextOptions.md: Context options
|
||||
|
||||
# Testing type aliases
|
||||
type-aliases:
|
||||
SyncExecutionContextAsMock.md: Sync execution context as mock
|
||||
|
||||
# Support
|
||||
support:
|
||||
index.md: Support index
|
||||
faq.md: Frequently asked questions
|
||||
errors.md: Common errors
|
||||
changes.md: Changelog
|
||||
contributing:
|
||||
index.md: Contributing guide
|
||||
style.md: Style guide
|
||||
migration:
|
||||
index.md: Migration guide
|
||||
v0.11.0.md: Migrate to v0.11.0
|
||||
|
||||
# Quick reference paths
|
||||
quick_paths:
|
||||
# Getting started
|
||||
getting_started: docs/tutorials/get-started/web.md
|
||||
overview: docs/guides/overview.md
|
||||
|
||||
# Core building blocks
|
||||
formulas: docs/guides/blocks/formulas.md
|
||||
actions: docs/guides/blocks/actions.md
|
||||
sync_tables: docs/guides/blocks/sync-tables/index.md
|
||||
dynamic_sync_tables: docs/guides/blocks/sync-tables/dynamic.md
|
||||
two_way_sync: docs/guides/blocks/sync-tables/two-way.md
|
||||
column_formats: docs/guides/blocks/column-formats.md
|
||||
cards: docs/guides/blocks/cards.md
|
||||
|
||||
# Basics
|
||||
authentication: docs/guides/basics/authentication/index.md
|
||||
oauth2: docs/guides/basics/authentication/oauth2.md
|
||||
fetcher: docs/guides/basics/fetcher.md
|
||||
data_types: docs/guides/basics/data-types.md
|
||||
parameters: docs/guides/basics/parameters/index.md
|
||||
autocomplete: docs/guides/basics/parameters/autocomplete.md
|
||||
|
||||
# Advanced
|
||||
schemas: docs/guides/advanced/schemas.md
|
||||
caching: docs/guides/advanced/caching.md
|
||||
errors: docs/guides/advanced/errors.md
|
||||
images: docs/guides/advanced/images.md
|
||||
embeds: docs/guides/advanced/embeds.md
|
||||
timezones: docs/guides/advanced/timezones.md
|
||||
|
||||
# Development
|
||||
cli: docs/guides/development/cli.md
|
||||
testing: docs/guides/development/testing.md
|
||||
troubleshooting: docs/guides/development/troubleshooting.md
|
||||
libraries: docs/guides/development/libraries.md
|
||||
versions: docs/guides/development/versions.md
|
||||
|
||||
# SDK Reference
|
||||
sdk_core: docs/reference/sdk/core/index.md
|
||||
sdk_testing: docs/reference/sdk/testing/index.md
|
||||
new_pack: docs/reference/sdk/core/functions/newPack.md
|
||||
make_formula: docs/reference/sdk/core/functions/makeFormula.md
|
||||
make_sync_table: docs/reference/sdk/core/functions/makeSyncTable.md
|
||||
make_dynamic_sync_table: docs/reference/sdk/core/functions/makeDynamicSyncTable.md
|
||||
|
||||
# Samples
|
||||
samples_index: docs/samples/index.md
|
||||
hello_world: docs/samples/full/hello-world.md
|
||||
formula_samples: docs/samples/topic/formula.md
|
||||
sync_table_samples: docs/samples/topic/sync-table.md
|
||||
auth_samples: docs/samples/topic/authentication.md
|
||||
|
||||
# Support
|
||||
faq: docs/support/faq.md
|
||||
best_practices: docs/guides/best-practices.md
|
||||
design: docs/guides/design.md
|
||||
|
||||
# Statistics
|
||||
total_files: 370
|
||||
total_directories: 40
|
||||
Loading…
Reference in New Issue