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.
Files changed (177) hide show
  1. package/README.md +38 -24
  2. package/dist/adapters/ie11.cjs +1 -2
  3. package/dist/adapters/ie11.js +1 -2
  4. package/dist/adapters/node.cjs +1 -2
  5. package/dist/adapters/node.js +1 -2
  6. package/dist/adapters/webcrypto.cjs +1 -2
  7. package/dist/adapters/webcrypto.js +1 -2
  8. package/dist/index.cjs +1 -2
  9. package/dist/index.d.ts +149 -5
  10. package/dist/index.js +3 -2
  11. package/dist/md5.cjs +1 -0
  12. package/dist/md5.d.ts +20 -0
  13. package/dist/md5.js +1 -0
  14. package/dist/stream/md5-stream.cjs +1 -2
  15. package/dist/stream/md5-stream.js +1 -2
  16. package/dist/stream/whatwg-stream.cjs +1 -2
  17. package/dist/stream/whatwg-stream.js +1 -2
  18. package/dist/utils/detect.cjs +1 -2
  19. package/dist/utils/detect.js +3 -2
  20. package/package.json +10 -15
  21. package/pure-md5-0.2.1.tgz +0 -0
  22. package/test-tree-shake.mjs +12 -0
  23. package/.aliases +0 -19
  24. package/.bash_profile +0 -12
  25. package/.bash_prompt +0 -56
  26. package/.changeset/README.md +0 -32
  27. package/.changeset/config.json +0 -16
  28. package/.continue/mcpServers/new-mcp-server.yaml +0 -10
  29. package/.continue/rules +0 -29
  30. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -35
  31. package/.github/ISSUE_TEMPLATE/documentation.md +0 -20
  32. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  33. package/.github/PULL_REQUEST_TEMPLATE.md +0 -35
  34. package/.github/workflows/npm-publish.yml +0 -33
  35. package/.github/workflows/release.yml +0 -42
  36. package/CHANGELOG.md +0 -9
  37. package/CONTRIBUTING.md +0 -203
  38. package/MIGRATION_GUIDE_STREAMS.md +0 -374
  39. package/STREAM_API.md +0 -582
  40. package/STREAM_BENCHMARKS.md +0 -232
  41. package/STREAM_EXAMPLES.md +0 -669
  42. package/STREAM_OPTIMIZATION_REPORT.md +0 -136
  43. package/STREAM_TROUBLESHOOTING.md +0 -537
  44. package/WEB_CRYPTO_TESTS_SUMMARY.md +0 -140
  45. package/WHATWG_STREAMS.md +0 -191
  46. package/__tests__/adapters/node-crypto.test.ts +0 -167
  47. package/__tests__/adapters/web-crypto-node.test.ts +0 -73
  48. package/__tests__/adapters/web-crypto.test.ts +0 -195
  49. package/__tests__/add32.test.ts +0 -33
  50. package/__tests__/fallback.test.ts +0 -345
  51. package/__tests__/hex.test.ts +0 -38
  52. package/__tests__/hex_chr.test.ts +0 -20
  53. package/__tests__/index.test.ts +0 -87
  54. package/__tests__/integration/fixtures/test-file.txt +0 -1
  55. package/__tests__/integration/md5-stream-file.test.ts +0 -293
  56. package/__tests__/integration/node-crypto-file.test.ts +0 -86
  57. package/__tests__/integration/web-crypto.test.ts +0 -38
  58. package/__tests__/md51.test.ts +0 -73
  59. package/__tests__/md5block.test.ts +0 -61
  60. package/__tests__/md5cycle.test.ts +0 -48
  61. package/__tests__/round-functions.test.ts +0 -87
  62. package/__tests__/stream/fs-utils.test.ts +0 -209
  63. package/__tests__/stream/md5-stream-edge-cases.test.ts +0 -461
  64. package/__tests__/stream/md5-stream.test.ts +0 -418
  65. package/__tests__/stream/whatwg-stream.test.ts +0 -355
  66. package/__tests__/stream/whatwg-stream.test.ts.bak2 +0 -335
  67. package/benchmarks/md5-stream.bench.ts +0 -212
  68. package/benchmarks/whatwg-stream.bench.ts +0 -180
  69. package/dist/adapters/ie11.cjs.map +0 -1
  70. package/dist/adapters/ie11.js.map +0 -1
  71. package/dist/adapters/node.cjs.map +0 -1
  72. package/dist/adapters/node.js.map +0 -1
  73. package/dist/adapters/webcrypto.cjs.map +0 -1
  74. package/dist/adapters/webcrypto.js.map +0 -1
  75. package/dist/chunk-2YXXFGBV.js +0 -2
  76. package/dist/chunk-2YXXFGBV.js.map +0 -1
  77. package/dist/chunk-4KSCMS4Q.js +0 -2
  78. package/dist/chunk-4KSCMS4Q.js.map +0 -1
  79. package/dist/chunk-6P2QV5SR.js +0 -4
  80. package/dist/chunk-6P2QV5SR.js.map +0 -1
  81. package/dist/chunk-G5WHEAIQ.js +0 -2
  82. package/dist/chunk-G5WHEAIQ.js.map +0 -1
  83. package/dist/chunk-H2K353LR.js +0 -2
  84. package/dist/chunk-H2K353LR.js.map +0 -1
  85. package/dist/chunk-JKVD5LHZ.js +0 -2
  86. package/dist/chunk-JKVD5LHZ.js.map +0 -1
  87. package/dist/chunk-NWQ4N5RX.js +0 -2
  88. package/dist/chunk-NWQ4N5RX.js.map +0 -1
  89. package/dist/chunk-PHZ7FTYF.js +0 -2
  90. package/dist/chunk-PHZ7FTYF.js.map +0 -1
  91. package/dist/chunk-PNZTVQA7.js +0 -2
  92. package/dist/chunk-PNZTVQA7.js.map +0 -1
  93. package/dist/chunk-R4JB5MBR.js +0 -2
  94. package/dist/chunk-R4JB5MBR.js.map +0 -1
  95. package/dist/chunk-VFOAY6XI.js +0 -2
  96. package/dist/chunk-VFOAY6XI.js.map +0 -1
  97. package/dist/chunk-XB5BQIEX.js +0 -2
  98. package/dist/chunk-XB5BQIEX.js.map +0 -1
  99. package/dist/core/index.cjs +0 -2
  100. package/dist/core/index.cjs.map +0 -1
  101. package/dist/core/index.d.cts +0 -19
  102. package/dist/core/index.d.ts +0 -19
  103. package/dist/core/index.js +0 -2
  104. package/dist/core/index.js.map +0 -1
  105. package/dist/index.cjs.map +0 -1
  106. package/dist/index.d.cts +0 -84
  107. package/dist/index.js.map +0 -1
  108. package/dist/stream/adapter.cjs +0 -2
  109. package/dist/stream/adapter.cjs.map +0 -1
  110. package/dist/stream/adapter.d.cts +0 -63
  111. package/dist/stream/adapter.d.ts +0 -63
  112. package/dist/stream/adapter.js +0 -2
  113. package/dist/stream/adapter.js.map +0 -1
  114. package/dist/stream/fs-utils.cjs +0 -2
  115. package/dist/stream/fs-utils.cjs.map +0 -1
  116. package/dist/stream/fs-utils.d.cts +0 -137
  117. package/dist/stream/fs-utils.d.ts +0 -137
  118. package/dist/stream/fs-utils.js +0 -2
  119. package/dist/stream/fs-utils.js.map +0 -1
  120. package/dist/stream/index.cjs +0 -2
  121. package/dist/stream/index.cjs.map +0 -1
  122. package/dist/stream/index.d.cts +0 -4
  123. package/dist/stream/index.d.ts +0 -4
  124. package/dist/stream/index.js +0 -2
  125. package/dist/stream/index.js.map +0 -1
  126. package/dist/stream/light/index.cjs +0 -2
  127. package/dist/stream/light/index.cjs.map +0 -1
  128. package/dist/stream/light/index.d.cts +0 -4
  129. package/dist/stream/light/index.d.ts +0 -4
  130. package/dist/stream/light/index.js +0 -2
  131. package/dist/stream/light/index.js.map +0 -1
  132. package/dist/stream/md5-stream.cjs.map +0 -1
  133. package/dist/stream/md5-stream.js.map +0 -1
  134. package/dist/stream/whatwg-stream.cjs.map +0 -1
  135. package/dist/stream/whatwg-stream.js.map +0 -1
  136. package/dist/types-edGoGJ5V.d.cts +0 -42
  137. package/dist/types-edGoGJ5V.d.ts +0 -42
  138. package/dist/utils/detect.cjs.map +0 -1
  139. package/dist/utils/detect.js.map +0 -1
  140. package/planning/03-optimization-size-tree-shaking/01-es-modules-tree-shaking.md +0 -152
  141. package/planning/03-optimization-size-tree-shaking/02-consolidate-modules.md +0 -65
  142. package/planning/03-optimization-size-tree-shaking/03-remove-duplicate-add32.md +0 -93
  143. package/planning/03-optimization-size-tree-shaking/04-remove-runtime-check.md +0 -102
  144. package/planning/03-optimization-size-tree-shaking/05-optimize-loops-performance.md +0 -107
  145. package/planning/03-optimization-size-tree-shaking/06-tsup-formats-configuration.md +0 -227
  146. package/planning/03-optimization-size-tree-shaking/07-multiple-build-formats.md +0 -228
  147. package/planning/03-optimization-size-tree-shaking/08-benchmarks-metrics.md +0 -34
  148. package/planning/03-optimization-size-tree-shaking/MIGRATION_GUIDE.md +0 -260
  149. package/planning/03-optimization-size-tree-shaking/README.md +0 -173
  150. package/planning/03-optimization-size-tree-shaking/SUMMARY.md +0 -168
  151. package/planning/04-adapter-backend/03-backend-web-crypto.md +0 -149
  152. package/planning/04-adapter-backend/04-backend-node-crypto.md +0 -181
  153. package/planning/04-adapter-backend/05-backend-pure-js.md +0 -174
  154. package/planning/04-adapter-backend/06-backend-ie11.md +0 -158
  155. package/planning/04-adapter-backend/07-detection-environment.md +0 -232
  156. package/planning/04-adapter-backend/08-detection-backend.md +0 -210
  157. package/planning/04-adapter-backend/09-adapter-unified.md +0 -255
  158. package/planning/04-adapter-backend/10-fallback-mechanism.md +0 -333
  159. package/planning/04-adapter-backend/11-tests-backend-web-crypto.md +0 -191
  160. package/planning/04-adapter-backend/12-tests-backend-node-crypto.md +0 -222
  161. package/planning/04-adapter-backend/README.md +0 -45
  162. package/planning/05-documentation-publishing/01-README-optimization.md +0 -105
  163. package/planning/05-documentation-publishing/02-VitePress-site-evaluation.md +0 -136
  164. package/planning/05-documentation-publishing/03-Changeset-setup.md +0 -192
  165. package/planning/05-documentation-publishing/04-GitHub-templates.md +0 -252
  166. package/planning/05-documentation-publishing/README.md +0 -22
  167. package/planning/05-documentation-publishing/STATUS.md +0 -222
  168. package/planning/prd.md +0 -405
  169. package/planning/streams/01-create-md5stream-class.md +0 -69
  170. package/planning/streams/02-create-factory-api.md +0 -65
  171. package/planning/streams/03-fs-integration.md +0 -37
  172. package/planning/streams/04-whatwg-streams-support.md +0 -37
  173. package/planning/streams/05-audit-optimization.md +0 -121
  174. package/planning/streams/06-comprehensive-tests-docs.md +0 -137
  175. package/planning/streams/07-architecture-integration.md +0 -38
  176. package/planning/streams/README.md +0 -98
  177. 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: Анализ бандла и метрики.