smartbundle 0.15.0-alpha.0 → 0.15.0-alpha.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 +15 -10
- package/__bin__/smartbundle-monorepo-link.js +2 -0
- package/__compiled__/cjs/src/args.d.ts +9 -1
- package/__compiled__/cjs/src/args.js +4 -1
- package/__compiled__/cjs/src/args.js.map +1 -1
- package/__compiled__/cjs/src/detectModules.d.ts +25 -11
- package/__compiled__/cjs/src/detectModules.js +165 -28
- package/__compiled__/cjs/src/detectModules.js.map +1 -1
- package/__compiled__/cjs/src/errors.js +4 -0
- package/__compiled__/cjs/src/errors.js.map +1 -1
- package/__compiled__/cjs/src/index.d.ts +1 -1
- package/__compiled__/cjs/src/index.js +11 -5
- package/__compiled__/cjs/src/index.js.map +1 -1
- package/__compiled__/cjs/src/monorepo/buildAll.js +62 -0
- package/__compiled__/cjs/src/monorepo/buildAll.js.map +1 -0
- package/__compiled__/cjs/src/monorepo/convertPackageJson.d.ts +31 -0
- package/__compiled__/cjs/src/monorepo/convertPackageJson.js +40 -0
- package/__compiled__/cjs/src/monorepo/convertPackageJson.js.map +1 -0
- package/__compiled__/cjs/src/monorepo/createLinkPackages/createLinkPackages.js +93 -0
- package/__compiled__/cjs/src/monorepo/createLinkPackages/createLinkPackages.js.map +1 -0
- package/__compiled__/cjs/src/monorepo/link.js +11 -0
- package/__compiled__/cjs/src/monorepo/link.js.map +1 -0
- package/__compiled__/cjs/src/monorepo/parseMonorepo/parseMonorepo.js +106 -0
- package/__compiled__/cjs/src/monorepo/parseMonorepo/parseMonorepo.js.map +1 -0
- package/__compiled__/cjs/src/packageJson.d.ts +5 -0
- package/__compiled__/cjs/src/packageJson.js +2 -0
- package/__compiled__/cjs/src/packageJson.js.map +1 -1
- package/__compiled__/cjs/src/plugins/babel/index.js +1 -1
- package/__compiled__/cjs/src/plugins/babel/index.js.map +1 -1
- package/__compiled__/cjs/src/plugins/react/index.js +3 -2
- package/__compiled__/cjs/src/plugins/react/index.js.map +1 -1
- package/__compiled__/cjs/src/resolveDirs.js +1 -1
- package/__compiled__/cjs/src/resolveDirs.js.map +1 -1
- package/__compiled__/cjs/src/run.js +47 -8
- package/__compiled__/cjs/src/run.js.map +1 -1
- package/__compiled__/cjs/src/tasks/buildTypesTask/callTypescript.d.ts +2 -2
- package/__compiled__/cjs/src/tasks/buildTypesTask/callTypescript.js.map +1 -1
- package/__compiled__/cjs/src/tasks/buildTypesTask/findTypingsNames.d.ts +2 -2
- package/__compiled__/cjs/src/tasks/buildTypesTask/findTypingsNames.js.map +1 -1
- package/__compiled__/cjs/src/tasks/buildTypesTask/findTypingsPackages.d.ts +2 -2
- package/__compiled__/cjs/src/tasks/buildTypesTask/findTypingsPackages.js.map +1 -1
- package/__compiled__/cjs/src/tasks/gitignoreTask.d.ts +6 -0
- package/__compiled__/cjs/src/tasks/gitignoreTask.js +14 -0
- package/__compiled__/cjs/src/tasks/gitignoreTask.js.map +1 -0
- package/__compiled__/cjs/src/writePackageJson.js +2 -33
- package/__compiled__/cjs/src/writePackageJson.js.map +1 -1
- package/__compiled__/esm/src/args.d.mts +9 -1
- package/__compiled__/esm/src/args.mjs +4 -1
- package/__compiled__/esm/src/args.mjs.map +1 -1
- package/__compiled__/esm/src/detectModules.d.mts +25 -11
- package/__compiled__/esm/src/detectModules.mjs +165 -28
- package/__compiled__/esm/src/detectModules.mjs.map +1 -1
- package/__compiled__/esm/src/errors.mjs +4 -0
- package/__compiled__/esm/src/errors.mjs.map +1 -1
- package/__compiled__/esm/src/index.d.mts +1 -1
- package/__compiled__/esm/src/index.mjs +11 -5
- package/__compiled__/esm/src/index.mjs.map +1 -1
- package/__compiled__/esm/src/monorepo/buildAll.mjs +62 -0
- package/__compiled__/esm/src/monorepo/buildAll.mjs.map +1 -0
- package/__compiled__/esm/src/monorepo/convertPackageJson.d.mts +31 -0
- package/__compiled__/esm/src/monorepo/convertPackageJson.mjs +40 -0
- package/__compiled__/esm/src/monorepo/convertPackageJson.mjs.map +1 -0
- package/__compiled__/esm/src/monorepo/createLinkPackages/createLinkPackages.mjs +93 -0
- package/__compiled__/esm/src/monorepo/createLinkPackages/createLinkPackages.mjs.map +1 -0
- package/__compiled__/esm/src/monorepo/link.mjs +10 -0
- package/__compiled__/esm/src/monorepo/link.mjs.map +1 -0
- package/__compiled__/esm/src/monorepo/parseMonorepo/parseMonorepo.mjs +106 -0
- package/__compiled__/esm/src/monorepo/parseMonorepo/parseMonorepo.mjs.map +1 -0
- package/__compiled__/esm/src/packageJson.d.mts +5 -0
- package/__compiled__/esm/src/packageJson.mjs +2 -0
- package/__compiled__/esm/src/packageJson.mjs.map +1 -1
- package/__compiled__/esm/src/plugins/babel/index.mjs +1 -1
- package/__compiled__/esm/src/plugins/babel/index.mjs.map +1 -1
- package/__compiled__/esm/src/plugins/react/index.mjs +3 -2
- package/__compiled__/esm/src/plugins/react/index.mjs.map +1 -1
- package/__compiled__/esm/src/resolveDirs.mjs +1 -1
- package/__compiled__/esm/src/resolveDirs.mjs.map +1 -1
- package/__compiled__/esm/src/run.mjs +47 -8
- package/__compiled__/esm/src/run.mjs.map +1 -1
- package/__compiled__/esm/src/tasks/buildTypesTask/callTypescript.d.mts +2 -2
- package/__compiled__/esm/src/tasks/buildTypesTask/callTypescript.mjs.map +1 -1
- package/__compiled__/esm/src/tasks/buildTypesTask/findTypingsNames.d.mts +2 -2
- package/__compiled__/esm/src/tasks/buildTypesTask/findTypingsNames.mjs.map +1 -1
- package/__compiled__/esm/src/tasks/buildTypesTask/findTypingsPackages.d.mts +2 -2
- package/__compiled__/esm/src/tasks/buildTypesTask/findTypingsPackages.mjs.map +1 -1
- package/__compiled__/esm/src/tasks/gitignoreTask.d.mts +6 -0
- package/__compiled__/esm/src/tasks/gitignoreTask.mjs +14 -0
- package/__compiled__/esm/src/tasks/gitignoreTask.mjs.map +1 -0
- package/__compiled__/esm/src/writePackageJson.mjs +2 -33
- package/__compiled__/esm/src/writePackageJson.mjs.map +1 -1
- package/package.json +17 -11
@@ -35,20 +35,59 @@ function getMinVersion(packageJson, depName, exclude) {
|
|
35
35
|
}
|
36
36
|
return minVersion;
|
37
37
|
}
|
38
|
-
async function detectBabel(packageJson) {
|
38
|
+
async function detectBabel(packageJson, isMonorepoPackage) {
|
39
|
+
const hasBabelInPackage = getMinVersion(packageJson, "@babel/core", [
|
40
|
+
"optionalDependencies"
|
41
|
+
]);
|
42
|
+
if (isMonorepoPackage && hasBabelInPackage) {
|
43
|
+
return {
|
44
|
+
success: false,
|
45
|
+
error: `Babel found in package-level package.json for monorepo package "${packageJson.name}".
|
46
|
+
In monorepos, build tools like Babel should be defined in the workspace root package.json, not in individual packages.
|
47
|
+
Please move "@babel/core" from this package's dependencies/devDependencies to the root package.json's devDependencies.`
|
48
|
+
};
|
49
|
+
}
|
39
50
|
if ("@babel/core" in (packageJson.optionalDependencies ?? {})) {
|
40
51
|
errorLog("babel excluded because inside optionalDependencies");
|
41
|
-
return
|
52
|
+
return {
|
53
|
+
success: false,
|
54
|
+
error: "Babel excluded because it's in optionalDependencies"
|
55
|
+
};
|
56
|
+
}
|
57
|
+
const babelVersion = getMinVersion(packageJson, "@babel/core", [
|
58
|
+
"optionalDependencies"
|
59
|
+
]);
|
60
|
+
if (!babelVersion) {
|
61
|
+
errorLog("babel");
|
62
|
+
return { success: true, module: void 0 };
|
42
63
|
}
|
43
64
|
try {
|
44
65
|
const babel = await import("@babel/core");
|
45
66
|
okLog("babel, version:", babel.version);
|
46
|
-
return
|
67
|
+
return {
|
68
|
+
success: true,
|
69
|
+
module: {
|
70
|
+
babel,
|
71
|
+
version: babel.version
|
72
|
+
}
|
73
|
+
};
|
47
74
|
} catch {
|
48
75
|
errorLog("babel");
|
76
|
+
return { success: false, error: "Failed to import @babel/core" };
|
49
77
|
}
|
50
78
|
}
|
51
|
-
async function detectReact(packageJson) {
|
79
|
+
async function detectReact(packageJson, isMonorepoPackage) {
|
80
|
+
const reactVersionInPackage = getMinVersion(packageJson, "react", [
|
81
|
+
"devDependencies"
|
82
|
+
]);
|
83
|
+
if (isMonorepoPackage && reactVersionInPackage) {
|
84
|
+
return {
|
85
|
+
success: false,
|
86
|
+
error: `React found in package-level package.json for monorepo package "${packageJson.name}".
|
87
|
+
In monorepos, build tools like React should be defined in the workspace root package.json, not in individual packages.
|
88
|
+
Please move "react" from this package's dependencies/peerDependencies to the root package.json's dependencies or peerDependencies.`
|
89
|
+
};
|
90
|
+
}
|
52
91
|
const reactVersion = getMinVersion(packageJson, "react", ["devDependencies"]);
|
53
92
|
if (reactVersion) {
|
54
93
|
const isLegacy = semver.lt(reactVersion, "17.0.0");
|
@@ -56,29 +95,58 @@ async function detectReact(packageJson) {
|
|
56
95
|
okLog(
|
57
96
|
`react, min version: ${reactVersion.version}. Transform: ${transform}`
|
58
97
|
);
|
59
|
-
return
|
98
|
+
return {
|
99
|
+
success: true,
|
100
|
+
module: {
|
101
|
+
transform,
|
102
|
+
version: reactVersion.version
|
103
|
+
}
|
104
|
+
};
|
60
105
|
}
|
61
106
|
errorLog("react");
|
107
|
+
return { success: true, module: void 0 };
|
62
108
|
}
|
63
|
-
async function detectTypescript(packageJson, dirs) {
|
109
|
+
async function detectTypescript(packageJson, dirs, monorepoType) {
|
64
110
|
const typescriptVersion = getMinVersion(packageJson, "typescript", []);
|
111
|
+
if (monorepoType != null && typescriptVersion) {
|
112
|
+
return {
|
113
|
+
success: false,
|
114
|
+
error: `TypeScript found in package-level package.json for monorepo package "${packageJson.name}".
|
115
|
+
In monorepos, build tools like TypeScript should be defined in the workspace root package.json, not in individual packages.
|
116
|
+
Please move "typescript" from this package's dependencies/devDependencies to the root package.json's devDependencies.`
|
117
|
+
};
|
118
|
+
}
|
65
119
|
if (!typescriptVersion) {
|
66
120
|
errorLog("typescript");
|
67
|
-
return;
|
121
|
+
return { success: true, module: void 0 };
|
68
122
|
}
|
69
123
|
let ts;
|
70
124
|
try {
|
71
125
|
ts = (await import("typescript")).default;
|
72
126
|
} catch {
|
73
|
-
|
74
|
-
|
127
|
+
if (monorepoType === "pnpm") {
|
128
|
+
return {
|
129
|
+
success: false,
|
130
|
+
error: `smartbundle found the .ts entrypoint but required "typescript" to build .d.ts files. Please install the "typescript" dependency. In pnpm workspaces, you may need to either:
|
131
|
+
1. Add "hoist-workspace-packages=true" to your pnpm-workspace.yaml file (recommended), or
|
132
|
+
2. Add "public-hoist-pattern[]=[\\"typescript\\"]" to your pnpm-workspace.yaml file, or
|
133
|
+
3. Add "typescript" as a devDependency in each package's package.json
|
134
|
+
See https://pnpm.io/settings#dependency-hoisting-settings for more details.`
|
135
|
+
};
|
136
|
+
} else {
|
137
|
+
return {
|
138
|
+
success: false,
|
139
|
+
error: 'smartbundle found the .ts entrypoint but required "typescript" to build .d.ts files. Please install the "typescript" dependency.'
|
140
|
+
};
|
141
|
+
}
|
75
142
|
}
|
76
143
|
okLog("typescript, version:", ts.version);
|
77
144
|
const configFilePath = ts.findConfigFile(dirs.sourceDir, ts.sys.fileExists);
|
78
145
|
if (!configFilePath) {
|
79
|
-
|
80
|
-
|
81
|
-
|
146
|
+
return {
|
147
|
+
success: false,
|
148
|
+
error: "Cannot find a tsconfig.json file. You should declare it. Please, read the https://github.com/XaveScor/smartbundle/issues/131 for more information"
|
149
|
+
};
|
82
150
|
}
|
83
151
|
const configFile = ts.readConfigFile(configFilePath, ts.sys.readFile);
|
84
152
|
if (configFile.error) {
|
@@ -86,7 +154,10 @@ async function detectTypescript(packageJson, dirs) {
|
|
86
154
|
configFile.error.messageText,
|
87
155
|
"\n"
|
88
156
|
);
|
89
|
-
|
157
|
+
return {
|
158
|
+
success: false,
|
159
|
+
error: `Cannot read tsconfig.json file, error: ${readableError}`
|
160
|
+
};
|
90
161
|
}
|
91
162
|
const parsedConfig = ts.parseJsonConfigFileContent(
|
92
163
|
configFile.config,
|
@@ -108,25 +179,91 @@ async function detectTypescript(packageJson, dirs) {
|
|
108
179
|
configFilePath
|
109
180
|
);
|
110
181
|
if (!parsedConfig.options.verbatimModuleSyntax) {
|
111
|
-
|
112
|
-
|
113
|
-
|
182
|
+
return {
|
183
|
+
success: false,
|
184
|
+
error: "verbatimModuleSyntax should be enabled in tsconfig.json. Read https://github.com/XaveScor/smartbundle/issues/131 for more explanation.\nYou also can upvote the issue if you need the support of verbatimModuleSyntax: false in your library"
|
185
|
+
};
|
114
186
|
}
|
115
187
|
const host = ts.createCompilerHost(parsedConfig.options);
|
116
|
-
return {
|
188
|
+
return {
|
189
|
+
success: true,
|
190
|
+
module: {
|
191
|
+
ts,
|
192
|
+
parsedConfig,
|
193
|
+
host,
|
194
|
+
version: ts.version
|
195
|
+
}
|
196
|
+
};
|
117
197
|
}
|
118
|
-
async function detectModules(packageJson, dirs) {
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
198
|
+
async function detectModules(packageJson, dirs, monorepo) {
|
199
|
+
if (!monorepo) {
|
200
|
+
return detectPackageModules(packageJson, dirs);
|
201
|
+
}
|
202
|
+
const packageValidation = await detectPackageModules(
|
203
|
+
packageJson,
|
204
|
+
dirs,
|
205
|
+
monorepo.type
|
206
|
+
);
|
207
|
+
const errors = [];
|
208
|
+
if (!packageValidation.success) {
|
209
|
+
errors.push(...packageValidation.errors);
|
210
|
+
} else {
|
211
|
+
if (packageValidation.modules.ts) {
|
212
|
+
errors.push(
|
213
|
+
`Package "${packageJson.name}" has ts/babel in package.json, but it's not allowed in monorepo.`
|
214
|
+
);
|
215
|
+
}
|
216
|
+
if (packageValidation.modules.babel) {
|
217
|
+
errors.push(
|
218
|
+
`Package "${packageJson.name}" has babel in package.json, but it's not allowed in monorepo.`
|
219
|
+
);
|
220
|
+
}
|
221
|
+
}
|
222
|
+
const mergedPackageJson = {
|
223
|
+
...packageJson,
|
224
|
+
devDependencies: {
|
225
|
+
...monorepo.devDeps,
|
226
|
+
...packageJson.devDependencies
|
227
|
+
}
|
228
|
+
};
|
229
|
+
const result = await detectPackageModules(mergedPackageJson, dirs);
|
230
|
+
if (!result.success) {
|
231
|
+
errors.push(...result.errors);
|
232
|
+
}
|
233
|
+
if (errors.length > 0) {
|
234
|
+
return { success: false, errors };
|
235
|
+
}
|
236
|
+
return result;
|
237
|
+
}
|
238
|
+
async function detectPackageModules(packageJson, dirs, monorepoType) {
|
239
|
+
log("Detecting modules");
|
240
|
+
const [tsResult, babelResult, reactResult] = await Promise.all([
|
241
|
+
detectTypescript(packageJson, dirs, monorepoType),
|
242
|
+
detectBabel(packageJson, monorepoType != null),
|
243
|
+
detectReact(packageJson, monorepoType != null)
|
244
|
+
]);
|
245
|
+
const errors = [];
|
246
|
+
const modules = {};
|
247
|
+
if (!tsResult.success) {
|
248
|
+
errors.push(tsResult.error);
|
249
|
+
} else if (tsResult.module) {
|
250
|
+
modules.ts = tsResult.module;
|
251
|
+
}
|
252
|
+
if (!babelResult.success) {
|
253
|
+
errors.push(babelResult.error);
|
254
|
+
} else if (babelResult.module) {
|
255
|
+
modules.babel = babelResult.module;
|
256
|
+
}
|
257
|
+
if (!reactResult.success) {
|
258
|
+
errors.push(reactResult.error);
|
259
|
+
} else if (reactResult.module) {
|
260
|
+
modules.react = reactResult.module;
|
261
|
+
}
|
262
|
+
lineLog();
|
263
|
+
if (errors.length > 0) {
|
264
|
+
return { success: false, errors };
|
129
265
|
}
|
266
|
+
return { success: true, modules };
|
130
267
|
}
|
131
268
|
export {
|
132
269
|
detectModules,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"detectModules.mjs","sources":["../../../../src/detectModules.ts"],"sourcesContent":["import { type PackageJson } from \"./packageJson.js\";\nimport semver from \"semver\";\nimport { okLog, errorLog, log, lineLog, warnLog } from \"./log.js\";\nimport type { Dirs } from \"./resolveDirs.js\";\n\nexport type TS = {\n ts: typeof import(\"typescript\");\n parsedConfig: import(\"typescript\").ParsedCommandLine;\n host: import(\"typescript\").CompilerHost;\n};\nexport type DetectedModules = {\n ts?: TS;\n babel?: typeof import(\"@babel/core\");\n react?: \"legacy\" | \"modern\";\n};\n\ntype DepType =\n | \"dependencies\"\n | \"devDependencies\"\n | \"peerDependencies\"\n | \"optionalDependencies\";\nexport function getMinVersion(\n packageJson: PackageJson,\n depName: string,\n exclude: DepType[],\n): semver.SemVer | null {\n const allDepKeys = new Set<DepType>([\n \"dependencies\",\n \"devDependencies\",\n \"peerDependencies\",\n \"optionalDependencies\",\n ]);\n for (const e of exclude) {\n allDepKeys.delete(e);\n }\n\n let minVersion: semver.SemVer | null = null;\n for (const depKey of allDepKeys) {\n const depVersion = packageJson[depKey]?.[depName];\n if (depVersion) {\n const version = semver.minVersion(depVersion);\n if (!version) {\n warnLog(\"node-semver cannot parse version of\", depName, \"from\", depKey);\n warnLog(\"Version:\", depVersion);\n continue;\n }\n if (!minVersion) {\n minVersion = version;\n continue;\n }\n if (semver.lt(version, minVersion)) {\n minVersion = version;\n }\n }\n }\n\n return minVersion;\n}\n\nasync function detectBabel(\n packageJson: PackageJson,\n): Promise<typeof import(\"@babel/core\") | undefined> {\n if (\"@babel/core\" in (packageJson.optionalDependencies ?? {})) {\n errorLog(\"babel excluded because inside optionalDependencies\");\n return;\n }\n\n try {\n const babel = await import(\"@babel/core\");\n okLog(\"babel, version:\", babel.version);\n return babel;\n } catch {\n errorLog(\"babel\");\n }\n}\n\nasync function detectReact(\n packageJson: PackageJson,\n): Promise<\"legacy\" | \"modern\" | undefined> {\n const reactVersion = getMinVersion(packageJson, \"react\", [\"devDependencies\"]);\n if (reactVersion) {\n const isLegacy = semver.lt(reactVersion, \"17.0.0\");\n const transform = isLegacy ? \"legacy\" : \"modern\";\n okLog(\n `react, min version: ${reactVersion.version}. Transform: ${transform}`,\n );\n return transform;\n }\n errorLog(\"react\");\n}\n\nasync function detectTypescript(\n packageJson: PackageJson,\n dirs: Dirs,\n): Promise<TS | undefined> {\n const typescriptVersion = getMinVersion(packageJson, \"typescript\", []);\n if (!typescriptVersion) {\n errorLog(\"typescript\");\n return;\n }\n\n let ts: typeof import(\"typescript\");\n try {\n // ts <=4.3 has no named exports. The all methods is located in the default export\n ts = (await import(\"typescript\")).default;\n } catch {\n errorLog(\"typescript\");\n return;\n }\n\n okLog(\"typescript, version:\", ts.version);\n\n const configFilePath = ts.findConfigFile(dirs.sourceDir, ts.sys.fileExists);\n if (!configFilePath) {\n throw new Error(\n \"Cannot find a tsconfig.json file. You should declare it. Please, read the https://github.com/XaveScor/smartbundle/issues/131 for more information\",\n );\n }\n const configFile = ts.readConfigFile(configFilePath, ts.sys.readFile);\n if (configFile.error) {\n const readableError = ts.flattenDiagnosticMessageText(\n configFile.error.messageText,\n \"\\n\",\n );\n throw new Error(`Cannot read tsconfig.json file, error: ${readableError}`);\n }\n const parsedConfig = ts.parseJsonConfigFileContent(\n configFile.config,\n ts.sys,\n dirs.sourceDir,\n {\n declaration: true,\n emitDeclarationOnly: true,\n strict: false,\n strictNullChecks: false,\n strictFunctionTypes: false,\n strictPropertyInitialization: false,\n skipLibCheck: true,\n skipDefaultLibCheck: true,\n outDir: \"\",\n // https://github.com/XaveScor/bobrik/issues/22#issuecomment-2308552352\n noEmit: false,\n },\n configFilePath,\n );\n\n if (!parsedConfig.options.verbatimModuleSyntax) {\n throw new Error(\n \"verbatimModuleSyntax should be enabled in tsconfig.json. Read https://github.com/XaveScor/smartbundle/issues/131 for more explanation.\\n\" +\n \"You also can upvote the issue if you need the support of verbatimModuleSyntax: false in your library\",\n );\n }\n\n const host = ts.createCompilerHost(parsedConfig.options);\n\n return { ts, parsedConfig, host };\n}\n\nexport async function detectModules(\n packageJson: PackageJson,\n dirs: Dirs,\n): Promise<\n | { error: false; modules: DetectedModules }\n | { error: true; errors: Array<string> }\n> {\n try {\n const result: DetectedModules = {};\n log(\"Detecting modules\");\n\n result.ts = await detectTypescript(packageJson, dirs);\n result.babel = await detectBabel(packageJson);\n result.react = await detectReact(packageJson);\n\n lineLog();\n return { error: false, modules: result };\n } catch (e: any) {\n return { error: true, errors: [e.message] };\n }\n}\n"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"detectModules.mjs","sources":["../../../../src/detectModules.ts"],"sourcesContent":["import { type PackageJson } from \"./packageJson.js\";\nimport semver from \"semver\";\nimport { okLog, errorLog, log, lineLog, warnLog } from \"./log.js\";\nimport type { Dirs } from \"./resolveDirs.js\";\nimport type { Monorepo } from \"./args.js\";\n\ntype DetectionResult<T> =\n // We have undefined here is module is not found\n // It is not an error because the user would disable some functionality by not installing deps\n { success: true; module: T | undefined } | { success: false; error: string };\n\ntype ModuleWithVersion<T> = T & { version: string };\n\ntype TSModuleData = {\n ts: typeof import(\"typescript\");\n parsedConfig: import(\"typescript\").ParsedCommandLine;\n host: import(\"typescript\").CompilerHost;\n};\n\ntype BabelModuleData = {\n babel: typeof import(\"@babel/core\");\n};\n\ntype ReactModuleData = {\n transform: \"legacy\" | \"modern\";\n};\n\nexport type TSModule = ModuleWithVersion<TSModuleData>;\nexport type BabelModule = ModuleWithVersion<BabelModuleData>;\nexport type ReactModule = ModuleWithVersion<ReactModuleData>;\n\nexport type DetectedModules = {\n ts?: TSModule;\n babel?: BabelModule;\n react?: ReactModule;\n};\n\nexport type DetectModulesResult =\n | { success: true; modules: DetectedModules }\n | { success: false; errors: string[] };\n\ntype DepType =\n | \"dependencies\"\n | \"devDependencies\"\n | \"peerDependencies\"\n | \"optionalDependencies\";\nexport function getMinVersion(\n packageJson: PackageJson,\n depName: string,\n exclude: DepType[],\n): semver.SemVer | null {\n const allDepKeys = new Set<DepType>([\n \"dependencies\",\n \"devDependencies\",\n \"peerDependencies\",\n \"optionalDependencies\",\n ]);\n for (const e of exclude) {\n allDepKeys.delete(e);\n }\n\n let minVersion: semver.SemVer | null = null;\n\n for (const depKey of allDepKeys) {\n const depVersion = packageJson[depKey]?.[depName];\n if (depVersion) {\n const version = semver.minVersion(depVersion);\n if (!version) {\n warnLog(\"node-semver cannot parse version of\", depName, \"from\", depKey);\n warnLog(\"Version:\", depVersion);\n continue;\n }\n if (!minVersion) {\n minVersion = version;\n continue;\n }\n if (semver.lt(version, minVersion)) {\n minVersion = version;\n }\n }\n }\n\n return minVersion;\n}\n\nasync function detectBabel(\n packageJson: PackageJson,\n isMonorepoPackage: boolean,\n): Promise<DetectionResult<BabelModule>> {\n const hasBabelInPackage = getMinVersion(packageJson, \"@babel/core\", [\n \"optionalDependencies\",\n ]);\n\n if (isMonorepoPackage && hasBabelInPackage) {\n return {\n success: false,\n error:\n `Babel found in package-level package.json for monorepo package \"${packageJson.name}\".\\n` +\n `In monorepos, build tools like Babel should be defined in the workspace root package.json, not in individual packages.\\n` +\n `Please move \"@babel/core\" from this package's dependencies/devDependencies to the root package.json's devDependencies.`,\n };\n }\n\n if (\"@babel/core\" in (packageJson.optionalDependencies ?? {})) {\n errorLog(\"babel excluded because inside optionalDependencies\");\n return {\n success: false,\n error: \"Babel excluded because it's in optionalDependencies\",\n };\n }\n\n // Check for babel in package deps\n const babelVersion = getMinVersion(packageJson, \"@babel/core\", [\n \"optionalDependencies\",\n ]);\n\n if (!babelVersion) {\n errorLog(\"babel\");\n return { success: true, module: undefined };\n }\n\n try {\n const babel = await import(\"@babel/core\");\n okLog(\"babel, version:\", babel.version);\n return {\n success: true,\n module: {\n babel,\n version: babel.version,\n },\n };\n } catch {\n errorLog(\"babel\");\n return { success: false, error: \"Failed to import @babel/core\" };\n }\n}\n\nasync function detectReact(\n packageJson: PackageJson,\n isMonorepoPackage: boolean,\n): Promise<DetectionResult<ReactModule>> {\n const reactVersionInPackage = getMinVersion(packageJson, \"react\", [\n \"devDependencies\",\n ]);\n\n if (isMonorepoPackage && reactVersionInPackage) {\n return {\n success: false,\n error:\n `React found in package-level package.json for monorepo package \"${packageJson.name}\".\\n` +\n `In monorepos, build tools like React should be defined in the workspace root package.json, not in individual packages.\\n` +\n `Please move \"react\" from this package's dependencies/peerDependencies to the root package.json's dependencies or peerDependencies.`,\n };\n }\n\n const reactVersion = getMinVersion(packageJson, \"react\", [\"devDependencies\"]);\n\n if (reactVersion) {\n const isLegacy = semver.lt(reactVersion, \"17.0.0\");\n const transform = isLegacy ? \"legacy\" : \"modern\";\n okLog(\n `react, min version: ${reactVersion.version}. Transform: ${transform}`,\n );\n return {\n success: true,\n module: {\n transform,\n version: reactVersion.version,\n },\n };\n }\n\n errorLog(\"react\");\n return { success: true, module: undefined };\n}\n\nasync function detectTypescript(\n packageJson: PackageJson,\n dirs: Dirs,\n monorepoType?: \"pnpm\" | null,\n): Promise<DetectionResult<TSModule>> {\n const typescriptVersion = getMinVersion(packageJson, \"typescript\", []);\n\n if (monorepoType != null && typescriptVersion) {\n return {\n success: false,\n error:\n `TypeScript found in package-level package.json for monorepo package \"${packageJson.name}\".\\n` +\n `In monorepos, build tools like TypeScript should be defined in the workspace root package.json, not in individual packages.\\n` +\n `Please move \"typescript\" from this package's dependencies/devDependencies to the root package.json's devDependencies.`,\n };\n }\n\n if (!typescriptVersion) {\n errorLog(\"typescript\");\n return { success: true, module: undefined };\n }\n\n let ts: typeof import(\"typescript\");\n try {\n // ts <=4.3 has no named exports. The all methods are located in the default export\n ts = (await import(\"typescript\")).default;\n } catch {\n if (monorepoType === \"pnpm\") {\n return {\n success: false,\n error:\n 'smartbundle found the .ts entrypoint but required \"typescript\" to build .d.ts files. ' +\n 'Please install the \"typescript\" dependency. ' +\n \"In pnpm workspaces, you may need to either:\\n\" +\n '1. Add \"hoist-workspace-packages=true\" to your pnpm-workspace.yaml file (recommended), or\\n' +\n '2. Add \"public-hoist-pattern[]=[\\\\\"typescript\\\\\"]\" to your pnpm-workspace.yaml file, or\\n' +\n '3. Add \"typescript\" as a devDependency in each package\\'s package.json\\n' +\n \"See https://pnpm.io/settings#dependency-hoisting-settings for more details.\",\n };\n } else {\n return {\n success: false,\n error:\n 'smartbundle found the .ts entrypoint but required \"typescript\" to build .d.ts files. ' +\n 'Please install the \"typescript\" dependency.',\n };\n }\n }\n\n okLog(\"typescript, version:\", ts.version);\n\n const configFilePath = ts.findConfigFile(dirs.sourceDir, ts.sys.fileExists);\n if (!configFilePath) {\n return {\n success: false,\n error:\n \"Cannot find a tsconfig.json file. You should declare it. Please, read the https://github.com/XaveScor/smartbundle/issues/131 for more information\",\n };\n }\n const configFile = ts.readConfigFile(configFilePath, ts.sys.readFile);\n if (configFile.error) {\n const readableError = ts.flattenDiagnosticMessageText(\n configFile.error.messageText,\n \"\\n\",\n );\n return {\n success: false,\n error: `Cannot read tsconfig.json file, error: ${readableError}`,\n };\n }\n const parsedConfig = ts.parseJsonConfigFileContent(\n configFile.config,\n ts.sys,\n dirs.sourceDir,\n {\n declaration: true,\n emitDeclarationOnly: true,\n strict: false,\n strictNullChecks: false,\n strictFunctionTypes: false,\n strictPropertyInitialization: false,\n skipLibCheck: true,\n skipDefaultLibCheck: true,\n outDir: \"\",\n // https://github.com/XaveScor/bobrik/issues/22#issuecomment-2308552352\n noEmit: false,\n },\n configFilePath,\n );\n\n if (!parsedConfig.options.verbatimModuleSyntax) {\n return {\n success: false,\n error:\n \"verbatimModuleSyntax should be enabled in tsconfig.json. Read https://github.com/XaveScor/smartbundle/issues/131 for more explanation.\\n\" +\n \"You also can upvote the issue if you need the support of verbatimModuleSyntax: false in your library\",\n };\n }\n\n const host = ts.createCompilerHost(parsedConfig.options);\n\n return {\n success: true,\n module: {\n ts,\n parsedConfig,\n host,\n version: ts.version,\n },\n };\n}\n\nexport async function detectModules(\n packageJson: PackageJson,\n dirs: Dirs,\n monorepo?: Monorepo,\n): Promise<DetectModulesResult> {\n if (!monorepo) {\n return detectPackageModules(packageJson, dirs);\n }\n\n // First, check if package has ts/babel (which is wrong in monorepo)\n const packageValidation = await detectPackageModules(\n packageJson,\n dirs,\n monorepo.type,\n );\n\n // Collect validation errors\n const errors: string[] = [];\n if (!packageValidation.success) {\n errors.push(...packageValidation.errors);\n } else {\n if (packageValidation.modules.ts) {\n errors.push(\n `Package \"${packageJson.name}\" has ts/babel in package.json, but it's not allowed in monorepo.`,\n );\n }\n if (packageValidation.modules.babel) {\n errors.push(\n `Package \"${packageJson.name}\" has babel in package.json, but it's not allowed in monorepo.`,\n );\n }\n }\n\n // Create merged package.json with workspace devDeps for ts/babel\n const mergedPackageJson: PackageJson = {\n ...packageJson,\n devDependencies: {\n ...monorepo.devDeps,\n ...packageJson.devDependencies,\n },\n };\n\n // Detect modules with merged package.json (ts/babel from workspace, react from package)\n const result = await detectPackageModules(mergedPackageJson, dirs);\n\n if (!result.success) {\n errors.push(...result.errors);\n }\n\n if (errors.length > 0) {\n return { success: false, errors };\n }\n\n return result;\n}\n\nasync function detectPackageModules(\n packageJson: PackageJson,\n dirs: Dirs,\n monorepoType?: \"pnpm\" | null,\n): Promise<DetectModulesResult> {\n log(\"Detecting modules\");\n\n const [tsResult, babelResult, reactResult] = await Promise.all([\n detectTypescript(packageJson, dirs, monorepoType),\n detectBabel(packageJson, monorepoType != null),\n detectReact(packageJson, monorepoType != null),\n ]);\n\n const errors: string[] = [];\n const modules: DetectedModules = {};\n\n if (!tsResult.success) {\n errors.push(tsResult.error);\n } else if (tsResult.module) {\n modules.ts = tsResult.module;\n }\n\n if (!babelResult.success) {\n errors.push(babelResult.error);\n } else if (babelResult.module) {\n modules.babel = babelResult.module;\n }\n\n if (!reactResult.success) {\n errors.push(reactResult.error);\n } else if (reactResult.module) {\n modules.react = reactResult.module;\n }\n\n lineLog();\n\n if (errors.length > 0) {\n return { success: false, errors };\n }\n\n return { success: true, modules };\n}\n"],"names":[],"mappings":"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"}
|
@@ -11,9 +11,13 @@ const errors = {
|
|
11
11
|
dependenciesInvalid: "The `dependencies` field must be an Object<string, string>. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#dependencies",
|
12
12
|
binFiled: "The `bin` field must be a path or Record<string, FilePath>. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#bin",
|
13
13
|
rollupError: "An error occurred while building the package. Please, report it to the issues on GitHub",
|
14
|
+
typescriptNotFound: "The package.json contains typescript entrypoints, but the typescript package is not found. Please, install typescript@^5.0.0",
|
14
15
|
optionalDependenciesInvalid: "The `optionalDependencies` field must be an Object<string, string>. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#optionaldependencies",
|
16
|
+
repositoryInvalid: "The `repository` field must be an object with 'type' and 'url' properties or a string. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#repository",
|
15
17
|
keywordsInvalid: "The `keywords` field must be an array of strings. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#keywords",
|
18
|
+
authorInvalid: "The `author` field must be an object or a string. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#people-fields-author-contributors",
|
16
19
|
contributorsInvalid: "The `contributors` field must be an array of objects or strings. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#people-fields-author-contributors",
|
20
|
+
licenseInvalid: "The `license` field must be a string specifying the license. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#license",
|
17
21
|
devDependenciesInvalid: "The `devDependencies` field must be an Object<string, string>. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#devdependencies",
|
18
22
|
peerDependenciesInvalid: "The `peerDependencies` field must be an Object<string, string>. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#peerdependencies",
|
19
23
|
enginesInvalid: "The `engines` field must be an object specifying version requirements. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#engines",
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"errors.mjs","sources":["../../../../src/errors.ts"],"sourcesContent":["export const errors = {\n exportsRequired:\n \"The `exports` or `bin` field is required. Please, verify the value. More info: https://nodejs.org/api/packages.html#package-entry-points\",\n exportsInvalid:\n \"The `exports` field must be a path to entrypoint. Please, verify the value. More info: https://nodejs.org/api/packages.html#package-entry-points\",\n nameRequired:\n \"The `name` field is required string. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#name\",\n nameMinLength:\n 'Min length of \"name\" is 1 character. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#name',\n nameMaxLength:\n 'Max length of \"name\" is 214 characters. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#name',\n nameStartsIllegalChars:\n \"Name cannot start with `_` or `.` if it is not a scoped package. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#name\",\n versionRequired:\n \"The `version` field is required string. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#version\",\n privateIsTrue:\n \"The `private` field must be `true` for avoiding accidental publish. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#private\",\n descriptionString:\n \"The `description` field must be a string. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#description\",\n dependenciesInvalid:\n \"The `dependencies` field must be an Object<string, string>. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#dependencies\",\n binFiled:\n \"The `bin` field must be a path or Record<string, FilePath>. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#bin\",\n rollupError:\n \"An error occurred while building the package. Please, report it to the issues on GitHub\",\n typescriptNotFound:\n \"The package.json contains typescript entrypoints, but the typescript package is not found. Please, install typescript@^5.0.0\",\n optionalDependenciesInvalid:\n \"The `optionalDependencies` field must be an Object<string, string>. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#optionaldependencies\",\n repositoryInvalid:\n \"The `repository` field must be an object with 'type' and 'url' properties or a string. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#repository\",\n keywordsInvalid:\n \"The `keywords` field must be an array of strings. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#keywords\",\n authorInvalid:\n \"The `author` field must be an object or a string. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#people-fields-author-contributors\",\n contributorsInvalid:\n \"The `contributors` field must be an array of objects or strings. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#people-fields-author-contributors\",\n licenseInvalid:\n \"The `license` field must be a string specifying the license. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#license\",\n devDependenciesInvalid:\n \"The `devDependencies` field must be an Object<string, string>. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#devdependencies\",\n peerDependenciesInvalid:\n \"The `peerDependencies` field must be an Object<string, string>. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#peerdependencies\",\n enginesInvalid:\n \"The `engines` field must be an object specifying version requirements. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#engines\",\n browserInvalid:\n \"The `browser` field must be a string or an object. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#browser\",\n fundingInvalid:\n \"The `funding` field must be an object or a string. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#funding\",\n osInvalid:\n \"The `os` field must be an array of strings. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#os\",\n cpuInvalid:\n \"The `cpu` field must be an array of strings. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#cpu\",\n};\n"],"names":[],"mappings":"AAAO,MAAM,SAAS;AAAA,EACpB,iBACE;AAAA,EACF,gBACE;AAAA,EACF,cACE;AAAA,EACF,eACE;AAAA,EACF,eACE;AAAA,EACF,wBACE;AAAA,EACF,iBACE;AAAA,EACF,eACE;AAAA,EACF,mBACE;AAAA,EACF,qBACE;AAAA,EACF,UACE;AAAA,EACF,aACE;AAAA,
|
1
|
+
{"version":3,"file":"errors.mjs","sources":["../../../../src/errors.ts"],"sourcesContent":["export const errors = {\n exportsRequired:\n \"The `exports` or `bin` field is required. Please, verify the value. More info: https://nodejs.org/api/packages.html#package-entry-points\",\n exportsInvalid:\n \"The `exports` field must be a path to entrypoint. Please, verify the value. More info: https://nodejs.org/api/packages.html#package-entry-points\",\n nameRequired:\n \"The `name` field is required string. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#name\",\n nameMinLength:\n 'Min length of \"name\" is 1 character. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#name',\n nameMaxLength:\n 'Max length of \"name\" is 214 characters. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#name',\n nameStartsIllegalChars:\n \"Name cannot start with `_` or `.` if it is not a scoped package. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#name\",\n versionRequired:\n \"The `version` field is required string. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#version\",\n privateIsTrue:\n \"The `private` field must be `true` for avoiding accidental publish. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#private\",\n descriptionString:\n \"The `description` field must be a string. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#description\",\n dependenciesInvalid:\n \"The `dependencies` field must be an Object<string, string>. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#dependencies\",\n binFiled:\n \"The `bin` field must be a path or Record<string, FilePath>. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#bin\",\n rollupError:\n \"An error occurred while building the package. Please, report it to the issues on GitHub\",\n typescriptNotFound:\n \"The package.json contains typescript entrypoints, but the typescript package is not found. Please, install typescript@^5.0.0\",\n optionalDependenciesInvalid:\n \"The `optionalDependencies` field must be an Object<string, string>. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#optionaldependencies\",\n repositoryInvalid:\n \"The `repository` field must be an object with 'type' and 'url' properties or a string. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#repository\",\n keywordsInvalid:\n \"The `keywords` field must be an array of strings. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#keywords\",\n authorInvalid:\n \"The `author` field must be an object or a string. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#people-fields-author-contributors\",\n contributorsInvalid:\n \"The `contributors` field must be an array of objects or strings. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#people-fields-author-contributors\",\n licenseInvalid:\n \"The `license` field must be a string specifying the license. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#license\",\n devDependenciesInvalid:\n \"The `devDependencies` field must be an Object<string, string>. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#devdependencies\",\n peerDependenciesInvalid:\n \"The `peerDependencies` field must be an Object<string, string>. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#peerdependencies\",\n enginesInvalid:\n \"The `engines` field must be an object specifying version requirements. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#engines\",\n browserInvalid:\n \"The `browser` field must be a string or an object. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#browser\",\n fundingInvalid:\n \"The `funding` field must be an object or a string. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#funding\",\n osInvalid:\n \"The `os` field must be an array of strings. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#os\",\n cpuInvalid:\n \"The `cpu` field must be an array of strings. Please, verify the value. More info: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#cpu\",\n};\n"],"names":[],"mappings":"AAAO,MAAM,SAAS;AAAA,EACpB,iBACE;AAAA,EACF,gBACE;AAAA,EACF,cACE;AAAA,EACF,eACE;AAAA,EACF,eACE;AAAA,EACF,wBACE;AAAA,EACF,iBACE;AAAA,EACF,eACE;AAAA,EACF,mBACE;AAAA,EACF,qBACE;AAAA,EACF,UACE;AAAA,EACF,aACE;AAAA,EACF,oBACE;AAAA,EACF,6BACE;AAAA,EACF,mBACE;AAAA,EACF,iBACE;AAAA,EACF,eACE;AAAA,EACF,qBACE;AAAA,EACF,gBACE;AAAA,EACF,wBACE;AAAA,EACF,yBACE;AAAA,EACF,gBACE;AAAA,EACF,gBACE;AAAA,EACF,gBACE;AAAA,EACF,WACE;AAAA,EACF,YACE;AACJ;"}
|
@@ -2,7 +2,7 @@ import { type Args } from "./args.js";
|
|
2
2
|
import { PrettyError } from "./PrettyErrors.js";
|
3
3
|
export declare function defineViteConfig(args?: Args): Promise<import("vite").UserConfig | {
|
4
4
|
error: boolean;
|
5
|
-
errors:
|
5
|
+
errors: any;
|
6
6
|
}>;
|
7
7
|
type RunResult = {
|
8
8
|
error: false;
|
@@ -9,6 +9,7 @@ import { buildTypesTask } from "./tasks/buildTypesTask/buildTypesTask.mjs";
|
|
9
9
|
import { BuildError } from "./error.mjs";
|
10
10
|
import { jsFilesTask } from "./tasks/jsFilesTask.mjs";
|
11
11
|
import { binsTask } from "./tasks/binsTask.mjs";
|
12
|
+
import { gitignoreTask } from "./tasks/gitignoreTask.mjs";
|
12
13
|
import { detectModules } from "./detectModules.mjs";
|
13
14
|
import { lineLog, log, disableLog } from "./log.mjs";
|
14
15
|
import { runSettled } from "./pipeline.mjs";
|
@@ -31,8 +32,8 @@ async function defineViteConfig(args = {}) {
|
|
31
32
|
console.error(packageJson);
|
32
33
|
throw new Error("Failed to parse package.json");
|
33
34
|
}
|
34
|
-
const modulesResult = await detectModules(packageJson, dirs);
|
35
|
-
if (modulesResult.
|
35
|
+
const modulesResult = await detectModules(packageJson, dirs, args.monorepo);
|
36
|
+
if (!modulesResult.success) {
|
36
37
|
return { error: true, errors: modulesResult.errors };
|
37
38
|
}
|
38
39
|
const { modules } = modulesResult;
|
@@ -49,12 +50,12 @@ async function run(args) {
|
|
49
50
|
const { sourceDir, outDir, packagePath, outBinsDir } = dirs;
|
50
51
|
await rm(outDir, { recursive: true, force: true });
|
51
52
|
await mkdir(outDir, { recursive: true });
|
52
|
-
|
53
|
+
let packageJson = await parsePackageJson({ sourceDir, packagePath });
|
53
54
|
if (Array.isArray(packageJson)) {
|
54
55
|
return { error: true, errors: packageJson };
|
55
56
|
}
|
56
|
-
const modulesResult = await detectModules(packageJson, dirs);
|
57
|
-
if (modulesResult.
|
57
|
+
const modulesResult = await detectModules(packageJson, dirs, args.monorepo);
|
58
|
+
if (!modulesResult.success) {
|
58
59
|
return { error: true, errors: modulesResult.errors };
|
59
60
|
}
|
60
61
|
const { modules } = modulesResult;
|
@@ -129,6 +130,11 @@ async function run(args) {
|
|
129
130
|
exportsMap,
|
130
131
|
binsMap
|
131
132
|
});
|
133
|
+
if (!args.skipGitignore) {
|
134
|
+
await gitignoreTask({
|
135
|
+
dirs
|
136
|
+
});
|
137
|
+
}
|
132
138
|
lineLog();
|
133
139
|
log(`Build finished: ./${relative(sourceDir, outDir)}`);
|
134
140
|
return { error: false };
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../src/index.ts"],"sourcesContent":["import { relative } from \"node:path\";\nimport { mkdir, rm } from \"node:fs/promises\";\nimport { parsePackageJson } from \"./packageJson.js\";\nimport { type ExportsObject, writePackageJson } from \"./writePackageJson.js\";\nimport { resolveDirs } from \"./resolveDirs.js\";\nimport { createViteConfig } from \"./createViteConfig.js\";\nimport { copyStaticFilesTask } from \"./tasks/copyStaticFilesTask.js\";\nimport { buildTypesTask } from \"./tasks/buildTypesTask/buildTypesTask.js\";\nimport { BuildError } from \"./error.js\";\nimport { jsFilesTask } from \"./tasks/jsFilesTask.js\";\nimport { binsTask } from \"./tasks/binsTask.js\";\nimport { detectModules } from \"./detectModules.js\";\nimport { disableLog, lineLog, log
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/index.ts"],"sourcesContent":["import { relative } from \"node:path\";\nimport { mkdir, rm } from \"node:fs/promises\";\nimport { parsePackageJson } from \"./packageJson.js\";\nimport { type ExportsObject, writePackageJson } from \"./writePackageJson.js\";\nimport { resolveDirs } from \"./resolveDirs.js\";\nimport { createViteConfig } from \"./createViteConfig.js\";\nimport { copyStaticFilesTask } from \"./tasks/copyStaticFilesTask.js\";\nimport { buildTypesTask } from \"./tasks/buildTypesTask/buildTypesTask.js\";\nimport { BuildError } from \"./error.js\";\nimport { jsFilesTask } from \"./tasks/jsFilesTask.js\";\nimport { binsTask } from \"./tasks/binsTask.js\";\nimport { gitignoreTask } from \"./tasks/gitignoreTask.js\";\nimport { detectModules } from \"./detectModules.js\";\nimport { disableLog, lineLog, log } from \"./log.js\";\nimport { runSettled } from \"./pipeline.js\";\nimport { type Args } from \"./args.js\";\nimport { viteTask } from \"./tasks/viteTask.js\";\nimport { promiseSettledResultErrors } from \"./promiseSettledResultErrors.js\";\nimport { PrettyError } from \"./PrettyErrors.js\";\n\nfunction setExports(\n exportsMap: Map<string, ExportsObject>,\n exportName: string,\n mapFn: (entry: ExportsObject) => ExportsObject,\n) {\n const entry = exportsMap.get(exportName) ?? ({} as ExportsObject);\n exportsMap.set(exportName, mapFn(entry));\n}\n\nexport async function defineViteConfig(args: Args = {}) {\n disableLog();\n const dirs = resolveDirs(args);\n const { sourceDir, outDir, packagePath } = dirs;\n\n await rm(outDir, { recursive: true, force: true });\n await mkdir(outDir, { recursive: true });\n const packageJson = await parsePackageJson({ sourceDir, packagePath });\n\n if (Array.isArray(packageJson)) {\n console.error(packageJson);\n throw new Error(\"Failed to parse package.json\");\n }\n\n const modulesResult = await detectModules(packageJson, dirs, args.monorepo);\n if (!modulesResult.success) {\n return { error: true, errors: modulesResult.errors };\n }\n const { modules } = modulesResult;\n const { viteConfig } = createViteConfig({\n dirs,\n packageJson,\n modules,\n test: true,\n });\n\n return viteConfig;\n}\n\ntype RunResult =\n | {\n error: false;\n }\n | {\n error: true;\n errors: Array<string | PrettyError>;\n };\n\nexport async function run(args: Args): Promise<RunResult> {\n const dirs = resolveDirs(args);\n const { sourceDir, outDir, packagePath, outBinsDir } = dirs;\n\n await rm(outDir, { recursive: true, force: true });\n await mkdir(outDir, { recursive: true });\n let packageJson = await parsePackageJson({ sourceDir, packagePath });\n\n if (Array.isArray(packageJson)) {\n return { error: true, errors: packageJson };\n }\n\n const modulesResult = await detectModules(packageJson, dirs, args.monorepo);\n if (!modulesResult.success) {\n return { error: true, errors: modulesResult.errors };\n }\n const { modules } = modulesResult;\n const { viteConfig, entrypoints, bins } = createViteConfig({\n dirs,\n packageJson,\n modules,\n });\n\n const exportsMap = new Map<string, ExportsObject>();\n const binsMap = new Map<string, string>();\n\n const tasksRes = await runSettled(args, [\n copyStaticFilesTask(sourceDir, outDir),\n buildTypesTask({\n dirs,\n packageJson,\n entrypoints,\n modules,\n }).then(({ entrypointToEsDtsMap, entrypointToCjsDtsMap }) => {\n for (const [entrypoint, dts] of entrypointToEsDtsMap) {\n setExports(exportsMap, entrypoint, (entry) => {\n entry.dmts = \"./\" + relative(outDir, dts);\n return entry;\n });\n }\n\n for (const [entrypoint, dts] of entrypointToCjsDtsMap) {\n setExports(exportsMap, entrypoint, (entry) => {\n entry.dcts = \"./\" + relative(outDir, dts);\n return entry;\n });\n }\n }),\n viteTask({ viteConfig }).then((viteOutput) =>\n runSettled(args, [\n jsFilesTask({ buildOutput: viteOutput, entrypoints, outDir }).then(\n (res) => {\n for (const [filePath, name] of res) {\n setExports(exportsMap, name, (entry) => {\n const format = filePath.endsWith(\".js\") ? \"cjs\" : \"es\";\n if (format === \"es\") {\n entry.mjs = \"./\" + filePath;\n } else if (format === \"cjs\") {\n entry.cjs = \"./\" + filePath;\n }\n return entry;\n });\n }\n },\n ),\n binsTask({ outBinsDir, bins, buildOutput: viteOutput, outDir }).then(\n (res) => {\n for (const [value, key] of res) {\n binsMap.set(key, value);\n }\n },\n ),\n ]),\n ),\n ]);\n\n const errors = promiseSettledResultErrors(tasksRes).map((res) => {\n if (res instanceof PrettyError) {\n return res;\n }\n\n if (res instanceof BuildError) {\n return res.error;\n }\n\n return res.message;\n });\n\n if (errors.length > 0) {\n return { error: true, errors };\n }\n\n await writePackageJson(outDir, packageJson, {\n exportsMap,\n binsMap,\n });\n\n if (!args.skipGitignore) {\n await gitignoreTask({\n dirs,\n });\n }\n\n lineLog();\n log(`Build finished: ./${relative(sourceDir, outDir)}`);\n return { error: false };\n}\n"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,62 @@
|
|
1
|
+
import { join } from "node:path";
|
2
|
+
import { parseMonorepo } from "./parseMonorepo/parseMonorepo.mjs";
|
3
|
+
import { run } from "../index.mjs";
|
4
|
+
import "../args.mjs";
|
5
|
+
import { log, lineLog } from "../log.mjs";
|
6
|
+
import { PrettyError } from "../PrettyErrors.mjs";
|
7
|
+
async function buildMonorepo(args) {
|
8
|
+
const sourceDir = args.sourceDir || process.cwd();
|
9
|
+
const { monorepo, projectPaths } = await parseMonorepo({ sourceDir });
|
10
|
+
if (!monorepo) {
|
11
|
+
throw new PrettyError("Not a monorepo - pnpm-workspace.yaml not found");
|
12
|
+
}
|
13
|
+
if (projectPaths.length === 0) {
|
14
|
+
throw new PrettyError(
|
15
|
+
"No packages with -sbsources suffix found in monorepo"
|
16
|
+
);
|
17
|
+
}
|
18
|
+
log(`Found ${projectPaths.length} packages to build in monorepo`);
|
19
|
+
lineLog();
|
20
|
+
const result = {
|
21
|
+
totalPackages: projectPaths.length,
|
22
|
+
successfulBuilds: 0,
|
23
|
+
failedBuilds: 0,
|
24
|
+
errors: []
|
25
|
+
};
|
26
|
+
for (let i = 0; i < projectPaths.length; i++) {
|
27
|
+
const packagePath = projectPaths[i];
|
28
|
+
const packageSourceDir = join(sourceDir, packagePath);
|
29
|
+
log(`[${i + 1}/${projectPaths.length}] Building ${packagePath}...`);
|
30
|
+
const packageArgs = {
|
31
|
+
...args,
|
32
|
+
sourceDir: packageSourceDir,
|
33
|
+
packagePath: join(packageSourceDir, "package.json"),
|
34
|
+
outputDir: join(packageSourceDir, "sb-dist"),
|
35
|
+
monorepo
|
36
|
+
};
|
37
|
+
const buildResult = await run(packageArgs);
|
38
|
+
if (buildResult.error) {
|
39
|
+
result.failedBuilds++;
|
40
|
+
result.errors.push({
|
41
|
+
packagePath,
|
42
|
+
errors: buildResult.errors
|
43
|
+
});
|
44
|
+
log(
|
45
|
+
`[${i + 1}/${projectPaths.length}] ❌ Failed to build ${packagePath}`
|
46
|
+
);
|
47
|
+
} else {
|
48
|
+
result.successfulBuilds++;
|
49
|
+
log(`[${i + 1}/${projectPaths.length}] ✅ Built ${packagePath}`);
|
50
|
+
}
|
51
|
+
lineLog();
|
52
|
+
}
|
53
|
+
log(`Monorepo build completed:`);
|
54
|
+
log(` Total packages: ${result.totalPackages}`);
|
55
|
+
log(` Successful: ${result.successfulBuilds}`);
|
56
|
+
log(` Failed: ${result.failedBuilds}`);
|
57
|
+
return result;
|
58
|
+
}
|
59
|
+
export {
|
60
|
+
buildMonorepo
|
61
|
+
};
|
62
|
+
//# sourceMappingURL=buildAll.mjs.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"buildAll.mjs","sources":["../../../../../src/monorepo/buildAll.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { parseMonorepo } from \"./parseMonorepo/parseMonorepo.js\";\nimport { run } from \"../index.js\";\nimport { type Args } from \"../args.js\";\nimport { log, lineLog } from \"../log.js\";\nimport { PrettyError } from \"../PrettyErrors.js\";\n\nexport type MonorepoBuildResult = {\n totalPackages: number;\n successfulBuilds: number;\n failedBuilds: number;\n errors: Array<{ packagePath: string; errors: Array<string | PrettyError> }>;\n};\n\nexport async function buildMonorepo(args: Args): Promise<MonorepoBuildResult> {\n const sourceDir = args.sourceDir || process.cwd();\n\n // Use existing monorepo detection\n const { monorepo, projectPaths } = await parseMonorepo({ sourceDir });\n\n if (!monorepo) {\n throw new PrettyError(\"Not a monorepo - pnpm-workspace.yaml not found\");\n }\n\n if (projectPaths.length === 0) {\n throw new PrettyError(\n \"No packages with -sbsources suffix found in monorepo\",\n );\n }\n\n log(`Found ${projectPaths.length} packages to build in monorepo`);\n lineLog();\n\n const result: MonorepoBuildResult = {\n totalPackages: projectPaths.length,\n successfulBuilds: 0,\n failedBuilds: 0,\n errors: [],\n };\n\n // Build each package sequentially for now\n // TODO: Add dependency analysis and parallel builds\n for (let i = 0; i < projectPaths.length; i++) {\n const packagePath = projectPaths[i];\n const packageSourceDir = join(sourceDir, packagePath);\n\n log(`[${i + 1}/${projectPaths.length}] Building ${packagePath}...`);\n\n // Create args for this specific package\n const packageArgs: Args = {\n ...args,\n sourceDir: packageSourceDir,\n packagePath: join(packageSourceDir, \"package.json\"),\n outputDir: join(packageSourceDir, \"sb-dist\"),\n monorepo,\n };\n\n // Reuse existing run logic\n const buildResult = await run(packageArgs);\n\n if (buildResult.error) {\n result.failedBuilds++;\n result.errors.push({\n packagePath,\n errors: buildResult.errors,\n });\n log(\n `[${i + 1}/${projectPaths.length}] ❌ Failed to build ${packagePath}`,\n );\n } else {\n result.successfulBuilds++;\n log(`[${i + 1}/${projectPaths.length}] ✅ Built ${packagePath}`);\n }\n\n lineLog();\n }\n\n // Summary\n log(`Monorepo build completed:`);\n log(` Total packages: ${result.totalPackages}`);\n log(` Successful: ${result.successfulBuilds}`);\n log(` Failed: ${result.failedBuilds}`);\n\n return result;\n}\n"],"names":[],"mappings":";;;;;;AAcA,eAAsB,cAAc,MAA0C;AAC5E,QAAM,YAAY,KAAK,aAAa,QAAQ,IAAI;AAG1C,QAAA,EAAE,UAAU,aAAa,IAAI,MAAM,cAAc,EAAE,WAAW;AAEpE,MAAI,CAAC,UAAU;AACP,UAAA,IAAI,YAAY,gDAAgD;AAAA,EAAA;AAGpE,MAAA,aAAa,WAAW,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EAAA;AAGE,MAAA,SAAS,aAAa,MAAM,gCAAgC;AACxD,UAAA;AAER,QAAM,SAA8B;AAAA,IAClC,eAAe,aAAa;AAAA,IAC5B,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,QAAQ,CAAA;AAAA,EACV;AAIA,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AACtC,UAAA,cAAc,aAAa,CAAC;AAC5B,UAAA,mBAAmB,KAAK,WAAW,WAAW;AAEhD,QAAA,IAAI,IAAI,CAAC,IAAI,aAAa,MAAM,cAAc,WAAW,KAAK;AAGlE,UAAM,cAAoB;AAAA,MACxB,GAAG;AAAA,MACH,WAAW;AAAA,MACX,aAAa,KAAK,kBAAkB,cAAc;AAAA,MAClD,WAAW,KAAK,kBAAkB,SAAS;AAAA,MAC3C;AAAA,IACF;AAGM,UAAA,cAAc,MAAM,IAAI,WAAW;AAEzC,QAAI,YAAY,OAAO;AACd,aAAA;AACP,aAAO,OAAO,KAAK;AAAA,QACjB;AAAA,QACA,QAAQ,YAAY;AAAA,MAAA,CACrB;AACD;AAAA,QACE,IAAI,IAAI,CAAC,IAAI,aAAa,MAAM,uBAAuB,WAAW;AAAA,MACpE;AAAA,IAAA,OACK;AACE,aAAA;AACH,UAAA,IAAI,IAAI,CAAC,IAAI,aAAa,MAAM,aAAa,WAAW,EAAE;AAAA,IAAA;AAGxD,YAAA;AAAA,EAAA;AAIV,MAAI,2BAA2B;AAC3B,MAAA,qBAAqB,OAAO,aAAa,EAAE;AAC3C,MAAA,iBAAiB,OAAO,gBAAgB,EAAE;AAC1C,MAAA,aAAa,OAAO,YAAY,EAAE;AAE/B,SAAA;AACT;"}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import type { PackageJson } from "../packageJson.js";
|
2
|
+
export declare function convertPackageJson(packageJson: PackageJson): {
|
3
|
+
exports?: Map<string, string>;
|
4
|
+
name?: string;
|
5
|
+
version?: string;
|
6
|
+
private?: boolean;
|
7
|
+
description?: string;
|
8
|
+
dependencies?: Record<string, string>;
|
9
|
+
optionalDependencies?: Record<string, string>;
|
10
|
+
bin?: Map<string, string>;
|
11
|
+
repository?: any;
|
12
|
+
keywords?: string[];
|
13
|
+
author?: any;
|
14
|
+
contributors?: (string | {})[];
|
15
|
+
license?: any;
|
16
|
+
devDependencies?: Record<string, string>;
|
17
|
+
peerDependencies?: Record<string, string>;
|
18
|
+
engines?: Record<string, string>;
|
19
|
+
browser?: string | Record<string, string>;
|
20
|
+
funding?: string | {};
|
21
|
+
os?: string[];
|
22
|
+
cpu?: string[];
|
23
|
+
scripts?: any;
|
24
|
+
maintainers?: any;
|
25
|
+
bugs?: any;
|
26
|
+
sideEffects?: any;
|
27
|
+
unpkg?: any;
|
28
|
+
homepage?: any;
|
29
|
+
babel?: any;
|
30
|
+
peerDependenciesMeta?: any;
|
31
|
+
};
|
@@ -0,0 +1,40 @@
|
|
1
|
+
const monorepoPostfix = "-sbsources";
|
2
|
+
const monorepoPostfixRegex = new RegExp(`${monorepoPostfix}$`);
|
3
|
+
function walkOverMonorepoDepsToRemovePostfix(deps) {
|
4
|
+
if (!deps) {
|
5
|
+
return void 0;
|
6
|
+
}
|
7
|
+
const res = {};
|
8
|
+
for (const [key, value] of Object.entries(deps)) {
|
9
|
+
if (key.endsWith(monorepoPostfix)) {
|
10
|
+
res[key.replace(monorepoPostfixRegex, "")] = value;
|
11
|
+
} else {
|
12
|
+
res[key] = value;
|
13
|
+
}
|
14
|
+
}
|
15
|
+
return res;
|
16
|
+
}
|
17
|
+
const allDepsClauses = [
|
18
|
+
"dependencies",
|
19
|
+
"optionalDependencies",
|
20
|
+
"peerDependencies",
|
21
|
+
"devDependencies"
|
22
|
+
];
|
23
|
+
function convertPackageJson(packageJson) {
|
24
|
+
if (packageJson.name.endsWith(monorepoPostfix)) {
|
25
|
+
const originalName = packageJson.name;
|
26
|
+
packageJson.name = packageJson.name.replace(monorepoPostfix, "");
|
27
|
+
for (const depClause of allDepsClauses) {
|
28
|
+
packageJson[depClause] = walkOverMonorepoDepsToRemovePostfix(
|
29
|
+
packageJson[depClause]
|
30
|
+
);
|
31
|
+
}
|
32
|
+
packageJson.devDependencies = packageJson.devDependencies ?? {};
|
33
|
+
packageJson.devDependencies[originalName] = "workspace:*";
|
34
|
+
}
|
35
|
+
return packageJson;
|
36
|
+
}
|
37
|
+
export {
|
38
|
+
convertPackageJson
|
39
|
+
};
|
40
|
+
//# sourceMappingURL=convertPackageJson.mjs.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"convertPackageJson.mjs","sources":["../../../../../src/monorepo/convertPackageJson.ts"],"sourcesContent":["import type { PackageJson } from \"../packageJson.js\";\n\nconst monorepoPostfix = \"-sbsources\";\nconst monorepoPostfixRegex = new RegExp(`${monorepoPostfix}$`);\n\nfunction walkOverMonorepoDepsToRemovePostfix(\n deps: Record<string, string> | undefined,\n) {\n if (!deps) {\n return undefined;\n }\n\n const res: Record<string, string> = {};\n for (const [key, value] of Object.entries(deps)) {\n if (key.endsWith(monorepoPostfix)) {\n res[key.replace(monorepoPostfixRegex, \"\")] = value;\n } else {\n res[key] = value;\n }\n }\n return res;\n}\n\nconst allDepsClauses = [\n \"dependencies\",\n \"optionalDependencies\",\n \"peerDependencies\",\n \"devDependencies\",\n] as const;\n\nexport function convertPackageJson(packageJson: PackageJson) {\n if (packageJson.name.endsWith(monorepoPostfix)) {\n const originalName = packageJson.name;\n packageJson.name = packageJson.name.replace(monorepoPostfix, \"\");\n\n for (const depClause of allDepsClauses) {\n packageJson[depClause] = walkOverMonorepoDepsToRemovePostfix(\n packageJson[depClause],\n );\n }\n\n // add the sources to the devDeps to create a wire between source and dist\n packageJson.devDependencies = packageJson.devDependencies ?? {};\n packageJson.devDependencies[originalName] = \"workspace:*\";\n }\n\n return packageJson;\n}\n"],"names":[],"mappings":"AAEA,MAAM,kBAAkB;AACxB,MAAM,uBAAuB,IAAI,OAAO,GAAG,eAAe,GAAG;AAE7D,SAAS,oCACP,MACA;AACA,MAAI,CAAC,MAAM;AACF,WAAA;AAAA,EAAA;AAGT,QAAM,MAA8B,CAAC;AACrC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC3C,QAAA,IAAI,SAAS,eAAe,GAAG;AACjC,UAAI,IAAI,QAAQ,sBAAsB,EAAE,CAAC,IAAI;AAAA,IAAA,OACxC;AACL,UAAI,GAAG,IAAI;AAAA,IAAA;AAAA,EACb;AAEK,SAAA;AACT;AAEA,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,mBAAmB,aAA0B;AAC3D,MAAI,YAAY,KAAK,SAAS,eAAe,GAAG;AAC9C,UAAM,eAAe,YAAY;AACjC,gBAAY,OAAO,YAAY,KAAK,QAAQ,iBAAiB,EAAE;AAE/D,eAAW,aAAa,gBAAgB;AACtC,kBAAY,SAAS,IAAI;AAAA,QACvB,YAAY,SAAS;AAAA,MACvB;AAAA,IAAA;AAIU,gBAAA,kBAAkB,YAAY,mBAAmB,CAAC;AAClD,gBAAA,gBAAgB,YAAY,IAAI;AAAA,EAAA;AAGvC,SAAA;AACT;"}
|