@robinpath/todoist
Advanced tools
| import type { ModuleAdapter } from "@robinpath/core"; | ||
| declare const TodoistModule: ModuleAdapter; | ||
| export default TodoistModule; | ||
| export { TodoistModule }; | ||
| export { TodoistFunctions, TodoistFunctionMetadata, TodoistModuleMetadata, TodoistCredentialTypes, } from "./todoist.js"; | ||
| //# sourceMappingURL=index.d.ts.map |
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AASrD,QAAA,MAAM,aAAa,EAAE,aAQpB,CAAC;AAEF,eAAe,aAAa,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,cAAc,CAAC"} |
| import { TodoistFunctions, TodoistFunctionMetadata, TodoistModuleMetadata, TodoistCredentialTypes, configureTodoist, } from "./todoist.js"; | ||
| const TodoistModule = { | ||
| name: "todoist", | ||
| functions: TodoistFunctions, | ||
| functionMetadata: TodoistFunctionMetadata, | ||
| moduleMetadata: TodoistModuleMetadata, | ||
| credentialTypes: TodoistCredentialTypes, | ||
| configure: configureTodoist, | ||
| global: false, | ||
| }; | ||
| export default TodoistModule; | ||
| export { TodoistModule }; | ||
| export { TodoistFunctions, TodoistFunctionMetadata, TodoistModuleMetadata, TodoistCredentialTypes, } from "./todoist.js"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAEtB,MAAM,aAAa,GAAkB;IACnC,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,gBAAgB;IAC3B,gBAAgB,EAAE,uBAAuB;IACzC,cAAc,EAAE,qBAAqB;IACrC,eAAe,EAAE,sBAAsB;IACvC,SAAS,EAAE,gBAAgB;IAC3B,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,eAAe,aAAa,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,cAAc,CAAC"} |
| /** | ||
| * RobinPath Todoist Module (Node port) | ||
| * | ||
| * Todoist REST API v2 — projects, tasks, labels. Mirror of the canonical | ||
| * credential-vault adapter shape so the visual editor renders it | ||
| * identically to every other module. | ||
| * | ||
| * Authentication is a simple bearer token (the per-user API token shown | ||
| * at todoist.com/prefs/integrations/developer). There is no OAuth | ||
| * refresh; if the token is revoked the caller must mint a new one. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - todoist : { api_token } | ||
| */ | ||
| import type { BuiltinHandler, CredentialTypeSchema, FunctionMetadata, ModuleHost, ModuleMetadata } from "@robinpath/core"; | ||
| export declare function configureTodoist(h: ModuleHost): void; | ||
| export declare const TodoistFunctions: Record<string, BuiltinHandler>; | ||
| export declare const TodoistCredentialTypes: CredentialTypeSchema[]; | ||
| export declare const TodoistFunctionMetadata: Record<string, FunctionMetadata>; | ||
| export declare const TodoistModuleMetadata: ModuleMetadata; | ||
| //# sourceMappingURL=todoist.d.ts.map |
| {"version":3,"file":"todoist.d.ts","sourceRoot":"","sources":["../src/todoist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAezB,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAEpD;AAiOD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAM3D,CAAC;AAIF,eAAO,MAAM,sBAAsB,EAAE,oBAAoB,EAiBxD,CAAC;AA8CF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAqIpE,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,cAoBnC,CAAC"} |
+392
| /** | ||
| * RobinPath Todoist Module (Node port) | ||
| * | ||
| * Todoist REST API v2 — projects, tasks, labels. Mirror of the canonical | ||
| * credential-vault adapter shape so the visual editor renders it | ||
| * identically to every other module. | ||
| * | ||
| * Authentication is a simple bearer token (the per-user API token shown | ||
| * at todoist.com/prefs/integrations/developer). There is no OAuth | ||
| * refresh; if the token is revoked the caller must mint a new one. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - todoist : { api_token } | ||
| */ | ||
| // ── Module-local state (populated by configure hook) ──────────────────── | ||
| const state = {}; | ||
| function host() { | ||
| if (!state.host) { | ||
| throw new Error("Todoist module not initialized. Pass the adapter to rp.installModule() so its configure() hook runs first."); | ||
| } | ||
| return state.host; | ||
| } | ||
| export function configureTodoist(h) { | ||
| state.host = h; | ||
| } | ||
| // ── Constants ────────────────────────────────────────────────────────── | ||
| const API_BASE = "https://api.todoist.com/rest/v2/"; | ||
| const CREDENTIAL_TYPE = "todoist"; | ||
| function errorReturn(error, code, extra = {}) { | ||
| return { error, code, ...extra }; | ||
| } | ||
| // ── Credential resolver ──────────────────────────────────────────────── | ||
| async function resolveToken(credentialSlug) { | ||
| if (!credentialSlug) { | ||
| return errorReturn("Credential slug is required.", "credential_not_found"); | ||
| } | ||
| let fields; | ||
| try { | ||
| fields = await host().credentials.get(credentialSlug); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "credential_not_found"); | ||
| } | ||
| if (!fields) { | ||
| return errorReturn(`Credential '${credentialSlug}' not found.`, "credential_not_found"); | ||
| } | ||
| const token = String(fields.api_token ?? fields.token ?? ""); | ||
| if (!token) { | ||
| return errorReturn("Credential has no `api_token` field.", "token_missing"); | ||
| } | ||
| return { token }; | ||
| } | ||
| // ── HTTP helper (normalized envelope, never throws for API errors) ───── | ||
| async function http(token, method, pathAndQuery, body) { | ||
| const headers = { | ||
| Authorization: `Bearer ${token}`, | ||
| Accept: "application/json", | ||
| }; | ||
| if (body !== undefined && body !== null) { | ||
| headers["Content-Type"] = "application/json"; | ||
| } | ||
| const init = { method, headers }; | ||
| if (body !== undefined && body !== null) { | ||
| init.body = JSON.stringify(body); | ||
| } | ||
| let response; | ||
| try { | ||
| response = await fetch(`${API_BASE}${pathAndQuery.replace(/^\/+/, "")}`, init); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const raw = await response.text(); | ||
| // Todoist returns 204 No Content for deletes and close/reopen. | ||
| if (response.status === 204 || raw === "") { | ||
| if (response.status >= 200 && response.status < 300) { | ||
| return { ok: true }; | ||
| } | ||
| } | ||
| let decoded; | ||
| try { | ||
| decoded = raw ? JSON.parse(raw) : null; | ||
| } | ||
| catch { | ||
| decoded = { raw: raw.slice(0, 500) }; | ||
| } | ||
| if (response.status >= 200 && response.status < 300) { | ||
| return decoded ?? { ok: true }; | ||
| } | ||
| let message = `Todoist returned HTTP ${response.status}.`; | ||
| if (decoded && typeof decoded === "object") { | ||
| const d = decoded; | ||
| if (typeof d.error === "string") | ||
| message = d.error; | ||
| else if (typeof d.message === "string") | ||
| message = d.message; | ||
| } | ||
| else if (typeof raw === "string" && raw.length > 0 && raw.length < 500) { | ||
| message = raw; | ||
| } | ||
| let code = "todoist_error"; | ||
| if (response.status === 429) | ||
| code = "rate_limited"; | ||
| else if (response.status === 404) | ||
| code = "not_found"; | ||
| else if (response.status === 403 || response.status === 401) | ||
| code = "unauthorized"; | ||
| return errorReturn(message, code, { | ||
| status: response.status, | ||
| todoist_error: decoded, | ||
| }); | ||
| } | ||
| // ── Helpers ──────────────────────────────────────────────────────────── | ||
| function asString(v) { | ||
| if (v === undefined || v === null) | ||
| return ""; | ||
| return String(v); | ||
| } | ||
| function asOpts(v) { | ||
| return v && typeof v === "object" && !Array.isArray(v) | ||
| ? v | ||
| : {}; | ||
| } | ||
| function buildQuery(opts) { | ||
| const params = new URLSearchParams(); | ||
| for (const [k, v] of Object.entries(opts)) { | ||
| if (v === undefined || v === null || v === "") | ||
| continue; | ||
| if (Array.isArray(v)) { | ||
| params.set(k, v.map((x) => String(x)).join(",")); | ||
| } | ||
| else { | ||
| params.set(k, String(v)); | ||
| } | ||
| } | ||
| const qs = params.toString(); | ||
| return qs ? `?${qs}` : ""; | ||
| } | ||
| // ── Handlers: Projects ───────────────────────────────────────────────── | ||
| const listProjects = async (args) => { | ||
| const cred = asString(args[0]); | ||
| const resolved = await resolveToken(cred); | ||
| if ("error" in resolved) | ||
| return resolved; | ||
| return (await http(resolved.token, "GET", "projects")); | ||
| }; | ||
| // ── Handlers: Tasks ──────────────────────────────────────────────────── | ||
| const listTasks = async (args) => { | ||
| const cred = asString(args[0]); | ||
| const opts = asOpts(args[1]); | ||
| const resolved = await resolveToken(cred); | ||
| if ("error" in resolved) | ||
| return resolved; | ||
| return (await http(resolved.token, "GET", `tasks${buildQuery(opts)}`)); | ||
| }; | ||
| const createTask = async (args) => { | ||
| const cred = asString(args[0]); | ||
| const input = args[1]; | ||
| if (!input || typeof input !== "object") { | ||
| return errorReturn("`task` payload is required (object).", "fields_missing"); | ||
| } | ||
| const resolved = await resolveToken(cred); | ||
| if ("error" in resolved) | ||
| return resolved; | ||
| return (await http(resolved.token, "POST", "tasks", input)); | ||
| }; | ||
| /** | ||
| * Todoist has two distinct "finish a task" endpoints: | ||
| * - POST /tasks/{id}/close : mark a single recurring instance complete (recurring tasks roll to next date) | ||
| * - POST /tasks/{id}/close is the completeTask alias; we expose both names for clarity. | ||
| */ | ||
| const completeTask = async (args) => { | ||
| const cred = asString(args[0]); | ||
| const id = asString(args[1]); | ||
| if (!id) { | ||
| return errorReturn("`taskId` is required.", "task_id_missing"); | ||
| } | ||
| const resolved = await resolveToken(cred); | ||
| if ("error" in resolved) | ||
| return resolved; | ||
| return (await http(resolved.token, "POST", `tasks/${encodeURIComponent(id)}/close`)); | ||
| }; | ||
| const closeTask = async (args) => { | ||
| // Alias for completeTask — same endpoint, idiomatic name preserved. | ||
| return completeTask(args); | ||
| }; | ||
| // ── Exports: functions map ───────────────────────────────────────────── | ||
| export const TodoistFunctions = { | ||
| listProjects, | ||
| listTasks, | ||
| createTask, | ||
| completeTask, | ||
| closeTask, | ||
| }; | ||
| // ── Exports: credential types ────────────────────────────────────────── | ||
| export const TodoistCredentialTypes = [ | ||
| { | ||
| slug: CREDENTIAL_TYPE, | ||
| title: "Todoist (API Token)", | ||
| icon: "check-square", | ||
| fields: [ | ||
| { | ||
| name: "api_token", | ||
| title: "API Token", | ||
| type: "password", | ||
| required: true, | ||
| placeholder: "0123456789abcdef…", | ||
| description: "Your per-user token from todoist.com/app/settings/integrations/developer. Treat it like a password — it has full access to your account.", | ||
| }, | ||
| ], | ||
| }, | ||
| ]; | ||
| // ── Exports: metadata ────────────────────────────────────────────────── | ||
| const credentialParam = { | ||
| name: "credential", | ||
| title: "Credential", | ||
| description: "Slug of a saved `todoist` credential.", | ||
| dataType: "string", | ||
| formInputType: "resource", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "my_todoist", | ||
| resource: { | ||
| type: "credential", | ||
| listFn: "credential.list", | ||
| modes: ["list", "expression"], | ||
| searchable: true, | ||
| filter: { type: CREDENTIAL_TYPE }, | ||
| }, | ||
| }; | ||
| const taskIdParam = { | ||
| name: "taskId", | ||
| title: "Task ID", | ||
| description: "Todoist task ID (numeric string).", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "2995104339", | ||
| }; | ||
| const commonErrors = { | ||
| credential_not_found: "No credential with that slug exists in the vault.", | ||
| token_missing: "The credential exists but has no `api_token` field.", | ||
| fields_missing: "Payload is required.", | ||
| task_id_missing: "Task ID is required.", | ||
| transport: "Network failure calling api.todoist.com.", | ||
| todoist_error: "Todoist returned an error — see `todoist_error` for detail.", | ||
| rate_limited: "Todoist rate limited the request (450 req/15 min per user).", | ||
| not_found: "Project or task not found.", | ||
| unauthorized: "Todoist rejected the token — re-issue from the developer settings page.", | ||
| }; | ||
| export const TodoistFunctionMetadata = { | ||
| listProjects: { | ||
| title: "List projects", | ||
| summary: "List all projects visible to this token", | ||
| description: "Calls `GET /projects`. Returns every project, shared or personal.", | ||
| group: "projects", | ||
| action: "query", | ||
| icon: "folder", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["todoist", "project", "list"], | ||
| parameters: [credentialParam], | ||
| returnType: "array", | ||
| returnDescription: "Array of project objects: { id, name, color, parent_id, order, comment_count, is_shared, is_favorite, is_inbox_project, url }", | ||
| errors: commonErrors, | ||
| example: 'todoist.listProjects "my_todoist"', | ||
| }, | ||
| listTasks: { | ||
| title: "List tasks", | ||
| summary: "List active (non-completed) tasks with optional filters", | ||
| description: "Calls `GET /tasks`. Filter with `project_id`, `section_id`, `label`, `ids` (comma list) or a `filter` query (e.g. `today`, `overdue`, `@work`). Does NOT return completed tasks.", | ||
| group: "tasks", | ||
| action: "query", | ||
| icon: "list", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["todoist", "task", "list"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "options", | ||
| title: "Filters", | ||
| description: "Recognized keys:\n project_id : scope to one project\n section_id : scope to one section\n label : scope to one label name\n ids : comma-separated task IDs\n filter : Todoist filter query, e.g. 'today', 'overdue', '@work'\n lang : language for the filter query (default 'en')", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "array", | ||
| returnDescription: "Array of task objects: { id, project_id, section_id, content, description, is_completed, labels, priority, due, url, comment_count, ... }", | ||
| errors: commonErrors, | ||
| example: 'todoist.listTasks "my_todoist" {filter: "today"}', | ||
| }, | ||
| createTask: { | ||
| title: "Create task", | ||
| summary: "Create a new task", | ||
| description: "Calls `POST /tasks`. Minimum required field: `content` (the task title). Use `due_string` for natural-language due dates like 'tomorrow at 3pm'.", | ||
| group: "tasks", | ||
| action: "write", | ||
| icon: "plus", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["todoist", "task", "create"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "task", | ||
| title: "Task payload", | ||
| description: "Key fields:\n content : required — the task title\n description : markdown body\n project_id : target project (defaults to Inbox)\n section_id : target section\n parent_id : for sub-tasks\n labels : [string] label names\n priority : 1 (normal) … 4 (urgent)\n due_string : 'tomorrow at 3pm' — natural language\n due_date : 'YYYY-MM-DD'\n due_datetime : RFC 3339\n assignee_id : numeric user id (shared projects only)", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 8, | ||
| placeholder: '{\n "content": "Ship the release",\n "due_string": "tomorrow at 9am",\n "priority": 3\n}', | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "The created task object with assigned `id`.", | ||
| errors: commonErrors, | ||
| example: 'todoist.createTask "my_todoist" {content: "Buy milk", due_string: "tomorrow"}', | ||
| }, | ||
| completeTask: { | ||
| title: "Complete task", | ||
| summary: "Mark a task as complete", | ||
| description: "Calls `POST /tasks/{id}/close`. For recurring tasks, this advances to the next occurrence rather than fully archiving the series.", | ||
| group: "tasks", | ||
| action: "write", | ||
| icon: "check", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["todoist", "task", "complete"], | ||
| parameters: [credentialParam, taskIdParam], | ||
| returnType: "object", | ||
| returnDescription: "{ ok: true }", | ||
| errors: commonErrors, | ||
| example: 'todoist.completeTask "my_todoist" "2995104339"', | ||
| }, | ||
| closeTask: { | ||
| title: "Close task", | ||
| summary: "Alias for completeTask", | ||
| description: "Same as `completeTask` — posts to `/tasks/{id}/close`. Kept as a separate name for scripts that read more naturally with 'close'.", | ||
| group: "tasks", | ||
| action: "write", | ||
| icon: "check-circle", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["todoist", "task", "close"], | ||
| parameters: [credentialParam, taskIdParam], | ||
| returnType: "object", | ||
| returnDescription: "{ ok: true }", | ||
| errors: commonErrors, | ||
| example: 'todoist.closeTask "my_todoist" "2995104339"', | ||
| }, | ||
| }; | ||
| export const TodoistModuleMetadata = { | ||
| slug: "todoist", | ||
| title: "Todoist", | ||
| summary: "List projects/tasks and create/complete tasks in Todoist", | ||
| description: "Todoist REST API v2 — projects and tasks. Bearer-token auth with the per-user API token from todoist.com/app/settings/integrations/developer.\n\nFor operations not covered here (sections, labels, comments, filters, sync API) drop to `http.*` with the same credential via `credential.field`.", | ||
| category: "productivity", | ||
| icon: "icon.svg", | ||
| color: "#E44332", | ||
| version: "0.2.0", | ||
| docsUrl: "https://docs.robinpath.com/modules/todoist", | ||
| status: "stable", | ||
| requires: [], | ||
| minNodeVersion: "18.0.0", | ||
| credentialsType: CREDENTIAL_TYPE, | ||
| operationGroups: { | ||
| projects: { title: "Projects", description: "Project enumeration.", order: 1 }, | ||
| tasks: { title: "Tasks", description: "Task CRUD and completion.", order: 2 }, | ||
| }, | ||
| methods: Object.keys(TodoistFunctions), | ||
| }; | ||
| //# sourceMappingURL=todoist.js.map |
| {"version":3,"file":"todoist.js","sourceRoot":"","sources":["../src/todoist.ts"],"names":[],"mappings":"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"} |
+19
-10
| { | ||
| "name": "@robinpath/todoist", | ||
| "version": "0.1.1", | ||
| "version": "0.3.0", | ||
| "publishConfig": { | ||
@@ -23,21 +23,30 @@ "access": "public" | ||
| "peerDependencies": { | ||
| "@robinpath/core": ">=0.20.0" | ||
| "@robinpath/core": ">=0.40.0" | ||
| }, | ||
| "devDependencies": { | ||
| "@robinpath/core": "^0.30.1", | ||
| "@robinpath/core": "^0.40.0", | ||
| "typescript": "^5.6.0" | ||
| }, | ||
| "description": "Todoist module for RobinPath.", | ||
| "description": "Todoist REST API v2 — projects and tasks. Bearer-token auth via the encrypted credential vault.", | ||
| "keywords": [ | ||
| "todoist", | ||
| "project management" | ||
| "productivity", | ||
| "tasks", | ||
| "projects" | ||
| ], | ||
| "license": "MIT", | ||
| "robinpath": { | ||
| "category": "project-management", | ||
| "type": "integration", | ||
| "auth": "api-key", | ||
| "functionCount": 18, | ||
| "baseUrl": "https://api.todoist.com" | ||
| "category": "productivity", | ||
| "type": "module", | ||
| "auth": "credential-vault", | ||
| "credentialType": "todoist", | ||
| "functionCount": 5, | ||
| "baseUrl": "https://api.todoist.com/rest/v2", | ||
| "language": "nodejs", | ||
| "platforms": [ | ||
| "cloud", | ||
| "cli", | ||
| "desktop" | ||
| ] | ||
| } | ||
| } |
+1
-1
@@ -22,3 +22,3 @@ # @robinpath/todoist | ||
| ```bash | ||
| npm install @robinpath/todoist | ||
| robinpath add @robinpath/todoist | ||
| ``` | ||
@@ -25,0 +25,0 @@ |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Empty package
Supply chain riskPackage does not contain any code. It may be removed, is name squatting, or the result of a faulty package publish.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
34213
823.43%10
400%431
Infinity%2
100%