@igorchugurov/public-api-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/supabase/server-client.ts","../src/utils/generateUIConfig.ts","../src/base/base-client.ts","../src/utils/instance-utils.ts","../src/errors.ts","../src/client.ts","../src/server.ts"],"names":["createSSRServerClient","options","id","_a"],"mappings":"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","file":"server.mjs","sourcesContent":["/**\n * Фабрика для создания Supabase клиента на сервере\n * Автономная версия - не зависит от Next.js или других фреймворков\n * Поддерживает опциональный cookie handler для SSR\n */\n\nimport { createServerClient as createSSRServerClient } from \"@supabase/ssr\";\nimport type { Database } from \"./types\";\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\n\n/**\n * Интерфейс для обработки cookies (универсальный для любых фреймворков)\n */\nexport interface CookieHandler {\n getAll: () => Array<{ name: string; value: string }>;\n setAll: (\n cookies: Array<{ name: string; value: string; options?: any }>\n ) => void;\n}\n\n/**\n * Создать Supabase клиент для сервера\n * @param supabaseUrl - URL Supabase проекта\n * @param supabaseAnonKey - Anon ключ Supabase\n * @param options - Опции для SSR (опционально)\n * @param options.cookies - Обработчик cookies для SSR (опционально)\n * @returns Supabase клиент\n */\nexport function createServerClient(\n supabaseUrl: string,\n supabaseAnonKey: string,\n options?: {\n cookies?: CookieHandler;\n }\n): SupabaseClient<Database> {\n return createSSRServerClient<Database>(supabaseUrl, supabaseAnonKey, {\n cookies: options?.cookies || {\n getAll: () => [],\n setAll: () => {\n // No-op when cookies handler is not provided\n },\n },\n global: {\n fetch: (url, options) => fetch(url, { ...options, cache: \"no-store\" }),\n },\n });\n}\n","/**\n * Генерация UI конфигурации из EntityDefinition и Fields\n * Единый источник истины для генерации UI конфигурации в SDK\n *\n * Основная логика:\n * 1. Генерируем defaults на основе имени сущности\n * 2. Мержим с custom конфигом из entityDefinition.uiConfig\n * 3. Генерируем колонки таблицы из полей с displayInTable: true\n */\n\nimport type { EntityDefinition, Field } from \"../types/entity-types\";\nimport type {\n EntityUIConfig,\n ListPageConfig,\n FormPageConfig,\n MessagesConfig,\n ColumnConfig,\n} from \"../types/ui-config-types\";\n\n/**\n * Генерирует полную UI конфигурацию с defaults\n * @param entityDefinition - Определение сущности из БД\n * @param fields - Поля сущности из БД\n * @returns Полная UI конфигурация со всеми значениями\n */\nexport function generateUIConfig(\n entityDefinition: EntityDefinition,\n fields: Field[]\n): EntityUIConfig {\n // 1. Генерируем defaults\n const defaults = generateDefaults(entityDefinition, fields);\n\n // 2. Мержим с custom конфигом (если есть)\n if (entityDefinition.uiConfig) {\n return deepMerge(\n defaults,\n entityDefinition.uiConfig as Partial<EntityUIConfig>\n );\n }\n\n return defaults;\n}\n\n/**\n * Генерирует defaults на основе EntityDefinition\n */\nfunction generateDefaults(\n entityDefinition: EntityDefinition,\n fields: Field[]\n): EntityUIConfig {\n const name = entityDefinition.name;\n const nameLower = name.toLowerCase();\n const namePlural = pluralize(nameLower);\n const tableName = entityDefinition.tableName;\n\n // Генерируем searchableFields из полей с searchable: true\n // Если нет таких полей, используем поле \"name\" по умолчанию\n const searchableFields = fields\n .filter((f) => f.searchable)\n .map((f) => f.name);\n\n // Если нет searchable полей, используем \"name\" по умолчанию\n const finalSearchableFields =\n searchableFields.length > 0 ? searchableFields : [\"name\"];\n\n // List configuration\n const list: ListPageConfig = {\n pageTitle: name,\n searchPlaceholder: `Search for ${namePlural}...`,\n emptyStateTitle: `You have no ${namePlural}`,\n emptyStateMessages: [\n `${name}s that you create will end up here.`,\n `Add a ${nameLower} to get started.`,\n ],\n showCreateButton: true,\n createButtonText: `New ${nameLower}`,\n showSearch: true,\n enablePagination: entityDefinition.enablePagination ?? true,\n pageSize: entityDefinition.pageSize ?? 20,\n enableFilters: entityDefinition.enableFilters ?? false,\n searchableFields: finalSearchableFields,\n columns: generateColumns(fields),\n };\n\n // Form configuration\n const form: FormPageConfig = {\n createPageTitle: `Create new ${nameLower}`,\n editPageTitle: `Edit ${nameLower}`,\n pageHeader: `${name} details`,\n createButtonLabel: \"Create\",\n updateButtonLabel: \"Update\",\n cancelButtonLabel: \"Cancel\",\n sectionTitles: {\n 0: entityDefinition.titleSection0 || \"General Information\",\n 1: entityDefinition.titleSection1 || \"Section 1\",\n 2: entityDefinition.titleSection2 || \"Section 2\",\n 3: entityDefinition.titleSection3 || \"Section 3\",\n },\n };\n\n // Messages configuration\n const messages: MessagesConfig = {\n afterCreate: `${name} was created successfully!`,\n afterUpdate: `${name} was updated successfully!`,\n afterDelete: `${name} was deleted successfully!`,\n errorCreate: `Failed to create ${nameLower}. Please try again.`,\n errorUpdate: `Failed to update ${nameLower}. Please try again.`,\n deleteModalTitle: `Confirm deleting ${nameLower}`,\n deleteModalText: `Are you sure you want to delete \"{itemName}\"? This action cannot be undone.`,\n deleteModalButtonText: \"Delete\",\n reloadEvents: {\n create: `reload${name}`,\n update: `reload${name}`,\n delete: `reload${name}`,\n },\n };\n\n return {\n apiUrl: `/api/${tableName}`,\n apiUrlAll: `/api/entity-instances/all`,\n list,\n form,\n messages,\n };\n}\n\n/**\n * Проверяет, является ли поле связью\n */\nfunction isRelationField(field: Field): boolean {\n return (\n field.dbType === \"manyToOne\" ||\n field.dbType === \"oneToOne\" ||\n field.dbType === \"manyToMany\" ||\n field.dbType === \"oneToMany\"\n );\n}\n\n/**\n * Генерирует колонки таблицы из полей с displayInTable: true\n */\nfunction generateColumns(fields: Field[]): ColumnConfig[] {\n // Фильтруем поля для отображения в таблице\n const displayFields = fields\n .filter((f) => f.displayInTable)\n .sort((a, b) => a.displayIndex - b.displayIndex);\n // Генерируем колонки из полей\n const columns: ColumnConfig[] = displayFields.map((field, index) => {\n const columnType = index === 0 ? \"naigateToDetails\" : getColumnType(field);\n const isRelation = isRelationField(field);\n\n const column: ColumnConfig = {\n field: field.name,\n headerName: field.label || field.name,\n flex: 1,\n type: columnType,\n sortable: true,\n\n // Добавляем relationDbType для полей-связей\n ...(isRelation && {\n relationDbType: field.dbType as\n | \"manyToOne\"\n | \"oneToOne\"\n | \"manyToMany\"\n | \"oneToMany\",\n }),\n };\n\n return column;\n });\n\n // Добавляем колонку действий\n columns.push({\n field: \"actions\",\n headerName: \"\",\n type: \"actions\",\n width: 100,\n actions: [\n {\n action: \"edit\",\n link: true,\n },\n {\n action: \"delete\",\n },\n ],\n });\n\n return columns;\n}\n\n/**\n * Определяет тип колонки по типу поля\n */\nfunction getColumnType(field: Field): ColumnConfig[\"type\"] {\n // Сначала проверяем, является ли поле связью\n if (isRelationField(field)) {\n return \"relation\";\n }\n\n // Для обычных полей определяем тип по field.type\n switch (field.type) {\n case \"date\":\n return \"date\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n default:\n return \"text\";\n }\n}\n\n/**\n * Простая плюрализация (можно заменить на библиотеку pluralize если нужно)\n */\nfunction pluralize(word: string): string {\n // Простые правила английской плюрализации\n if (word.endsWith(\"y\")) {\n return word.slice(0, -1) + \"ies\";\n }\n if (\n word.endsWith(\"s\") ||\n word.endsWith(\"x\") ||\n word.endsWith(\"ch\") ||\n word.endsWith(\"sh\")\n ) {\n return word + \"es\";\n }\n return word + \"s\";\n}\n\n/**\n * Deep merge двух объектов\n * custom перезаписывает defaults\n */\nfunction deepMerge<T extends Record<string, any>>(\n defaults: T,\n custom: Partial<T>\n): T {\n const result = { ...defaults };\n\n for (const key in custom) {\n const customValue = custom[key];\n const defaultValue = defaults[key];\n\n // Пропускаем undefined и null\n if (customValue === undefined || customValue === null) {\n continue;\n }\n\n // Рекурсивный merge для объектов (не массивов)\n if (\n typeof customValue === \"object\" &&\n !Array.isArray(customValue) &&\n typeof defaultValue === \"object\" &&\n !Array.isArray(defaultValue) &&\n defaultValue !== null\n ) {\n result[key] = deepMerge(\n defaultValue as Record<string, any>,\n customValue as Record<string, any>\n ) as any;\n } else {\n // Для примитивов и массивов - просто перезаписываем\n result[key] = customValue as any;\n }\n }\n\n return result;\n}\n\n/**\n * Утилита для форматирования колонок из старого формата\n * Для обратной совместимости с config/*.json\n */\nexport function getColumnsFromFields(fields: Field[]): ColumnConfig[] {\n return fields\n .filter((field) => field.displayInTable)\n .map((field, i) => ({\n type: i === 0 ? (\"naigateToDetails\" as const) : undefined,\n field: field.name,\n headerName: field.label || field.name,\n flex: 1,\n }));\n}\n","/**\n * Базовый класс для публичного API SDK\n * Содержит общую логику: кэширование, загрузка конфигурации\n */\n\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Database } from \"../supabase/types\";\nimport type {\n EntityDefinitionConfig,\n FieldConfig,\n QueryParams,\n CreateInstanceData,\n UpdateInstanceData,\n PaginationResult,\n AuthResult,\n SignUpData,\n SDKOptions,\n} from \"../types\";\nimport type {\n EntityInstanceWithFields,\n FieldType,\n DbType,\n FieldOption,\n EntityDefinition,\n Field,\n} from \"../types/entity-types\";\nimport type { EntityUIConfig } from \"../types/ui-config-types\";\nimport { generateUIConfig } from \"../utils/generateUIConfig\";\n\n/**\n * Базовый класс для публичного API клиента\n */\nexport abstract class BasePublicAPIClient {\n protected supabase: SupabaseClient<Database>;\n protected projectId: string;\n private enableCache: boolean;\n private cacheTTL: number;\n private configCache: Map<\n string,\n {\n config: EntityDefinitionConfig;\n expiresAt: number;\n }\n > = new Map();\n\n constructor(\n supabase: SupabaseClient<Database>,\n projectId: string,\n options: SDKOptions = {}\n ) {\n this.supabase = supabase;\n this.projectId = projectId;\n this.enableCache = options.enableCache ?? true;\n this.cacheTTL = options.cacheTTL ?? 5 * 60 * 1000; // 5 минут\n }\n\n /**\n * Загрузить fields для entityDefinition (с кэшированием)\n *\n * Флоу работы с кэшем:\n *\n * 1. Если enableCache === true (публичный API):\n * - Проверяет кэш по entityDefinitionId\n * - Если есть в кэше и не истек → возвращает из кэша (0 запросов к БД)\n * - Если нет в кэше или истек → загружает из БД и кэширует (1 запрос к БД)\n *\n * 2. Если enableCache === false (админка):\n * - Пропускает проверку кэша (эквивалент forceRefresh: true)\n * - Всегда загружает из БД (1 запрос к БД)\n * - Не сохраняет в кэш (всегда свежие данные)\n *\n * Используется внутри SDK для получения fields перед операциями с instances.\n * Fields нужны для определения типов полей, relations, и уплощения данных.\n */\n protected async getFields(\n entityDefinitionId: string\n ): Promise<FieldConfig[]> {\n // Загружаем всю конфигурацию (она кэшируется целиком)\n // forceRefresh определяется внутри getEntityDefinitionConfig на основе this.enableCache\n const config = await this.getEntityDefinitionConfig(entityDefinitionId);\n return config.fields;\n }\n\n /**\n * Преобразование данных entity_definition из БД в EntityDefinitionConfig\n */\n private transformEntityDefinitionFromDB(\n row: any\n ): Omit<EntityDefinitionConfig, \"fields\"> {\n return {\n id: row.id,\n name: row.name,\n description: row.description,\n tableName: row.table_name,\n type: row.type,\n projectId: row.project_id,\n createPermission: row.create_permission,\n readPermission: row.read_permission,\n updatePermission: row.update_permission,\n deletePermission: row.delete_permission,\n titleSection0: row.title_section_0,\n titleSection1: row.title_section_1,\n titleSection2: row.title_section_2,\n titleSection3: row.title_section_3,\n uiConfig: row.ui_config,\n enablePagination: row.enable_pagination,\n pageSize: row.page_size,\n enableFilters: row.enable_filters,\n maxFileSizeMb: row.max_file_size_mb,\n maxFilesCount: row.max_files_count,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n\n /**\n * Преобразование данных field из БД в FieldConfig\n */\n private transformFieldFromDB(row: any): FieldConfig {\n return {\n id: row.id,\n entityDefinitionId: row.entity_definition_id,\n name: row.name,\n dbType: row.db_type as DbType,\n type: row.type as FieldType,\n label: row.label,\n placeholder: row.placeholder,\n description: row.description,\n forEditPage: row.for_edit_page,\n forCreatePage: row.for_create_page,\n required: row.required,\n requiredText: row.required_text,\n forEditPageDisabled: row.for_edit_page_disabled,\n displayIndex: row.display_index,\n displayInTable: row.display_in_table,\n sectionIndex: row.section_index ?? 0,\n isOptionTitleField: row.is_option_title_field,\n searchable: row.searchable,\n filterableInList: row.filterable_in_list,\n options: row.options as FieldOption[] | undefined,\n relatedEntityDefinitionId: row.related_entity_definition_id,\n relationFieldId: row.relation_field_id,\n isRelationSource: row.is_relation_source,\n selectorRelationId: row.selector_relation_id,\n relationFieldName: row.relation_field_name,\n relationFieldLabel: row.relation_field_label,\n defaultStringValue: row.default_string_value,\n defaultNumberValue: row.default_number_value,\n defaultBooleanValue: row.default_boolean_value,\n defaultDateValue: row.default_date_value,\n autoPopulate: row.auto_populate,\n includeInSinglePma: row.include_in_single_pma,\n includeInListPma: row.include_in_list_pma,\n includeInSingleSa: row.include_in_single_sa,\n includeInListSa: row.include_in_list_sa,\n foreignKey: row.foreign_key,\n foreignKeyValue: row.foreign_key_value,\n typeFieldName: row.type_field_name,\n optionsFieldName: row.options_field_name,\n acceptFileTypes: row.accept_file_types,\n maxFileSize: row.max_file_size,\n maxFiles: row.max_files,\n storageBucket: row.storage_bucket,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n\n /**\n * Загрузить entityDefinition с полями одним запросом (JOIN)\n * Кэширует всю конфигурацию целиком (entityDefinition + fields)\n *\n * Логика кэширования:\n * - enableCache: true → использует кэш, сохраняет в кэш (TTL: 5 минут по умолчанию)\n * - enableCache: false → всегда загружает из БД, не использует кэш (эквивалент forceRefresh: true)\n *\n * @returns EntityDefinitionConfig с полями, отсортированными по display_index\n */\n async getEntityDefinitionConfig(\n entityDefinitionId: string\n ): Promise<EntityDefinitionConfig> {\n // Определяем forceRefresh на основе enableCache\n // Если кэш отключен, всегда обновляем (forceRefresh = true)\n const forceRefresh = !this.enableCache;\n\n // Проверяем кэш конфигурации (если кэш включен и не требуется обновление)\n if (!forceRefresh && this.enableCache) {\n const cached = this.configCache.get(entityDefinitionId);\n if (cached && Date.now() < cached.expiresAt) {\n // Конфигурация в кэше - возвращаем её (0 запросов к БД)\n return cached.config;\n }\n }\n\n // Загружаем entityDefinition и fields одним запросом через JOIN (все поля)\n const { data, error } = (await this.supabase\n .from(\"entity_definition\")\n .select(\n `\n *,\n field!field_entity_definition_id_fkey (*)\n `\n )\n .eq(\"id\", entityDefinitionId)\n .single()) as {\n data: any | null;\n error: any;\n };\n\n if (error || !data) {\n throw new Error(\n `Entity definition not found: ${error?.message || \"Unknown error\"}`\n );\n }\n\n // Преобразуем entityDefinition\n const entityDefinitionData = this.transformEntityDefinitionFromDB(data);\n\n // Преобразуем fields (сортировка по display_index)\n const fields: FieldConfig[] = ((data.field || []) as any[])\n .sort((a, b) => {\n // Сортируем по display_index\n const aIndex = a.display_index ?? 999;\n const bIndex = b.display_index ?? 999;\n return aIndex - bIndex;\n })\n .map((row: any) => this.transformFieldFromDB(row));\n\n // Формируем конфигурацию\n const config: EntityDefinitionConfig = {\n ...entityDefinitionData,\n fields,\n };\n\n // Кэшируем всю конфигурацию (если кэш включен)\n // Для админки (enableCache: false) не кэшируем - всегда свежие данные\n if (this.enableCache) {\n this.configCache.set(entityDefinitionId, {\n config,\n expiresAt: Date.now() + this.cacheTTL,\n });\n }\n\n return config;\n }\n\n /**\n * Преобразование EntityDefinitionConfig в EntityDefinition\n */\n private convertToEntityDefinition(\n config: EntityDefinitionConfig\n ): EntityDefinition {\n return {\n id: config.id,\n name: config.name,\n description: config.description,\n tableName: config.tableName,\n type: config.type,\n projectId: config.projectId,\n createPermission:\n config.createPermission as EntityDefinition[\"createPermission\"],\n readPermission:\n config.readPermission as EntityDefinition[\"readPermission\"],\n updatePermission:\n config.updatePermission as EntityDefinition[\"updatePermission\"],\n deletePermission:\n config.deletePermission as EntityDefinition[\"deletePermission\"],\n titleSection0: config.titleSection0,\n titleSection1: config.titleSection1,\n titleSection2: config.titleSection2,\n titleSection3: config.titleSection3,\n uiConfig: config.uiConfig,\n enablePagination: config.enablePagination,\n pageSize: config.pageSize,\n enableFilters: config.enableFilters,\n maxFileSizeMb: config.maxFileSizeMb,\n maxFilesCount: config.maxFilesCount,\n createdAt: config.createdAt,\n updatedAt: config.updatedAt,\n };\n }\n\n /**\n * Преобразование FieldConfig в Field\n */\n private convertToField(fieldConfig: FieldConfig): Field {\n return {\n id: fieldConfig.id,\n entityDefinitionId: fieldConfig.entityDefinitionId,\n name: fieldConfig.name,\n dbType: fieldConfig.dbType,\n type: fieldConfig.type,\n label: fieldConfig.label,\n placeholder: fieldConfig.placeholder,\n description: fieldConfig.description,\n forEditPage: fieldConfig.forEditPage,\n forCreatePage: fieldConfig.forCreatePage,\n required: fieldConfig.required,\n requiredText: fieldConfig.requiredText,\n forEditPageDisabled: fieldConfig.forEditPageDisabled,\n displayIndex: fieldConfig.displayIndex,\n displayInTable: fieldConfig.displayInTable,\n sectionIndex: fieldConfig.sectionIndex,\n isOptionTitleField: fieldConfig.isOptionTitleField,\n searchable: fieldConfig.searchable,\n filterableInList: fieldConfig.filterableInList,\n options: fieldConfig.options,\n relatedEntityDefinitionId: fieldConfig.relatedEntityDefinitionId,\n relationFieldId: fieldConfig.relationFieldId,\n isRelationSource: fieldConfig.isRelationSource,\n selectorRelationId: fieldConfig.selectorRelationId,\n relationFieldName: fieldConfig.relationFieldName,\n relationFieldLabel: fieldConfig.relationFieldLabel,\n defaultStringValue: fieldConfig.defaultStringValue,\n defaultNumberValue: fieldConfig.defaultNumberValue,\n defaultBooleanValue: fieldConfig.defaultBooleanValue,\n defaultDateValue: fieldConfig.defaultDateValue,\n autoPopulate: fieldConfig.autoPopulate,\n includeInSinglePma: fieldConfig.includeInSinglePma,\n includeInListPma: fieldConfig.includeInListPma,\n includeInSingleSa: fieldConfig.includeInSingleSa,\n includeInListSa: fieldConfig.includeInListSa,\n foreignKey: fieldConfig.foreignKey,\n foreignKeyValue: fieldConfig.foreignKeyValue,\n typeFieldName: fieldConfig.typeFieldName,\n optionsFieldName: fieldConfig.optionsFieldName,\n acceptFileTypes: fieldConfig.acceptFileTypes,\n maxFileSize: fieldConfig.maxFileSize,\n maxFiles: fieldConfig.maxFiles,\n storageBucket: fieldConfig.storageBucket,\n createdAt: fieldConfig.createdAt,\n updatedAt: fieldConfig.updatedAt,\n };\n }\n\n /**\n * Получить entity definition с полями и сгенерированным UI конфигом\n * Использует кэш SDK для оптимизации (если дефиниция уже загружена, не делает повторный запрос)\n *\n * @param entityDefinitionId - ID entity definition\n * @returns EntityDefinition, Fields и UI конфиг, или null если не найдено\n */\n async getEntityDefinitionWithUIConfig(entityDefinitionId: string): Promise<{\n entityDefinition: EntityDefinition;\n fields: Field[];\n uiConfig: EntityUIConfig;\n } | null> {\n try {\n // Получаем конфигурацию (использует кэш SDK)\n const config = await this.getEntityDefinitionConfig(entityDefinitionId);\n\n // Преобразуем в EntityDefinition и Field[]\n const entityDefinition = this.convertToEntityDefinition(config);\n const fields = config.fields.map((f) => this.convertToField(f));\n\n // Генерируем UI конфиг с defaults + merge с custom конфигом\n const uiConfig = generateUIConfig(entityDefinition, fields);\n\n return {\n entityDefinition,\n fields,\n uiConfig,\n };\n } catch (error) {\n // Если entity definition не найдена, возвращаем null\n if (error instanceof Error && error.message.includes(\"not found\")) {\n return null;\n }\n // Пробрасываем другие ошибки\n throw error;\n }\n }\n\n /**\n * Очистить кэш\n */\n clearCache(): void {\n this.configCache.clear();\n }\n\n // Абстрактные методы для CRUD операций\n abstract getInstances(\n entityDefinitionId: string,\n params?: QueryParams\n ): Promise<{\n data: EntityInstanceWithFields[];\n pagination: PaginationResult;\n }>;\n\n abstract getInstance(\n entityDefinitionId: string,\n id: string,\n params?: { relationsAsIds?: boolean }\n ): Promise<EntityInstanceWithFields>;\n\n abstract createInstance(\n entityDefinitionId: string,\n data: CreateInstanceData\n ): Promise<EntityInstanceWithFields>;\n\n abstract updateInstance(\n entityDefinitionId: string,\n id: string,\n data: UpdateInstanceData\n ): Promise<EntityInstanceWithFields>;\n\n abstract deleteInstance(\n entityDefinitionId: string,\n id: string\n ): Promise<void>;\n\n // Абстрактные методы для авторизации\n abstract signIn(email: string, password: string): Promise<AuthResult>;\n abstract signUp(data: SignUpData): Promise<AuthResult>;\n abstract signOut(): Promise<void>;\n abstract getCurrentUser(): Promise<AuthResult[\"user\"] | null>;\n}\n","/**\n * Утилиты для работы с entity instances внутри SDK\n * Копии функций из instance-client-service для изоляции SDK\n */\n\nimport type { EntityInstanceWithFields } from \"../types/entity-types\";\n\n/**\n * Преобразование данных из БД в типы TypeScript\n */\nexport function transformEntityInstance(row: any): {\n id: string;\n entityDefinitionId: string;\n projectId: string;\n data: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n} {\n return {\n id: row.id,\n entityDefinitionId: row.entity_definition_id,\n projectId: row.project_id,\n data: row.data || {},\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\n/**\n * Уплощает экземпляр: убирает data и relations, размещает все поля на верхнем уровне\n */\nexport function flattenInstance(\n instance: {\n id: string;\n entityDefinitionId: string;\n projectId: string;\n data: Record<string, unknown>;\n relations?: Record<string, EntityInstanceWithFields[]>;\n createdAt: string;\n updatedAt: string;\n },\n fields: Array<{ name: string; dbType: string }>,\n relationsAsIds: boolean = false\n): EntityInstanceWithFields {\n const result: Record<string, unknown> = {\n id: instance.id,\n entityDefinitionId: instance.entityDefinitionId,\n projectId: instance.projectId,\n createdAt: instance.createdAt,\n updatedAt: instance.updatedAt,\n };\n\n // Добавляем поля из data\n Object.entries(instance.data || {}).forEach(([key, value]) => {\n result[key] = value;\n });\n\n // Добавляем relations\n if (instance.relations) {\n Object.entries(instance.relations).forEach(\n ([fieldName, relatedInstances]) => {\n if (relationsAsIds) {\n // Если relationsAsIds = true, сохраняем только ID\n result[fieldName] = relatedInstances.map((inst) => inst.id);\n } else {\n // Иначе сохраняем полные объекты (для manyToMany) или один объект (для manyToOne, oneToOne)\n const field = fields.find((f) => f.name === fieldName);\n if (field?.dbType === \"manyToOne\" || field?.dbType === \"oneToOne\") {\n result[fieldName] = relatedInstances[0] || null;\n } else {\n result[fieldName] = relatedInstances;\n }\n }\n }\n );\n }\n\n return result as EntityInstanceWithFields;\n}\n","/**\n * Классы ошибок для публичного API SDK\n */\n\nexport class SDKError extends Error {\n constructor(\n public code: string,\n message: string,\n public statusCode?: number,\n public details?: unknown\n ) {\n super(message);\n this.name = \"SDKError\";\n }\n}\n\nexport class NotFoundError extends SDKError {\n constructor(resource: string, id?: string) {\n super(\n \"NOT_FOUND\",\n id ? `${resource} with id ${id} not found` : `${resource} not found`,\n 404\n );\n }\n}\n\nexport class PermissionDeniedError extends SDKError {\n constructor(action: string, resource: string) {\n super(\n \"PERMISSION_DENIED\",\n `Permission denied: cannot ${action} ${resource}`,\n 403\n );\n }\n}\n\nexport class ValidationError extends SDKError {\n constructor(field: string, message: string) {\n super(\n \"VALIDATION_ERROR\",\n `Validation failed for ${field}: ${message}`,\n 400,\n {\n field,\n message,\n }\n );\n }\n}\n\nexport class AuthenticationError extends SDKError {\n constructor(message = \"Authentication required\") {\n super(\"AUTHENTICATION_REQUIRED\", message, 401);\n }\n}\n\n/**\n * Обработка ошибок Supabase и преобразование в SDK ошибки\n */\nexport function handleSupabaseError(error: any): never {\n // PGRST116 = Row not found\n if (error.code === \"PGRST116\") {\n throw new NotFoundError(\"Resource\");\n }\n\n // 23505 = Unique violation (duplicate entry)\n if (error.code === \"23505\") {\n throw new SDKError(\"DUPLICATE_ENTRY\", \"Duplicate entry\", 409);\n }\n\n // 23503 = Foreign key violation\n if (error.code === \"23503\") {\n throw new SDKError(\"FOREIGN_KEY_VIOLATION\", \"Foreign key violation\", 400);\n }\n\n // 42501 = Insufficient privilege (RLS)\n if (error.code === \"42501\") {\n throw new PermissionDeniedError(\"access\", \"resource\");\n }\n\n // Общая ошибка\n throw new SDKError(\n \"UNKNOWN_ERROR\",\n error.message || \"Unknown error\",\n 500,\n error\n );\n}\n\n/**\n * Обработка ошибок при работе с entity instance\n * Специфичная обработка для операций с instances\n */\nexport function handleInstanceError(error: any, instanceId: string): never {\n // PGRST116 = Row not found\n if (error?.code === \"PGRST116\") {\n throw new NotFoundError(\"Entity instance\", instanceId);\n }\n\n // 42501 = Insufficient privilege (RLS) - нет прав доступа\n if (error?.code === \"42501\") {\n throw new PermissionDeniedError(\"read\", `entity instance ${instanceId}`);\n }\n\n // Остальные ошибки через общую обработку\n handleSupabaseError(error);\n}\n","/**\n * Унифицированный SDK клиент для работы с экземплярами сущностей\n * Поддерживает как Server Components (SSR), так и Client Components\n * Использует динамические импорты для изоляции server/client кода\n */\n\nimport { BasePublicAPIClient } from \"./base/base-client\";\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Database } from \"./supabase/types\";\nimport type {\n QueryParams,\n CreateInstanceData,\n UpdateInstanceData,\n PaginationResult,\n AuthResult,\n SignUpData,\n SDKOptions,\n} from \"./types\";\nimport type { EntityInstanceWithFields } from \"./types/entity-types\";\nimport {\n transformEntityInstance,\n flattenInstance,\n} from \"./utils/instance-utils\";\nimport {\n SDKError,\n NotFoundError,\n PermissionDeniedError,\n handleSupabaseError,\n handleInstanceError,\n AuthenticationError,\n} from \"./errors\";\n\n/**\n * Унифицированный публичный API клиент\n * Работает как в server, так и в client режиме\n */\nexport class PublicAPIClient extends BasePublicAPIClient {\n private static instances: Map<string, PublicAPIClient> = new Map();\n private mode: \"server\" | \"client\";\n\n private constructor(\n supabase: SupabaseClient<Database>,\n projectId: string,\n mode: \"server\" | \"client\",\n options: SDKOptions = {}\n ) {\n super(supabase, projectId, options);\n this.mode = mode;\n }\n\n /**\n * Создать SDK клиент напрямую с Supabase инстансом\n * Используется для создания через фабричные функции createServerSDK/createClientSDK\n *\n * @param supabase - Supabase клиент\n * @param projectId - ID проекта\n * @param mode - Режим работы: 'server' для SSR, 'client' для браузера\n * @param options - Опции SDK (кэширование и т.д.)\n */\n static create(\n supabase: SupabaseClient<Database>,\n projectId: string,\n mode: \"server\" | \"client\",\n options: SDKOptions = {}\n ): PublicAPIClient {\n const cacheKey = `${mode}-${projectId}-${JSON.stringify(options)}`;\n\n if (this.instances.has(cacheKey)) {\n return this.instances.get(cacheKey)!;\n }\n\n const client = new PublicAPIClient(supabase, projectId, mode, options);\n\n this.instances.set(cacheKey, client);\n return client;\n }\n\n /**\n * Получить режим работы клиента (для отладки)\n */\n getMode(): \"server\" | \"client\" {\n return this.mode;\n }\n\n /**\n * Получить один экземпляр\n */\n async getInstance(\n entityDefinitionId: string,\n id: string,\n params?: { relationsAsIds?: boolean }\n ): Promise<EntityInstanceWithFields> {\n try {\n // 1. Получаем fields из кэша SDK\n const fields = await this.getFields(entityDefinitionId);\n\n // 2. Получаем instance (используем this.supabase)\n const { data: instance, error: instanceError } = (await this.supabase\n .from(\"entity_instance\")\n .select(\"*\")\n .eq(\"id\", id)\n .eq(\"entity_definition_id\", entityDefinitionId)\n .eq(\"project_id\", this.projectId)\n .single()) as {\n data: {\n id: string;\n entity_definition_id: string;\n project_id: string;\n data: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n } | null;\n error: any;\n };\n\n if (instanceError || !instance) {\n // Обрабатываем ошибки получения instance\n handleInstanceError(\n instanceError || new Error(\"Instance not found\"),\n id\n );\n }\n\n // Трансформируем экземпляр\n const transformedInstance = transformEntityInstance(instance);\n\n // Проверяем принадлежность к entityDefinitionId\n if (transformedInstance.entityDefinitionId !== entityDefinitionId) {\n throw new NotFoundError(\"Entity instance\", id);\n }\n\n // 3. Определяем все relation fields\n const relationFields = fields.filter(\n (f) =>\n f.dbType === \"manyToMany\" ||\n f.dbType === \"manyToOne\" ||\n f.dbType === \"oneToMany\" ||\n f.dbType === \"oneToOne\"\n );\n\n // 4. Загружаем все relations одним batch-запросом (используем this.supabase)\n const relations: Record<string, EntityInstanceWithFields[]> = {};\n if (relationFields.length > 0) {\n const relationFieldIds = relationFields\n .map((f) => f.id)\n .filter((id): id is string => Boolean(id));\n\n if (relationFieldIds.length > 0) {\n // Batch-запрос: получаем все relations для всех полей одним запросом\n const { data: allRelations, error: relationsError } =\n (await this.supabase\n .from(\"entity_relation\")\n .select(\"target_instance_id, relation_field_id\")\n .eq(\"source_instance_id\", id)\n .in(\"relation_field_id\", relationFieldIds)) as {\n data: Array<{\n target_instance_id: string;\n relation_field_id: string;\n }> | null;\n error: any;\n };\n\n if (relationsError) {\n // Пробрасываем ошибку загрузки relations для отладки\n throw new SDKError(\n \"RELATIONS_LOAD_ERROR\",\n `Failed to load relations for instance ${id}: ${relationsError.message}`,\n 500,\n relationsError\n );\n }\n\n if (allRelations && allRelations.length > 0) {\n // Получаем все уникальные target_instance_id\n const targetInstanceIds = [\n ...new Set(allRelations.map((r) => r.target_instance_id)),\n ];\n\n // Загружаем все связанные экземпляры одним запросом\n const { data: relatedInstances, error: instancesError } =\n (await this.supabase\n .from(\"entity_instance\")\n .select(\"*\")\n .in(\"id\", targetInstanceIds)) as {\n data: Array<{\n id: string;\n entity_definition_id: string;\n project_id: string;\n data: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n }> | null;\n error: any;\n };\n\n if (instancesError) {\n // Пробрасываем ошибку загрузки связанных instances для отладки\n throw new SDKError(\n \"RELATED_INSTANCES_LOAD_ERROR\",\n `Failed to load related instances for instance ${id}: ${instancesError.message}`,\n 500,\n instancesError\n );\n }\n\n if (relatedInstances) {\n // Создаем карту связанных экземпляров\n const relatedInstancesMap = new Map(\n relatedInstances.map((inst) => [\n inst.id,\n transformEntityInstance(inst),\n ])\n );\n\n // Группируем relations по полям\n for (const relation of allRelations) {\n const relationField = relationFields.find(\n (f) => f.id === relation.relation_field_id\n );\n if (relationField) {\n const relatedInstance = relatedInstancesMap.get(\n relation.target_instance_id\n );\n if (relatedInstance) {\n if (!relations[relationField.name]) {\n relations[relationField.name] = [];\n }\n relations[relationField.name].push(\n relatedInstance as unknown as EntityInstanceWithFields\n );\n }\n }\n }\n }\n }\n }\n }\n\n // 5. Загружаем файлы одним batch-запросом (используем this.supabase)\n const fileFields = fields.filter(\n (f) => f.type === \"files\" || f.type === \"images\"\n );\n\n if (fileFields.length > 0) {\n const { data: allFiles, error: filesError } = (await this.supabase\n .from(\"entity_file\")\n .select(\"id, field_id\")\n .eq(\"entity_instance_id\", id)) as {\n data: Array<{ id: string; field_id: string | null }> | null;\n error: any;\n };\n\n if (filesError) {\n // Пробрасываем ошибку загрузки файлов для отладки\n throw new SDKError(\n \"FILES_LOAD_ERROR\",\n `Failed to load files for instance ${id}: ${filesError.message}`,\n 500,\n filesError\n );\n }\n\n if (allFiles) {\n // Группируем файлы по field_id\n const filesByFieldId = new Map<string, string[]>();\n allFiles.forEach((file) => {\n if (file.field_id) {\n if (!filesByFieldId.has(file.field_id)) {\n filesByFieldId.set(file.field_id, []);\n }\n filesByFieldId.get(file.field_id)!.push(file.id);\n }\n });\n\n // Подставляем массивы ID файлов в data для каждого поля\n fileFields.forEach((field) => {\n const fileIds = filesByFieldId.get(field.id) || [];\n if (fileIds.length > 0 || !transformedInstance.data[field.name]) {\n transformedInstance.data[field.name] = fileIds;\n }\n });\n }\n }\n\n // 6. Создаем объект с relations для уплощения\n const instanceWithRelations = {\n ...transformedInstance,\n relations: Object.keys(relations).length > 0 ? relations : undefined,\n };\n\n // 7. Уплощаем экземпляр используя утилиту из SDK\n return flattenInstance(\n instanceWithRelations,\n fields.map((f) => ({ name: f.name, dbType: f.dbType })),\n params?.relationsAsIds ?? false\n );\n } catch (error: any) {\n // Если ошибка уже является SDKError (NotFoundError, PermissionDeniedError и т.д.)\n // просто пробрасываем её дальше\n if (\n error instanceof NotFoundError ||\n error instanceof PermissionDeniedError ||\n error instanceof SDKError\n ) {\n throw error;\n }\n\n // Для остальных ошибок используем общую обработку\n handleSupabaseError(error);\n }\n }\n\n /**\n * Получить список экземпляров\n * Поддерживает поиск, фильтры (JSONB и relation), пагинацию\n */\n async getInstances(\n entityDefinitionId: string,\n params?: QueryParams\n ): Promise<{\n data: EntityInstanceWithFields[];\n pagination: PaginationResult;\n }> {\n try {\n // 1. Получаем fields из кэша SDK\n const fields = await this.getFields(entityDefinitionId);\n\n // 2. Настраиваем пагинацию\n const page = params?.page || 1;\n const limit = params?.limit || 20;\n const offset = (page - 1) * limit;\n\n // 3. Разделяем фильтры на обычные (JSONB) и relation-фильтры\n // SDK сам определяет relation-поля из fields (не зависит от внешних метаданных)\n const relationFieldsMap = new Map<string, { fieldId: string }>();\n\n // Создаем карту relation-полей из fields\n fields.forEach((field) => {\n if (\n field.relatedEntityDefinitionId &&\n (field.dbType === \"manyToMany\" ||\n field.dbType === \"manyToOne\" ||\n field.dbType === \"oneToMany\" ||\n field.dbType === \"oneToOne\")\n ) {\n relationFieldsMap.set(field.name, { fieldId: field.id });\n }\n });\n\n const jsonbFilters: Record<string, string[]> = {};\n const relationFiltersToApply: Array<{\n fieldName: string;\n fieldId: string;\n values: string[];\n }> = [];\n\n if (params?.filters) {\n Object.entries(params.filters).forEach(([fieldName, values]) => {\n if (values && values.length > 0) {\n const relationField = relationFieldsMap.get(fieldName);\n if (relationField) {\n // Это relation-фильтр - SDK сам определил из fields\n relationFiltersToApply.push({\n fieldName,\n fieldId: relationField.fieldId,\n values,\n });\n } else {\n // Это обычный JSONB-фильтр\n jsonbFilters[fieldName] = values;\n }\n }\n });\n }\n\n // 4. Если есть relation-фильтры, сначала получаем ID экземпляров из entity_relation\n let allowedInstanceIds: string[] | null = null;\n\n if (relationFiltersToApply.length > 0) {\n // Получаем режимы фильтрации для каждого поля (по умолчанию \"any\")\n const filterModes = params?.relationFilterModes || {};\n\n // Группируем фильтры по режиму\n const anyModeFilters: typeof relationFiltersToApply = [];\n const allModeFilters: typeof relationFiltersToApply = [];\n\n relationFiltersToApply.forEach((rf) => {\n const mode = filterModes[rf.fieldName] || \"any\";\n if (mode === \"all\") {\n allModeFilters.push(rf);\n } else {\n anyModeFilters.push(rf);\n }\n });\n\n // Обрабатываем фильтры с режимом \"any\"\n const anyModeInstanceIds: Set<string> | null =\n anyModeFilters.length > 0 ? new Set() : null;\n\n if (anyModeInstanceIds !== null && anyModeFilters.length > 0) {\n // ANY: хотя бы одна из связей должна совпадать\n const orConditions = anyModeFilters.flatMap((rf) =>\n rf.values.map(\n (targetId) =>\n `and(relation_field_id.eq.${rf.fieldId},target_instance_id.eq.${targetId})`\n )\n );\n\n const { data: relations, error: relError } = (await this.supabase\n .from(\"entity_relation\")\n .select(\"source_instance_id\")\n .or(orConditions.join(\",\"))) as {\n data: { source_instance_id: string }[] | null;\n error: any;\n };\n\n if (relError) {\n throw new SDKError(\n \"RELATION_FILTER_ERROR\",\n `Failed to apply relation filters (any mode): ${relError.message}`,\n 500,\n relError\n );\n } else if (relations) {\n relations.forEach((r) =>\n anyModeInstanceIds.add(r.source_instance_id)\n );\n }\n }\n\n // Обрабатываем фильтры с режимом \"all\"\n const allModeInstanceIdSets: Set<string>[] = [];\n\n for (const rf of allModeFilters) {\n const { data: relations, error: relError } = (await this.supabase\n .from(\"entity_relation\")\n .select(\"source_instance_id, target_instance_id\")\n .eq(\"relation_field_id\", rf.fieldId)\n .in(\"target_instance_id\", rf.values)) as {\n data:\n | { source_instance_id: string; target_instance_id: string }[]\n | null;\n error: any;\n };\n\n if (relError) {\n throw new SDKError(\n \"RELATION_FILTER_ERROR\",\n `Failed to apply relation filters (all mode): ${relError.message}`,\n 500,\n relError\n );\n }\n\n if (relations) {\n const sourceTargetMap = new Map<string, Set<string>>();\n relations.forEach((r) => {\n if (!sourceTargetMap.has(r.source_instance_id)) {\n sourceTargetMap.set(r.source_instance_id, new Set());\n }\n sourceTargetMap\n .get(r.source_instance_id)!\n .add(r.target_instance_id);\n });\n\n const validSources = new Set<string>();\n const requiredTargets = new Set(rf.values);\n\n sourceTargetMap.forEach((targets, sourceId) => {\n const hasAll = [...requiredTargets].every((t) => targets.has(t));\n if (hasAll) {\n validSources.add(sourceId);\n }\n });\n\n allModeInstanceIdSets.push(validSources);\n }\n }\n\n // Объединяем результаты\n if (anyModeInstanceIds !== null || allModeInstanceIdSets.length > 0) {\n if (anyModeInstanceIds !== null && anyModeInstanceIds.size > 0) {\n allowedInstanceIds = [...anyModeInstanceIds];\n } else if (allModeInstanceIdSets.length > 0) {\n allowedInstanceIds = [...allModeInstanceIdSets[0]];\n }\n\n if (allowedInstanceIds !== null && allModeInstanceIdSets.length > 0) {\n for (const idSet of allModeInstanceIdSets) {\n allowedInstanceIds = allowedInstanceIds.filter((id) =>\n idSet.has(id)\n );\n }\n }\n }\n\n if (allowedInstanceIds !== null && allowedInstanceIds.length === 0) {\n return {\n data: [],\n pagination: {\n page,\n limit,\n total: 0,\n totalPages: 0,\n hasPreviousPage: false,\n hasNextPage: false,\n },\n };\n }\n }\n\n // 5. Определяем поля для поиска\n // SDK сам определяет из fields с searchable: true\n const searchFields = (() => {\n const searchable = fields\n .filter((f) => f.searchable)\n .map((f) => f.name);\n // Если нет searchable полей, используем \"name\" по умолчанию\n return searchable.length > 0 ? searchable : [\"name\"];\n })();\n const searchTerm = params?.search?.trim() || null;\n\n let data: any[] | null = null;\n let error: any = null;\n let count: number | null = null;\n\n interface SearchResult {\n id: string;\n entity_definition_id: string;\n project_id: string;\n data: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n total_count: number;\n }\n\n // 6. Если есть поиск - используем RPC функцию\n if (searchTerm) {\n const rpcParams = {\n p_entity_definition_id: entityDefinitionId,\n p_project_id: this.projectId,\n p_search_term: searchTerm,\n p_search_fields: searchFields,\n p_limit: limit,\n p_offset: offset,\n };\n\n const { data: rpcData, error: rpcError } = (await this.supabase.rpc(\n \"search_entity_instances\" as any,\n rpcParams as any\n )) as { data: SearchResult[] | null; error: any };\n\n if (rpcError) {\n error = rpcError;\n } else if (rpcData && rpcData.length > 0) {\n count = rpcData[0].total_count;\n data = rpcData;\n } else {\n data = [];\n count = 0;\n }\n } else {\n // 7. Обычный запрос без поиска\n let query = this.supabase\n .from(\"entity_instance\")\n .select(\"*\", { count: \"exact\" })\n .eq(\"entity_definition_id\", entityDefinitionId)\n .eq(\"project_id\", this.projectId);\n\n if (allowedInstanceIds !== null && allowedInstanceIds.length > 0) {\n query = query.in(\"id\", allowedInstanceIds);\n }\n\n if (Object.keys(jsonbFilters).length > 0) {\n Object.entries(jsonbFilters).forEach(([fieldName, values]) => {\n if (values && values.length > 0) {\n query = query.or(\n values.map((v) => `data->>${fieldName}.eq.${v}`).join(\",\")\n );\n }\n });\n }\n\n const sortBy = params?.sortBy || \"created_at\";\n const sortOrder = params?.sortOrder || \"desc\";\n query = query.order(sortBy, { ascending: sortOrder === \"asc\" });\n query = query.range(offset, offset + limit - 1);\n\n const result = await query;\n data = result.data;\n error = result.error;\n count = result.count;\n }\n\n if (error) {\n handleSupabaseError(error);\n }\n\n if (!data || data.length === 0) {\n return {\n data: [],\n pagination: {\n page,\n limit,\n total: count || 0,\n totalPages: Math.ceil((count || 0) / limit),\n hasPreviousPage: page > 1,\n hasNextPage: page < Math.ceil((count || 0) / limit),\n },\n };\n }\n\n // 8. Трансформируем экземпляры\n const transformedInstances = data.map(transformEntityInstance);\n\n // 9. Загружаем relations batch-запросом (если нужно)\n // SDK сам определяет из fields с displayInTable: true и relation-полей\n const relationsMap = new Map<\n string,\n Record<string, EntityInstanceWithFields[]>\n >();\n\n // Определяем relation-поля для загрузки автоматически из fields\n const relationFieldsToLoad = fields\n .filter(\n (f) =>\n f.relatedEntityDefinitionId &&\n (f.dbType === \"manyToMany\" ||\n f.dbType === \"manyToOne\" ||\n f.dbType === \"oneToMany\" ||\n f.dbType === \"oneToOne\") &&\n f.displayInTable\n )\n .map((f) => f.name);\n\n if (relationFieldsToLoad.length > 0 && transformedInstances.length > 0) {\n const relationFields = relationFieldsToLoad\n .map((fieldName) => {\n const field = fields.find(\n (f) =>\n f.name === fieldName &&\n (f.dbType === \"manyToMany\" ||\n f.dbType === \"manyToOne\" ||\n f.dbType === \"oneToMany\" ||\n f.dbType === \"oneToOne\")\n );\n return field ? { name: fieldName, field } : null;\n })\n .filter(\n (f): f is { name: string; field: (typeof fields)[0] } => f !== null\n );\n\n if (relationFields.length > 0) {\n const instanceIds = transformedInstances.map((inst) => inst.id);\n const relationFieldIds = relationFields.map((rf) => rf.field.id);\n\n // Используем RPC функцию для объединения загрузки relations и связанных instances\n const { data: relationsWithInstances, error: rpcError } =\n (await this.supabase.rpc(\n \"get_related_instances\" as any,\n {\n p_source_instance_ids: instanceIds,\n p_relation_field_ids: relationFieldIds,\n } as any\n )) as {\n data: Array<{\n source_instance_id: string;\n relation_field_id: string;\n target_instance_id: string;\n target_entity_definition_id: string;\n target_project_id: string;\n target_data: Record<string, unknown>;\n target_created_at: string;\n target_updated_at: string;\n }> | null;\n error: any;\n };\n\n if (rpcError) {\n throw new SDKError(\n \"RELATIONS_LOAD_ERROR\",\n `Failed to load relations with instances: ${rpcError.message}`,\n 500,\n rpcError\n );\n }\n\n if (relationsWithInstances && relationsWithInstances.length > 0) {\n // Создаем Map связанных instances из результата RPC\n const relatedInstancesMap = new Map(\n relationsWithInstances.map((row) => [\n row.target_instance_id,\n transformEntityInstance({\n id: row.target_instance_id,\n entity_definition_id: row.target_entity_definition_id,\n project_id: row.target_project_id,\n data: row.target_data,\n created_at: row.target_created_at,\n updated_at: row.target_updated_at,\n }),\n ])\n );\n\n const targetEntityDefinitionIds = [\n ...new Set(\n Array.from(relatedInstancesMap.values()).map(\n (inst) => inst.entityDefinitionId\n )\n ),\n ];\n const fieldsMap = new Map<\n string,\n Array<{ name: string; dbType: string }>\n >();\n await Promise.all(\n targetEntityDefinitionIds.map(async (entityDefId) => {\n const targetFields = await this.getFields(entityDefId);\n fieldsMap.set(\n entityDefId,\n targetFields.map((f) => ({\n name: f.name,\n dbType: f.dbType,\n }))\n );\n })\n );\n\n // Обрабатываем relations из результата RPC\n for (const relationRow of relationsWithInstances) {\n const instanceId = relationRow.source_instance_id;\n const relationField = relationFields.find(\n (rf) => rf.field.id === relationRow.relation_field_id\n );\n\n if (relationField) {\n const relatedInstance = relatedInstancesMap.get(\n relationRow.target_instance_id\n );\n\n if (relatedInstance) {\n if (!relationsMap.has(instanceId)) {\n relationsMap.set(instanceId, {});\n }\n const instanceRelations = relationsMap.get(instanceId)!;\n if (!instanceRelations[relationField.name]) {\n instanceRelations[relationField.name] = [];\n }\n const targetFields =\n fieldsMap.get(relatedInstance.entityDefinitionId) || [];\n const flattenedRelated = flattenInstance(\n relatedInstance,\n targetFields,\n params?.relationsAsIds ?? false\n );\n instanceRelations[relationField.name].push(flattenedRelated);\n }\n }\n }\n }\n }\n }\n\n // 10. Загружаем файлы batch-запросом (если нужно)\n const fileFields = fields.filter(\n (f) => f.type === \"files\" || f.type === \"images\"\n );\n\n if (fileFields.length > 0 && transformedInstances.length > 0) {\n const instanceIds = transformedInstances.map((inst) => inst.id);\n const fieldIds = fileFields.map((f) => f.id);\n\n const { data: allFiles, error: filesError } = (await this.supabase\n .from(\"entity_file\")\n .select(\"id, entity_instance_id, field_id\")\n .in(\"entity_instance_id\", instanceIds)\n .in(\"field_id\", fieldIds)) as {\n data: Array<{\n id: string;\n entity_instance_id: string;\n field_id: string | null;\n }> | null;\n error: any;\n };\n\n if (filesError) {\n throw new SDKError(\n \"FILES_LOAD_ERROR\",\n `Failed to load files: ${filesError.message}`,\n 500,\n filesError\n );\n }\n\n if (allFiles) {\n const filesMap = new Map<string, Map<string, string[]>>();\n allFiles.forEach((file) => {\n if (file.field_id) {\n if (!filesMap.has(file.entity_instance_id)) {\n filesMap.set(file.entity_instance_id, new Map());\n }\n const instanceFiles = filesMap.get(file.entity_instance_id)!;\n if (!instanceFiles.has(file.field_id)) {\n instanceFiles.set(file.field_id, []);\n }\n instanceFiles.get(file.field_id)!.push(file.id);\n }\n });\n\n transformedInstances.forEach((instance) => {\n const instanceFiles = filesMap.get(instance.id);\n if (instanceFiles) {\n fileFields.forEach((field) => {\n const fileIds = instanceFiles.get(field.id) || [];\n if (fileIds.length > 0 || !instance.data[field.name]) {\n instance.data[field.name] = fileIds;\n }\n });\n }\n });\n }\n }\n\n // 11. Добавляем relations к экземплярам и уплощаем\n const instancesWithRelations = transformedInstances.map((instance) => {\n const instanceRelations = relationsMap.get(instance.id) || {};\n return {\n ...instance,\n relations:\n Object.keys(instanceRelations).length > 0\n ? instanceRelations\n : undefined,\n };\n });\n\n // 12. Уплощаем экземпляры\n const flattenedInstances = instancesWithRelations.map((inst) =>\n flattenInstance(\n inst,\n fields.map((f) => ({ name: f.name, dbType: f.dbType })),\n params?.relationsAsIds ?? false\n )\n );\n\n // 13. Вычисляем пагинацию\n const total = count || 0;\n const totalPages = Math.ceil(total / limit);\n\n return {\n data: flattenedInstances,\n pagination: {\n page,\n limit,\n total,\n totalPages,\n hasPreviousPage: page > 1,\n hasNextPage: page < totalPages,\n },\n };\n } catch (error: any) {\n if (\n error instanceof NotFoundError ||\n error instanceof PermissionDeniedError ||\n error instanceof SDKError\n ) {\n throw error;\n }\n handleSupabaseError(error);\n }\n }\n\n /**\n * Создать экземпляр сущности\n * Поддерживает создание с relations и автоматически устанавливает created_by\n */\n async createInstance(\n entityDefinitionId: string,\n data: CreateInstanceData\n ): Promise<EntityInstanceWithFields> {\n try {\n // 1. Получаем fields из кэша SDK\n const fields = await this.getFields(entityDefinitionId);\n\n // 2. Получаем текущего пользователя для установки created_by\n const {\n data: { user },\n error: userError,\n } = await this.supabase.auth.getUser();\n\n if (userError) {\n // Не критично, если пользователь не авторизован - created_by будет null\n // Но логируем для отладки\n console.warn(\n \"[SDK] Could not get user for created_by:\",\n userError.message\n );\n }\n\n // 3. Разделяем data и relations из CreateInstanceData\n const { data: instanceData, relations } = data;\n\n // 4. Создаем экземпляр\n const { data: instance, error: instanceError } = (await this.supabase\n .from(\"entity_instance\")\n .insert({\n entity_definition_id: entityDefinitionId,\n project_id: this.projectId,\n data: instanceData,\n created_by: user?.id || null,\n } as never)\n .select()\n .single()) as {\n data: {\n id: string;\n entity_definition_id: string;\n project_id: string;\n data: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n } | null;\n error: any;\n };\n\n if (instanceError || !instance) {\n handleInstanceError(\n instanceError || new Error(\"Failed to create instance\"),\n \"new\"\n );\n }\n\n const transformedInstance = transformEntityInstance(instance);\n\n // 5. Создаем связи если есть\n if (relations && Object.keys(relations).length > 0) {\n // Определяем relation поля\n const relationFields = fields.filter(\n (f) =>\n f.dbType === \"manyToMany\" ||\n f.dbType === \"manyToOne\" ||\n f.dbType === \"oneToMany\" ||\n f.dbType === \"oneToOne\"\n );\n\n const relationInserts: Array<{\n source_instance_id: string;\n target_instance_id: string;\n relation_field_id: string;\n relation_type: string;\n }> = [];\n\n for (const [fieldName, targetInstanceIds] of Object.entries(\n relations\n )) {\n const field = relationFields.find((f) => f.name === fieldName);\n\n if (!field) {\n console.warn(\n `[SDK] Field ${fieldName} not found or not a relation field`\n );\n continue;\n }\n\n // Преобразуем в массив если нужно\n const ids = Array.isArray(targetInstanceIds)\n ? targetInstanceIds\n : targetInstanceIds\n ? [targetInstanceIds]\n : [];\n\n for (const targetInstanceId of ids) {\n if (targetInstanceId) {\n relationInserts.push({\n source_instance_id: transformedInstance.id,\n target_instance_id: targetInstanceId,\n relation_field_id: field.id,\n relation_type: field.dbType,\n });\n }\n }\n }\n\n if (relationInserts.length > 0) {\n const { error: relationsError } = (await this.supabase\n .from(\"entity_relation\")\n .insert(relationInserts as never)) as {\n error: any;\n };\n\n if (relationsError) {\n throw new SDKError(\n \"RELATIONS_CREATE_ERROR\",\n `Failed to create relations: ${relationsError.message}`,\n 500,\n relationsError\n );\n }\n }\n }\n\n // 6. Возвращаем полный экземпляр через getInstance\n return await this.getInstance(entityDefinitionId, transformedInstance.id);\n } catch (error: any) {\n // Если ошибка уже является SDKError (NotFoundError, PermissionDeniedError и т.д.)\n // просто пробрасываем её дальше\n if (\n error instanceof NotFoundError ||\n error instanceof PermissionDeniedError ||\n error instanceof SDKError\n ) {\n throw error;\n }\n\n // Для остальных ошибок используем общую обработку\n handleSupabaseError(error);\n }\n }\n\n async updateInstance(\n entityDefinitionId: string,\n id: string,\n data: UpdateInstanceData\n ): Promise<EntityInstanceWithFields> {\n try {\n // 1. Проверяем, что экземпляр существует и принадлежит правильному entityDefinitionId и projectId\n const { data: currentInstance, error: checkError } = (await this.supabase\n .from(\"entity_instance\")\n .select(\"id, data, entity_definition_id, project_id\")\n .eq(\"id\", id)\n .eq(\"entity_definition_id\", entityDefinitionId)\n .eq(\"project_id\", this.projectId)\n .single()) as {\n data: {\n id: string;\n data: Record<string, unknown>;\n entity_definition_id: string;\n project_id: string;\n } | null;\n error: any;\n };\n\n if (checkError || !currentInstance) {\n handleInstanceError(checkError || new Error(\"Instance not found\"), id);\n }\n\n // 2. Получаем fields из кэша SDK\n const fields = await this.getFields(entityDefinitionId);\n\n // 3. Разделяем data и relations из UpdateInstanceData\n const { data: instanceData, relations } = data;\n\n // 4. Объединяем данные (новые перезаписывают старые)\n const updatedData = {\n ...(currentInstance.data || {}),\n ...instanceData,\n };\n\n // 5. Обновляем экземпляр\n const { data: updated, error: updateError } = (await this.supabase\n .from(\"entity_instance\")\n .update({\n data: updatedData,\n updated_at: new Date().toISOString(),\n } as never)\n .eq(\"id\", id)\n .eq(\"entity_definition_id\", entityDefinitionId)\n .eq(\"project_id\", this.projectId)\n .select()\n .single()) as {\n data: {\n id: string;\n entity_definition_id: string;\n project_id: string;\n data: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n } | null;\n error: any;\n };\n\n if (updateError || !updated) {\n throw new SDKError(\n \"UPDATE_ERROR\",\n `Failed to update entity instance: ${\n updateError?.message || \"Update failed\"\n }`,\n 500,\n updateError\n );\n }\n\n // 6. Обновляем связи если есть\n if (relations && Object.keys(relations).length > 0) {\n // Определяем relation поля\n const relationFields = fields.filter(\n (f) =>\n f.dbType === \"manyToMany\" ||\n f.dbType === \"manyToOne\" ||\n f.dbType === \"oneToMany\" ||\n f.dbType === \"oneToOne\"\n );\n\n // Получаем fieldIds для полей, которые нужно обновить\n const fieldIds = Object.keys(relations)\n .map((fieldName) => {\n const field = relationFields.find((f) => f.name === fieldName);\n return field?.id;\n })\n .filter(Boolean) as string[];\n\n // Удаляем старые связи для указанных полей\n if (fieldIds.length > 0) {\n const { error: deleteError } = (await this.supabase\n .from(\"entity_relation\")\n .delete()\n .eq(\"source_instance_id\", id)\n .in(\"relation_field_id\", fieldIds)) as {\n error: any;\n };\n\n if (deleteError) {\n throw new SDKError(\n \"RELATIONS_DELETE_ERROR\",\n `Failed to delete old relations: ${deleteError.message}`,\n 500,\n deleteError\n );\n }\n }\n\n // Создаем новые связи\n const relationInserts: Array<{\n source_instance_id: string;\n target_instance_id: string;\n relation_field_id: string;\n relation_type: string;\n }> = [];\n\n for (const [fieldName, targetInstanceIds] of Object.entries(\n relations\n )) {\n const field = relationFields.find((f) => f.name === fieldName);\n\n if (!field) {\n console.warn(\n `[SDK] Field ${fieldName} not found or not a relation field`\n );\n continue;\n }\n\n // Преобразуем в массив если нужно\n const ids = Array.isArray(targetInstanceIds)\n ? targetInstanceIds\n : targetInstanceIds\n ? [targetInstanceIds]\n : [];\n\n for (const targetInstanceId of ids) {\n if (targetInstanceId) {\n relationInserts.push({\n source_instance_id: id,\n target_instance_id: targetInstanceId,\n relation_field_id: field.id,\n relation_type: field.dbType,\n });\n }\n }\n }\n\n if (relationInserts.length > 0) {\n const { error: relationsError } = (await this.supabase\n .from(\"entity_relation\")\n .insert(relationInserts as never)) as {\n error: any;\n };\n\n if (relationsError) {\n throw new SDKError(\n \"RELATIONS_CREATE_ERROR\",\n `Failed to create relations: ${relationsError.message}`,\n 500,\n relationsError\n );\n }\n }\n }\n\n // 7. Формируем обновленный экземпляр из уже обновленных данных (без повторной загрузки)\n return await this.buildUpdatedInstance(updated, fields, relations || {});\n } catch (error: any) {\n // Если ошибка уже является SDKError (NotFoundError, PermissionDeniedError и т.д.)\n // просто пробрасываем её дальше\n if (\n error instanceof NotFoundError ||\n error instanceof PermissionDeniedError ||\n error instanceof SDKError\n ) {\n throw error;\n }\n\n // Для остальных ошибок используем общую обработку\n handleSupabaseError(error);\n }\n }\n\n /**\n * Формирует обновленный экземпляр из уже обновленных данных без повторной загрузки\n * Оптимизация: избегает лишних запросов после updateInstance\n * Загружает полные объекты relations для совместимости с форматом списка\n */\n private async buildUpdatedInstance(\n updated: {\n id: string;\n entity_definition_id: string;\n project_id: string;\n data: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n },\n fields: any[],\n relations: Record<string, string[]>\n ): Promise<EntityInstanceWithFields> {\n // Трансформируем обновленный instance\n const transformedInstance = transformEntityInstance(updated);\n\n // Формируем relations объект с полными объектами (как в списке)\n const relationsMap: Record<string, EntityInstanceWithFields[]> = {};\n\n if (Object.keys(relations).length > 0) {\n const relationFields = fields.filter(\n (f) =>\n f.dbType === \"manyToMany\" ||\n f.dbType === \"manyToOne\" ||\n f.dbType === \"oneToMany\" ||\n f.dbType === \"oneToOne\"\n );\n\n // Собираем все уникальные target_instance_id\n const allTargetInstanceIds = [\n ...new Set(\n Object.values(relations).flatMap((ids) =>\n Array.isArray(ids) ? ids : [ids]\n )\n ),\n ].filter(Boolean);\n\n if (allTargetInstanceIds.length > 0) {\n // Загружаем все связанные instances одним запросом\n const { data: relatedInstances, error: instancesError } =\n (await this.supabase\n .from(\"entity_instance\")\n .select(\"*\")\n .in(\"id\", allTargetInstanceIds)) as {\n data: Array<{\n id: string;\n entity_definition_id: string;\n project_id: string;\n data: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n }> | null;\n error: any;\n };\n\n if (instancesError) {\n // Если не удалось загрузить связанные instances, используем только ID\n console.warn(\n \"[SDK] Failed to load related instances for buildUpdatedInstance:\",\n instancesError.message\n );\n } else if (relatedInstances) {\n // Создаем карту связанных экземпляров\n const relatedInstancesMap = new Map(\n relatedInstances.map((inst) => [\n inst.id,\n transformEntityInstance(inst),\n ])\n );\n\n // Загружаем fields для связанных instances (для уплощения)\n const targetEntityDefinitionIds = [\n ...new Set(\n Array.from(relatedInstancesMap.values()).map(\n (inst) => inst.entityDefinitionId\n )\n ),\n ];\n const fieldsMap = new Map<\n string,\n Array<{ name: string; dbType: string }>\n >();\n await Promise.all(\n targetEntityDefinitionIds.map(async (entityDefId) => {\n const targetFields = await this.getFields(entityDefId);\n fieldsMap.set(\n entityDefId,\n targetFields.map((f) => ({\n name: f.name,\n dbType: f.dbType,\n }))\n );\n })\n );\n\n // Группируем relations по полям\n for (const [fieldName, targetInstanceIds] of Object.entries(\n relations\n )) {\n const field = relationFields.find((f) => f.name === fieldName);\n if (field) {\n const ids = Array.isArray(targetInstanceIds)\n ? targetInstanceIds\n : targetInstanceIds\n ? [targetInstanceIds]\n : [];\n\n const relatedInstancesForField: EntityInstanceWithFields[] = [];\n for (const id of ids) {\n const relatedInstance = relatedInstancesMap.get(id);\n if (relatedInstance) {\n const targetFields =\n fieldsMap.get(relatedInstance.entityDefinitionId) || [];\n const flattenedRelated = flattenInstance(\n relatedInstance,\n targetFields,\n false // relationsAsIds = false для совместимости со списком\n );\n relatedInstancesForField.push(flattenedRelated);\n }\n }\n\n if (relatedInstancesForField.length > 0) {\n relationsMap[fieldName] = relatedInstancesForField;\n }\n }\n }\n }\n }\n }\n\n // Создаем объект с relations для уплощения\n const instanceWithRelations = {\n ...transformedInstance,\n relations:\n Object.keys(relationsMap).length > 0 ? relationsMap : undefined,\n };\n\n // Уплощаем экземпляр (relationsAsIds = false для совместимости со списком)\n return flattenInstance(\n instanceWithRelations,\n fields.map((f) => ({ name: f.name, dbType: f.dbType })),\n false // relationsAsIds = false - возвращаем полные объекты как в списке\n );\n }\n\n /**\n * Удалить экземпляр сущности\n * Связи удалятся автоматически через ON DELETE CASCADE\n */\n async deleteInstance(entityDefinitionId: string, id: string): Promise<void> {\n try {\n // 1. Проверяем, что экземпляр существует и принадлежит правильному entityDefinitionId и projectId\n // Это дополнительная проверка безопасности\n const { data: instance, error: checkError } = (await this.supabase\n .from(\"entity_instance\")\n .select(\"id, entity_definition_id, project_id\")\n .eq(\"id\", id)\n .eq(\"entity_definition_id\", entityDefinitionId)\n .eq(\"project_id\", this.projectId)\n .single()) as {\n data: {\n id: string;\n entity_definition_id: string;\n project_id: string;\n } | null;\n error: any;\n };\n\n if (checkError || !instance) {\n handleInstanceError(checkError || new Error(\"Instance not found\"), id);\n }\n\n // 2. Удаляем экземпляр\n // Связи удалятся автоматически через ON DELETE CASCADE в БД\n const { error: deleteError } = await this.supabase\n .from(\"entity_instance\")\n .delete()\n .eq(\"id\", id)\n .eq(\"entity_definition_id\", entityDefinitionId)\n .eq(\"project_id\", this.projectId);\n\n if (deleteError) {\n throw new SDKError(\n \"DELETE_ERROR\",\n `Failed to delete entity instance: ${deleteError.message}`,\n 500,\n deleteError\n );\n }\n } catch (error: any) {\n // Если ошибка уже является SDKError (NotFoundError, PermissionDeniedError и т.д.)\n // просто пробрасываем её дальше\n if (\n error instanceof NotFoundError ||\n error instanceof PermissionDeniedError ||\n error instanceof SDKError\n ) {\n throw error;\n }\n\n // Для остальных ошибок используем общую обработку\n handleSupabaseError(error);\n }\n }\n\n async signIn(email: string, password: string): Promise<AuthResult> {\n throw new Error(\"signIn: Not implemented yet\");\n }\n\n async signUp(data: SignUpData): Promise<AuthResult> {\n throw new Error(\"signUp: Not implemented yet\");\n }\n\n async signOut(): Promise<void> {\n throw new Error(\"signOut: Not implemented yet\");\n }\n\n async getCurrentUser(): Promise<AuthResult[\"user\"] | null> {\n throw new Error(\"getCurrentUser: Not implemented yet\");\n }\n}\n","/**\n * Фабрика для создания SDK клиента в Server Components (SSR)\n * Автономная версия - принимает ключи Supabase как параметры\n * Поддерживает опциональный cookie handler для SSR\n */\n\nimport {\n createServerClient,\n type CookieHandler,\n} from \"./supabase/server-client\";\nimport { PublicAPIClient } from \"./client\";\nimport type { SDKOptions } from \"./types\";\n\n/**\n * Создать SDK клиент для Server Components\n * @param projectId - ID проекта\n * @param config - Конфигурация Supabase\n * @param config.supabaseUrl - URL Supabase проекта\n * @param config.supabaseAnonKey - Anon ключ Supabase\n * @param config.cookies - Обработчик cookies для SSR (опционально, для Next.js и других фреймворков)\n * @param options - Опции SDK (кэширование и т.д.)\n */\nexport async function createServerSDK(\n projectId: string,\n config: {\n supabaseUrl: string;\n supabaseAnonKey: string;\n cookies?: CookieHandler;\n },\n options?: SDKOptions\n): Promise<PublicAPIClient> {\n const supabase = createServerClient(\n config.supabaseUrl,\n config.supabaseAnonKey,\n config.cookies ? { cookies: config.cookies } : undefined\n );\n return PublicAPIClient.create(supabase, projectId, \"server\", options);\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@igorchugurov/public-api-sdk",
3
+ "version": "1.0.0",
4
+ "description": "Public API SDK for Axon Dashboard - reusable SDK for working with universal entities",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ },
12
+ "./server": {
13
+ "types": "./dist/server.d.ts",
14
+ "default": "./dist/server.js"
15
+ }
16
+ },
17
+ "scripts": {
18
+ "build": "tsup",
19
+ "dev": "tsup --watch",
20
+ "type-check": "tsc --noEmit",
21
+ "semantic-release": "semantic-release"
22
+ },
23
+ "peerDependencies": {
24
+ "@supabase/ssr": "^0.7.0",
25
+ "@supabase/supabase-js": "^2.81.1",
26
+ "next": "^14.0.0 || ^15.0.0"
27
+ },
28
+ "devDependencies": {
29
+ "@semantic-release/changelog": "^6.0.3",
30
+ "@semantic-release/commit-analyzer": "^13.0.1",
31
+ "@semantic-release/git": "^10.0.1",
32
+ "@semantic-release/github": "^12.0.2",
33
+ "@semantic-release/npm": "^13.1.2",
34
+ "@semantic-release/release-notes-generator": "^14.1.0",
35
+ "@types/node": "^20",
36
+ "conventional-changelog-conventionalcommits": "^9.1.0",
37
+ "semantic-release": "^25.0.2",
38
+ "tsup": "^8.0.0",
39
+ "typescript": "^5.0.0"
40
+ },
41
+ "files": [
42
+ "dist"
43
+ ],
44
+ "keywords": [
45
+ "sdk",
46
+ "api",
47
+ "supabase",
48
+ "nextjs",
49
+ "entities"
50
+ ],
51
+ "license": "MIT",
52
+ "author": "Igor Chugurov",
53
+ "repository": {
54
+ "type": "git",
55
+ "url": "git+https://github.com/IgorChugurov/public-api-sdk.git"
56
+ },
57
+ "bugs": {
58
+ "url": "https://github.com/IgorChugurov/public-api-sdk/issues"
59
+ },
60
+ "homepage": "https://github.com/IgorChugurov/public-api-sdk#readme",
61
+ "publishConfig": {
62
+ "access": "public"
63
+ }
64
+ }