@softr/sdk 0.0.25 → 0.0.26-alpha-0
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/action.d.ts +195 -0
- package/dist/action.js +21 -0
- package/dist/auth/isomorphic.d.ts +1 -2
- package/dist/auth/permissions.d.ts +7 -2
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +23 -0
- package/dist/codegen/datasource-types.js +471 -0
- package/dist/codegen/fetch-metadata.js +46 -0
- package/dist/codegen/softr-env.js +102 -0
- package/dist/codegen/user-groups.js +11 -0
- package/dist/core/integration.js +1 -1
- package/dist/datasource/chart.d.ts +196 -0
- package/dist/datasource/chart.js +289 -0
- package/dist/datasource/datasource.d.ts +16 -0
- package/dist/datasource/datasource.js +17 -0
- package/dist/datasource/fields.d.ts +122 -0
- package/dist/datasource/fields.js +82 -0
- package/dist/datasource/filter.d.ts +30 -0
- package/dist/datasource/filter.js +146 -0
- package/dist/datasource/record.d.ts +138 -0
- package/dist/datasource/record.js +258 -0
- package/dist/index.d.ts +3 -5
- package/dist/index.js +2 -2
- package/dist/package.js +5 -0
- package/dist/routes/visibility.d.ts +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +1 -1
- package/package.json +31 -8
- package/skills/softr-sdk/SKILL.md +9 -5
- package/skills/softr-sdk/charts-and-metrics/SKILL.md +178 -0
- package/skills/softr-sdk/charts-and-metrics/references/aggregations.md +76 -0
- package/skills/softr-sdk/data-mutations/SKILL.md +75 -55
- package/skills/softr-sdk/reading-records/SKILL.md +76 -92
- package/skills/softr-sdk/reading-records/references/field-types.md +41 -48
- package/skills/softr-sdk/reading-records/references/query-builder.md +66 -70
- package/dist/core/datasource.d.ts +0 -31
- package/dist/core/datasource.js +0 -226
- package/dist/core/query.d.ts +0 -354
- package/dist/core/query.js +0 -528
- package/dist/core/utils.js +0 -14
- package/dist/types.d.ts +0 -128
package/dist/core/datasource.js
DELETED
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
import { buildFilterCriteria, buildOrderBy, dealiasFilterCriteria, dealiasOrderBy } from "./query.js";
|
|
2
|
-
import { panic } from "../assertions.js";
|
|
3
|
-
import { readUserTimezone } from "../cookies.js";
|
|
4
|
-
import { sessionConfig } from "../auth/config.js";
|
|
5
|
-
import { readSessionToken } from "../auth/session.js";
|
|
6
|
-
import { assertResponseOk } from "./utils.js";
|
|
7
|
-
|
|
8
|
-
//#region src/core/datasource.ts
|
|
9
|
-
const MAX_RECORD_COUNT = 100;
|
|
10
|
-
const COUNT_CNT = "COUNT_CNT";
|
|
11
|
-
const dsUrl = (datasourceId) => {
|
|
12
|
-
const datasourceApiUrl = process.env.SOFTR_DATASOURCE_API_URL;
|
|
13
|
-
if (!datasourceApiUrl) panic("SOFTR_DATASOURCE_API_URL is not set.");
|
|
14
|
-
const { applicationId } = sessionConfig();
|
|
15
|
-
return `${withoutTrailingSlash(datasourceApiUrl)}/v1/datasource/vibe/applications/${applicationId}/datasources/${datasourceId}`;
|
|
16
|
-
};
|
|
17
|
-
async function listRecords(datasourceId, options = {}) {
|
|
18
|
-
const { select, where, orderBy } = options;
|
|
19
|
-
const count = Math.min(options.limit ?? 20, MAX_RECORD_COUNT);
|
|
20
|
-
const offset = options.offset ?? null;
|
|
21
|
-
const filterCriteria = where ? dealiasFilterCriteria(buildFilterCriteria(where), select ?? {}) : {};
|
|
22
|
-
const sortingOption = orderBy ? dealiasOrderBy(buildOrderBy(orderBy), select ?? {}) : void 0;
|
|
23
|
-
const res = await fetch(`${dsUrl(datasourceId)}/records`, {
|
|
24
|
-
method: "POST",
|
|
25
|
-
headers: {
|
|
26
|
-
"Content-Type": "application/json",
|
|
27
|
-
"X-User-Timezone": options.timeZone ?? readUserTimezone() ?? "UTC",
|
|
28
|
-
"Authorization": `Bearer ${readSessionToken()}`
|
|
29
|
-
},
|
|
30
|
-
body: JSON.stringify({
|
|
31
|
-
options: { userLocale: "en-US" },
|
|
32
|
-
filterCriteria,
|
|
33
|
-
sortingOption,
|
|
34
|
-
pagingOption: {
|
|
35
|
-
offset,
|
|
36
|
-
count
|
|
37
|
-
}
|
|
38
|
-
})
|
|
39
|
-
});
|
|
40
|
-
await assertResponseOk(res, `Softr datasource list failed for "${datasourceId}"`);
|
|
41
|
-
const payload = await res.json();
|
|
42
|
-
const nextOffset = payload.offset < payload.total ? payload.offset : null;
|
|
43
|
-
return {
|
|
44
|
-
records: payload.items.map((item) => ({
|
|
45
|
-
id: item.id,
|
|
46
|
-
fields: select ? aliasFields(item.fields, select) : item.fields
|
|
47
|
-
})),
|
|
48
|
-
total: payload.total,
|
|
49
|
-
nextOffset
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
async function getRecord(datasourceId, options) {
|
|
53
|
-
if (options.id !== void 0) {
|
|
54
|
-
if (!options.id) throw new Error(`Softr datasource get: id must not be empty`);
|
|
55
|
-
const res = await fetch(`${dsUrl(datasourceId)}/records/${options.id}`, {
|
|
56
|
-
method: "POST",
|
|
57
|
-
headers: {
|
|
58
|
-
"Content-Type": "application/json",
|
|
59
|
-
"X-User-Timezone": options.timeZone ?? readUserTimezone() ?? "UTC",
|
|
60
|
-
"Authorization": `Bearer ${readSessionToken()}`
|
|
61
|
-
},
|
|
62
|
-
body: JSON.stringify({ options: { userLocale: "en-US" } })
|
|
63
|
-
});
|
|
64
|
-
await assertResponseOk(res, `Softr datasource get failed for "${datasourceId}"`);
|
|
65
|
-
const contentLength = res.headers.get("Content-Length");
|
|
66
|
-
if (contentLength && parseInt(contentLength, 10) === 0) return null;
|
|
67
|
-
const record = await res.json();
|
|
68
|
-
return {
|
|
69
|
-
id: record.id,
|
|
70
|
-
fields: options.select ? aliasFields(record.fields, options.select) : record.fields
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
return (await listRecords(datasourceId, {
|
|
74
|
-
where: options.where,
|
|
75
|
-
select: options.select,
|
|
76
|
-
limit: 1,
|
|
77
|
-
timeZone: options.timeZone
|
|
78
|
-
})).records[0] ?? null;
|
|
79
|
-
}
|
|
80
|
-
async function createRecord(datasourceId, options) {
|
|
81
|
-
const rawFields = options.select ? dealiasData(options.data, options.select) : options.data;
|
|
82
|
-
const res = await fetch(`${dsUrl(datasourceId)}/records/new`, {
|
|
83
|
-
method: "POST",
|
|
84
|
-
headers: {
|
|
85
|
-
"Content-Type": "application/json",
|
|
86
|
-
"Authorization": `Bearer ${readSessionToken()}`
|
|
87
|
-
},
|
|
88
|
-
body: JSON.stringify({ fields: rawFields })
|
|
89
|
-
});
|
|
90
|
-
await assertResponseOk(res, `Softr datasource create failed for "${datasourceId}"`);
|
|
91
|
-
const record = await res.json();
|
|
92
|
-
return {
|
|
93
|
-
id: record.id,
|
|
94
|
-
fields: options.select ? aliasFields(record.fields, options.select) : record.fields
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
async function updateRecord(datasourceId, options) {
|
|
98
|
-
if (!options.id) throw new Error(`Softr datasource update: id must not be empty`);
|
|
99
|
-
const rawFields = options.select ? dealiasData(options.data, options.select) : options.data;
|
|
100
|
-
const res = await fetch(`${dsUrl(datasourceId)}/records/${options.id}`, {
|
|
101
|
-
method: "PATCH",
|
|
102
|
-
headers: {
|
|
103
|
-
"Content-Type": "application/json",
|
|
104
|
-
"Authorization": `Bearer ${readSessionToken()}`
|
|
105
|
-
},
|
|
106
|
-
body: JSON.stringify({ fields: rawFields })
|
|
107
|
-
});
|
|
108
|
-
await assertResponseOk(res, `Softr datasource update failed for "${datasourceId}"`);
|
|
109
|
-
const record = await res.json();
|
|
110
|
-
return {
|
|
111
|
-
id: record.id,
|
|
112
|
-
fields: options.select ? aliasFields(record.fields, options.select) : record.fields
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
async function deleteRecord(datasourceId, id) {
|
|
116
|
-
await assertResponseOk(await fetch(`${dsUrl(datasourceId)}/records/${id}`, {
|
|
117
|
-
method: "DELETE",
|
|
118
|
-
headers: { "Authorization": `Bearer ${readSessionToken()}` }
|
|
119
|
-
}), `Softr datasource delete failed for "${datasourceId}"`);
|
|
120
|
-
}
|
|
121
|
-
async function getMetric(datasourceId, options) {
|
|
122
|
-
const { select, where, aggregation, field } = options;
|
|
123
|
-
if (aggregation !== "COUNT" && !field) throw new Error(`field is required for aggregation "${aggregation}"`);
|
|
124
|
-
const fieldId = field ? select?.[field] ?? field : void 0;
|
|
125
|
-
const filterCriteria = where ? dealiasFilterCriteria(buildFilterCriteria(where), select ?? {}) : {};
|
|
126
|
-
const res = await fetch(`${dsUrl(datasourceId)}/chart/data`, {
|
|
127
|
-
method: "POST",
|
|
128
|
-
headers: {
|
|
129
|
-
"Content-Type": "application/json",
|
|
130
|
-
"X-User-Timezone": options.timeZone ?? readUserTimezone() ?? "UTC",
|
|
131
|
-
"Authorization": `Bearer ${readSessionToken()}`
|
|
132
|
-
},
|
|
133
|
-
body: JSON.stringify({
|
|
134
|
-
options: { userLocale: "en-US" },
|
|
135
|
-
groupBy: [],
|
|
136
|
-
metrics: [{
|
|
137
|
-
field: fieldId,
|
|
138
|
-
aggregation
|
|
139
|
-
}],
|
|
140
|
-
filterCriteria
|
|
141
|
-
})
|
|
142
|
-
});
|
|
143
|
-
await assertResponseOk(res, `Softr datasource metric failed for "${datasourceId}"`);
|
|
144
|
-
const payload = await res.json();
|
|
145
|
-
const executionTimestamp = /* @__PURE__ */ new Date(payload.executionTimestamp * 1e3);
|
|
146
|
-
let value;
|
|
147
|
-
const responseKey = aggregation === "COUNT" && !fieldId ? COUNT_CNT : fieldId;
|
|
148
|
-
value = payload.data.find((item) => responseKey in item)?.[responseKey] ?? null;
|
|
149
|
-
return {
|
|
150
|
-
value,
|
|
151
|
-
executionTimestamp
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
async function getChart(datasourceId, options) {
|
|
155
|
-
const { select, where, groupBy, metrics, orderBy } = options;
|
|
156
|
-
const filterCriteria = where ? dealiasFilterCriteria(buildFilterCriteria(where), select ?? {}) : {};
|
|
157
|
-
const sortingOptions = orderBy ? dealiasOrderBy(buildOrderBy(orderBy), select ?? {}) : void 0;
|
|
158
|
-
const groupByFields = (Array.isArray(groupBy) ? groupBy : [groupBy]).map((field) => ({ field: select?.[field] ?? field }));
|
|
159
|
-
const yAxisFields = Object.values(metrics).map(({ field, aggregation }) => ({
|
|
160
|
-
field: field ? select?.[field] ?? field : void 0,
|
|
161
|
-
aggregation
|
|
162
|
-
}));
|
|
163
|
-
if (!yAxisFields.length) throw new Error("chart requires at least one metric");
|
|
164
|
-
const res = await fetch(`${dsUrl(datasourceId)}/chart/data`, {
|
|
165
|
-
method: "POST",
|
|
166
|
-
headers: {
|
|
167
|
-
"Content-Type": "application/json",
|
|
168
|
-
"X-User-Timezone": options.timeZone ?? readUserTimezone() ?? "UTC",
|
|
169
|
-
"Authorization": `Bearer ${readSessionToken()}`
|
|
170
|
-
},
|
|
171
|
-
body: JSON.stringify({
|
|
172
|
-
options: { userLocale: "en-US" },
|
|
173
|
-
filterCriteria,
|
|
174
|
-
sortingOptions,
|
|
175
|
-
groupBy: groupByFields,
|
|
176
|
-
metrics: yAxisFields
|
|
177
|
-
})
|
|
178
|
-
});
|
|
179
|
-
await assertResponseOk(res, `Softr datasource chart failed for "${datasourceId}"`);
|
|
180
|
-
const payload = await res.json();
|
|
181
|
-
const executionTimestamp = /* @__PURE__ */ new Date(payload.executionTimestamp * 1e3);
|
|
182
|
-
const aliases = {};
|
|
183
|
-
const multipleMetrics = Object.keys(metrics).length > 1;
|
|
184
|
-
for (const [alias, { field, aggregation }] of Object.entries(metrics)) if (aggregation === "COUNT") aliases[COUNT_CNT] = alias;
|
|
185
|
-
else {
|
|
186
|
-
const fieldId = field ? select?.[field] ?? field : field;
|
|
187
|
-
if (fieldId) {
|
|
188
|
-
const suffix = multipleMetrics ? `_${aggregation.toLowerCase()}` : "";
|
|
189
|
-
aliases[fieldId + suffix] = alias;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
for (const field of Array.isArray(groupBy) ? groupBy : [groupBy]) aliases[select?.[field] ?? field] = field;
|
|
193
|
-
return {
|
|
194
|
-
data: payload.data.map((item) => {
|
|
195
|
-
const row = {};
|
|
196
|
-
for (const [rawKey, alias] of Object.entries(aliases)) if (rawKey in item) row[alias] = item[rawKey];
|
|
197
|
-
return row;
|
|
198
|
-
}),
|
|
199
|
-
executionTimestamp
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
function aliasFields(fields, aliases) {
|
|
203
|
-
const result = {};
|
|
204
|
-
for (const [alias, fieldId] of Object.entries(aliases)) result[alias] = fields[fieldId];
|
|
205
|
-
return result;
|
|
206
|
-
}
|
|
207
|
-
function dealiasData(data, select) {
|
|
208
|
-
const result = {};
|
|
209
|
-
for (const [alias, value] of Object.entries(data)) result[select[alias] ?? alias] = value;
|
|
210
|
-
return result;
|
|
211
|
-
}
|
|
212
|
-
const ds = {
|
|
213
|
-
list: listRecords,
|
|
214
|
-
get: getRecord,
|
|
215
|
-
create: createRecord,
|
|
216
|
-
update: updateRecord,
|
|
217
|
-
delete: deleteRecord,
|
|
218
|
-
metric: getMetric,
|
|
219
|
-
chart: getChart
|
|
220
|
-
};
|
|
221
|
-
function withoutTrailingSlash(url) {
|
|
222
|
-
return url.replace(/\/+$/, "");
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
//#endregion
|
|
226
|
-
export { ds, dsUrl };
|
package/dist/core/query.d.ts
DELETED
|
@@ -1,354 +0,0 @@
|
|
|
1
|
-
//#region src/core/query.d.ts
|
|
2
|
-
|
|
3
|
-
type LogicalOperator = "AND" | "OR";
|
|
4
|
-
type FilterOperator = "IS" | "IS_NOT" | "EQUAL" | "NOT_EQUAL" | "IS_EMPTY" | "IS_NOT_EMPTY" | "IS_ONE_OF" | "IS_NONE_OF" | "HAS_ALL_OF" | "HAS_ONE_OF" | "HAS_NONE_OF" | "CONTAINS" | "INLINE_CONTAINS" | "GT" | "LT" | "GTE" | "LTE" | "BETWEEN" | "IS_NOT_BETWEEN" | "DOES_NOT_CONTAINS" | "STARTS_WITH" | "ENDS_WITH";
|
|
5
|
-
type ConditionFieldType = "TEXT" | "BOOLEAN" | "NUMERIC" | "ARRAY" | "DATE";
|
|
6
|
-
interface Filter {
|
|
7
|
-
subject: string;
|
|
8
|
-
operator: FilterOperator;
|
|
9
|
-
value?: unknown;
|
|
10
|
-
type: ConditionFieldType;
|
|
11
|
-
}
|
|
12
|
-
type ConstructableFilter = Filter & {
|
|
13
|
-
[INTERNAL_KIND]: "FILTER";
|
|
14
|
-
};
|
|
15
|
-
type ConstructableFilterGroup = {
|
|
16
|
-
logicalOperator: LogicalOperator;
|
|
17
|
-
filters: Array<ConstructableFilter | ConstructableFilterGroup>;
|
|
18
|
-
[INTERNAL_KIND]: "LOGICAL_GROUP";
|
|
19
|
-
};
|
|
20
|
-
interface SortingOptionItem {
|
|
21
|
-
sortingField: string;
|
|
22
|
-
sortType: "ASC" | "DESC";
|
|
23
|
-
}
|
|
24
|
-
type ConstructableOrderBy = SortingOptionItem & {
|
|
25
|
-
[INTERNAL_KIND]: "ORDER_BY";
|
|
26
|
-
};
|
|
27
|
-
type AnyConstructable = ConstructableFilter | ConstructableFilterGroup;
|
|
28
|
-
declare const INTERNAL_KIND: unique symbol;
|
|
29
|
-
/**
|
|
30
|
-
* Query builder for filter queries. This exist to alleviate the (LLM?) mental overhead. API filter schema is a bit
|
|
31
|
-
* verbose and confusing, even when dealing with very basic queries. So to fall into the pit of success, aim here
|
|
32
|
-
* is to simplify filtering as much as possible.
|
|
33
|
-
*
|
|
34
|
-
* @example
|
|
35
|
-
* single filter
|
|
36
|
-
* ```tsx
|
|
37
|
-
* const query = q.text("title").contains("hello");
|
|
38
|
-
*
|
|
39
|
-
* const json = buildFilterCriteria(query);
|
|
40
|
-
* // result
|
|
41
|
-
* {
|
|
42
|
-
* "filterCriteria": {
|
|
43
|
-
* "filterConditionGroup": {
|
|
44
|
-
* "logicalOperator": "AND"
|
|
45
|
-
* "filterGroups": [{
|
|
46
|
-
* "logicalOperator": "AND",
|
|
47
|
-
* "filters": [{
|
|
48
|
-
* "subject": "title",
|
|
49
|
-
* "type": "TEXT",
|
|
50
|
-
* "operator": "CONTAINS",
|
|
51
|
-
* "value": "hello"
|
|
52
|
-
* }],
|
|
53
|
-
* }]
|
|
54
|
-
* }
|
|
55
|
-
* }
|
|
56
|
-
* }
|
|
57
|
-
*
|
|
58
|
-
* ```
|
|
59
|
-
*
|
|
60
|
-
* @example
|
|
61
|
-
* combining multiple filters
|
|
62
|
-
* ```tsx
|
|
63
|
-
* const query = q.and(
|
|
64
|
-
* q.text("title").contains("hello"),
|
|
65
|
-
* q.number("views").is(100),
|
|
66
|
-
* q.or(
|
|
67
|
-
* q.text("author").is("John"),
|
|
68
|
-
* q.boolean("isPublished").is(true)
|
|
69
|
-
* )
|
|
70
|
-
* );
|
|
71
|
-
* ```
|
|
72
|
-
*/
|
|
73
|
-
declare const q: {
|
|
74
|
-
select<T extends Record<string, string>>(mapping: T): T;
|
|
75
|
-
and(...filters: AnyConstructable[]): ConstructableFilterGroup;
|
|
76
|
-
or(...filters: AnyConstructable[]): ConstructableFilterGroup;
|
|
77
|
-
text(subject: string): {
|
|
78
|
-
is(value: string): {
|
|
79
|
-
operator: "IS";
|
|
80
|
-
value: string;
|
|
81
|
-
subject: string;
|
|
82
|
-
type: "TEXT";
|
|
83
|
-
[INTERNAL_KIND]: "FILTER";
|
|
84
|
-
};
|
|
85
|
-
isNot(value: string): {
|
|
86
|
-
operator: "IS_NOT";
|
|
87
|
-
value: string;
|
|
88
|
-
subject: string;
|
|
89
|
-
type: "TEXT";
|
|
90
|
-
[INTERNAL_KIND]: "FILTER";
|
|
91
|
-
};
|
|
92
|
-
contains(value: string): {
|
|
93
|
-
operator: "CONTAINS";
|
|
94
|
-
value: string;
|
|
95
|
-
subject: string;
|
|
96
|
-
type: "TEXT";
|
|
97
|
-
[INTERNAL_KIND]: "FILTER";
|
|
98
|
-
};
|
|
99
|
-
isOneOf(value: string[]): {
|
|
100
|
-
operator: "IS_ONE_OF";
|
|
101
|
-
value: string[];
|
|
102
|
-
subject: string;
|
|
103
|
-
type: "TEXT";
|
|
104
|
-
[INTERNAL_KIND]: "FILTER";
|
|
105
|
-
};
|
|
106
|
-
isNoneOf(value: string[]): {
|
|
107
|
-
operator: "IS_NONE_OF";
|
|
108
|
-
value: string[];
|
|
109
|
-
subject: string;
|
|
110
|
-
type: "TEXT";
|
|
111
|
-
[INTERNAL_KIND]: "FILTER";
|
|
112
|
-
};
|
|
113
|
-
startsWith(value: string): {
|
|
114
|
-
operator: "STARTS_WITH";
|
|
115
|
-
value: string;
|
|
116
|
-
subject: string;
|
|
117
|
-
type: "TEXT";
|
|
118
|
-
[INTERNAL_KIND]: "FILTER";
|
|
119
|
-
};
|
|
120
|
-
endsWith(value: string): {
|
|
121
|
-
operator: "ENDS_WITH";
|
|
122
|
-
value: string;
|
|
123
|
-
subject: string;
|
|
124
|
-
type: "TEXT";
|
|
125
|
-
[INTERNAL_KIND]: "FILTER";
|
|
126
|
-
};
|
|
127
|
-
hasAllOf(value: string[]): {
|
|
128
|
-
operator: "HAS_ALL_OF";
|
|
129
|
-
value: string[];
|
|
130
|
-
subject: string;
|
|
131
|
-
type: "TEXT";
|
|
132
|
-
[INTERNAL_KIND]: "FILTER";
|
|
133
|
-
};
|
|
134
|
-
isEmpty(): {
|
|
135
|
-
operator: "IS_EMPTY";
|
|
136
|
-
subject: string;
|
|
137
|
-
type: "TEXT";
|
|
138
|
-
[INTERNAL_KIND]: "FILTER";
|
|
139
|
-
};
|
|
140
|
-
isNotEmpty(): {
|
|
141
|
-
operator: "IS_NOT_EMPTY";
|
|
142
|
-
subject: string;
|
|
143
|
-
type: "TEXT";
|
|
144
|
-
[INTERNAL_KIND]: "FILTER";
|
|
145
|
-
};
|
|
146
|
-
};
|
|
147
|
-
boolean(subject: string): {
|
|
148
|
-
is(value: boolean): {
|
|
149
|
-
operator: "IS";
|
|
150
|
-
value: boolean;
|
|
151
|
-
subject: string;
|
|
152
|
-
type: "BOOLEAN";
|
|
153
|
-
[INTERNAL_KIND]: "FILTER";
|
|
154
|
-
};
|
|
155
|
-
isNot(value: boolean): {
|
|
156
|
-
operator: "IS_NOT";
|
|
157
|
-
value: boolean;
|
|
158
|
-
subject: string;
|
|
159
|
-
type: "BOOLEAN";
|
|
160
|
-
[INTERNAL_KIND]: "FILTER";
|
|
161
|
-
};
|
|
162
|
-
isEmpty(): {
|
|
163
|
-
operator: "IS_EMPTY";
|
|
164
|
-
subject: string;
|
|
165
|
-
type: "BOOLEAN";
|
|
166
|
-
[INTERNAL_KIND]: "FILTER";
|
|
167
|
-
};
|
|
168
|
-
isNotEmpty(): {
|
|
169
|
-
operator: "IS_NOT_EMPTY";
|
|
170
|
-
subject: string;
|
|
171
|
-
type: "BOOLEAN";
|
|
172
|
-
[INTERNAL_KIND]: "FILTER";
|
|
173
|
-
};
|
|
174
|
-
};
|
|
175
|
-
number(subject: string): {
|
|
176
|
-
is(value: number): {
|
|
177
|
-
operator: "IS";
|
|
178
|
-
value: string;
|
|
179
|
-
subject: string;
|
|
180
|
-
type: "NUMERIC";
|
|
181
|
-
[INTERNAL_KIND]: "FILTER";
|
|
182
|
-
};
|
|
183
|
-
isNot(value: number): {
|
|
184
|
-
operator: "IS_NOT";
|
|
185
|
-
value: string;
|
|
186
|
-
subject: string;
|
|
187
|
-
type: "NUMERIC";
|
|
188
|
-
[INTERNAL_KIND]: "FILTER";
|
|
189
|
-
};
|
|
190
|
-
gt(value: number): {
|
|
191
|
-
operator: "GT";
|
|
192
|
-
value: string;
|
|
193
|
-
subject: string;
|
|
194
|
-
type: "NUMERIC";
|
|
195
|
-
[INTERNAL_KIND]: "FILTER";
|
|
196
|
-
};
|
|
197
|
-
gte(value: number): {
|
|
198
|
-
operator: "GTE";
|
|
199
|
-
value: string;
|
|
200
|
-
subject: string;
|
|
201
|
-
type: "NUMERIC";
|
|
202
|
-
[INTERNAL_KIND]: "FILTER";
|
|
203
|
-
};
|
|
204
|
-
lt(value: number): {
|
|
205
|
-
operator: "LT";
|
|
206
|
-
value: string;
|
|
207
|
-
subject: string;
|
|
208
|
-
type: "NUMERIC";
|
|
209
|
-
[INTERNAL_KIND]: "FILTER";
|
|
210
|
-
};
|
|
211
|
-
lte(value: number): {
|
|
212
|
-
operator: "LTE";
|
|
213
|
-
value: string;
|
|
214
|
-
subject: string;
|
|
215
|
-
type: "NUMERIC";
|
|
216
|
-
[INTERNAL_KIND]: "FILTER";
|
|
217
|
-
};
|
|
218
|
-
between(start: number, end: number): {
|
|
219
|
-
operator: "BETWEEN";
|
|
220
|
-
value: string[];
|
|
221
|
-
subject: string;
|
|
222
|
-
type: "NUMERIC";
|
|
223
|
-
[INTERNAL_KIND]: "FILTER";
|
|
224
|
-
};
|
|
225
|
-
isEmpty(): {
|
|
226
|
-
operator: "IS_EMPTY";
|
|
227
|
-
subject: string;
|
|
228
|
-
type: "NUMERIC";
|
|
229
|
-
[INTERNAL_KIND]: "FILTER";
|
|
230
|
-
};
|
|
231
|
-
isNotEmpty(): {
|
|
232
|
-
operator: "IS_NOT_EMPTY";
|
|
233
|
-
subject: string;
|
|
234
|
-
type: "NUMERIC";
|
|
235
|
-
[INTERNAL_KIND]: "FILTER";
|
|
236
|
-
};
|
|
237
|
-
};
|
|
238
|
-
array(subject: string): {
|
|
239
|
-
is(value: string[]): {
|
|
240
|
-
operator: "IS";
|
|
241
|
-
value: string[];
|
|
242
|
-
subject: string;
|
|
243
|
-
type: "ARRAY";
|
|
244
|
-
[INTERNAL_KIND]: "FILTER";
|
|
245
|
-
};
|
|
246
|
-
isOneOf(value: string[]): {
|
|
247
|
-
operator: "IS_ONE_OF";
|
|
248
|
-
value: string[];
|
|
249
|
-
subject: string;
|
|
250
|
-
type: "ARRAY";
|
|
251
|
-
[INTERNAL_KIND]: "FILTER";
|
|
252
|
-
};
|
|
253
|
-
isNoneOf(value: string[]): {
|
|
254
|
-
operator: "IS_NONE_OF";
|
|
255
|
-
value: string[];
|
|
256
|
-
subject: string;
|
|
257
|
-
type: "ARRAY";
|
|
258
|
-
[INTERNAL_KIND]: "FILTER";
|
|
259
|
-
};
|
|
260
|
-
hasAllOf(value: string[]): {
|
|
261
|
-
operator: "HAS_ALL_OF";
|
|
262
|
-
value: string[];
|
|
263
|
-
subject: string;
|
|
264
|
-
type: "ARRAY";
|
|
265
|
-
[INTERNAL_KIND]: "FILTER";
|
|
266
|
-
};
|
|
267
|
-
isEmpty(): {
|
|
268
|
-
operator: "IS_EMPTY";
|
|
269
|
-
subject: string;
|
|
270
|
-
type: "ARRAY";
|
|
271
|
-
[INTERNAL_KIND]: "FILTER";
|
|
272
|
-
};
|
|
273
|
-
isNotEmpty(): {
|
|
274
|
-
operator: "IS_NOT_EMPTY";
|
|
275
|
-
subject: string;
|
|
276
|
-
type: "ARRAY";
|
|
277
|
-
[INTERNAL_KIND]: "FILTER";
|
|
278
|
-
};
|
|
279
|
-
};
|
|
280
|
-
date(subject: string): {
|
|
281
|
-
is(value: string): {
|
|
282
|
-
operator: "IS";
|
|
283
|
-
value: string;
|
|
284
|
-
subject: string;
|
|
285
|
-
type: "DATE";
|
|
286
|
-
[INTERNAL_KIND]: "FILTER";
|
|
287
|
-
};
|
|
288
|
-
isNot(value: string): {
|
|
289
|
-
operator: "IS_NOT";
|
|
290
|
-
value: string;
|
|
291
|
-
subject: string;
|
|
292
|
-
type: "DATE";
|
|
293
|
-
[INTERNAL_KIND]: "FILTER";
|
|
294
|
-
};
|
|
295
|
-
gt(value: string): {
|
|
296
|
-
operator: "GT";
|
|
297
|
-
value: string;
|
|
298
|
-
subject: string;
|
|
299
|
-
type: "DATE";
|
|
300
|
-
[INTERNAL_KIND]: "FILTER";
|
|
301
|
-
};
|
|
302
|
-
gte(value: string): {
|
|
303
|
-
operator: "GTE";
|
|
304
|
-
value: string;
|
|
305
|
-
subject: string;
|
|
306
|
-
type: "DATE";
|
|
307
|
-
[INTERNAL_KIND]: "FILTER";
|
|
308
|
-
};
|
|
309
|
-
lt(value: string): {
|
|
310
|
-
operator: "LT";
|
|
311
|
-
value: string;
|
|
312
|
-
subject: string;
|
|
313
|
-
type: "DATE";
|
|
314
|
-
[INTERNAL_KIND]: "FILTER";
|
|
315
|
-
};
|
|
316
|
-
lte(value: string): {
|
|
317
|
-
operator: "LTE";
|
|
318
|
-
value: string;
|
|
319
|
-
subject: string;
|
|
320
|
-
type: "DATE";
|
|
321
|
-
[INTERNAL_KIND]: "FILTER";
|
|
322
|
-
};
|
|
323
|
-
between(start: string, end: string): {
|
|
324
|
-
operator: "BETWEEN";
|
|
325
|
-
value: string[];
|
|
326
|
-
subject: string;
|
|
327
|
-
type: "DATE";
|
|
328
|
-
[INTERNAL_KIND]: "FILTER";
|
|
329
|
-
};
|
|
330
|
-
isNotBetween(start: string, end: string): {
|
|
331
|
-
operator: "IS_NOT_BETWEEN";
|
|
332
|
-
value: string[];
|
|
333
|
-
subject: string;
|
|
334
|
-
type: "DATE";
|
|
335
|
-
[INTERNAL_KIND]: "FILTER";
|
|
336
|
-
};
|
|
337
|
-
isEmpty(): {
|
|
338
|
-
operator: "IS_EMPTY";
|
|
339
|
-
subject: string;
|
|
340
|
-
type: "DATE";
|
|
341
|
-
[INTERNAL_KIND]: "FILTER";
|
|
342
|
-
};
|
|
343
|
-
isNotEmpty(): {
|
|
344
|
-
operator: "IS_NOT_EMPTY";
|
|
345
|
-
subject: string;
|
|
346
|
-
type: "DATE";
|
|
347
|
-
[INTERNAL_KIND]: "FILTER";
|
|
348
|
-
};
|
|
349
|
-
};
|
|
350
|
-
asc(subject: string): ConstructableOrderBy;
|
|
351
|
-
desc(subject: string): ConstructableOrderBy;
|
|
352
|
-
};
|
|
353
|
-
//#endregion
|
|
354
|
-
export { AnyConstructable, ConstructableOrderBy, q };
|