# Upload Platform Переиспользуемый browser-only file-picker версии `0.1.13`. Он выбирает файлы, папки и ZIP, строит дерево и возвращает интегрирующему приложению browser `File` objects. Содержимое файлов остаётся в браузере: текущий проект не загружает его на VM, в Flask или в другое хранилище. ## Карта файлов ### Корень проекта | Путь | Назначение | Статус | |---|---|---| | `package.json` | Версия пакета и команда `npm run build`. | Используется | | `package-lock.json` | Зафиксированные npm-зависимости. | Используется | | `build.mjs` | esbuild-сборка ESM и IIFE bundle. | Используется | | `requirements.txt` | Python-зависимости demo-сервера. | Используется demo | | `config.json` | Конфигурация demo: разрешённые расширения. | Используется demo | | `dist/file-picker.esm.js` | Готовый ESM bundle для интеграции. | Используется | | `dist/file-picker.iife.js` | Готовый IIFE bundle `FilePicker`. | Используется | | `upload/` | Исходники переиспользуемого picker-модуля. | Используется | | `site/` | Flask demo, который раздаёт страницу и bundle. | Используется только demo | | `docs/` | Справочная и историческая документация. | См. раздел LEGACY | | `HISTORY/` | Архив решений, ревью и результатов проверок. | Только история | ### `upload/` — исходники picker-а | Путь | Назначение | |---|---| | `upload/README.md` | Краткая инструкция интеграции готового bundle. | | `upload/config.example.json` | Пример конфигурации разрешённых расширений. | | `upload/frontend/index.js` | Единственная актуальная точка входа `initFilePicker(config)`, DOM, lifecycle API. | | `upload/frontend/table/add_file_with_dedup.js` | Дедупликация файлов и слияние одинаковых корней. | | `upload/frontend/table/esc.js` | HTML-экранирование имён, путей и атрибутов. | | `upload/frontend/table/fs.js` | Форматирование размеров файлов. | | `upload/frontend/table/on_files_change.js` | Выбор файлов, фильтрация, ZIP-разбор и fallback ошибок. | | `upload/frontend/table/on_folder_change.js` | Выбор папки через `webkitdirectory` и построение дерева. | | `upload/frontend/table/rebase_tree.js` | Добавление префикса пути без изменения базового `File.name`. | | `upload/frontend/table/render.js` | Рендер дерева, счётчик, поиск узлов и `flattenFiles()`. | | `upload/frontend/zip/list_zip_files.js` | Безопасный рекурсивный разбор ZIP через встроенный `fflate`. | ### `site/` — demo-обёртка | Путь | Назначение | |---|---| | `site/app.py` | Flask entrypoint, `/`, `/health`, раздача bundle и совместимый маршрут исходников. | | `site/templates/index.html` | Demo-страница и вызов `FilePicker.initFilePicker()`. | | `site/static/style.css` | Стили demo-страницы. | | `site/routes/` | Текущий каталог маршрутов; прикладного upload backend в нём нет. | ### `docs/` | Путь | Назначение | Статус | |---|---|---| | `docs/CODE-REFERENCE.md` | Справочник актуального picker-кода и API. | Использовать | | `docs/PLAN-componentization.md` | Исторический план перехода к bundle API. | LEGACY, не использовать как план | | `docs/sonnet-architecture-review-prompt.md` | Исторический prompt ревью старой архитектуры. | LEGACY, не использовать | | `docs/*-architecture-review-response.md` | Ответы на исторические ревью. | История, не спецификация | ### `HISTORY/` Файлы `HISTORY/` фиксируют состояние проекта на даты ревью, тестов и решений. Они могут описывать удалённые файлы, VM-upload или старые версии. Это архив, а не инструкция: при расхождении с кодом руководствоваться только исходниками, `README.md`, `upload/README.md` и `docs/CODE-REFERENCE.md`. ## Локальный запуск ```bash pip install -r requirements.txt npm install npm run build python site/app.py # → http://127.0.0.1:5000/ ``` Для запуска уже собранного demo достаточно иметь зависимости Python и содержимое `dist/`. `npm run build` требуется после изменения исходников `upload/frontend/`. ## Деплой на Nubes - Точка входа: `site/app.py` (платформа запускает `python site/app.py`). - `app.run(host="0.0.0.0", port=5000, debug=False)`. - Маршрут `/health` → `200` (иначе liveness-проба платформы убивает под). - Без `site/__init__.py` и factory pattern. ## Как интегрировать picker в другой проект 1. Скопировать `dist/file-picker.iife.js` или `dist/file-picker.esm.js` в свой проект. 2. Подключить IIFE через `