jiek 1.1.4 → 1.1.6

Sign up to get free protection for your applications and to get access to all the features.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "jiek",
3
3
  "type": "module",
4
- "version": "1.1.4",
4
+ "version": "1.1.6",
5
5
  "description": "YiJie's personal kits.",
6
6
  "bin": {
7
7
  "jiek": "bin/jiek.js",
@@ -61,8 +61,8 @@
61
61
  "rollup": "^4.1.5",
62
62
  "rollup-plugin-esbuild": "^6.1.0",
63
63
  "typescript": "^5.0.0",
64
- "@jiek/pkger": "^0.2.0",
65
- "@jiek/utils": "^0.2.2"
64
+ "@jiek/utils": "^0.2.2",
65
+ "@jiek/pkger": "^0.2.0"
66
66
  },
67
67
  "optionalDependencies": {
68
68
  "@pnpm/filter-workspace-packages": "^7.2.13",
@@ -8,7 +8,8 @@ import { execaCommand } from 'execa'
8
8
 
9
9
  import { actionDone, actionRestore } from '../inner'
10
10
  import type { RollupProgressEvent, TemplateOptions } from '../rollup/base'
11
- import { getSelectedProjectsGraph } from '../utils/filterSupport'
11
+ import type { ProjectsGraph } from '../utils/filterSupport'
12
+ import { filterPackagesGraph } from '../utils/filterSupport'
12
13
  import { loadConfig } from '../utils/loadConfig'
13
14
  import { tsRegisterName } from '../utils/tsRegister'
14
15
 
@@ -40,138 +41,154 @@ program
40
41
  .description(description)
41
42
  .option('-s, --silent', "Don't display logs.")
42
43
  .option('-e, --entries <ENTRIES>', "Specify the entries of the package.json's 'exports' field.(support glob)")
44
+ .option('--without-js', 'Do not output js files.')
45
+ .option('--without-dts', 'Do not output dts files.')
43
46
  .option('-v, --verbose', 'Display debug logs.')
44
47
  .action(async ({
45
48
  silent,
46
49
  entries,
47
- verbose
50
+ verbose,
51
+ withoutJs,
52
+ withoutDts
48
53
  }: {
49
54
  silent: boolean
50
55
  entries: string
51
56
  verbose: boolean
57
+ withoutJs: boolean
58
+ withoutDts: boolean
52
59
  }) => {
53
60
  actionRestore()
54
61
  const { build } = loadConfig()
55
62
  silent = silent ?? build?.silent ?? false
56
- const {
57
- wd,
58
- value = {}
59
- } = await getSelectedProjectsGraph() ?? {}
60
-
61
- if (Object.keys(value).length === 0) {
62
- throw new Error('no package found')
63
- }
64
- const wdNodeModules = path.resolve(wd, 'node_modules')
65
- if (!fs.existsSync(wdNodeModules)) {
66
- fs.mkdirSync(wdNodeModules)
67
- }
68
- const jiekTempDir = (...paths: string[]) => path.resolve(wdNodeModules, '.jiek', ...paths)
69
- if (!fs.existsSync(jiekTempDir())) {
70
- fs.mkdirSync(jiekTempDir())
71
- }
72
63
 
73
- const rollupBinaryPath = require.resolve('rollup')
74
- .replace(/dist\/rollup.js$/, 'dist/bin/rollup')
75
64
  const multiBars = new MultiBar({
76
65
  clearOnComplete: false,
77
66
  hideCursor: true,
78
- format: '- {bar} | {status} | {input} | {message}'
67
+ format: '- {bar} | {status} | {pkgName} | {input} | {message}'
79
68
  }, Presets.shades_classic)
80
- let i = 0
81
- await Promise.all(
82
- Object.entries(value).map(async ([dir, manifest]) => {
83
- // TODO support auto build child packages in workspaces
84
- const escapeManifestName = manifest.name?.replace(/^@/g, '').replace(/\//g, '+')
85
- const configFile = jiekTempDir(
86
- `${escapeManifestName ?? `anonymous-${i++}`}.rollup.config.js`
87
- )
88
- fs.writeFileSync(configFile, FILE_TEMPLATE(manifest))
89
- let prefix = ''
90
- if (tsRegisterName) {
91
- prefix = `node -r ${tsRegisterName} `
92
- }
93
- const command = `${prefix}${rollupBinaryPath} --silent -c ${configFile}`
94
- const child = execaCommand(command, {
95
- ipc: true,
96
- cwd: dir,
97
- env: {
98
- ...process.env,
99
- JIEK_ROOT: wd,
100
- JIEK_ENTRIES: entries
69
+
70
+ const buildPackage = async ({
71
+ wd,
72
+ value = {}
73
+ }: ProjectsGraph) => {
74
+ if (Object.keys(value).length === 0) {
75
+ throw new Error('no package found')
76
+ }
77
+ const wdNodeModules = path.resolve(wd, 'node_modules')
78
+ if (!fs.existsSync(wdNodeModules)) {
79
+ fs.mkdirSync(wdNodeModules)
80
+ }
81
+ const jiekTempDir = (...paths: string[]) => path.resolve(wdNodeModules, '.jiek', ...paths)
82
+ if (!fs.existsSync(jiekTempDir())) {
83
+ fs.mkdirSync(jiekTempDir())
84
+ }
85
+
86
+ const rollupBinaryPath = require.resolve('rollup')
87
+ .replace(/dist\/rollup.js$/, 'dist/bin/rollup')
88
+ let i = 0
89
+ await Promise.all(
90
+ Object.entries(value).map(async ([dir, manifest]) => {
91
+ // TODO support auto build child packages in workspaces
92
+ const escapeManifestName = manifest.name?.replace(/^@/g, '').replace(/\//g, '+')
93
+ const configFile = jiekTempDir(
94
+ `${escapeManifestName ?? `anonymous-${i++}`}.rollup.config.js`
95
+ )
96
+ fs.writeFileSync(configFile, FILE_TEMPLATE(manifest))
97
+ let prefix = ''
98
+ if (tsRegisterName) {
99
+ prefix = `node -r ${tsRegisterName} `
101
100
  }
102
- })
103
- const bars: Record<string, ReturnType<typeof multiBars.create>> = {}
104
- let inputMaxLen = 10
105
- child.on('message', (e: RollupProgressEvent) => {
106
- if (e.type === 'debug') console.log(...(Array.isArray(e.data) ? e.data : [e.data]))
107
- })
108
- !silent && child.on('message', (e: RollupProgressEvent) => {
109
- if (e.type === 'init') {
110
- const { leafMap, targetsLength } = e.data
111
- const leafs = Array
112
- .from(leafMap.entries())
113
- .flatMap(([input, pathAndCondiions]) =>
114
- pathAndCondiions.map(([path, ...conditions]) => ({
115
- input,
116
- path,
117
- conditions
118
- }))
119
- )
120
- console.log(`Package '${manifest.name}' has ${targetsLength} targets to build`)
121
- leafs.forEach(({ input }) => {
122
- inputMaxLen = Math.max(inputMaxLen, input.length)
123
- })
124
- leafs.forEach(({ input, path }) => {
125
- const key = `${input}:${path}`
126
- if (bars[key]) return
127
- bars[key] = multiBars.create(50, 0, {
128
- input: input.padEnd(inputMaxLen),
129
- status: 'waiting'.padEnd(10)
130
- }, {
131
- barsize: 20,
132
- linewrap: true
101
+ const command = `${prefix}${rollupBinaryPath} --silent -c ${configFile}`
102
+ const child = execaCommand(command, {
103
+ ipc: true,
104
+ cwd: dir,
105
+ env: {
106
+ ...process.env,
107
+ JIEK_ROOT: wd,
108
+ JIEK_ENTRIES: entries,
109
+ JIEK_WITHOUT_JS: String(withoutJs),
110
+ JIEK_WITHOUT_DTS: String(withoutDts)
111
+ }
112
+ })
113
+ const bars: Record<string, ReturnType<typeof multiBars.create>> = {}
114
+ let inputMaxLen = 10
115
+ child.on('message', (e: RollupProgressEvent) => {
116
+ if (e.type === 'debug') console.log(...(Array.isArray(e.data) ? e.data : [e.data]))
117
+ })
118
+ !silent && child.on('message', (e: RollupProgressEvent) => {
119
+ if (e.type === 'init') {
120
+ const { leafMap, targetsLength } = e.data
121
+ const leafs = Array
122
+ .from(leafMap.entries())
123
+ .flatMap(([input, pathAndCondiions]) =>
124
+ pathAndCondiions.map(([path, ...conditions]) => ({
125
+ input,
126
+ path,
127
+ conditions
128
+ }))
129
+ )
130
+ console.log(`Package '${manifest.name}' has ${targetsLength} targets to build`)
131
+ leafs.forEach(({ input }) => {
132
+ inputMaxLen = Math.max(inputMaxLen, input.length)
133
+ })
134
+ leafs.forEach(({ input, path }) => {
135
+ const key = `${input}:${path}`
136
+ if (bars[key]) return
137
+ bars[key] = multiBars.create(50, 0, {
138
+ pkgName: manifest.name,
139
+ input: input.padEnd(inputMaxLen),
140
+ status: 'waiting'.padEnd(10)
141
+ }, {
142
+ barsize: 20,
143
+ linewrap: true
144
+ })
133
145
  })
146
+ }
147
+ if (e.type === 'progress') {
148
+ const {
149
+ path,
150
+ tags,
151
+ input,
152
+ event,
153
+ message
154
+ } = e.data
155
+ const bar = bars[`${input}:${path}`]
156
+ if (!bar) return
157
+ bar.update(
158
+ {
159
+ start: 0,
160
+ resolve: 20,
161
+ end: 50
162
+ }[event ?? 'start'] ?? 0,
163
+ {
164
+ input: input.padEnd(inputMaxLen),
165
+ status: event?.padEnd(10),
166
+ message: `${tags?.join(', ')}: ${message}`
167
+ }
168
+ )
169
+ }
170
+ })
171
+ await new Promise<void>((resolve, reject) => {
172
+ let errorStr = ''
173
+ child.stderr?.on('data', (data) => {
174
+ errorStr += data
134
175
  })
135
- }
136
- if (e.type === 'progress') {
137
- const {
138
- path,
139
- tags,
140
- input,
141
- event,
142
- message
143
- } = e.data
144
- const bar = bars[`${input}:${path}`]
145
- if (!bar) return
146
- bar.update(
147
- {
148
- start: 0,
149
- resolve: 20,
150
- end: 50
151
- }[event ?? 'start'] ?? 0,
152
- {
153
- input: input.padEnd(inputMaxLen),
154
- status: event?.padEnd(10),
155
- message: `${tags?.join(', ')}: ${message}`
156
- }
157
- )
158
- }
159
- })
160
- await new Promise<void>((resolve, reject) => {
161
- let errorStr = ''
162
- child.stderr?.on('data', (data) => {
163
- errorStr += data
176
+ child.once('exit', (code) =>
177
+ code === 0
178
+ ? resolve()
179
+ : reject(new Error(`rollup build failed:\n${errorStr}`)))
180
+ verbose && child.stdout?.pipe(process.stdout)
164
181
  })
165
- child.once('exit', (code) =>
166
- code === 0
167
- ? resolve()
168
- : reject(new Error(`rollup build failed:\n${errorStr}`)))
169
- verbose && child.stdout?.pipe(process.stdout)
170
182
  })
183
+ )
184
+ }
185
+ const filters: string[] = program.getOptionValue('filter').split(',')
186
+ const packages = await filterPackagesGraph(filters)
187
+ await Promise
188
+ .all(packages.map(buildPackage))
189
+ .finally(() => {
190
+ multiBars.stop()
171
191
  })
172
- ).finally(() => {
173
- multiBars.stop()
174
- })
175
192
 
176
193
  actionDone()
177
194
  })
@@ -15,6 +15,8 @@ export interface ConfigGenerateContext {
15
15
  conditionals: string[]
16
16
  }
17
17
 
18
+ export type OutputControl = boolean | ((context: ConfigGenerateContext) => boolean)
19
+
18
20
  export interface TemplateOptions {
19
21
  /**
20
22
  * When the user configures type: module, the generated output from entry points that don't
@@ -39,6 +41,8 @@ export interface TemplateOptions {
39
41
  dir?: Mapping2ROO<'dir'>
40
42
  sourcemap?: Mapping2ROO<'sourcemap'>
41
43
  strict?: Mapping2ROO<'strict'>
44
+ js?: OutputControl
45
+ dts?: OutputControl
42
46
  }
43
47
  plugins?:
44
48
  | InputPluginOption
@@ -33,13 +33,17 @@ interface PackageJSON {
33
33
 
34
34
  const {
35
35
  JIEK_ROOT,
36
- JIEK_ENTRIES
36
+ JIEK_ENTRIES,
37
+ JIEK_WITHOUT_JS,
38
+ JIEK_WITHOUT_DTS
37
39
  } = process.env
38
40
  const WORKSPACE_ROOT = JIEK_ROOT ?? getWorkspaceDir()
39
41
  const COMMON_OPTIONS = {} satisfies RollupOptions
40
42
  const COMMON_PLUGINS = [
41
43
  json()
42
44
  ]
45
+ const WITHOUT_JS = JIEK_WITHOUT_JS === 'true'
46
+ const WITHOUT_DTS = JIEK_WITHOUT_DTS === 'true'
43
47
 
44
48
  const config = loadConfig({
45
49
  root: WORKSPACE_ROOT
@@ -88,6 +92,22 @@ const resolveBuildPlugins = (context: ConfigGenerateContext, plugins: TemplateOp
88
92
  return { js, dts }
89
93
  }
90
94
 
95
+ const resolveOutputControls = (
96
+ context: ConfigGenerateContext,
97
+ output: TemplateOptions['output']
98
+ ): { js: boolean; dts: boolean } => ({
99
+ js: typeof output?.js === 'boolean'
100
+ ? output.js
101
+ : typeof output?.js === 'function'
102
+ ? output.js(context)
103
+ : true,
104
+ dts: typeof output?.dts === 'boolean'
105
+ ? output.dts
106
+ : typeof output?.dts === 'function'
107
+ ? output.dts(context)
108
+ : true
109
+ })
110
+
91
111
  const resolveWorkspacePath = (p: string) => resolve(WORKSPACE_ROOT, p)
92
112
 
93
113
  const pascalCase = (str: string) =>
@@ -212,8 +232,10 @@ const generateConfigs = (context: ConfigGenerateContext, options: TemplateOption
212
232
  }
213
233
  const jsOutputSuffix = extname(output)
214
234
  const tsOutputSuffix = jsOutputSuffix.replace(/(\.[cm]?)js$/, '.d$1ts')
215
- return [
216
- {
235
+ const { js: jsOutput, dts: dtsOutput } = resolveOutputControls(context, build.output)
236
+ const rollupOptions: RollupOptions[] = []
237
+ if (jsOutput && !WITHOUT_JS) {
238
+ rollupOptions.push({
217
239
  input: inputObj,
218
240
  external,
219
241
  output: [
@@ -268,8 +290,10 @@ const generateConfigs = (context: ConfigGenerateContext, options: TemplateOption
268
290
  }),
269
291
  jsPlugins
270
292
  ]
271
- },
272
- {
293
+ })
294
+ }
295
+ if (dtsOutput && !WITHOUT_DTS) {
296
+ rollupOptions.push({
273
297
  input: inputObj,
274
298
  external,
275
299
  output: [
@@ -321,8 +345,9 @@ const generateConfigs = (context: ConfigGenerateContext, options: TemplateOption
321
345
  }),
322
346
  dtsPlugins
323
347
  ]
324
- }
325
- ]
348
+ })
349
+ }
350
+ return rollupOptions
326
351
  }
327
352
 
328
353
  export function template(packageJSON: PackageJSON): RollupOptions[] {
@@ -1,4 +1,5 @@
1
1
  import fs from 'node:fs'
2
+ import { builtinModules } from 'node:module'
2
3
 
3
4
  const EXCLUDE_SUFFIX = [
4
5
  'te?xt',
@@ -18,11 +19,14 @@ export default function(jsonOrPath: string | Record<string, unknown> = process.c
18
19
  if (!name) {
19
20
  throw new Error('package.json must have a name field')
20
21
  }
22
+
21
23
  const external = <(string | RegExp)[]> Object
22
24
  .keys(dependencies)
23
25
  .concat(Object.keys(peerDependencies))
24
26
  .concat(Object.keys(optionalDependencies))
25
- return external
27
+ .concat(builtinModules)
28
+
29
+ return [...new Set(external)]
26
30
  .map(dep => new RegExp(`^${dep}(/.*)?$`))
27
31
  .concat([
28
32
  new RegExp(`^${name}(/.*)?(?<!${EXCLUDE_SUFFIX.map(suffix => `\\.${suffix}`).join('|')})$`),
@@ -18,10 +18,10 @@ try {
18
18
  } catch { /* empty */ }
19
19
  if (type !== '') {
20
20
  program
21
- .option('-f, --filter <filter>', 'filter packages')
21
+ .option('-f, --filter <filter>', 'filter packages, support fuzzy match and array. e.g. -f core,utils')
22
22
  }
23
23
 
24
- interface ProjectsGraph {
24
+ export interface ProjectsGraph {
25
25
  wd: string
26
26
  root: string
27
27
  value?: Record<string, {
@@ -31,8 +31,13 @@ interface ProjectsGraph {
31
31
  }>
32
32
  }
33
33
 
34
- export async function getSelectedProjectsGraph(): Promise<ProjectsGraph> {
35
- let filter = program.getOptionValue('filter')
34
+ export function filterPackagesGraph(filters: string[]): Promise<ProjectsGraph[]> {
35
+ return Promise.all(filters.map(async filter => getSelectedProjectsGraph(filter)))
36
+ }
37
+
38
+ export async function getSelectedProjectsGraph(
39
+ filter = program.getOptionValue('filter')
40
+ ): Promise<ProjectsGraph> {
36
41
  const root = getRoot()
37
42
  const { wd, notWorkspace } = getWD()
38
43
  if (!notWorkspace && type === 'pnpm') {