@foxford/tsup-config 1.0.2 → 1.1.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.mdx CHANGED
@@ -47,12 +47,18 @@ export default defineConfig(
47
47
  ## Что делает сборка
48
48
 
49
49
  1. `entry` для tsup — из декларации;
50
- 2. ESM → `.mjs`, CJS → `.cjs` (явно, иначе при `"type": "module"` ESM уходит в `.js`);
50
+ 2. ESM → `.js`, CJS → `.cjs` для пакетов с `"type": "module"`;
51
51
  3. `build/package.json`: метаданные без dev-полей, `exports` внутрь артефакта,
52
52
  `files` — по фактическому содержимому `build/`;
53
53
  4. падает, если объявленного подпути нет в `exports` исходного package.json,
54
54
  если `exports` ведёт не на исходник, или если файла из `exports` нет в `build/`.
55
55
 
56
+ Синтаксис пакетного выхода понижается до production-целей `@foxford/browserslist-config/build` для ESM-приложений. Окружение выбрано явно: `NODE_ENV=test` или dev-режим команды не меняют публикуемый код. Пакеты, исполняемые только в Node, задают `overrides: { target: 'node18' }`; сам `tsup-config` также собирается для Node 18.
57
+
58
+ Пакетная сборка не добавляет глобальные полифиллы. Итоговый сборщик приложения обрабатывает код вместе с зависимостями и подключает нужные API. У `den-preact` в промежуточном ESM сохраняются `import.meta` и optional chaining: они нужны сборщику потребителя для удаления серверного рендера из браузерного выхода.
59
+
60
+ Для старых Safari профиль применяет тот же обход destructuring, что и Vite 7: esbuild сохраняет этот синтаксис. Это позволяет собрать код, но не исправляет известный баг движка в отдельных операциях с array rest. Условие обхода и ограничение описаны в [пакете браузерных целей](https://github.com/foxford/frontend-platform/blob/main/packages/browserslist-config/README.mdx).
61
+
56
62
  ## Пакеты со своей сборкой
57
63
 
58
64
  `@foxford/den-vike` собирается `tsc`, а не tsup: его vike-хуки связаны импортами
package/index.cjs CHANGED
@@ -3,34 +3,8 @@ var __create = Object.create;
3
3
  var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
7
6
  var __getProtoOf = Object.getPrototypeOf;
8
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
9
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
10
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11
- var __spreadValues = (a, b) => {
12
- for (var prop in b || (b = {}))
13
- if (__hasOwnProp.call(b, prop))
14
- __defNormalProp(a, prop, b[prop]);
15
- if (__getOwnPropSymbols)
16
- for (var prop of __getOwnPropSymbols(b)) {
17
- if (__propIsEnum.call(b, prop))
18
- __defNormalProp(a, prop, b[prop]);
19
- }
20
- return a;
21
- };
22
- var __objRest = (source, exclude) => {
23
- var target = {};
24
- for (var prop in source)
25
- if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
26
- target[prop] = source[prop];
27
- if (source != null && __getOwnPropSymbols)
28
- for (var prop of __getOwnPropSymbols(source)) {
29
- if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
30
- target[prop] = source[prop];
31
- }
32
- return target;
33
- };
34
8
  var __export = (target, all) => {
35
9
  for (var name in all)
36
10
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -52,26 +26,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
52
26
  mod
53
27
  ));
54
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
55
- var __async = (__this, __arguments, generator) => {
56
- return new Promise((resolve, reject) => {
57
- var fulfilled = (value) => {
58
- try {
59
- step(generator.next(value));
60
- } catch (e) {
61
- reject(e);
62
- }
63
- };
64
- var rejected = (value) => {
65
- try {
66
- step(generator.throw(value));
67
- } catch (e) {
68
- reject(e);
69
- }
70
- };
71
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
72
- step((generator = generator.apply(__this, __arguments)).next());
73
- });
74
- };
75
29
 
76
30
  // src/index.js
77
31
  var src_exports = {};
@@ -90,6 +44,7 @@ __export(src_exports, {
90
44
  module.exports = __toCommonJS(src_exports);
91
45
  var import_node_fs = __toESM(require("fs"), 1);
92
46
  var import_node_path = __toESM(require("path"), 1);
47
+ var import_build = require("@foxford/browserslist-config/build");
93
48
  function defineEntries(map) {
94
49
  for (const [subpath, source] of Object.entries(map)) {
95
50
  if (!subpath.startsWith(".")) {
@@ -109,9 +64,8 @@ function toTsupEntry(entries) {
109
64
  return Object.fromEntries(Object.entries(entries).map(([subpath, source]) => [artifactName(subpath, source), source]));
110
65
  }
111
66
  function assertSourceExports(entries, packageJson) {
112
- var _a;
113
67
  const declared = new Set(Object.keys(entries));
114
- const actual = new Set(Object.keys((_a = packageJson.exports) != null ? _a : {}).filter((key) => !key.endsWith(".mdx")));
68
+ const actual = new Set(Object.keys(packageJson.exports ?? {}).filter((key) => !key.endsWith(".mdx")));
115
69
  const missing = [...declared].filter((key) => !actual.has(key));
116
70
  const extra = [...actual].filter((key) => !declared.has(key));
117
71
  if (missing.length > 0 || extra.length > 0) {
@@ -136,7 +90,7 @@ function toBuildExports(entries, { extensions }) {
136
90
  return Object.fromEntries(
137
91
  Object.entries(entries).map(([subpath, source]) => {
138
92
  const name = artifactName(subpath, source);
139
- return [subpath, __spreadValues({}, extensions(name))];
93
+ return [subpath, { ...extensions(name) }];
140
94
  })
141
95
  );
142
96
  }
@@ -161,9 +115,8 @@ function writeBuildPackageJson({ entries, extensions, main, module: moduleField,
161
115
  `);
162
116
  }
163
117
  function verifyBuildExports(outDir = "build") {
164
- var _a;
165
118
  const packageJson = JSON.parse(import_node_fs.default.readFileSync(import_node_path.default.join(outDir, "package.json"), "utf-8"));
166
- const missing = Object.values((_a = packageJson.exports) != null ? _a : {}).flatMap((entry) => typeof entry === "string" ? [entry] : Object.values(entry)).filter((file) => !import_node_fs.default.existsSync(import_node_path.default.join(outDir, file)));
119
+ const missing = Object.values(packageJson.exports ?? {}).flatMap((entry) => typeof entry === "string" ? [entry] : Object.values(entry)).filter((file) => !import_node_fs.default.existsSync(import_node_path.default.join(outDir, file)));
167
120
  if (missing.length > 0) {
168
121
  throw new Error(`\u0432 ${outDir}/ \u043D\u0435\u0442 \u0444\u0430\u0439\u043B\u043E\u0432 \u0434\u043B\u044F exports: ${[...new Set(missing)].join(", ")}`);
169
122
  }
@@ -209,12 +162,9 @@ function addExtensionsToRelativeImports(outDir = "build") {
209
162
  return patched;
210
163
  }
211
164
  function createTsupConfig({ entries, overrides = {} }) {
212
- const _a = overrides, { esbuildOptions: overrideEsbuildOptions } = _a, rest = __objRest(_a, ["esbuildOptions"]);
213
- const extensions = (name) => ({
214
- import: `./${name}.js`,
215
- require: `./${name}.cjs`,
216
- types: `./${name}.d.ts`
217
- });
165
+ const { esbuildOptions: overrideEsbuildOptions, target, ...rest } = overrides;
166
+ const browserProfile = target === void 0 ? (0, import_build.resolveBrowserBuild)({ env: "production" }) : void 0;
167
+ const extensions = (name) => ({ import: `./${name}.js`, require: `./${name}.cjs`, types: `./${name}.d.ts` });
218
168
  process.on("beforeExit", (code) => {
219
169
  if (code !== 0) return;
220
170
  updateBuildFiles();
@@ -225,7 +175,7 @@ function createTsupConfig({ entries, overrides = {} }) {
225
175
  process.exitCode = 1;
226
176
  }
227
177
  });
228
- return __spreadValues({
178
+ return {
229
179
  bundle: true,
230
180
  clean: true,
231
181
  dts: true,
@@ -239,21 +189,31 @@ function createTsupConfig({ entries, overrides = {} }) {
239
189
  // react/jsx-runtime и от области видимости не зависит.
240
190
  esbuildOptions: (options, context) => {
241
191
  options.jsx = "automatic";
242
- overrideEsbuildOptions == null ? void 0 : overrideEsbuildOptions(options, context);
192
+ if (browserProfile) {
193
+ options.supported = { ...options.supported, ...browserProfile.esbuildSupported };
194
+ }
195
+ overrideEsbuildOptions?.(options, context);
243
196
  },
244
197
  format: ["cjs", "esm"],
245
- onSuccess: () => __async(null, null, function* () {
198
+ onSuccess: async () => {
246
199
  copyReadme();
247
200
  const root = entries["."];
248
- writeBuildPackageJson(__spreadValues({
201
+ writeBuildPackageJson({
249
202
  entries,
250
- extensions
251
- }, root === void 0 ? {} : { main: extensions(artifactName(".", root)).require, module: extensions(artifactName(".", root)).import }));
252
- }),
203
+ extensions,
204
+ ...root === void 0 ? {} : { main: extensions(artifactName(".", root)).require, module: extensions(artifactName(".", root)).import }
205
+ });
206
+ },
253
207
  outDir: "build",
254
208
  sourcemap: false,
255
- splitting: false
256
- }, rest);
209
+ splitting: false,
210
+ // Пакетный выход ещё пересобирает приложение: здесь понижается синтаксис,
211
+ // а полифиллы и совместимость всех зависимостей проверяет финальная сборка.
212
+ target: target ?? browserProfile?.targets,
213
+ // Хук уже дополнен jsx: 'automatic', а undefined target не должен отменять
214
+ // общую браузерную цель — обе опции исключены из спреда.
215
+ ...rest
216
+ };
257
217
  }
258
218
  // Annotate the CommonJS export names for ESM import in node:
259
219
  0 && (module.exports = {
package/index.d.ts CHANGED
@@ -42,5 +42,9 @@ export function copyReadme(outDir?: string): void
42
42
  */
43
43
  export function addExtensionsToRelativeImports(outDir?: string): number
44
44
 
45
- /** Готовый tsup-конфиг публикуемого пакета монорепо. */
45
+ /**
46
+ * Готовый tsup-конфиг публикуемого пакета монорепо.
47
+ * По умолчанию — production-цели @foxford/browserslist-config для ESM-приложений.
48
+ * Пакеты для Node задают overrides.target; полифиллы добавляет сборка приложения.
49
+ */
46
50
  export function createTsupConfig(options: { entries: Entries; overrides?: Options }): Options
package/index.mjs CHANGED
@@ -1,55 +1,7 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
- var __hasOwnProp = Object.prototype.hasOwnProperty;
4
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
- var __spreadValues = (a, b) => {
7
- for (var prop in b || (b = {}))
8
- if (__hasOwnProp.call(b, prop))
9
- __defNormalProp(a, prop, b[prop]);
10
- if (__getOwnPropSymbols)
11
- for (var prop of __getOwnPropSymbols(b)) {
12
- if (__propIsEnum.call(b, prop))
13
- __defNormalProp(a, prop, b[prop]);
14
- }
15
- return a;
16
- };
17
- var __objRest = (source, exclude) => {
18
- var target = {};
19
- for (var prop in source)
20
- if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
21
- target[prop] = source[prop];
22
- if (source != null && __getOwnPropSymbols)
23
- for (var prop of __getOwnPropSymbols(source)) {
24
- if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
25
- target[prop] = source[prop];
26
- }
27
- return target;
28
- };
29
- var __async = (__this, __arguments, generator) => {
30
- return new Promise((resolve, reject) => {
31
- var fulfilled = (value) => {
32
- try {
33
- step(generator.next(value));
34
- } catch (e) {
35
- reject(e);
36
- }
37
- };
38
- var rejected = (value) => {
39
- try {
40
- step(generator.throw(value));
41
- } catch (e) {
42
- reject(e);
43
- }
44
- };
45
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
46
- step((generator = generator.apply(__this, __arguments)).next());
47
- });
48
- };
49
-
50
1
  // src/index.js
51
2
  import fs from "fs";
52
3
  import path from "path";
4
+ import { resolveBrowserBuild } from "@foxford/browserslist-config/build";
53
5
  function defineEntries(map) {
54
6
  for (const [subpath, source] of Object.entries(map)) {
55
7
  if (!subpath.startsWith(".")) {
@@ -69,9 +21,8 @@ function toTsupEntry(entries) {
69
21
  return Object.fromEntries(Object.entries(entries).map(([subpath, source]) => [artifactName(subpath, source), source]));
70
22
  }
71
23
  function assertSourceExports(entries, packageJson) {
72
- var _a;
73
24
  const declared = new Set(Object.keys(entries));
74
- const actual = new Set(Object.keys((_a = packageJson.exports) != null ? _a : {}).filter((key) => !key.endsWith(".mdx")));
25
+ const actual = new Set(Object.keys(packageJson.exports ?? {}).filter((key) => !key.endsWith(".mdx")));
75
26
  const missing = [...declared].filter((key) => !actual.has(key));
76
27
  const extra = [...actual].filter((key) => !declared.has(key));
77
28
  if (missing.length > 0 || extra.length > 0) {
@@ -96,7 +47,7 @@ function toBuildExports(entries, { extensions }) {
96
47
  return Object.fromEntries(
97
48
  Object.entries(entries).map(([subpath, source]) => {
98
49
  const name = artifactName(subpath, source);
99
- return [subpath, __spreadValues({}, extensions(name))];
50
+ return [subpath, { ...extensions(name) }];
100
51
  })
101
52
  );
102
53
  }
@@ -121,9 +72,8 @@ function writeBuildPackageJson({ entries, extensions, main, module: moduleField,
121
72
  `);
122
73
  }
123
74
  function verifyBuildExports(outDir = "build") {
124
- var _a;
125
75
  const packageJson = JSON.parse(fs.readFileSync(path.join(outDir, "package.json"), "utf-8"));
126
- const missing = Object.values((_a = packageJson.exports) != null ? _a : {}).flatMap((entry) => typeof entry === "string" ? [entry] : Object.values(entry)).filter((file) => !fs.existsSync(path.join(outDir, file)));
76
+ const missing = Object.values(packageJson.exports ?? {}).flatMap((entry) => typeof entry === "string" ? [entry] : Object.values(entry)).filter((file) => !fs.existsSync(path.join(outDir, file)));
127
77
  if (missing.length > 0) {
128
78
  throw new Error(`\u0432 ${outDir}/ \u043D\u0435\u0442 \u0444\u0430\u0439\u043B\u043E\u0432 \u0434\u043B\u044F exports: ${[...new Set(missing)].join(", ")}`);
129
79
  }
@@ -169,12 +119,9 @@ function addExtensionsToRelativeImports(outDir = "build") {
169
119
  return patched;
170
120
  }
171
121
  function createTsupConfig({ entries, overrides = {} }) {
172
- const _a = overrides, { esbuildOptions: overrideEsbuildOptions } = _a, rest = __objRest(_a, ["esbuildOptions"]);
173
- const extensions = (name) => ({
174
- import: `./${name}.js`,
175
- require: `./${name}.cjs`,
176
- types: `./${name}.d.ts`
177
- });
122
+ const { esbuildOptions: overrideEsbuildOptions, target, ...rest } = overrides;
123
+ const browserProfile = target === void 0 ? resolveBrowserBuild({ env: "production" }) : void 0;
124
+ const extensions = (name) => ({ import: `./${name}.js`, require: `./${name}.cjs`, types: `./${name}.d.ts` });
178
125
  process.on("beforeExit", (code) => {
179
126
  if (code !== 0) return;
180
127
  updateBuildFiles();
@@ -185,7 +132,7 @@ function createTsupConfig({ entries, overrides = {} }) {
185
132
  process.exitCode = 1;
186
133
  }
187
134
  });
188
- return __spreadValues({
135
+ return {
189
136
  bundle: true,
190
137
  clean: true,
191
138
  dts: true,
@@ -199,21 +146,31 @@ function createTsupConfig({ entries, overrides = {} }) {
199
146
  // react/jsx-runtime и от области видимости не зависит.
200
147
  esbuildOptions: (options, context) => {
201
148
  options.jsx = "automatic";
202
- overrideEsbuildOptions == null ? void 0 : overrideEsbuildOptions(options, context);
149
+ if (browserProfile) {
150
+ options.supported = { ...options.supported, ...browserProfile.esbuildSupported };
151
+ }
152
+ overrideEsbuildOptions?.(options, context);
203
153
  },
204
154
  format: ["cjs", "esm"],
205
- onSuccess: () => __async(null, null, function* () {
155
+ onSuccess: async () => {
206
156
  copyReadme();
207
157
  const root = entries["."];
208
- writeBuildPackageJson(__spreadValues({
158
+ writeBuildPackageJson({
209
159
  entries,
210
- extensions
211
- }, root === void 0 ? {} : { main: extensions(artifactName(".", root)).require, module: extensions(artifactName(".", root)).import }));
212
- }),
160
+ extensions,
161
+ ...root === void 0 ? {} : { main: extensions(artifactName(".", root)).require, module: extensions(artifactName(".", root)).import }
162
+ });
163
+ },
213
164
  outDir: "build",
214
165
  sourcemap: false,
215
- splitting: false
216
- }, rest);
166
+ splitting: false,
167
+ // Пакетный выход ещё пересобирает приложение: здесь понижается синтаксис,
168
+ // а полифиллы и совместимость всех зависимостей проверяет финальная сборка.
169
+ target: target ?? browserProfile?.targets,
170
+ // Хук уже дополнен jsx: 'automatic', а undefined target не должен отменять
171
+ // общую браузерную цель — обе опции исключены из спреда.
172
+ ...rest
173
+ };
217
174
  }
218
175
  export {
219
176
  addExtensionsToRelativeImports,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foxford/tsup-config",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "Общая сборка публикуемых пакетов: декларация точек входа, tsup-конфиг, генерация публикуемого package.json",
5
5
  "keywords": [
6
6
  "foxford",
@@ -8,6 +8,13 @@
8
8
  "build",
9
9
  "config"
10
10
  ],
11
+ "homepage": "https://github.com/foxford/frontend-platform",
12
+ "bugs": "https://github.com/foxford/frontend-platform/issues",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/foxford/frontend-platform.git",
16
+ "directory": "packages/tsup-config"
17
+ },
11
18
  "license": "MIT",
12
19
  "author": "Foxford Co",
13
20
  "maintainers": [
@@ -18,6 +25,9 @@
18
25
  }
19
26
  ],
20
27
  "type": "module",
28
+ "dependencies": {
29
+ "@foxford/browserslist-config": "^1.2.0"
30
+ },
21
31
  "peerDependencies": {
22
32
  "tsup": "*"
23
33
  },
@@ -37,6 +47,6 @@
37
47
  "index.mjs",
38
48
  "package.json"
39
49
  ],
40
- "sha": "83d658b",
50
+ "sha": "6bf9ff8",
41
51
  "scripts": {}
42
52
  }