@a35hie/ts-pkg 0.1.0 → 0.1.1

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/dist/main.d.ts CHANGED
@@ -1,147 +1,87 @@
1
1
  // Generated by dts-bundle-generator v9.5.1
2
2
 
3
- export type License =
4
- | 'MIT'
5
- | 'Apache-2.0'
6
- | 'GPL-2.0-only'
7
- | 'GPL-2.0-or-later'
8
- | 'GPL-3.0-only'
9
- | 'GPL-3.0-or-later'
10
- | 'LGPL-2.1-only'
11
- | 'LGPL-2.1-or-later'
12
- | 'LGPL-3.0-only'
13
- | 'LGPL-3.0-or-later'
14
- | 'BSD-2-Clause'
15
- | 'BSD-3-Clause'
16
- | 'ISC'
17
- | 'MPL-2.0'
18
- | 'AGPL-3.0-only'
19
- | 'AGPL-3.0-or-later'
20
- | 'Unlicense'
21
- | 'WTFPL'
22
- | 'CC0-1.0'
23
- | 'CC-BY-4.0'
24
- | 'CC-BY-SA-4.0'
25
- | 'Zlib'
26
- | 'BSL-1.0'
27
- | 'EPL-2.0'
28
- | 'EUPL-1.2'
29
- | 'CDDL-1.0'
30
- | 'Artistic-2.0'
31
- | 'OSL-3.0'
32
- | 'AFL-3.0'
33
- | 'LPPL-1.3c'
34
- | (string & {})
3
+ export type License = "MIT" | "Apache-2.0" | "GPL-2.0-only" | "GPL-2.0-or-later" | "GPL-3.0-only" | "GPL-3.0-or-later" | "LGPL-2.1-only" | "LGPL-2.1-or-later" | "LGPL-3.0-only" | "LGPL-3.0-or-later" | "BSD-2-Clause" | "BSD-3-Clause" | "ISC" | "MPL-2.0" | "AGPL-3.0-only" | "AGPL-3.0-or-later" | "Unlicense" | "WTFPL" | "CC0-1.0" | "CC-BY-4.0" | "CC-BY-SA-4.0" | "Zlib" | "BSL-1.0" | "EPL-2.0" | "EUPL-1.2" | "CDDL-1.0" | "Artistic-2.0" | "OSL-3.0" | "AFL-3.0" | "LPPL-1.3c" | (string & {});
35
4
  export interface StandardPackageJson {
36
- name: string
37
- version?: string
38
- description?: string
39
- keywords?: string[]
40
- homepage?: string
41
- bugs?:
42
- | string
43
- | {
44
- url?: string
45
- email?: string
46
- }
47
- license?: License
48
- author?:
49
- | string
50
- | {
51
- name: string
52
- email?: string
53
- url?: string
54
- }
55
- contributors?: (
56
- | string
57
- | {
58
- name: string
59
- email?: string
60
- url?: string
61
- }
62
- )[]
63
- repository?:
64
- | string
65
- | {
66
- type: string
67
- url: string
68
- directory?: string
69
- }
70
- main?: string
71
- module?: string
72
- types?: string
73
- exports?: Record<
74
- string,
75
- | string
76
- | {
77
- import?: string
78
- require?: string
79
- types?: string
80
- }
81
- >
82
- bin?: string | Record<string, string>
83
- files?: string[]
84
- scripts?: Record<string, string>
85
- dependencies?: Record<string, string>
86
- devDependencies?: Record<string, string>
87
- peerDependencies?: Record<string, string>
88
- optionalDependencies?: Record<string, string>
89
- engines?: Record<string, string>
90
- os?: string[]
91
- cpu?: string[]
92
- private?: boolean
93
- publishConfig?: Record<string, unknown>
94
- workspaces?: string[]
95
- type?: 'module' | 'commonjs'
5
+ name: string;
6
+ version?: string;
7
+ description?: string;
8
+ keywords?: string[];
9
+ homepage?: string;
10
+ bugs?: string | {
11
+ url?: string;
12
+ email?: string;
13
+ };
14
+ license?: License;
15
+ author?: string | {
16
+ name: string;
17
+ email?: string;
18
+ url?: string;
19
+ };
20
+ contributors?: (string | {
21
+ name: string;
22
+ email?: string;
23
+ url?: string;
24
+ })[];
25
+ repository?: string | {
26
+ type: string;
27
+ url: string;
28
+ directory?: string;
29
+ };
30
+ main?: string;
31
+ module?: string;
32
+ types?: string;
33
+ exports?: Record<string, string | {
34
+ import?: string;
35
+ require?: string;
36
+ types?: string;
37
+ }>;
38
+ bin?: string | Record<string, string>;
39
+ files?: string[];
40
+ scripts?: Record<string, string>;
41
+ dependencies?: Record<string, string>;
42
+ devDependencies?: Record<string, string>;
43
+ peerDependencies?: Record<string, string>;
44
+ optionalDependencies?: Record<string, string>;
45
+ engines?: Record<string, string>;
46
+ os?: string[];
47
+ cpu?: string[];
48
+ private?: boolean;
49
+ publishConfig?: Record<string, unknown>;
50
+ workspaces?: string[];
51
+ type?: "module" | "commonjs";
96
52
  }
