@mirta/rollup 0.3.4 → 0.4.0
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 +100 -10
- package/README.ru.md +99 -11
- package/dist/config-package.d.mts +18 -0
- package/dist/config-package.mjs +36 -0
- package/dist/config.d.mts +12 -0
- package/dist/config.mjs +24 -0
- package/dist/errors.mjs +185 -0
- package/dist/index.d.mts +77 -18
- package/dist/index.mjs +21 -514
- package/dist/package.mjs +1030 -0
- package/dist/runtime.mjs +296 -0
- package/package.json +54 -26
package/dist/runtime.mjs
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import multi from '@rollup/plugin-multi-entry';
|
|
2
|
+
import nodeResolve from '@rollup/plugin-node-resolve';
|
|
3
|
+
import ts from 'rollup-plugin-typescript2';
|
|
4
|
+
import replace from '@rollup/plugin-replace';
|
|
5
|
+
import { getBabelOutputPlugin } from '@rollup/plugin-babel';
|
|
6
|
+
import { loadEnvReplacements } from '@mirta/env-loader';
|
|
7
|
+
import { resolveMonorepoContextAsync } from '@mirta/workspace';
|
|
8
|
+
import { B as BuildError, d as del } from './errors.mjs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import MagicString from 'magic-string';
|
|
11
|
+
import nodePath from 'node:path';
|
|
12
|
+
|
|
13
|
+
// Абсолютный путь к результирующему каталогу.
|
|
14
|
+
const outputDir = path.join(process.cwd(), 'dist');
|
|
15
|
+
const modulesDir = path.join(outputDir, 'wb-rules-modules');
|
|
16
|
+
// Расположение обрабатываемого чанка.
|
|
17
|
+
const getChunkDir = (fileName) => path.dirname(path.join(outputDir, fileName));
|
|
18
|
+
// Шаблон для отлова конструкций require.
|
|
19
|
+
const patternRequire = /require\(['"]([^'"]+)'\)/g;
|
|
20
|
+
/**
|
|
21
|
+
* Плагин Rollup, перестраивающий пути импорта модулей
|
|
22
|
+
* относительно каталога wb-rules-modules.
|
|
23
|
+
* */
|
|
24
|
+
function wbRulesImports() {
|
|
25
|
+
return {
|
|
26
|
+
name: 'wbRulesImports',
|
|
27
|
+
// Выполняется перед записью содержимого
|
|
28
|
+
// в результирующий файл.
|
|
29
|
+
renderChunk(code, chunk) {
|
|
30
|
+
// Виртуальный каталог не обрабатываем.
|
|
31
|
+
if (chunk.fileName.startsWith('_virtual'))
|
|
32
|
+
return;
|
|
33
|
+
const magicString = new MagicString(code);
|
|
34
|
+
let hasReplacements = false;
|
|
35
|
+
let start;
|
|
36
|
+
let end;
|
|
37
|
+
const chunkDir = getChunkDir(chunk.fileName);
|
|
38
|
+
// Преобразует путь подключения модуля в формат,
|
|
39
|
+
// поддерживаемый контроллером Wirenboard.
|
|
40
|
+
function rebaseRequire(match) {
|
|
41
|
+
// Начальная позиция оригинального вхождения
|
|
42
|
+
start = match.index;
|
|
43
|
+
// Конечная позиция оригинального вхождения
|
|
44
|
+
end = start + match[0].length;
|
|
45
|
+
// Преобразует путь подключаемого модуля в абсолютный,
|
|
46
|
+
// опираясь на каталог с текущим обрабатываемым файлом.
|
|
47
|
+
const requireAbsolutePath = path.resolve(chunkDir, match[1]);
|
|
48
|
+
// Если абсолютный путь начинается с каталога модулей...
|
|
49
|
+
if (requireAbsolutePath.startsWith(modulesDir)) {
|
|
50
|
+
const parsed = path.parse(path.relative(modulesDir, requireAbsolutePath));
|
|
51
|
+
const rebased = path
|
|
52
|
+
.join(parsed.dir, parsed.name)
|
|
53
|
+
.replaceAll(path.sep, path.posix.sep);
|
|
54
|
+
// Удаляет расширение файла для полного соответствия
|
|
55
|
+
// принципам импорта модулей wb-rules.
|
|
56
|
+
const replacement = match[0]
|
|
57
|
+
.replace(match[1], rebased);
|
|
58
|
+
magicString.overwrite(start, end, replacement);
|
|
59
|
+
// Признак произведённой замены.
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Строит полный список конструкций require
|
|
64
|
+
// в обрабатываемом файле.
|
|
65
|
+
const matches = [...code.matchAll(patternRequire)];
|
|
66
|
+
for (const match of matches) {
|
|
67
|
+
if (rebaseRequire(match))
|
|
68
|
+
hasReplacements = true;
|
|
69
|
+
}
|
|
70
|
+
// Если никаких замен не было, то файл пропускается.
|
|
71
|
+
if (!hasReplacements)
|
|
72
|
+
return null;
|
|
73
|
+
return {
|
|
74
|
+
code: magicString.toString(),
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Находит пакет, которому принадлежит указанный чанк.
|
|
82
|
+
*
|
|
83
|
+
* Поиск выполняется по префиксу пути: первый пакет, чей `workspacePath`
|
|
84
|
+
* является началом `chunkName`, считается владельцем.
|
|
85
|
+
*
|
|
86
|
+
* @param context - Контекст монорепозитория.
|
|
87
|
+
* @param chunkName - Имя чанка, предоставляемое Rollup (`chunk.name`).
|
|
88
|
+
* @returns Объект {@link PackageDefinition} или `undefined`, если пакет не найден.
|
|
89
|
+
*
|
|
90
|
+
* @since 0.4.0
|
|
91
|
+
*
|
|
92
|
+
**/
|
|
93
|
+
function findPackageByChunkName(context, chunkName) {
|
|
94
|
+
for (const pkg of context.packages) {
|
|
95
|
+
if (chunkName.startsWith(pkg.workspacePath + '/'))
|
|
96
|
+
return pkg;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Преобразует имя чанка в путь, имитирующий установленный пакет в `node_modules`.
|
|
102
|
+
*
|
|
103
|
+
* Позволяет обрабатывать импорты из других пакетов монорепозитория
|
|
104
|
+
* наравне с установленными зависимостями.
|
|
105
|
+
*
|
|
106
|
+
* @param chunkName - Путь к файлу от корня монорепозитория в формате POSIX (и без расширения).
|
|
107
|
+
* @param pkgDefinition - Пакет, которому принадлежит файл.
|
|
108
|
+
* @returns Виртуальный путь вида `node_modules/<имя-пакета>/<относительный-путь>`.
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```ts
|
|
112
|
+
* toVirtualModulePath('packages/mirta-home/dist/heater', {
|
|
113
|
+
* name: '@mirta/home',
|
|
114
|
+
* workspacePath: 'packages/mirta-home'
|
|
115
|
+
* })
|
|
116
|
+
* // → 'node_modules/@mirta/home/dist/heater'
|
|
117
|
+
* ```
|
|
118
|
+
* @since 0.4.0
|
|
119
|
+
*
|
|
120
|
+
**/
|
|
121
|
+
function toVirtualModulePath(chunkName, pkgDefinition) {
|
|
122
|
+
const relativePath = nodePath.posix.relative(pkgDefinition.workspacePath, chunkName);
|
|
123
|
+
// Проверяем, что путь не выходит за пределы пакета.
|
|
124
|
+
if (relativePath.startsWith('..'))
|
|
125
|
+
throw BuildError.get('chunkOutsidePackage', chunkName, pkgDefinition.name, pkgDefinition.workspacePath);
|
|
126
|
+
return `node_modules/${pkgDefinition.name}/${relativePath}`;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const packagesPattern = /(.*)node_modules[\\/]@?(.+)[\\/](.+)?/;
|
|
130
|
+
const entryMatchers = {
|
|
131
|
+
'wb-rules': /(?:src[\\/])?wb-rules[\\/](.*)/,
|
|
132
|
+
'wb-rules-modules': /(?:src[\\/])?wb-rules-modules[\\/](.*)/,
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Парсит путь к исходному файлу и возвращает имя модуля формата `wb-rules-modules/...`.
|
|
136
|
+
* Используется для обработки путей внутри node_modules.
|
|
137
|
+
*
|
|
138
|
+
* @param sourcePath - путь к исходному файлу
|
|
139
|
+
* @returns Строка с именем модуля или undefined
|
|
140
|
+
*
|
|
141
|
+
* @since 0.3.2
|
|
142
|
+
*
|
|
143
|
+
**/
|
|
144
|
+
function tryGetPackageEntryPath(sourcePath) {
|
|
145
|
+
sourcePath = sourcePath.replaceAll(nodePath.sep, nodePath.posix.sep);
|
|
146
|
+
const pathParts = [];
|
|
147
|
+
do {
|
|
148
|
+
const match = packagesPattern.exec(sourcePath);
|
|
149
|
+
if (!match)
|
|
150
|
+
break;
|
|
151
|
+
if (match[3])
|
|
152
|
+
pathParts.unshift(match[3]);
|
|
153
|
+
pathParts.unshift('packages/' + match[2].replace(/\/dist$/, ''));
|
|
154
|
+
sourcePath = match[1];
|
|
155
|
+
} while (sourcePath);
|
|
156
|
+
if (pathParts.length)
|
|
157
|
+
return `wb-rules-modules/${pathParts.join('/')}.js`;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Определяет имя входного файла для типов `wb-rules` и `wb-rules-modules`.
|
|
161
|
+
*
|
|
162
|
+
* @param sourcePath - путь к исходному файлу
|
|
163
|
+
* @param type - тип модуля (wb-rules или wb-rules-modules)
|
|
164
|
+
* @returns Строка с именем файла или undefined
|
|
165
|
+
*
|
|
166
|
+
* @since 0.3.5
|
|
167
|
+
*
|
|
168
|
+
**/
|
|
169
|
+
function tryGetEntryPath(sourcePath, type) {
|
|
170
|
+
const match = entryMatchers[type].exec(sourcePath);
|
|
171
|
+
if (!match)
|
|
172
|
+
return;
|
|
173
|
+
return `${type}/${match[1]}.js`;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Проверяет различные сценарии и возвращает корректный путь выходного файла.
|
|
177
|
+
*
|
|
178
|
+
* @param filePath - Исходный путь к файлу.
|
|
179
|
+
* @returns Строка с корректным путём.
|
|
180
|
+
*
|
|
181
|
+
* @since 0.3.0
|
|
182
|
+
*
|
|
183
|
+
**/
|
|
184
|
+
function getEntryPath(filePath) {
|
|
185
|
+
if (filePath.startsWith('_virtual'))
|
|
186
|
+
return filePath;
|
|
187
|
+
return tryGetPackageEntryPath(filePath)
|
|
188
|
+
?? tryGetEntryPath(filePath, 'wb-rules-modules')
|
|
189
|
+
?? tryGetEntryPath(filePath, 'wb-rules')
|
|
190
|
+
// None of the above matched.
|
|
191
|
+
?? filePath;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const mode = process.env.NODE_ENV ?? 'development';
|
|
195
|
+
const isProduction = mode === 'production';
|
|
196
|
+
const outDir = 'dist/es5';
|
|
197
|
+
/**
|
|
198
|
+
* Собирает Rollup-конфигурацию для сборки runtime-кода проекта с учётом монорепозитория и подстановки переменных окружения.
|
|
199
|
+
*
|
|
200
|
+
* @param options - Параметры: `cwd` — рабочая директория проекта; `external` — список внешних зависимостей; `envLoader` — опции загрузчика окружения; `plugins` — дополнительные Rollup-плагины
|
|
201
|
+
* @returns Сконфигурированный объект RollupOptions, готовый для сборки в каталог `dist/es5`
|
|
202
|
+
* @since 0.3.0
|
|
203
|
+
*/
|
|
204
|
+
async function defineRuntimeConfig(options = {}) {
|
|
205
|
+
const { cwd = process.cwd(), external, envLoader: envLoaderOptions, plugins = [], } = options;
|
|
206
|
+
const monorepoContext = await resolveMonorepoContextAsync(cwd);
|
|
207
|
+
const defaultPlugins = [
|
|
208
|
+
// Очистка директории dist перед сборкой
|
|
209
|
+
del({
|
|
210
|
+
targets: outDir,
|
|
211
|
+
}),
|
|
212
|
+
// Поддержка множественных входных файлов
|
|
213
|
+
multi({
|
|
214
|
+
exclude: ['src/wb-rules/*.disabled.[jt]s'],
|
|
215
|
+
preserveModules: true,
|
|
216
|
+
}),
|
|
217
|
+
// Поиск зависимостей в node_modules
|
|
218
|
+
nodeResolve(),
|
|
219
|
+
// Транспиляция TypeScript
|
|
220
|
+
ts({ clean: true }),
|
|
221
|
+
// Обработка импортов для wb-rules
|
|
222
|
+
wbRulesImports(),
|
|
223
|
+
// Подстановка переменных окружения
|
|
224
|
+
replace({
|
|
225
|
+
preventAssignment: true,
|
|
226
|
+
values: {
|
|
227
|
+
// Загрузка переменных окружения
|
|
228
|
+
...loadEnvReplacements({
|
|
229
|
+
...envLoaderOptions,
|
|
230
|
+
mode,
|
|
231
|
+
cwd,
|
|
232
|
+
rootDir: monorepoContext.rootDir,
|
|
233
|
+
}),
|
|
234
|
+
// Признак сборки в режиме разработки
|
|
235
|
+
__DEV__: JSON.stringify(!isProduction),
|
|
236
|
+
// Автоматически меняется в процессе тестирования
|
|
237
|
+
__TEST__: 'false',
|
|
238
|
+
},
|
|
239
|
+
}),
|
|
240
|
+
// Транспиляция через Babel
|
|
241
|
+
getBabelOutputPlugin({
|
|
242
|
+
presets: ['@babel/preset-env'],
|
|
243
|
+
plugins: [
|
|
244
|
+
'@babel/plugin-transform-spread',
|
|
245
|
+
'array-includes',
|
|
246
|
+
],
|
|
247
|
+
}),
|
|
248
|
+
// Очистка виртуальных файлов после сборки
|
|
249
|
+
del({
|
|
250
|
+
targets: `${outDir}/_virtual`,
|
|
251
|
+
hook: 'closeBundle',
|
|
252
|
+
}),
|
|
253
|
+
];
|
|
254
|
+
return {
|
|
255
|
+
input: 'src/wb-rules/*.[jt]s',
|
|
256
|
+
external,
|
|
257
|
+
plugins: [
|
|
258
|
+
...defaultPlugins,
|
|
259
|
+
...plugins,
|
|
260
|
+
],
|
|
261
|
+
output: {
|
|
262
|
+
format: 'cjs',
|
|
263
|
+
strict: false,
|
|
264
|
+
dir: outDir,
|
|
265
|
+
preserveModules: true,
|
|
266
|
+
entryFileNames(chunk) {
|
|
267
|
+
// Относительный путь от корня репозитория.
|
|
268
|
+
let chunkName = chunk.name;
|
|
269
|
+
// Адаптация путей при сборке в монорепозитории.
|
|
270
|
+
if (monorepoContext.packages.length !== 0) {
|
|
271
|
+
const { rootDir } = monorepoContext;
|
|
272
|
+
// Преобразуем chunkName (относительный путь от корня монорепозитория)
|
|
273
|
+
// в абсолютный путь для корректного сравнения с cwd (абсолютным путём
|
|
274
|
+
// к текущему пакету).
|
|
275
|
+
//
|
|
276
|
+
const absolutePath = nodePath.resolve(rootDir, chunkName);
|
|
277
|
+
if (absolutePath.startsWith(cwd)) {
|
|
278
|
+
// Путь в текущем проекте, не требует встраивания отдельным пакетом.
|
|
279
|
+
chunkName = nodePath
|
|
280
|
+
.relative(cwd, absolutePath)
|
|
281
|
+
.replaceAll(nodePath.sep, nodePath.posix.sep);
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
// Ищем пакет монорепозитория, в котором находится указанный путь.
|
|
285
|
+
const pkgDefinition = findPackageByChunkName(monorepoContext, chunkName);
|
|
286
|
+
if (pkgDefinition)
|
|
287
|
+
chunkName = toVirtualModulePath(chunkName, pkgDefinition);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return getEntryPath(chunkName);
|
|
291
|
+
},
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export { defineRuntimeConfig as d };
|
package/package.json
CHANGED
|
@@ -1,13 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mirta/rollup",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"sideEffects": false,
|
|
5
|
+
"description": "Predefined Rollup configuration for wb-rules project builds",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"mirta",
|
|
8
8
|
"wb-rules"
|
|
9
9
|
],
|
|
10
|
+
"license": "Unlicense",
|
|
11
|
+
"homepage": "https://github.com/wb-mirta/core/tree/latest/packages/mirta-rollup#readme",
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "git+https://github.com/wb-mirta/core.git",
|
|
15
|
+
"directory": "packages/mirta-rollup"
|
|
16
|
+
},
|
|
17
|
+
"bugs": {
|
|
18
|
+
"url": "https://github.com/wb-mirta/core/issues"
|
|
19
|
+
},
|
|
10
20
|
"type": "module",
|
|
21
|
+
"types": "./dist/index.d.mts",
|
|
11
22
|
"files": [
|
|
12
23
|
"dist",
|
|
13
24
|
"LICENSE",
|
|
@@ -19,39 +30,56 @@
|
|
|
19
30
|
"types": "./dist/index.d.mts",
|
|
20
31
|
"default": "./dist/index.mjs"
|
|
21
32
|
}
|
|
33
|
+
},
|
|
34
|
+
"./config": {
|
|
35
|
+
"types": "./dist/config.d.mts",
|
|
36
|
+
"default": "./dist/config.mjs"
|
|
37
|
+
},
|
|
38
|
+
"./config-package": {
|
|
39
|
+
"types": "./dist/config-package.d.mts",
|
|
40
|
+
"default": "./dist/config-package.mjs"
|
|
22
41
|
}
|
|
23
42
|
},
|
|
24
|
-
"
|
|
25
|
-
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"url": "https://github.com/wb-mirta/core/issues"
|
|
43
|
+
"imports": {
|
|
44
|
+
"#src/*": "./src/*.js",
|
|
45
|
+
"#ast": "./src/ast-transformers/index.js",
|
|
46
|
+
"#utils/*": "./src/utils/*.js",
|
|
47
|
+
"#utils/monorepo": "./src/utils/monorepo/index.js",
|
|
48
|
+
"#plugins/*": "./src/plugins/*.js",
|
|
49
|
+
"#configs/*": "./src/configs/*.js"
|
|
32
50
|
},
|
|
33
51
|
"dependencies": {
|
|
34
|
-
"@babel/core": "^7.28.
|
|
35
|
-
"@babel/preset-env": "^7.28.
|
|
36
|
-
"@
|
|
37
|
-
"@
|
|
38
|
-
"@rollup/plugin-babel": "^6.0
|
|
39
|
-
"@rollup/plugin-
|
|
40
|
-
"@rollup/plugin-
|
|
41
|
-
"@rollup/plugin-
|
|
52
|
+
"@babel/core": "^7.28.5",
|
|
53
|
+
"@babel/preset-env": "^7.28.5",
|
|
54
|
+
"@babel/plugin-transform-spread": "^7.27.1",
|
|
55
|
+
"@dotenvx/dotenvx": "^1.51.1",
|
|
56
|
+
"@rollup/plugin-babel": "^6.1.0",
|
|
57
|
+
"@rollup/plugin-commonjs": "^29.0.0",
|
|
58
|
+
"@rollup/plugin-multi-entry": "^7.1.0",
|
|
59
|
+
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
60
|
+
"@rollup/plugin-replace": "^6.0.3",
|
|
61
|
+
"@rollup/plugin-typescript": "^12.3.0",
|
|
42
62
|
"babel-plugin-array-includes": "^2.0.3",
|
|
43
63
|
"del": "^8.0.1",
|
|
44
|
-
"magic-string": "^0.30.
|
|
45
|
-
"rollup-plugin-
|
|
64
|
+
"magic-string": "^0.30.21",
|
|
65
|
+
"rollup-plugin-copy": "^3.5.0",
|
|
66
|
+
"rollup-plugin-dts": "^6.3.0",
|
|
46
67
|
"rollup-plugin-typescript2": "^0.36.0",
|
|
47
|
-
"
|
|
48
|
-
"@mirta/
|
|
68
|
+
"find-up": "^8.0.0",
|
|
69
|
+
"@mirta/basics": "0.4.0",
|
|
70
|
+
"@mirta/env-loader": "0.4.0",
|
|
71
|
+
"@mirta/package": "0.4.0",
|
|
72
|
+
"@mirta/workspace": "0.4.0"
|
|
49
73
|
},
|
|
50
74
|
"devDependencies": {
|
|
51
|
-
"rollup": "^4.
|
|
75
|
+
"rollup": "^4.55.1",
|
|
76
|
+
"typescript": "^5.8.3"
|
|
77
|
+
},
|
|
78
|
+
"peerDependencies": {
|
|
79
|
+
"rollup": ">= 4.52.5 < 5",
|
|
80
|
+
"typescript": ">= 5.8.3 < 6"
|
|
52
81
|
},
|
|
53
82
|
"scripts": {
|
|
54
|
-
"
|
|
55
|
-
"build:mono": "pnpm clean && rollup -c ../../rollup.config.mjs"
|
|
83
|
+
"build:mono": "rollup -c --configPlugin typescript={tsconfig:\\\"./tsconfig.build.json\\\"}"
|
|
56
84
|
}
|
|
57
85
|
}
|