@malevich-studio/strapi-sdk-typescript 1.0.2 → 1.0.4

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.
Files changed (48) hide show
  1. package/dist/cli.cjs +618 -0
  2. package/dist/cli.cjs.map +1 -0
  3. package/dist/cli.d.ts +0 -1
  4. package/dist/cli.mjs +596 -0
  5. package/dist/cli.mjs.map +1 -0
  6. package/dist/generate-strapi-types.d.ts +1 -3
  7. package/dist/generator/attributes/base-relation.d.ts +2 -1
  8. package/dist/generator/attributes/blocks.d.ts +2 -1
  9. package/dist/generator/attributes/boolean.d.ts +2 -1
  10. package/dist/generator/attributes/component.d.ts +2 -2
  11. package/dist/generator/attributes/date-time.d.ts +2 -1
  12. package/dist/generator/attributes/enumeration.d.ts +2 -1
  13. package/dist/generator/attributes/index.d.ts +2 -1
  14. package/dist/generator/attributes/json.d.ts +3 -2
  15. package/dist/generator/attributes/media.d.ts +3 -2
  16. package/dist/generator/attributes/number.d.ts +2 -1
  17. package/dist/generator/attributes/relation.d.ts +2 -2
  18. package/dist/generator/attributes/string.d.ts +2 -1
  19. package/dist/generator/index.d.ts +5 -0
  20. package/dist/index.cjs +99 -0
  21. package/dist/index.cjs.map +1 -0
  22. package/dist/{main.d.ts → index.d.ts} +55 -6
  23. package/dist/index.mjs +97 -0
  24. package/dist/index.mjs.map +1 -0
  25. package/dist/test.cjs +114 -0
  26. package/dist/test.cjs.map +1 -0
  27. package/dist/test.d.ts +1 -0
  28. package/dist/test.mjs +112 -0
  29. package/dist/test.mjs.map +1 -0
  30. package/package.json +20 -8
  31. package/dist/cli.js +0 -10
  32. package/dist/generate-strapi-types.js +0 -205
  33. package/dist/generator/attributes/base-relation.js +0 -56
  34. package/dist/generator/attributes/base.js +0 -53
  35. package/dist/generator/attributes/blocks.js +0 -29
  36. package/dist/generator/attributes/boolean.js +0 -17
  37. package/dist/generator/attributes/component.js +0 -36
  38. package/dist/generator/attributes/date-time.js +0 -17
  39. package/dist/generator/attributes/enumeration.js +0 -17
  40. package/dist/generator/attributes/index.js +0 -40
  41. package/dist/generator/attributes/json.js +0 -20
  42. package/dist/generator/attributes/media.js +0 -29
  43. package/dist/generator/attributes/number.js +0 -17
  44. package/dist/generator/attributes/relation.js +0 -66
  45. package/dist/generator/attributes/string.js +0 -17
  46. package/dist/generator/utils/get-component-name.js +0 -13
  47. package/dist/generator/utils/get-content-type-name.js +0 -18
  48. package/dist/main.js +0 -67
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.mjs","sources":["../src/index.ts","../src/generator/utils/get-component-name.ts","../src/generator/attributes/base.ts","../src/generator/attributes/base-relation.ts","../src/generator/attributes/media.ts","../src/generator/utils/get-content-type-name.ts","../src/generator/attributes/relation.ts","../src/generator/attributes/enumeration.ts","../src/generator/attributes/date-time.ts","../src/generator/attributes/component.ts","../src/generator/attributes/blocks.ts","../src/generator/attributes/json.ts","../src/generator/attributes/string.ts","../src/generator/attributes/number.ts","../src/generator/attributes/boolean.ts","../src/generator/attributes/index.ts","../src/generator/index.ts","../src/cli.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","/**\n * Returns the TypeScript interface name from a component UID\n * e.g. \"default.test-component\" => \"DefaultTestComponent\"\n */\nexport function getComponentName(uid: string): string {\n return uid\n .split(/[\\.\\-]/)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n}\n","export type BaseAttribute = {\n configurable?: boolean;\n required?: boolean;\n private?: boolean;\n}\n\nexport enum AttributeMode {\n Field = 'field',\n Relation = 'relation',\n}\n\nexport type FieldType = {\n name: string;\n type: string;\n}\n\nexport default class Base {\n constructor(\n protected readonly name: string,\n protected readonly attribute: BaseAttribute,\n ) {}\n\n public getType(): string {\n return 'any';\n }\n\n public getInputType(): string {\n return this.getType();\n }\n\n public getImports(): string[] {\n return [];\n }\n\n public getPackages(): string[] {\n return [];\n }\n\n public getFields(): string[] {\n return [\n this.name,\n ];\n }\n\n public getSortFields(): string[] {\n return [\n this.name,\n `${this.name}:asc`,\n `${this.name}:desc`,\n ];\n }\n\n public getPopulates(): FieldType[] {\n return [];\n }\n\n public getFilters(): FieldType[] {\n return [\n {\n name: this.name,\n type: `FilterValue<${this.getType()}>`,\n },\n ];\n }\n\n public getMode(): AttributeMode {\n return AttributeMode.Field;\n }\n}","import Base, {AttributeMode} from \"@/generator/attributes/base\";\nimport type {BaseAttribute} from \"@/generator/attributes/base\";\n\nexport default class BaseRelation extends Base {\n constructor(\n protected readonly name: string,\n protected readonly attribute: BaseAttribute,\n ) {\n super(name, attribute);\n }\n\n public getType() {\n return 'any';\n }\n\n public getFields(): string[] {\n return [];\n }\n\n public getSortFields(): string[] {\n return [];\n }\n\n public getMode(): AttributeMode {\n return AttributeMode.Relation;\n }\n}","import type {BaseAttribute} from \"@/generator/attributes/base\";\nimport BaseRelation from \"@/generator/attributes/base-relation\";\n\nexport type MediaAttribute = BaseAttribute & {\n type: 'media';\n multiple: boolean;\n allowedTypes: string[];\n}\n\nexport default class Media extends BaseRelation {\n constructor(\n protected readonly name: string,\n protected readonly attribute: MediaAttribute,\n ) {\n super(name, attribute);\n }\n\n public getType() {\n return this.attribute.multiple ? 'File[]' : 'File';\n }\n\n public getInputType(): string {\n return 'RelationInput';\n }\n\n public getPopulates() {\n return [{\n name: this.name,\n type: 'FileQuery',\n }];\n }\n\n public getFilters() {\n return [{\n name: this.name,\n type: 'FileFilters',\n }];\n }\n}\n","/**\n * Returns the TypeScript interface name from a content type UID\n * e.g. \"api::article.article\" => \"Article\"\n */\nexport function getContentTypeName(uid: string): string {\n // Usually, UIDs look like \"api::<api-name>.<model-name>\"\n // We'll split at \"::\" and then take the part after the dot.\n const namePart = uid.split('::')[1] || uid;\n const modelName = namePart.split('.')[1] || namePart;\n // Convert to PascalCase\n return modelName\n .split('-')\n .map((s) => s.charAt(0).toUpperCase() + s.slice(1))\n .join('');\n}","import type {BaseAttribute} from \"@/generator/attributes/base\";\nimport BaseRelation from \"@/generator/attributes/base-relation\";\nimport {getContentTypeName} from \"@/generator/utils/get-content-type-name\";\n\nexport enum AttributeRelation {\n MorphToMany = 'morphToMany',\n ManyToOne = 'manyToOne',\n ManyToMany = 'manyToMany',\n OneToMany = 'oneToMany',\n OneToOne = 'oneToOne',\n}\n\ntype RelationData = {\n documentId: string;\n before?: string;\n after?: string;\n start?: true;\n end?: true;\n locale?: string;\n status?: 'published' | 'draft',\n} | string;\n\nexport type RelationInput = {\n connect?: RelationData[];\n disconnect?: RelationData[];\n set?: RelationData[];\n} | RelationData[];\n\nexport type RelationAttribute = BaseAttribute & {\n type: 'relation';\n relation: AttributeRelation;\n target: string,\n targetAttribute?: string,\n inversedBy: string,\n mappedBy: string,\n}\n\nexport default class Relation extends BaseRelation {\n constructor(\n protected readonly name: string,\n protected readonly attribute: RelationAttribute,\n ) {\n super(name, attribute);\n }\n\n public getType() {\n if (this.attribute.relation === AttributeRelation.MorphToMany) {\n return 'any';\n }\n\n const ContentTypeName = getContentTypeName(this.attribute.target);\n\n switch (this.attribute.relation) {\n case AttributeRelation.ManyToMany:\n case AttributeRelation.OneToMany:\n return `${ContentTypeName}[]`;\n case AttributeRelation.ManyToOne:\n case AttributeRelation.OneToOne:\n default:\n return ContentTypeName;\n }\n }\n\n public getInputType(): string {\n return 'RelationInput';\n }\n\n public getPopulates() {\n if (this.attribute.relation === AttributeRelation.MorphToMany) {\n return [];\n }\n\n return [{\n name: this.name,\n type: `${getContentTypeName(this.attribute.target)}Query`,\n }];\n }\n\n public getFilters() {\n if (this.attribute.relation === AttributeRelation.MorphToMany) {\n return [];\n }\n\n return [{\n name: this.name,\n type: `${getContentTypeName(this.attribute.target)}Filters`,\n }];\n }\n\n getImports(): string[] {\n return [\n ...super.getImports(),\n 'import {RelationInput} from \"@strapi/blocks-react-renderer\";',\n ];\n }\n}\n","import Base from \"@/generator/attributes/base\";\nimport type {BaseAttribute} from \"@/generator/attributes/base\";\n\nexport type EnumerationAttribute = BaseAttribute & {\n type: 'enumeration',\n enum: string[],\n default: string,\n};\n\nexport default class Enumeration extends Base {\n constructor(\n protected readonly name: string,\n protected readonly attribute: EnumerationAttribute,\n ) {\n super(name, attribute);\n }\n\n public getType() {\n return `'${this.attribute.enum.join('\\' | \\'')}'`;\n }\n}","import Base from \"@/generator/attributes/base\";\nimport type {BaseAttribute} from \"@/generator/attributes/base\";\n\nexport type DateTimeAttribute = BaseAttribute & {\n type: 'datetime';\n}\n\nexport default class DateTime extends Base {\n constructor(\n protected readonly name: string,\n protected readonly attribute: DateTimeAttribute,\n ) {\n super(name, attribute);\n }\n\n public getType() {\n return 'string';\n }\n}\n","import type {BaseAttribute, FieldType} from \"@/generator/attributes/base\";\nimport BaseRelation from \"@/generator/attributes/base-relation\";\nimport {getComponentName} from \"@/generator/utils/get-component-name\";\n\nexport type ComponentAttribute = BaseAttribute & {\n type: 'component';\n repeatable: boolean,\n component: string,\n min?: number,\n}\n\nexport default class Component extends BaseRelation {\n constructor(\n protected readonly name: string,\n protected readonly attribute: ComponentAttribute,\n ) {\n super(name, attribute);\n }\n\n public getType() {\n const componentName = getComponentName(this.attribute.component);\n return this.attribute.repeatable ? `${componentName}[]` : componentName;\n }\n\n public getInputType(): string {\n return `${getComponentName(this.attribute.component)}Input`;\n }\n\n public getPopulates() {\n return [{\n name: this.name,\n type: `${getComponentName(this.attribute.component)}Query`,\n }];\n }\n\n public getFilters(): FieldType[] {\n return [\n // {\n // name: this.name,\n // type: `${getComponentName(this.attribute.component)}Filters`,\n // }\n ];\n }\n}","import Base from \"@/generator/attributes/base\";\nimport type {BaseAttribute} from \"@/generator/attributes/base\";\n\nexport type BlocksAttribute = BaseAttribute & {\n type: 'blocks';\n}\n\nexport default class Blocks extends Base {\n constructor(\n protected readonly name: string,\n protected readonly attribute: BlocksAttribute,\n ) {\n super(name, attribute);\n }\n\n public getType() {\n return 'BlocksContent';\n }\n\n getImports(): string[] {\n return [\n ...super.getImports(),\n 'import {BlocksContent} from \"@strapi/blocks-react-renderer\";',\n ];\n }\n\n getPackages(): string[] {\n return [\n ...super.getPackages(),\n '@strapi/blocks-react-renderer',\n ];\n }\n}\n","import Base from \"@/generator/attributes/base\";\nimport type {BaseAttribute} from \"@/generator/attributes/base\";\n\nexport type JsonAttribute = BaseAttribute & {\n type: 'json';\n};\n\nexport default class Json extends Base {\n constructor(\n protected readonly name: string,\n protected readonly attribute: JsonAttribute,\n ) {\n super(name, attribute);\n }\n\n public getType() {\n return 'object';\n }\n\n public getFilters() {\n return [];\n }\n}","import Base from \"@/generator/attributes/base\";\nimport type {BaseAttribute} from \"@/generator/attributes/base\";\n\nexport type StringAttribute = BaseAttribute & {\n type: 'text' | 'string' | 'password' | 'email';\n minLength?: number;\n maxLength?: number;\n searchable?: boolean;\n}\n\nexport default class String extends Base {\n constructor(\n protected readonly name: string,\n protected readonly attribute: StringAttribute,\n ) {\n super(name, attribute);\n }\n\n public getType() {\n return 'string';\n }\n}","import Base from \"@/generator/attributes/base\";\nimport type {BaseAttribute} from \"@/generator/attributes/base\";\n\nexport type NumberAttribute = BaseAttribute & {\n type: 'integer' | 'biginteger' | 'decimal';\n min?: number;\n max?: number;\n}\n\nexport default class Number extends Base {\n constructor(\n protected readonly name: string,\n protected readonly attribute: NumberAttribute,\n ) {\n super(name, attribute);\n }\n\n public getType() {\n return 'number';\n }\n}","import Base from \"@/generator/attributes/base\";\nimport type {BaseAttribute} from \"@/generator/attributes/base\";\n\nexport type BooleanAttribute = BaseAttribute & {\n type: 'boolean';\n}\n\nexport default class Boolean extends Base {\n constructor(\n protected readonly name: string,\n protected readonly attribute: BooleanAttribute,\n ) {\n super(name, attribute);\n }\n\n public getType() {\n return 'boolean';\n }\n}","import Media from \"@/generator/attributes/media\";\nimport Relation from \"@/generator/attributes/relation\";\nimport Enumeration from \"@/generator/attributes/enumeration\";\nimport DateTime from \"@/generator/attributes/date-time\";\nimport Component from \"@/generator/attributes/component\";\nimport Blocks from \"@/generator/attributes/blocks\";\nimport Json from \"@/generator/attributes/json\";\nimport String from \"@/generator/attributes/string\";\nimport Number from \"@/generator/attributes/number\";\nimport Base from \"@/generator/attributes/base\";\nimport type {BaseAttribute} from \"@/generator/attributes/base\";\nimport Boolean from \"@/generator/attributes/boolean.ts\";\n\nconst types: Record<string, typeof Base> = {\n 'string': String,\n 'text': String,\n 'password': String,\n 'email': String,\n 'integer': Number,\n 'biginteger': Number,\n 'decimal': Number,\n 'float': Number,\n 'boolean': Boolean,\n 'media': Media,\n 'relation': Relation,\n 'enumeration': Enumeration,\n 'datetime': DateTime,\n 'component': Component,\n 'blocks': Blocks,\n 'json': Json,\n};\n\nexport default function getAttributeGenerator(name: string, attribute: BaseAttribute & {type: string}): Base {\n if (!types[attribute.type]) {\n throw new Error(`Attribute type \"${attribute.type}\" is not defined`);\n }\n\n return new types[attribute.type](name, attribute);\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { Strapi } from \"@/index.ts\";\nimport type {StringAttribute} from \"@/generator/attributes/string\";\nimport type {NumberAttribute} from \"@/generator/attributes/number\";\nimport type {BooleanAttribute} from \"@/generator/attributes/boolean\";\nimport type {MediaAttribute} from \"@/generator/attributes/media\";\nimport type {RelationAttribute} from \"@/generator/attributes/relation\";\nimport type {EnumerationAttribute} from \"@/generator/attributes/enumeration\";\nimport type {BlocksAttribute} from \"@/generator/attributes/blocks\";\nimport type {JsonAttribute} from \"@/generator/attributes/json\";\nimport type {ComponentAttribute} from \"@/generator/attributes/component\";\nimport {getComponentName} from \"@/generator/utils/get-component-name\";\nimport getAttributeGenerator from \"@/generator/attributes\";\nimport {getContentTypeName} from \"@/generator/utils/get-content-type-name\";\nimport type {DateTimeAttribute} from \"@/generator/attributes/date-time\";\nimport type {FieldType} from \"@/generator/attributes/base\";\n\nenum ContentTypeKind {\n CollectionType = 'collectionType',\n SingleType = 'singleType',\n}\n\ntype Attribute = StringAttribute | NumberAttribute | BooleanAttribute | DateTimeAttribute | RelationAttribute | ComponentAttribute | EnumerationAttribute | MediaAttribute | JsonAttribute | BlocksAttribute;\ntype Attributes = {\n [attributeName: string]: Attribute;\n}\n\n/**\n * Response type from /content-type-builder/content-types\n * (Structure is usually the same in Strapi 4/5, but is not officially documented.)\n */\ninterface ContentType {\n uid: string;\n apiID: string;\n schema: {\n draftAndPublish: boolean,\n displayName: string,\n singularName: string,\n pluralName: string,\n description: string,\n // pluginOptions: {},\n kind: ContentTypeKind,\n collectionName: string,\n visible: boolean,\n // restrictRelationsTo: null\n attributes: Attributes;\n }\n}\n\n/**\n * Response type from /content-type-builder/components\n */\ninterface Component {\n uid: string;\n category: string;\n apiID: string;\n schema: {\n displayName: string,\n description: string,\n icon: string,\n collectionName: string,\n attributes: Attributes;\n };\n}\n\nfunction getContentTypeMethodName(uid: string): string {\n const typeName = getContentTypeName(uid);\n return typeName.charAt(0).toLowerCase() + typeName.slice(1)\n}\n\n/**\n * Generates a TS interface from a content type or component definition\n */\nfunction generateResponseTypeCode(\n name: string,\n attributes: Attributes\n): string {\n const lines: string[] = [];\n lines.push(`export type ${name} = {`);\n\n for (const attributeName in attributes) {\n const attribute = attributes[attributeName];\n const isRequired = attribute.required ? '' : '?';\n lines.push(` ${attributeName}${isRequired}: ${getAttributeGenerator(attributeName, attribute).getType()};`);\n }\n\n lines.push(`}`);\n return lines.join('\\n');\n}\n\nfunction generateQueryTypeCode(name: string, attributes: Attributes): string {\n const fields: string[] = [];\n const sortFields: string[] = [];\n const filters: FieldType[] = [];\n const populates: FieldType[] = [];\n\n\n for (const attributeName in attributes) {\n const attribute = attributes[attributeName];\n const attributeGenerator = getAttributeGenerator(attributeName, attribute);\n fields.push(...attributeGenerator.getFields());\n sortFields.push(...attributeGenerator.getSortFields());\n filters.push(...attributeGenerator.getFilters());\n populates.push(...attributeGenerator.getPopulates());\n }\n\n const lines: string[] = [];\n lines.push(`export type ${name}Filters = Filters<{`);\n lines.push(...filters.map(({name, type}) => ` ${name}?: ${type};`));\n lines.push(`}>`);\n lines.push('');\n lines.push(`export type ${name}Populate = {`);\n lines.push(...populates.map(({name, type}) => ` ${name}?: ${type};`));\n lines.push(`}`);\n lines.push('');\n lines.push(`export type ${name}Query = Query<`);\n lines.push(` ${fields.map(field => `'${field}'`).join(' | ')},`);\n lines.push(` ${sortFields.map(field => `'${field}'`).join(' | ')},`);\n lines.push(` ${name}Filters,`);\n lines.push(` ${name}Populate`);\n lines.push(`>`);\n return lines.join('\\n');\n}\n\nfunction generateInputTypeCode(name: string, attributes: Attributes): string {\n const fields: FieldType[] = [];\n\n for (const attributeName in attributes) {\n const attribute = attributes[attributeName];\n const attributeGenerator = getAttributeGenerator(attributeName, attribute);\n fields.push({\n name: attributeName,\n type: attributeGenerator.getInputType(),\n });\n }\n\n const lines: string[] = [];\n lines.push(`export type ${name}Input = {`);\n lines.push(...fields.map(({name, type}) => ` ${name}?: ${type};`));\n lines.push(`}`);\n return lines.join('\\n');\n}\n\nfunction generateMethodsCode(contentType: ContentType) {\n const methods: string[] = []\n const modelName = getContentTypeName(contentType.uid);\n\n if (contentType.schema.kind === ContentTypeKind.CollectionType) {\n methods.push([\n ` public async ${getContentTypeMethodName(contentType.schema.pluralName)}(query?: ${modelName}Query, params?: RequestInit) {`,\n ` return await this.getDocuments<${modelName}, ${modelName}Query>('${contentType.schema.pluralName}', query, params);`,\n ' }',\n ].join('\\n'));\n }\n methods.push([\n ` public async ${getContentTypeMethodName(contentType.schema.singularName)}(query?: ${modelName}Query, params?: RequestInit) {`,\n ` return await this.getDocument<${modelName}, ${modelName}Query>('${contentType.schema.singularName}', query, params);`,\n ' }',\n ].join('\\n'));\n\n methods.push([\n ` public async create${getContentTypeName(contentType.schema.singularName)}(data: ${modelName}Input, params?: RequestInit) {`,\n ` return await this.create<${modelName}, ${modelName}Input>('${contentType.schema.pluralName}', data, params);`,\n ' }',\n ].join('\\n'));\n\n methods.push([\n ` public async update${getContentTypeName(contentType.schema.singularName)}(id: string, data: ${modelName}Input, params?: RequestInit) {`,\n ` return await this.update<${modelName}, ${modelName}Input>('${contentType.schema.pluralName}', id, data, params);`,\n ' }',\n ].join('\\n'));\n\n methods.push([\n ` public async delete${getContentTypeName(contentType.schema.singularName)}(id: string, params?: RequestInit) {`,\n ` return await this.delete<${modelName}>('${contentType.schema.pluralName}', id, params);`,\n ' }',\n ].join('\\n'));\n\n return methods;\n}\n\n/**\n * Main function to fetch Strapi (v5) data and generate the d.ts file\n */\nexport async function generateStrapiTypes(strapi: Strapi) {\n const contentTypes = (await strapi.request<ContentType[]>('content-type-builder/content-types')).data;\n const components = (await strapi.request<Component[]>('content-type-builder/components')).data;\n\n const allInterfaces: string[] = [];\n const methods: string[] = [];\n\n for (const component of components) {\n const componentName = getComponentName(component.uid);\n const attributes: Attributes = {\n id: {\n type: 'integer',\n },\n ...component.schema.attributes,\n }\n allInterfaces.push(generateResponseTypeCode(componentName, attributes));\n allInterfaces.push(generateQueryTypeCode(componentName, attributes));\n allInterfaces.push(generateInputTypeCode(componentName, attributes));\n }\n\n for (const contentType of contentTypes) {\n if (!['api::', 'plugin::upload', 'plugin::users-permissions'].filter(prefix => contentType.uid.startsWith(prefix)).length) {\n continue;\n }\n\n methods.push(...generateMethodsCode(contentType));\n const modelName = getContentTypeName(contentType.uid);\n const attributes: Attributes = {\n id: {\n type: 'integer',\n },\n documentId: {\n type: 'string',\n },\n createdAt: {\n type: 'datetime',\n },\n updatedAt: {\n type: 'datetime',\n },\n ...contentType.schema.attributes,\n }\n allInterfaces.push(generateResponseTypeCode(modelName, attributes));\n allInterfaces.push(generateQueryTypeCode(modelName, attributes));\n allInterfaces.push(generateInputTypeCode(modelName, attributes));\n }\n\n const output = [\n 'import {Strapi as StrapiBase, Query, Filters, FilterValue, RelationInput} from \"@malevich-studio/strapi-sdk-typescript\";',\n 'import {BlocksContent} from \"@strapi/blocks-react-renderer\";',\n '',\n 'export default class Strapi extends StrapiBase {',\n methods.join('\\n\\n'),\n '}',\n '',\n allInterfaces.join('\\n\\n'),\n '',\n ].join('\\n');\n const outPath = path.join(process.cwd(), 'strapi.ts');\n fs.writeFileSync(outPath, output, 'utf-8');\n\n console.log(`✅ \"strapi.ts\" has been successfully generated!`);\n}\n","import { generateStrapiTypes } from './generator';\nimport '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\nconst strapi = new Strapi(\n process.env.STRAPI_URL,\n process.env.STRAPI_TOKEN,\n);\n\n(async () => {\n await generateStrapiTypes(strapi);\n})();\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,4 @@
1
- import { Strapi } from "./main";
2
- import type { RelationInput } from "./generator/attributes/relation";
3
- export type { RelationInput };
1
+ import { Strapi } from "./index.ts";
4
2
  /**
5
3
  * Main function to fetch Strapi (v5) data and generate the d.ts file
6
4
  */