97
- export type ScriptPreset =
98
- | 'typescript'
99
- | 'react'
100
- | 'node'
101
- | 'testing'
102
- | 'prettier'
103
- | 'eslint'
104
- export type DependencyInput = string | Record<string, string>
53
+ export type ScriptPreset = "typescript" | "react" | "node" | "testing" | "prettier" | "eslint";
54
+ export type DependencyInput = string | Record<string, string>;
55
+ export type DependenciesInput = DependencyInput[] | Record<string, string>;
105
56
  export interface ConditionalConfig {
106
- when: {
107
- env?: string
108
- platform?: NodeJS.Platform
109
- nodeVersion?: string
110
- ci?: boolean
111
- }
112
- set: Partial<StandardPackageJson>
57
+ when: {
58
+ env?: string;
59
+ platform?: NodeJS.Platform;
60
+ nodeVersion?: string;
61
+ ci?: boolean;
62
+ };
63
+ set: Partial<StandardPackageJson>;
113
64
  }
114
- export interface PackageConfig extends Omit<
115
- StandardPackageJson,
116
- 'scripts' | 'dependencies' | 'devDependencies' | 'peerDependencies'
117
- > {
118
- extends?: string | PackageConfig
119
- scriptPresets?: ScriptPreset[]
120
- scripts?: Record<string, string>
121
- dependencies?: DependencyInput[]
122
- devDependencies?: DependencyInput[]
123
- peerDependencies?: DependencyInput[]
124
- conditions?: ConditionalConfig[]
125
- autoInfer?: {
126
- version?: boolean
127
- repository?: boolean
128
- author?: boolean
129
- }
65
+ export interface PackageConfig extends Omit<StandardPackageJson, "scripts" | "dependencies" | "devDependencies" | "peerDependencies"> {
66
+ extends?: string | PackageConfig;
67
+ scriptPresets?: ScriptPreset[];
68
+ scripts?: Record<string, string>;
69
+ dependencies?: DependenciesInput;
70
+ devDependencies?: DependenciesInput;
71
+ peerDependencies?: DependenciesInput;
72
+ conditions?: ConditionalConfig[];
73
+ autoInfer?: {
74
+ version?: boolean;
75
+ repository?: boolean;
76
+ author?: boolean;
77
+ };
130
78
  }
131
79
  export interface GenerateOptions {
132
- indent?: number
133
- outputPath?: string
80
+ indent?: number;
81
+ outputPath?: string;
134
82
  }
135
- export declare function createPackageJson(
136
- config: PackageConfig,
137
- options?: GenerateOptions
138
- ): Promise<string>
139
- export declare function writePackageJson(
140
- config: PackageConfig,
141
- options?: GenerateOptions
142
- ): Promise<void>
143
- export declare function definePackageConfig(
144
- config: PackageConfig
145
- ): PackageConfig
83
+ export declare function createPackageJson(config: PackageConfig, options?: GenerateOptions): Promise<string>;
84
+ export declare function writePackageJson(config: PackageConfig, options?: GenerateOptions): Promise<void>;
85
+ export declare function definePackageConfig(config: PackageConfig): PackageConfig;
146
86
 
147
- export {}
87
+ export {};
package/dist/main.js CHANGED
@@ -1,278 +1,279 @@
1
- import { createRequire } from 'node:module'
2
- var __require = /* @__PURE__ */ createRequire(import.meta.url)
1
+ import { createRequire } from "node:module";
2
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
3
3
 
4
4
  // src/presets/scripts.ts
5
5
  var scriptPresets = {
6
6
  typescript: {
7
- build: 'tsc',
8
- 'build:watch': 'tsc --watch',
9
- typecheck: 'tsc --noEmit',
7
+ build: "tsc",
8
+ "build:watch": "tsc --watch",
9
+ typecheck: "tsc --noEmit"
10
10
  },
11
11
  react: {
12
- dev: 'vite',
13
- build: 'vite build',
14
- preview: 'vite preview',
12
+ dev: "vite",
13
+ build: "vite build",
14
+ preview: "vite preview"
15
15
  },
16
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',
17
+ start: "node dist/index.js",
18
+ dev: "tsx watch src/index.ts",
19
+ build: "tsup src/index.ts --format esm,cjs --dts"
20
20
  },
21
21
  testing: {
22
- test: 'vitest',
23
- 'test:watch': 'vitest watch',
24
- 'test:coverage': 'vitest --coverage',
22
+ test: "vitest",
23
+ "test:watch": "vitest watch",
24
+ "test:coverage": "vitest --coverage"
25
25
  },
26
26
  prettier: {
27
- format: 'prettier --write .',
28
- 'format:check': 'prettier --check .',
27
+ format: "prettier --write .",
28
+ "format:check": "prettier --check ."
29
29
  },
30
30
  eslint: {
31
- lint: 'eslint .',
32
- 'lint:fix': 'eslint . --fix',
33
- },
34
- }
31
+ lint: "eslint .",
32
+ "lint:fix": "eslint . --fix"
33
+ }
34
+ };
35
35
  function getPresetScripts(presets) {
36
- const merged = {}
36
+ const merged = {};
37
37
  for (const preset of presets) {
38
- const scripts = scriptPresets[preset]
38
+ const scripts = scriptPresets[preset];
39
39
  if (scripts) {
40
- Object.assign(merged, scripts)
40
+ Object.assign(merged, scripts);
41
41
  }
42
42
  }
43
- return merged
43
+ return merged;
44
44
  }
