44 * @see https://github.com/flex-development/mkbuild
55 */
66
7- import { defineBuildConfig , type Config } from '@flex-development/mkbuild'
8- import { constant , define } from '@flex-development/tutils'
7+ import { unassert } from '@flex-development/estree-util-unassert'
8+ import {
9+ defineBuildConfig ,
10+ type Config ,
11+ type OutputMetadata
12+ } from '@flex-development/mkbuild'
13+ import pathe from '@flex-development/pathe'
14+ import {
15+ DOT ,
16+ constant ,
17+ define ,
18+ entries ,
19+ get ,
20+ overwrite
21+ } from '@flex-development/tutils'
922import { ok } from 'devlop'
10- import type { BuildResult , PluginBuild } from 'esbuild'
23+ import { fromJs } from 'esast-util-from-js'
24+ import type { BuildResult , Metafile , OutputFile , PluginBuild } from 'esbuild'
25+ import type { Program } from 'estree'
26+ import { attachComments } from 'estree-util-attach-comments'
27+ import { toJs } from 'estree-util-to-js'
28+ import { visit } from 'estree-util-visit'
1129import util from 'node:util'
1230import pkg from './package.json' assert { type : 'json' }
1331import tsconfig from './tsconfig.build.json' assert { type : 'json' }
1432
33+ declare module 'estree' {
34+ interface BaseNode {
35+ position ?: import ( 'unist' ) . Position | undefined
36+ }
37+ }
38+
1539/**
1640 * Build configuration options.
1741 *
@@ -23,23 +47,9 @@ const config: Config = defineBuildConfig({
2347 {
2448 dts : 'only'
2549 } ,
26- {
27- dts : 'only' ,
28- outdir : 'dist/dev'
29- } ,
3050 {
3151 dts : false ,
32- ignore : [ 'interfaces' ] ,
33- outdir : 'dist/dev' ,
34- sourcemap : true ,
35- sourcesContent : false
36- } ,
37- {
38- dts : false ,
39- ignore : [ 'interfaces' ] ,
40- plugins : [ ] ,
41- sourcemap : true ,
42- sourcesContent : false
52+ ignore : [ 'interfaces' , 'types' ]
4353 }
4454 ] ,
4555 plugins : [
@@ -59,7 +69,7 @@ const config: Config = defineBuildConfig({
5969 */
6070 setup ( build : PluginBuild ) : void {
6171 /**
62- * Regular expression used to fix module specifier .
72+ * Regular expression used to fix module specifiers .
6373 *
6474 * @const {RegExp} regex
6575 */
@@ -80,6 +90,160 @@ const config: Config = defineBuildConfig({
8090 }
8191 } )
8292 }
93+ } ,
94+ {
95+ /**
96+ * Plugin name.
97+ */
98+ name : unassert . name ,
99+
100+ /**
101+ * Remove assertions.
102+ *
103+ * @this {void}
104+ *
105+ * @param {PluginBuild } build - esbuild plugin api
106+ * @return {void } Nothing
107+ */
108+ setup ( build : PluginBuild ) : void {
109+ const {
110+ absWorkingDir : cwd = process . cwd ( ) ,
111+ format,
112+ outdir = DOT
113+ } = build . initialOptions
114+
115+ /**
116+ * Directory to store development output files.
117+ *
118+ * @const {string} devdir
119+ */
120+ const devdir : string = pathe . join ( outdir , 'dev' )
121+
122+ return void build . onEnd ( ( result : BuildResult ) : void => {
123+ ok ( result . metafile , 'expected metafile' )
124+ ok ( result . outputFiles , 'expected output files' )
125+
126+ /**
127+ * Output file filter.
128+ *
129+ * @const {RegExp} filter
130+ */
131+ const filter : RegExp = / \. [ c m ] { 0 , 1 } j s $ /
132+
133+ /**
134+ * Development output file metadata.
135+ *
136+ * @const {Metafile['outputs']} outputs
137+ */
138+ const outputs : Metafile [ 'outputs' ] = { }
139+
140+ /**
141+ * Development output files.
142+ *
143+ * @const {OutputFile[]} outputs
144+ */
145+ const outputFiles : OutputFile [ ] = [ ]
146+
147+ // get development output file metadata
148+ for ( const [ path , output ] of entries ( result . metafile . outputs ) ) {
149+ if ( filter . test ( path ) ) {
150+ define ( outputs , path . replace ( outdir , devdir ) , { value : output } )
151+ }
152+ }
153+
154+ // handle output files
155+ for ( const output of result . outputFiles ) {
156+ if ( filter . test ( output . path ) ) {
157+ /**
158+ * JavaScript syntax tree.
159+ *
160+ * @const {Program} tree
161+ */
162+ const tree : Program = fromJs ( output . text , {
163+ module : format !== 'iife'
164+ } )
165+
166+ // attach comments
167+ visit ( tree , node => void ( node . loc = node . position ) )
168+ attachComments ( tree , tree . comments )
169+ delete tree . comments
170+
171+ // remove assertions
172+ unassert ( tree )
173+
174+ /**
175+ * Relative path to output file.
176+ *
177+ * @const {string} outfile
178+ */
179+ const outfile : string = output . path . replace ( cwd + pathe . sep , '' )
180+
181+ /**
182+ * Path to development output file.
183+ *
184+ * @const {string} devpath
185+ */
186+ const devpath : string = pathe . resolve (
187+ cwd ,
188+ devdir ,
189+ outfile . replace ( outdir + pathe . sep , '' )
190+ )
191+
192+ /**
193+ * Output file text.
194+ *
195+ * @const {string} text
196+ */
197+ const text : string = toJs ( tree ) . value
198+
199+ /**
200+ * Output file contents.
201+ *
202+ * @const {Uint8Array} contents
203+ */
204+ const contents : Uint8Array = new util . TextEncoder ( ) . encode ( text )
205+
206+ /**
207+ * Output file metadata.
208+ *
209+ * @const {OutputMetadata} metadata
210+ */
211+ const metadata : OutputMetadata = get (
212+ result . metafile . outputs ,
213+ outfile
214+ )
215+
216+ // assert output file metadata
217+ ok ( metadata , 'expected output file metadata' )
218+
219+ // add development output file
220+ outputFiles . push (
221+ define ( { contents : output . contents , path : devpath } , 'text' , {
222+ get : constant ( output . text )
223+ } )
224+ )
225+
226+ // update output file
227+ define ( output , 'text' , { get : constant ( text ) } )
228+ output . contents = new util . TextEncoder ( ) . encode ( output . text )
229+
230+ // update output file metadata
231+ define ( result . metafile . outputs , outfile , {
232+ value : overwrite ( metadata , {
233+ bytes : contents . byteLength ,
234+ imports : metadata . imports . filter ( ( { path } ) => {
235+ return ! unassert . MODULES_REGEX . test ( path )
236+ } )
237+ } )
238+ } )
239+ }
240+ }
241+
242+ // update output files and metadata
243+ result . outputFiles = [ ...outputFiles , ...result . outputFiles ]
244+ result . metafile . outputs = { ...outputs , ...result . metafile . outputs }
245+ } )
246+ }
83247 }
84248 ] ,
85249 target : [
0 commit comments