> ## Documentation Index
> Fetch the complete documentation index at: https://yumebox.gal.tf/llms.txt
> Use this file to discover all available pages before exploring further.

# Обзор синтаксиса JavaScript

Скрипт <Info> изменяет только текущую копию конфигурации и не изменяет напрямую исходный текст подписки. </Info>

<Prompt description="生成一个符合 YumeBox 运行时约束的 JavaScript 覆写">
  Создайте переопределение JavaScript для YumeBox.

  * `main(profile)` должен быть определен.
  * Должен быть возвращен объект конфигурации; используйте `async main(profile)`, когда требуются асинхронные запросы.
    — Назначайте значения напрямую при изменении полей объекта и используйте `deepMerge(profile, patch, true)` при изменении массивов.
  * Используйте только `yaml`, `deepMerge`, `fetch`, `console`, `b64e`, `b64d` и `Buffer`, предоставленные YumeBox.
    – Не возвращайте массивы, строки, числа или `undefined`.

  Цель:
</Prompt>

## Процесс выполнения

<Steps>
  <Step title="Инициализировать среду выполнения">
    Инициализирует среду выполнения JavaScript и встроенные методы при первом появлении файла `.js` в текущей цепочке переопределения.
  </Step>

  <Step title="Передать объект конфигурации">
    Текущая конфигурация преобразуется в объект JavaScript и передается как параметр `profile`.
  </Step>

  <Step title="выполнить основной">
    Скрипт может изменить `profile` напрямую или вернуть новый объект конфигурации. Поддерживаются как синхронные возвращаемые значения, так и завершенные промисы.
  </Step>

  <Step title="Проверьте возвращаемое значение">
    Возвращаемое значение должно быть конвертировано в объект JSON. Ошибки сценария, отсутствие `main` или возврат необъектных значений приведут к остановке текущей цепочки переопределения.
  </Step>
</Steps>

Та же самая цепочка переопределений повторно использует среду выполнения JavaScript, но каждый скрипт выполняется в изолированной области; `main`, переменные и объявления предыдущего скрипта не передаются в следующий скрипт.

## **ДЕРЖАТЬ\_30**

### Минимальный скрипт

```js 最小覆写.js icon="braces" lines theme={null}
function main(profile) {
  return profile;
}
```

### Изменить поля

```js 修改字段.js icon="braces" lines theme={null}
function main(profile) {
  profile["log-level"] = "info";
  profile["mixed-port"] = 7890;
  return profile;
}
```

### ожидаемая разница

```js 修改字段 diff.js icon="braces" lines theme={null}
function main(profile) {
-  profile["log-level"] = "info"; // [!code --]
+  profile["log-level"] = "debug"; // [!code ++]
  return profile;
}
```

`// [!code --]` и `// [!code ++]` используются только для отображения различий в документации и сами являются законными комментариями JavaScript.

### Изменение состояния

```js 按模式修改.js icon="braces" lines theme={null}
function main(profile) {
  if (profile.mode === "global") {
    profile["log-level"] = "warning";
  }
  return profile;
}
```

### Асинхронный скрипт

```js 异步 main.js icon="braces" lines theme={null}
async function main(profile) {
  await Promise.resolve();
  profile.extra = "ready";
  return profile;
}
```

Обещание должно в конечном итоге быть выполнено; он вернет `async main(profile) did not settle`, когда он находится в ожидании.

## Требования к возвращаемому значению

| возвращаемое значение                                              | результат                                       |
| ------------------------------------------------------------------ | ----------------------------------------------- |
| Объект конфигурации                                                | Успех, переход к следующей перезаписи.          |
| Обещание выполнено с объектом результата                           | успех.                                          |
| Массив, строка, число, логическое значение, `null` или `undefined` | Ошибка: `JS override result must be an object`. |
| Объект, который невозможно преобразовать в JSON                    | Сбой и остановка компиляции.                    |

Пример ошибки:

```js 错误的返回值.js icon="braces" lines theme={null}
function main(profile) {
  return profile.rules;
}
```

Если `profile.rules` является массивом, сценарий завершится ошибкой вместо того, чтобы продолжить работу с массивом как с полной конфигурацией.