45
45
  function mergeScripts(presetScripts, customScripts) {
46
- return { ...presetScripts, ...customScripts }
46
+ return { ...presetScripts, ...customScripts };
47
47
  }
48
48
 
49
49
  // src/resolvers/dependencies.ts
50
50
  function parseDependency(dep) {
51
- if (typeof dep === 'string') {
52
- const atIndex = dep.lastIndexOf('@')
51
+ if (typeof dep === "string") {
52
+ const atIndex = dep.lastIndexOf("@");
53
53
  if (atIndex > 0) {
54
54
  return {
55
55
  name: dep.slice(0, atIndex),
56
- version: dep.slice(atIndex + 1),
57
- }
56
+ version: dep.slice(atIndex + 1)
57
+ };
58
58
  }
59
- return { name: dep }
59
+ return { name: dep };
60
60
  }
61
- const [name, version] = Object.entries(dep)[0]
62
- return { name, version }
61
+ const [name, version] = Object.entries(dep)[0];
62
+ return { name, version };
63
63
  }
64
64
  async function fetchLatestVersion(packageName) {
65
- const url = `https://registry.npmjs.org/${encodeURIComponent(packageName)}`
65
+ const url = `https://registry.npmjs.org/${encodeURIComponent(packageName)}`;
66
66
  const response = await fetch(url, {
67
- headers: { Accept: 'application/json' },
68
- })
67
+ headers: { Accept: "application/json" }
68
+ });
69
69
  if (!response.ok) {
70
- throw new Error(`Failed to fetch ${packageName}: ${response.statusText}`)
70
+ throw new Error(`Failed to fetch ${packageName}: ${response.statusText}`);
71
71
  }
72
- const data = await response.json()
73
- return data['dist-tags'].latest
72
+ const data = await response.json();
73
+ return data["dist-tags"].latest;
74
74
  }
