@mseep/mcp-agent-social 1.1.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/LICENSE +21 -0
- package/README.md +154 -0
- package/bin/mcp-agent-social +30 -0
- package/dist/api-client.d.ts +31 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +212 -0
- package/dist/api-client.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +79 -0
- package/dist/config.js.map +1 -0
- package/dist/hooks/index.d.ts +38 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +253 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/types.d.ts +35 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +4 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/http-server.d.ts +38 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +210 -0
- package/dist/http-server.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +186 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +44 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +281 -0
- package/dist/logger.js.map +1 -0
- package/dist/metrics.d.ts +47 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +178 -0
- package/dist/metrics.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +74 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +218 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/index.d.ts +55 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +91 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/timeout.d.ts +52 -0
- package/dist/middleware/timeout.d.ts.map +1 -0
- package/dist/middleware/timeout.js +189 -0
- package/dist/middleware/timeout.js.map +1 -0
- package/dist/middleware/validator.d.ts +25 -0
- package/dist/middleware/validator.d.ts.map +1 -0
- package/dist/middleware/validator.js +186 -0
- package/dist/middleware/validator.js.map +1 -0
- package/dist/prompts/analyze.d.ts +46 -0
- package/dist/prompts/analyze.d.ts.map +1 -0
- package/dist/prompts/analyze.js +351 -0
- package/dist/prompts/analyze.js.map +1 -0
- package/dist/prompts/generate.d.ts +48 -0
- package/dist/prompts/generate.d.ts.map +1 -0
- package/dist/prompts/generate.js +177 -0
- package/dist/prompts/generate.js.map +1 -0
- package/dist/prompts/index.d.ts +23 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +69 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/summarize.d.ts +32 -0
- package/dist/prompts/summarize.d.ts.map +1 -0
- package/dist/prompts/summarize.js +182 -0
- package/dist/prompts/summarize.js.map +1 -0
- package/dist/prompts/types.d.ts +34 -0
- package/dist/prompts/types.d.ts.map +1 -0
- package/dist/prompts/types.js +24 -0
- package/dist/prompts/types.js.map +1 -0
- package/dist/resources/agents.d.ts +17 -0
- package/dist/resources/agents.d.ts.map +1 -0
- package/dist/resources/agents.js +139 -0
- package/dist/resources/agents.js.map +1 -0
- package/dist/resources/feed.d.ts +19 -0
- package/dist/resources/feed.d.ts.map +1 -0
- package/dist/resources/feed.js +138 -0
- package/dist/resources/feed.js.map +1 -0
- package/dist/resources/index.d.ts +19 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +146 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/posts.d.ts +17 -0
- package/dist/resources/posts.d.ts.map +1 -0
- package/dist/resources/posts.js +151 -0
- package/dist/resources/posts.js.map +1 -0
- package/dist/resources/types.d.ts +91 -0
- package/dist/resources/types.d.ts.map +1 -0
- package/dist/resources/types.js +12 -0
- package/dist/resources/types.js.map +1 -0
- package/dist/roots/index.d.ts +43 -0
- package/dist/roots/index.d.ts.map +1 -0
- package/dist/roots/index.js +131 -0
- package/dist/roots/index.js.map +1 -0
- package/dist/roots/types.d.ts +31 -0
- package/dist/roots/types.d.ts.map +1 -0
- package/dist/roots/types.js +4 -0
- package/dist/roots/types.js.map +1 -0
- package/dist/session-manager.d.ts +50 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +127 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/tools/create-post.d.ts +45 -0
- package/dist/tools/create-post.d.ts.map +1 -0
- package/dist/tools/create-post.js +119 -0
- package/dist/tools/create-post.js.map +1 -0
- package/dist/tools/index.d.ts +13 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +44 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/login.d.ts +35 -0
- package/dist/tools/login.d.ts.map +1 -0
- package/dist/tools/login.js +132 -0
- package/dist/tools/login.js.map +1 -0
- package/dist/tools/read-posts.d.ts +48 -0
- package/dist/tools/read-posts.d.ts.map +1 -0
- package/dist/tools/read-posts.js +93 -0
- package/dist/tools/read-posts.js.map +1 -0
- package/dist/types.d.ts +88 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/json.d.ts +13 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +48 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/validation.d.ts +58 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +223 -0
- package/dist/validation.js.map +1 -0
- package/package.json +70 -0
- package/src/api-client.ts +292 -0
- package/src/config.ts +92 -0
- package/src/hooks/index.ts +304 -0
- package/src/hooks/types.ts +44 -0
- package/src/http-server.ts +243 -0
- package/src/index.ts +213 -0
- package/src/logger.ts +326 -0
- package/src/metrics.ts +235 -0
- package/src/middleware/error-handler.ts +252 -0
- package/src/middleware/index.ts +112 -0
- package/src/middleware/timeout.ts +216 -0
- package/src/middleware/validator.ts +216 -0
- package/src/prompts/analyze.ts +404 -0
- package/src/prompts/generate.ts +217 -0
- package/src/prompts/index.ts +121 -0
- package/src/prompts/summarize.ts +217 -0
- package/src/prompts/types.ts +44 -0
- package/src/resources/agents.ts +165 -0
- package/src/resources/feed.ts +169 -0
- package/src/resources/index.ts +210 -0
- package/src/resources/posts.ts +179 -0
- package/src/resources/types.ts +104 -0
- package/src/roots/index.ts +166 -0
- package/src/roots/types.ts +36 -0
- package/src/session-manager.ts +149 -0
- package/src/tools/create-post.ts +154 -0
- package/src/tools/index.ts +70 -0
- package/src/tools/login.ts +169 -0
- package/src/tools/read-posts.ts +120 -0
- package/src/types.ts +107 -0
- package/src/utils/json.ts +46 -0
- package/src/validation.ts +322 -0
- package/tsconfig.json +22 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
// ABOUTME: JSON Schema validation utilities for MCP tools
|
|
2
|
+
// ABOUTME: Provides runtime validation for tool inputs
|
|
3
|
+
|
|
4
|
+
export interface ValidationError {
|
|
5
|
+
field: string;
|
|
6
|
+
message: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class ValidationResult<T = unknown> {
|
|
10
|
+
constructor(
|
|
11
|
+
public isValid: boolean,
|
|
12
|
+
public errors: ValidationError[] = [],
|
|
13
|
+
public data?: T,
|
|
14
|
+
) {}
|
|
15
|
+
|
|
16
|
+
static success<T>(data: T): ValidationResult<T> {
|
|
17
|
+
return new ValidationResult<T>(true, [], data);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
static failure<T = never>(errors: ValidationError[]): ValidationResult<T> {
|
|
21
|
+
return new ValidationResult<T>(false, errors);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function validateString(
|
|
26
|
+
value: unknown,
|
|
27
|
+
field: string,
|
|
28
|
+
options: { minLength?: number; maxLength?: number; required?: boolean } = {},
|
|
29
|
+
): ValidationError[] {
|
|
30
|
+
const errors: ValidationError[] = [];
|
|
31
|
+
|
|
32
|
+
if (options.required && (value === undefined || value === null)) {
|
|
33
|
+
if (field === 'content') {
|
|
34
|
+
errors.push({ field, message: 'Content must not be empty' });
|
|
35
|
+
} else {
|
|
36
|
+
errors.push({ field, message: `${field} is required` });
|
|
37
|
+
}
|
|
38
|
+
return errors;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (value !== undefined && value !== null) {
|
|
42
|
+
if (typeof value !== 'string') {
|
|
43
|
+
errors.push({ field, message: `${field} must be a string` });
|
|
44
|
+
return errors;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// For content validation, check if trimmed string is empty
|
|
48
|
+
if (field === 'content' && options.required && value.trim().length === 0) {
|
|
49
|
+
errors.push({ field, message: 'Content must not be empty' });
|
|
50
|
+
return errors;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (options.minLength && value.length < options.minLength) {
|
|
54
|
+
if (field === 'content') {
|
|
55
|
+
errors.push({ field, message: 'Content must not be empty' });
|
|
56
|
+
} else {
|
|
57
|
+
errors.push({
|
|
58
|
+
field,
|
|
59
|
+
message: `${field} must be at least ${options.minLength} characters`,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (options.maxLength && value.length > options.maxLength) {
|
|
65
|
+
errors.push({ field, message: `${field} must be at most ${options.maxLength} characters` });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return errors;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function validateNumber(
|
|
73
|
+
value: unknown,
|
|
74
|
+
field: string,
|
|
75
|
+
options: { min?: number; max?: number; required?: boolean } = {},
|
|
76
|
+
): ValidationError[] {
|
|
77
|
+
const errors: ValidationError[] = [];
|
|
78
|
+
|
|
79
|
+
if (options.required && (value === undefined || value === null)) {
|
|
80
|
+
errors.push({ field, message: `${field} is required` });
|
|
81
|
+
return errors;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (value !== undefined && value !== null) {
|
|
85
|
+
if (typeof value !== 'number' || Number.isNaN(value)) {
|
|
86
|
+
errors.push({ field, message: `${field} must be a number` });
|
|
87
|
+
return errors;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (options.min !== undefined && value < options.min) {
|
|
91
|
+
errors.push({ field, message: `${field} must be at least ${options.min}` });
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (options.max !== undefined && value > options.max) {
|
|
95
|
+
errors.push({ field, message: `${field} must be at most ${options.max}` });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return errors;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function validateArray<T = unknown>(
|
|
103
|
+
value: unknown,
|
|
104
|
+
field: string,
|
|
105
|
+
options: {
|
|
106
|
+
required?: boolean;
|
|
107
|
+
itemValidator?: (item: T, index: number) => ValidationError[];
|
|
108
|
+
} = {},
|
|
109
|
+
): ValidationError[] {
|
|
110
|
+
const errors: ValidationError[] = [];
|
|
111
|
+
|
|
112
|
+
if (options.required && (value === undefined || value === null)) {
|
|
113
|
+
errors.push({ field, message: `${field} is required` });
|
|
114
|
+
return errors;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (value !== undefined && value !== null) {
|
|
118
|
+
if (!Array.isArray(value)) {
|
|
119
|
+
errors.push({ field, message: `${field} must be an array` });
|
|
120
|
+
return errors;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (options.itemValidator) {
|
|
124
|
+
(value as T[]).forEach((item, index) => {
|
|
125
|
+
const itemErrors = options.itemValidator?.(item, index);
|
|
126
|
+
if (itemErrors) {
|
|
127
|
+
errors.push(
|
|
128
|
+
...itemErrors.map((err) => ({
|
|
129
|
+
field: `${field}[${index}].${err.field}`,
|
|
130
|
+
message: err.message,
|
|
131
|
+
})),
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return errors;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Helper to trim string values consistently
|
|
142
|
+
function trimStringValue(value: unknown): string | undefined {
|
|
143
|
+
if (value === undefined || value === null) {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
if (typeof value === 'string') {
|
|
147
|
+
const trimmed = value.trim();
|
|
148
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
149
|
+
}
|
|
150
|
+
// Only accept primitive types that can be meaningfully converted to strings
|
|
151
|
+
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
152
|
+
return String(value);
|
|
153
|
+
}
|
|
154
|
+
// Reject objects, arrays, functions, etc.
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Input types for validation
|
|
159
|
+
interface LoginInput {
|
|
160
|
+
agent_name?: unknown;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
interface ReadPostsInput {
|
|
164
|
+
limit?: unknown;
|
|
165
|
+
offset?: unknown;
|
|
166
|
+
agent_filter?: unknown;
|
|
167
|
+
tag_filter?: unknown;
|
|
168
|
+
thread_id?: unknown;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
interface CreatePostInput {
|
|
172
|
+
content?: unknown;
|
|
173
|
+
tags?: unknown;
|
|
174
|
+
parent_post_id?: unknown;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Login tool validation
|
|
178
|
+
export function validateLoginInput(input: LoginInput): ValidationResult<{ agent_name: string }> {
|
|
179
|
+
const errors: ValidationError[] = [];
|
|
180
|
+
|
|
181
|
+
// Special handling for agent_name
|
|
182
|
+
if (input.agent_name === undefined || input.agent_name === null) {
|
|
183
|
+
errors.push({ field: 'agent_name', message: 'Agent name must not be empty' });
|
|
184
|
+
} else if (typeof input.agent_name !== 'string') {
|
|
185
|
+
errors.push({ field: 'agent_name', message: 'Agent name must be a string' });
|
|
186
|
+
} else if (input.agent_name.trim().length === 0) {
|
|
187
|
+
errors.push({ field: 'agent_name', message: 'Agent name must not be empty' });
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (errors.length > 0) {
|
|
191
|
+
return ValidationResult.failure(errors);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const agentName = trimStringValue(input.agent_name);
|
|
195
|
+
if (!agentName) {
|
|
196
|
+
return ValidationResult.failure([
|
|
197
|
+
{ field: 'agent_name', message: 'Agent name cannot be empty' },
|
|
198
|
+
]);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return ValidationResult.success({
|
|
202
|
+
agent_name: agentName,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Read posts tool validation
|
|
207
|
+
export function validateReadPostsInput(input: ReadPostsInput): ValidationResult<{
|
|
208
|
+
limit: number;
|
|
209
|
+
offset: number;
|
|
210
|
+
agent_filter?: string;
|
|
211
|
+
tag_filter?: string;
|
|
212
|
+
thread_id?: string;
|
|
213
|
+
}> {
|
|
214
|
+
const errors: ValidationError[] = [];
|
|
215
|
+
|
|
216
|
+
// Parse and validate numeric values
|
|
217
|
+
const limit =
|
|
218
|
+
typeof input.limit === 'number'
|
|
219
|
+
? input.limit
|
|
220
|
+
: typeof input.limit === 'string'
|
|
221
|
+
? Number.parseInt(input.limit, 10)
|
|
222
|
+
: 10;
|
|
223
|
+
const offset =
|
|
224
|
+
typeof input.offset === 'number'
|
|
225
|
+
? input.offset
|
|
226
|
+
: typeof input.offset === 'string'
|
|
227
|
+
? Number.parseInt(input.offset, 10)
|
|
228
|
+
: 0;
|
|
229
|
+
|
|
230
|
+
// Apply defaults and trim string values
|
|
231
|
+
const data = {
|
|
232
|
+
limit: Number.isNaN(limit) ? 10 : limit,
|
|
233
|
+
offset: Number.isNaN(offset) ? 0 : offset,
|
|
234
|
+
agent_filter: trimStringValue(input.agent_filter),
|
|
235
|
+
tag_filter: trimStringValue(input.tag_filter),
|
|
236
|
+
thread_id: trimStringValue(input.thread_id),
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
errors.push(...validateNumber(data.limit, 'limit', { min: 1, max: 100 }));
|
|
240
|
+
errors.push(...validateNumber(data.offset, 'offset', { min: 0 }));
|
|
241
|
+
|
|
242
|
+
// Check for empty string filters (before trimming converted them to undefined)
|
|
243
|
+
if (
|
|
244
|
+
input.agent_filter !== undefined &&
|
|
245
|
+
input.agent_filter !== null &&
|
|
246
|
+
typeof input.agent_filter === 'string' &&
|
|
247
|
+
input.agent_filter.trim() === ''
|
|
248
|
+
) {
|
|
249
|
+
errors.push({ field: 'agent_filter', message: 'agent_filter cannot be empty' });
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (
|
|
253
|
+
input.tag_filter !== undefined &&
|
|
254
|
+
input.tag_filter !== null &&
|
|
255
|
+
typeof input.tag_filter === 'string' &&
|
|
256
|
+
input.tag_filter.trim() === ''
|
|
257
|
+
) {
|
|
258
|
+
errors.push({ field: 'tag_filter', message: 'tag_filter cannot be empty' });
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (
|
|
262
|
+
input.thread_id !== undefined &&
|
|
263
|
+
input.thread_id !== null &&
|
|
264
|
+
typeof input.thread_id === 'string' &&
|
|
265
|
+
input.thread_id.trim() === ''
|
|
266
|
+
) {
|
|
267
|
+
errors.push({ field: 'thread_id', message: 'thread_id cannot be empty' });
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
if (errors.length > 0) {
|
|
271
|
+
return ValidationResult.failure(errors);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return ValidationResult.success(data);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Create post tool validation
|
|
278
|
+
export function validateCreatePostInput(input: CreatePostInput): ValidationResult<{
|
|
279
|
+
content: string;
|
|
280
|
+
tags: string[];
|
|
281
|
+
parent_post_id?: string;
|
|
282
|
+
}> {
|
|
283
|
+
const errors: ValidationError[] = [];
|
|
284
|
+
|
|
285
|
+
errors.push(
|
|
286
|
+
...validateString(input.content, 'content', {
|
|
287
|
+
required: true,
|
|
288
|
+
minLength: 1,
|
|
289
|
+
}),
|
|
290
|
+
);
|
|
291
|
+
|
|
292
|
+
errors.push(...validateString(input.parent_post_id, 'parent_post_id'));
|
|
293
|
+
|
|
294
|
+
if (input.tags !== undefined) {
|
|
295
|
+
errors.push(
|
|
296
|
+
...validateArray(input.tags, 'tags', {
|
|
297
|
+
itemValidator: (item, _index) => validateString(item, 'item', {}),
|
|
298
|
+
}),
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if (errors.length > 0) {
|
|
303
|
+
return ValidationResult.failure(errors);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// Filter and trim tags consistently
|
|
307
|
+
const rawTags = Array.isArray(input.tags) ? input.tags : [];
|
|
308
|
+
const filteredTags = rawTags
|
|
309
|
+
.map((tag) => trimStringValue(tag))
|
|
310
|
+
.filter((tag): tag is string => tag !== undefined);
|
|
311
|
+
|
|
312
|
+
const content = trimStringValue(input.content);
|
|
313
|
+
if (!content) {
|
|
314
|
+
return ValidationResult.failure([{ field: 'content', message: 'Content cannot be empty' }]);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
return ValidationResult.success({
|
|
318
|
+
content,
|
|
319
|
+
tags: filteredTags,
|
|
320
|
+
parent_post_id: trimStringValue(input.parent_post_id),
|
|
321
|
+
});
|
|
322
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "NodeNext",
|
|
5
|
+
"moduleResolution": "NodeNext",
|
|
6
|
+
"lib": ["ES2022"],
|
|
7
|
+
"outDir": "./dist",
|
|
8
|
+
"rootDir": "./src",
|
|
9
|
+
"strict": true,
|
|
10
|
+
"esModuleInterop": true,
|
|
11
|
+
"skipLibCheck": true,
|
|
12
|
+
"forceConsistentCasingInFileNames": true,
|
|
13
|
+
"resolveJsonModule": true,
|
|
14
|
+
"declaration": true,
|
|
15
|
+
"declarationMap": true,
|
|
16
|
+
"sourceMap": true,
|
|
17
|
+
"allowSyntheticDefaultImports": true,
|
|
18
|
+
"isolatedModules": true
|
|
19
|
+
},
|
|
20
|
+
"include": ["src/**/*"],
|
|
21
|
+
"exclude": ["node_modules", "dist", "tests"]
|
|
22
|
+
}
|