@malevich-studio/strapi-sdk-typescript 1.0.3 → 1.0.5
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/cli.cjs +22278 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.ts +0 -1
- package/dist/cli.mjs +22258 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/generate-strapi-types.d.ts +1 -1
- package/dist/generator/attributes/base-relation.d.ts +2 -1
- package/dist/generator/attributes/blocks.d.ts +2 -1
- package/dist/generator/attributes/boolean.d.ts +2 -1
- package/dist/generator/attributes/component.d.ts +2 -2
- package/dist/generator/attributes/date-time.d.ts +2 -1
- package/dist/generator/attributes/enumeration.d.ts +2 -1
- package/dist/generator/attributes/index.d.ts +2 -1
- package/dist/generator/attributes/json.d.ts +3 -2
- package/dist/generator/attributes/media.d.ts +3 -2
- package/dist/generator/attributes/number.d.ts +2 -1
- package/dist/generator/attributes/relation.d.ts +2 -2
- package/dist/generator/attributes/string.d.ts +2 -1
- package/dist/generator/index.d.ts +5 -0
- package/dist/index.cjs +21309 -0
- package/dist/index.cjs.map +1 -0
- package/dist/{main.d.ts → index.d.ts} +55 -7
- package/dist/index.mjs +21307 -0
- package/dist/index.mjs.map +1 -0
- package/dist/test.cjs +114 -0
- package/dist/test.cjs.map +1 -0
- package/dist/test.d.ts +1 -0
- package/dist/test.mjs +112 -0
- package/dist/test.mjs.map +1 -0
- package/package.json +27 -8
- package/dist/cli.js +0 -10
- package/dist/generate-strapi-types.js +0 -205
- package/dist/generator/attributes/base-relation.js +0 -56
- package/dist/generator/attributes/base.js +0 -53
- package/dist/generator/attributes/blocks.js +0 -29
- package/dist/generator/attributes/boolean.js +0 -17
- package/dist/generator/attributes/component.js +0 -36
- package/dist/generator/attributes/date-time.js +0 -17
- package/dist/generator/attributes/enumeration.js +0 -17
- package/dist/generator/attributes/index.js +0 -40
- package/dist/generator/attributes/json.js +0 -20
- package/dist/generator/attributes/media.js +0 -29
- package/dist/generator/attributes/number.js +0 -17
- package/dist/generator/attributes/relation.js +0 -66
- package/dist/generator/attributes/string.js +0 -17
- package/dist/generator/utils/get-component-name.js +0 -13
- package/dist/generator/utils/get-content-type-name.js +0 -18
- package/dist/main.js +0 -67
package/dist/test.cjs
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
require('dotenv/config');
|
|
4
|
+
var _ = require('lodash');
|
|
5
|
+
var qs = require('qs');
|
|
6
|
+
var mime = require('mime');
|
|
7
|
+
var promises = require('fs/promises');
|
|
8
|
+
var node_path = require('node:path');
|
|
9
|
+
|
|
10
|
+
class Strapi {
|
|
11
|
+
constructor(url, token) {
|
|
12
|
+
this.url = url;
|
|
13
|
+
this.token = token;
|
|
14
|
+
}
|
|
15
|
+
async request(endpoint, data = {}, params = {}) {
|
|
16
|
+
const queryString = params.method === 'GET' ? qs.stringify(data) : '';
|
|
17
|
+
return await this.baseRequest(queryString ? `${endpoint}?${queryString}` : endpoint, _.merge({
|
|
18
|
+
headers: {
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
},
|
|
21
|
+
...(params.method && !['GET', 'DELETE'].includes(params.method) ? {
|
|
22
|
+
body: JSON.stringify({
|
|
23
|
+
data,
|
|
24
|
+
})
|
|
25
|
+
} : {}),
|
|
26
|
+
}, params));
|
|
27
|
+
}
|
|
28
|
+
async getDocuments(endpoint, data, params = {}) {
|
|
29
|
+
return await this.request(endpoint, data, {
|
|
30
|
+
method: 'GET',
|
|
31
|
+
...params,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async getDocument(endpoint, data, params = {}) {
|
|
35
|
+
return await this.request(endpoint, data, {
|
|
36
|
+
method: 'GET',
|
|
37
|
+
...params,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async create(endpoint, data, params = {}) {
|
|
41
|
+
return await this.request(endpoint, data, {
|
|
42
|
+
method: 'POST',
|
|
43
|
+
...params,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
async update(endpoint, id, data, params = {}) {
|
|
47
|
+
return await this.request(`${endpoint}/${id}`, data, {
|
|
48
|
+
method: 'PUT',
|
|
49
|
+
...params,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async delete(endpoint, id, params = {}) {
|
|
53
|
+
return await this.request(`${endpoint}/${id}`, {}, {
|
|
54
|
+
method: 'DELETE',
|
|
55
|
+
...params,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* For Node.js
|
|
60
|
+
*
|
|
61
|
+
* @param files list of files names which will be uploaded, example: ['/app/data/cover.js']
|
|
62
|
+
*/
|
|
63
|
+
async upload(files) {
|
|
64
|
+
const form = new FormData();
|
|
65
|
+
await Promise.all(files.map(async (item) => {
|
|
66
|
+
const fileBuffer = await promises.readFile(item.path);
|
|
67
|
+
const file = new File([fileBuffer], item.filename || node_path.basename(item.path), { type: mime.getType(item.path) || 'image/jpeg' });
|
|
68
|
+
form.append('files', file);
|
|
69
|
+
}));
|
|
70
|
+
return await this.uploadForm(form);
|
|
71
|
+
}
|
|
72
|
+
async uploadForm(form) {
|
|
73
|
+
return await this.baseRequest('upload', {
|
|
74
|
+
method: 'POST',
|
|
75
|
+
body: form,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
async baseRequest(endpoint, params = {}) {
|
|
79
|
+
const response = await fetch(`${this.url}/api/${endpoint}`, _.merge({
|
|
80
|
+
headers: {
|
|
81
|
+
Authorization: `Bearer ${this.token}`,
|
|
82
|
+
},
|
|
83
|
+
}, params));
|
|
84
|
+
if (!response.ok) {
|
|
85
|
+
console.log(`${this.url}/api/${endpoint}`);
|
|
86
|
+
console.log(_.merge({
|
|
87
|
+
headers: {
|
|
88
|
+
Authorization: `Bearer ${this.token}`,
|
|
89
|
+
},
|
|
90
|
+
}, params));
|
|
91
|
+
console.log(response);
|
|
92
|
+
console.log(await response.json());
|
|
93
|
+
throw new Error(`Помилка запиту до Strapi: ${response.status} ${response.statusText}`);
|
|
94
|
+
}
|
|
95
|
+
return (await response.json());
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (!process.env.STRAPI_URL || !process.env.STRAPI_TOKEN) {
|
|
100
|
+
throw new Error('STRAPI_URL and STRAPI_TOKEN must be provided.');
|
|
101
|
+
}
|
|
102
|
+
const strapi = new Strapi(process.env.STRAPI_URL, process.env.STRAPI_TOKEN);
|
|
103
|
+
async function test() {
|
|
104
|
+
const result = await strapi.upload([{
|
|
105
|
+
path: '/home/peretyaka/Downloads/534a35da71395a2684ade26eecf3a672e122e069_original.jpeg',
|
|
106
|
+
filename: 'test1.jpeg',
|
|
107
|
+
}, {
|
|
108
|
+
path: '/home/peretyaka/Downloads/photo_2024-07-29_18-43-43.jpg',
|
|
109
|
+
filename: 'test2.jpeg',
|
|
110
|
+
}]);
|
|
111
|
+
console.log(result);
|
|
112
|
+
}
|
|
113
|
+
test();
|
|
114
|
+
//# sourceMappingURL=test.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.cjs","sources":["../src/index.ts","../src/test.ts"],"sourcesContent":["import _ from 'lodash';\nimport qs from 'qs';\nimport mime from 'mime';\nimport { readFile } from 'fs/promises';\nimport { basename } from 'node:path';\n\nimport type {RelationInput} from \"@/generator/attributes/relation\";\nexport type {RelationInput};\n\ntype Response<T> = {\n data: T,\n meta: {\n pagination: {\n total?: number,\n } & ({\n page: number,\n pageSize: number,\n pageCount?: number,\n } | {\n start: number,\n limit: number,\n }),\n }\n}\n\nexport type File = {\n id?: number;\n documentId?: string;\n createdAt?: string;\n updatedAt?: string;\n name: string;\n alternativeText?: string;\n caption?: string;\n width?: number;\n height?: number;\n formats?: object;\n hash: string;\n ext?: string;\n mime: string;\n size: number;\n url: string;\n previewUrl?: string;\n provider: string;\n provider_metadata?: object;\n related?: any;\n folder?: Folder;\n folderPath: string;\n}\n\nexport type Folder = {\n id?: number;\n documentId?: string;\n createdAt?: string;\n updatedAt?: string;\n name: string;\n pathId: number;\n parent?: Folder;\n children?: Folder[];\n files?: File[];\n path: string;\n}\n\n// export type\n\nexport type Filters<T> = {\n // Joins the filters in an \"or\" expression\n $or?: Filters<T>[],\n // Joins the filters in an \"and\" expression\n $and?: Filters<T>[],\n // Joins the filters in a \"not\" expression\n $not?: Filters<T>[],\n} | T;\n\nexport type FilterValue<T> = {\n // Equal\n $eq?: T,\n // Equal (case-insensitive)\n $eqi?: string,\n // Not equal\n $ne?: T,\n // Not equal (case-insensitive)\n $nei?: string,\n // Less than\n $lt?: T,\n // Less than or equal to\n $lte?: T,\n // Greater than\n $gt?: T,\n // Greater than or equal to\n $gte?: T,\n // Included in an array\n $in?: T[],\n // Not included in an array\n $notIn?: T[],\n // Contains\n $contains?: string,\n // Does not contain\n $notContains?: string,\n // Contains (case-insensitive)\n $containsi?: string,\n // Does not contain (case-insensitive)\n $notContainsi?: string,\n // Is between\n $between?: [T, T],\n // Starts with\n $startsWith?: string,\n // Starts with (case-insensitive)\n $startsWithi?: string,\n // Ends with\n $endsWith?: string,\n // Ends with (case-insensitive)\n $endsWithi?: string,\n} | T;\n\nexport type Query<Fields, Sort, Filters, Populate> = {\n populate?: Populate,\n fields?: Fields[] | '*',\n filters?: Filters,\n locale?: string,\n status?: 'published' | 'draft',\n sort?: Sort[] | Sort,\n pagination?: {\n withCount?: boolean,\n } & ({\n page?: number,\n pageSize?: number,\n } | {\n start?: number,\n limit?: number,\n }),\n}\n\nexport class Strapi {\n constructor(\n private readonly url: string,\n private readonly token: string,\n ) {}\n\n public async request<T>(endpoint: string, data: object | FormData = {}, params: RequestInit = {}): Promise<Response<T>> {\n const queryString = params.method === 'GET' ? qs.stringify(data) : '';\n\n return await this.baseRequest(queryString ? `${endpoint}?${queryString}` : endpoint, _.merge({\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(params.method && !['GET', 'DELETE'].includes(params.method) ? {\n body: JSON.stringify({\n data,\n })\n } : {}\n ),\n }, params));\n }\n\n async getDocuments<T, Q extends object>(endpoint: string, data?: Q, params: RequestInit = {}): Promise<Response<T[]>> {\n return await this.request<T[]>(endpoint, data, {\n method: 'GET',\n ...params,\n });\n }\n\n async getDocument<T, Q extends object>(endpoint: string, data?: Q, params: RequestInit = {}): Promise<Response<T>> {\n return await this.request<T>(endpoint, data, {\n method: 'GET',\n ...params,\n });\n }\n\n async create<T, Q extends object>(endpoint: string, data: Q, params: RequestInit = {}): Promise<Response<T>> {\n return await this.request<T>(endpoint, data, {\n method: 'POST',\n ...params,\n });\n }\n\n async update<T, Q extends object>(endpoint: string, id: string, data: Q, params: RequestInit = {}): Promise<Response<T>> {\n return await this.request<T>(`${endpoint}/${id}`, data, {\n method: 'PUT',\n ...params,\n });\n }\n\n async delete<T>(endpoint: string, id: string, params: RequestInit = {}): Promise<Response<T>> {\n return await this.request<T>(`${endpoint}/${id}`, {}, {\n method: 'DELETE',\n ...params,\n });\n }\n\n /**\n * For Node.js\n *\n * @param files list of files names which will be uploaded, example: ['/app/data/cover.js']\n */\n async upload(files: { path: string, filename?: string }[]) {\n const form = new FormData();\n await Promise.all(files.map(async (item) => {\n const fileBuffer = await readFile(item.path);\n const file = new File([fileBuffer], item.filename || basename(item.path), {type: mime.getType(item.path) || 'image/jpeg'});\n form.append( 'files', file);\n }));\n return await this.uploadForm(form);\n }\n\n async uploadForm(form: FormData): Promise<File[]> {\n return await this.baseRequest('upload', {\n method: 'POST',\n body: form,\n });\n }\n\n private async baseRequest(endpoint: string, params: RequestInit = {}) {\n const response = await fetch(`${this.url}/api/${endpoint}`, _.merge({\n headers: {\n Authorization: `Bearer ${this.token}`,\n },\n }, params));\n\n if (!response.ok) {\n console.log(`${this.url}/api/${endpoint}`);\n console.log(_.merge({\n headers: {\n Authorization: `Bearer ${this.token}`,\n },\n }, params));\n console.log(response);\n console.log(await response.json());\n throw new Error(`Помилка запиту до Strapi: ${response.status} ${response.statusText}`);\n }\n\n return (await response.json());\n }\n}\n","import 'dotenv/config'\nimport {Strapi} from \"@/index.ts\";\n\nif (!process.env.STRAPI_URL || !process.env.STRAPI_TOKEN) {\n throw new Error('STRAPI_URL and STRAPI_TOKEN must be provided.');\n}\n\n\nconst strapi = new Strapi(\n process.env.STRAPI_URL,\n process.env.STRAPI_TOKEN,\n);\n\nasync function test() {\n const result = await strapi.upload([{\n path: '/home/peretyaka/Downloads/534a35da71395a2684ade26eecf3a672e122e069_original.jpeg',\n filename: 'test1.jpeg',\n }, {\n path: '/home/peretyaka/Downloads/photo_2024-07-29_18-43-43.jpg',\n filename: 'test2.jpeg',\n }]);\n\n console.log(result);\n}\n\ntest();"],"names":["readFile","basename"],"mappings":";;;;;;;;;MAoIa,MAAM,CAAA;IACjB,WACmB,CAAA,GAAW,EACX,KAAa,EAAA;QADb,IAAG,CAAA,GAAA,GAAH,GAAG;QACH,IAAK,CAAA,KAAA,GAAL,KAAK;;IAGjB,MAAM,OAAO,CAAI,QAAgB,EAAE,IAA0B,GAAA,EAAE,EAAE,MAAA,GAAsB,EAAE,EAAA;QAC9F,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,KAAK,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE;QAErE,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,GAAG,CAAG,EAAA,QAAQ,IAAI,WAAW,CAAA,CAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC;AAC3F,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,kBAAkB;AACnC,aAAA;YACD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG;AAC9D,gBAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,IAAI;iBACL;aACF,GAAG,EAAE,CACP;SACF,EAAE,MAAM,CAAC,CAAC;;IAGb,MAAM,YAAY,CAAsB,QAAgB,EAAE,IAAQ,EAAE,SAAsB,EAAE,EAAA;QAC1F,OAAO,MAAM,IAAI,CAAC,OAAO,CAAM,QAAQ,EAAE,IAAI,EAAE;AAC7C,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,GAAG,MAAM;AACV,SAAA,CAAC;;IAGJ,MAAM,WAAW,CAAsB,QAAgB,EAAE,IAAQ,EAAE,SAAsB,EAAE,EAAA;QACzF,OAAO,MAAM,IAAI,CAAC,OAAO,CAAI,QAAQ,EAAE,IAAI,EAAE;AAC3C,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,GAAG,MAAM;AACV,SAAA,CAAC;;IAGJ,MAAM,MAAM,CAAsB,QAAgB,EAAE,IAAO,EAAE,SAAsB,EAAE,EAAA;QACnF,OAAO,MAAM,IAAI,CAAC,OAAO,CAAI,QAAQ,EAAE,IAAI,EAAE;AAC3C,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,GAAG,MAAM;AACV,SAAA,CAAC;;IAGJ,MAAM,MAAM,CAAsB,QAAgB,EAAE,EAAU,EAAE,IAAO,EAAE,MAAA,GAAsB,EAAE,EAAA;AAC/F,QAAA,OAAO,MAAM,IAAI,CAAC,OAAO,CAAI,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,EAAE,IAAI,EAAE;AACtD,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,GAAG,MAAM;AACV,SAAA,CAAC;;IAGJ,MAAM,MAAM,CAAI,QAAgB,EAAE,EAAU,EAAE,SAAsB,EAAE,EAAA;AACpE,QAAA,OAAO,MAAM,IAAI,CAAC,OAAO,CAAI,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,EAAE,EAAE,EAAE;AACpD,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,GAAG,MAAM;AACV,SAAA,CAAC;;AAGJ;;;;AAIG;IACH,MAAM,MAAM,CAAC,KAA4C,EAAA;AACvD,QAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE;AAC3B,QAAA,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,KAAI;YACzC,MAAM,UAAU,GAAG,MAAMA,iBAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5C,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAIC,kBAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,EAAC,CAAC;AAC1H,YAAA,IAAI,CAAC,MAAM,CAAE,OAAO,EAAE,IAAI,CAAC;SAC5B,CAAC,CAAC;AACH,QAAA,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;;IAGpC,MAAM,UAAU,CAAC,IAAc,EAAA;AAC7B,QAAA,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;AACtC,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,IAAI,EAAE,IAAI;AACX,SAAA,CAAC;;AAGI,IAAA,MAAM,WAAW,CAAC,QAAgB,EAAE,SAAsB,EAAE,EAAA;AAClE,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAA,KAAA,EAAQ,QAAQ,CAAE,CAAA,EAAE,CAAC,CAAC,KAAK,CAAC;AAClE,YAAA,OAAO,EAAE;AACP,gBAAA,aAAa,EAAE,CAAA,OAAA,EAAU,IAAI,CAAC,KAAK,CAAE,CAAA;AACtC,aAAA;SACF,EAAE,MAAM,CAAC,CAAC;AAEX,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,OAAO,CAAC,GAAG,CAAC,CAAG,EAAA,IAAI,CAAC,GAAG,CAAQ,KAAA,EAAA,QAAQ,CAAE,CAAA,CAAC;AAC1C,YAAA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AAClB,gBAAA,OAAO,EAAE;AACP,oBAAA,aAAa,EAAE,CAAA,OAAA,EAAU,IAAI,CAAC,KAAK,CAAE,CAAA;AACtC,iBAAA;aACF,EAAE,MAAM,CAAC,CAAC;AACX,YAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;AAClC,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,0BAAA,EAA6B,QAAQ,CAAC,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAC,UAAU,CAAA,CAAE,CAAC;;AAGxF,QAAA,QAAQ,MAAM,QAAQ,CAAC,IAAI,EAAE;;AAEhC;;ACrOD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE;AACxD,IAAA,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC;AAClE;AAGA,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,OAAO,CAAC,GAAG,CAAC,UAAU,EACtB,OAAO,CAAC,GAAG,CAAC,YAAY,CACzB;AAED,eAAe,IAAI,GAAA;AACjB,IAAA,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;AAClC,YAAA,IAAI,EAAE,kFAAkF;AACxF,YAAA,QAAQ,EAAE,YAAY;SACvB,EAAE;AACD,YAAA,IAAI,EAAE,yDAAyD;AAC/D,YAAA,QAAQ,EAAE,YAAY;AACvB,SAAA,CAAC,CAAC;AAEH,IAAA,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AACrB;AAEA,IAAI,EAAE;;"}
|
package/dist/test.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import 'dotenv/config';
|
package/dist/test.mjs
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import 'dotenv/config';
|
|
2
|
+
import _ from 'lodash';
|
|
3
|
+
import qs from 'qs';
|
|
4
|
+
import mime from 'mime';
|
|
5
|
+
import { readFile } from 'fs/promises';
|
|
6
|
+
import { basename } from 'node:path';
|
|
7
|
+
|
|
8
|
+
class Strapi {
|
|
9
|
+
constructor(url, token) {
|
|
10
|
+
this.url = url;
|
|
11
|
+
this.token = token;
|
|
12
|
+
}
|
|
13
|
+
async request(endpoint, data = {}, params = {}) {
|
|
14
|
+
const queryString = params.method === 'GET' ? qs.stringify(data) : '';
|
|
15
|
+
return await this.baseRequest(queryString ? `${endpoint}?${queryString}` : endpoint, _.merge({
|
|
16
|
+
headers: {
|
|
17
|
+
'Content-Type': 'application/json',
|
|
18
|
+
},
|
|
19
|
+
...(params.method && !['GET', 'DELETE'].includes(params.method) ? {
|
|
20
|
+
body: JSON.stringify({
|
|
21
|
+
data,
|
|
22
|
+
})
|
|
23
|
+
} : {}),
|
|
24
|
+
}, params));
|
|
25
|
+
}
|
|
26
|
+
async getDocuments(endpoint, data, params = {}) {
|
|
27
|
+
return await this.request(endpoint, data, {
|
|
28
|
+
method: 'GET',
|
|
29
|
+
...params,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async getDocument(endpoint, data, params = {}) {
|
|
33
|
+
return await this.request(endpoint, data, {
|
|
34
|
+
method: 'GET',
|
|
35
|
+
...params,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async create(endpoint, data, params = {}) {
|
|
39
|
+
return await this.request(endpoint, data, {
|
|
40
|
+
method: 'POST',
|
|
41
|
+
...params,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async update(endpoint, id, data, params = {}) {
|
|
45
|
+
return await this.request(`${endpoint}/${id}`, data, {
|
|
46
|
+
method: 'PUT',
|
|
47
|
+
...params,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
async delete(endpoint, id, params = {}) {
|
|
51
|
+
return await this.request(`${endpoint}/${id}`, {}, {
|
|
52
|
+
method: 'DELETE',
|
|
53
|
+
...params,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* For Node.js
|
|
58
|
+
*
|
|
59
|
+
* @param files list of files names which will be uploaded, example: ['/app/data/cover.js']
|
|
60
|
+
*/
|
|
61
|
+
async upload(files) {
|
|
62
|
+
const form = new FormData();
|
|
63
|
+
await Promise.all(files.map(async (item) => {
|
|
64
|
+
const fileBuffer = await readFile(item.path);
|
|
65
|
+
const file = new File([fileBuffer], item.filename || basename(item.path), { type: mime.getType(item.path) || 'image/jpeg' });
|
|
66
|
+
form.append('files', file);
|
|
67
|
+
}));
|
|
68
|
+
return await this.uploadForm(form);
|
|
69
|
+
}
|
|
70
|
+
async uploadForm(form) {
|
|
71
|
+
return await this.baseRequest('upload', {
|
|
72
|
+
method: 'POST',
|
|
73
|
+
body: form,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async baseRequest(endpoint, params = {}) {
|
|
77
|
+
const response = await fetch(`${this.url}/api/${endpoint}`, _.merge({
|
|
78
|
+
headers: {
|
|
79
|
+
Authorization: `Bearer ${this.token}`,
|
|
80
|
+
},
|
|
81
|
+
}, params));
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
console.log(`${this.url}/api/${endpoint}`);
|
|
84
|
+
console.log(_.merge({
|
|
85
|
+
headers: {
|
|
86
|
+
Authorization: `Bearer ${this.token}`,
|
|
87
|
+
},
|
|
88
|
+
}, params));
|
|
89
|
+
console.log(response);
|
|
90
|
+
console.log(await response.json());
|
|
91
|
+
throw new Error(`Помилка запиту до Strapi: ${response.status} ${response.statusText}`);
|
|
92
|
+
}
|
|
93
|
+
return (await response.json());
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (!process.env.STRAPI_URL || !process.env.STRAPI_TOKEN) {
|
|
98
|
+
throw new Error('STRAPI_URL and STRAPI_TOKEN must be provided.');
|
|
99
|
+
}
|
|
100
|
+
const strapi = new Strapi(process.env.STRAPI_URL, process.env.STRAPI_TOKEN);
|
|
101
|
+
async function test() {
|
|
102
|
+
const result = await strapi.upload([{
|
|
103
|
+
path: '/home/peretyaka/Downloads/534a35da71395a2684ade26eecf3a672e122e069_original.jpeg',
|
|
104
|
+
filename: 'test1.jpeg',
|
|
105
|
+
}, {
|
|
106
|
+
path: '/home/peretyaka/Downloads/photo_2024-07-29_18-43-43.jpg',
|
|
107
|
+
filename: 'test2.jpeg',
|
|
108
|
+
}]);
|
|
109
|
+
console.log(result);
|
|
110
|
+
}
|
|
111
|
+
test();
|
|
112
|
+
//# sourceMappingURL=test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.mjs","sources":["../src/index.ts","../src/test.ts"],"sourcesContent":["import _ from 'lodash';\nimport qs from 'qs';\nimport mime from 'mime';\nimport { readFile } from 'fs/promises';\nimport { basename } from 'node:path';\n\nimport type {RelationInput} from \"@/generator/attributes/relation\";\nexport type {RelationInput};\n\ntype Response<T> = {\n data: T,\n meta: {\n pagination: {\n total?: number,\n } & ({\n page: number,\n pageSize: number,\n pageCount?: number,\n } | {\n start: number,\n limit: number,\n }),\n }\n}\n\nexport type File = {\n id?: number;\n documentId?: string;\n createdAt?: string;\n updatedAt?: string;\n name: string;\n alternativeText?: string;\n caption?: string;\n width?: number;\n height?: number;\n formats?: object;\n hash: string;\n ext?: string;\n mime: string;\n size: number;\n url: string;\n previewUrl?: string;\n provider: string;\n provider_metadata?: object;\n related?: any;\n folder?: Folder;\n folderPath: string;\n}\n\nexport type Folder = {\n id?: number;\n documentId?: string;\n createdAt?: string;\n updatedAt?: string;\n name: string;\n pathId: number;\n parent?: Folder;\n children?: Folder[];\n files?: File[];\n path: string;\n}\n\n// export type\n\nexport type Filters<T> = {\n // Joins the filters in an \"or\" expression\n $or?: Filters<T>[],\n // Joins the filters in an \"and\" expression\n $and?: Filters<T>[],\n // Joins the filters in a \"not\" expression\n $not?: Filters<T>[],\n} | T;\n\nexport type FilterValue<T> = {\n // Equal\n $eq?: T,\n // Equal (case-insensitive)\n $eqi?: string,\n // Not equal\n $ne?: T,\n // Not equal (case-insensitive)\n $nei?: string,\n // Less than\n $lt?: T,\n // Less than or equal to\n $lte?: T,\n // Greater than\n $gt?: T,\n // Greater than or equal to\n $gte?: T,\n // Included in an array\n $in?: T[],\n // Not included in an array\n $notIn?: T[],\n // Contains\n $contains?: string,\n // Does not contain\n $notContains?: string,\n // Contains (case-insensitive)\n $containsi?: string,\n // Does not contain (case-insensitive)\n $notContainsi?: string,\n // Is between\n $between?: [T, T],\n // Starts with\n $startsWith?: string,\n // Starts with (case-insensitive)\n $startsWithi?: string,\n // Ends with\n $endsWith?: string,\n // Ends with (case-insensitive)\n $endsWithi?: string,\n} | T;\n\nexport type Query<Fields, Sort, Filters, Populate> = {\n populate?: Populate,\n fields?: Fields[] | '*',\n filters?: Filters,\n locale?: string,\n status?: 'published' | 'draft',\n sort?: Sort[] | Sort,\n pagination?: {\n withCount?: boolean,\n } & ({\n page?: number,\n pageSize?: number,\n } | {\n start?: number,\n limit?: number,\n }),\n}\n\nexport class Strapi {\n constructor(\n private readonly url: string,\n private readonly token: string,\n ) {}\n\n public async request<T>(endpoint: string, data: object | FormData = {}, params: RequestInit = {}): Promise<Response<T>> {\n const queryString = params.method === 'GET' ? qs.stringify(data) : '';\n\n return await this.baseRequest(queryString ? `${endpoint}?${queryString}` : endpoint, _.merge({\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(params.method && !['GET', 'DELETE'].includes(params.method) ? {\n body: JSON.stringify({\n data,\n })\n } : {}\n ),\n }, params));\n }\n\n async getDocuments<T, Q extends object>(endpoint: string, data?: Q, params: RequestInit = {}): Promise<Response<T[]>> {\n return await this.request<T[]>(endpoint, data, {\n method: 'GET',\n ...params,\n });\n }\n\n async getDocument<T, Q extends object>(endpoint: string, data?: Q, params: RequestInit = {}): Promise<Response<T>> {\n return await this.request<T>(endpoint, data, {\n method: 'GET',\n ...params,\n });\n }\n\n async create<T, Q extends object>(endpoint: string, data: Q, params: RequestInit = {}): Promise<Response<T>> {\n return await this.request<T>(endpoint, data, {\n method: 'POST',\n ...params,\n });\n }\n\n async update<T, Q extends object>(endpoint: string, id: string, data: Q, params: RequestInit = {}): Promise<Response<T>> {\n return await this.request<T>(`${endpoint}/${id}`, data, {\n method: 'PUT',\n ...params,\n });\n }\n\n async delete<T>(endpoint: string, id: string, params: RequestInit = {}): Promise<Response<T>> {\n return await this.request<T>(`${endpoint}/${id}`, {}, {\n method: 'DELETE',\n ...params,\n });\n }\n\n /**\n * For Node.js\n *\n * @param files list of files names which will be uploaded, example: ['/app/data/cover.js']\n */\n async upload(files: { path: string, filename?: string }[]) {\n const form = new FormData();\n await Promise.all(files.map(async (item) => {\n const fileBuffer = await readFile(item.path);\n const file = new File([fileBuffer], item.filename || basename(item.path), {type: mime.getType(item.path) || 'image/jpeg'});\n form.append( 'files', file);\n }));\n return await this.uploadForm(form);\n }\n\n async uploadForm(form: FormData): Promise<File[]> {\n return await this.baseRequest('upload', {\n method: 'POST',\n body: form,\n });\n }\n\n private async baseRequest(endpoint: string, params: RequestInit = {}) {\n const response = await fetch(`${this.url}/api/${endpoint}`, _.merge({\n headers: {\n Authorization: `Bearer ${this.token}`,\n },\n }, params));\n\n if (!response.ok) {\n console.log(`${this.url}/api/${endpoint}`);\n console.log(_.merge({\n headers: {\n Authorization: `Bearer ${this.token}`,\n },\n }, params));\n console.log(response);\n console.log(await response.json());\n throw new Error(`Помилка запиту до Strapi: ${response.status} ${response.statusText}`);\n }\n\n return (await response.json());\n }\n}\n","import 'dotenv/config'\nimport {Strapi} from \"@/index.ts\";\n\nif (!process.env.STRAPI_URL || !process.env.STRAPI_TOKEN) {\n throw new Error('STRAPI_URL and STRAPI_TOKEN must be provided.');\n}\n\n\nconst strapi = new Strapi(\n process.env.STRAPI_URL,\n process.env.STRAPI_TOKEN,\n);\n\nasync function test() {\n const result = await strapi.upload([{\n path: '/home/peretyaka/Downloads/534a35da71395a2684ade26eecf3a672e122e069_original.jpeg',\n filename: 'test1.jpeg',\n }, {\n path: '/home/peretyaka/Downloads/photo_2024-07-29_18-43-43.jpg',\n filename: 'test2.jpeg',\n }]);\n\n console.log(result);\n}\n\ntest();"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,25 +1,44 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@malevich-studio/strapi-sdk-typescript",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"
|
|
5
|
-
"types": "dist/main.d.ts",
|
|
3
|
+
"version": "1.0.5",
|
|
4
|
+
"sideEffects": false,
|
|
6
5
|
"bin": {
|
|
7
|
-
"generate-strapi-types": "dist/cli.
|
|
6
|
+
"generate-strapi-types": "./dist/cli.mjs"
|
|
7
|
+
},
|
|
8
|
+
"main": "./dist/index.cjs",
|
|
9
|
+
"module": "./dist/index.mjs",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
"import": "./dist/index.mjs",
|
|
13
|
+
"require": "./dist/index.cjs",
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"default": "./dist/index.mjs"
|
|
8
16
|
},
|
|
9
17
|
"files": [
|
|
10
18
|
"dist",
|
|
11
19
|
"README.md"
|
|
12
20
|
],
|
|
13
21
|
"scripts": {
|
|
14
|
-
"build": "
|
|
15
|
-
"
|
|
22
|
+
"build": "rollup -c",
|
|
23
|
+
"dev": "tsc --noEmit && node --loader ts-node/esm src/index.ts",
|
|
24
|
+
"publish": "npm publish --access public"
|
|
16
25
|
},
|
|
17
26
|
"dependencies": {
|
|
18
27
|
"dotenv": "^16.4.7",
|
|
19
28
|
"lodash": "^4.17.21",
|
|
20
|
-
"
|
|
29
|
+
"mime": "^4.0.6"
|
|
21
30
|
},
|
|
31
|
+
"type": "module",
|
|
22
32
|
"author": "",
|
|
23
33
|
"license": "ISC",
|
|
24
|
-
"description": ""
|
|
34
|
+
"description": "",
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@rollup/plugin-commonjs": "^28.0.2",
|
|
37
|
+
"@rollup/plugin-json": "^6.1.0",
|
|
38
|
+
"@rollup/plugin-node-resolve": "^16.0.0",
|
|
39
|
+
"@rollup/plugin-typescript": "^12.1.2",
|
|
40
|
+
"rollup": "^4.34.6",
|
|
41
|
+
"rollup-plugin-dts": "^6.1.1",
|
|
42
|
+
"typescript": "^5.7.3"
|
|
43
|
+
}
|
|
25
44
|
}
|
package/dist/cli.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
const generate_strapi_types_1 = require("./generate-strapi-types");
|
|
5
|
-
require("dotenv/config");
|
|
6
|
-
const main_1 = require("./main");
|
|
7
|
-
const strapi = new main_1.Strapi(process.env.STRAPI_URL, process.env.STRAPI_TOKEN);
|
|
8
|
-
(async () => {
|
|
9
|
-
await (0, generate_strapi_types_1.generateStrapiTypes)(strapi);
|
|
10
|
-
})();
|
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.generateStrapiTypes = generateStrapiTypes;
|
|
40
|
-
const fs = __importStar(require("fs"));
|
|
41
|
-
const path = __importStar(require("path"));
|
|
42
|
-
const get_component_name_1 = require("./generator/utils/get-component-name");
|
|
43
|
-
const attributes_1 = __importDefault(require("./generator/attributes"));
|
|
44
|
-
const get_content_type_name_1 = require("./generator/utils/get-content-type-name");
|
|
45
|
-
var ContentTypeKind;
|
|
46
|
-
(function (ContentTypeKind) {
|
|
47
|
-
ContentTypeKind["CollectionType"] = "collectionType";
|
|
48
|
-
ContentTypeKind["SingleType"] = "singleType";
|
|
49
|
-
})(ContentTypeKind || (ContentTypeKind = {}));
|
|
50
|
-
function getContentTypeMethodName(uid) {
|
|
51
|
-
const typeName = (0, get_content_type_name_1.getContentTypeName)(uid);
|
|
52
|
-
return typeName.charAt(0).toLowerCase() + typeName.slice(1);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Generates a TS interface from a content type or component definition
|
|
56
|
-
*/
|
|
57
|
-
function generateResponseTypeCode(name, attributes) {
|
|
58
|
-
const lines = [];
|
|
59
|
-
lines.push(`export type ${name} = {`);
|
|
60
|
-
for (const attributeName in attributes) {
|
|
61
|
-
const attribute = attributes[attributeName];
|
|
62
|
-
const isRequired = attribute.required ? '' : '?';
|
|
63
|
-
lines.push(` ${attributeName}${isRequired}: ${(0, attributes_1.default)(attributeName, attribute).getType()};`);
|
|
64
|
-
}
|
|
65
|
-
lines.push(`}`);
|
|
66
|
-
return lines.join('\n');
|
|
67
|
-
}
|
|
68
|
-
function generateQueryTypeCode(name, attributes) {
|
|
69
|
-
const fields = [];
|
|
70
|
-
const sortFields = [];
|
|
71
|
-
const filters = [];
|
|
72
|
-
const populates = [];
|
|
73
|
-
for (const attributeName in attributes) {
|
|
74
|
-
const attribute = attributes[attributeName];
|
|
75
|
-
const attributeGenerator = (0, attributes_1.default)(attributeName, attribute);
|
|
76
|
-
fields.push(...attributeGenerator.getFields());
|
|
77
|
-
sortFields.push(...attributeGenerator.getSortFields());
|
|
78
|
-
filters.push(...attributeGenerator.getFilters());
|
|
79
|
-
populates.push(...attributeGenerator.getPopulates());
|
|
80
|
-
}
|
|
81
|
-
const lines = [];
|
|
82
|
-
lines.push(`export type ${name}Filters = Filters<{`);
|
|
83
|
-
lines.push(...filters.map(({ name, type }) => ` ${name}?: ${type};`));
|
|
84
|
-
lines.push(`}>`);
|
|
85
|
-
lines.push('');
|
|
86
|
-
lines.push(`export type ${name}Populate = {`);
|
|
87
|
-
lines.push(...populates.map(({ name, type }) => ` ${name}?: ${type};`));
|
|
88
|
-
lines.push(`}`);
|
|
89
|
-
lines.push('');
|
|
90
|
-
lines.push(`export type ${name}Query = Query<`);
|
|
91
|
-
lines.push(` ${fields.map(field => `'${field}'`).join(' | ')},`);
|
|
92
|
-
lines.push(` ${sortFields.map(field => `'${field}'`).join(' | ')},`);
|
|
93
|
-
lines.push(` ${name}Filters,`);
|
|
94
|
-
lines.push(` ${name}Populate`);
|
|
95
|
-
lines.push(`>`);
|
|
96
|
-
return lines.join('\n');
|
|
97
|
-
}
|
|
98
|
-
function generateInputTypeCode(name, attributes) {
|
|
99
|
-
const fields = [];
|
|
100
|
-
for (const attributeName in attributes) {
|
|
101
|
-
const attribute = attributes[attributeName];
|
|
102
|
-
const attributeGenerator = (0, attributes_1.default)(attributeName, attribute);
|
|
103
|
-
fields.push({
|
|
104
|
-
name: attributeName,
|
|
105
|
-
type: attributeGenerator.getInputType(),
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
const lines = [];
|
|
109
|
-
lines.push(`export type ${name}Input = {`);
|
|
110
|
-
lines.push(...fields.map(({ name, type }) => ` ${name}?: ${type};`));
|
|
111
|
-
lines.push(`}`);
|
|
112
|
-
return lines.join('\n');
|
|
113
|
-
}
|
|
114
|
-
function generateMethodsCode(contentType) {
|
|
115
|
-
const methods = [];
|
|
116
|
-
const modelName = (0, get_content_type_name_1.getContentTypeName)(contentType.uid);
|
|
117
|
-
if (contentType.schema.kind === ContentTypeKind.CollectionType) {
|
|
118
|
-
methods.push([
|
|
119
|
-
` public async ${getContentTypeMethodName(contentType.schema.pluralName)}(query?: ${modelName}Query, params?: RequestInit) {`,
|
|
120
|
-
` return await this.getDocuments<${modelName}, ${modelName}Query>('${contentType.schema.pluralName}', query, params);`,
|
|
121
|
-
' }',
|
|
122
|
-
].join('\n'));
|
|
123
|
-
}
|
|
124
|
-
methods.push([
|
|
125
|
-
` public async ${getContentTypeMethodName(contentType.schema.singularName)}(query?: ${modelName}Query, params?: RequestInit) {`,
|
|
126
|
-
` return await this.getDocument<${modelName}, ${modelName}Query>('${contentType.schema.singularName}', query, params);`,
|
|
127
|
-
' }',
|
|
128
|
-
].join('\n'));
|
|
129
|
-
methods.push([
|
|
130
|
-
` public async create${(0, get_content_type_name_1.getContentTypeName)(contentType.schema.singularName)}(data: ${modelName}Input, params?: RequestInit) {`,
|
|
131
|
-
` return await this.create<${modelName}, ${modelName}Input>('${contentType.schema.pluralName}', data, params);`,
|
|
132
|
-
' }',
|
|
133
|
-
].join('\n'));
|
|
134
|
-
methods.push([
|
|
135
|
-
` public async update${(0, get_content_type_name_1.getContentTypeName)(contentType.schema.singularName)}(id: string, data: ${modelName}Input, params?: RequestInit) {`,
|
|
136
|
-
` return await this.update<${modelName}, ${modelName}Input>('${contentType.schema.pluralName}', id, data, params);`,
|
|
137
|
-
' }',
|
|
138
|
-
].join('\n'));
|
|
139
|
-
methods.push([
|
|
140
|
-
` public async delete${(0, get_content_type_name_1.getContentTypeName)(contentType.schema.singularName)}(id: string, params?: RequestInit) {`,
|
|
141
|
-
` return await this.delete<${modelName}>('${contentType.schema.pluralName}', id, params);`,
|
|
142
|
-
' }',
|
|
143
|
-
].join('\n'));
|
|
144
|
-
return methods;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Main function to fetch Strapi (v5) data and generate the d.ts file
|
|
148
|
-
*/
|
|
149
|
-
async function generateStrapiTypes(strapi) {
|
|
150
|
-
const contentTypes = (await strapi.request('content-type-builder/content-types')).data;
|
|
151
|
-
const components = (await strapi.request('content-type-builder/components')).data;
|
|
152
|
-
const allInterfaces = [];
|
|
153
|
-
const methods = [];
|
|
154
|
-
for (const component of components) {
|
|
155
|
-
const componentName = (0, get_component_name_1.getComponentName)(component.uid);
|
|
156
|
-
const attributes = {
|
|
157
|
-
id: {
|
|
158
|
-
type: 'integer',
|
|
159
|
-
},
|
|
160
|
-
...component.schema.attributes,
|
|
161
|
-
};
|
|
162
|
-
allInterfaces.push(generateResponseTypeCode(componentName, attributes));
|
|
163
|
-
allInterfaces.push(generateQueryTypeCode(componentName, attributes));
|
|
164
|
-
allInterfaces.push(generateInputTypeCode(componentName, attributes));
|
|
165
|
-
}
|
|
166
|
-
for (const contentType of contentTypes) {
|
|
167
|
-
if (!['api::', 'plugin::upload', 'plugin::users-permissions'].filter(prefix => contentType.uid.startsWith(prefix)).length) {
|
|
168
|
-
continue;
|
|
169
|
-
}
|
|
170
|
-
methods.push(...generateMethodsCode(contentType));
|
|
171
|
-
const modelName = (0, get_content_type_name_1.getContentTypeName)(contentType.uid);
|
|
172
|
-
const attributes = {
|
|
173
|
-
id: {
|
|
174
|
-
type: 'integer',
|
|
175
|
-
},
|
|
176
|
-
documentId: {
|
|
177
|
-
type: 'string',
|
|
178
|
-
},
|
|
179
|
-
createdAt: {
|
|
180
|
-
type: 'datetime',
|
|
181
|
-
},
|
|
182
|
-
updatedAt: {
|
|
183
|
-
type: 'datetime',
|
|
184
|
-
},
|
|
185
|
-
...contentType.schema.attributes,
|
|
186
|
-
};
|
|
187
|
-
allInterfaces.push(generateResponseTypeCode(modelName, attributes));
|
|
188
|
-
allInterfaces.push(generateQueryTypeCode(modelName, attributes));
|
|
189
|
-
allInterfaces.push(generateInputTypeCode(modelName, attributes));
|
|
190
|
-
}
|
|
191
|
-
const output = [
|
|
192
|
-
'import {Strapi as StrapiBase, Query, Filters, FilterValue, RelationInput} from "@malevich-studio/strapi-sdk-typescript";',
|
|
193
|
-
'import {BlocksContent} from "@strapi/blocks-react-renderer";',
|
|
194
|
-
'',
|
|
195
|
-
'export default class Strapi extends StrapiBase {',
|
|
196
|
-
methods.join('\n\n'),
|
|
197
|
-
'}',
|
|
198
|
-
'',
|
|
199
|
-
allInterfaces.join('\n\n'),
|
|
200
|
-
'',
|
|
201
|
-
].join('\n');
|
|
202
|
-
const outPath = path.join(process.cwd(), 'strapi.ts');
|
|
203
|
-
fs.writeFileSync(outPath, output, 'utf-8');
|
|
204
|
-
console.log(`✅ "strapi.ts" has been successfully generated!`);
|
|
205
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
const base_1 = __importStar(require("./base"));
|
|
37
|
-
class BaseRelation extends base_1.default {
|
|
38
|
-
constructor(name, attribute) {
|
|
39
|
-
super(name, attribute);
|
|
40
|
-
this.name = name;
|
|
41
|
-
this.attribute = attribute;
|
|
42
|
-
}
|
|
43
|
-
getType() {
|
|
44
|
-
return 'any';
|
|
45
|
-
}
|
|
46
|
-
getFields() {
|
|
47
|
-
return [];
|
|
48
|
-
}
|
|
49
|
-
getSortFields() {
|
|
50
|
-
return [];
|
|
51
|
-
}
|
|
52
|
-
getMode() {
|
|
53
|
-
return base_1.AttributeMode.Relation;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
exports.default = BaseRelation;
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AttributeMode = void 0;
|
|
4
|
-
var AttributeMode;
|
|
5
|
-
(function (AttributeMode) {
|
|
6
|
-
AttributeMode["Field"] = "field";
|
|
7
|
-
AttributeMode["Relation"] = "relation";
|
|
8
|
-
})(AttributeMode || (exports.AttributeMode = AttributeMode = {}));
|
|
9
|
-
class Base {
|
|
10
|
-
constructor(name, attribute) {
|
|
11
|
-
this.name = name;
|
|
12
|
-
this.attribute = attribute;
|
|
13
|
-
}
|
|
14
|
-
getType() {
|
|
15
|
-
return 'any';
|
|
16
|
-
}
|
|
17
|
-
getInputType() {
|
|
18
|
-
return this.getType();
|
|
19
|
-
}
|
|
20
|
-
getImports() {
|
|
21
|
-
return [];
|
|
22
|
-
}
|
|
23
|
-
getPackages() {
|
|
24
|
-
return [];
|
|
25
|
-
}
|
|
26
|
-
getFields() {
|
|
27
|
-
return [
|
|
28
|
-
this.name,
|
|
29
|
-
];
|
|
30
|
-
}
|
|
31
|
-
getSortFields() {
|
|
32
|
-
return [
|
|
33
|
-
this.name,
|
|
34
|
-
`${this.name}:asc`,
|
|
35
|
-
`${this.name}:desc`,
|
|
36
|
-
];
|
|
37
|
-
}
|
|
38
|
-
getPopulates() {
|
|
39
|
-
return [];
|
|
40
|
-
}
|
|
41
|
-
getFilters() {
|
|
42
|
-
return [
|
|
43
|
-
{
|
|
44
|
-
name: this.name,
|
|
45
|
-
type: `FilterValue<${this.getType()}>`,
|
|
46
|
-
},
|
|
47
|
-
];
|
|
48
|
-
}
|
|
49
|
-
getMode() {
|
|
50
|
-
return AttributeMode.Field;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
exports.default = Base;
|