@a35hie/ts-pkg 0.2.1 → 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 CHANGED
@@ -22,12 +22,12 @@ bun add -D @a35hie/ts-pkg
22
22
 
23
23
  ## Usage
24
24
 
25
- Create a `package.config.ts` file:
25
+ Create a `package.ts` file:
26
26
 
27
27
  ```typescript
28
- import { definePackageConfig } from '@a35hie/ts-pkg'
28
+ import { definePackage } from '@a35hie/ts-pkg'
29
29
 
30
- export default definePackageConfig({
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.config.ts package.json
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.config.ts package.json
90
+ ts-pkg sync package.ts package.json
91
91
  ```
92
92
 
93
- This keeps your `package.config.ts` as the source of truth while still allowing quick installs via your package manager.
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 definePackageConfig({
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.config.ts
120
- export default definePackageConfig({
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
- ### `definePackageConfig(config: PackageConfig): PackageConfig`
154
+ ### `definePackage(config: PackageConfig): PackageConfig`
155
155
 
156
156
  Type-safe helper for defining your configuration.
157
157
 
package/dist/cli.js CHANGED
@@ -1,427 +1,17 @@
1
1
  #!/usr/bin/env bun
2
- import { createRequire } from "node:module";
3
- var __require = /* @__PURE__ */ createRequire(import.meta.url);
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
- function formatDepsObject(deps, indent = " ") {
282
- const entries = Object.entries(deps).sort(([a], [b]) => a.localeCompare(b));
283
- if (entries.length === 0)
284
- return "{}";
285
- return `{
286
- ${entries.map(([name, version]) => `${indent}'${name}': '${version}',`).join(`
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(`
287
8
  `)}
288
- }`;
289
- }
290
- async function syncDependencies(options = {}) {
291
- const {
292
- packageJsonPath = "package.json",
293
- configPath = "package.config.ts",
294
- quiet = false,
295
- delay = 0
296
- } = options;
297
- if (delay > 0) {
298
- await new Promise((resolve2) => setTimeout(resolve2, delay));
299
- }
300
- const absolutePackageJsonPath = resolve(process.cwd(), packageJsonPath);
301
- const absoluteConfigPath = resolve(process.cwd(), configPath);
302
- let packageJson;
303
- try {
304
- const packageJsonContent = await readFile(absolutePackageJsonPath, "utf-8");
305
- packageJson = JSON.parse(packageJsonContent);
306
- } catch (error) {
307
- const err = error;
308
- if (err.code === "ENOENT") {
309
- console.error(`× package.json not found: ${packageJsonPath}`);
310
- process.exit(1);
311
- }
312
- throw error;
313
- }
314
- let configContent;
315
- try {
316
- configContent = await readFile(absoluteConfigPath, "utf-8");
317
- } catch (error) {
318
- const err = error;
319
- if (err.code === "ENOENT") {
320
- console.error(`× Config file not found: ${configPath}`);
321
- console.error("Run ts-pkg init first to create a package.config.ts");
322
- process.exit(1);
323
- }
324
- throw error;
325
- }
326
- const deps = depsObjectToArray(packageJson.dependencies);
327
- const devDeps = depsObjectToArray(packageJson.devDependencies);
328
- const peerDeps = depsObjectToArray(packageJson.peerDependencies);
329
- let updatedContent = configContent;
330
- updatedContent = updateDepsInConfig(updatedContent, "dependencies", deps, packageJson.dependencies);
331
- updatedContent = updateDepsInConfig(updatedContent, "devDependencies", devDeps, packageJson.devDependencies);
332
- updatedContent = updateDepsInConfig(updatedContent, "peerDependencies", peerDeps, packageJson.peerDependencies);
333
- await writeFile(absoluteConfigPath, updatedContent);
334
- if (!quiet) {
335
- console.log(`✨ Synced dependencies to ${configPath}`);
336
- if (deps.length)
337
- console.log(` dependencies: ${deps.length} packages`);
338
- if (devDeps.length)
339
- console.log(` devDependencies: ${devDeps.length} packages`);
340
- if (peerDeps.length)
341
- console.log(` peerDependencies: ${peerDeps.length} packages`);
342
- }
343
- }
344
- function findBracketEnd(content, startIndex, openChar, closeChar) {
345
- let depth = 0;
346
- for (let i = startIndex;i < content.length; i++) {
347
- if (content[i] === openChar)
348
- depth++;
349
- else if (content[i] === closeChar) {
350
- depth--;
351
- if (depth === 0)
352
- return i;
353
- }
354
- }
355
- return -1;
356
- }
357
- function updateDepsInConfig(content, depType, depsArray, depsObject) {
358
- const arrayPattern = new RegExp(`(${depType}:\\s*)\\[`);
359
- const arrayMatch = arrayPattern.exec(content);
360
- if (arrayMatch && arrayMatch[1]) {
361
- const formattedDeps = formatDepsArray(depsArray);
362
- const arrayStart = arrayMatch.index + arrayMatch[1].length;
363
- const arrayEnd = findBracketEnd(content, arrayStart, "[", "]");
364
- if (arrayEnd !== -1) {
365
- return content.slice(0, arrayStart) + formattedDeps + content.slice(arrayEnd + 1);
366
- }
367
- }
368
- const objectPattern = new RegExp(`(${depType}:\\s*)\\{`);
369
- const objectMatch = objectPattern.exec(content);
370
- if (objectMatch && objectMatch[1]) {
371
- const formattedDeps = formatDepsObject(depsObject || {});
372
- const objStart = objectMatch.index + objectMatch[1].length;
373
- const objEnd = findBracketEnd(content, objStart, "{", "}");
374
- if (objEnd !== -1) {
375
- return content.slice(0, objStart) + formattedDeps + content.slice(objEnd + 1);
376
- }
377
- }
378
- if (depsArray.length > 0) {
379
- const formattedDeps = formatDepsArray(depsArray);
380
- const insertPatterns = [
381
- { pattern: /peerDependencies:\s*[\[{]/, after: true },
382
- { pattern: /devDependencies:\s*[\[{]/, after: true },
383
- { pattern: /dependencies:\s*[\[{]/, after: true },
384
- { pattern: /(\n\s*)(conditions:\s*\[)/, before: true },
385
- { pattern: /(\n\s*)(engines:\s*\{)/, before: true }
386
- ];
387
- for (const { pattern, after, before } of insertPatterns) {
388
- const m = pattern.exec(content);
389
- if (m) {
390
- if (after) {
391
- const startChar = content[m.index + m[0].length - 1];
392
- const isArray = startChar === "[";
393
- const bracketStart = m.index + m[0].length - 1;
394
- const bracketEnd = findBracketEnd(content, bracketStart, isArray ? "[" : "{", isArray ? "]" : "}");
395
- if (bracketEnd !== -1) {
396
- let insertPos = bracketEnd + 1;
397
- let char = content[insertPos];
398
- while (insertPos < content.length && char && /[,\s]/.test(char) && char !== `
399
- `) {
400
- insertPos++;
401
- char = content[insertPos];
402
- }
403
- if (content[insertPos] === `
404
- `)
405
- insertPos++;
406
- return content.slice(0, insertPos) + `
407
- ${depType}: ${formattedDeps},
408
- ` + content.slice(insertPos);
409
- }
410
- } else if (before) {
411
- return content.replace(pattern, `$1${depType}: ${formattedDeps},
412
- $1$2`);
413
- }
414
- }
415
- }
416
- }
417
- return content;
418
- }
419
-
420
- // src/cli.ts
421
- import { resolve as resolve2 } from "node:path";
422
- import { pathToFileURL } from "node:url";
423
- function printHelp() {
424
- console.log(`
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(`
425
15
  ts-pkg - TypeScript-based package.json generator
426
16
 
427
17
  Usage:
@@ -430,72 +20,27 @@ Usage:
430
20
  ts-pkg help Show this help message
431
21
 
432
22
  Commands:
433
- (default) Generate package.json from package.config.ts
434
- sync Sync dependencies from package.json back to package.config.ts
23
+ (default) Generate package.json from package.ts
24
+ sync Sync dependencies from package.json back to package.ts
435
25
 
436
26
  Examples:
437
- ts-pkg # Generate from package.config.ts
27
+ ts-pkg # Generate from package.ts
438
28
  ts-pkg my.config.ts # Generate from custom config
439
- ts-pkg sync # Sync deps to package.config.ts
440
- ts-pkg sync package.config.ts package.json
29
+ ts-pkg sync # Sync deps to package.ts
30
+ ts-pkg sync package.ts package.json
441
31
 
442
32
  Postinstall setup:
443
33
  Add to your package.json scripts:
444
34
  "postinstall": "ts-pkg sync"
445
- `);
446
- }
447
- async function runGenerate(configPath, outputPath) {
448
- const absoluteConfigPath = resolve2(process.cwd(), configPath);
449
- try {
450
- const configModule = await import(pathToFileURL(absoluteConfigPath).href);
451
- const config = configModule.default ?? configModule;
452
- await writePackageJson(config, { outputPath });
453
- } catch (error) {
454
- const err = error;
455
- if (err.code === "ERR_MODULE_NOT_FOUND" || err.code === "ENOENT") {
456
- console.error(`× Config file not found: ${configPath}`);
457
- console.error(`
458
- Create a package.config.ts file with:`);
459
- console.error(`
460
- 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'
461
38
 
462
- export default definePackageConfig({
39
+ export default definePackage({
463
40
  name: 'my-package',
464
41
  version: '1.0.0',
465
42
  scriptPresets: ['typescript', 'testing'],
466
43
  dependencies: ['lodash', 'zod'],
467
44
  devDependencies: ['typescript', 'vitest'],
468
45
  })
469
- `);
470
- process.exit(1);
471
- }
472
- console.error("× Error:", err.message);
473
- process.exit(1);
474
- }
475
- }
476
- async function runSync(configPath, packageJsonPath) {
477
- const isPostinstall = process.env.npm_lifecycle_event === "postinstall";
478
- await syncDependencies({
479
- configPath,
480
- packageJsonPath,
481
- delay: isPostinstall ? 100 : 0
482
- });
483
- }
484
- async function main() {
485
- const args = process.argv.slice(2);
486
- const command = args[0];
487
- if (command === "help" || command === "--help" || command === "-h") {
488
- printHelp();
489
- return;
490
- }
491
- if (command === "sync") {
492
- const configPath2 = args[1] ?? "package.config.ts";
493
- const packageJsonPath = args[2] ?? "package.json";
494
- await runSync(configPath2, packageJsonPath);
495
- return;
496
- }
497
- const configPath = args[0] ?? "package.config.ts";
498
- const outputPath = args[1] ?? "package.json";
499
- await runGenerate(configPath, outputPath);
500
- }
501
- 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 definePackageConfig(config: PackageConfig): PackageConfig;
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 { createRequire } from "node:module";
2
- var __require = /* @__PURE__ */ createRequire(import.meta.url);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a35hie/ts-pkg",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "TypeScript-based package.json with magical features",
5
5
  "license": "Apache-2.0",
6
6
  "repository": "https://github.com/a35hie/TsPkg",
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
- }