75
- var versionCache = new Map()
75
+ var versionCache = new Map;
76
76
  async function resolveDependenciesCached(deps) {
77
- if (!deps || deps.length === 0) {
78
- return {}
77
+ if (!deps) {
78
+ return {};
79
+ }
80
+ if (!Array.isArray(deps)) {
81
+ return deps;
82
+ }
83
+ if (deps.length === 0) {
84
+ return {};
79
85
  }
80
- const results = []
86
+ const results = [];
81
87
  for (const dep of deps) {
82
- const { name, version } = parseDependency(dep)
88
+ const { name, version } = parseDependency(dep);
83
89
  if (version) {
84
- results.push([name, version])
85
- continue
90
+ results.push([name, version]);
91
+ continue;
86
92
  }
87
- let resolvedVersion = versionCache.get(name)
93
+ let resolvedVersion = versionCache.get(name);
88
94
  if (!resolvedVersion) {
89
- resolvedVersion = `^${await fetchLatestVersion(name)}`
90
- versionCache.set(name, resolvedVersion)
95
+ resolvedVersion = `^${await fetchLatestVersion(name)}`;
96
+ versionCache.set(name, resolvedVersion);
91
97
  }
92
- results.push([name, resolvedVersion])
98
+ results.push([name, resolvedVersion]);
93
99
  }
94
- return Object.fromEntries(results)
100
+ return Object.fromEntries(results);
95
101
  }
96
102
 
97
103
  // src/utils/merge.ts
98
104
  function deepMerge(target, source) {
99
- const result = { ...target }
105
+ const result = { ...target };
100
106
  for (const key of Object.keys(source)) {
101
- const sourceValue = source[key]
102
- const targetValue = target[key]
103
- if (sourceValue === undefined) continue
104
- if (
105
- typeof sourceValue === 'object' &&
106
- sourceValue !== null &&
107
- !Array.isArray(sourceValue) &&
108
- typeof targetValue === 'object' &&
109
- targetValue !== null &&
110
- !Array.isArray(targetValue)
111
- ) {
112
- result[key] = deepMerge(targetValue, sourceValue)
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
113
  } else {
114
- result[key] = sourceValue
114
+ result[key] = sourceValue;
115
115
  }
116
116
  }
117
- return result
117
+ return result;
118
118
  }
119
- function mergeArrays(target, source) {
120
- return [...(target ?? []), ...(source ?? [])]
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 }];
121
137
  }
122
138
  async function resolveExtends(config) {
123
139
  if (!config.extends) {
124
- return config
140
+ return config;
125
141
  }
126
- let baseConfig
127
- if (typeof config.extends === 'string') {
128
- const imported = await import(config.extends)
129
- baseConfig = imported.default ?? imported
142
+ let baseConfig;
143
+ if (typeof config.extends === "string") {
144
+ const imported = await import(config.extends);
145
+ baseConfig = imported.default ?? imported;
130
146
  } else {
131
- baseConfig = config.extends
147
+ baseConfig = config.extends;
132
148
  }
133
- baseConfig = await resolveExtends(baseConfig)
134
- const { extends: _, ...currentWithoutExtends } = config
149
+ baseConfig = await resolveExtends(baseConfig);
150
+ const { extends: _, ...currentWithoutExtends } = config;
135
151
  return {
136
152
  ...baseConfig,
137
153
  ...currentWithoutExtends,
138
- dependencies: mergeArrays(
139
- baseConfig.dependencies,
140
- currentWithoutExtends.dependencies
141
- ),
142
- devDependencies: mergeArrays(
143
- baseConfig.devDependencies,
144
- currentWithoutExtends.devDependencies
145
- ),
146
- peerDependencies: mergeArrays(
147
- baseConfig.peerDependencies,
148
- currentWithoutExtends.peerDependencies
149
- ),
154
+ dependencies: mergeDependencies(baseConfig.dependencies, currentWithoutExtends.dependencies),
155
+ devDependencies: mergeDependencies(baseConfig.devDependencies, currentWithoutExtends.devDependencies),
156
+ peerDependencies: mergeDependencies(baseConfig.peerDependencies, currentWithoutExtends.peerDependencies),
150
157
  scripts: { ...baseConfig.scripts, ...currentWithoutExtends.scripts },
151
158
  scriptPresets: [
152
- ...(baseConfig.scriptPresets ?? []),
153
- ...(currentWithoutExtends.scriptPresets ?? []),
154
- ],
155
- }
159
+ ...baseConfig.scriptPresets ?? [],
160
+ ...currentWithoutExtends.scriptPresets ?? []
161
+ ]
162
+ };
156
163
  }
