🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@robinpath/todoist

Package Overview
Dependencies
Maintainers
4
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@robinpath/todoist - npm Package Compare versions

Comparing version
0.1.1
to
0.3.0
+6
dist/index.d.ts
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"}
/**
* 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"
]
}
}

@@ -22,3 +22,3 @@ # @robinpath/todoist

```bash
npm install @robinpath/todoist
robinpath add @robinpath/todoist
```

@@ -25,0 +25,0 @@