8.5 KiB
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.
Локальный запуск
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 в другой проект
- Скопировать
dist/file-picker.iife.jsилиdist/file-picker.esm.jsв свой проект. - Подключить IIFE через
<script>и вызватьFilePicker.initFilePicker, либо импортировать ESM-бандл. - Передать
mount,allowedExt, а при необходимостиlabels,layout,limitsиonChange. - Получить выбранные leaf-файлы через
picker.getFiles(); каждый элемент содержитpath,name,sizeи исходныйfile. - После удаления компонента вызвать
picker.destroy().
Исходники upload/frontend/ нужны только для разработки и пересборки bundle;
встроенная библиотека fflate уже включена в готовые bundle.
Разрешённые расширения демо: .pdf, .doc, .docx, .txt, .md.
ZIP-файлы используются как контейнеры и раскрываются в браузере; сам ZIP не
возвращается как leaf-файл. По умолчанию действуют ограничения: 1000 entries,
100 MiB суммарно, 50 MiB на entry и глубина 20.
Legacy
Удалено и не должно восстанавливаться
upload/backend/— старый backend VM-upload, sessions и pull API;upload/frontend/table/init_upload_table.js— старый entry point с готовыми DOM-узлами;upload/frontend/table/set_status.js— неиспользуемый legacy helper;upload/frontend/upload/— старый frontend VM-upload layer.
Эти части не входят в сборку build.mjs, не импортируются текущим picker-ом и
не являются частью API. Не добавлять их обратно при интеграции.
Исторические документы
PLAN.md, docs/PLAN-componentization.md, review prompts и записи HISTORY/
могут содержать описания старой VM/backend-архитектуры. Они нужны для аудита
решений, но не являются актуальной спецификацией и не должны использоваться
как план разработки.
Актуальная инструкция интеграции находится в upload/README.md.
Полный справочник функций, состояния, DOM-контрактов и ограничений находится в
docs/CODE-REFERENCE.md.
История решений и проверок находится в HISTORY/.