157
164
 
158
165
  // src/utils/conditions.ts
159
166
  function getContext() {
160
167
  return {
161
- env: 'development',
168
+ env: "development",
162
169
  platform: process.platform,
163
170
  nodeVersion: process.version,
164
- ci: process.env.CI === 'true' || process.env.CI === '1',
165
- }
171
+ ci: process.env.CI === "true" || process.env.CI === "1"
172
+ };
166
173
  }
167
174
  function evaluateCondition(when, context) {
168
175
  if (when.env !== undefined && context.env !== when.env) {
169
- return false
176
+ return false;
170
177
  }
171
178
  if (when.platform !== undefined && context.platform !== when.platform) {
172
- return false
179
+ return false;
173
180
  }
174
181
  if (when.ci !== undefined && context.ci !== when.ci) {
175
- return false
182
+ return false;
176
183
  }
177
184
  if (when.nodeVersion !== undefined) {
178
185
  if (!context.nodeVersion.startsWith(when.nodeVersion)) {
179
- return false
186
+ return false;
180
187
  }
181
188
  }
182
- return true
189
+ return true;
183
190
  }
184
191
  function applyConditions(baseConfig, conditions) {
185
192
  if (!conditions || conditions.length === 0) {
186
- return baseConfig
193
+ return baseConfig;
187
194
  }
188
- const context = getContext()
189
- let result = { ...baseConfig }
195
+ const context = getContext();
196
+ let result = { ...baseConfig };
190
197
  for (const condition of conditions) {
191
198
  if (evaluateCondition(condition.when, context)) {
192
- result = deepMerge(result, condition.set)
199
+ result = deepMerge(result, condition.set);
193
200
  }
194
201
  }
195
- return result
202
+ return result;
196
203
  }
197
204
 
198
205
  // src/generator/createPackageJson.ts
199
206
  async function createPackageJson(config, options = {}) {
200
- const { indent = 2 } = options
201
- let resolved = await resolveExtends(config)
202
- const presetScripts = resolved.scriptPresets
203
- ? getPresetScripts(resolved.scriptPresets)
204
- : {}
205
- const finalScripts = mergeScripts(presetScripts, resolved.scripts)
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);
206
211
  const [dependencies, devDependencies, peerDependencies] = await Promise.all([
207
212
  resolveDependenciesCached(resolved.dependencies),
208
213
  resolveDependenciesCached(resolved.devDependencies),
209
- resolveDependenciesCached(resolved.peerDependencies),
210
- ])
214
+ resolveDependenciesCached(resolved.peerDependencies)
215
+ ]);
211
216
  const packageJson = {
212
217
  name: resolved.name,
213
- ...(resolved.version && { version: resolved.version }),
214
- ...(resolved.description && { description: resolved.description }),
215
- ...(resolved.keywords?.length && { keywords: resolved.keywords }),
216
- ...(resolved.homepage && { homepage: resolved.homepage }),
217
- ...(resolved.bugs && { bugs: resolved.bugs }),
218
- ...(resolved.license && { license: resolved.license }),
219
- ...(resolved.author && { author: resolved.author }),
220
- ...(resolved.contributors?.length && {
221
- contributors: resolved.contributors,
222
- }),
223
- ...(resolved.repository && { repository: resolved.repository }),
224
- ...(resolved.type && { type: resolved.type }),
225
- ...(resolved.main && { main: resolved.main }),
226
- ...(resolved.module && { module: resolved.module }),
227
- ...(resolved.types && { types: resolved.types }),
228
- ...(resolved.exports && { exports: resolved.exports }),
229
- ...(resolved.bin && { bin: resolved.bin }),
230
- ...(resolved.files?.length && { files: resolved.files }),
231
- ...(Object.keys(finalScripts).length && { scripts: finalScripts }),
232
- ...(Object.keys(dependencies).length && { dependencies }),
233
- ...(Object.keys(devDependencies).length && { devDependencies }),
234
- ...(Object.keys(peerDependencies).length && { peerDependencies }),
235
- ...(resolved.optionalDependencies && {
236
- optionalDependencies: resolved.optionalDependencies,
237
- }),
238
- ...(resolved.engines && { engines: resolved.engines }),
239
- ...(resolved.os?.length && { os: resolved.os }),
240
- ...(resolved.cpu?.length && { cpu: resolved.cpu }),
241
- ...(resolved.private !== undefined && { private: resolved.private }),
242
- ...(resolved.publishConfig && { publishConfig: resolved.publishConfig }),
243
- ...(resolved.workspaces?.length && { workspaces: resolved.workspaces }),
244
- }
245
- const finalPackageJson = applyConditions(packageJson, resolved.conditions)
246
- return JSON.stringify(finalPackageJson, null, indent)
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);
247
252
  }
