pure-md5 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -24
- package/dist/adapters/ie11.cjs +1 -2
- package/dist/adapters/ie11.js +1 -2
- package/dist/adapters/node.cjs +1 -2
- package/dist/adapters/node.js +1 -2
- package/dist/adapters/webcrypto.cjs +1 -2
- package/dist/adapters/webcrypto.js +1 -2
- package/dist/index.cjs +1 -2
- package/dist/index.d.ts +149 -5
- package/dist/index.js +3 -2
- package/dist/md5.cjs +1 -0
- package/dist/md5.d.ts +20 -0
- package/dist/md5.js +1 -0
- package/dist/stream/md5-stream.cjs +1 -2
- package/dist/stream/md5-stream.js +1 -2
- package/dist/stream/whatwg-stream.cjs +1 -2
- package/dist/stream/whatwg-stream.js +1 -2
- package/dist/utils/detect.cjs +1 -2
- package/dist/utils/detect.js +3 -2
- package/package.json +10 -15
- package/pure-md5-0.2.1.tgz +0 -0
- package/test-tree-shake.mjs +12 -0
- package/.aliases +0 -19
- package/.bash_profile +0 -12
- package/.bash_prompt +0 -56
- package/.changeset/README.md +0 -32
- package/.changeset/config.json +0 -16
- package/.continue/mcpServers/new-mcp-server.yaml +0 -10
- package/.continue/rules +0 -29
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -35
- package/.github/ISSUE_TEMPLATE/documentation.md +0 -20
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -35
- package/.github/workflows/npm-publish.yml +0 -33
- package/.github/workflows/release.yml +0 -42
- package/CHANGELOG.md +0 -9
- package/CONTRIBUTING.md +0 -203
- package/MIGRATION_GUIDE_STREAMS.md +0 -374
- package/STREAM_API.md +0 -582
- package/STREAM_BENCHMARKS.md +0 -232
- package/STREAM_EXAMPLES.md +0 -669
- package/STREAM_OPTIMIZATION_REPORT.md +0 -136
- package/STREAM_TROUBLESHOOTING.md +0 -537
- package/WEB_CRYPTO_TESTS_SUMMARY.md +0 -140
- package/WHATWG_STREAMS.md +0 -191
- package/__tests__/adapters/node-crypto.test.ts +0 -167
- package/__tests__/adapters/web-crypto-node.test.ts +0 -73
- package/__tests__/adapters/web-crypto.test.ts +0 -195
- package/__tests__/add32.test.ts +0 -33
- package/__tests__/fallback.test.ts +0 -345
- package/__tests__/hex.test.ts +0 -38
- package/__tests__/hex_chr.test.ts +0 -20
- package/__tests__/index.test.ts +0 -87
- package/__tests__/integration/fixtures/test-file.txt +0 -1
- package/__tests__/integration/md5-stream-file.test.ts +0 -293
- package/__tests__/integration/node-crypto-file.test.ts +0 -86
- package/__tests__/integration/web-crypto.test.ts +0 -38
- package/__tests__/md51.test.ts +0 -73
- package/__tests__/md5block.test.ts +0 -61
- package/__tests__/md5cycle.test.ts +0 -48
- package/__tests__/round-functions.test.ts +0 -87
- package/__tests__/stream/fs-utils.test.ts +0 -209
- package/__tests__/stream/md5-stream-edge-cases.test.ts +0 -461
- package/__tests__/stream/md5-stream.test.ts +0 -418
- package/__tests__/stream/whatwg-stream.test.ts +0 -355
- package/__tests__/stream/whatwg-stream.test.ts.bak2 +0 -335
- package/benchmarks/md5-stream.bench.ts +0 -212
- package/benchmarks/whatwg-stream.bench.ts +0 -180
- package/dist/adapters/ie11.cjs.map +0 -1
- package/dist/adapters/ie11.js.map +0 -1
- package/dist/adapters/node.cjs.map +0 -1
- package/dist/adapters/node.js.map +0 -1
- package/dist/adapters/webcrypto.cjs.map +0 -1
- package/dist/adapters/webcrypto.js.map +0 -1
- package/dist/chunk-2YXXFGBV.js +0 -2
- package/dist/chunk-2YXXFGBV.js.map +0 -1
- package/dist/chunk-4KSCMS4Q.js +0 -2
- package/dist/chunk-4KSCMS4Q.js.map +0 -1
- package/dist/chunk-6P2QV5SR.js +0 -4
- package/dist/chunk-6P2QV5SR.js.map +0 -1
- package/dist/chunk-G5WHEAIQ.js +0 -2
- package/dist/chunk-G5WHEAIQ.js.map +0 -1
- package/dist/chunk-H2K353LR.js +0 -2
- package/dist/chunk-H2K353LR.js.map +0 -1
- package/dist/chunk-JKVD5LHZ.js +0 -2
- package/dist/chunk-JKVD5LHZ.js.map +0 -1
- package/dist/chunk-NWQ4N5RX.js +0 -2
- package/dist/chunk-NWQ4N5RX.js.map +0 -1
- package/dist/chunk-PHZ7FTYF.js +0 -2
- package/dist/chunk-PHZ7FTYF.js.map +0 -1
- package/dist/chunk-PNZTVQA7.js +0 -2
- package/dist/chunk-PNZTVQA7.js.map +0 -1
- package/dist/chunk-R4JB5MBR.js +0 -2
- package/dist/chunk-R4JB5MBR.js.map +0 -1
- package/dist/chunk-VFOAY6XI.js +0 -2
- package/dist/chunk-VFOAY6XI.js.map +0 -1
- package/dist/chunk-XB5BQIEX.js +0 -2
- package/dist/chunk-XB5BQIEX.js.map +0 -1
- package/dist/core/index.cjs +0 -2
- package/dist/core/index.cjs.map +0 -1
- package/dist/core/index.d.cts +0 -19
- package/dist/core/index.d.ts +0 -19
- package/dist/core/index.js +0 -2
- package/dist/core/index.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -84
- package/dist/index.js.map +0 -1
- package/dist/stream/adapter.cjs +0 -2
- package/dist/stream/adapter.cjs.map +0 -1
- package/dist/stream/adapter.d.cts +0 -63
- package/dist/stream/adapter.d.ts +0 -63
- package/dist/stream/adapter.js +0 -2
- package/dist/stream/adapter.js.map +0 -1
- package/dist/stream/fs-utils.cjs +0 -2
- package/dist/stream/fs-utils.cjs.map +0 -1
- package/dist/stream/fs-utils.d.cts +0 -137
- package/dist/stream/fs-utils.d.ts +0 -137
- package/dist/stream/fs-utils.js +0 -2
- package/dist/stream/fs-utils.js.map +0 -1
- package/dist/stream/index.cjs +0 -2
- package/dist/stream/index.cjs.map +0 -1
- package/dist/stream/index.d.cts +0 -4
- package/dist/stream/index.d.ts +0 -4
- package/dist/stream/index.js +0 -2
- package/dist/stream/index.js.map +0 -1
- package/dist/stream/light/index.cjs +0 -2
- package/dist/stream/light/index.cjs.map +0 -1
- package/dist/stream/light/index.d.cts +0 -4
- package/dist/stream/light/index.d.ts +0 -4
- package/dist/stream/light/index.js +0 -2
- package/dist/stream/light/index.js.map +0 -1
- package/dist/stream/md5-stream.cjs.map +0 -1
- package/dist/stream/md5-stream.js.map +0 -1
- package/dist/stream/whatwg-stream.cjs.map +0 -1
- package/dist/stream/whatwg-stream.js.map +0 -1
- package/dist/types-edGoGJ5V.d.cts +0 -42
- package/dist/types-edGoGJ5V.d.ts +0 -42
- package/dist/utils/detect.cjs.map +0 -1
- package/dist/utils/detect.js.map +0 -1
- package/planning/03-optimization-size-tree-shaking/01-es-modules-tree-shaking.md +0 -152
- package/planning/03-optimization-size-tree-shaking/02-consolidate-modules.md +0 -65
- package/planning/03-optimization-size-tree-shaking/03-remove-duplicate-add32.md +0 -93
- package/planning/03-optimization-size-tree-shaking/04-remove-runtime-check.md +0 -102
- package/planning/03-optimization-size-tree-shaking/05-optimize-loops-performance.md +0 -107
- package/planning/03-optimization-size-tree-shaking/06-tsup-formats-configuration.md +0 -227
- package/planning/03-optimization-size-tree-shaking/07-multiple-build-formats.md +0 -228
- package/planning/03-optimization-size-tree-shaking/08-benchmarks-metrics.md +0 -34
- package/planning/03-optimization-size-tree-shaking/MIGRATION_GUIDE.md +0 -260
- package/planning/03-optimization-size-tree-shaking/README.md +0 -173
- package/planning/03-optimization-size-tree-shaking/SUMMARY.md +0 -168
- package/planning/04-adapter-backend/03-backend-web-crypto.md +0 -149
- package/planning/04-adapter-backend/04-backend-node-crypto.md +0 -181
- package/planning/04-adapter-backend/05-backend-pure-js.md +0 -174
- package/planning/04-adapter-backend/06-backend-ie11.md +0 -158
- package/planning/04-adapter-backend/07-detection-environment.md +0 -232
- package/planning/04-adapter-backend/08-detection-backend.md +0 -210
- package/planning/04-adapter-backend/09-adapter-unified.md +0 -255
- package/planning/04-adapter-backend/10-fallback-mechanism.md +0 -333
- package/planning/04-adapter-backend/11-tests-backend-web-crypto.md +0 -191
- package/planning/04-adapter-backend/12-tests-backend-node-crypto.md +0 -222
- package/planning/04-adapter-backend/README.md +0 -45
- package/planning/05-documentation-publishing/01-README-optimization.md +0 -105
- package/planning/05-documentation-publishing/02-VitePress-site-evaluation.md +0 -136
- package/planning/05-documentation-publishing/03-Changeset-setup.md +0 -192
- package/planning/05-documentation-publishing/04-GitHub-templates.md +0 -252
- package/planning/05-documentation-publishing/README.md +0 -22
- package/planning/05-documentation-publishing/STATUS.md +0 -222
- package/planning/prd.md +0 -405
- package/planning/streams/01-create-md5stream-class.md +0 -69
- package/planning/streams/02-create-factory-api.md +0 -65
- package/planning/streams/03-fs-integration.md +0 -37
- package/planning/streams/04-whatwg-streams-support.md +0 -37
- package/planning/streams/05-audit-optimization.md +0 -121
- package/planning/streams/06-comprehensive-tests-docs.md +0 -137
- package/planning/streams/07-architecture-integration.md +0 -38
- package/planning/streams/README.md +0 -98
- package/tsup.config.ts +0 -24
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
# Задача 3: Устранение дублирования кода (add32)
|
|
2
|
-
|
|
3
|
-
## Контекст
|
|
4
|
-
Функция `add32` определена в двух местах:
|
|
5
|
-
1. В `src/add32.ts` как основная реализация
|
|
6
|
-
2. В `src/index.ts` как inline функция для runtime проверки
|
|
7
|
-
|
|
8
|
-
Дублирование увеличивает размер бандла и усложняет поддержку.
|
|
9
|
-
|
|
10
|
-
## Цель
|
|
11
|
-
Удалить дублирование, оставив единую реализацию `add32` в `add32.ts`.
|
|
12
|
-
|
|
13
|
-
## Требуемые действия
|
|
14
|
-
|
|
15
|
-
### Шаг 1: Проанализировать текущее использование
|
|
16
|
-
1. Открыть `src/index.ts` и найти inline определение `add32`
|
|
17
|
-
2. Открыть `src/add32.ts` и посмотреть текущую реализацию
|
|
18
|
-
3. Проверить где еще используется `add32` в проекте
|
|
19
|
-
|
|
20
|
-
### Шаг 2: Удалить inline определение из index.ts
|
|
21
|
-
1. Открыть `src/index.ts`
|
|
22
|
-
2. Удалить блок кода с inline определением `add32`:
|
|
23
|
-
```typescript
|
|
24
|
-
fn = function add32(x, y) {
|
|
25
|
-
let lsw = (x & 0xffff) + (y & 0xffff);
|
|
26
|
-
let msw = (x >> 16) + (y >> 16) + (lsw >> 16);
|
|
27
|
-
return (msw << 16) | (lsw & 0xffff);
|
|
28
|
-
};
|
|
29
|
-
```
|
|
30
|
-
3. Убедиться что импорт `add32` из `./add32` используется правильно
|
|
31
|
-
|
|
32
|
-
### Шаг 3: Обновить импорт в index.ts
|
|
33
|
-
1. Добавить импорт `add32` в `src/index.ts`:
|
|
34
|
-
```typescript
|
|
35
|
-
import hex from './hex';
|
|
36
|
-
import md51 from './md51';
|
|
37
|
-
import add32 from './add32'; // Добавить этот импорт
|
|
38
|
-
```
|
|
39
|
-
2. Обновить логику проверки чтобы использовать импортированную `add32`
|
|
40
|
-
|
|
41
|
-
### Шаг 4: Оптимизировать реализацию add32
|
|
42
|
-
1. Открыть `src/add32.ts`
|
|
43
|
-
2. Сравнить две реализации (из add32.ts и из index.ts)
|
|
44
|
-
3. Выбрать более оптимальную реализацию или объединить лучшие части
|
|
45
|
-
4. Убедиться что реализация корректно работает с 32-битными числами
|
|
46
|
-
|
|
47
|
-
**Текущая реализация в add32.ts:**
|
|
48
|
-
```typescript
|
|
49
|
-
function add32(x: number, y: number): number {
|
|
50
|
-
return (x + y) & 0xffffffff;
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
**Inline реализация из index.ts:**
|
|
55
|
-
```typescript
|
|
56
|
-
function add32(x, y) {
|
|
57
|
-
let lsw = (x & 0xffff) + (y & 0xffff);
|
|
58
|
-
let msw = (x >> 16) + (y >> 16) + (lsw >> 16);
|
|
59
|
-
return (msw << 16) | (lsw & 0xffff);
|
|
60
|
-
}
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### Шаг 5: Проверить корректность
|
|
64
|
-
1. Создать простой тест для `add32`
|
|
65
|
-
2. Проверить что функция корректно работает с большими числами
|
|
66
|
-
3. Убедиться что не происходит переполнения
|
|
67
|
-
|
|
68
|
-
### Шаг 6: Обновить зависимости
|
|
69
|
-
1. Проверить все файлы которые импортируют `add32`
|
|
70
|
-
2. Убедиться что импорты корректны
|
|
71
|
-
3. Запустить тесты чтобы проверить корректность
|
|
72
|
-
|
|
73
|
-
## Ожидаемый результат
|
|
74
|
-
- Единая реализация `add32` в `add32.ts`
|
|
75
|
-
- Удалено дублирование из `index.ts`
|
|
76
|
-
- Функциональность сохранена
|
|
77
|
-
- Размер бандла уменьшен
|
|
78
|
-
|
|
79
|
-
## Проверка прогресса
|
|
80
|
-
- [ ] Inline определение удалено из index.ts
|
|
81
|
-
- [ ] Добавлен импорт add32 в index.ts
|
|
82
|
-
- [ ] Реализация add32 оптимизирована (если нужно)
|
|
83
|
-
- [ ] Все импорты add32 обновлены
|
|
84
|
-
- [ ] Тесты проходят
|
|
85
|
-
- [ ] Сборка работает
|
|
86
|
-
|
|
87
|
-
## Примечания
|
|
88
|
-
1. Внимательно проверить работу с отрицательными числами
|
|
89
|
-
2. Убедиться что оптимизация не ломает логику MD5
|
|
90
|
-
3. Проверить производительность обеих реализаций
|
|
91
|
-
|
|
92
|
-
## Следующий шаг
|
|
93
|
-
После устранения дублирования перейти к Задаче 4: Вынос runtime проверки в compile-time.
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
# Задача 4: Вынос runtime проверки в compile-time
|
|
2
|
-
|
|
3
|
-
## Контекст
|
|
4
|
-
В `src/index.ts` есть runtime проверка корректности MD5:
|
|
5
|
-
```typescript
|
|
6
|
-
const check = hex(md51('hello'));
|
|
7
|
-
if (check !== '5d41402abc4b2a76b9719d911017c592') {
|
|
8
|
-
// Определение add32 inline
|
|
9
|
-
}
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
Эта проверка:
|
|
13
|
-
1. Увеличивает размер бандла
|
|
14
|
-
2. Выполняется при каждом импорте библиотеки
|
|
15
|
-
3. Может быть вынесена в compile-time или тесты
|
|
16
|
-
|
|
17
|
-
## Цель
|
|
18
|
-
Убрать runtime проверку из основного кода, переместив её в тесты или compile-time проверки.
|
|
19
|
-
|
|
20
|
-
## Требуемые действия
|
|
21
|
-
|
|
22
|
-
### Шаг 1: Проанализировать текущую логику
|
|
23
|
-
1. Открыть `src/index.ts`
|
|
24
|
-
2. Понять полную логику проверки:
|
|
25
|
-
- Проверяет что MD5('hello') дает правильный хеш
|
|
26
|
-
- Если нет - определяет inline add32 с другой реализацией
|
|
27
|
-
- Это fallback для некорректной реализации add32
|
|
28
|
-
|
|
29
|
-
### Шаг 2: Создать тест для проверки корректности
|
|
30
|
-
1. Открыть существующие тесты (`src/*.test.ts`)
|
|
31
|
-
2. Добавить тест для проверки MD5('hello')
|
|
32
|
-
3. Убедиться что тест покрывает тот же случай что и runtime проверка
|
|
33
|
-
|
|
34
|
-
**Пример теста:**
|
|
35
|
-
```typescript
|
|
36
|
-
test('MD5 should produce correct hash for "hello"', () => {
|
|
37
|
-
expect(md5('hello')).toBe('5d41402abc4b2a76b9719d911017c592');
|
|
38
|
-
});
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Шаг 3: Удалить runtime проверку из index.ts
|
|
42
|
-
1. Удалить весь блок с проверкой из `src/index.ts`:
|
|
43
|
-
```typescript
|
|
44
|
-
let fn;
|
|
45
|
-
const check = hex(md51('hello'));
|
|
46
|
-
if (check !== '5d41402abc4b2a76b9719d911017c592') {
|
|
47
|
-
fn = function add32(x, y) {
|
|
48
|
-
let lsw = (x & 0xffff) + (y & 0xffff);
|
|
49
|
-
let msw = (x >> 16) + (y >> 16) + (lsw >> 16);
|
|
50
|
-
return (msw << 16) | (lsw & 0xffff);
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
2. Упростить функцию `md5`:
|
|
55
|
-
```typescript
|
|
56
|
-
function md5(string: string): string {
|
|
57
|
-
return hex(md51(string));
|
|
58
|
-
}
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
### Шаг 4: Обеспечить корректность add32
|
|
62
|
-
1. Убедиться что `add32.ts` содержит корректную реализацию
|
|
63
|
-
2. Проверить что все тесты проходят с текущей реализацией add32
|
|
64
|
-
3. Если нужно, обновить реализацию add32 для корректности
|
|
65
|
-
|
|
66
|
-
### Шаг 5: Добавить compile-time проверку (опционально)
|
|
67
|
-
1. Рассмотреть добавление TypeScript assertion
|
|
68
|
-
2. Или добавить проверку в процесс сборки
|
|
69
|
-
3. Или использовать константы которые проверяются TypeScript
|
|
70
|
-
|
|
71
|
-
### Шаг 6: Проверить сборку и тесты
|
|
72
|
-
1. Запустить `npm run build`
|
|
73
|
-
2. Проверить что сборка проходит без ошибок
|
|
74
|
-
3. Запустить `npm test`
|
|
75
|
-
4. Убедиться что все тесты проходят, включая новый тест
|
|
76
|
-
|
|
77
|
-
## Ожидаемый результат
|
|
78
|
-
- Runtime проверка удалена из основного кода
|
|
79
|
-
- Функциональность проверена через тесты
|
|
80
|
-
- Размер бандла уменьшен
|
|
81
|
-
- Производительность улучшена (нет лишних проверок)
|
|
82
|
-
|
|
83
|
-
## Проверка прогресса
|
|
84
|
-
- [ ] Создан тест для MD5('hello')
|
|
85
|
-
- [ ] Runtime проверка удалена из index.ts
|
|
86
|
-
- [ ] Функция md5 упрощена
|
|
87
|
-
- [ ] Реализация add32 проверена на корректность
|
|
88
|
-
- [ ] Сборка проходит без ошибок
|
|
89
|
-
- [ ] Все тесты проходят
|
|
90
|
-
- [ ] Размер бандла уменьшился
|
|
91
|
-
|
|
92
|
-
## Примечания
|
|
93
|
-
1. Убедиться что удаление проверки не ломает логику
|
|
94
|
-
2. Проверить что add32 работает корректно во всех случаях
|
|
95
|
-
3. Рассмотреть добавление дополнительных тестов для edge cases
|
|
96
|
-
|
|
97
|
-
## Риски
|
|
98
|
-
1. Если реализация add32 некорректна, тесты могут не выявить этого
|
|
99
|
-
2. Нужно убедиться что все use cases покрыты тестами
|
|
100
|
-
|
|
101
|
-
## Следующий шаг
|
|
102
|
-
После удаления runtime проверки перейти к Задаче 5: Оптимизация циклов и операций.
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
# Задача 5: Оптимизация циклов и операций
|
|
2
|
-
|
|
3
|
-
## Контекст
|
|
4
|
-
Критические участки кода в MD5 реализации могут быть оптимизированы для улучшения производительности. Основные кандидаты:
|
|
5
|
-
1. Циклы в `md51.ts`
|
|
6
|
-
2. Битовые операции в `add32.ts`
|
|
7
|
-
3. Операции со строками в `md5blk.ts`
|
|
8
|
-
|
|
9
|
-
## Цель
|
|
10
|
-
Улучшить производительность MD5 реализации на 10-20% через оптимизацию циклов и операций.
|
|
11
|
-
|
|
12
|
-
## Требуемые действия
|
|
13
|
-
|
|
14
|
-
### Шаг 1: Анализ текущей производительности
|
|
15
|
-
1. Создать простой бенчмарк для измерения производительности
|
|
16
|
-
2. Измерить текущую скорость MD5 хеширования
|
|
17
|
-
3. Определить bottleneck'ы через профилирование
|
|
18
|
-
|
|
19
|
-
**Пример бенчмарка:**
|
|
20
|
-
```typescript
|
|
21
|
-
// benchmark.ts
|
|
22
|
-
import { md5 } from './index';
|
|
23
|
-
|
|
24
|
-
const start = performance.now();
|
|
25
|
-
for (let i = 0; i < 10000; i++) {
|
|
26
|
-
md5('test string ' + i);
|
|
27
|
-
}
|
|
28
|
-
const end = performance.now();
|
|
29
|
-
console.log(`Time: ${end - start}ms`);
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### Шаг 2: Оптимизация md51.ts
|
|
33
|
-
1. Открыть `src/md51.ts`
|
|
34
|
-
2. Оптимизировать циклы:
|
|
35
|
-
- Использовать `while` вместо `for` где это уместно
|
|
36
|
-
- Предвычислять константы
|
|
37
|
-
- Уменьшить количество операций в цикле
|
|
38
|
-
3. Оптимизировать работу со строками:
|
|
39
|
-
- Использовать `charCodeAt` более эффективно
|
|
40
|
-
- Рассмотреть использование `Uint8Array` для бинарных данных
|
|
41
|
-
|
|
42
|
-
### Шаг 3: Оптимизация add32.ts
|
|
43
|
-
1. Открыть `src/add32.ts`
|
|
44
|
-
2. Сравнить производительность разных реализаций:
|
|
45
|
-
```typescript
|
|
46
|
-
// Вариант 1: текущий
|
|
47
|
-
return (x + y) & 0xffffffff;
|
|
48
|
-
|
|
49
|
-
// Вариант 2: inline из index.ts
|
|
50
|
-
let lsw = (x & 0xffff) + (y & 0xffff);
|
|
51
|
-
let msw = (x >> 16) + (y >> 16) + (lsw >> 16);
|
|
52
|
-
return (msw << 16) | (lsw & 0xffff);
|
|
53
|
-
```
|
|
54
|
-
3. Выбрать наиболее производительную реализацию
|
|
55
|
-
4. Добавить комментарии о выборе реализации
|
|
56
|
-
|
|
57
|
-
### Шаг 4: Оптимизация md5cycle.ts
|
|
58
|
-
1. Открыть `src/md5cycle.ts`
|
|
59
|
-
2. Оптимизировать вызовы функций:
|
|
60
|
-
- Рассмотреть инлайнинг small функций
|
|
61
|
-
- Уменьшить количество `.bind()` вызовов
|
|
62
|
-
- Предвычислять константы
|
|
63
|
-
3. Оптимизировать доступ к массивам
|
|
64
|
-
|
|
65
|
-
### Шаг 5: Оптимизация работы с памятью
|
|
66
|
-
1. Рассмотреть использование typed arrays вместо обычных массивов
|
|
67
|
-
2. Уменьшить аллокации памяти в циклах
|
|
68
|
-
3. Переиспользовать буферы где это возможно
|
|
69
|
-
|
|
70
|
-
### Шаг 6: Проверить корректность после оптимизаций
|
|
71
|
-
1. Запустить все тесты: `npm test`
|
|
72
|
-
2. Проверить что оптимизации не ломают логику
|
|
73
|
-
3. Запустить бенчмарк для измерения улучшений
|
|
74
|
-
|
|
75
|
-
### Шаг 7: Добавить перфоманс тесты
|
|
76
|
-
1. Создать тесты производительности в `src/*.perf.test.ts`
|
|
77
|
-
2. Добавить baseline измерения
|
|
78
|
-
3. Установить пороги для регрессий
|
|
79
|
-
|
|
80
|
-
## Ожидаемый результат
|
|
81
|
-
- Улучшение производительности на 10-20%
|
|
82
|
-
- Сохранение корректности MD5 алгоритма
|
|
83
|
-
- Все тесты проходят
|
|
84
|
-
- Добавлены перфоманс тесты
|
|
85
|
-
|
|
86
|
-
## Проверка прогресса
|
|
87
|
-
- [ ] Создан бенчмарк для измерения производительности
|
|
88
|
-
- [ ] Оптимизированы циклы в md51.ts
|
|
89
|
-
- [ ] Оптимизирована реализация add32.ts
|
|
90
|
-
- [ ] Оптимизирован md5cycle.ts
|
|
91
|
-
- [ ] Проверена работа с памятью
|
|
92
|
-
- [ ] Все тесты проходят
|
|
93
|
-
- [ ] Измерено улучшение производительности
|
|
94
|
-
- [ ] Добавлены перфоманс тесты
|
|
95
|
-
|
|
96
|
-
## Примечания
|
|
97
|
-
1. Оптимизации не должны ломать корректность алгоритма
|
|
98
|
-
2. Сохранять читаемость кода
|
|
99
|
-
3. Документировать причины выбора оптимизаций
|
|
100
|
-
|
|
101
|
-
## Метрики
|
|
102
|
-
1. Время хеширования 10к строк (до/после)
|
|
103
|
-
2. Размер бандла (не должен увеличиться)
|
|
104
|
-
3. Потребление памяти
|
|
105
|
-
|
|
106
|
-
## Следующий шаг
|
|
107
|
-
После оптимизации производительности перейти к Задаче 6: Настройка Webpack для минимального бандла.
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
# Задача 6: Настройка tsup для разных форматов
|
|
2
|
-
|
|
3
|
-
## Контекст
|
|
4
|
-
После успешной миграции на tsup (Задача 1) необходимо настроить создание разных сборок для различных use cases. Tsup поддерживает генерацию множественных форматов из коробки.
|
|
5
|
-
|
|
6
|
-
## Цель
|
|
7
|
-
Настроить tsup для создания оптимизированных сборок:
|
|
8
|
-
1. CommonJS для Node.js и старых бандлеров
|
|
9
|
-
2. ES модули для современных бандлеров (Webpack 5+, Vite, Rollup)
|
|
10
|
-
3. UMD/IIFE для использования в браузере через script tag
|
|
11
|
-
4. Минимальная сборка с агрессивной оптимизацией для production
|
|
12
|
-
|
|
13
|
-
## Требуемые действия
|
|
14
|
-
|
|
15
|
-
### Шаг 1: Создать основную конфигурацию tsup
|
|
16
|
-
1. Обновить `tsup.config.ts` для поддержки всех форматов:
|
|
17
|
-
```typescript
|
|
18
|
-
import { defineConfig } from 'tsup';
|
|
19
|
-
|
|
20
|
-
export default defineConfig({
|
|
21
|
-
entry: ['src/index.ts'],
|
|
22
|
-
format: ['cjs', 'esm'], // CommonJS и ES модули
|
|
23
|
-
dts: true, // Генерация .d.ts файлов
|
|
24
|
-
sourcemap: true, // Source maps для отладки
|
|
25
|
-
clean: true, // Очистка output директории
|
|
26
|
-
minify: false, // Минификация отключена для dev
|
|
27
|
-
treeshake: true, // Включить tree-shaking
|
|
28
|
-
splitting: false, // Для библиотек обычно false
|
|
29
|
-
bundle: true, // Bundle все зависимости
|
|
30
|
-
outDir: 'dist', // Output директория
|
|
31
|
-
target: 'es2020', // Современный target
|
|
32
|
-
});
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### Шаг 2: Создать production конфигурацию
|
|
36
|
-
1. Создать `tsup.config.prod.ts`:
|
|
37
|
-
```typescript
|
|
38
|
-
import { defineConfig } from 'tsup';
|
|
39
|
-
|
|
40
|
-
export default defineConfig({
|
|
41
|
-
entry: ['src/index.ts'],
|
|
42
|
-
format: ['cjs', 'esm'],
|
|
43
|
-
dts: true,
|
|
44
|
-
sourcemap: false, // Без source maps в production
|
|
45
|
-
clean: true,
|
|
46
|
-
minify: true, // Включить минификацию
|
|
47
|
-
minifyWhitespace: true,
|
|
48
|
-
minifyIdentifiers: true,
|
|
49
|
-
minifySyntax: true,
|
|
50
|
-
treeshake: true,
|
|
51
|
-
splitting: false,
|
|
52
|
-
bundle: true,
|
|
53
|
-
outDir: 'dist',
|
|
54
|
-
target: 'es2020',
|
|
55
|
-
});
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### Шаг 3: Создать UMD конфигурацию для браузера
|
|
59
|
-
1. Создать `tsup.config.umd.ts`:
|
|
60
|
-
```typescript
|
|
61
|
-
import { defineConfig } from 'tsup';
|
|
62
|
-
|
|
63
|
-
export default defineConfig({
|
|
64
|
-
entry: ['src/index.ts'],
|
|
65
|
-
format: ['iife'], // IIFE формат для браузера
|
|
66
|
-
globalName: 'pureMD5', // Глобальная переменная
|
|
67
|
-
dts: false, // .d.ts не нужны для браузера
|
|
68
|
-
sourcemap: true,
|
|
69
|
-
clean: true,
|
|
70
|
-
minify: true,
|
|
71
|
-
treeshake: true,
|
|
72
|
-
splitting: false,
|
|
73
|
-
bundle: true,
|
|
74
|
-
outDir: 'dist',
|
|
75
|
-
target: 'es2020',
|
|
76
|
-
platform: 'browser', // Платформа браузера
|
|
77
|
-
outExtension: () => ({ js: '.browser.js' }), // Другое расширение
|
|
78
|
-
});
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
### Шаг 4: Создать минимальную конфигурацию
|
|
82
|
-
1. Создать `tsup.config.min.ts`:
|
|
83
|
-
```typescript
|
|
84
|
-
import { defineConfig } from 'tsup';
|
|
85
|
-
|
|
86
|
-
export default defineConfig({
|
|
87
|
-
entry: ['src/index.ts'],
|
|
88
|
-
format: ['esm'], // Только ES модули для минимального размера
|
|
89
|
-
dts: false, // Без типов
|
|
90
|
-
sourcemap: false, // Без source maps
|
|
91
|
-
clean: true,
|
|
92
|
-
minify: true,
|
|
93
|
-
minifyWhitespace: true,
|
|
94
|
-
minifyIdentifiers: true,
|
|
95
|
-
minifySyntax: true,
|
|
96
|
-
treeshake: true,
|
|
97
|
-
pure: ['console.log', 'console.debug'], // Удалить console вызовы
|
|
98
|
-
splitting: false,
|
|
99
|
-
bundle: true,
|
|
100
|
-
outDir: 'dist',
|
|
101
|
-
target: 'es2020',
|
|
102
|
-
outExtension: () => ({ js: '.min.js' }), // Расширение .min.js
|
|
103
|
-
});
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
### Шаг 5: Обновить package.json scripts
|
|
107
|
-
1. Обновить скрипты в `package.json`:
|
|
108
|
-
```json
|
|
109
|
-
"scripts": {
|
|
110
|
-
"build": "tsup",
|
|
111
|
-
"build:prod": "tsup --config tsup.config.prod.ts",
|
|
112
|
-
"build:umd": "tsup --config tsup.config.umd.ts",
|
|
113
|
-
"build:min": "tsup --config tsup.config.min.ts",
|
|
114
|
-
"build:all": "npm run build && npm run build:prod && npm run build:umd && npm run build:min",
|
|
115
|
-
"build:watch": "tsup --watch",
|
|
116
|
-
"dev": "tsup --watch"
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
### Шаг 6: Настроить exports в package.json
|
|
121
|
-
1. Обновить поле exports для поддержки разных форматов:
|
|
122
|
-
```json
|
|
123
|
-
"exports": {
|
|
124
|
-
".": {
|
|
125
|
-
"import": "./dist/index.mjs",
|
|
126
|
-
"require": "./dist/index.js",
|
|
127
|
-
"types": "./dist/index.d.ts",
|
|
128
|
-
"default": "./dist/index.js"
|
|
129
|
-
},
|
|
130
|
-
"./browser": {
|
|
131
|
-
"import": "./dist/index.browser.mjs",
|
|
132
|
-
"require": "./dist/index.browser.js",
|
|
133
|
-
"default": "./dist/index.browser.js"
|
|
134
|
-
},
|
|
135
|
-
"./min": {
|
|
136
|
-
"import": "./dist/index.min.mjs",
|
|
137
|
-
"require": "./dist/index.min.js",
|
|
138
|
-
"default": "./dist/index.min.js"
|
|
139
|
-
}
|
|
140
|
-
},
|
|
141
|
-
"main": "./dist/index.js",
|
|
142
|
-
"module": "./dist/index.mjs",
|
|
143
|
-
"browser": "./dist/index.browser.js",
|
|
144
|
-
"types": "./dist/index.d.ts"
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
### Шаг 7: Проверить все сборки
|
|
148
|
-
1. Запустить полную сборку:
|
|
149
|
-
```bash
|
|
150
|
-
npm run build:all
|
|
151
|
-
```
|
|
152
|
-
2. Проверить созданные файлы в `dist/`:
|
|
153
|
-
```bash
|
|
154
|
-
ls -la dist/
|
|
155
|
-
```
|
|
156
|
-
3. Ожидаемые файлы:
|
|
157
|
-
- `index.js` (CommonJS, development)
|
|
158
|
-
- `index.mjs` (ES modules, development)
|
|
159
|
-
- `index.d.ts` (TypeScript declarations)
|
|
160
|
-
- `index.browser.js` (UMD для браузера)
|
|
161
|
-
- `index.min.js` (Минимальная сборка)
|
|
162
|
-
|
|
163
|
-
### Шаг 8: Протестировать каждую сборку
|
|
164
|
-
1. Тестировать CommonJS сборку:
|
|
165
|
-
```bash
|
|
166
|
-
node -e "const { md5 } = require('./dist/index.js'); console.log(md5('test'))"
|
|
167
|
-
```
|
|
168
|
-
2. Тестировать ES modules сборку (если поддерживается):
|
|
169
|
-
```bash
|
|
170
|
-
node --loader ts-node/esm -e "import { md5 } from './dist/index.mjs'; console.log(md5('test'))"
|
|
171
|
-
```
|
|
172
|
-
3. Тестировать UMD сборку в браузере (симуляция):
|
|
173
|
-
```bash
|
|
174
|
-
echo 'console.log(pureMD5.md5("test"))' | node -e "
|
|
175
|
-
const vm = require('vm');
|
|
176
|
-
const fs = require('fs');
|
|
177
|
-
const code = fs.readFileSync('./dist/index.browser.js', 'utf8');
|
|
178
|
-
const context = { console };
|
|
179
|
-
vm.runInNewContext(code, context);
|
|
180
|
-
"
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
### Шаг 9: Настроить анализ бандла
|
|
184
|
-
1. Установить инструменты для анализа:
|
|
185
|
-
```bash
|
|
186
|
-
npm install -D @arethetypeswrong/cli
|
|
187
|
-
```
|
|
188
|
-
2. Добавить скрипт анализа:
|
|
189
|
-
```json
|
|
190
|
-
"scripts": {
|
|
191
|
-
"analyze": "attw --pack .",
|
|
192
|
-
"analyze:size": "node scripts/analyze-size.js"
|
|
193
|
-
}
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
## Ожидаемый результат
|
|
197
|
-
- 4 разные оптимизированные сборки
|
|
198
|
-
- Правильные exports в package.json
|
|
199
|
-
- Минимальная сборка значительно меньше основной
|
|
200
|
-
- Все сборки работают в своих средах
|
|
201
|
-
- Возможность анализа бандла
|
|
202
|
-
|
|
203
|
-
## Проверка прогресса
|
|
204
|
-
- [ ] Основная конфигурация tsup создана
|
|
205
|
-
- [ ] Production конфигурация создана
|
|
206
|
-
- [ ] UMD конфигурация создана
|
|
207
|
-
- [ ] Минимальная конфигурация создана
|
|
208
|
-
- [ ] package.json scripts обновлены
|
|
209
|
-
- [ ] exports в package.json настроены
|
|
210
|
-
- [ ] Все сборки создаются без ошибок
|
|
211
|
-
- [ ] Каждая сборка протестирована
|
|
212
|
-
- [ ] Инструменты анализа установлены
|
|
213
|
-
- [ ] Документированы различия между сборками
|
|
214
|
-
|
|
215
|
-
## Примечания
|
|
216
|
-
1. UMD формат может быть не нужен если библиотека используется только через npm
|
|
217
|
-
2. Минимальная сборка может ломать source maps для отладки
|
|
218
|
-
3. Проверить совместимость с существующими потребителями
|
|
219
|
-
4. Убедиться что tree-shaking работает корректно
|
|
220
|
-
|
|
221
|
-
## Метрики
|
|
222
|
-
1. Размер каждой сборки (raw и gzipped)
|
|
223
|
-
2. Время сборки для каждой конфигурации
|
|
224
|
-
3. Эффективность tree-shaking
|
|
225
|
-
|
|
226
|
-
## Следующий шаг
|
|
227
|
-
После настройки разных форматов перейти к Задаче 7: Анализ бандла и метрики.
|