n8n-nodes-orboto 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +107 -0
- package/dist/credentials/orbotoApi.credentials.d.ts +34 -0
- package/dist/credentials/orbotoApi.credentials.js +76 -0
- package/dist/credentials/orbotoApi.credentials.js.map +1 -0
- package/dist/credentials/orbotoOAuth2Api.credentials.d.ts +10 -0
- package/dist/credentials/orbotoOAuth2Api.credentials.js +73 -0
- package/dist/credentials/orbotoOAuth2Api.credentials.js.map +1 -0
- package/dist/nodes/index.d.ts +2 -0
- package/dist/nodes/index.js +19 -0
- package/dist/nodes/index.js.map +1 -0
- package/dist/nodes/orboto/orboto.node.d.ts +18 -0
- package/dist/nodes/orboto/orboto.node.js +192 -0
- package/dist/nodes/orboto/orboto.node.js.map +1 -0
- package/dist/nodes/orboto/orboto.svg +4 -0
- package/dist/nodes/orboto/orbotoTrigger.node.d.ts +19 -0
- package/dist/nodes/orboto/orbotoTrigger.node.js +243 -0
- package/dist/nodes/orboto/orbotoTrigger.node.js.map +1 -0
- package/dist/nodes/orboto/orbotoTrigger.svg +4 -0
- package/dist/nodes/orboto/resources/agent/agent.resource.d.ts +7 -0
- package/dist/nodes/orboto/resources/agent/agent.resource.js +183 -0
- package/dist/nodes/orboto/resources/agent/agent.resource.js.map +1 -0
- package/dist/nodes/orboto/resources/doc/doc.resource.d.ts +3 -0
- package/dist/nodes/orboto/resources/doc/doc.resource.js +206 -0
- package/dist/nodes/orboto/resources/doc/doc.resource.js.map +1 -0
- package/dist/nodes/orboto/resources/milestone/milestone.resource.d.ts +3 -0
- package/dist/nodes/orboto/resources/milestone/milestone.resource.js +197 -0
- package/dist/nodes/orboto/resources/milestone/milestone.resource.js.map +1 -0
- package/dist/nodes/orboto/resources/misc/misc.resources.d.ts +8 -0
- package/dist/nodes/orboto/resources/misc/misc.resources.js +232 -0
- package/dist/nodes/orboto/resources/misc/misc.resources.js.map +1 -0
- package/dist/nodes/orboto/resources/project/project.resource.d.ts +3 -0
- package/dist/nodes/orboto/resources/project/project.resource.js +144 -0
- package/dist/nodes/orboto/resources/project/project.resource.js.map +1 -0
- package/dist/nodes/orboto/resources/ticket/Ticket.resource.d.ts +11 -0
- package/dist/nodes/orboto/resources/ticket/Ticket.resource.js +1072 -0
- package/dist/nodes/orboto/resources/ticket/Ticket.resource.js.map +1 -0
- package/dist/nodes/orboto/resources/time/time.resource.d.ts +3 -0
- package/dist/nodes/orboto/resources/time/time.resource.js +140 -0
- package/dist/nodes/orboto/resources/time/time.resource.js.map +1 -0
- package/dist/nodes/orboto/shared/ApiClient.d.ts +97 -0
- package/dist/nodes/orboto/shared/ApiClient.js +261 -0
- package/dist/nodes/orboto/shared/ApiClient.js.map +1 -0
- package/dist/nodes/orboto/shared/GenericFunctions.d.ts +47 -0
- package/dist/nodes/orboto/shared/GenericFunctions.js +186 -0
- package/dist/nodes/orboto/shared/GenericFunctions.js.map +1 -0
- package/dist/nodes/orboto/shared/Types.d.ts +54 -0
- package/dist/nodes/orboto/shared/Types.js +10 -0
- package/dist/nodes/orboto/shared/Types.js.map +1 -0
- package/dist/nodes/orboto/shared/loadOptions.d.ts +17 -0
- package/dist/nodes/orboto/shared/loadOptions.js +85 -0
- package/dist/nodes/orboto/shared/loadOptions.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { IExecuteFunctions, IHttpRequestOptions, INode, INodeExecutionData } from 'n8n-workflow';
|
|
2
|
+
import { ApiClient } from './ApiClient';
|
|
3
|
+
import type { QueryValue } from './Types';
|
|
4
|
+
/** Resolves the credential type from the Authentication parameter (apiKey | oauth). */
|
|
5
|
+
export declare function credentialTypeOf(context: {
|
|
6
|
+
getNodeParameter(name: string, itemIndex?: number, fallback?: unknown): unknown;
|
|
7
|
+
}): 'orbotoApi' | 'orbotoOAuth2Api';
|
|
8
|
+
/** Builds the shared API client from the node's orboto credential (API key or OAuth2). */
|
|
9
|
+
export declare function getClient(executeContext: IExecuteFunctions): Promise<ApiClient>;
|
|
10
|
+
/** Client for loadOptions methods (same transport, different context type). */
|
|
11
|
+
export declare function getLoadOptionsClient(context: {
|
|
12
|
+
getCredentials(name: string): Promise<Record<string, unknown>>;
|
|
13
|
+
getNodeParameter(name: string, itemIndex?: number, fallback?: unknown): unknown;
|
|
14
|
+
} & {
|
|
15
|
+
helpers: {
|
|
16
|
+
httpRequest(options: IHttpRequestOptions): Promise<unknown>;
|
|
17
|
+
};
|
|
18
|
+
}): Promise<ApiClient>;
|
|
19
|
+
/**
|
|
20
|
+
* Some orboto routes return bare JSON arrays (projects, milestones, statuses,
|
|
21
|
+
* members, labels, versions, attachments) while list routes paginate with
|
|
22
|
+
* `{items, nextCursor}`. This helper normalizes both to an item array.
|
|
23
|
+
*/
|
|
24
|
+
export declare function pageItems<T = unknown>(body: unknown): T[];
|
|
25
|
+
export declare function isUuid(value: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Resolves a user-supplied ticket reference (UUID, key like `ONN-42`,
|
|
28
|
+
* or bare number `42`) to the ticket id. UUIDs pass through untouched;
|
|
29
|
+
* keys/numbers resolve via the project-scoped by-key route.
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveTicketId(client: ApiClient, projectId: string, ticket: string): Promise<string>;
|
|
32
|
+
/**
|
|
33
|
+
* Resolves a project key (ONN) or id to the project id. Some routes
|
|
34
|
+
* (/projects/{id}/members) only accept ids, unlike the ticket routes.
|
|
35
|
+
*/
|
|
36
|
+
export declare function resolveProjectId(client: ApiClient, project: string): Promise<string>;
|
|
37
|
+
/**
|
|
38
|
+
* Resolves a user-supplied milestone reference (UUID or key like `M-3`)
|
|
39
|
+
* to the milestone id. UUIDs pass through untouched.
|
|
40
|
+
*/
|
|
41
|
+
export declare function resolveMilestoneId(client: ApiClient, projectId: string, milestone: string): Promise<string>;
|
|
42
|
+
/** Wraps API failures into n8n errors with actionable descriptions. */
|
|
43
|
+
export declare function toNodeError(node: INode, error: unknown, itemIndex: number): Error;
|
|
44
|
+
/** Success output helper. */
|
|
45
|
+
export declare function jsonOutput(body: unknown): INodeExecutionData;
|
|
46
|
+
/** Reads a query-string-style filter set from node parameters. */
|
|
47
|
+
export declare function collectQuery(entries: Array<[string, unknown]>): Record<string, QueryValue | undefined>;
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.credentialTypeOf = credentialTypeOf;
|
|
4
|
+
exports.getClient = getClient;
|
|
5
|
+
exports.getLoadOptionsClient = getLoadOptionsClient;
|
|
6
|
+
exports.pageItems = pageItems;
|
|
7
|
+
exports.isUuid = isUuid;
|
|
8
|
+
exports.resolveTicketId = resolveTicketId;
|
|
9
|
+
exports.resolveProjectId = resolveProjectId;
|
|
10
|
+
exports.resolveMilestoneId = resolveMilestoneId;
|
|
11
|
+
exports.toNodeError = toNodeError;
|
|
12
|
+
exports.jsonOutput = jsonOutput;
|
|
13
|
+
exports.collectQuery = collectQuery;
|
|
14
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
15
|
+
const ApiClient_1 = require("./ApiClient");
|
|
16
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
17
|
+
/** Resolves the credential type from the Authentication parameter (apiKey | oauth). */
|
|
18
|
+
function credentialTypeOf(context) {
|
|
19
|
+
const authType = String(context.getNodeParameter('authType', 0, 'apiKey'));
|
|
20
|
+
return authType === 'oauth' ? 'orbotoOAuth2Api' : 'orbotoApi';
|
|
21
|
+
}
|
|
22
|
+
/** Builds the shared API client from the node's orboto credential (API key or OAuth2). */
|
|
23
|
+
async function getClient(executeContext) {
|
|
24
|
+
const type = credentialTypeOf(executeContext);
|
|
25
|
+
const credentials = await executeContext.getCredentials(type);
|
|
26
|
+
if (type === 'orbotoOAuth2Api') {
|
|
27
|
+
// OAuth: let n8n inject and refresh the bearer token - an empty apiKey
|
|
28
|
+
// keeps ApiClient from setting its own Authorization header.
|
|
29
|
+
return new ApiClient_1.ApiClient({ baseUrl: String(credentials.baseUrl ?? '') }, (request) => executeContext.helpers.httpRequestWithAuthentication.call(executeContext, 'orbotoOAuth2Api', {
|
|
30
|
+
method: request.method,
|
|
31
|
+
url: request.url,
|
|
32
|
+
headers: request.headers,
|
|
33
|
+
body: request.body,
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
return new ApiClient_1.ApiClient({
|
|
37
|
+
baseUrl: String(credentials.baseUrl ?? ''),
|
|
38
|
+
apiKey: String(credentials.apiKey ?? ''),
|
|
39
|
+
}, (request) => executeContext.helpers.httpRequest({
|
|
40
|
+
method: request.method,
|
|
41
|
+
url: request.url,
|
|
42
|
+
headers: request.headers,
|
|
43
|
+
body: request.body,
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
/** Client for loadOptions methods (same transport, different context type). */
|
|
47
|
+
async function getLoadOptionsClient(context) {
|
|
48
|
+
const type = credentialTypeOf(context);
|
|
49
|
+
const credentials = await context.getCredentials(type);
|
|
50
|
+
const oauthToken = credentials.oauthTokenData;
|
|
51
|
+
return new ApiClient_1.ApiClient({
|
|
52
|
+
baseUrl: String(credentials.baseUrl ?? ''),
|
|
53
|
+
apiKey: String(oauthToken?.access_token ?? credentials.apiKey ?? ''),
|
|
54
|
+
}, (request) => context.helpers.httpRequest({
|
|
55
|
+
method: request.method,
|
|
56
|
+
url: request.url,
|
|
57
|
+
headers: request.headers,
|
|
58
|
+
body: request.body,
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Some orboto routes return bare JSON arrays (projects, milestones, statuses,
|
|
63
|
+
* members, labels, versions, attachments) while list routes paginate with
|
|
64
|
+
* `{items, nextCursor}`. This helper normalizes both to an item array.
|
|
65
|
+
*/
|
|
66
|
+
function pageItems(body) {
|
|
67
|
+
if (Array.isArray(body))
|
|
68
|
+
return body;
|
|
69
|
+
const page = body;
|
|
70
|
+
if (page && Array.isArray(page.items))
|
|
71
|
+
return page.items;
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
function isUuid(value) {
|
|
75
|
+
return UUID_RE.test(value.trim());
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Resolves a user-supplied ticket reference (UUID, key like `ONN-42`,
|
|
79
|
+
* or bare number `42`) to the ticket id. UUIDs pass through untouched;
|
|
80
|
+
* keys/numbers resolve via the project-scoped by-key route.
|
|
81
|
+
*/
|
|
82
|
+
async function resolveTicketId(client, projectId, ticket) {
|
|
83
|
+
const value = ticket.trim();
|
|
84
|
+
if (isUuid(value))
|
|
85
|
+
return value;
|
|
86
|
+
if (!projectId) {
|
|
87
|
+
throw new Error('A project is required to resolve a ticket key or number to an id');
|
|
88
|
+
}
|
|
89
|
+
const found = await client.request(`/projects/${encodeURIComponent(projectId)}/tickets/by-key/${encodeURIComponent(value)}`);
|
|
90
|
+
return found.id;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Resolves a project key (ONN) or id to the project id. Some routes
|
|
94
|
+
* (/projects/{id}/members) only accept ids, unlike the ticket routes.
|
|
95
|
+
*/
|
|
96
|
+
async function resolveProjectId(client, project) {
|
|
97
|
+
const value = project.trim();
|
|
98
|
+
if (isUuid(value))
|
|
99
|
+
return value;
|
|
100
|
+
const found = await client.request(`/projects/by-key/${encodeURIComponent(value)}`);
|
|
101
|
+
return found.id;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Resolves a user-supplied milestone reference (UUID or key like `M-3`)
|
|
105
|
+
* to the milestone id. UUIDs pass through untouched.
|
|
106
|
+
*/
|
|
107
|
+
async function resolveMilestoneId(client, projectId, milestone) {
|
|
108
|
+
const value = milestone.trim();
|
|
109
|
+
if (isUuid(value))
|
|
110
|
+
return value;
|
|
111
|
+
if (!projectId) {
|
|
112
|
+
throw new Error('A project is required to resolve a milestone key to an id');
|
|
113
|
+
}
|
|
114
|
+
const found = await client.request(`/projects/${encodeURIComponent(projectId)}/milestones/by-key/${encodeURIComponent(value)}`);
|
|
115
|
+
return found.id;
|
|
116
|
+
}
|
|
117
|
+
/** Wraps API failures into n8n errors with actionable descriptions. */
|
|
118
|
+
function toNodeError(node, error, itemIndex) {
|
|
119
|
+
if (error instanceof n8n_workflow_1.NodeApiError || error instanceof n8n_workflow_1.NodeOperationError)
|
|
120
|
+
return error;
|
|
121
|
+
if (error instanceof ApiClient_1.ApiError) {
|
|
122
|
+
const description = appendWarningHints(describeApiError(error), error);
|
|
123
|
+
return new n8n_workflow_1.NodeApiError(node, error, {
|
|
124
|
+
message: error.message,
|
|
125
|
+
description,
|
|
126
|
+
itemIndex,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return new n8n_workflow_1.NodeApiError(node, error, { itemIndex });
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* orboto attaches structured hints to some error bodies - a languageWarning
|
|
133
|
+
* on 422 and similarWarnings on 409. They must reach the workflow author,
|
|
134
|
+
* not vanish inside a generic failure (binding error-semantics design).
|
|
135
|
+
*/
|
|
136
|
+
function appendWarningHints(description, error) {
|
|
137
|
+
const raw = (error.raw ?? {});
|
|
138
|
+
const hints = [];
|
|
139
|
+
const languageWarning = raw.languageWarning;
|
|
140
|
+
if (languageWarning && typeof languageWarning === 'object') {
|
|
141
|
+
hints.push(`Language warning: text detected as ${String(languageWarning.detected)} but the project expects ${String(languageWarning.expected)}.`);
|
|
142
|
+
}
|
|
143
|
+
const similar = raw.similarWarnings;
|
|
144
|
+
if (Array.isArray(similar) && similar.length > 0) {
|
|
145
|
+
const first = similar[0] ?? {};
|
|
146
|
+
hints.push(`${similar.length} similar ticket(s) flagged as possible duplicates (e.g. ${String(first.title ?? first.id ?? 'unknown')}).`);
|
|
147
|
+
}
|
|
148
|
+
return hints.length > 0 ? `${description} ${hints.join(' ')}` : description;
|
|
149
|
+
}
|
|
150
|
+
function describeApiError(error) {
|
|
151
|
+
switch (error.status) {
|
|
152
|
+
case 401:
|
|
153
|
+
return 'orboto rejected the API key. Check the credential (Settings > API Keys in orboto).';
|
|
154
|
+
case 403:
|
|
155
|
+
return 'The API key lacks permission for this call. Check its scopes in orboto.';
|
|
156
|
+
case 409:
|
|
157
|
+
return 'orboto blocked this as a duplicate. Inspect similarWarnings in the error output, then retry with "Allow Duplicate" and a justification if it really is distinct work.';
|
|
158
|
+
case 422:
|
|
159
|
+
return 'orboto rejected the ticket language. Retry with "Allow Language Mismatch" if the deviation is intended.';
|
|
160
|
+
case 423:
|
|
161
|
+
return 'The ticket is under legal hold and cannot be modified or deleted.';
|
|
162
|
+
case 429:
|
|
163
|
+
return 'Rate limit exceeded (default 600 requests/minute per instance). Batch operations, slow down, or enable "Continue On Fail" to skip throttled items.';
|
|
164
|
+
default:
|
|
165
|
+
if (error.status === 0)
|
|
166
|
+
return 'Could not reach the orboto instance. Check the Base URL credential field.';
|
|
167
|
+
return error.detail ?? `The request failed with HTTP ${error.status}.`;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/** Success output helper. */
|
|
171
|
+
function jsonOutput(body) {
|
|
172
|
+
return { json: body };
|
|
173
|
+
}
|
|
174
|
+
/** Reads a query-string-style filter set from node parameters. */
|
|
175
|
+
function collectQuery(entries) {
|
|
176
|
+
const query = {};
|
|
177
|
+
for (const [key, value] of entries) {
|
|
178
|
+
if (value === undefined || value === null || value === '')
|
|
179
|
+
continue;
|
|
180
|
+
if (typeof value === 'object')
|
|
181
|
+
continue;
|
|
182
|
+
query[key] = typeof value === 'number' || typeof value === 'boolean' ? value : String(value);
|
|
183
|
+
}
|
|
184
|
+
return query;
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=GenericFunctions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenericFunctions.js","sourceRoot":"","sources":["../../../../nodes/orboto/shared/GenericFunctions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared type definitions for the orboto n8n nodes.
|
|
3
|
+
*
|
|
4
|
+
* These types are intentionally decoupled from n8n's own type system: the
|
|
5
|
+
* shared REST client (ApiClient) is a plain module that can be unit-tested
|
|
6
|
+
* without an n8n runtime. Nodes adapt n8n helpers to these shapes.
|
|
7
|
+
*/
|
|
8
|
+
/** Data coming from an orboto credential (API key credential, ONN-3; OAuth2, ONN-4). */
|
|
9
|
+
export interface ApiCredentials {
|
|
10
|
+
/** Base URL of the orboto API, e.g. `https://orboto.example.com/api`. */
|
|
11
|
+
baseUrl: string;
|
|
12
|
+
/** Bearer token used for the `Authorization` header. Empty when the transport owns auth (OAuth via n8n). */
|
|
13
|
+
apiKey?: string;
|
|
14
|
+
}
|
|
15
|
+
/** Cursor-paginated list envelope returned by every orboto list route. */
|
|
16
|
+
export interface ApiPage<T> {
|
|
17
|
+
items: T[];
|
|
18
|
+
nextCursor: string | null;
|
|
19
|
+
}
|
|
20
|
+
export type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE';
|
|
21
|
+
export type QueryValue = string | number | boolean;
|
|
22
|
+
/** Request shape handed to the transport function. */
|
|
23
|
+
export interface TransportRequest {
|
|
24
|
+
method: HttpMethod;
|
|
25
|
+
/** Fully qualified URL, including query string. */
|
|
26
|
+
url: string;
|
|
27
|
+
headers: Record<string, string>;
|
|
28
|
+
/** Parsed request body; serialized as JSON by the transport. */
|
|
29
|
+
body?: unknown;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Transport performs the actual HTTP call and returns the parsed JSON body.
|
|
33
|
+
*
|
|
34
|
+
* This is structurally compatible with n8n's `this.helpers.httpRequest`
|
|
35
|
+
* (IHttpRequestHelper): the n8n adapter in `n8nTransport` maps our options
|
|
36
|
+
* onto it, so proxies, custom CA certificates and timeouts configured in n8n
|
|
37
|
+
* keep working for every orboto call.
|
|
38
|
+
*/
|
|
39
|
+
export type Transport = (request: TransportRequest) => Promise<unknown>;
|
|
40
|
+
/**
|
|
41
|
+
* Minimal structural type for n8n's HTTP helper.
|
|
42
|
+
*
|
|
43
|
+
* Kept loose on purpose so this module does not need a hard compile-time
|
|
44
|
+
* dependency on `n8n-core` (the host provides it at runtime).
|
|
45
|
+
*/
|
|
46
|
+
export interface N8nHttpHelper {
|
|
47
|
+
httpRequest(options: {
|
|
48
|
+
method: TransportRequest['method'];
|
|
49
|
+
url: string;
|
|
50
|
+
headers?: Record<string, string>;
|
|
51
|
+
body?: unknown;
|
|
52
|
+
skipReadBody?: boolean;
|
|
53
|
+
}): Promise<unknown>;
|
|
54
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared type definitions for the orboto n8n nodes.
|
|
4
|
+
*
|
|
5
|
+
* These types are intentionally decoupled from n8n's own type system: the
|
|
6
|
+
* shared REST client (ApiClient) is a plain module that can be unit-tested
|
|
7
|
+
* without an n8n runtime. Nodes adapt n8n helpers to these shapes.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
//# sourceMappingURL=Types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Types.js","sourceRoot":"","sources":["../../../../nodes/orboto/shared/Types.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ILoadOptionsFunctions, INodePropertyOptions } from 'n8n-workflow';
|
|
2
|
+
/** Projects the credential's account can see. */
|
|
3
|
+
export declare function getProjects(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
|
|
4
|
+
/** Open (plus optionally closed) milestones of the project chosen in the node. */
|
|
5
|
+
export declare function getMilestones(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
|
|
6
|
+
/** Ticket statuses of the project, labeled with their category. */
|
|
7
|
+
export declare function getStatuses(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
|
|
8
|
+
/** Project members (assignee picker). */
|
|
9
|
+
export declare function getMembers(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
|
|
10
|
+
/** Labels of the project (ids - for the add/remove label routes). */
|
|
11
|
+
export declare function getLabels(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
|
|
12
|
+
/** Labels of the project by name - create/update take labelNames, not ids. */
|
|
13
|
+
export declare function getLabelNames(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
|
|
14
|
+
/** Versions of the project. */
|
|
15
|
+
export declare function getVersions(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
|
|
16
|
+
/** Wiki spaces (for the doc resource). */
|
|
17
|
+
export declare function getSpaces(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getProjects = getProjects;
|
|
4
|
+
exports.getMilestones = getMilestones;
|
|
5
|
+
exports.getStatuses = getStatuses;
|
|
6
|
+
exports.getMembers = getMembers;
|
|
7
|
+
exports.getLabels = getLabels;
|
|
8
|
+
exports.getLabelNames = getLabelNames;
|
|
9
|
+
exports.getVersions = getVersions;
|
|
10
|
+
exports.getSpaces = getSpaces;
|
|
11
|
+
const GenericFunctions_1 = require("./GenericFunctions");
|
|
12
|
+
function option(value, name) {
|
|
13
|
+
return { value, name };
|
|
14
|
+
}
|
|
15
|
+
/** Projects the credential's account can see. */
|
|
16
|
+
async function getProjects() {
|
|
17
|
+
const client = await (0, GenericFunctions_1.getLoadOptionsClient)(this);
|
|
18
|
+
const projects = await client.request('/projects/');
|
|
19
|
+
return (0, GenericFunctions_1.pageItems)(projects).map((p) => option(p.id, p.projectKey ? `${p.projectKey} - ${p.name}` : p.name));
|
|
20
|
+
}
|
|
21
|
+
/** Open (plus optionally closed) milestones of the project chosen in the node. */
|
|
22
|
+
async function getMilestones() {
|
|
23
|
+
const projectId = this.getCurrentNodeParameter('project', { extractValue: true });
|
|
24
|
+
if (!projectId)
|
|
25
|
+
return [];
|
|
26
|
+
const client = await (0, GenericFunctions_1.getLoadOptionsClient)(this);
|
|
27
|
+
const milestones = await client.request(`/projects/${encodeURIComponent(projectId)}/milestones`);
|
|
28
|
+
return (0, GenericFunctions_1.pageItems)(milestones).map((m) => option(m.id, m.milestoneKey ? `${m.milestoneKey} - ${m.name}` : m.name));
|
|
29
|
+
}
|
|
30
|
+
/** Ticket statuses of the project, labeled with their category. */
|
|
31
|
+
async function getStatuses() {
|
|
32
|
+
const projectId = this.getCurrentNodeParameter('project', { extractValue: true });
|
|
33
|
+
if (!projectId)
|
|
34
|
+
return [];
|
|
35
|
+
const client = await (0, GenericFunctions_1.getLoadOptionsClient)(this);
|
|
36
|
+
const statuses = await client.request(`/projects/${encodeURIComponent(projectId)}/ticket-statuses`);
|
|
37
|
+
return (0, GenericFunctions_1.pageItems)(statuses).map((s) => option(s.id, `${s.name} (${s.category})`));
|
|
38
|
+
}
|
|
39
|
+
/** Project members (assignee picker). */
|
|
40
|
+
async function getMembers() {
|
|
41
|
+
const projectId = this.getCurrentNodeParameter('project', { extractValue: true });
|
|
42
|
+
if (!projectId)
|
|
43
|
+
return [];
|
|
44
|
+
const client = await (0, GenericFunctions_1.getLoadOptionsClient)(this);
|
|
45
|
+
const members = await client.request(`/projects/${encodeURIComponent(projectId)}/members`);
|
|
46
|
+
return (0, GenericFunctions_1.pageItems)(members).map((m) => {
|
|
47
|
+
const userId = m.user?.id ?? m.userId;
|
|
48
|
+
const name = m.user?.fullName ?? m.user?.email ?? userId;
|
|
49
|
+
return option(userId, name);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/** Labels of the project (ids - for the add/remove label routes). */
|
|
53
|
+
async function getLabels() {
|
|
54
|
+
const projectId = this.getCurrentNodeParameter('project', { extractValue: true });
|
|
55
|
+
if (!projectId)
|
|
56
|
+
return [];
|
|
57
|
+
const client = await (0, GenericFunctions_1.getLoadOptionsClient)(this);
|
|
58
|
+
const labels = await client.request(`/projects/${encodeURIComponent(projectId)}/labels`);
|
|
59
|
+
return (0, GenericFunctions_1.pageItems)(labels).map((l) => option(l.id, l.name));
|
|
60
|
+
}
|
|
61
|
+
/** Labels of the project by name - create/update take labelNames, not ids. */
|
|
62
|
+
async function getLabelNames() {
|
|
63
|
+
const projectId = this.getCurrentNodeParameter('project', { extractValue: true });
|
|
64
|
+
if (!projectId)
|
|
65
|
+
return [];
|
|
66
|
+
const client = await (0, GenericFunctions_1.getLoadOptionsClient)(this);
|
|
67
|
+
const labels = await client.request(`/projects/${encodeURIComponent(projectId)}/labels`);
|
|
68
|
+
return (0, GenericFunctions_1.pageItems)(labels).map((l) => option(l.name, l.name));
|
|
69
|
+
}
|
|
70
|
+
/** Versions of the project. */
|
|
71
|
+
async function getVersions() {
|
|
72
|
+
const projectId = this.getCurrentNodeParameter('project', { extractValue: true });
|
|
73
|
+
if (!projectId)
|
|
74
|
+
return [];
|
|
75
|
+
const client = await (0, GenericFunctions_1.getLoadOptionsClient)(this);
|
|
76
|
+
const versions = await client.request(`/projects/${encodeURIComponent(projectId)}/versions`);
|
|
77
|
+
return (0, GenericFunctions_1.pageItems)(versions).map((v) => option(v.id, v.name));
|
|
78
|
+
}
|
|
79
|
+
/** Wiki spaces (for the doc resource). */
|
|
80
|
+
async function getSpaces() {
|
|
81
|
+
const client = await (0, GenericFunctions_1.getLoadOptionsClient)(this);
|
|
82
|
+
const spaces = await client.request('/spaces');
|
|
83
|
+
return (0, GenericFunctions_1.pageItems)(spaces).map((s) => option(s.id, s.key ? `${s.key} - ${s.name}` : s.name));
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=loadOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadOptions.js","sourceRoot":"","sources":["../../../../nodes/orboto/shared/loadOptions.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "n8n-nodes-orboto",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "n8n community nodes for orboto - automate tickets, milestones, projects, docs and more from your workflows",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"n8n-community-node-package",
|
|
7
|
+
"n8n",
|
|
8
|
+
"orboto",
|
|
9
|
+
"project-management",
|
|
10
|
+
"tickets",
|
|
11
|
+
"automation"
|
|
12
|
+
],
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"author": {
|
|
15
|
+
"name": "orboto",
|
|
16
|
+
"email": "hello@orboto.io"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/orboto/n8n-nodes-orboto.git"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://github.com/orboto/n8n-nodes-orboto#readme",
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/orboto/n8n-nodes-orboto/issues"
|
|
25
|
+
},
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=20.19"
|
|
28
|
+
},
|
|
29
|
+
"main": "dist/nodes/index.js",
|
|
30
|
+
"files": [
|
|
31
|
+
"dist"
|
|
32
|
+
],
|
|
33
|
+
"n8n": {
|
|
34
|
+
"n8nNodesApiVersion": 1,
|
|
35
|
+
"credentials": [
|
|
36
|
+
"dist/credentials/orbotoApi.credentials.js",
|
|
37
|
+
"dist/credentials/orbotoOAuth2Api.credentials.js"
|
|
38
|
+
],
|
|
39
|
+
"nodes": [
|
|
40
|
+
"dist/nodes/orboto/orboto.node.js",
|
|
41
|
+
"dist/nodes/orboto/orbotoTrigger.node.js"
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsc && gulp build:icons",
|
|
46
|
+
"dev": "tsc --watch",
|
|
47
|
+
"format": "prettier --write .",
|
|
48
|
+
"format:check": "prettier --check .",
|
|
49
|
+
"lint": "eslint \"nodes/**/*.ts\" \"credentials/**/*.ts\" --no-error-on-unmatched-pattern && eslint package.json",
|
|
50
|
+
"lint:fix": "eslint \"nodes/**/*.ts\" \"credentials/**/*.ts\" --no-error-on-unmatched-pattern --fix",
|
|
51
|
+
"test": "vitest run",
|
|
52
|
+
"prepublishOnly": "npm run lint && npm run build && npm run test"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/node": "^20.19.43",
|
|
56
|
+
"@typescript-eslint/eslint-plugin": "^8.68.0",
|
|
57
|
+
"@typescript-eslint/parser": "^8.57.2",
|
|
58
|
+
"eslint": "^8.57.1",
|
|
59
|
+
"eslint-plugin-n8n-nodes-base": "^2.0.0",
|
|
60
|
+
"gulp": "^5.0.1",
|
|
61
|
+
"jsonc-eslint-parser": "^3.3.0",
|
|
62
|
+
"n8n-core": "^2.16.1",
|
|
63
|
+
"n8n-workflow": "^2.16.0",
|
|
64
|
+
"prettier": "^3.9.6",
|
|
65
|
+
"typescript": "~5.9.3",
|
|
66
|
+
"vitest": "^4.1.11"
|
|
67
|
+
}
|
|
68
|
+
}
|