248
253
  async function writePackageJson(config, options = {}) {
249
- const { outputPath = 'package.json' } = options
250
- const json = await createPackageJson(config, options)
251
- await Bun.write(
252
- outputPath,
253
- json +
254
- `
255
- `
256
- )
257
- console.log(`✨ Generated ${outputPath}`)
254
+ const { outputPath = "package.json" } = options;
255
+ const json = await createPackageJson(config, options);
256
+ await Bun.write(outputPath, json + `
257
+ `);
258
+ console.log(`✨ Generated ${outputPath}`);
258
259
  }
259
260
 
260
261
  // src/main.ts
261
262
  function definePackageConfig(config) {
262
- return config
263
+ return config;
263
264
  }
264
265
  async function main() {
265
- const configPath = process.argv[2] ?? 'package.config.ts'
266
- const outputPath = process.argv[3] ?? 'package.json'
266
+ const configPath = process.argv[2] ?? "package.config.ts";
267
+ const outputPath = process.argv[3] ?? "package.json";
267
268
  try {
268
- const configModule = await import(Bun.pathToFileURL(configPath).href)
269
- const config = configModule.default ?? configModule
270
- await writePackageJson(config, { outputPath })
269
+ const configModule = await import(Bun.pathToFileURL(configPath).href);
270
+ const config = configModule.default ?? configModule;
271
+ await writePackageJson(config, { outputPath });
271
272
  } catch (error) {
272
- if (error.code === 'ERR_MODULE_NOT_FOUND') {
273
- console.error(`❌ Config file not found: ${configPath}`)
273
+ if (error.code === "ERR_MODULE_NOT_FOUND") {
274
+ console.error(`❌ Config file not found: ${configPath}`);
274
275
  console.error(`
275
- Create a package.config.ts file with:`)
276
+ Create a package.config.ts file with:`);
276
277
  console.error(`
277
278
  import { definePackageConfig } from './src/main'
278
279
 
@@ -283,15 +284,19 @@ export default definePackageConfig({
283
284
  dependencies: ['lodash', 'zod'],
284
285
  devDependencies: ['typescript', 'vitest'],
285
286
  })
286
- `)
287
- process.exit(1)
287
+ `);
288
+ process.exit(1);
288
289
  }
289
- throw error
290
+ throw error;
290
291
  }
291
292
  }
292
293
  if (__require.main == __require.module) {
293
- main()
294
+ main();
294
295
  }
295
- export { writePackageJson, definePackageConfig, createPackageJson }
296
+ export {
297
+ writePackageJson,
298
+ definePackageConfig,
299
+ createPackageJson
300
+ };
296
301
 