@@ -1,4 +1,5 @@
1
- import Base, { AttributeMode, BaseAttribute } from "./base";
1
+ import Base, { AttributeMode } from "@/generator/attributes/base";
2
+ import type { BaseAttribute } from "@/generator/attributes/base";
2
3
  export default class BaseRelation extends Base {
3
4
  protected readonly name: string;
4
5
  protected readonly attribute: BaseAttribute;
@@ -1,4 +1,5 @@
1
- import Base, { BaseAttribute } from "./base";
1
+ import Base from "@/generator/attributes/base";
2
+ import type { BaseAttribute } from "@/generator/attributes/base";
2
3
  export type BlocksAttribute = BaseAttribute & {
3
4
  type: 'blocks';
4
5
  };
@@ -1,4 +1,5 @@
1
- import Base, { BaseAttribute } from "./base";
1
+ import Base from "@/generator/attributes/base";
2
+ import type { BaseAttribute } from "@/generator/attributes/base";
2
3
  export type BooleanAttribute = BaseAttribute & {
3
4
  type: 'boolean';
4
5
  };
@@ -1,5 +1,5 @@
1
- import { BaseAttribute, FieldType } from "./base";
2
- import BaseRelation from "./base-relation";
1
+ import type { BaseAttribute, FieldType } from "@/generator/attributes/base";
2
+ import BaseRelation from "@/generator/attributes/base-relation";
3
3
  export type ComponentAttribute = BaseAttribute & {
4
4
  type: 'component';
5
5
  repeatable: boolean;
@@ -1,4 +1,5 @@
1
- import Base, { BaseAttribute } from "./base";
1
+ import Base from "@/generator/attributes/base";
2
+ import type { BaseAttribute } from "@/generator/attributes/base";
2
3
  export type DateTimeAttribute = BaseAttribute & {
3
4
  type: 'datetime';
4
5
  };
@@ -1,4 +1,5 @@
1
- import Base, { BaseAttribute } from "./base";
1
+ import Base from "@/generator/attributes/base";
2
+ import type { BaseAttribute } from "@/generator/attributes/base";
2
3
  export type EnumerationAttribute = BaseAttribute & {
3
4
  type: 'enumeration';
4
5
  enum: string[];
@@ -1,4 +1,5 @@
1
- import Base, { BaseAttribute } from "./base";
1
+ import Base from "@/generator/attributes/base";
2
+ import type { BaseAttribute } from "@/generator/attributes/base";
2
3
  export default function getAttributeGenerator(name: string, attribute: BaseAttribute & {
3
4
  type: string;
4
5
  }): Base;
@@ -1,4 +1,5 @@
1
- import Base, { BaseAttribute } from "./base";
1
+ import Base from "@/generator/attributes/base";
2
+ import type { BaseAttribute } from "@/generator/attributes/base";
2
3
  export type JsonAttribute = BaseAttribute & {
3
4
  type: 'json';
4
5
  };
@@ -7,5 +8,5 @@ export default class Json extends Base {
7
8
  protected readonly attribute: JsonAttribute;
8
9
  constructor(name: string, attribute: JsonAttribute);
9
10
  getType(): string;
10
- getFilters(): any[];
11
+ getFilters(): never[];
11
12
  }
@@ -1,5 +1,5 @@
1
- import { BaseAttribute } from "./base";
2
- import BaseRelation from "./base-relation";
1
+ import type { BaseAttribute } from "@/generator/attributes/base";
2
+ import BaseRelation from "@/generator/attributes/base-relation";
3
3
  export type MediaAttribute = BaseAttribute & {
4
4
  type: 'media';
5
5
  multiple: boolean;
@@ -10,6 +10,7 @@ export default class Media extends BaseRelation {
10
10
  protected readonly attribute: MediaAttribute;
11
11
  constructor(name: string, attribute: MediaAttribute);
12
12
  getType(): "File[]" | "File";
13
+ getInputType(): string;
13
14
  getPopulates(): {
14
15
  name: string;
15
16
  type: string;
@@ -1,4 +1,5 @@
1
- import Base, { BaseAttribute } from "./base";
1
+ import Base from "@/generator/attributes/base";
2
+ import type { BaseAttribute } from "@/generator/attributes/base";
2
3
  export type NumberAttribute = BaseAttribute & {
3
4
  type: 'integer' | 'biginteger' | 'decimal';
4
5
  min?: number;
@@ -1,5 +1,5 @@
1
- import { BaseAttribute } from "./base";
2
- import BaseRelation from "./base-relation";
1
+ import type { BaseAttribute } from "@/generator/attributes/base";
2
+ import BaseRelation from "@/generator/attributes/base-relation";
3
3
  export declare enum AttributeRelation {
4
4
  MorphToMany = "morphToMany",
5
5
  ManyToOne = "manyToOne",
@@ -1,4 +1,5 @@
1
- import Base, { BaseAttribute } from "./base";
1
+ import Base from "@/generator/attributes/base";
2
+ import type { BaseAttribute } from "@/generator/attributes/base";
2
3
  export type StringAttribute = BaseAttribute & {
3
4
  type: 'text' | 'string' | 'password' | 'email';
4
5
  minLength?: number;
@@ -0,0 +1,5 @@
1
+ import { Strapi } from "@/index.ts";
2
+ /**
3
+ * Main function to fetch Strapi (v5) data and generate the d.ts file
4
+ */
5
+ export declare function generateStrapiTypes(strapi: Strapi): Promise<void>;
package/dist/index.cjs ADDED
@@ -0,0 +1,99 @@
1
+ 'use strict';
2
+
3
+ var _ = require('lodash');
4
+ var qs = require('qs');
5
+ var mime = require('mime');
6
+ var promises = require('fs/promises');
7
+ var node_path = require('node:path');
8
+
9
+ class Strapi {
10
+ constructor(url, token) {
11
+ this.url = url;
12
+ this.token = token;
13
+ }
14
+ async request(endpoint, data = {}, params = {}) {
15
+ const queryString = params.method === 'GET' ? qs.stringify(data) : '';
16
+ return await this.baseRequest(queryString ? `${endpoint}?${queryString}` : endpoint, _.merge({
17
+ headers: {
18
+ 'Content-Type': 'application/json',
19
+ },
20
+ ...(params.method && !['GET', 'DELETE'].includes(params.method) ? {
21
+ body: JSON.stringify({
22
+ data,
23
+ })
24
+ } : {}),
25
+ }, params));
26
+ }
27
+ async getDocuments(endpoint, data, params = {}) {
28
+ return await this.request(endpoint, data, {
29
+ method: 'GET',
30
+ ...params,
31
+ });
32
+ }
33
+ async getDocument(endpoint, data, params = {}) {
34
+ return await this.request(endpoint, data, {
35
+ method: 'GET',
36
+ ...params,
37
+ });
38
+ }
39
+ async create(endpoint, data, params = {}) {
40
+ return await this.request(endpoint, data, {
41
+ method: 'POST',
42
+ ...params,
43
+ });
44
+ }
45
+ async update(endpoint, id, data, params = {}) {
46
+ return await this.request(`${endpoint}/${id}`, data, {
47
+ method: 'PUT',
48
+ ...params,
49
+ });
50
+ }
51
+ async delete(endpoint, id, params = {}) {
52
+ return await this.request(`${endpoint}/${id}`, {}, {
53
+ method: 'DELETE',
54
+ ...params,
55
+ });
56
+ }
57
+ /**
58
+ * For Node.js
59
+ *
60
+ * @param files list of files names which will be uploaded, example: ['/app/data/cover.js']
61
+ */
62
+ async upload(files) {
63
+ const form = new FormData();
64
+ await Promise.all(files.map(async (item) => {
65
+ const fileBuffer = await promises.readFile(item.path);
66
+ const file = new File([fileBuffer], item.filename || node_path.basename(item.path), { type: mime.getType(item.path) || 'image/jpeg' });
67
+ form.append('files', file);
68
+ }));
69
+ return await this.uploadForm(form);
70
+ }
71
+ async uploadForm(form) {
72
+ return await this.baseRequest('upload', {
73
+ method: 'POST',
74
+ body: form,
75
+ });
76
+ }
77
+ async baseRequest(endpoint, params = {}) {
78
+ const response = await fetch(`${this.url}/api/${endpoint}`, _.merge({
79
+ headers: {
80
+ Authorization: `Bearer ${this.token}`,
81
+ },
82
+ }, params));
83
+ if (!response.ok) {
84
+ console.log(`${this.url}/api/${endpoint}`);
85
+ console.log(_.merge({
86
+ headers: {
87
+ Authorization: `Bearer ${this.token}`,
88
+ },
89
+ }, params));
90
+ console.log(response);
91
+ console.log(await response.json());
92
+ throw new Error(`Помилка запиту до Strapi: ${response.status} ${response.statusText}`);
93
+ }
94
+ return (await response.json());
95
+ }
96
+ }
97
+
98
+ exports.Strapi = Strapi;
99
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/index.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"],"names":["readFile","basename"],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ export { RelationInput } from '@/generator/attributes/relation';
2
+
1
3
  type Response<T> = {
2
4
  data: T;
3
5
  meta: {
@@ -13,12 +15,47 @@ type Response<T> = {
13
15
  });
14
16
  };
15
17
  };
16
- export type Filters<T> = {
18
+ type File = {
19
+ id?: number;
20
+ documentId?: string;
21
+ createdAt?: string;
22
+ updatedAt?: string;
23
+ name: string;
24
+ alternativeText?: string;
25
+ caption?: string;
26
+ width?: number;
27
+ height?: number;
28
+ formats?: object;
29
+ hash: string;
30
+ ext?: string;
31
+ mime: string;
32
+ size: number;
33
+ url: string;
34
+ previewUrl?: string;
35
+ provider: string;
36
+ provider_metadata?: object;
37
+ related?: any;
38
+ folder?: Folder;
39
+ folderPath: string;
40
+ };
41
+ type Folder = {
42
+ id?: number;
43
+ documentId?: string;
44
+ createdAt?: string;
45
+ updatedAt?: string;
46
+ name: string;
47
+ pathId: number;
48
+ parent?: Folder;
49
+ children?: Folder[];
50
+ files?: File[];
51
+ path: string;
52
+ };
53
+ type Filters<T> = {
17
54
  $or?: Filters<T>[];
18
55
  $and?: Filters<T>[];
19
56
  $not?: Filters<T>[];
20
57
  } | T;
21
- export type FilterValue<T> = {
58
+ type FilterValue<T> = {
22
59
  $eq?: T;
23
60
  $eqi?: string;
24
61
  $ne?: T;
@@ -39,7 +76,7 @@ export type FilterValue<T> = {
39
76
  $endsWith?: string;
40
77
  $endsWithi?: string;
41
78
  } | T;
42
- export type Query<Fields, Sort, Filters, Populate> = {
79
+ type Query<Fields, Sort, Filters, Populate> = {
43
80
  populate?: Populate;
44
81
  fields?: Fields[] | '*';
45
82
  filters?: Filters;
@@ -56,15 +93,27 @@ export type Query<Fields, Sort, Filters, Populate> = {
56
93
  limit?: number;
57
94
  });
58
95
  };
59
- export declare class Strapi {
96
+ declare class Strapi {
60
97
  private readonly url;
61
98
  private readonly token;
62
99
  constructor(url: string, token: string);
63
- request<T>(endpoint: string, data?: object, params?: RequestInit): Promise<Response<T>>;
100
+ request<T>(endpoint: string, data?: object | FormData, params?: RequestInit): Promise<Response<T>>;
64
101
  getDocuments<T, Q extends object>(endpoint: string, data?: Q, params?: RequestInit): Promise<Response<T[]>>;
65
102
  getDocument<T, Q extends object>(endpoint: string, data?: Q, params?: RequestInit): Promise<Response<T>>;
66
103
  create<T, Q extends object>(endpoint: string, data: Q, params?: RequestInit): Promise<Response<T>>;
67
104
  update<T, Q extends object>(endpoint: string, id: string, data: Q, params?: RequestInit): Promise<Response<T>>;
68
105
  delete<T>(endpoint: string, id: string, params?: RequestInit): Promise<Response<T>>;
106
+ /**
107
+ * For Node.js
108
+ *
109
+ * @param files list of files names which will be uploaded, example: ['/app/data/cover.js']
110
+ */
111
+ upload(files: {
112
+ path: string;
113
+ filename?: string;
114
+ }[]): Promise<File[]>;
115
+ uploadForm(form: FormData): Promise<File[]>;
116
+ private baseRequest;
69
117
  }
70
- export {};
118
+
119
+ export { type File, type FilterValue, type Filters, type Folder, type Query, Strapi };
package/dist/index.mjs ADDED
@@ -0,0 +1,97 @@
1
+ import _ from 'lodash';
2
+ import qs from 'qs';
3
+ import mime from 'mime';
4
+ import { readFile } from 'fs/promises';
5
+ import { basename } from 'node:path';
6
+
7
+ class Strapi {
8
+ constructor(url, token) {
9
+ this.url = url;
10
+ this.token = token;
11
+ }
12
+ async request(endpoint, data = {}, params = {}) {
13
+ const queryString = params.method === 'GET' ? qs.stringify(data) : '';
14
+ return await this.baseRequest(queryString ? `${endpoint}?${queryString}` : endpoint, _.merge({
15
+ headers: {
16
+ 'Content-Type': 'application/json',
17
+ },
18
+ ...(params.method && !['GET', 'DELETE'].includes(params.method) ? {
19
+ body: JSON.stringify({
20
+ data,
21
+ })
22
+ } : {}),
23
+ }, params));
24
+ }
25
+ async getDocuments(endpoint, data, params = {}) {
26
+ return await this.request(endpoint, data, {
27
+ method: 'GET',
28
+ ...params,
29
+ });
30
+ }
31
+ async getDocument(endpoint, data, params = {}) {
32
+ return await this.request(endpoint, data, {
33
+ method: 'GET',
34
+ ...params,
35
+ });
36
+ }
37
+ async create(endpoint, data, params = {}) {
38
+ return await this.request(endpoint, data, {
39
+ method: 'POST',
40
+ ...params,
41
+ });
42
+ }
43
+ async update(endpoint, id, data, params = {}) {
44
+ return await this.request(`${endpoint}/${id}`, data, {
45
+ method: 'PUT',
46
+ ...params,
47
+ });
48
+ }
49
+ async delete(endpoint, id, params = {}) {
50
+ return await this.request(`${endpoint}/${id}`, {}, {
51
+ method: 'DELETE',
52
+ ...params,
53
+ });
54
+ }
55
+ /**
56
+ * For Node.js
57
+ *
58
+ * @param files list of files names which will be uploaded, example: ['/app/data/cover.js']
59
+ */
60
+ async upload(files) {
61
+ const form = new FormData();
62
+ await Promise.all(files.map(async (item) => {
63
+ const fileBuffer = await readFile(item.path);
64
+ const file = new File([fileBuffer], item.filename || basename(item.path), { type: mime.getType(item.path) || 'image/jpeg' });
65
+ form.append('files', file);
66
+ }));
67
+ return await this.uploadForm(form);
68
+ }
69
+ async uploadForm(form) {
70
+ return await this.baseRequest('upload', {
71
+ method: 'POST',
72
+ body: form,
73
+ });
74
+ }
75
+ async baseRequest(endpoint, params = {}) {
76
+ const response = await fetch(`${this.url}/api/${endpoint}`, _.merge({
77
+ headers: {
78
+ Authorization: `Bearer ${this.token}`,
79
+ },
80
+ }, params));
81
+ if (!response.ok) {
82
+ console.log(`${this.url}/api/${endpoint}`);
83
+ console.log(_.merge({
84
+ headers: {
85
+ Authorization: `Bearer ${this.token}`,
86
+ },
87
+ }, params));
88
+ console.log(response);
89
+ console.log(await response.json());
90
+ throw new Error(`Помилка запиту до Strapi: ${response.status} ${response.statusText}`);
91
+ }
92
+ return (await response.json());
93
+ }
94
+ }
95
+
96
+ export { Strapi };
97
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/index.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"],"names":[],"mappings":"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"}