> ## Documentation Index
> Fetch the complete documentation index at: https://cs-lua.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# export / import

> Вызов функций чужого плагина

# export / import

Вызов функций чужого плагина.

Плагины изолированы: глобальные переменные одного не видны другому.

| вопрос                                 | чем                                    |
| -------------------------------------- | -------------------------------------- |
| «выполни то, что умеет вон тот плагин» | эта страница                           |
| «сообщи всем, кому интересно»          | [`hook.run`](../hook/namespace.md#run) |

```lua theme={null}
-- в admin_manager
export("open", function(p) ui.root(p) end)

-- в любом другом
local admin = import("admin_manager")
local shop  = optional("shop")

admin.open(p)
if shop then shop.give(p, "vip") end
```

Прокси резолвит функцию на каждом вызове, поэтому в руках не останется указателя
на код исчезнувшего плагина. Ошибка внутри экспорта не роняет вызывающего: она
заворачивается в `[export плагин.имя] ...`.

Экспорты снимаются вместе с плагином, поэтому `lua_reload <plugin>` не
натыкается на «export уже зарегистрирован».

Кто что публикует — консольная команда [`lua_exports`](../console.md).

<h2 id="export">
  export
</h2>

Публикует функцию плагина наружу.

```lua theme={null}
export(name, fn[, opts])
```

### Аргументы

| # | имя    | тип          |                            |
| - | ------ | ------------ | -------------------------- |
| 1 | `name` | string       | имя функции                |
| 2 | `fn`   | function     | что вызывать               |
| 3 | `opts` | table \| nil | см. [Опции](#export-опции) |

### Возвращает

Ничего.

<h3 id="export-опции">
  Опции
</h3>

| поле       | тип     |                                   |
| ---------- | ------- | --------------------------------- |
| `version`  | number  | версия экспорта, по умолчанию `1` |
| `override` | boolean | разрешить перерегистрацию имени   |

<h2 id="import">
  import
</h2>

Возвращает прокси к экспортам плагина; жёсткая зависимость.

```lua theme={null}
import(plugin)
```

### Аргументы

| # | имя      | тип    |                            |
| - | -------- | ------ | -------------------------- |
| 1 | `plugin` | string | id плагина — имя его папки |

### Возвращает

| тип     |                    |
| ------- | ------------------ |
| `table` | прокси к экспортам |

Бросает ошибку, если плагина нет: зависимость падает при загрузке, а не через час на `nil`-вызове.

<Note>
  Плагины грузятся по алфавиту, поэтому `import` на этапе загрузки
  видит только тех, кто отсортирован раньше. Если порядок неудобен,
  бери зависимость лениво — внутри обработчика — или через
  [`optional`](index.md#optional).
</Note>

<h2 id="optional">
  optional
</h2>

То же, что import, но `nil` вместо ошибки; мягкая зависимость.

```lua theme={null}
optional(plugin)
```

### Аргументы

| # | имя      | тип    |            |
| - | -------- | ------ | ---------- |
| 1 | `plugin` | string | id плагина |

### Возвращает

| тип            |                         |
| -------------- | ----------------------- |
| `table \| nil` | `nil`, если плагина нет |

### Пример

```lua theme={null}
local shop = optional("shop")
if shop then
	shop.give(p, "vip")
end
```
