@project-ajax/sdk 0.0.32 → 0.0.34
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/dist/builder.d.ts +64 -1
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +109 -0
- package/dist/capabilities/tool.d.ts +12 -0
- package/dist/capabilities/tool.d.ts.map +1 -1
- package/dist/capabilities/tool.js +35 -3
- package/dist/schema.d.ts +63 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +36 -0
- package/dist/types.d.ts +69 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/builder.ts +191 -2
- package/src/capabilities/tool.ts +38 -3
- package/src/schema.ts +110 -2
- package/src/types.ts +106 -0
package/dist/builder.d.ts
CHANGED
|
@@ -1,12 +1,75 @@
|
|
|
1
1
|
import type { TextValue } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a rich text value.
|
|
4
|
+
*/
|
|
2
5
|
export declare function richText(content: string): TextValue;
|
|
6
|
+
/**
|
|
7
|
+
* Creates a URL value.
|
|
8
|
+
*/
|
|
3
9
|
export declare function url(url: string): TextValue;
|
|
10
|
+
/**
|
|
11
|
+
* Creates a title value.
|
|
12
|
+
*/
|
|
4
13
|
export declare function title(content: string): TextValue;
|
|
14
|
+
/**
|
|
15
|
+
* Creates a text value.
|
|
16
|
+
*/
|
|
5
17
|
export declare function text(content: string): TextValue;
|
|
6
18
|
/**
|
|
7
|
-
* Creates
|
|
19
|
+
* Creates an email value.
|
|
20
|
+
*/
|
|
21
|
+
export declare function email(email: string): TextValue;
|
|
22
|
+
/**
|
|
23
|
+
* Creates a phone number value.
|
|
24
|
+
*/
|
|
25
|
+
export declare function phoneNumber(phone: string): TextValue;
|
|
26
|
+
/**
|
|
27
|
+
* Creates a checkbox value.
|
|
28
|
+
*/
|
|
29
|
+
export declare function checkbox(checked: boolean): TextValue;
|
|
30
|
+
/**
|
|
31
|
+
* Creates a file URL value.
|
|
32
|
+
* @param fileUrl - The URL of the file
|
|
33
|
+
* @param fileName - Optional display name for the file (defaults to URL)
|
|
34
|
+
*/
|
|
35
|
+
export declare function file(fileUrl: string, fileName?: string): TextValue;
|
|
36
|
+
/**
|
|
37
|
+
* Creates a number value.
|
|
38
|
+
*/
|
|
39
|
+
export declare function number(value: number): TextValue;
|
|
40
|
+
/**
|
|
41
|
+
* Creates a date value from a date string (YYYY-MM-DD).
|
|
42
|
+
*/
|
|
43
|
+
export declare function date(dateString: string): TextValue;
|
|
44
|
+
/**
|
|
45
|
+
* Creates a datetime value from a Date object.
|
|
46
|
+
*/
|
|
47
|
+
export declare function dateTime(date: Date, timeZone?: string): TextValue;
|
|
48
|
+
/**
|
|
49
|
+
* Creates a date range value from date strings.
|
|
50
|
+
*/
|
|
51
|
+
export declare function dateRange(startDate: string, endDate: string): TextValue;
|
|
52
|
+
/**
|
|
53
|
+
* Creates a datetime range value from Date objects.
|
|
54
|
+
*/
|
|
55
|
+
export declare function dateTimeRange(startDate: Date, endDate: Date, timeZone?: string): TextValue;
|
|
56
|
+
/**
|
|
57
|
+
* Creates a link with custom display text.
|
|
8
58
|
* @param displayText - The text to display
|
|
9
59
|
* @param url - The URL to link to
|
|
10
60
|
*/
|
|
11
61
|
export declare function link(displayText: string, url: string): TextValue;
|
|
62
|
+
/**
|
|
63
|
+
* Creates a select value from a single option.
|
|
64
|
+
*/
|
|
65
|
+
export declare function select(value: string): TextValue;
|
|
66
|
+
/**
|
|
67
|
+
* Creates a multi-select value from multiple options.
|
|
68
|
+
* @param values - Array of option names to select
|
|
69
|
+
*/
|
|
70
|
+
export declare function multiSelect(...values: string[]): TextValue;
|
|
71
|
+
/**
|
|
72
|
+
* Creates a status value from a status option name.
|
|
73
|
+
*/
|
|
74
|
+
export declare function status(value: string): TextValue;
|
|
12
75
|
//# sourceMappingURL=builder.d.ts.map
|
package/dist/builder.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAEnD;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAE1C;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAEhD;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAE/C;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAE9C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAEpD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAEpD;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAElE;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAK/C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CASlD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAYjE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAWvE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC5B,SAAS,EAAE,IAAI,EACf,OAAO,EAAE,IAAI,EACb,QAAQ,CAAC,EAAE,MAAM,GACf,SAAS,CAcX;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAEhE;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAE/C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAK1D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAE/C"}
|
package/dist/builder.js
CHANGED
|
@@ -10,12 +10,121 @@ function title(content) {
|
|
|
10
10
|
function text(content) {
|
|
11
11
|
return [[content]];
|
|
12
12
|
}
|
|
13
|
+
function email(email2) {
|
|
14
|
+
return [[email2]];
|
|
15
|
+
}
|
|
16
|
+
function phoneNumber(phone) {
|
|
17
|
+
return [[phone]];
|
|
18
|
+
}
|
|
19
|
+
function checkbox(checked) {
|
|
20
|
+
return checked ? [["Yes"]] : [["No"]];
|
|
21
|
+
}
|
|
22
|
+
function file(fileUrl, fileName) {
|
|
23
|
+
return [[fileName ?? fileUrl, [["a", fileUrl]]]];
|
|
24
|
+
}
|
|
25
|
+
function number(value) {
|
|
26
|
+
if (Number.isNaN(value)) {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
return [[value.toString()]];
|
|
30
|
+
}
|
|
31
|
+
function date(dateString) {
|
|
32
|
+
validateDateString(dateString);
|
|
33
|
+
const dateValue = {
|
|
34
|
+
type: "date",
|
|
35
|
+
start_date: dateString
|
|
36
|
+
};
|
|
37
|
+
return createDateToken(dateValue);
|
|
38
|
+
}
|
|
39
|
+
function dateTime(date2, timeZone) {
|
|
40
|
+
const dateValue = {
|
|
41
|
+
type: "datetime",
|
|
42
|
+
start_date: formatDate(date2),
|
|
43
|
+
start_time: formatTime(date2)
|
|
44
|
+
};
|
|
45
|
+
if (timeZone) {
|
|
46
|
+
dateValue.time_zone = timeZone;
|
|
47
|
+
}
|
|
48
|
+
return createDateToken(dateValue);
|
|
49
|
+
}
|
|
50
|
+
function dateRange(startDate, endDate) {
|
|
51
|
+
validateDateString(startDate);
|
|
52
|
+
validateDateString(endDate);
|
|
53
|
+
const dateValue = {
|
|
54
|
+
type: "daterange",
|
|
55
|
+
start_date: startDate,
|
|
56
|
+
end_date: endDate
|
|
57
|
+
};
|
|
58
|
+
return createDateToken(dateValue);
|
|
59
|
+
}
|
|
60
|
+
function dateTimeRange(startDate, endDate, timeZone) {
|
|
61
|
+
const dateValue = {
|
|
62
|
+
type: "datetimerange",
|
|
63
|
+
start_date: formatDate(startDate),
|
|
64
|
+
start_time: formatTime(startDate),
|
|
65
|
+
end_date: formatDate(endDate),
|
|
66
|
+
end_time: formatTime(endDate)
|
|
67
|
+
};
|
|
68
|
+
if (timeZone) {
|
|
69
|
+
dateValue.time_zone = timeZone;
|
|
70
|
+
}
|
|
71
|
+
return createDateToken(dateValue);
|
|
72
|
+
}
|
|
13
73
|
function link(displayText, url2) {
|
|
14
74
|
return [[displayText, [["a", url2]]]];
|
|
15
75
|
}
|
|
76
|
+
function select(value) {
|
|
77
|
+
return [[value]];
|
|
78
|
+
}
|
|
79
|
+
function multiSelect(...values) {
|
|
80
|
+
if (values.length === 0) {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
return [[values.join(",")]];
|
|
84
|
+
}
|
|
85
|
+
function status(value) {
|
|
86
|
+
return [[value]];
|
|
87
|
+
}
|
|
88
|
+
function validateDateString(dateString) {
|
|
89
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(dateString)) {
|
|
90
|
+
throw new Error(
|
|
91
|
+
`Invalid date format: ${dateString}. Expected YYYY-MM-DD format.`
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
const date2 = new Date(dateString);
|
|
95
|
+
if (Number.isNaN(date2.getTime())) {
|
|
96
|
+
throw new Error(`Invalid date: ${dateString}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function createDateToken(dateValue) {
|
|
100
|
+
return [["\u2023", [["d", dateValue]]]];
|
|
101
|
+
}
|
|
102
|
+
function formatDate(date2) {
|
|
103
|
+
const year = date2.getFullYear();
|
|
104
|
+
const month = String(date2.getMonth() + 1).padStart(2, "0");
|
|
105
|
+
const day = String(date2.getDate()).padStart(2, "0");
|
|
106
|
+
return `${year}-${month}-${day}`;
|
|
107
|
+
}
|
|
108
|
+
function formatTime(date2) {
|
|
109
|
+
const hours = String(date2.getHours()).padStart(2, "0");
|
|
110
|
+
const minutes = String(date2.getMinutes()).padStart(2, "0");
|
|
111
|
+
return `${hours}:${minutes}`;
|
|
112
|
+
}
|
|
16
113
|
export {
|
|
114
|
+
checkbox,
|
|
115
|
+
date,
|
|
116
|
+
dateRange,
|
|
117
|
+
dateTime,
|
|
118
|
+
dateTimeRange,
|
|
119
|
+
email,
|
|
120
|
+
file,
|
|
17
121
|
link,
|
|
122
|
+
multiSelect,
|
|
123
|
+
number,
|
|
124
|
+
phoneNumber,
|
|
18
125
|
richText,
|
|
126
|
+
select,
|
|
127
|
+
status,
|
|
19
128
|
text,
|
|
20
129
|
title,
|
|
21
130
|
url
|
|
@@ -13,18 +13,30 @@ export interface ToolConfiguration<I extends JSONValue, O extends JSONValue = JS
|
|
|
13
13
|
*/
|
|
14
14
|
export declare class InvalidToolInputError extends Error {
|
|
15
15
|
constructor(message: string);
|
|
16
|
+
toJSON(): {
|
|
17
|
+
name: string;
|
|
18
|
+
message: string;
|
|
19
|
+
};
|
|
16
20
|
}
|
|
17
21
|
/**
|
|
18
22
|
* An error returned when the output from a tool doesn't match the output schema.
|
|
19
23
|
*/
|
|
20
24
|
export declare class InvalidToolOutputError extends Error {
|
|
21
25
|
constructor(message: string);
|
|
26
|
+
toJSON(): {
|
|
27
|
+
name: string;
|
|
28
|
+
message: string;
|
|
29
|
+
};
|
|
22
30
|
}
|
|
23
31
|
/**
|
|
24
32
|
* An error returned when the tool execution fails.
|
|
25
33
|
*/
|
|
26
34
|
export declare class ToolExecutionError extends Error {
|
|
27
35
|
constructor(message: string);
|
|
36
|
+
toJSON(): {
|
|
37
|
+
name: string;
|
|
38
|
+
message: string;
|
|
39
|
+
};
|
|
28
40
|
}
|
|
29
41
|
/**
|
|
30
42
|
* Creates a capability definition for a tool to be used by an agent.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/capabilities/tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAE/C,KAAK,SAAS,GACX,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEhC,MAAM,WAAW,iBAAiB,CACjC,CAAC,SAAS,SAAS,EACnB,CAAC,SAAS,SAAS,GAAG,SAAS;IAE/B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC1B,YAAY,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IACjC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/capabilities/tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAE/C,KAAK,SAAS,GACX,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEhC,MAAM,WAAW,iBAAiB,CACjC,CAAC,SAAS,SAAS,EACnB,CAAC,SAAS,SAAS,GAAG,SAAS;IAE/B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC1B,YAAY,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IACjC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;IAK3B,MAAM;;;;CAMN;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM;IAK3B,MAAM;;;;CAMN;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;IAK3B,MAAM;;;;CAMN;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,GAAG,SAAS,EACxE,MAAM,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;;;;;;;mBAeT,SAAS,GAAG,OAAO,CACrC;QACA,IAAI,EAAE,SAAS,CAAC;QAChB,KAAK,EAAE,CAAC,CAAC;KACR,GACD;QACA,IAAI,EAAE,OAAO,CAAC;QACd,KAAK,EACF,qBAAqB,GACrB,sBAAsB,GACtB,kBAAkB,CAAC;KACrB,CACH;EA0DF"}
|
|
@@ -4,18 +4,36 @@ class InvalidToolInputError extends Error {
|
|
|
4
4
|
super(message);
|
|
5
5
|
this.name = "InvalidToolInputError";
|
|
6
6
|
}
|
|
7
|
+
toJSON() {
|
|
8
|
+
return {
|
|
9
|
+
name: this.name,
|
|
10
|
+
message: this.message
|
|
11
|
+
};
|
|
12
|
+
}
|
|
7
13
|
}
|
|
8
14
|
class InvalidToolOutputError extends Error {
|
|
9
15
|
constructor(message) {
|
|
10
16
|
super(message);
|
|
11
17
|
this.name = "InvalidToolOutputError";
|
|
12
18
|
}
|
|
19
|
+
toJSON() {
|
|
20
|
+
return {
|
|
21
|
+
name: this.name,
|
|
22
|
+
message: this.message
|
|
23
|
+
};
|
|
24
|
+
}
|
|
13
25
|
}
|
|
14
26
|
class ToolExecutionError extends Error {
|
|
15
27
|
constructor(message) {
|
|
16
28
|
super(message);
|
|
17
29
|
this.name = "ToolExecutionError";
|
|
18
30
|
}
|
|
31
|
+
toJSON() {
|
|
32
|
+
return {
|
|
33
|
+
name: this.name,
|
|
34
|
+
message: this.message
|
|
35
|
+
};
|
|
36
|
+
}
|
|
19
37
|
}
|
|
20
38
|
function tool(config) {
|
|
21
39
|
const ajv = new Ajv();
|
|
@@ -35,22 +53,32 @@ function tool(config) {
|
|
|
35
53
|
"Unexpected: No validation errors after failed validation"
|
|
36
54
|
);
|
|
37
55
|
}
|
|
38
|
-
|
|
56
|
+
const result = {
|
|
39
57
|
_tag: "error",
|
|
40
58
|
error: new InvalidToolInputError(
|
|
41
59
|
JSON.stringify(validateInput.errors, null, 2)
|
|
42
60
|
)
|
|
43
61
|
};
|
|
62
|
+
process.stdout.write(`
|
|
63
|
+
<output>${JSON.stringify(result)}</output>
|
|
64
|
+
`);
|
|
65
|
+
return result;
|
|
44
66
|
}
|
|
45
67
|
try {
|
|
46
68
|
const result = await config.execute(input);
|
|
47
69
|
if (validateOutput && !validateOutput(result)) {
|
|
48
|
-
|
|
70
|
+
const result2 = {
|
|
49
71
|
_tag: "error",
|
|
50
72
|
error: new InvalidToolOutputError(
|
|
51
73
|
JSON.stringify(validateOutput.errors, null, 2)
|
|
52
74
|
)
|
|
53
75
|
};
|
|
76
|
+
process.stdout.write(
|
|
77
|
+
`
|
|
78
|
+
<output>${JSON.stringify(result2)}</output>
|
|
79
|
+
`
|
|
80
|
+
);
|
|
81
|
+
return result2;
|
|
54
82
|
}
|
|
55
83
|
process.stdout.write(`
|
|
56
84
|
<output>${JSON.stringify(result)}</output>
|
|
@@ -60,12 +88,16 @@ function tool(config) {
|
|
|
60
88
|
value: result
|
|
61
89
|
};
|
|
62
90
|
} catch (err) {
|
|
63
|
-
|
|
91
|
+
const result = {
|
|
64
92
|
_tag: "error",
|
|
65
93
|
error: new ToolExecutionError(
|
|
66
94
|
err instanceof Error ? err.message : String(err)
|
|
67
95
|
)
|
|
68
96
|
};
|
|
97
|
+
process.stdout.write(`
|
|
98
|
+
<output>${JSON.stringify(result)}</output>
|
|
99
|
+
`);
|
|
100
|
+
return result;
|
|
69
101
|
}
|
|
70
102
|
}
|
|
71
103
|
};
|
package/dist/schema.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import type { DateFormat, NumberFormat, SelectOption, StatusGroup } from "./types.js";
|
|
1
2
|
/**
|
|
2
3
|
* Supported property types for sync schemas.
|
|
3
4
|
*/
|
|
4
|
-
export type PropertyType = "title" | "rich_text" | "url";
|
|
5
|
+
export type PropertyType = "title" | "rich_text" | "url" | "email" | "phone_number" | "checkbox" | "file" | "number" | "date" | "select" | "multi_select" | "status";
|
|
5
6
|
/**
|
|
6
7
|
* Definition of a single property in a sync schema.
|
|
7
8
|
*/
|
|
@@ -17,6 +18,29 @@ export type PropertyConfiguration = {
|
|
|
17
18
|
type: "text";
|
|
18
19
|
} | {
|
|
19
20
|
type: "url";
|
|
21
|
+
} | {
|
|
22
|
+
type: "email";
|
|
23
|
+
} | {
|
|
24
|
+
type: "phone_number";
|
|
25
|
+
} | {
|
|
26
|
+
type: "checkbox";
|
|
27
|
+
} | {
|
|
28
|
+
type: "file";
|
|
29
|
+
} | {
|
|
30
|
+
type: "number";
|
|
31
|
+
format?: NumberFormat;
|
|
32
|
+
} | {
|
|
33
|
+
type: "date";
|
|
34
|
+
date_format?: DateFormat;
|
|
35
|
+
} | {
|
|
36
|
+
type: "select";
|
|
37
|
+
options: SelectOption[];
|
|
38
|
+
} | {
|
|
39
|
+
type: "multi_select";
|
|
40
|
+
options: SelectOption[];
|
|
41
|
+
} | {
|
|
42
|
+
type: "status";
|
|
43
|
+
groups: StatusGroup[];
|
|
20
44
|
};
|
|
21
45
|
export type Schema<PK extends string> = {
|
|
22
46
|
dataSourceTitle: string;
|
|
@@ -42,4 +66,42 @@ export declare function richText(): PropertyConfiguration;
|
|
|
42
66
|
* Creates a URL property definition.
|
|
43
67
|
*/
|
|
44
68
|
export declare function url(): PropertyConfiguration;
|
|
69
|
+
/**
|
|
70
|
+
* Creates an email property definition.
|
|
71
|
+
*/
|
|
72
|
+
export declare function email(): PropertyConfiguration;
|
|
73
|
+
/**
|
|
74
|
+
* Creates a phone number property definition.
|
|
75
|
+
*/
|
|
76
|
+
export declare function phoneNumber(): PropertyConfiguration;
|
|
77
|
+
/**
|
|
78
|
+
* Creates a checkbox property definition.
|
|
79
|
+
*/
|
|
80
|
+
export declare function checkbox(): PropertyConfiguration;
|
|
81
|
+
/**
|
|
82
|
+
* Creates a file property definition.
|
|
83
|
+
*/
|
|
84
|
+
export declare function file(): PropertyConfiguration;
|
|
85
|
+
/**
|
|
86
|
+
* Creates a number property definition with optional formatting.
|
|
87
|
+
*/
|
|
88
|
+
export declare function number(format?: NumberFormat): PropertyConfiguration;
|
|
89
|
+
/**
|
|
90
|
+
* Creates a date property definition with optional formatting.
|
|
91
|
+
*/
|
|
92
|
+
export declare function date(date_format?: DateFormat): PropertyConfiguration;
|
|
93
|
+
/**
|
|
94
|
+
* Creates a select property definition with predefined options.
|
|
95
|
+
*/
|
|
96
|
+
export declare function select(options: SelectOption[]): PropertyConfiguration;
|
|
97
|
+
/**
|
|
98
|
+
* Creates a multi-select property definition with predefined options.
|
|
99
|
+
*/
|
|
100
|
+
export declare function multiSelect(options: SelectOption[]): PropertyConfiguration;
|
|
101
|
+
/**
|
|
102
|
+
* Creates a status property definition with groups.
|
|
103
|
+
*/
|
|
104
|
+
export declare function status(config: {
|
|
105
|
+
groups: StatusGroup[];
|
|
106
|
+
}): PropertyConfiguration;
|
|
45
107
|
//# sourceMappingURL=schema.d.ts.map
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,MAAM,YAAY,GACrB,OAAO,GACP,WAAW,GACX,KAAK,GACL,OAAO,GACP,cAAc,GACd,UAAU,GACV,MAAM,GACN,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,cAAc,GACd,QAAQ,CAAC;AAEZ;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,YAAY,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IACA,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,CAAC,EAAE,YAAY,CAAC;CACrB,GACD;IACA,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,UAAU,CAAC;CACxB,GACD;IACA,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,YAAY,EAAE,CAAC;CACvB,GACD;IACA,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,YAAY,EAAE,CAAC;CACvB,GACD;IACA,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,WAAW,EAAE,CAAC;CACrB,CAAC;AAEL,MAAM,MAAM,MAAM,CAAC,EAAE,SAAS,MAAM,IAAI;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,EAAE,SAAS,MAAM,IAAI;KAC9C,UAAU,IAAI,EAAE,GAAG,qBAAqB;CACzC,GAAG;IACH,CAAC,YAAY,EAAE,MAAM,GAAG,qBAAqB,CAAC;CAC9C,CAAC;AAEF;;GAEG;AACH,wBAAgB,KAAK,IAAI,qBAAqB,CAE7C;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,qBAAqB,CAEhD;AAED;;GAEG;AACH,wBAAgB,GAAG,IAAI,qBAAqB,CAE3C;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,qBAAqB,CAE7C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,qBAAqB,CAEnD;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,qBAAqB,CAEhD;AAED;;GAEG;AACH,wBAAgB,IAAI,IAAI,qBAAqB,CAE5C;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,qBAAqB,CAEnE;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,WAAW,CAAC,EAAE,UAAU,GAAG,qBAAqB,CAEpE;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,qBAAqB,CAErE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,qBAAqB,CAE1E;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE;IAC9B,MAAM,EAAE,WAAW,EAAE,CAAC;CACtB,GAAG,qBAAqB,CAExB"}
|
package/dist/schema.js
CHANGED
|
@@ -7,8 +7,44 @@ function richText() {
|
|
|
7
7
|
function url() {
|
|
8
8
|
return { type: "url" };
|
|
9
9
|
}
|
|
10
|
+
function email() {
|
|
11
|
+
return { type: "email" };
|
|
12
|
+
}
|
|
13
|
+
function phoneNumber() {
|
|
14
|
+
return { type: "phone_number" };
|
|
15
|
+
}
|
|
16
|
+
function checkbox() {
|
|
17
|
+
return { type: "checkbox" };
|
|
18
|
+
}
|
|
19
|
+
function file() {
|
|
20
|
+
return { type: "file" };
|
|
21
|
+
}
|
|
22
|
+
function number(format) {
|
|
23
|
+
return format ? { type: "number", format } : { type: "number" };
|
|
24
|
+
}
|
|
25
|
+
function date(date_format) {
|
|
26
|
+
return date_format ? { type: "date", date_format } : { type: "date" };
|
|
27
|
+
}
|
|
28
|
+
function select(options) {
|
|
29
|
+
return { type: "select", options };
|
|
30
|
+
}
|
|
31
|
+
function multiSelect(options) {
|
|
32
|
+
return { type: "multi_select", options };
|
|
33
|
+
}
|
|
34
|
+
function status(config) {
|
|
35
|
+
return { type: "status", groups: config.groups };
|
|
36
|
+
}
|
|
10
37
|
export {
|
|
38
|
+
checkbox,
|
|
39
|
+
date,
|
|
40
|
+
email,
|
|
41
|
+
file,
|
|
42
|
+
multiSelect,
|
|
43
|
+
number,
|
|
44
|
+
phoneNumber,
|
|
11
45
|
richText,
|
|
46
|
+
select,
|
|
47
|
+
status,
|
|
12
48
|
title,
|
|
13
49
|
url
|
|
14
50
|
};
|
package/dist/types.d.ts
CHANGED
|
@@ -7,5 +7,74 @@ type TextToken = [string, ...unknown[]];
|
|
|
7
7
|
* A TextValue is an array of text tokens, representing rich text content.
|
|
8
8
|
*/
|
|
9
9
|
export type TextValue = Array<TextToken>;
|
|
10
|
+
/**
|
|
11
|
+
* Select option color types supported by Notion
|
|
12
|
+
*/
|
|
13
|
+
export type SelectColor = "default" | "gray" | "brown" | "orange" | "yellow" | "green" | "blue" | "purple" | "pink" | "red";
|
|
14
|
+
/**
|
|
15
|
+
* A select option with an optional color
|
|
16
|
+
*/
|
|
17
|
+
export interface SelectOption {
|
|
18
|
+
name: string;
|
|
19
|
+
color?: SelectColor;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Status group types in Notion
|
|
23
|
+
*/
|
|
24
|
+
export type StatusGroupType = "To-do" | "In progress" | "Complete";
|
|
25
|
+
/**
|
|
26
|
+
* Status group configuration
|
|
27
|
+
*/
|
|
28
|
+
export interface StatusGroup {
|
|
29
|
+
name: StatusGroupType;
|
|
30
|
+
options: SelectOption[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Date object representing a single date without time
|
|
34
|
+
*/
|
|
35
|
+
export interface NotionDate {
|
|
36
|
+
type: "date";
|
|
37
|
+
start_date: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Date object representing a date with time
|
|
41
|
+
*/
|
|
42
|
+
export interface NotionDateTime {
|
|
43
|
+
type: "datetime";
|
|
44
|
+
start_date: string;
|
|
45
|
+
start_time: string;
|
|
46
|
+
time_zone?: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Date object representing a date range
|
|
50
|
+
*/
|
|
51
|
+
export interface DateRange {
|
|
52
|
+
type: "daterange";
|
|
53
|
+
start_date: string;
|
|
54
|
+
end_date: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Date object representing a date-time range
|
|
58
|
+
*/
|
|
59
|
+
export interface DateTimeRange {
|
|
60
|
+
type: "datetimerange";
|
|
61
|
+
start_date: string;
|
|
62
|
+
start_time: string;
|
|
63
|
+
end_date: string;
|
|
64
|
+
end_time: string;
|
|
65
|
+
time_zone?: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* All possible date value types
|
|
69
|
+
*/
|
|
70
|
+
export type DateValue = NotionDate | NotionDateTime | DateRange | DateTimeRange;
|
|
71
|
+
/**
|
|
72
|
+
* Number format types
|
|
73
|
+
*/
|
|
74
|
+
export type NumberFormat = "number" | "number_with_commas" | "percent" | "dollar" | "euro" | "pound" | "yen" | "rupee" | "won" | "yuan";
|
|
75
|
+
/**
|
|
76
|
+
* Date format types
|
|
77
|
+
*/
|
|
78
|
+
export type DateFormat = "relative" | "MM/DD/YYYY" | "DD/MM/YYYY" | "YYYY/MM/DD" | "ll" | "MMM d";
|
|
10
79
|
export {};
|
|
11
80
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,KAAK,SAAS,GAAG,CAAC,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAExC;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,KAAK,SAAS,GAAG,CAAC,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAExC;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;AAEzC;;GAEG;AACH,MAAM,MAAM,WAAW,GACpB,SAAS,GACT,MAAM,GACN,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,MAAM,GACN,QAAQ,GACR,MAAM,GACN,KAAK,CAAC;AAET;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,WAAW,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,aAAa,GAAG,UAAU,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,YAAY,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,eAAe,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,SAAS,GAAG,aAAa,CAAC;AAEhF;;GAEG;AACH,MAAM,MAAM,YAAY,GACrB,QAAQ,GACR,oBAAoB,GACpB,SAAS,GACT,QAAQ,GACR,MAAM,GACN,OAAO,GACP,KAAK,GACL,OAAO,GACP,KAAK,GACL,MAAM,CAAC;AAEV;;GAEG;AACH,MAAM,MAAM,UAAU,GACnB,UAAU,GACV,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,IAAI,GACJ,OAAO,CAAC"}
|
package/package.json
CHANGED
package/src/builder.ts
CHANGED
|
@@ -1,26 +1,215 @@
|
|
|
1
|
-
import type { TextValue } from "./types.js";
|
|
1
|
+
import type { DateValue, TextValue } from "./types.js";
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Creates a rich text value.
|
|
5
|
+
*/
|
|
3
6
|
export function richText(content: string): TextValue {
|
|
4
7
|
return [[content]];
|
|
5
8
|
}
|
|
6
9
|
|
|
10
|
+
/**
|
|
11
|
+
* Creates a URL value.
|
|
12
|
+
*/
|
|
7
13
|
export function url(url: string): TextValue {
|
|
8
14
|
return [[url]];
|
|
9
15
|
}
|
|
10
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Creates a title value.
|
|
19
|
+
*/
|
|
11
20
|
export function title(content: string): TextValue {
|
|
12
21
|
return [[content]];
|
|
13
22
|
}
|
|
14
23
|
|
|
24
|
+
/**
|
|
25
|
+
* Creates a text value.
|
|
26
|
+
*/
|
|
15
27
|
export function text(content: string): TextValue {
|
|
16
28
|
return [[content]];
|
|
17
29
|
}
|
|
18
30
|
|
|
19
31
|
/**
|
|
20
|
-
* Creates
|
|
32
|
+
* Creates an email value.
|
|
33
|
+
*/
|
|
34
|
+
export function email(email: string): TextValue {
|
|
35
|
+
return [[email]];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Creates a phone number value.
|
|
40
|
+
*/
|
|
41
|
+
export function phoneNumber(phone: string): TextValue {
|
|
42
|
+
return [[phone]];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Creates a checkbox value.
|
|
47
|
+
*/
|
|
48
|
+
export function checkbox(checked: boolean): TextValue {
|
|
49
|
+
return checked ? [["Yes"]] : [["No"]];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Creates a file URL value.
|
|
54
|
+
* @param fileUrl - The URL of the file
|
|
55
|
+
* @param fileName - Optional display name for the file (defaults to URL)
|
|
56
|
+
*/
|
|
57
|
+
export function file(fileUrl: string, fileName?: string): TextValue {
|
|
58
|
+
return [[fileName ?? fileUrl, [["a", fileUrl]]]];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Creates a number value.
|
|
63
|
+
*/
|
|
64
|
+
export function number(value: number): TextValue {
|
|
65
|
+
if (Number.isNaN(value)) {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
return [[value.toString()]];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Creates a date value from a date string (YYYY-MM-DD).
|
|
73
|
+
*/
|
|
74
|
+
export function date(dateString: string): TextValue {
|
|
75
|
+
validateDateString(dateString);
|
|
76
|
+
|
|
77
|
+
const dateValue: DateValue = {
|
|
78
|
+
type: "date",
|
|
79
|
+
start_date: dateString,
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
return createDateToken(dateValue);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Creates a datetime value from a Date object.
|
|
87
|
+
*/
|
|
88
|
+
export function dateTime(date: Date, timeZone?: string): TextValue {
|
|
89
|
+
const dateValue: DateValue = {
|
|
90
|
+
type: "datetime",
|
|
91
|
+
start_date: formatDate(date),
|
|
92
|
+
start_time: formatTime(date),
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
if (timeZone) {
|
|
96
|
+
dateValue.time_zone = timeZone;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return createDateToken(dateValue);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Creates a date range value from date strings.
|
|
104
|
+
*/
|
|
105
|
+
export function dateRange(startDate: string, endDate: string): TextValue {
|
|
106
|
+
validateDateString(startDate);
|
|
107
|
+
validateDateString(endDate);
|
|
108
|
+
|
|
109
|
+
const dateValue: DateValue = {
|
|
110
|
+
type: "daterange",
|
|
111
|
+
start_date: startDate,
|
|
112
|
+
end_date: endDate,
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
return createDateToken(dateValue);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Creates a datetime range value from Date objects.
|
|
120
|
+
*/
|
|
121
|
+
export function dateTimeRange(
|
|
122
|
+
startDate: Date,
|
|
123
|
+
endDate: Date,
|
|
124
|
+
timeZone?: string,
|
|
125
|
+
): TextValue {
|
|
126
|
+
const dateValue: DateValue = {
|
|
127
|
+
type: "datetimerange",
|
|
128
|
+
start_date: formatDate(startDate),
|
|
129
|
+
start_time: formatTime(startDate),
|
|
130
|
+
end_date: formatDate(endDate),
|
|
131
|
+
end_time: formatTime(endDate),
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
if (timeZone) {
|
|
135
|
+
dateValue.time_zone = timeZone;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return createDateToken(dateValue);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Creates a link with custom display text.
|
|
21
143
|
* @param displayText - The text to display
|
|
22
144
|
* @param url - The URL to link to
|
|
23
145
|
*/
|
|
24
146
|
export function link(displayText: string, url: string): TextValue {
|
|
25
147
|
return [[displayText, [["a", url]]]];
|
|
26
148
|
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Creates a select value from a single option.
|
|
152
|
+
*/
|
|
153
|
+
export function select(value: string): TextValue {
|
|
154
|
+
return [[value]];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Creates a multi-select value from multiple options.
|
|
159
|
+
* @param values - Array of option names to select
|
|
160
|
+
*/
|
|
161
|
+
export function multiSelect(...values: string[]): TextValue {
|
|
162
|
+
if (values.length === 0) {
|
|
163
|
+
return [];
|
|
164
|
+
}
|
|
165
|
+
return [[values.join(",")]];
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Creates a status value from a status option name.
|
|
170
|
+
*/
|
|
171
|
+
export function status(value: string): TextValue {
|
|
172
|
+
return [[value]];
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Validates a date string is in YYYY-MM-DD format and represents a valid date.
|
|
177
|
+
*/
|
|
178
|
+
function validateDateString(dateString: string): void {
|
|
179
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(dateString)) {
|
|
180
|
+
throw new Error(
|
|
181
|
+
`Invalid date format: ${dateString}. Expected YYYY-MM-DD format.`,
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const date = new Date(dateString);
|
|
186
|
+
if (Number.isNaN(date.getTime())) {
|
|
187
|
+
throw new Error(`Invalid date: ${dateString}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Internal helper to create a date mention token from a DateValue object.
|
|
193
|
+
*/
|
|
194
|
+
function createDateToken(dateValue: DateValue): TextValue {
|
|
195
|
+
return [["\u2023", [["d", dateValue]]]];
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Formats a Date object to YYYY-MM-DD string.
|
|
200
|
+
*/
|
|
201
|
+
function formatDate(date: Date): string {
|
|
202
|
+
const year = date.getFullYear();
|
|
203
|
+
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
204
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
205
|
+
return `${year}-${month}-${day}`;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Formats a Date object to HH:mm string.
|
|
210
|
+
*/
|
|
211
|
+
function formatTime(date: Date): string {
|
|
212
|
+
const hours = String(date.getHours()).padStart(2, "0");
|
|
213
|
+
const minutes = String(date.getMinutes()).padStart(2, "0");
|
|
214
|
+
return `${hours}:${minutes}`;
|
|
215
|
+
}
|
package/src/capabilities/tool.ts
CHANGED
|
@@ -26,6 +26,13 @@ export class InvalidToolInputError extends Error {
|
|
|
26
26
|
super(message);
|
|
27
27
|
this.name = "InvalidToolInputError";
|
|
28
28
|
}
|
|
29
|
+
|
|
30
|
+
toJSON() {
|
|
31
|
+
return {
|
|
32
|
+
name: this.name,
|
|
33
|
+
message: this.message,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
29
36
|
}
|
|
30
37
|
|
|
31
38
|
/**
|
|
@@ -36,6 +43,13 @@ export class InvalidToolOutputError extends Error {
|
|
|
36
43
|
super(message);
|
|
37
44
|
this.name = "InvalidToolOutputError";
|
|
38
45
|
}
|
|
46
|
+
|
|
47
|
+
toJSON() {
|
|
48
|
+
return {
|
|
49
|
+
name: this.name,
|
|
50
|
+
message: this.message,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
39
53
|
}
|
|
40
54
|
|
|
41
55
|
/**
|
|
@@ -46,6 +60,13 @@ export class ToolExecutionError extends Error {
|
|
|
46
60
|
super(message);
|
|
47
61
|
this.name = "ToolExecutionError";
|
|
48
62
|
}
|
|
63
|
+
|
|
64
|
+
toJSON() {
|
|
65
|
+
return {
|
|
66
|
+
name: this.name,
|
|
67
|
+
message: this.message,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
49
70
|
}
|
|
50
71
|
|
|
51
72
|
/**
|
|
@@ -109,23 +130,33 @@ export function tool<I extends JSONValue, O extends JSONValue = JSONValue>(
|
|
|
109
130
|
);
|
|
110
131
|
}
|
|
111
132
|
|
|
112
|
-
|
|
133
|
+
const result = {
|
|
113
134
|
_tag: "error" as const,
|
|
114
135
|
error: new InvalidToolInputError(
|
|
115
136
|
JSON.stringify(validateInput.errors, null, 2),
|
|
116
137
|
),
|
|
117
138
|
};
|
|
139
|
+
|
|
140
|
+
process.stdout.write(`\n<output>${JSON.stringify(result)}</output>\n`);
|
|
141
|
+
|
|
142
|
+
return result;
|
|
118
143
|
}
|
|
119
144
|
|
|
120
145
|
try {
|
|
121
146
|
const result = await config.execute(input);
|
|
122
147
|
if (validateOutput && !validateOutput(result)) {
|
|
123
|
-
|
|
148
|
+
const result = {
|
|
124
149
|
_tag: "error" as const,
|
|
125
150
|
error: new InvalidToolOutputError(
|
|
126
151
|
JSON.stringify(validateOutput.errors, null, 2),
|
|
127
152
|
),
|
|
128
153
|
};
|
|
154
|
+
|
|
155
|
+
process.stdout.write(
|
|
156
|
+
`\n<output>${JSON.stringify(result)}</output>\n`,
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
return result;
|
|
129
160
|
}
|
|
130
161
|
|
|
131
162
|
process.stdout.write(`\n<output>${JSON.stringify(result)}</output>\n`);
|
|
@@ -135,12 +166,16 @@ export function tool<I extends JSONValue, O extends JSONValue = JSONValue>(
|
|
|
135
166
|
value: result,
|
|
136
167
|
};
|
|
137
168
|
} catch (err) {
|
|
138
|
-
|
|
169
|
+
const result = {
|
|
139
170
|
_tag: "error" as const,
|
|
140
171
|
error: new ToolExecutionError(
|
|
141
172
|
err instanceof Error ? err.message : String(err),
|
|
142
173
|
),
|
|
143
174
|
};
|
|
175
|
+
|
|
176
|
+
process.stdout.write(`\n<output>${JSON.stringify(result)}</output>\n`);
|
|
177
|
+
|
|
178
|
+
return result;
|
|
144
179
|
}
|
|
145
180
|
},
|
|
146
181
|
};
|
package/src/schema.ts
CHANGED
|
@@ -1,7 +1,26 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
DateFormat,
|
|
3
|
+
NumberFormat,
|
|
4
|
+
SelectOption,
|
|
5
|
+
StatusGroup,
|
|
6
|
+
} from "./types.js";
|
|
7
|
+
|
|
1
8
|
/**
|
|
2
9
|
* Supported property types for sync schemas.
|
|
3
10
|
*/
|
|
4
|
-
export type PropertyType =
|
|
11
|
+
export type PropertyType =
|
|
12
|
+
| "title"
|
|
13
|
+
| "rich_text"
|
|
14
|
+
| "url"
|
|
15
|
+
| "email"
|
|
16
|
+
| "phone_number"
|
|
17
|
+
| "checkbox"
|
|
18
|
+
| "file"
|
|
19
|
+
| "number"
|
|
20
|
+
| "date"
|
|
21
|
+
| "select"
|
|
22
|
+
| "multi_select"
|
|
23
|
+
| "status";
|
|
5
24
|
|
|
6
25
|
/**
|
|
7
26
|
* Definition of a single property in a sync schema.
|
|
@@ -16,7 +35,31 @@ export type PropertyDefinition = {
|
|
|
16
35
|
export type PropertyConfiguration =
|
|
17
36
|
| { type: "title" }
|
|
18
37
|
| { type: "text" }
|
|
19
|
-
| { type: "url" }
|
|
38
|
+
| { type: "url" }
|
|
39
|
+
| { type: "email" }
|
|
40
|
+
| { type: "phone_number" }
|
|
41
|
+
| { type: "checkbox" }
|
|
42
|
+
| { type: "file" }
|
|
43
|
+
| {
|
|
44
|
+
type: "number";
|
|
45
|
+
format?: NumberFormat;
|
|
46
|
+
}
|
|
47
|
+
| {
|
|
48
|
+
type: "date";
|
|
49
|
+
date_format?: DateFormat;
|
|
50
|
+
}
|
|
51
|
+
| {
|
|
52
|
+
type: "select";
|
|
53
|
+
options: SelectOption[];
|
|
54
|
+
}
|
|
55
|
+
| {
|
|
56
|
+
type: "multi_select";
|
|
57
|
+
options: SelectOption[];
|
|
58
|
+
}
|
|
59
|
+
| {
|
|
60
|
+
type: "status";
|
|
61
|
+
groups: StatusGroup[];
|
|
62
|
+
};
|
|
20
63
|
|
|
21
64
|
export type Schema<PK extends string> = {
|
|
22
65
|
dataSourceTitle: string;
|
|
@@ -52,3 +95,68 @@ export function richText(): PropertyConfiguration {
|
|
|
52
95
|
export function url(): PropertyConfiguration {
|
|
53
96
|
return { type: "url" };
|
|
54
97
|
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Creates an email property definition.
|
|
101
|
+
*/
|
|
102
|
+
export function email(): PropertyConfiguration {
|
|
103
|
+
return { type: "email" };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Creates a phone number property definition.
|
|
108
|
+
*/
|
|
109
|
+
export function phoneNumber(): PropertyConfiguration {
|
|
110
|
+
return { type: "phone_number" };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Creates a checkbox property definition.
|
|
115
|
+
*/
|
|
116
|
+
export function checkbox(): PropertyConfiguration {
|
|
117
|
+
return { type: "checkbox" };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Creates a file property definition.
|
|
122
|
+
*/
|
|
123
|
+
export function file(): PropertyConfiguration {
|
|
124
|
+
return { type: "file" };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Creates a number property definition with optional formatting.
|
|
129
|
+
*/
|
|
130
|
+
export function number(format?: NumberFormat): PropertyConfiguration {
|
|
131
|
+
return format ? { type: "number", format } : { type: "number" };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Creates a date property definition with optional formatting.
|
|
136
|
+
*/
|
|
137
|
+
export function date(date_format?: DateFormat): PropertyConfiguration {
|
|
138
|
+
return date_format ? { type: "date", date_format } : { type: "date" };
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Creates a select property definition with predefined options.
|
|
143
|
+
*/
|
|
144
|
+
export function select(options: SelectOption[]): PropertyConfiguration {
|
|
145
|
+
return { type: "select", options };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Creates a multi-select property definition with predefined options.
|
|
150
|
+
*/
|
|
151
|
+
export function multiSelect(options: SelectOption[]): PropertyConfiguration {
|
|
152
|
+
return { type: "multi_select", options };
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Creates a status property definition with groups.
|
|
157
|
+
*/
|
|
158
|
+
export function status(config: {
|
|
159
|
+
groups: StatusGroup[];
|
|
160
|
+
}): PropertyConfiguration {
|
|
161
|
+
return { type: "status", groups: config.groups };
|
|
162
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -8,3 +8,109 @@ type TextToken = [string, ...unknown[]];
|
|
|
8
8
|
* A TextValue is an array of text tokens, representing rich text content.
|
|
9
9
|
*/
|
|
10
10
|
export type TextValue = Array<TextToken>;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Select option color types supported by Notion
|
|
14
|
+
*/
|
|
15
|
+
export type SelectColor =
|
|
16
|
+
| "default"
|
|
17
|
+
| "gray"
|
|
18
|
+
| "brown"
|
|
19
|
+
| "orange"
|
|
20
|
+
| "yellow"
|
|
21
|
+
| "green"
|
|
22
|
+
| "blue"
|
|
23
|
+
| "purple"
|
|
24
|
+
| "pink"
|
|
25
|
+
| "red";
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* A select option with an optional color
|
|
29
|
+
*/
|
|
30
|
+
export interface SelectOption {
|
|
31
|
+
name: string;
|
|
32
|
+
color?: SelectColor;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Status group types in Notion
|
|
37
|
+
*/
|
|
38
|
+
export type StatusGroupType = "To-do" | "In progress" | "Complete";
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Status group configuration
|
|
42
|
+
*/
|
|
43
|
+
export interface StatusGroup {
|
|
44
|
+
name: StatusGroupType;
|
|
45
|
+
options: SelectOption[];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Date object representing a single date without time
|
|
50
|
+
*/
|
|
51
|
+
export interface NotionDate {
|
|
52
|
+
type: "date";
|
|
53
|
+
start_date: string; // Format: "YYYY-MM-DD"
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Date object representing a date with time
|
|
58
|
+
*/
|
|
59
|
+
export interface NotionDateTime {
|
|
60
|
+
type: "datetime";
|
|
61
|
+
start_date: string; // Format: "YYYY-MM-DD"
|
|
62
|
+
start_time: string; // Format: "HH:mm"
|
|
63
|
+
time_zone?: string; // e.g., "America/Los_Angeles"
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Date object representing a date range
|
|
68
|
+
*/
|
|
69
|
+
export interface DateRange {
|
|
70
|
+
type: "daterange";
|
|
71
|
+
start_date: string; // Format: "YYYY-MM-DD"
|
|
72
|
+
end_date: string; // Format: "YYYY-MM-DD"
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Date object representing a date-time range
|
|
77
|
+
*/
|
|
78
|
+
export interface DateTimeRange {
|
|
79
|
+
type: "datetimerange";
|
|
80
|
+
start_date: string; // Format: "YYYY-MM-DD"
|
|
81
|
+
start_time: string; // Format: "HH:mm"
|
|
82
|
+
end_date: string; // Format: "YYYY-MM-DD"
|
|
83
|
+
end_time: string; // Format: "HH:mm"
|
|
84
|
+
time_zone?: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* All possible date value types
|
|
89
|
+
*/
|
|
90
|
+
export type DateValue = NotionDate | NotionDateTime | DateRange | DateTimeRange;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Number format types
|
|
94
|
+
*/
|
|
95
|
+
export type NumberFormat =
|
|
96
|
+
| "number"
|
|
97
|
+
| "number_with_commas"
|
|
98
|
+
| "percent"
|
|
99
|
+
| "dollar"
|
|
100
|
+
| "euro"
|
|
101
|
+
| "pound"
|
|
102
|
+
| "yen"
|
|
103
|
+
| "rupee"
|
|
104
|
+
| "won"
|
|
105
|
+
| "yuan";
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Date format types
|
|
109
|
+
*/
|
|
110
|
+
export type DateFormat =
|
|
111
|
+
| "relative"
|
|
112
|
+
| "MM/DD/YYYY"
|
|
113
|
+
| "DD/MM/YYYY"
|
|
114
|
+
| "YYYY/MM/DD"
|
|
115
|
+
| "ll"
|
|
116
|
+
| "MMM d";
|