297
- //# debugId=B903D397D524CA2964756E2164756E21
302
+ //# debugId=0021DE6288BCB32D64756E2164756E21
package/dist/main.js.map CHANGED
@@ -3,13 +3,13 @@
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
4
  "sourcesContent": [
5
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 } 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: DependencyInput[] | undefined\n): Promise<Record<string, string>> {\n if (!deps || 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: DependencyInput[] | undefined\n): Promise<Record<string, string>> {\n if (!deps || 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, StandardPackageJson } 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 arrays (for dependencies)\nexport function mergeArrays<T>(\n target: T[] | undefined,\n source: T[] | undefined\n): T[] {\n return [...(target ?? []), ...(source ?? [])]\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 arrays for dependencies\n dependencies: mergeArrays(\n baseConfig.dependencies,\n currentWithoutExtends.dependencies\n ),\n devDependencies: mergeArrays(\n baseConfig.devDependencies,\n currentWithoutExtends.devDependencies\n ),\n peerDependencies: mergeArrays(\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",
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
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
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 await Bun.write(outputPath, json + '\\n')\n console.log(`✨ Generated ${outputPath}`)\n}\n",
10
- "import type {\n PackageConfig,\n StandardPackageJson,\n ScriptPreset,\n DependencyInput,\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 ConditionalConfig,\n type GenerateOptions,\n type License,\n}\n\n// Run if main module\nif (import.meta.main) {\n main()\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\n// Run if main module\nif (import.meta.main) {\n main()\n}\n"
11
11
  ],
12
- "mappings": "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",
13
- "debugId": "B903D397D524CA2964756E2164756E21",
12
+ "mappings": "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",
13
+ "debugId": "0021DE6288BCB32D64756E2164756E21",
14
14
  "names": []
15
15
  }
package/package.config.ts CHANGED
@@ -2,7 +2,7 @@ import { definePackageConfig } from '@/main.ts'
2
2
 
3
3
  export default definePackageConfig({
4
4
  name: '@a35hie/ts-pkg',
5
- version: '0.1.0',
5
+ version: '0.1.1',
6
6
  description: 'TypeScript-based package.json with magical features',
7
7
  type: 'module',
8
8
  license: 'Apache-2.0',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a35hie/ts-pkg",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
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/src/main.ts CHANGED
@@ -3,6 +3,7 @@ import type {
3
3
  StandardPackageJson,
4
4
  ScriptPreset,
5
5
  DependencyInput,
6
+ DependenciesInput,
6
7
  ConditionalConfig,
7
8
  License,
8
9
  } from './schemas/package'
@@ -55,6 +56,7 @@ export {
55
56
  type StandardPackageJson,
56
57
  type ScriptPreset,
57
58
  type DependencyInput,
59
+ type DependenciesInput,
58
60
  type ConditionalConfig,
59
61
  type GenerateOptions,
60
62
  type License,
@@ -1,4 +1,4 @@
1
- import type { DependencyInput } from '../schemas/package'
1
+ import type { DependencyInput, DependenciesInput } from '../schemas/package'
2
2
 
3
3
  interface NpmPackageInfo {
4
4
  'dist-tags': {
@@ -62,9 +62,18 @@ async function resolveDependency(
62
62
 
63
63
  // Resolve all dependencies in parallel with batching
64
64
  export async function resolveDependencies(
65
- deps: DependencyInput[] | undefined
65
+ deps: DependenciesInput | undefined
66
66
  ): Promise<Record<string, string>> {
67
- if (!deps || deps.length === 0) {
67
+ if (!deps) {
68
+ return {}
69
+ }
70
+
71
+ // If already an object (standard format), return as-is
72
+ if (!Array.isArray(deps)) {
73
+ return deps
74
+ }
75
+
76
+ if (deps.length === 0) {
68
77
  return {}
69
78
  }
70
79
 
@@ -77,9 +86,18 @@ export async function resolveDependencies(
77
86
  const versionCache = new Map<string, string>()
78
87
 
79
88
  export async function resolveDependenciesCached(
80
- deps: DependencyInput[] | undefined
89
+ deps: DependenciesInput | undefined
81
90
  ): Promise<Record<string, string>> {
82
- if (!deps || deps.length === 0) {
91
+ if (!deps) {
92
+ return {}
93
+ }
94
+
95
+ // If already an object (standard format), return as-is
96
+ if (!Array.isArray(deps)) {
97
+ return deps
98
+ }
99
+
100
+ if (deps.length === 0) {
83
101
  return {}
84
102
  }
85
103
 
@@ -76,9 +76,12 @@ export type ScriptPreset =
76
76
  | 'prettier'
77
77
  | 'eslint'
78
78
 
79
- // Dependency can be: 'lodash' | 'lodash@^4' | { lodash: '^4.0.0' }
79
+ // Dependency can be: 'lodash' | 'lodash@^4' | { lodash: '^4.0.0' } | Record<string, string>
80
80
  export type DependencyInput = string | Record<string, string>
81
81
 
82
+ // Dependencies can be array (magical) or object (standard)
83
+ export type DependenciesInput = DependencyInput[] | Record<string, string>
84
+
82
85
  // Conditional config block
83
86
  export interface ConditionalConfig {
84
87
  when: {
@@ -102,10 +105,10 @@ export interface PackageConfig extends Omit<
102
105
  scriptPresets?: ScriptPreset[]
103
106
  scripts?: Record<string, string>
104
107
 
105
- // Magical dependency inputs (auto-resolve versions)
106
- dependencies?: DependencyInput[]
107
- devDependencies?: DependencyInput[]
108
- peerDependencies?: DependencyInput[]
108
+ // Magical dependency inputs (auto-resolve versions) or standard object format
109
+ dependencies?: DependenciesInput
110
+ devDependencies?: DependenciesInput
111
+ peerDependencies?: DependenciesInput
109
112
 
110
113
  // Conditional configuration
111
114
  conditions?: ConditionalConfig[]
@@ -1,4 +1,4 @@
1
- import type { PackageConfig } from '../schemas/package'
1
+ import type { PackageConfig, DependenciesInput } from '../schemas/package'
2
2
 
3
3
  // Deep merge two objects, with source overriding target
4
4
  export function deepMerge<T extends Record<string, unknown>>(
@@ -33,12 +33,33 @@ export function deepMerge<T extends Record<string, unknown>>(
33
33
  return result
34
34
  }
35
35
 
36
- // Merge arrays (for dependencies)
37
- export function mergeArrays<T>(
38
- target: T[] | undefined,
39
- source: T[] | undefined
40
- ): T[] {
41
- return [...(target ?? []), ...(source ?? [])]
36
+ // Merge dependencies (handles both array and object formats)
37
+ export function mergeDependencies(
38
+ target: DependenciesInput | undefined,
39
+ source: DependenciesInput | undefined
40
+ ): DependenciesInput | undefined {
41
+ if (!target && !source) return undefined
42
+ if (!target) return source
43
+ if (!source) return target
44
+
45
+ // If both are arrays, concat them
46
+ if (Array.isArray(target) && Array.isArray(source)) {
47
+ return [...target, ...source]
48
+ }
49
+
50
+ // If both are objects, merge them
51
+ if (!Array.isArray(target) && !Array.isArray(source)) {
52
+ return { ...target, ...source }
53
+ }
54
+
55
+ // Mixed formats: convert array to object entries and merge
56
+ const targetObj = Array.isArray(target) ? {} : target
57
+ const sourceObj = Array.isArray(source) ? {} : source
58
+ const targetArr = Array.isArray(target) ? target : []
59
+ const sourceArr = Array.isArray(source) ? source : []
60
+
61
+ // Return as array with both arrays and object merged
62
+ return [...targetArr, ...sourceArr, { ...targetObj, ...sourceObj }]
42
63
  }
43
64
 
44
65
  // Resolve extends chain
@@ -68,16 +89,16 @@ export async function resolveExtends(
68
89
  return {
69
90
  ...baseConfig,
70
91
  ...currentWithoutExtends,
71
- // Merge arrays for dependencies
72
- dependencies: mergeArrays(
92
+ // Merge dependencies (handles both array and object formats)
93
+ dependencies: mergeDependencies(
73
94
  baseConfig.dependencies,
74
95
  currentWithoutExtends.dependencies
75
96
  ),
76
- devDependencies: mergeArrays(
97
+ devDependencies: mergeDependencies(
77
98
  baseConfig.devDependencies,
78
99
  currentWithoutExtends.devDependencies
79
100
  ),
80
- peerDependencies: mergeArrays(
101
+ peerDependencies: mergeDependencies(
81
102
  baseConfig.peerDependencies,
82
103
  currentWithoutExtends.peerDependencies
83
104
  ),