@a35hie/ts-pkg 0.2.0 → 0.3.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 +10 -10
- package/dist/cli.js +22 -455
- package/dist/main.d.ts +5 -1
- package/dist/main.js +2 -272
- package/package.json +1 -1
- package/dist/main.js.map +0 -15
package/README.md
CHANGED
|
@@ -22,12 +22,12 @@ bun add -D @a35hie/ts-pkg
|
|
|
22
22
|
|
|
23
23
|
## Usage
|
|
24
24
|
|
|
25
|
-
Create a `package.
|
|
25
|
+
Create a `package.ts` file:
|
|
26
26
|
|
|
27
27
|
```typescript
|
|
28
|
-
import {
|
|
28
|
+
import { definePackage } from '@a35hie/ts-pkg'
|
|
29
29
|
|
|
30
|
-
export default
|
|
30
|
+
export default definePackage({
|
|
31
31
|
name: 'my-awesome-package',
|
|
32
32
|
version: '1.0.0',
|
|
33
33
|
description: 'An awesome package',
|
|
@@ -74,7 +74,7 @@ Generate your `package.json`:
|
|
|
74
74
|
```bash
|
|
75
75
|
bunx ts-pkg
|
|
76
76
|
# or
|
|
77
|
-
bunx ts-pkg package.
|
|
77
|
+
bunx ts-pkg package.ts package.json
|
|
78
78
|
```
|
|
79
79
|
|
|
80
80
|
## Syncing Dependencies
|
|
@@ -87,10 +87,10 @@ bun add lodash axios
|
|
|
87
87
|
ts-pkg sync
|
|
88
88
|
|
|
89
89
|
# Or specify paths
|
|
90
|
-
ts-pkg sync package.
|
|
90
|
+
ts-pkg sync package.ts package.json
|
|
91
91
|
```
|
|
92
92
|
|
|
93
|
-
This keeps your `package.
|
|
93
|
+
This keeps your `package.ts` as the source of truth while still allowing quick installs via your package manager.
|
|
94
94
|
|
|
95
95
|
## Script Presets
|
|
96
96
|
|
|
@@ -109,15 +109,15 @@ Extend from a base config:
|
|
|
109
109
|
|
|
110
110
|
```typescript
|
|
111
111
|
// base.config.ts
|
|
112
|
-
export default
|
|
112
|
+
export default definePackage({
|
|
113
113
|
author: 'Your Name',
|
|
114
114
|
license: 'MIT',
|
|
115
115
|
scriptPresets: ['typescript', 'prettier'],
|
|
116
116
|
devDependencies: ['typescript', 'prettier'],
|
|
117
117
|
})
|
|
118
118
|
|
|
119
|
-
// package.
|
|
120
|
-
export default
|
|
119
|
+
// package.ts
|
|
120
|
+
export default definePackage({
|
|
121
121
|
extends: './base.config.ts',
|
|
122
122
|
name: 'my-package',
|
|
123
123
|
dependencies: ['lodash'],
|
|
@@ -151,7 +151,7 @@ conditions: [
|
|
|
151
151
|
|
|
152
152
|
## API
|
|
153
153
|
|
|
154
|
-
### `
|
|
154
|
+
### `definePackage(config: PackageConfig): PackageConfig`
|
|
155
155
|
|
|
156
156
|
Type-safe helper for defining your configuration.
|
|
157
157
|
|
package/dist/cli.js
CHANGED
|
@@ -1,405 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
// src/presets/scripts.ts
|
|
6
|
-
var scriptPresets = {
|
|
7
|
-
typescript: {
|
|
8
|
-
build: "tsc",
|
|
9
|
-
"build:watch": "tsc --watch",
|
|
10
|
-
typecheck: "tsc --noEmit"
|
|
11
|
-
},
|
|
12
|
-
react: {
|
|
13
|
-
dev: "vite",
|
|
14
|
-
build: "vite build",
|
|
15
|
-
preview: "vite preview"
|
|
16
|
-
},
|
|
17
|
-
node: {
|
|
18
|
-
start: "node dist/index.js",
|
|
19
|
-
dev: "tsx watch src/index.ts",
|
|
20
|
-
build: "tsup src/index.ts --format esm,cjs --dts"
|
|
21
|
-
},
|
|
22
|
-
testing: {
|
|
23
|
-
test: "vitest",
|
|
24
|
-
"test:watch": "vitest watch",
|
|
25
|
-
"test:coverage": "vitest --coverage"
|
|
26
|
-
},
|
|
27
|
-
prettier: {
|
|
28
|
-
format: "prettier --write .",
|
|
29
|
-
"format:check": "prettier --check ."
|
|
30
|
-
},
|
|
31
|
-
eslint: {
|
|
32
|
-
lint: "eslint .",
|
|
33
|
-
"lint:fix": "eslint . --fix"
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
function getPresetScripts(presets) {
|
|
37
|
-
const merged = {};
|
|
38
|
-
for (const preset of presets) {
|
|
39
|
-
const scripts = scriptPresets[preset];
|
|
40
|
-
if (scripts) {
|
|
41
|
-
Object.assign(merged, scripts);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return merged;
|
|
45
|
-
}
|
|
46
|
-
function mergeScripts(presetScripts, customScripts) {
|
|
47
|
-
return { ...presetScripts, ...customScripts };
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// src/resolvers/dependencies.ts
|
|
51
|
-
function parseDependency(dep) {
|
|
52
|
-
if (typeof dep === "string") {
|
|
53
|
-
const atIndex = dep.lastIndexOf("@");
|
|
54
|
-
if (atIndex > 0) {
|
|
55
|
-
return {
|
|
56
|
-
name: dep.slice(0, atIndex),
|
|
57
|
-
version: dep.slice(atIndex + 1)
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
return { name: dep };
|
|
61
|
-
}
|
|
62
|
-
const [name, version] = Object.entries(dep)[0];
|
|
63
|
-
return { name, version };
|
|
64
|
-
}
|
|
65
|
-
async function fetchLatestVersion(packageName) {
|
|
66
|
-
const url = `https://registry.npmjs.org/${encodeURIComponent(packageName)}`;
|
|
67
|
-
const response = await fetch(url, {
|
|
68
|
-
headers: { Accept: "application/json" }
|
|
69
|
-
});
|
|
70
|
-
if (!response.ok) {
|
|
71
|
-
throw new Error(`Failed to fetch ${packageName}: ${response.statusText}`);
|
|
72
|
-
}
|
|
73
|
-
const data = await response.json();
|
|
74
|
-
return data["dist-tags"].latest;
|
|
75
|
-
}
|
|
76
|
-
var versionCache = new Map;
|
|
77
|
-
async function resolveDependenciesCached(deps) {
|
|
78
|
-
if (!deps) {
|
|
79
|
-
return {};
|
|
80
|
-
}
|
|
81
|
-
if (!Array.isArray(deps)) {
|
|
82
|
-
return deps;
|
|
83
|
-
}
|
|
84
|
-
if (deps.length === 0) {
|
|
85
|
-
return {};
|
|
86
|
-
}
|
|
87
|
-
const results = [];
|
|
88
|
-
for (const dep of deps) {
|
|
89
|
-
const { name, version } = parseDependency(dep);
|
|
90
|
-
if (version) {
|
|
91
|
-
results.push([name, version]);
|
|
92
|
-
continue;
|
|
93
|
-
}
|
|
94
|
-
let resolvedVersion = versionCache.get(name);
|
|
95
|
-
if (!resolvedVersion) {
|
|
96
|
-
resolvedVersion = `^${await fetchLatestVersion(name)}`;
|
|
97
|
-
versionCache.set(name, resolvedVersion);
|
|
98
|
-
}
|
|
99
|
-
results.push([name, resolvedVersion]);
|
|
100
|
-
}
|
|
101
|
-
return Object.fromEntries(results);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// src/utils/merge.ts
|
|
105
|
-
function deepMerge(target, source) {
|
|
106
|
-
const result = { ...target };
|
|
107
|
-
for (const key of Object.keys(source)) {
|
|
108
|
-
const sourceValue = source[key];
|
|
109
|
-
const targetValue = target[key];
|
|
110
|
-
if (sourceValue === undefined)
|
|
111
|
-
continue;
|
|
112
|
-
if (typeof sourceValue === "object" && sourceValue !== null && !Array.isArray(sourceValue) && typeof targetValue === "object" && targetValue !== null && !Array.isArray(targetValue)) {
|
|
113
|
-
result[key] = deepMerge(targetValue, sourceValue);
|
|
114
|
-
} else {
|
|
115
|
-
result[key] = sourceValue;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
return result;
|
|
119
|
-
}
|
|
120
|
-
function mergeDependencies(target, source) {
|
|
121
|
-
if (!target && !source)
|
|
122
|
-
return;
|
|
123
|
-
if (!target)
|
|
124
|
-
return source;
|
|
125
|
-
if (!source)
|
|
126
|
-
return target;
|
|
127
|
-
if (Array.isArray(target) && Array.isArray(source)) {
|
|
128
|
-
return [...target, ...source];
|
|
129
|
-
}
|
|
130
|
-
if (!Array.isArray(target) && !Array.isArray(source)) {
|
|
131
|
-
return { ...target, ...source };
|
|
132
|
-
}
|
|
133
|
-
const targetObj = Array.isArray(target) ? {} : target;
|
|
134
|
-
const sourceObj = Array.isArray(source) ? {} : source;
|
|
135
|
-
const targetArr = Array.isArray(target) ? target : [];
|
|
136
|
-
const sourceArr = Array.isArray(source) ? source : [];
|
|
137
|
-
return [...targetArr, ...sourceArr, { ...targetObj, ...sourceObj }];
|
|
138
|
-
}
|
|
139
|
-
async function resolveExtends(config) {
|
|
140
|
-
if (!config.extends) {
|
|
141
|
-
return config;
|
|
142
|
-
}
|
|
143
|
-
let baseConfig;
|
|
144
|
-
if (typeof config.extends === "string") {
|
|
145
|
-
const imported = await import(config.extends);
|
|
146
|
-
baseConfig = imported.default ?? imported;
|
|
147
|
-
} else {
|
|
148
|
-
baseConfig = config.extends;
|
|
149
|
-
}
|
|
150
|
-
baseConfig = await resolveExtends(baseConfig);
|
|
151
|
-
const { extends: _, ...currentWithoutExtends } = config;
|
|
152
|
-
return {
|
|
153
|
-
...baseConfig,
|
|
154
|
-
...currentWithoutExtends,
|
|
155
|
-
dependencies: mergeDependencies(baseConfig.dependencies, currentWithoutExtends.dependencies),
|
|
156
|
-
devDependencies: mergeDependencies(baseConfig.devDependencies, currentWithoutExtends.devDependencies),
|
|
157
|
-
peerDependencies: mergeDependencies(baseConfig.peerDependencies, currentWithoutExtends.peerDependencies),
|
|
158
|
-
scripts: { ...baseConfig.scripts, ...currentWithoutExtends.scripts },
|
|
159
|
-
scriptPresets: [
|
|
160
|
-
...baseConfig.scriptPresets ?? [],
|
|
161
|
-
...currentWithoutExtends.scriptPresets ?? []
|
|
162
|
-
]
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// src/utils/conditions.ts
|
|
167
|
-
function getContext() {
|
|
168
|
-
return {
|
|
169
|
-
env: "development",
|
|
170
|
-
platform: process.platform,
|
|
171
|
-
nodeVersion: process.version,
|
|
172
|
-
ci: process.env.CI === "true" || process.env.CI === "1"
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
|
-
function evaluateCondition(when, context) {
|
|
176
|
-
if (when.env !== undefined && context.env !== when.env) {
|
|
177
|
-
return false;
|
|
178
|
-
}
|
|
179
|
-
if (when.platform !== undefined && context.platform !== when.platform) {
|
|
180
|
-
return false;
|
|
181
|
-
}
|
|
182
|
-
if (when.ci !== undefined && context.ci !== when.ci) {
|
|
183
|
-
return false;
|
|
184
|
-
}
|
|
185
|
-
if (when.nodeVersion !== undefined) {
|
|
186
|
-
if (!context.nodeVersion.startsWith(when.nodeVersion)) {
|
|
187
|
-
return false;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
return true;
|
|
191
|
-
}
|
|
192
|
-
function applyConditions(baseConfig, conditions) {
|
|
193
|
-
if (!conditions || conditions.length === 0) {
|
|
194
|
-
return baseConfig;
|
|
195
|
-
}
|
|
196
|
-
const context = getContext();
|
|
197
|
-
let result = { ...baseConfig };
|
|
198
|
-
for (const condition of conditions) {
|
|
199
|
-
if (evaluateCondition(condition.when, context)) {
|
|
200
|
-
result = deepMerge(result, condition.set);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
return result;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// src/generator/createPackageJson.ts
|
|
207
|
-
async function createPackageJson(config, options = {}) {
|
|
208
|
-
const { indent = 2 } = options;
|
|
209
|
-
let resolved = await resolveExtends(config);
|
|
210
|
-
const presetScripts = resolved.scriptPresets ? getPresetScripts(resolved.scriptPresets) : {};
|
|
211
|
-
const finalScripts = mergeScripts(presetScripts, resolved.scripts);
|
|
212
|
-
const [dependencies, devDependencies, peerDependencies] = await Promise.all([
|
|
213
|
-
resolveDependenciesCached(resolved.dependencies),
|
|
214
|
-
resolveDependenciesCached(resolved.devDependencies),
|
|
215
|
-
resolveDependenciesCached(resolved.peerDependencies)
|
|
216
|
-
]);
|
|
217
|
-
const packageJson = {
|
|
218
|
-
name: resolved.name,
|
|
219
|
-
...resolved.version && { version: resolved.version },
|
|
220
|
-
...resolved.description && { description: resolved.description },
|
|
221
|
-
...resolved.keywords?.length && { keywords: resolved.keywords },
|
|
222
|
-
...resolved.homepage && { homepage: resolved.homepage },
|
|
223
|
-
...resolved.bugs && { bugs: resolved.bugs },
|
|
224
|
-
...resolved.license && { license: resolved.license },
|
|
225
|
-
...resolved.author && { author: resolved.author },
|
|
226
|
-
...resolved.contributors?.length && {
|
|
227
|
-
contributors: resolved.contributors
|
|
228
|
-
},
|
|
229
|
-
...resolved.repository && { repository: resolved.repository },
|
|
230
|
-
...resolved.type && { type: resolved.type },
|
|
231
|
-
...resolved.main && { main: resolved.main },
|
|
232
|
-
...resolved.module && { module: resolved.module },
|
|
233
|
-
...resolved.types && { types: resolved.types },
|
|
234
|
-
...resolved.exports && { exports: resolved.exports },
|
|
235
|
-
...resolved.bin && { bin: resolved.bin },
|
|
236
|
-
...resolved.files?.length && { files: resolved.files },
|
|
237
|
-
...Object.keys(finalScripts).length && { scripts: finalScripts },
|
|
238
|
-
...Object.keys(dependencies).length && { dependencies },
|
|
239
|
-
...Object.keys(devDependencies).length && { devDependencies },
|
|
240
|
-
...Object.keys(peerDependencies).length && { peerDependencies },
|
|
241
|
-
...resolved.optionalDependencies && {
|
|
242
|
-
optionalDependencies: resolved.optionalDependencies
|
|
243
|
-
},
|
|
244
|
-
...resolved.engines && { engines: resolved.engines },
|
|
245
|
-
...resolved.os?.length && { os: resolved.os },
|
|
246
|
-
...resolved.cpu?.length && { cpu: resolved.cpu },
|
|
247
|
-
...resolved.private !== undefined && { private: resolved.private },
|
|
248
|
-
...resolved.publishConfig && { publishConfig: resolved.publishConfig },
|
|
249
|
-
...resolved.workspaces?.length && { workspaces: resolved.workspaces }
|
|
250
|
-
};
|
|
251
|
-
const finalPackageJson = applyConditions(packageJson, resolved.conditions);
|
|
252
|
-
return JSON.stringify(finalPackageJson, null, indent);
|
|
253
|
-
}
|
|
254
|
-
async function writePackageJson(config, options = {}) {
|
|
255
|
-
const { outputPath = "package.json" } = options;
|
|
256
|
-
const json = await createPackageJson(config, options);
|
|
257
|
-
const { writeFile } = await import("node:fs/promises");
|
|
258
|
-
await writeFile(outputPath, json + `
|
|
259
|
-
`);
|
|
260
|
-
console.log(`✨ Generated ${outputPath}`);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// src/sync/syncDependencies.ts
|
|
264
|
-
import { readFile, writeFile } from "node:fs/promises";
|
|
265
|
-
import { resolve } from "node:path";
|
|
266
|
-
function depsObjectToArray(deps) {
|
|
267
|
-
if (!deps)
|
|
268
|
-
return [];
|
|
269
|
-
return Object.keys(deps).sort();
|
|
270
|
-
}
|
|
271
|
-
function formatDepsArray(deps, indent = " ") {
|
|
272
|
-
if (deps.length === 0)
|
|
273
|
-
return "[]";
|
|
274
|
-
if (deps.length === 1)
|
|
275
|
-
return `['${deps[0]}']`;
|
|
276
|
-
return `[
|
|
277
|
-
${deps.map((d) => `${indent}'${d}',`).join(`
|
|
2
|
+
import{createRequire as C}from"node:module";var f=C(import.meta.url);var h={typescript:{build:"tsc","build:watch":"tsc --watch",typecheck:"tsc --noEmit"},react:{dev:"vite",build:"vite build",preview:"vite preview"},node:{start:"node dist/index.js",dev:"tsx watch src/index.ts",build:"tsup src/index.ts --format esm,cjs --dts"},testing:{test:"vitest","test:watch":"vitest watch","test:coverage":"vitest --coverage"},prettier:{format:"prettier --write .","format:check":"prettier --check ."},eslint:{lint:"eslint .","lint:fix":"eslint . --fix"}};function E(z){let K={};for(let Q of z){let R=h[Q];if(R)Object.assign(K,R)}return K}function V(z,K){return{...z,...K}}function v(z){if(typeof z==="string"){let R=z.lastIndexOf("@");if(R>0)return{name:z.slice(0,R),version:z.slice(R+1)};return{name:z}}let[K,Q]=Object.entries(z)[0];return{name:K,version:Q}}async function u(z){let K=`https://registry.npmjs.org/${encodeURIComponent(z)}`,Q=await fetch(K,{headers:{Accept:"application/json"}});if(!Q.ok)throw Error(`Failed to fetch ${z}: ${Q.statusText}`);return(await Q.json())["dist-tags"].latest}var j=new Map;async function N(z){if(!z)return{};if(!Array.isArray(z))return z;if(z.length===0)return{};let K=[];for(let Q of z){let{name:R,version:X}=v(Q);if(X){K.push([R,X]);continue}let Y=j.get(R);if(!Y)Y=`^${await u(R)}`,j.set(R,Y);K.push([R,Y])}return Object.fromEntries(K)}function W(z,K){let Q={...z};for(let R of Object.keys(K)){let X=K[R],Y=z[R];if(X===void 0)continue;if(typeof X==="object"&&X!==null&&!Array.isArray(X)&&typeof Y==="object"&&Y!==null&&!Array.isArray(Y))Q[R]=W(Y,X);else Q[R]=X}return Q}function F(z,K){if(!z&&!K)return;if(!z)return K;if(!K)return z;if(Array.isArray(z)&&Array.isArray(K))return[...z,...K];if(!Array.isArray(z)&&!Array.isArray(K))return{...z,...K};let Q=Array.isArray(z)?{}:z,R=Array.isArray(K)?{}:K,X=Array.isArray(z)?z:[],Y=Array.isArray(K)?K:[];return[...X,...Y,{...Q,...R}]}async function O(z){if(!z.extends)return z;let K;if(typeof z.extends==="string"){let X=await import(z.extends);K=X.default??X}else K=z.extends;K=await O(K);let{extends:Q,...R}=z;return{...K,...R,dependencies:F(K.dependencies,R.dependencies),devDependencies:F(K.devDependencies,R.devDependencies),peerDependencies:F(K.peerDependencies,R.peerDependencies),scripts:{...K.scripts,...R.scripts},scriptPresets:[...K.scriptPresets??[],...R.scriptPresets??[]]}}function i(){return{env:"development",platform:process.platform,nodeVersion:process.version,ci:process.env.CI==="true"||process.env.CI==="1"}}function l(z,K){if(z.env!==void 0&&K.env!==z.env)return!1;if(z.platform!==void 0&&K.platform!==z.platform)return!1;if(z.ci!==void 0&&K.ci!==z.ci)return!1;if(z.nodeVersion!==void 0){if(!K.nodeVersion.startsWith(z.nodeVersion))return!1}return!0}function J(z,K){if(!K||K.length===0)return z;let Q=i(),R={...z};for(let X of K)if(l(X.when,Q))R=W(R,X.set);return R}async function g(z,K={}){let{indent:Q=2}=K,R=await O(z),X=R.scriptPresets?E(R.scriptPresets):{},Y=V(X,R.scripts),[U,Z,G]=await Promise.all([N(R.dependencies),N(R.devDependencies),N(R.peerDependencies)]),q={name:R.name,...R.version&&{version:R.version},...R.description&&{description:R.description},...R.keywords?.length&&{keywords:R.keywords},...R.homepage&&{homepage:R.homepage},...R.bugs&&{bugs:R.bugs},...R.license&&{license:R.license},...R.author&&{author:R.author},...R.contributors?.length&&{contributors:R.contributors},...R.repository&&{repository:R.repository},...R.type&&{type:R.type},...R.main&&{main:R.main},...R.module&&{module:R.module},...R.types&&{types:R.types},...R.exports&&{exports:R.exports},...R.bin&&{bin:R.bin},...R.files?.length&&{files:R.files},...Object.keys(Y).length&&{scripts:Y},...Object.keys(U).length&&{dependencies:U},...Object.keys(Z).length&&{devDependencies:Z},...Object.keys(G).length&&{peerDependencies:G},...R.optionalDependencies&&{optionalDependencies:R.optionalDependencies},...R.engines&&{engines:R.engines},...R.os?.length&&{os:R.os},...R.cpu?.length&&{cpu:R.cpu},...R.private!==void 0&&{private:R.private},...R.publishConfig&&{publishConfig:R.publishConfig},...R.workspaces?.length&&{workspaces:R.workspaces}},$=J(q,R.conditions);return JSON.stringify($,null,Q)}async function D(z,K={}){let{outputPath:Q="package.json"}=K,R=await g(z,K),{writeFile:X}=await import("node:fs/promises");await X(Q,R+`
|
|
3
|
+
`),console.log(`✨ Generated ${Q}`)}import{readFile as k,writeFile as p}from"node:fs/promises";import{resolve as P}from"node:path";function I(z){if(!z)return[];return Object.keys(z).sort()}function b(z,K=" "){if(z.length===0)return"[]";if(z.length===1)return`['${z[0]}']`;return`[
|
|
4
|
+
${z.map((Q)=>`${K}'${Q}',`).join(`
|
|
278
5
|
`)}
|
|
279
|
-
]
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
if (delay > 0) {
|
|
289
|
-
await new Promise((resolve2) => setTimeout(resolve2, delay));
|
|
290
|
-
}
|
|
291
|
-
const absolutePackageJsonPath = resolve(process.cwd(), packageJsonPath);
|
|
292
|
-
const absoluteConfigPath = resolve(process.cwd(), configPath);
|
|
293
|
-
let packageJson;
|
|
294
|
-
try {
|
|
295
|
-
const packageJsonContent = await readFile(absolutePackageJsonPath, "utf-8");
|
|
296
|
-
packageJson = JSON.parse(packageJsonContent);
|
|
297
|
-
} catch (error) {
|
|
298
|
-
const err = error;
|
|
299
|
-
if (err.code === "ENOENT") {
|
|
300
|
-
console.error(`× package.json not found: ${packageJsonPath}`);
|
|
301
|
-
process.exit(1);
|
|
302
|
-
}
|
|
303
|
-
throw error;
|
|
304
|
-
}
|
|
305
|
-
let configContent;
|
|
306
|
-
try {
|
|
307
|
-
configContent = await readFile(absoluteConfigPath, "utf-8");
|
|
308
|
-
} catch (error) {
|
|
309
|
-
const err = error;
|
|
310
|
-
if (err.code === "ENOENT") {
|
|
311
|
-
console.error(`× Config file not found: ${configPath}`);
|
|
312
|
-
console.error("Run ts-pkg init first to create a package.config.ts");
|
|
313
|
-
process.exit(1);
|
|
314
|
-
}
|
|
315
|
-
throw error;
|
|
316
|
-
}
|
|
317
|
-
const deps = depsObjectToArray(packageJson.dependencies);
|
|
318
|
-
const devDeps = depsObjectToArray(packageJson.devDependencies);
|
|
319
|
-
const peerDeps = depsObjectToArray(packageJson.peerDependencies);
|
|
320
|
-
let updatedContent = configContent;
|
|
321
|
-
updatedContent = updateDepsInConfig(updatedContent, "dependencies", deps);
|
|
322
|
-
updatedContent = updateDepsInConfig(updatedContent, "devDependencies", devDeps);
|
|
323
|
-
updatedContent = updateDepsInConfig(updatedContent, "peerDependencies", peerDeps);
|
|
324
|
-
await writeFile(absoluteConfigPath, updatedContent);
|
|
325
|
-
if (!quiet) {
|
|
326
|
-
console.log(`✨ Synced dependencies to ${configPath}`);
|
|
327
|
-
if (deps.length)
|
|
328
|
-
console.log(` dependencies: ${deps.length} packages`);
|
|
329
|
-
if (devDeps.length)
|
|
330
|
-
console.log(` devDependencies: ${devDeps.length} packages`);
|
|
331
|
-
if (peerDeps.length)
|
|
332
|
-
console.log(` peerDependencies: ${peerDeps.length} packages`);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
function findArrayEnd(content, startIndex) {
|
|
336
|
-
let depth = 0;
|
|
337
|
-
for (let i = startIndex;i < content.length; i++) {
|
|
338
|
-
if (content[i] === "[")
|
|
339
|
-
depth++;
|
|
340
|
-
else if (content[i] === "]") {
|
|
341
|
-
depth--;
|
|
342
|
-
if (depth === 0)
|
|
343
|
-
return i;
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
return -1;
|
|
347
|
-
}
|
|
348
|
-
function updateDepsInConfig(content, depType, deps) {
|
|
349
|
-
const formattedDeps = formatDepsArray(deps);
|
|
350
|
-
const fieldPattern = new RegExp(`(${depType}:\\s*)\\[`);
|
|
351
|
-
const match = fieldPattern.exec(content);
|
|
352
|
-
if (match && match[1]) {
|
|
353
|
-
const arrayStart = match.index + match[1].length;
|
|
354
|
-
const arrayEnd = findArrayEnd(content, arrayStart);
|
|
355
|
-
if (arrayEnd !== -1) {
|
|
356
|
-
return content.slice(0, arrayStart) + formattedDeps + content.slice(arrayEnd + 1);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
if (deps.length > 0) {
|
|
360
|
-
const insertPatterns = [
|
|
361
|
-
{ pattern: /peerDependencies:\s*\[/, after: true },
|
|
362
|
-
{ pattern: /devDependencies:\s*\[/, after: true },
|
|
363
|
-
{ pattern: /dependencies:\s*\[/, after: true },
|
|
364
|
-
{ pattern: /(\n\s*)(conditions:\s*\[)/, before: true },
|
|
365
|
-
{ pattern: /(\n\s*)(engines:\s*\{)/, before: true }
|
|
366
|
-
];
|
|
367
|
-
for (const { pattern, after, before } of insertPatterns) {
|
|
368
|
-
const m = pattern.exec(content);
|
|
369
|
-
if (m) {
|
|
370
|
-
if (after) {
|
|
371
|
-
const arrStart = m.index + m[0].length - 1;
|
|
372
|
-
const arrEnd = findArrayEnd(content, arrStart);
|
|
373
|
-
if (arrEnd !== -1) {
|
|
374
|
-
let insertPos = arrEnd + 1;
|
|
375
|
-
let char = content[insertPos];
|
|
376
|
-
while (insertPos < content.length && char && /[,\s]/.test(char) && char !== `
|
|
377
|
-
`) {
|
|
378
|
-
insertPos++;
|
|
379
|
-
char = content[insertPos];
|
|
380
|
-
}
|
|
381
|
-
if (content[insertPos] === `
|
|
382
|
-
`)
|
|
383
|
-
insertPos++;
|
|
384
|
-
return content.slice(0, insertPos) + `
|
|
385
|
-
${depType}: ${formattedDeps},
|
|
386
|
-
` + content.slice(insertPos);
|
|
387
|
-
}
|
|
388
|
-
} else if (before) {
|
|
389
|
-
return content.replace(pattern, `$1${depType}: ${formattedDeps},
|
|
390
|
-
$1$2`);
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
return content;
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
// src/cli.ts
|
|
399
|
-
import { resolve as resolve2 } from "node:path";
|
|
400
|
-
import { pathToFileURL } from "node:url";
|
|
401
|
-
function printHelp() {
|
|
402
|
-
console.log(`
|
|
6
|
+
]`}function c(z,K=" "){let Q=Object.entries(z).sort(([R],[X])=>R.localeCompare(X));if(Q.length===0)return"{}";return`{
|
|
7
|
+
${Q.map(([R,X])=>`${K}'${R}': '${X}',`).join(`
|
|
8
|
+
`)}
|
|
9
|
+
}`}async function m(z={}){let{packageJsonPath:K="package.json",configPath:Q="package.ts",quiet:R=!1,delay:X=0}=z;if(X>0)await new Promise((_)=>setTimeout(_,X));let Y=P(process.cwd(),K),U=P(process.cwd(),Q),Z;try{let _=await k(Y,"utf-8");Z=JSON.parse(_)}catch(_){if(_.code==="ENOENT")console.error(`× package.json not found: ${K}`),process.exit(1);throw _}let G;try{G=await k(U,"utf-8")}catch(_){if(_.code==="ENOENT")console.error(`× Config file not found: ${Q}`),console.error("Run ts-pkg init first to create a package.ts"),process.exit(1);throw _}let q=I(Z.dependencies),$=I(Z.devDependencies),B=I(Z.peerDependencies),H=G;if(H=w(H,"dependencies",q,Z.dependencies),H=w(H,"devDependencies",$,Z.devDependencies),H=w(H,"peerDependencies",B,Z.peerDependencies),await p(U,H),!R){if(console.log(`✨ Synced dependencies to ${Q}`),q.length)console.log(` dependencies: ${q.length} packages`);if($.length)console.log(` devDependencies: ${$.length} packages`);if(B.length)console.log(` peerDependencies: ${B.length} packages`)}}function T(z,K,Q,R){let X=0;for(let Y=K;Y<z.length;Y++)if(z[Y]===Q)X++;else if(z[Y]===R){if(X--,X===0)return Y}return-1}function w(z,K,Q,R){let Y=new RegExp(`(${K}:\\s*)\\[`).exec(z);if(Y&&Y[1]){let G=b(Q),q=Y.index+Y[1].length,$=T(z,q,"[","]");if($!==-1)return z.slice(0,q)+G+z.slice($+1)}let Z=new RegExp(`(${K}:\\s*)\\{`).exec(z);if(Z&&Z[1]){let G=c(R||{}),q=Z.index+Z[1].length,$=T(z,q,"{","}");if($!==-1)return z.slice(0,q)+G+z.slice($+1)}if(Q.length>0){let G=b(Q),q=[{pattern:/peerDependencies:\s*[\[{]/,after:!0},{pattern:/devDependencies:\s*[\[{]/,after:!0},{pattern:/dependencies:\s*[\[{]/,after:!0},{pattern:/(\n\s*)(conditions:\s*\[)/,before:!0},{pattern:/(\n\s*)(engines:\s*\{)/,before:!0}];for(let{pattern:$,after:B,before:H}of q){let _=$.exec(z);if(_){if(B){let x=z[_.index+_[0].length-1]==="[",y=_.index+_[0].length-1,A=T(z,y,x?"[":"{",x?"]":"}");if(A!==-1){let S=A+1,L=z[S];while(S<z.length&&L&&/[,\s]/.test(L)&&L!==`
|
|
10
|
+
`)S++,L=z[S];if(z[S]===`
|
|
11
|
+
`)S++;return z.slice(0,S)+`
|
|
12
|
+
${K}: ${G},
|
|
13
|
+
`+z.slice(S)}}else if(H)return z.replace($,`$1${K}: ${G},
|
|
14
|
+
$1$2`)}}}return z}import{resolve as d}from"node:path";import{pathToFileURL as a}from"node:url";function r(){console.log(`
|
|
403
15
|
ts-pkg - TypeScript-based package.json generator
|
|
404
16
|
|
|
405
17
|
Usage:
|
|
@@ -408,72 +20,27 @@ Usage:
|
|
|
408
20
|
ts-pkg help Show this help message
|
|
409
21
|
|
|
410
22
|
Commands:
|
|
411
|
-
(default) Generate package.json from package.
|
|
412
|
-
sync Sync dependencies from package.json back to package.
|
|
23
|
+
(default) Generate package.json from package.ts
|
|
24
|
+
sync Sync dependencies from package.json back to package.ts
|
|
413
25
|
|
|
414
26
|
Examples:
|
|
415
|
-
ts-pkg # Generate from package.
|
|
27
|
+
ts-pkg # Generate from package.ts
|
|
416
28
|
ts-pkg my.config.ts # Generate from custom config
|
|
417
|
-
ts-pkg sync # Sync deps to package.
|
|
418
|
-
ts-pkg sync package.
|
|
29
|
+
ts-pkg sync # Sync deps to package.ts
|
|
30
|
+
ts-pkg sync package.ts package.json
|
|
419
31
|
|
|
420
32
|
Postinstall setup:
|
|
421
33
|
Add to your package.json scripts:
|
|
422
34
|
"postinstall": "ts-pkg sync"
|
|
423
|
-
`);
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
const absoluteConfigPath = resolve2(process.cwd(), configPath);
|
|
427
|
-
try {
|
|
428
|
-
const configModule = await import(pathToFileURL(absoluteConfigPath).href);
|
|
429
|
-
const config = configModule.default ?? configModule;
|
|
430
|
-
await writePackageJson(config, { outputPath });
|
|
431
|
-
} catch (error) {
|
|
432
|
-
const err = error;
|
|
433
|
-
if (err.code === "ERR_MODULE_NOT_FOUND" || err.code === "ENOENT") {
|
|
434
|
-
console.error(`× Config file not found: ${configPath}`);
|
|
435
|
-
console.error(`
|
|
436
|
-
Create a package.config.ts file with:`);
|
|
437
|
-
console.error(`
|
|
438
|
-
import { definePackageConfig } from '@a35hie/ts-pkg'
|
|
35
|
+
`)}async function s(z,K){let Q=d(process.cwd(),z);try{let R=await import(a(Q).href),X=R.default??R;await D(X,{outputPath:K})}catch(R){let X=R;if(X.code==="ERR_MODULE_NOT_FOUND"||X.code==="ENOENT")console.error(`× Config file not found: ${z}`),console.error(`
|
|
36
|
+
Create a package.ts file with:`),console.error(`
|
|
37
|
+
import { definePackage } from '@a35hie/ts-pkg'
|
|
439
38
|
|
|
440
|
-
export default
|
|
39
|
+
export default definePackage({
|
|
441
40
|
name: 'my-package',
|
|
442
41
|
version: '1.0.0',
|
|
443
42
|
scriptPresets: ['typescript', 'testing'],
|
|
444
43
|
dependencies: ['lodash', 'zod'],
|
|
445
44
|
devDependencies: ['typescript', 'vitest'],
|
|
446
45
|
})
|
|
447
|
-
`);
|
|
448
|
-
process.exit(1);
|
|
449
|
-
}
|
|
450
|
-
console.error("× Error:", err.message);
|
|
451
|
-
process.exit(1);
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
async function runSync(configPath, packageJsonPath) {
|
|
455
|
-
const isPostinstall = process.env.npm_lifecycle_event === "postinstall";
|
|
456
|
-
await syncDependencies({
|
|
457
|
-
configPath,
|
|
458
|
-
packageJsonPath,
|
|
459
|
-
delay: isPostinstall ? 100 : 0
|
|
460
|
-
});
|
|
461
|
-
}
|
|
462
|
-
async function main() {
|
|
463
|
-
const args = process.argv.slice(2);
|
|
464
|
-
const command = args[0];
|
|
465
|
-
if (command === "help" || command === "--help" || command === "-h") {
|
|
466
|
-
printHelp();
|
|
467
|
-
return;
|
|
468
|
-
}
|
|
469
|
-
if (command === "sync") {
|
|
470
|
-
const configPath2 = args[1] ?? "package.config.ts";
|
|
471
|
-
const packageJsonPath = args[2] ?? "package.json";
|
|
472
|
-
await runSync(configPath2, packageJsonPath);
|
|
473
|
-
return;
|
|
474
|
-
}
|
|
475
|
-
const configPath = args[0] ?? "package.config.ts";
|
|
476
|
-
const outputPath = args[1] ?? "package.json";
|
|
477
|
-
await runGenerate(configPath, outputPath);
|
|
478
|
-
}
|
|
479
|
-
main();
|
|
46
|
+
`),process.exit(1);console.error("× Error:",X.message),process.exit(1)}}async function t(z,K){let Q=process.env.npm_lifecycle_event==="postinstall";await m({configPath:z,packageJsonPath:K,delay:Q?100:0})}async function o(){let z=process.argv.slice(2),K=z[0];if(K==="help"||K==="--help"||K==="-h"){r();return}if(K==="sync"){let X=z[1]??"package.ts",Y=z[2]??"package.json";await t(X,Y);return}let Q=z[0]??"package.ts",R=z[1]??"package.json";await s(Q,R)}o();
|
package/dist/main.d.ts
CHANGED
|
@@ -82,6 +82,10 @@ export interface GenerateOptions {
|
|
|
82
82
|
}
|
|
83
83
|
export declare function createPackageJson(config: PackageConfig, options?: GenerateOptions): Promise<string>;
|
|
84
84
|
export declare function writePackageJson(config: PackageConfig, options?: GenerateOptions): Promise<void>;
|
|
85
|
-
export declare function
|
|
85
|
+
export declare function definePackage(config: PackageConfig): PackageConfig;
|
|
86
|
+
|
|
87
|
+
export {
|
|
88
|
+
definePackage as definePackageConfig,
|
|
89
|
+
};
|
|
86
90
|
|
|
87
91
|
export {};
|
package/dist/main.js
CHANGED
|
@@ -1,272 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
// src/presets/scripts.ts
|
|
5
|
-
var scriptPresets = {
|
|
6
|
-
typescript: {
|
|
7
|
-
build: "tsc",
|
|
8
|
-
"build:watch": "tsc --watch",
|
|
9
|
-
typecheck: "tsc --noEmit"
|
|
10
|
-
},
|
|
11
|
-
react: {
|
|
12
|
-
dev: "vite",
|
|
13
|
-
build: "vite build",
|
|
14
|
-
preview: "vite preview"
|
|
15
|
-
},
|
|
16
|
-
node: {
|
|
17
|
-
start: "node dist/index.js",
|
|
18
|
-
dev: "tsx watch src/index.ts",
|
|
19
|
-
build: "tsup src/index.ts --format esm,cjs --dts"
|
|
20
|
-
},
|
|
21
|
-
testing: {
|
|
22
|
-
test: "vitest",
|
|
23
|
-
"test:watch": "vitest watch",
|
|
24
|
-
"test:coverage": "vitest --coverage"
|
|
25
|
-
},
|
|
26
|
-
prettier: {
|
|
27
|
-
format: "prettier --write .",
|
|
28
|
-
"format:check": "prettier --check ."
|
|
29
|
-
},
|
|
30
|
-
eslint: {
|
|
31
|
-
lint: "eslint .",
|
|
32
|
-
"lint:fix": "eslint . --fix"
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
function getPresetScripts(presets) {
|
|
36
|
-
const merged = {};
|
|
37
|
-
for (const preset of presets) {
|
|
38
|
-
const scripts = scriptPresets[preset];
|
|
39
|
-
if (scripts) {
|
|
40
|
-
Object.assign(merged, scripts);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return merged;
|
|
44
|
-
}
|
|
45
|
-
function mergeScripts(presetScripts, customScripts) {
|
|
46
|
-
return { ...presetScripts, ...customScripts };
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// src/resolvers/dependencies.ts
|
|
50
|
-
function parseDependency(dep) {
|
|
51
|
-
if (typeof dep === "string") {
|
|
52
|
-
const atIndex = dep.lastIndexOf("@");
|
|
53
|
-
if (atIndex > 0) {
|
|
54
|
-
return {
|
|
55
|
-
name: dep.slice(0, atIndex),
|
|
56
|
-
version: dep.slice(atIndex + 1)
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
return { name: dep };
|
|
60
|
-
}
|
|
61
|
-
const [name, version] = Object.entries(dep)[0];
|
|
62
|
-
return { name, version };
|
|
63
|
-
}
|
|
64
|
-
async function fetchLatestVersion(packageName) {
|
|
65
|
-
const url = `https://registry.npmjs.org/${encodeURIComponent(packageName)}`;
|
|
66
|
-
const response = await fetch(url, {
|
|
67
|
-
headers: { Accept: "application/json" }
|
|
68
|
-
});
|
|
69
|
-
if (!response.ok) {
|
|
70
|
-
throw new Error(`Failed to fetch ${packageName}: ${response.statusText}`);
|
|
71
|
-
}
|
|
72
|
-
const data = await response.json();
|
|
73
|
-
return data["dist-tags"].latest;
|
|
74
|
-
}
|
|
75
|
-
var versionCache = new Map;
|
|
76
|
-
async function resolveDependenciesCached(deps) {
|
|
77
|
-
if (!deps) {
|
|
78
|
-
return {};
|
|
79
|
-
}
|
|
80
|
-
if (!Array.isArray(deps)) {
|
|
81
|
-
return deps;
|
|
82
|
-
}
|
|
83
|
-
if (deps.length === 0) {
|
|
84
|
-
return {};
|
|
85
|
-
}
|
|
86
|
-
const results = [];
|
|
87
|
-
for (const dep of deps) {
|
|
88
|
-
const { name, version } = parseDependency(dep);
|
|
89
|
-
if (version) {
|
|
90
|
-
results.push([name, version]);
|
|
91
|
-
continue;
|
|
92
|
-
}
|
|
93
|
-
let resolvedVersion = versionCache.get(name);
|
|
94
|
-
if (!resolvedVersion) {
|
|
95
|
-
resolvedVersion = `^${await fetchLatestVersion(name)}`;
|
|
96
|
-
versionCache.set(name, resolvedVersion);
|
|
97
|
-
}
|
|
98
|
-
results.push([name, resolvedVersion]);
|
|
99
|
-
}
|
|
100
|
-
return Object.fromEntries(results);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// src/utils/merge.ts
|
|
104
|
-
function deepMerge(target, source) {
|
|
105
|
-
const result = { ...target };
|
|
106
|
-
for (const key of Object.keys(source)) {
|
|
107
|
-
const sourceValue = source[key];
|
|
108
|
-
const targetValue = target[key];
|
|
109
|
-
if (sourceValue === undefined)
|
|
110
|
-
continue;
|
|
111
|
-
if (typeof sourceValue === "object" && sourceValue !== null && !Array.isArray(sourceValue) && typeof targetValue === "object" && targetValue !== null && !Array.isArray(targetValue)) {
|
|
112
|
-
result[key] = deepMerge(targetValue, sourceValue);
|
|
113
|
-
} else {
|
|
114
|
-
result[key] = sourceValue;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return result;
|
|
118
|
-
}
|
|
119
|
-
function mergeDependencies(target, source) {
|
|
120
|
-
if (!target && !source)
|
|
121
|
-
return;
|
|
122
|
-
if (!target)
|
|
123
|
-
return source;
|
|
124
|
-
if (!source)
|
|
125
|
-
return target;
|
|
126
|
-
if (Array.isArray(target) && Array.isArray(source)) {
|
|
127
|
-
return [...target, ...source];
|
|
128
|
-
}
|
|
129
|
-
if (!Array.isArray(target) && !Array.isArray(source)) {
|
|
130
|
-
return { ...target, ...source };
|
|
131
|
-
}
|
|
132
|
-
const targetObj = Array.isArray(target) ? {} : target;
|
|
133
|
-
const sourceObj = Array.isArray(source) ? {} : source;
|
|
134
|
-
const targetArr = Array.isArray(target) ? target : [];
|
|
135
|
-
const sourceArr = Array.isArray(source) ? source : [];
|
|
136
|
-
return [...targetArr, ...sourceArr, { ...targetObj, ...sourceObj }];
|
|
137
|
-
}
|
|
138
|
-
async function resolveExtends(config) {
|
|
139
|
-
if (!config.extends) {
|
|
140
|
-
return config;
|
|
141
|
-
}
|
|
142
|
-
let baseConfig;
|
|
143
|
-
if (typeof config.extends === "string") {
|
|
144
|
-
const imported = await import(config.extends);
|
|
145
|
-
baseConfig = imported.default ?? imported;
|
|
146
|
-
} else {
|
|
147
|
-
baseConfig = config.extends;
|
|
148
|
-
}
|
|
149
|
-
baseConfig = await resolveExtends(baseConfig);
|
|
150
|
-
const { extends: _, ...currentWithoutExtends } = config;
|
|
151
|
-
return {
|
|
152
|
-
...baseConfig,
|
|
153
|
-
...currentWithoutExtends,
|
|
154
|
-
dependencies: mergeDependencies(baseConfig.dependencies, currentWithoutExtends.dependencies),
|
|
155
|
-
devDependencies: mergeDependencies(baseConfig.devDependencies, currentWithoutExtends.devDependencies),
|
|
156
|
-
peerDependencies: mergeDependencies(baseConfig.peerDependencies, currentWithoutExtends.peerDependencies),
|
|
157
|
-
scripts: { ...baseConfig.scripts, ...currentWithoutExtends.scripts },
|
|
158
|
-
scriptPresets: [
|
|
159
|
-
...baseConfig.scriptPresets ?? [],
|
|
160
|
-
...currentWithoutExtends.scriptPresets ?? []
|
|
161
|
-
]
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// src/utils/conditions.ts
|
|
166
|
-
function getContext() {
|
|
167
|
-
return {
|
|
168
|
-
env: "development",
|
|
169
|
-
platform: process.platform,
|
|
170
|
-
nodeVersion: process.version,
|
|
171
|
-
ci: process.env.CI === "true" || process.env.CI === "1"
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
function evaluateCondition(when, context) {
|
|
175
|
-
if (when.env !== undefined && context.env !== when.env) {
|
|
176
|
-
return false;
|
|
177
|
-
}
|
|
178
|
-
if (when.platform !== undefined && context.platform !== when.platform) {
|
|
179
|
-
return false;
|
|
180
|
-
}
|
|
181
|
-
if (when.ci !== undefined && context.ci !== when.ci) {
|
|
182
|
-
return false;
|
|
183
|
-
}
|
|
184
|
-
if (when.nodeVersion !== undefined) {
|
|
185
|
-
if (!context.nodeVersion.startsWith(when.nodeVersion)) {
|
|
186
|
-
return false;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
return true;
|
|
190
|
-
}
|
|
191
|
-
function applyConditions(baseConfig, conditions) {
|
|
192
|
-
if (!conditions || conditions.length === 0) {
|
|
193
|
-
return baseConfig;
|
|
194
|
-
}
|
|
195
|
-
const context = getContext();
|
|
196
|
-
let result = { ...baseConfig };
|
|
197
|
-
for (const condition of conditions) {
|
|
198
|
-
if (evaluateCondition(condition.when, context)) {
|
|
199
|
-
result = deepMerge(result, condition.set);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
return result;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// src/generator/createPackageJson.ts
|
|
206
|
-
async function createPackageJson(config, options = {}) {
|
|
207
|
-
const { indent = 2 } = options;
|
|
208
|
-
let resolved = await resolveExtends(config);
|
|
209
|
-
const presetScripts = resolved.scriptPresets ? getPresetScripts(resolved.scriptPresets) : {};
|
|
210
|
-
const finalScripts = mergeScripts(presetScripts, resolved.scripts);
|
|
211
|
-
const [dependencies, devDependencies, peerDependencies] = await Promise.all([
|
|
212
|
-
resolveDependenciesCached(resolved.dependencies),
|
|
213
|
-
resolveDependenciesCached(resolved.devDependencies),
|
|
214
|
-
resolveDependenciesCached(resolved.peerDependencies)
|
|
215
|
-
]);
|
|
216
|
-
const packageJson = {
|
|
217
|
-
name: resolved.name,
|
|
218
|
-
...resolved.version && { version: resolved.version },
|
|
219
|
-
...resolved.description && { description: resolved.description },
|
|
220
|
-
...resolved.keywords?.length && { keywords: resolved.keywords },
|
|
221
|
-
...resolved.homepage && { homepage: resolved.homepage },
|
|
222
|
-
...resolved.bugs && { bugs: resolved.bugs },
|
|
223
|
-
...resolved.license && { license: resolved.license },
|
|
224
|
-
...resolved.author && { author: resolved.author },
|
|
225
|
-
...resolved.contributors?.length && {
|
|
226
|
-
contributors: resolved.contributors
|
|
227
|
-
},
|
|
228
|
-
...resolved.repository && { repository: resolved.repository },
|
|
229
|
-
...resolved.type && { type: resolved.type },
|
|
230
|
-
...resolved.main && { main: resolved.main },
|
|
231
|
-
...resolved.module && { module: resolved.module },
|
|
232
|
-
...resolved.types && { types: resolved.types },
|
|
233
|
-
...resolved.exports && { exports: resolved.exports },
|
|
234
|
-
...resolved.bin && { bin: resolved.bin },
|
|
235
|
-
...resolved.files?.length && { files: resolved.files },
|
|
236
|
-
...Object.keys(finalScripts).length && { scripts: finalScripts },
|
|
237
|
-
...Object.keys(dependencies).length && { dependencies },
|
|
238
|
-
...Object.keys(devDependencies).length && { devDependencies },
|
|
239
|
-
...Object.keys(peerDependencies).length && { peerDependencies },
|
|
240
|
-
...resolved.optionalDependencies && {
|
|
241
|
-
optionalDependencies: resolved.optionalDependencies
|
|
242
|
-
},
|
|
243
|
-
...resolved.engines && { engines: resolved.engines },
|
|
244
|
-
...resolved.os?.length && { os: resolved.os },
|
|
245
|
-
...resolved.cpu?.length && { cpu: resolved.cpu },
|
|
246
|
-
...resolved.private !== undefined && { private: resolved.private },
|
|
247
|
-
...resolved.publishConfig && { publishConfig: resolved.publishConfig },
|
|
248
|
-
...resolved.workspaces?.length && { workspaces: resolved.workspaces }
|
|
249
|
-
};
|
|
250
|
-
const finalPackageJson = applyConditions(packageJson, resolved.conditions);
|
|
251
|
-
return JSON.stringify(finalPackageJson, null, indent);
|
|
252
|
-
}
|
|
253
|
-
async function writePackageJson(config, options = {}) {
|
|
254
|
-
const { outputPath = "package.json" } = options;
|
|
255
|
-
const json = await createPackageJson(config, options);
|
|
256
|
-
const { writeFile } = await import("node:fs/promises");
|
|
257
|
-
await writeFile(outputPath, json + `
|
|
258
|
-
`);
|
|
259
|
-
console.log(`✨ Generated ${outputPath}`);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// src/main.ts
|
|
263
|
-
function definePackageConfig(config) {
|
|
264
|
-
return config;
|
|
265
|
-
}
|
|
266
|
-
export {
|
|
267
|
-
writePackageJson,
|
|
268
|
-
definePackageConfig,
|
|
269
|
-
createPackageJson
|
|
270
|
-
};
|
|
271
|
-
|
|
272
|
-
//# debugId=0D3521357F57176D64756E2164756E21
|
|
1
|
+
import{createRequire as Z}from"node:module";var _=Z(import.meta.url);var $={typescript:{build:"tsc","build:watch":"tsc --watch",typecheck:"tsc --noEmit"},react:{dev:"vite",build:"vite build",preview:"vite preview"},node:{start:"node dist/index.js",dev:"tsx watch src/index.ts",build:"tsup src/index.ts --format esm,cjs --dts"},testing:{test:"vitest","test:watch":"vitest watch","test:coverage":"vitest --coverage"},prettier:{format:"prettier --write .","format:check":"prettier --check ."},eslint:{lint:"eslint .","lint:fix":"eslint . --fix"}};function K(S){let y={};for(let k of S){let P=$[k];if(P)Object.assign(y,P)}return y}function L(S,y){return{...S,...y}}function F(S){if(typeof S==="string"){let P=S.lastIndexOf("@");if(P>0)return{name:S.slice(0,P),version:S.slice(P+1)};return{name:S}}let[y,k]=Object.entries(S)[0];return{name:y,version:k}}async function D(S){let y=`https://registry.npmjs.org/${encodeURIComponent(S)}`,k=await fetch(y,{headers:{Accept:"application/json"}});if(!k.ok)throw Error(`Failed to fetch ${S}: ${k.statusText}`);return(await k.json())["dist-tags"].latest}var Q=new Map;async function J(S){if(!S)return{};if(!Array.isArray(S))return S;if(S.length===0)return{};let y=[];for(let k of S){let{name:P,version:G}=F(k);if(G){y.push([P,G]);continue}let R=Q.get(P);if(!R)R=`^${await D(P)}`,Q.set(P,R);y.push([P,R])}return Object.fromEntries(y)}function q(S,y){let k={...S};for(let P of Object.keys(y)){let G=y[P],R=S[P];if(G===void 0)continue;if(typeof G==="object"&&G!==null&&!Array.isArray(G)&&typeof R==="object"&&R!==null&&!Array.isArray(R))k[P]=q(R,G);else k[P]=G}return k}function O(S,y){if(!S&&!y)return;if(!S)return y;if(!y)return S;if(Array.isArray(S)&&Array.isArray(y))return[...S,...y];if(!Array.isArray(S)&&!Array.isArray(y))return{...S,...y};let k=Array.isArray(S)?{}:S,P=Array.isArray(y)?{}:y,G=Array.isArray(S)?S:[],R=Array.isArray(y)?y:[];return[...G,...R,{...k,...P}]}async function z(S){if(!S.extends)return S;let y;if(typeof S.extends==="string"){let G=await import(S.extends);y=G.default??G}else y=S.extends;y=await z(y);let{extends:k,...P}=S;return{...y,...P,dependencies:O(y.dependencies,P.dependencies),devDependencies:O(y.devDependencies,P.devDependencies),peerDependencies:O(y.peerDependencies,P.peerDependencies),scripts:{...y.scripts,...P.scripts},scriptPresets:[...y.scriptPresets??[],...P.scriptPresets??[]]}}function j(){return{env:"development",platform:process.platform,nodeVersion:process.version,ci:process.env.CI==="true"||process.env.CI==="1"}}function A(S,y){if(S.env!==void 0&&y.env!==S.env)return!1;if(S.platform!==void 0&&y.platform!==S.platform)return!1;if(S.ci!==void 0&&y.ci!==S.ci)return!1;if(S.nodeVersion!==void 0){if(!y.nodeVersion.startsWith(S.nodeVersion))return!1}return!0}function T(S,y){if(!y||y.length===0)return S;let k=j(),P={...S};for(let G of y)if(A(G.when,k))P=q(P,G.set);return P}async function U(S,y={}){let{indent:k=2}=y,P=await z(S),G=P.scriptPresets?K(P.scriptPresets):{},R=L(G,P.scripts),[B,H,I]=await Promise.all([J(P.dependencies),J(P.devDependencies),J(P.peerDependencies)]),X={name:P.name,...P.version&&{version:P.version},...P.description&&{description:P.description},...P.keywords?.length&&{keywords:P.keywords},...P.homepage&&{homepage:P.homepage},...P.bugs&&{bugs:P.bugs},...P.license&&{license:P.license},...P.author&&{author:P.author},...P.contributors?.length&&{contributors:P.contributors},...P.repository&&{repository:P.repository},...P.type&&{type:P.type},...P.main&&{main:P.main},...P.module&&{module:P.module},...P.types&&{types:P.types},...P.exports&&{exports:P.exports},...P.bin&&{bin:P.bin},...P.files?.length&&{files:P.files},...Object.keys(R).length&&{scripts:R},...Object.keys(B).length&&{dependencies:B},...Object.keys(H).length&&{devDependencies:H},...Object.keys(I).length&&{peerDependencies:I},...P.optionalDependencies&&{optionalDependencies:P.optionalDependencies},...P.engines&&{engines:P.engines},...P.os?.length&&{os:P.os},...P.cpu?.length&&{cpu:P.cpu},...P.private!==void 0&&{private:P.private},...P.publishConfig&&{publishConfig:P.publishConfig},...P.workspaces?.length&&{workspaces:P.workspaces}},Y=T(X,P.conditions);return JSON.stringify(Y,null,k)}async function M(S,y={}){let{outputPath:k="package.json"}=y,P=await U(S,y),{writeFile:G}=await import("node:fs/promises");await G(k,P+`
|
|
2
|
+
`),console.log(`✨ Generated ${k}`)}function g(S){return S}export{M as writePackageJson,g as definePackageConfig,g as definePackage,U as createPackageJson};
|
package/package.json
CHANGED
package/dist/main.js.map
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/presets/scripts.ts", "../src/resolvers/dependencies.ts", "../src/utils/merge.ts", "../src/utils/conditions.ts", "../src/generator/createPackageJson.ts", "../src/main.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"import type { ScriptPreset } from '../schemas/package'\n\ntype ScriptDefinitions = Record<string, string>\n\nconst scriptPresets: Record<ScriptPreset, ScriptDefinitions> = {\n typescript: {\n build: 'tsc',\n 'build:watch': 'tsc --watch',\n typecheck: 'tsc --noEmit',\n },\n\n react: {\n dev: 'vite',\n build: 'vite build',\n preview: 'vite preview',\n },\n\n node: {\n start: 'node dist/index.js',\n dev: 'tsx watch src/index.ts',\n build: 'tsup src/index.ts --format esm,cjs --dts',\n },\n\n testing: {\n test: 'vitest',\n 'test:watch': 'vitest watch',\n 'test:coverage': 'vitest --coverage',\n },\n\n prettier: {\n format: 'prettier --write .',\n 'format:check': 'prettier --check .',\n },\n\n eslint: {\n lint: 'eslint .',\n 'lint:fix': 'eslint . --fix',\n },\n}\n\nexport function getPresetScripts(presets: ScriptPreset[]): ScriptDefinitions {\n const merged: ScriptDefinitions = {}\n\n for (const preset of presets) {\n const scripts = scriptPresets[preset]\n if (scripts) {\n Object.assign(merged, scripts)\n }\n }\n\n return merged\n}\n\nexport function mergeScripts(\n presetScripts: ScriptDefinitions,\n customScripts?: ScriptDefinitions\n): ScriptDefinitions {\n return { ...presetScripts, ...customScripts }\n}\n",
|
|
6
|
-
"import type { DependencyInput, DependenciesInput } from '../schemas/package'\n\ninterface NpmPackageInfo {\n 'dist-tags': {\n latest: string\n [tag: string]: string\n }\n versions: Record<string, unknown>\n}\n\n// Parse dependency input: 'lodash' | 'lodash@^4' | { lodash: '^4.0.0' }\nfunction parseDependency(dep: DependencyInput): {\n name: string\n version?: string\n} {\n if (typeof dep === 'string') {\n const atIndex = dep.lastIndexOf('@')\n if (atIndex > 0) {\n return {\n name: dep.slice(0, atIndex),\n version: dep.slice(atIndex + 1),\n }\n }\n return { name: dep }\n }\n\n // Object form: { lodash: '^4.0.0' }\n const [name, version] = Object.entries(dep)[0]!\n return { name, version }\n}\n\n// Fetch latest version from npm registry\nasync function fetchLatestVersion(packageName: string): Promise<string> {\n const url = `https://registry.npmjs.org/${encodeURIComponent(packageName)}`\n\n const response = await fetch(url, {\n headers: { Accept: 'application/json' },\n })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch ${packageName}: ${response.statusText}`)\n }\n\n const data = (await response.json()) as NpmPackageInfo\n return data['dist-tags'].latest\n}\n\n// Resolve a single dependency to name: version pair\nasync function resolveDependency(\n dep: DependencyInput\n): Promise<[string, string]> {\n const { name, version } = parseDependency(dep)\n\n if (version) {\n return [name, version]\n }\n\n // Auto-resolve latest version with ^ prefix\n const latestVersion = await fetchLatestVersion(name)\n return [name, `^${latestVersion}`]\n}\n\n// Resolve all dependencies in parallel with batching\nexport async function resolveDependencies(\n deps: DependenciesInput | undefined\n): Promise<Record<string, string>> {\n if (!deps) {\n return {}\n }\n\n // If already an object (standard format), return as-is\n if (!Array.isArray(deps)) {\n return deps\n }\n\n if (deps.length === 0) {\n return {}\n }\n\n const results = await Promise.all(deps.map(resolveDependency))\n\n return Object.fromEntries(results)\n}\n\n// Cache for resolved versions (persists during single run)\nconst versionCache = new Map<string, string>()\n\nexport async function resolveDependenciesCached(\n deps: DependenciesInput | undefined\n): Promise<Record<string, string>> {\n if (!deps) {\n return {}\n }\n\n // If already an object (standard format), return as-is\n if (!Array.isArray(deps)) {\n return deps\n }\n\n if (deps.length === 0) {\n return {}\n }\n\n const results: [string, string][] = []\n\n for (const dep of deps) {\n const { name, version } = parseDependency(dep)\n\n if (version) {\n results.push([name, version])\n continue\n }\n\n // Check cache first\n let resolvedVersion = versionCache.get(name)\n if (!resolvedVersion) {\n resolvedVersion = `^${await fetchLatestVersion(name)}`\n versionCache.set(name, resolvedVersion)\n }\n\n results.push([name, resolvedVersion])\n }\n\n return Object.fromEntries(results)\n}\n",
|
|
7
|
-
"import type { PackageConfig, DependenciesInput } from '../schemas/package'\n\n// Deep merge two objects, with source overriding target\nexport function deepMerge<T extends Record<string, unknown>>(\n target: T,\n source: Partial<T>\n): T {\n const result = { ...target }\n\n for (const key of Object.keys(source) as (keyof T)[]) {\n const sourceValue = source[key]\n const targetValue = target[key]\n\n if (sourceValue === undefined) continue\n\n if (\n typeof sourceValue === 'object' &&\n sourceValue !== null &&\n !Array.isArray(sourceValue) &&\n typeof targetValue === 'object' &&\n targetValue !== null &&\n !Array.isArray(targetValue)\n ) {\n result[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n ) as T[keyof T]\n } else {\n result[key] = sourceValue as T[keyof T]\n }\n }\n\n return result\n}\n\n// Merge dependencies (handles both array and object formats)\nexport function mergeDependencies(\n target: DependenciesInput | undefined,\n source: DependenciesInput | undefined\n): DependenciesInput | undefined {\n if (!target && !source) return undefined\n if (!target) return source\n if (!source) return target\n\n // If both are arrays, concat them\n if (Array.isArray(target) && Array.isArray(source)) {\n return [...target, ...source]\n }\n\n // If both are objects, merge them\n if (!Array.isArray(target) && !Array.isArray(source)) {\n return { ...target, ...source }\n }\n\n // Mixed formats: convert array to object entries and merge\n const targetObj = Array.isArray(target) ? {} : target\n const sourceObj = Array.isArray(source) ? {} : source\n const targetArr = Array.isArray(target) ? target : []\n const sourceArr = Array.isArray(source) ? source : []\n\n // Return as array with both arrays and object merged\n return [...targetArr, ...sourceArr, { ...targetObj, ...sourceObj }]\n}\n\n// Resolve extends chain\nexport async function resolveExtends(\n config: PackageConfig\n): Promise<PackageConfig> {\n if (!config.extends) {\n return config\n }\n\n let baseConfig: PackageConfig\n\n if (typeof config.extends === 'string') {\n // Import from file path\n const imported = await import(config.extends)\n baseConfig = imported.default ?? imported\n } else {\n baseConfig = config.extends\n }\n\n // Recursively resolve base config's extends\n baseConfig = await resolveExtends(baseConfig)\n\n // Merge base into current (current overrides base)\n const { extends: _, ...currentWithoutExtends } = config\n\n return {\n ...baseConfig,\n ...currentWithoutExtends,\n // Merge dependencies (handles both array and object formats)\n dependencies: mergeDependencies(\n baseConfig.dependencies,\n currentWithoutExtends.dependencies\n ),\n devDependencies: mergeDependencies(\n baseConfig.devDependencies,\n currentWithoutExtends.devDependencies\n ),\n peerDependencies: mergeDependencies(\n baseConfig.peerDependencies,\n currentWithoutExtends.peerDependencies\n ),\n // Merge objects for scripts\n scripts: { ...baseConfig.scripts, ...currentWithoutExtends.scripts },\n scriptPresets: [\n ...(baseConfig.scriptPresets ?? []),\n ...(currentWithoutExtends.scriptPresets ?? []),\n ],\n }\n}\n",
|
|
8
|
-
"import type { ConditionalConfig, StandardPackageJson } from '../schemas/package'\nimport { deepMerge } from './merge'\n\ninterface ConditionContext {\n env: string\n platform: NodeJS.Platform\n nodeVersion: string\n ci: boolean\n}\n\nfunction getContext(): ConditionContext {\n return {\n env: process.env.NODE_ENV ?? 'development',\n platform: process.platform,\n nodeVersion: process.version,\n ci: process.env.CI === 'true' || process.env.CI === '1',\n }\n}\n\nfunction evaluateCondition(\n when: ConditionalConfig['when'],\n context: ConditionContext\n): boolean {\n if (when.env !== undefined && context.env !== when.env) {\n return false\n }\n\n if (when.platform !== undefined && context.platform !== when.platform) {\n return false\n }\n\n if (when.ci !== undefined && context.ci !== when.ci) {\n return false\n }\n\n if (when.nodeVersion !== undefined) {\n // Simple semver check (starts with)\n if (!context.nodeVersion.startsWith(when.nodeVersion)) {\n return false\n }\n }\n\n return true\n}\n\nexport function applyConditions(\n baseConfig: Partial<StandardPackageJson>,\n conditions: ConditionalConfig[] | undefined\n): Partial<StandardPackageJson> {\n if (!conditions || conditions.length === 0) {\n return baseConfig\n }\n\n const context = getContext()\n let result = { ...baseConfig }\n\n for (const condition of conditions) {\n if (evaluateCondition(condition.when, context)) {\n result = deepMerge(\n result,\n condition.set as Record<string, unknown>\n ) as Partial<StandardPackageJson>\n }\n }\n\n return result\n}\n",
|
|
9
|
-
"import type { PackageConfig, StandardPackageJson } from '../schemas/package'\nimport { getPresetScripts, mergeScripts } from '../presets/scripts'\nimport { resolveDependenciesCached } from '../resolvers/dependencies'\nimport { resolveExtends } from '../utils/merge'\nimport { applyConditions } from '../utils/conditions'\n\nexport interface GenerateOptions {\n indent?: number\n outputPath?: string\n}\n\nexport async function createPackageJson(\n config: PackageConfig,\n options: GenerateOptions = {}\n): Promise<string> {\n const { indent = 2 } = options\n\n // Step 1: Resolve extends chain\n let resolved = await resolveExtends(config)\n\n // Step 2: Build scripts from presets + custom\n const presetScripts = resolved.scriptPresets\n ? getPresetScripts(resolved.scriptPresets)\n : {}\n const finalScripts = mergeScripts(presetScripts, resolved.scripts)\n\n // Step 3: Resolve dependency versions\n const [dependencies, devDependencies, peerDependencies] = await Promise.all([\n resolveDependenciesCached(resolved.dependencies),\n resolveDependenciesCached(resolved.devDependencies),\n resolveDependenciesCached(resolved.peerDependencies),\n ])\n\n // Step 4: Build standard package.json\n const packageJson: StandardPackageJson = {\n name: resolved.name,\n ...(resolved.version && { version: resolved.version }),\n ...(resolved.description && { description: resolved.description }),\n ...(resolved.keywords?.length && { keywords: resolved.keywords }),\n ...(resolved.homepage && { homepage: resolved.homepage }),\n ...(resolved.bugs && { bugs: resolved.bugs }),\n ...(resolved.license && { license: resolved.license }),\n ...(resolved.author && { author: resolved.author }),\n ...(resolved.contributors?.length && {\n contributors: resolved.contributors,\n }),\n ...(resolved.repository && { repository: resolved.repository }),\n ...(resolved.type && { type: resolved.type }),\n ...(resolved.main && { main: resolved.main }),\n ...(resolved.module && { module: resolved.module }),\n ...(resolved.types && { types: resolved.types }),\n ...(resolved.exports && { exports: resolved.exports }),\n ...(resolved.bin && { bin: resolved.bin }),\n ...(resolved.files?.length && { files: resolved.files }),\n ...(Object.keys(finalScripts).length && { scripts: finalScripts }),\n ...(Object.keys(dependencies).length && { dependencies }),\n ...(Object.keys(devDependencies).length && { devDependencies }),\n ...(Object.keys(peerDependencies).length && { peerDependencies }),\n ...(resolved.optionalDependencies && {\n optionalDependencies: resolved.optionalDependencies,\n }),\n ...(resolved.engines && { engines: resolved.engines }),\n ...(resolved.os?.length && { os: resolved.os }),\n ...(resolved.cpu?.length && { cpu: resolved.cpu }),\n ...(resolved.private !== undefined && { private: resolved.private }),\n ...(resolved.publishConfig && { publishConfig: resolved.publishConfig }),\n ...(resolved.workspaces?.length && { workspaces: resolved.workspaces }),\n }\n\n // Step 5: Apply conditional configs\n const finalPackageJson = applyConditions(packageJson, resolved.conditions)\n\n return JSON.stringify(finalPackageJson, null, indent)\n}\n\nexport async function writePackageJson(\n config: PackageConfig,\n options: GenerateOptions = {}\n): Promise<void> {\n const { outputPath = 'package.json' } = options\n const json = await createPackageJson(config, options)\n const { writeFile } = await import('node:fs/promises')\n await writeFile(outputPath, json + '\\n')\n console.log(`✨ Generated ${outputPath}`)\n}\n",
|
|
10
|
-
"import type {\n PackageConfig,\n StandardPackageJson,\n ScriptPreset,\n DependencyInput,\n DependenciesInput,\n ConditionalConfig,\n License,\n} from './schemas/package'\nimport {\n createPackageJson,\n writePackageJson,\n type GenerateOptions,\n} from './generator/createPackageJson'\n\nexport function definePackageConfig(config: PackageConfig): PackageConfig {\n return config\n}\n\n// Run CLI if executed directly\nasync function main() {\n const configPath = process.argv[2] ?? 'package.config.ts'\n const outputPath = process.argv[3] ?? 'package.json'\n\n try {\n const configModule = await import(Bun.pathToFileURL(configPath).href)\n const config: PackageConfig = configModule.default ?? configModule\n\n await writePackageJson(config, { outputPath })\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ERR_MODULE_NOT_FOUND') {\n console.error(`❌ Config file not found: ${configPath}`)\n console.error('\\nCreate a package.config.ts file with:')\n console.error(`\nimport { definePackageConfig } from './src/main'\n\nexport default definePackageConfig({\n name: 'my-package',\n version: '1.0.0',\n scriptPresets: ['typescript', 'testing'],\n dependencies: ['lodash', 'zod'],\n devDependencies: ['typescript', 'vitest'],\n})\n`)\n process.exit(1)\n }\n throw error\n }\n}\n\n// Export everything\nexport {\n createPackageJson,\n writePackageJson,\n type PackageConfig,\n type StandardPackageJson,\n type ScriptPreset,\n type DependencyInput,\n type DependenciesInput,\n type ConditionalConfig,\n type GenerateOptions,\n type License,\n}\n"
|
|
11
|
-
],
|
|
12
|
-
"mappings": "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",
|
|
13
|
-
"debugId": "0D3521357F57176D64756E2164756E21",
|
|
14
|
-
"names": []
|
|
15
|
-
}
|