Merge origin/master into master
This commit is contained in:
+18
@@ -1,6 +1,24 @@
|
|||||||
__pycache__/
|
__pycache__/
|
||||||
*.pyc
|
*.pyc
|
||||||
.env
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
venv/
|
||||||
|
.venv/
|
||||||
|
env/
|
||||||
|
ENV/
|
||||||
|
instance/
|
||||||
|
.flaskenv
|
||||||
|
.pytest_cache/
|
||||||
|
.mypy_cache/
|
||||||
|
.ruff_cache/
|
||||||
|
.coverage
|
||||||
|
coverage.xml
|
||||||
|
htmlcov/
|
||||||
|
*.log
|
||||||
|
build/
|
||||||
|
dist/
|
||||||
|
*.egg-info/
|
||||||
# TMP/
|
# TMP/
|
||||||
# about1500.md
|
# about1500.md
|
||||||
*.har
|
*.har
|
||||||
|
|||||||
+10
-13
@@ -16,6 +16,9 @@
|
|||||||
(для этого короткий `README.md` внутри модуля).
|
(для этого короткий `README.md` внутри модуля).
|
||||||
4. **НЕ поломать текущий рабочий код drhider** — это рефакторинг 1:1 (extract, не rewrite).
|
4. **НЕ поломать текущий рабочий код drhider** — это рефакторинг 1:1 (extract, не rewrite).
|
||||||
5. **Файлы мелкие** — каждая функция в отдельном файле.
|
5. **Файлы мелкие** — каждая функция в отдельном файле.
|
||||||
|
6. **Vanilla JS, без React/сборщика**. ZIP раскрытие — на **`fflate`** (вместо ручного парсера):
|
||||||
|
проще и надёжнее (`unzip` + `filter` по расширению до распаковки). Дерево файлов
|
||||||
|
(сворачивание по папкам/архивам) — отдельный план `PLAN-file-picker.md`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -63,12 +66,8 @@ upload/
|
|||||||
config.example.json # слой 0: образец конфига
|
config.example.json # слой 0: образец конфига
|
||||||
|
|
||||||
frontend/
|
frontend/
|
||||||
zip/ # распаковка ZIP (чистые функции, без DOM)
|
zip/ # распаковка ZIP (чистые функции, без DOM) — на базе fflate
|
||||||
dos_to_ms.js # dosToMs(date, time)
|
list_zip_files.js # listZipFiles(file, allowedExt) — fflate.unzip + filter + рекурсия
|
||||||
decode_zip_name.js # decodeZipName(bytes, isUtf8)
|
|
||||||
inflate_raw.js # inflateRaw(bytes)
|
|
||||||
parse_zip.js # parseZip(buf)
|
|
||||||
list_zip_files.js # listZipFiles(file) — рекурсия по вложенным zip
|
|
||||||
|
|
||||||
table/ # слой 1: выбор файлов
|
table/ # слой 1: выбор файлов
|
||||||
fs.js # fs(b) — формат размера
|
fs.js # fs(b) — формат размера
|
||||||
@@ -124,11 +123,7 @@ upload/
|
|||||||
|
|
||||||
| Функция в drhider | → файл модуля | Что меняется при переносе |
|
| Функция в drhider | → файл модуля | Что меняется при переносе |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `dosToMs` | `zip/dos_to_ms.js` | ничего (чистая) |
|
| `listZipFiles` (+ вложенные `parseZip`/`inflateRaw`/`decodeZipName`/`dosToMs`) | `zip/list_zip_files.js` | **заменяется на `fflate`** (`unzip` + `filter` по `allowedExt` + рекурсия по вложенным zip); ручной парсер НЕ переносим |
|
||||||
| `decodeZipName` | `zip/decode_zip_name.js` | ничего |
|
|
||||||
| `inflateRaw` | `zip/inflate_raw.js` | ничего |
|
|
||||||
| `parseZip` | `zip/parse_zip.js` | ничего |
|
|
||||||
| `listZipFiles` | `zip/list_zip_files.js` | `allowedExt` → параметр (сейчас захардкожен внутри) |
|
|
||||||
| `fs` | `table/fs.js` | ничего |
|
| `fs` | `table/fs.js` | ничего |
|
||||||
| `fmtSec` | `table/fmt_sec.js` | ничего |
|
| `fmtSec` | `table/fmt_sec.js` | ничего |
|
||||||
| `esc` | `table/esc.js` | ничего |
|
| `esc` | `table/esc.js` | ничего |
|
||||||
@@ -234,8 +229,9 @@ POST /api/upload_refs {session?, files:[{name,size,url}]}
|
|||||||
|
|
||||||
Строго последовательно, чтобы не сломать прод:
|
Строго последовательно, чтобы не сломать прод:
|
||||||
|
|
||||||
1. **`zip/*`** — вынести 5 чистых функций, написать юнит-тест (кириллица, вложенный zip,
|
1. **`zip/*`** — подключить `fflate` (CDN) и написать `listZipFiles(file, allowedExt)` на
|
||||||
не-doc расширения). Самый изолированный кусок — безопасен.
|
`fflate.unzip` с `filter` (не распаковывать не-doc) + рекурсия по вложенным zip.
|
||||||
|
Юнит-тест: кириллица, вложенный zip, не-doc расширения.
|
||||||
2. **`table/*`** (слой 1) — вынести функции таблицы/выбора, состояние `sf`/`fileMeta`/`overNames`
|
2. **`table/*`** (слой 1) — вынести функции таблицы/выбора, состояние `sf`/`fileMeta`/`overNames`
|
||||||
увести внутрь `init_upload_table.js`.
|
увести внутрь `init_upload_table.js`.
|
||||||
3. **`upload/*`** (слой 2 фронт) — PUT + `upload_refs`, параметризовать `vmUploadUrl`.
|
3. **`upload/*`** (слой 2 фронт) — PUT + `upload_refs`, параметризовать `vmUploadUrl`.
|
||||||
@@ -270,6 +266,7 @@ POST /api/upload_refs {session?, files:[{name,size,url}]}
|
|||||||
импортировать `session` (create/add/get).
|
импортировать `session` (create/add/get).
|
||||||
4. **Какой конфиг задать** — один блок `config.example.json` с пояснением каждого поля.
|
4. **Какой конфиг задать** — один блок `config.example.json` с пояснением каждого поля.
|
||||||
5. **Что НЕ трогать** — слой 3 (логика приложения у каждого своя).
|
5. **Что НЕ трогать** — слой 3 (логика приложения у каждого своя).
|
||||||
|
6. **Дерево файлов** (сворачивание по папкам/архивам) — см. `PLAN-file-picker.md` (слой 1, vanilla + fflate).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Submodule
+1
Submodule upload-platform added at 09016b22e8
Reference in New Issue
Block a user