@calmdown/rolldown-workspace 1.0.0-rc.1 → 1.0.0-rc.2
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/index.d.ts +18 -28
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/readme.md +4 -4
package/dist/index.d.ts
CHANGED
|
@@ -86,7 +86,6 @@ interface FileSystem {
|
|
|
86
86
|
interface GlobOptions {
|
|
87
87
|
cwd: string;
|
|
88
88
|
}
|
|
89
|
-
declare function defaultFileSystem(): Promise<FileSystem>;
|
|
90
89
|
//#endregion
|
|
91
90
|
//#region src/workspace/Package.d.ts
|
|
92
91
|
interface PackageDeclaration {
|
|
@@ -178,13 +177,6 @@ declare function overrideConsole(reporter: Reporter): void;
|
|
|
178
177
|
declare function restoreConsole(): void;
|
|
179
178
|
//#endregion
|
|
180
179
|
//#region src/cli/StreamReporter.d.ts
|
|
181
|
-
interface PackageInfo {
|
|
182
|
-
readonly pkg: Package;
|
|
183
|
-
status: StatusKind;
|
|
184
|
-
buildStartTime: number;
|
|
185
|
-
buildEndTime: number;
|
|
186
|
-
message?: string;
|
|
187
|
-
}
|
|
188
180
|
declare class StreamReporter implements Reporter {
|
|
189
181
|
private readonly output;
|
|
190
182
|
reportStackTraces: boolean;
|
|
@@ -215,9 +207,6 @@ declare class StreamReporter implements Reporter {
|
|
|
215
207
|
//#region src/cli/NoOpReporter.d.ts
|
|
216
208
|
declare const NoOpReporter: Reporter;
|
|
217
209
|
//#endregion
|
|
218
|
-
//#region src/cli/stringify.d.ts
|
|
219
|
-
declare function safeStringifyStruct(value: unknown, indent?: string, visited?: WeakSet<WeakKey>): any;
|
|
220
|
-
//#endregion
|
|
221
210
|
//#region src/factory/common.d.ts
|
|
222
211
|
type InputConfig = Omit<InputOptions, "cwd" | "input" | "onLog" | "plugins">;
|
|
223
212
|
type OutputConfig = Omit<OutputOptions, "plugins">;
|
|
@@ -240,7 +229,7 @@ declare enum Env {
|
|
|
240
229
|
Production = "prod"
|
|
241
230
|
}
|
|
242
231
|
interface UtilityConfigurator {
|
|
243
|
-
(context
|
|
232
|
+
(context?: BuildContext): boolean;
|
|
244
233
|
(current: boolean, context: BuildContext): boolean;
|
|
245
234
|
}
|
|
246
235
|
declare const inDevelopment: UtilityConfigurator;
|
|
@@ -266,7 +255,6 @@ interface Configurator<TConfig> {
|
|
|
266
255
|
type AnyEntity = (Entity<any, any>);
|
|
267
256
|
type NameOf<TEntity extends AnyEntity> = (TEntity extends Entity<infer TName, any, {}> ? TName : string);
|
|
268
257
|
type ConfigOf<TEntity extends AnyEntity> = (TEntity extends Entity<any, infer TConfig, {}> ? TConfig : unknown);
|
|
269
|
-
declare function createEntity<TName extends string, TConfig extends object, TBase>(name: TName, base: TBase): Entity<TName, TConfig, TBase>;
|
|
270
258
|
//#endregion
|
|
271
259
|
//#region src/factory/EntityContainer.d.ts
|
|
272
260
|
interface EntityContainer<TEntity extends AnyEntity, TEntities extends EntityMap<TEntity> = EntityMap<TEntity>> {
|
|
@@ -279,7 +267,6 @@ interface EntityContainer<TEntity extends AnyEntity, TEntities extends EntityMap
|
|
|
279
267
|
collect<T>(block: (entity: TEntity) => Promise<T | null | undefined>): Promise<T[]>;
|
|
280
268
|
}
|
|
281
269
|
type EntityMap<TEntity extends AnyEntity> = { readonly [TName in string]: TEntity };
|
|
282
|
-
declare function createEntityContainer<TEntity extends AnyEntity>(kind: string): EntityContainer<TEntity, {}>;
|
|
283
270
|
//#endregion
|
|
284
271
|
//#region src/factory/PluginDefinition.d.ts
|
|
285
272
|
type PluginDefinition<TName extends string, TConfig extends object> = Entity<TName, TConfig, {
|
|
@@ -288,40 +275,40 @@ type PluginDefinition<TName extends string, TConfig extends object> = Entity<TNa
|
|
|
288
275
|
interface PluginLoader<TConfig extends object> {
|
|
289
276
|
(context: BuildContext): Promise<(config?: TConfig) => Plugin>;
|
|
290
277
|
}
|
|
291
|
-
type
|
|
278
|
+
type AnyPluginDefinition = (PluginDefinition<any, any>);
|
|
292
279
|
declare function definePlugin<TName extends string, TConfig extends object>(name: TName, loadPlugin: PluginLoader<TConfig>): PluginDefinition<TName, TConfig>;
|
|
293
280
|
//#endregion
|
|
294
281
|
//#region src/factory/OutputDefinition.d.ts
|
|
295
|
-
type OutputDefinition<TName extends string, TPlugins extends EntityMap<
|
|
282
|
+
type OutputDefinition<TName extends string, TPlugins extends EntityMap<AnyPluginDefinition>> = Entity<TName, OutputConfig, {
|
|
296
283
|
readonly plugins: TPlugins;
|
|
297
|
-
plugin<TPlugin extends
|
|
284
|
+
plugin<TPlugin extends AnyPluginDefinition>(plugin: TPlugin): OutputDefinition<TName, TPlugins & { [K in NameOf<TPlugin>]: TPlugin }>;
|
|
298
285
|
}>;
|
|
299
|
-
type
|
|
286
|
+
type AnyOutputDefinition = OutputDefinition<any, any>;
|
|
300
287
|
declare function defineOutput<TName extends string>(name: TName): OutputDefinition<TName, {}>;
|
|
301
288
|
//#endregion
|
|
302
289
|
//#region src/factory/PipelineDefinition.d.ts
|
|
303
|
-
type PipelineDefinition<TName extends string, TPlugins extends EntityMap<
|
|
290
|
+
type PipelineDefinition<TName extends string, TPlugins extends EntityMap<AnyPluginDefinition>, TOutputs extends EntityMap<AnyOutputDefinition>> = Entity<TName, InputConfig, {
|
|
304
291
|
readonly plugins: TPlugins;
|
|
305
292
|
readonly outputs: TOutputs;
|
|
306
|
-
plugin<TPlugin extends
|
|
307
|
-
output<TOutputName extends string, TOutput extends
|
|
293
|
+
plugin<TPlugin extends AnyPluginDefinition>(plugin: TPlugin): PipelineDefinition<TName, TPlugins & { [K in NameOf<TPlugin>]: TPlugin }, TOutputs>;
|
|
294
|
+
output<TOutputName extends string, TOutput extends AnyOutputDefinition>(name: TOutputName, block?: (output: OutputDefinition<TOutputName, {}>) => TOutput): PipelineDefinition<TName, TPlugins, TOutputs & { [K in NameOf<TOutput>]: TOutput }>;
|
|
308
295
|
suppress(code: string): PipelineDefinition<TName, TPlugins, TOutputs>;
|
|
309
296
|
}>;
|
|
310
|
-
type
|
|
297
|
+
type AnyPipelineDefinition = PipelineDefinition<any, any, any>;
|
|
311
298
|
declare function definePipeline<TName extends string>(name: TName): PipelineDefinition<TName, {}, {}>;
|
|
312
299
|
//#endregion
|
|
313
300
|
//#region src/factory/TargetDefinition.d.ts
|
|
314
|
-
type TargetDefinition<TName extends string, TPipelines extends EntityMap<
|
|
301
|
+
type TargetDefinition<TName extends string, TPipelines extends EntityMap<AnyPipelineDefinition>> = Entity<TName, InputConfig, {
|
|
315
302
|
readonly pipelines: TPipelines;
|
|
316
|
-
pipeline<TPipelineName extends string, TPipeline extends
|
|
303
|
+
pipeline<TPipelineName extends string, TPipeline extends AnyPipelineDefinition>(name: TPipelineName, block: (pipeline: PipelineDefinition<TPipelineName, {}, {}>) => TPipeline): TargetDefinition<TName, TPipelines & { [K in NameOf<TPipeline>]: TPipeline }>;
|
|
317
304
|
build(block: (target: Target<TName, TPipelines>, context: BuildContext) => void): void;
|
|
318
305
|
}>;
|
|
319
|
-
type
|
|
320
|
-
type Target<TName extends string, TPipelines extends EntityMap<
|
|
306
|
+
type AnyTargetDefinition = TargetDefinition<any, any>;
|
|
307
|
+
type Target<TName extends string, TPipelines extends EntityMap<AnyPipelineDefinition>> = Omit<TargetDefinition<TName, TPipelines>, "pipeline" | "override" | "build"> & {
|
|
321
308
|
entry(unit: string, entryPath: string): Target<TName, TPipelines>;
|
|
322
309
|
};
|
|
323
310
|
type AnyTarget = Target<any, any>;
|
|
324
|
-
declare function defineTarget<TName extends string, TTarget extends
|
|
311
|
+
declare function defineTarget<TName extends string, TTarget extends AnyTargetDefinition>(name: TName, block: (target: TargetDefinition<TName, {}>) => TTarget): TTarget;
|
|
325
312
|
//#endregion
|
|
326
313
|
//#region src/build/Deferred.d.ts
|
|
327
314
|
interface Deferred<T = void> {
|
|
@@ -389,4 +376,7 @@ interface BuildOptions extends DiscoverWorkspaceOptions {
|
|
|
389
376
|
}
|
|
390
377
|
declare function build(options?: BuildOptions): Promise<void>;
|
|
391
378
|
//#endregion
|
|
392
|
-
|
|
379
|
+
//#region src/AbortError.d.ts
|
|
380
|
+
declare class AbortError extends Error {}
|
|
381
|
+
//#endregion
|
|
382
|
+
export { AbortError, type Activity, type AnyEntity, type AnyOutputDefinition, type AnyPipelineDefinition, type AnyPluginDefinition, type AnyTarget, type AnyTargetDefinition, type ArgumentInfo, type BooleanOptionSetup, type BuildCall, type BuildContext, type BuildOptions, type BuildTarget, Builder, type Command, type CommandBuilder, type CommandBuilderWithArgs, type CompletableDeferred, type ConfigOf, type Configurator, type ConfiguratorContext, type Deferred, DependencyKind, type DependencyMap, type DiscoverPackageOptions, type DiscoverWorkspaceOptions, type DiscoverWorkspaceResult, Dispatcher, type Entity, type EntityContainer, type EntityMap, Env, type FileSystem, type GlobOptions, type InputConfig, type LogLevel, type MultiValueOptionSetup, type NameOf, NoOpReporter, type OptionInfo, type OptionalArgumentSetup, type OutputConfig, type OutputDefinition, Package, type PackageDeclaration, type ParsedCommand, type PipelineDefinition, type PluginDefinition, type PluginLoader, type Reporter, type RequiredArgumentSetup, type StatusKind, StreamReporter, type Target, type TargetDefinition, type ValueOptionSetup, type WatchResult, Workspace, activity, build, buildCommand, deferred, defineOutput, definePipeline, definePlugin, defineTarget, formatTime, inDebugMode, inDevelopment, inEnv, inProduction, inStaging, inWatchMode, overrideConsole, parseArgs, restoreConsole };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{pathToFileURL as e}from"node:url";import{rolldown as t,watch as n}from"rolldown";import{EOL as r}from"node:os";import*as i from"node:path";var a=class extends Error{};function o(e){let t=!0;return{get isActive(){return t},completed:new Promise(n=>{let r=()=>{t=!1,n()};e(r)?.then(r,r)}),ensureActive:s}}function s(){if(!this.isActive)throw new a(`the activity was stopped`)}function c(...e){return o(t=>{let n=()=>{e.forEach(e=>process.off(e,n)),t()};e.forEach(e=>process.on(e,n))})}o.untilSignal=c,o.completed={isActive:!1,completed:Promise.resolve(),ensureActive:s};function l(){let e,t,n={_pending:!0,value:new Promise((n,r)=>{e=n,t=r}),ensurePending:u,getValue:d,complete:t=>{n._pending=!1,n._value=t,e(t)},fail:e=>{n._pending=!1,n._reason=e,t(e)}};return n}l.resolved=e=>{let t=l();return t.complete(e),t},l.rejected=e=>{let t=l();return t.fail(e),t};function u(){if(!this._pending)throw Error(`the Deferred is not pending`)}function d(){if(this._pending)throw Error(`the Deferred is still pending`);if(this._reason)throw this._reason;return this._value}var f=class r{constructor(e,t,n){this.pkg=e,this.target=t,this.reporter=n}async build(e){let{pkg:n,reporter:r,target:i}=this,a;r.packageBuildStarted(n);try{process.chdir(n.directory),a=await t({...i.input,cwd:n.directory});for(let t of i.outputs)e.ensureActive(),await a.write(t);await a.close(),a=void 0,r.packageBuildSucceeded(n)}catch(e){throw r.packageBuildFailed(n),r.logError(n.declaration.name,e),await a?.close(),e}}watch(e,t){let{pkg:r,reporter:i,target:a}=this;process.chdir(r.directory);let s=typeof a.input.watch==`object`?a.input.watch:null,c=n({...a.input,cwd:r.directory,output:a.outputs,watch:{...s,clearScreen:!1}}),u=l();return c.on(`restart`,()=>{let e=l();return t({build:()=>(u??=l(),e.complete(),u.value)}),e.value}),c.on(`event`,e=>{switch(e.code){case`START`:i.packageBuildStarted(r),process.chdir(r.directory);return;case`BUNDLE_END`:return e.result.close();case`END`:i.packageBuildSucceeded(r),u?.complete(),u=null;return;case`ERROR`:i.packageBuildFailed(r),i.logError(r.declaration.name,e.error),u?.fail(e.error),u=null;return}}),{currentBuild:u,watcher:o(async()=>{await e.completed,await c.close()})}}static targets=new WeakMap;static currentTasks=null;static addBuildTask(e){if(!r.currentTasks)throw Error(`build configs must be loaded via the build API`);r.currentTasks.push(e)}static async getTargets(t,n){let i=r.targets.get(t);if(i)return i;let a=[];if(t.buildConfigPath)try{r.currentTasks=a;let n=e(t.buildConfigPath).href;process.chdir(t.directory),await import(n)}finally{r.currentTasks=null}let o={...n,cwd:t.directory,moduleName:t.declaration.name};return i=(await Promise.all(a.map(e=>e(o)))).flat(1),r.targets.set(t,i),i}},p=class e{queue=[];isBuilding=!1;constructor(e,t,n){this.targets=e,this.reporter=t,this.main=n}async build(){let{main:e}=this,t=0;try{for(;t<this.targets.length;)e.ensureActive(),await this.targets[t++].builder.build(e)}catch{for(;t<this.targets.length;)this.reporter.setStatus(this.targets[t++].builder.pkg,`SKIP`)}return o.completed}async watch(){let{main:e}=this,t=[];for(let n of this.targets){e.ensureActive();let r=n.builder.watch(e,e=>this.enqueue(n,e));t.push(r.watcher.completed),await r.currentBuild.value}return o(async()=>{await e.completed,this.reporter.log(`Watch Mode`,`stopping watchers...`),await Promise.allSettled(t)})}enqueue(e,t){let n=0;for(;n<this.queue.length;){let t=this.queue[n];if(t.target===e)return;if(t.target.priority<e.priority)break;n+=1}this.queue.splice(n,0,{target:e,handle:t}),this.triggerNext()}triggerNext=()=>{if(this.isBuilding||!this.main.isActive)return;let e=this.queue[0];e&&(this.isBuilding=!0,e.handle.build().catch(m).finally(()=>{this.queue.shift(),this.isBuilding=!1,process.nextTick(this.triggerNext)}))};static async run(t,n,r=o.untilSignal(`SIGTERM`,`SIGINT`)){let i=new WeakSet,a=new WeakSet,s=[],c=null,l=``,u=(e,t=0)=>{if(i.has(e))return!0;if(a.has(e))return c=e,l=e.declaration.name,!1;a.add(e);for(let n of e.downstreamDependencies)if(!u(n,t+1)){if(c===e)throw Error(`dependency cycle [-> ${l} ->]`);return l+=` -> ${e.declaration.name}`,!1}return a.delete(e),i.add(e),s.push({pkg:e,priority:t}),!0};t.forEach(u);let{reporter:d}=n;for(let e of s)d.addPackage(e.pkg);let p=[];for(let e of s){let t=await f.getTargets(e.pkg,n);for(let n of t)p.push({priority:e.priority,builder:new f(e.pkg,n,d)});t.length===0&&(d.setStatus(e.pkg,`SKIP`),d.setMessage(e.pkg,e.pkg.buildConfigPath?`no targets defined`:`no build config`))}p.sort((e,t)=>t.priority-e.priority);let m=new e(p,d,r);return n.isWatching?m.watch():m.build()}};function m(){}function h(){let e=[],t=[],n={},r={build:()=>({args:e,opts:t,optMap:n}),arg:(t,n)=>{if(n.required===!0&&e.length>0&&e[e.length-1].required!==!0)throw Error(`required args must precede any optional args`);return e.push({name:t,read:n.read,required:n.required??!0,default:n.default}),r},opt:(e,i)=>{if(i?.flag&&i.flag.length!==1)throw Error(`flag must be a single character but '${i.flag}' was given`);let a=i?.read,o=a?i.multiple??!1:!1,s={name:e,read:a,multiple:o,default:o?void 0:a?i.default:!1},c=[e];return i?.alias&&c.push(...i.alias),i?.flag&&c.push(i.flag),t.push(s),c.forEach(e=>{if(n[e]!==void 0)throw Error(`duplicate option name '${e}'`);n[e]=s}),r}};return r}const g=/^\s*?--([^\s]+)\s*$/,_=/^\s*?-([^\s-]+)\s*$/,ee=/^\s*?--\s*$/;function v(e,t=process.argv.slice(2)){let n={},r={},i,a=0,o=0,s=!1,c=(e,n)=>{if(e.read){let i=t[a+1];if(!i||g.test(i)||_.test(i))throw Error(`missing value for option '${n}'`);if(e.multiple)(r[e.name]=r[e.name]??[]).push(e.read(i));else if(r[e.name]===void 0)r[e.name]=e.read(i);else throw Error(`option '${n}' only accepts a single value`);a+=1}else r[e.name]=!0};for(;a<t.length;a+=1){if(ee.test(t[a])){s=!0;continue}if(!s&&(i=g.exec(t[a]))){let t=e.optMap[i[1]];if(!t)throw Error(`unrecognized option '--${i[1]}'`);c(t,`--${i[1]}`);continue}if(!s&&(i=_.exec(t[a]))){let t=i[1];if(t.length===1){let n=e.optMap[t];if(!n)throw Error(`unrecognized option '-${t}'`);c(n,`-${t}`)}else{let n=0;for(;n<i[1].length;n+=1){let i=e.optMap[t[n]];if(!i)throw Error(`unrecognized flag '-${t[n]}'`);if(i.read)throw Error(`cannot use option '-${t[n]}' in a flag group, it requires a value`);r[i.name]=!0}}continue}if(o>=e.args.length)throw Error(`too many arguments`);let l=e.args[o];n[l.name]=l.read(t[a]),o+=1}let l=e.args.reduce((e,t)=>e+(t.required?1:0),0);if(o<l)throw Error(`too few arguments`);return e.opts.forEach(e=>{r[e.name]===void 0&&(r[e.name]=e.multiple?[]:e.default)}),{args:n,opts:r}}function y(e,t=``,n=new WeakSet){switch(typeof e){case`number`:return e.toString();case`string`:return b(e);case`boolean`:return e?`true`:`false`;case`bigint`:return e.toString()+`n`;case`symbol`:return`<symbol>`;case`function`:return`<function>`;case`object`:{if(e===null)return`null`;if(n.has(e))return`<cycle>`;if(n.add(e),Array.isArray(e))return x(e,t,n);let r=Object.getPrototypeOf(e);return r===Object.prototype?S(e,t,n):r?.constructor?.name??`<unknown>`}}}function b(e){let{length:t}=e,n=``,r=0,i=0;for(;r<t;r+=1)e[r]===`"`&&(n+=e.slice(i,r)+`\\"`,i=r+1);return`"`+n+e.slice(i)+`"`}function x(e,t,n){let r=t+` `,{length:i}=e,a=``,o=0;for(;o<i;o+=1)a+=`\n${r}${y(e[o],r,n)},`;return a?`[${a}\n${t}]`:`[]`}function S(e,t,n){let r=t+` `,i=``,a;for(a in e)Object.hasOwn(e,a)&&(i+=`\n${r}${y(a,``,n)}: ${y(e[a],r,n)},`);return i?`{${i}\n${t}}`:`{}`}function C(e){return e>=1e3?`${(Math.round(e/100)/10).toFixed(1)}s`:`${e.toFixed(0)}ms`}const te=console.trace,ne=console.debug,re=console.log,ie=console.info,ae=console.warn,oe=console.error;function w(e){let t=t=>(...n)=>{let r=n.map(e=>typeof e==`string`?e:y(e)).join(` `);e.log(`Console`,r,t)};console.trace=t(`debug`),console.debug=t(`debug`),console.log=t(`info`),console.info=t(`info`),console.warn=t(`warn`),console.error=t(`error`)}function T(){console.trace=te,console.debug=ne,console.log=re,console.info=ie,console.warn=ae,console.error=oe}const E=`0;31m`,D=`0;33m`,O=`0;90m`,k={FAIL:E,BUSY:`0;36m`,IDLE:O,PASS:`0;32m`,SKIP:D},se={debug:O,info:`0;37m`,warn:D,error:E};var A=class{reportStackTraces=!1;isFormatted=!/^(true|1)$/i.test(process.env.CI??``);packages=new Map;updateHandle=null;linesToClear=0;lastLogTitle=``;isFinished=!1;constructor(e){this.output=e}log(e,t,n=`info`){let i=``;if(this.lastLogTitle!==e){let t=`╭`+`─`.repeat(e.length-1);i=`${r}${this.format(e,`1m`)}${r}${this.format(t,O)}${r}`,this.lastLogTitle=e}let a=this.format(`│`,O),o=t.split(/(?:\r\n|\n|\r)+/g).map(e=>this.format(e,se[n])).join(`${r}${a} `);i+=`${a} ${o}${r}`,this.writeOutput(i)}logError(e,t){t instanceof a||this.log(e,(this.reportStackTraces?t.stack:null)??t.toString(),`error`)}addPackage(e){let t=this.getInfoFor(e);t.status=`IDLE`,this.scheduleUpdate()}setStatus(e,t){let n=this.getInfoFor(e);n.status=t,this.scheduleUpdate()}setMessage(e,t){let n=this.getInfoFor(e);n.message=t,this.scheduleUpdate()}packageBuildStarted(e){let t=this.getInfoFor(e);t.status=`BUSY`,t.buildStartTime=Date.now(),this.scheduleUpdate()}packageBuildSucceeded(e){let t=this.getInfoFor(e);t.status=`PASS`,t.buildEndTime=Date.now(),this.scheduleUpdate()}packageBuildFailed(e){let t=this.getInfoFor(e);t.status=`FAIL`,t.buildEndTime=Date.now(),this.scheduleUpdate()}finish(e){this.writeOutput(``,!0,e?`${r}${e}${r}`:r),this.linesToClear=0,this.isFinished=!0}format(e,t){return this.isFormatted?/^\s*$/.test(e)?e:`\u001b[${t}${e}\u001b[0m`:e}getInfoFor(e){let t=this.packages.get(e);return t||this.packages.set(e,t={pkg:e,status:`IDLE`,buildStartTime:0,buildEndTime:0}),t}scheduleUpdate(){this.updateHandle??=setTimeout(()=>{this.updateHandle=null,this.writeOutput(``)},50)}writeOutput(e,t=this.isFormatted,n=``){let r=e;if(this.linesToClear>0&&(r=`\u001b[${this.linesToClear}A\r\u001b[0J${r}`,this.linesToClear=0),t&&!this.isFinished){let e=this.formatTree();r+=e.output,this.linesToClear=e.lineCount}this.output.write(r+n)}formatTree(){return this.packages.values().filter(({pkg:e})=>e.upstreamDependents.length===0||e.upstreamDependents.every(e=>!this.packages.has(e))).reduce((e,t)=>{let n=this.formatTreeNode(t.pkg);return e.lineCount+=n.lineCount,e.output+=n.output,e},{lineCount:1,output:r})}formatTreeNode(e,t=``,n=``,i=``){let a=this.packages.get(e),o=this.format(`IDLE`,k.IDLE),s=``;a&&(o=this.format(a.status,k[a.status]),a.buildStartTime>0&&a.buildEndTime>=a.buildStartTime&&(s+=` · ${C(a.buildEndTime-a.buildStartTime)}`),a.message&&(s+=` · ${a.message}`));let{length:c}=e.downstreamDependencies,l=0,u,d,f=1,p=`${o} ${this.format(t+n,O)}${this.format(e.declaration.name,`1m`)}${this.format(s,O)}${r}`;for(;l<c;l+=1)u=l+1===c,d=this.formatTreeNode(e.downstreamDependencies[l],t+i,u?`╰─ `:`├─ `,u?` `:`│ `),f+=d.lineCount,p+=d.output;return{lineCount:f,output:p}}};const j={reportStackTraces:!1,log:M,logError:M,addPackage:M,setStatus:M,setMessage:M,packageBuildStarted:M,packageBuildSucceeded:M,packageBuildFailed:M,finish:M};function M(){}let N=function(e){return e.Development=`dev`,e.Staging=`stag`,e.Production=`prod`,e}({});function P(e,...t){return(n,r)=>e(typeof n==`boolean`?r:n,...t)}const ce=P(e=>e.env===N.Development),le=P(e=>e.env===N.Staging),ue=P(e=>e.env===N.Production),de=P(e=>e.isWatching),fe=P(e=>e.isDebugging);function pe(...e){return P(t=>e.includes(t.env))}function F(e,t){return{name:e,isFinal:!1,getEnabled:I,getConfig:L,finalize:R,enable:z,disable:B,configure:me,...t}}function I(){return!0}function L(e){return e}function R(){return this.isFinal?this:{...this,isFinal:!0}}function z(e=I){let t=this.getEnabled,n=async(n,r)=>e(await t(n,r),r);return this.isFinal?(this.getEnabled=n,this):{...this,getEnabled:n}}function B(e=I){let t=this.getEnabled,n=async(n,r)=>!await e(!await t(n,r),r);return this.isFinal?(this.getEnabled=n,this):{...this,getEnabled:n}}function me(e){let t=this.getConfig,n=async(n,r)=>typeof e==`function`?e(await t(n,r),r):V(await t(n,r),e);return this.isFinal?(this.getConfig=n,this):{...this,getConfig:n}}function V(e,t){if(!H(e)||!H(t))return t;let n={...e},r;for(r in t)Object.hasOwn(t,r)&&(n[r]=V(e[r],t[r]));return n}function H(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function U(e){return{entityKind:e,entityMap:{},entityOrder:[],isFinal:!1,finalize:he,add:ge,collect:_e}}function he(){return{...this,isFinal:!0,entityOrder:[...this.entityOrder],entityMap:this.entityOrder.reduce((e,t)=>(e[t]=this.entityMap[t].finalize(),e),{})}}function ge(e){if(this.entityMap[e.name]!==void 0)throw Error(`${this.entityKind} '${e.name}' has already been added.`);return this.isFinal?(this.entityMap[e.name]=e,this.entityOrder.push(e.name),this):{...this,entityMap:{...this.entityMap,[e.name]:e},entityOrder:[...this.entityOrder,e.name]}}function _e(e){return Promise.all(this.entityOrder.map(t=>e(this.entityMap[t]))).then(e=>e.filter(e=>e!=null))}function W(e){let t=U(`Plugin`);return F(e,{plugins:t.entityMap,pluginContainer:t,finalize:ve,plugin:ye})}function ve(){let e=this.pluginContainer.finalize();return{...this,isFinal:!0,plugins:e.entityMap,pluginContainer:e}}function ye(e){if(this.isFinal)return this.pluginContainer.add(e),this;let t=this.pluginContainer.add(e);return{...this,plugins:t.entityMap,pluginContainer:t}}function G(e){let t=U(`Plugin`),n=U(`Output`);return F(e,{plugins:t.entityMap,outputs:n.entityMap,pluginContainer:t,outputContainer:n,suppressions:new Set,finalize:be,plugin:xe,output:Se,suppress:Ce})}function be(){let e=this.pluginContainer.finalize(),t=this.outputContainer.finalize();return{...this,isFinal:!0,plugins:e.entityMap,pluginContainer:e,outputs:t.entityMap,outputContainer:t}}function xe(e){if(this.isFinal)return this.pluginContainer.add(e),this;let t=this.pluginContainer.add(e);return{...this,plugins:t.entityMap,pluginContainer:t}}function Se(e,t){let n=t?t(W(e)):W(e);if(this.isFinal)return this.outputContainer.add(n),this;let r=this.outputContainer.add(n);return{...this,outputs:r.entityMap,outputContainer:r}}function Ce(e){return this.suppressions.add(e),this}function we(e,t){return F(e,{suppressions:new Set,loadPlugin:t,suppress:Te})}function Te(e){return this.suppressions.add(e),this}function Ee(e,t){let n=U(`Pipeline`);return t(F(e,{pipelines:n.entityMap,pipelineContainer:n,finalize:De,entry:Oe,pipeline:ke,build:Ae}))}function De(){let e=this.pipelineContainer.finalize();return{...this,isFinal:!0,entries:{},pipelines:e.entityMap,pipelineContainer:e}}function Oe(e,t){if(!this.isFinal)throw Error(`Cannot add entries to an unfinalized Target.`);return this.entries[e]=t,this}function ke(e,t){let n=t(G(e));if(this.isFinal)return this.pipelineContainer.add(n),this;let r=this.pipelineContainer.add(n);return{...this,pipelines:r.entityMap,pipelineContainer:r}}function Ae(e){let t=this.finalize();f.addBuildTask(async n=>{if(e(t,n),!je(t)||await K(t,n))return[];let r=await t.getConfig({},n);return t.pipelineContainer.collect(async e=>{if(await K(e,n))return null;let i=Array.from(e.suppressions).map(e=>({code:e})),a=await e.getConfig(r,n),o=await q(e.pluginContainer,n,i),s=await e.outputContainer.collect(async e=>{if(await K(e,n))return null;let t=await e.getConfig({},n),r=await q(e.pluginContainer,n,i);return{...t,plugins:r}});return s.length===0?null:{name:`${t.name} · ${e.name}`,outputs:s,input:{...a,input:t.entries,plugins:o,onLog(e,t){if(!(t.pluginCode!==void 0&&i.some(e=>e.code===t.pluginCode&&(!e.plugin||e.plugin===t.plugin)))&&(e!==`debug`||n.isDebugging)){let r=`${t.pluginCode?`[${t.plugin}:${t.pluginCode}] `:``}${t.message}`;n.reporter.log(n.moduleName,r,e)}}}}})})}function je(e){return!!e.entries&&Object.keys(e.entries).length>0}async function K(e,t){return!await e.getEnabled(!0,t)}function q(e,t,n){return e.collect(async e=>{if(await K(e,t))return null;let r=await e.getConfig(void 0,t),i=(await e.loadPlugin(t))(r);return e.suppressions.forEach(e=>n.push({code:e,plugin:i.name})),i})}async function J(){let e=await import(`node:fs/promises`);return{glob:e.glob,readFile:e.readFile}}var Y=class e{downstreamDependencies=[];upstreamDependents=[];constructor(e,t,n){this.directory=e,this.declaration=t,this.buildConfigPath=n}static cache=new Map;static async discover(t){let n=t?.fs??await J(),r=[],a=null;try{let o=t?.jail?i.resolve(t?.jail):``,s,c,l=t?.cwd?i.resolve(t.cwd):process.cwd(),u=0;for(;l.startsWith(o)&&++u<128;){let t=e.cache.get(l);if(t!==void 0)return t;try{r.push(l),s=i.join(l,`./package.json`),c=await n.readFile(s,`utf8`);break}catch(e){if(!Me(e))throw e}let a=i.join(l,`..`);if(a===l)break;l=a}if(!c)return null;let d;try{d=JSON.parse(c)}catch(e){throw Error(`could not parse 'package.json' file at: ${s}`,{cause:e})}if(!Ne(d))throw Error(`expected a JSON object in: ${s}`);if(!X(d.name))throw Error(`name must be a string in: ${s}`);if(d.workspaces!==void 0&&!Pe(d.workspaces,X))throw Error(`workspaces must be an array of strings in: ${s}`);let f=t?.buildConfigGlob??`build.config.{js,mjs}`,p=n.glob(f,{cwd:l}),m;try{for await(let e of p){if(m)throw Error(`multiple build config files found in: ${l}`);m=i.join(l,e)}}finally{await p.return?.()}return a=new e(l,d,m)}catch(e){throw e}finally{r.forEach(t=>{e.cache.set(t,a)})}}};function Me(e){return e?.code===`ENOENT`}function Ne(e){return typeof e==`object`&&!!e}function X(e){return typeof e==`string`}function Pe(e,t){return Array.isArray(e)&&(e.length===0||t(e[0]))}let Z=function(e){return e.Runtime=`dependencies`,e.Development=`devDependencies`,e.Peer=`peerDependencies`,e.Optional=`optionalDependencies`,e}({});const Fe=e=>e.startsWith(`workspace:`),Ie=[Z.Runtime,Z.Development,Z.Peer];var Q=class e{constructor(e=[],t){this.packages=e,this.workspaceRoot=t}static async discover(t){let n=t?.fs??await J(),r=null,a=t?.cwd?i.resolve(t.cwd):process.cwd(),o=0,s;for(;s=await Y.discover({...t,cwd:a,fs:n}),!(!s||(r??=s,s.declaration.workspaces));){let e=i.join(s?.directory??a,`..`);if(e===a||++o>=128)break;a=e}if(!s?.declaration.workspaces)return{currentPackage:r,workspace:null};let c=t?.exclude??[`build-logic`],l=[],u=new Set([s]);a=s.directory;for await(let e of n.glob(s.declaration.workspaces,{cwd:a}))l.push((async()=>{let n=await Y.discover({...t,cwd:i.join(a,e)});n&&!c.includes(n.declaration.name)&&u.add(n)})());await Promise.all(l);let d=t?.refFilter??Fe,f=t?.followDeps??Ie;return u.forEach(e=>{u.forEach(t=>{f.forEach(n=>{let r=e.declaration[n]?.[t.declaration.name];r&&d(r)&&(e.downstreamDependencies.push(t),t.upstreamDependents.push(e))})})}),{currentPackage:r,workspace:new e(Array.from(u),s)}}};const $={dev:N.Development,development:N.Development,stag:N.Staging,staging:N.Staging,prod:N.Production,production:N.Production},Le=h().opt(`env`,{alias:[`environment`],flag:`e`,read:e=>{let t=$[e.toLowerCase()];if(t===void 0)throw Error(`'${e}' is not a valid environment name`);return t}}).opt(`watch`,{flag:`w`}).opt(`debug`,{flag:`d`}).build();async function Re(e){let t=Date.now(),n=e?.stdout===null?j:new A(e?.stdout??process.stdout),r=!1,i=!1;try{let t=v(Le,e?.argv),a=e?.cwd??process.cwd();r=e?.watch??t.opts.watch,i=e?.debug??t.opts.debug,n.reportStackTraces=i,w(n);let o=e?.env??t.opts.env;if(o===void 0){let e;e??=process.env.NODE_ENV,e??=process.env.BUILD_ENV,e??=process.env.ENVIRONMENT,o=$[e?.toLowerCase()??``]??N.Production}let{currentPackage:s,workspace:c}=await Q.discover({...e,cwd:a}),l;if(c&&c.workspaceRoot===s&&!s.buildConfigPath)l=c.packages;else if(s){if(!s.buildConfigPath)throw Error(`package '${s.declaration.name}' has no build config`);l=[s]}else throw Error(`no package was found`);await(await p.run(l,{reporter:n,env:o,isWatching:r,isDebugging:i})).completed,process.exitCode=0}catch(e){n.logError(`Error`,e),process.exitCode=1}finally{let e=``;r||(e=`done in ${C(Date.now()-t)}`),n.finish(e),T()}}export{f as Builder,Z as DependencyKind,p as Dispatcher,N as Env,j as NoOpReporter,Y as Package,A as StreamReporter,Q as Workspace,o as activity,Re as build,h as buildCommand,F as createEntity,U as createEntityContainer,J as defaultFileSystem,l as deferred,W as defineOutput,G as definePipeline,we as definePlugin,Ee as defineTarget,C as formatTime,fe as inDebugMode,ce as inDevelopment,pe as inEnv,ue as inProduction,le as inStaging,de as inWatchMode,w as overrideConsole,v as parseArgs,T as restoreConsole,y as safeStringifyStruct};
|
|
1
|
+
import{pathToFileURL as e}from"node:url";import{rolldown as t,watch as n}from"rolldown";import{EOL as r}from"node:os";import*as i from"node:path";var a=class extends Error{};function o(e){let t=!0;return{get isActive(){return t},completed:new Promise(n=>{let r=()=>{t=!1,n()};e(r)?.then(r,r)}),ensureActive:s}}function s(){if(!this.isActive)throw new a(`the activity was stopped`)}function c(...e){return o(t=>{let n=()=>{e.forEach(e=>process.off(e,n)),t()};e.forEach(e=>process.on(e,n))})}o.untilSignal=c,o.completed={isActive:!1,completed:Promise.resolve(),ensureActive:s};function l(){let e,t,n={_pending:!0,value:new Promise((n,r)=>{e=n,t=r}),ensurePending:u,getValue:d,complete:t=>{n._pending=!1,n._value=t,e(t)},fail:e=>{n._pending=!1,n._reason=e,t(e)}};return n}l.resolved=e=>{let t=l();return t.complete(e),t},l.rejected=e=>{let t=l();return t.fail(e),t};function u(){if(!this._pending)throw Error(`the Deferred is not pending`)}function d(){if(this._pending)throw Error(`the Deferred is still pending`);if(this._reason)throw this._reason;return this._value}var f=class r{constructor(e,t,n){this.pkg=e,this.target=t,this.reporter=n}async build(e){let{pkg:n,reporter:r,target:i}=this,a;r.packageBuildStarted(n);try{process.chdir(n.directory),a=await t({...i.input,cwd:n.directory});for(let t of i.outputs)e.ensureActive(),await a.write(t);await a.close(),a=void 0,r.packageBuildSucceeded(n)}catch(e){throw r.packageBuildFailed(n),r.logError(n.declaration.name,e),await a?.close(),e}}watch(e,t){let{pkg:r,reporter:i,target:a}=this;process.chdir(r.directory);let s=typeof a.input.watch==`object`?a.input.watch:null,c=n({...a.input,cwd:r.directory,output:a.outputs,watch:{...s,clearScreen:!1}}),u=l();return c.on(`restart`,()=>{let e=l();return t({build:()=>(u??=l(),e.complete(),u.value)}),e.value}),c.on(`event`,e=>{switch(e.code){case`START`:i.packageBuildStarted(r),process.chdir(r.directory);return;case`BUNDLE_END`:return e.result.close();case`END`:i.packageBuildSucceeded(r),u?.complete(),u=null;return;case`ERROR`:i.packageBuildFailed(r),i.logError(r.declaration.name,e.error),u?.fail(e.error),u=null;return}}),{currentBuild:u,watcher:o(async()=>{await e.completed,await c.close()})}}static targets=new WeakMap;static currentTasks=null;static addBuildTask(e){if(!r.currentTasks)throw Error(`build configs must be loaded via the build API`);r.currentTasks.push(e)}static async getTargets(t,n){let i=r.targets.get(t);if(i)return i;let a=[];if(t.buildConfigPath)try{r.currentTasks=a;let n=e(t.buildConfigPath).href;process.chdir(t.directory),await import(n)}finally{r.currentTasks=null}let o={...n,cwd:t.directory,moduleName:t.declaration.name};return i=(await Promise.all(a.map(e=>e(o)))).flat(1),r.targets.set(t,i),i}},p=class e{queue=[];isBuilding=!1;constructor(e,t,n){this.targets=e,this.reporter=t,this.main=n}async build(){let{main:e}=this,t=0;try{for(;t<this.targets.length;)e.ensureActive(),await this.targets[t++].builder.build(e)}catch{for(;t<this.targets.length;)this.reporter.setStatus(this.targets[t++].builder.pkg,`SKIP`)}return o.completed}async watch(){let{main:e}=this,t=[];for(let n of this.targets){e.ensureActive();let r=n.builder.watch(e,e=>this.enqueue(n,e));t.push(r.watcher.completed),await r.currentBuild.value}return o(async()=>{await e.completed,this.reporter.log(`Watch Mode`,`stopping watchers...`),await Promise.allSettled(t)})}enqueue(e,t){let n=0;for(;n<this.queue.length;){let t=this.queue[n];if(t.target===e)return;if(t.target.priority<e.priority)break;n+=1}this.queue.splice(n,0,{target:e,handle:t}),this.triggerNext()}triggerNext=()=>{if(this.isBuilding||!this.main.isActive)return;let e=this.queue[0];e&&(this.isBuilding=!0,e.handle.build().catch(m).finally(()=>{this.queue.shift(),this.isBuilding=!1,process.nextTick(this.triggerNext)}))};static async run(t,n,r=o.untilSignal(`SIGTERM`,`SIGINT`)){let i=new WeakSet,a=new WeakSet,s=[],c=null,l=``,u=(e,t=0)=>{if(i.has(e))return!0;if(a.has(e))return c=e,l=e.declaration.name,!1;a.add(e);for(let n of e.downstreamDependencies)if(!u(n,t+1)){if(c===e)throw Error(`dependency cycle [-> ${l} ->]`);return l+=` -> ${e.declaration.name}`,!1}return a.delete(e),i.add(e),s.push({pkg:e,priority:t}),!0};t.forEach(u);let{reporter:d}=n;for(let e of s)d.addPackage(e.pkg);let p=[];for(let e of s){let t=await f.getTargets(e.pkg,n);for(let n of t)p.push({priority:e.priority,builder:new f(e.pkg,n,d)});t.length===0&&(d.setStatus(e.pkg,`SKIP`),d.setMessage(e.pkg,e.pkg.buildConfigPath?`no targets defined`:`no build config`))}p.sort((e,t)=>t.priority-e.priority);let m=new e(p,d,r);return n.isWatching?m.watch():m.build()}};function m(){}function h(){let e=[],t=[],n={},r={build:()=>({args:e,opts:t,optMap:n}),arg:(t,n)=>{if(n.required===!0&&e.length>0&&e[e.length-1].required!==!0)throw Error(`required args must precede any optional args`);return e.push({name:t,read:n.read,required:n.required??!0,default:n.default}),r},opt:(e,i)=>{if(i?.flag&&i.flag.length!==1)throw Error(`flag must be a single character but '${i.flag}' was given`);let a=i?.read,o=a?i.multiple??!1:!1,s={name:e,read:a,multiple:o,default:o?void 0:a?i.default:!1},c=[e];return i?.alias&&c.push(...i.alias),i?.flag&&c.push(i.flag),t.push(s),c.forEach(e=>{if(n[e]!==void 0)throw Error(`duplicate option name '${e}'`);n[e]=s}),r}};return r}const g=/^\s*?--([^\s]+)\s*$/,_=/^\s*?-([^\s-]+)\s*$/,ee=/^\s*?--\s*$/;function v(e,t=process.argv.slice(2)){let n={},r={},i,a=0,o=0,s=!1,c=(e,n)=>{if(e.read){let i=t[a+1];if(!i||g.test(i)||_.test(i))throw Error(`missing value for option '${n}'`);if(e.multiple)(r[e.name]=r[e.name]??[]).push(e.read(i));else if(r[e.name]===void 0)r[e.name]=e.read(i);else throw Error(`option '${n}' only accepts a single value`);a+=1}else r[e.name]=!0};for(;a<t.length;a+=1){if(ee.test(t[a])){s=!0;continue}if(!s&&(i=g.exec(t[a]))){let t=e.optMap[i[1]];if(!t)throw Error(`unrecognized option '--${i[1]}'`);c(t,`--${i[1]}`);continue}if(!s&&(i=_.exec(t[a]))){let t=i[1];if(t.length===1){let n=e.optMap[t];if(!n)throw Error(`unrecognized option '-${t}'`);c(n,`-${t}`)}else{let n=0;for(;n<i[1].length;n+=1){let i=e.optMap[t[n]];if(!i)throw Error(`unrecognized flag '-${t[n]}'`);if(i.read)throw Error(`cannot use option '-${t[n]}' in a flag group, it requires a value`);r[i.name]=!0}}continue}if(o>=e.args.length)throw Error(`too many arguments`);let l=e.args[o];n[l.name]=l.read(t[a]),o+=1}let l=e.args.reduce((e,t)=>e+(t.required?1:0),0);if(o<l)throw Error(`too few arguments`);return e.opts.forEach(e=>{r[e.name]===void 0&&(r[e.name]=e.multiple?[]:e.default)}),{args:n,opts:r}}function y(e,t=``,n=new WeakSet){switch(typeof e){case`number`:return e.toString();case`string`:return te(e);case`boolean`:return e?`true`:`false`;case`bigint`:return e.toString()+`n`;case`symbol`:return`<symbol>`;case`function`:return`<function>`;case`object`:{if(e===null)return`null`;if(n.has(e))return`<cycle>`;if(n.add(e),Array.isArray(e))return ne(e,t,n);let r=Object.getPrototypeOf(e);return r===Object.prototype?re(e,t,n):r?.constructor?.name??`<unknown>`}}}function te(e){let{length:t}=e,n=``,r=0,i=0;for(;r<t;r+=1)e[r]===`"`&&(n+=e.slice(i,r)+`\\"`,i=r+1);return`"`+n+e.slice(i)+`"`}function ne(e,t,n){let r=t+` `,{length:i}=e,a=``,o=0;for(;o<i;o+=1)a+=`\n${r}${y(e[o],r,n)},`;return a?`[${a}\n${t}]`:`[]`}function re(e,t,n){let r=t+` `,i=``,a;for(a in e)Object.hasOwn(e,a)&&(i+=`\n${r}${y(a,``,n)}: ${y(e[a],r,n)},`);return i?`{${i}\n${t}}`:`{}`}function b(e){return e>=1e3?`${(Math.round(e/100)/10).toFixed(1)}s`:`${e.toFixed(0)}ms`}const ie=console.trace,x=console.debug,S=console.log,ae=console.info,oe=console.warn,se=console.error;function C(e){let t=t=>(...n)=>{let r=n.map(e=>typeof e==`string`?e:y(e)).join(` `);e.log(`Console`,r,t)};console.trace=t(`debug`),console.debug=t(`debug`),console.log=t(`info`),console.info=t(`info`),console.warn=t(`warn`),console.error=t(`error`)}function w(){console.trace=ie,console.debug=x,console.log=S,console.info=ae,console.warn=oe,console.error=se}const T=`0;31m`,E=`0;33m`,D=`0;90m`,O={FAIL:T,BUSY:`0;36m`,IDLE:D,PASS:`0;32m`,SKIP:E},ce={debug:D,info:`0;37m`,warn:E,error:T};var k=class{reportStackTraces=!1;isFormatted=!/^(true|1)$/i.test(process.env.CI??``);packages=new Map;updateHandle=null;linesToClear=0;lastLogTitle=``;isFinished=!1;constructor(e){this.output=e}log(e,t,n=`info`){let i=``;if(this.lastLogTitle!==e){let t=`╭`+`─`.repeat(e.length-1);i=`${r}${this.format(e,`1m`)}${r}${this.format(t,D)}${r}`,this.lastLogTitle=e}let a=this.format(`│`,D),o=t.split(/(?:\r\n|\n|\r)+/g).map(e=>this.format(e,ce[n])).join(`${r}${a} `);i+=`${a} ${o}${r}`,this.writeOutput(i)}logError(e,t){t instanceof a||this.log(e,(this.reportStackTraces?t.stack:null)??t.toString(),`error`)}addPackage(e){let t=this.getInfoFor(e);t.status=`IDLE`,this.scheduleUpdate()}setStatus(e,t){let n=this.getInfoFor(e);n.status=t,this.scheduleUpdate()}setMessage(e,t){let n=this.getInfoFor(e);n.message=t,this.scheduleUpdate()}packageBuildStarted(e){let t=this.getInfoFor(e);t.status=`BUSY`,t.buildStartTime=Date.now(),this.scheduleUpdate()}packageBuildSucceeded(e){let t=this.getInfoFor(e);t.status=`PASS`,t.buildEndTime=Date.now(),this.scheduleUpdate()}packageBuildFailed(e){let t=this.getInfoFor(e);t.status=`FAIL`,t.buildEndTime=Date.now(),this.scheduleUpdate()}finish(e){this.writeOutput(``,!0,e?`${r}${e}${r}`:r),this.linesToClear=0,this.isFinished=!0}format(e,t){return this.isFormatted?/^\s*$/.test(e)?e:`\u001b[${t}${e}\u001b[0m`:e}getInfoFor(e){let t=this.packages.get(e);return t||this.packages.set(e,t={pkg:e,status:`IDLE`,buildStartTime:0,buildEndTime:0}),t}scheduleUpdate(){this.updateHandle??=setTimeout(()=>{this.updateHandle=null,this.writeOutput(``)},50)}writeOutput(e,t=this.isFormatted,n=``){let r=e;if(this.linesToClear>0&&(r=`\u001b[${this.linesToClear}A\r\u001b[0J${r}`,this.linesToClear=0),t&&!this.isFinished){let e=this.formatTree();r+=e.output,this.linesToClear=e.lineCount}this.output.write(r+n)}formatTree(){return this.packages.values().filter(({pkg:e})=>e.upstreamDependents.length===0||e.upstreamDependents.every(e=>!this.packages.has(e))).reduce((e,t)=>{let n=this.formatTreeNode(t.pkg);return e.lineCount+=n.lineCount,e.output+=n.output,e},{lineCount:1,output:r})}formatTreeNode(e,t=``,n=``,i=``){let a=this.packages.get(e),o=this.format(`IDLE`,O.IDLE),s=``;a&&(o=this.format(a.status,O[a.status]),a.buildStartTime>0&&a.buildEndTime>=a.buildStartTime&&(s+=` · ${b(a.buildEndTime-a.buildStartTime)}`),a.message&&(s+=` · ${a.message}`));let{length:c}=e.downstreamDependencies,l=0,u,d,f=1,p=`${o} ${this.format(t+n,D)}${this.format(e.declaration.name,`1m`)}${this.format(s,D)}${r}`;for(;l<c;l+=1)u=l+1===c,d=this.formatTreeNode(e.downstreamDependencies[l],t+i,u?`╰─ `:`├─ `,u?` `:`│ `),f+=d.lineCount,p+=d.output;return{lineCount:f,output:p}}};const A={reportStackTraces:!1,log:j,logError:j,addPackage:j,setStatus:j,setMessage:j,packageBuildStarted:j,packageBuildSucceeded:j,packageBuildFailed:j,finish:j};function j(){}let M=function(e){return e.Development=`dev`,e.Staging=`stag`,e.Production=`prod`,e}({}),N;function le(e){N=e}function P(e){return(t,n)=>e(typeof t==`boolean`?n:t??N)}const ue=P(e=>e.env===M.Development),de=P(e=>e.env===M.Staging),fe=P(e=>e.env===M.Production),pe=P(e=>e.isWatching),me=P(e=>e.isDebugging);function F(...e){return P(t=>e.includes(t.env))}function I(e,t){return{name:e,isFinal:!1,getEnabled:L,getConfig:R,finalize:z,enable:he,disable:ge,configure:_e,...t}}function L(){return!0}function R(e){return e}function z(){return this.isFinal?this:{...this,isFinal:!0}}function he(e=L){let t=this.getEnabled,n=async(n,r)=>e(await t(n,r),r);return this.isFinal?(this.getEnabled=n,this):{...this,getEnabled:n}}function ge(e=L){let t=this.getEnabled,n=async(n,r)=>!await e(!await t(n,r),r);return this.isFinal?(this.getEnabled=n,this):{...this,getEnabled:n}}function _e(e){let t=this.getConfig,n=async(n,r)=>typeof e==`function`?e(await t(n,r),r):B(await t(n,r),e);return this.isFinal?(this.getConfig=n,this):{...this,getConfig:n}}function B(e,t){if(!V(e)||!V(t))return t;let n={...e},r;for(r in t)Object.hasOwn(t,r)&&(n[r]=B(e[r],t[r]));return n}function V(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function H(e){return{entityKind:e,entityMap:{},entityOrder:[],isFinal:!1,finalize:ve,add:ye,collect:be}}function ve(){return{...this,isFinal:!0,entityOrder:[...this.entityOrder],entityMap:this.entityOrder.reduce((e,t)=>(e[t]=this.entityMap[t].finalize(),e),{})}}function ye(e){if(this.entityMap[e.name]!==void 0)throw Error(`${this.entityKind} '${e.name}' has already been added.`);return this.isFinal?(this.entityMap[e.name]=e,this.entityOrder.push(e.name),this):{...this,entityMap:{...this.entityMap,[e.name]:e},entityOrder:[...this.entityOrder,e.name]}}function be(e){return Promise.all(this.entityOrder.map(t=>e(this.entityMap[t]))).then(e=>e.filter(e=>e!=null))}function U(e){let t=H(`Plugin`);return I(e,{plugins:t.entityMap,pluginContainer:t,finalize:xe,plugin:Se})}function xe(){let e=this.pluginContainer.finalize();return{...this,isFinal:!0,plugins:e.entityMap,pluginContainer:e}}function Se(e){if(this.isFinal)return this.pluginContainer.add(e),this;let t=this.pluginContainer.add(e);return{...this,plugins:t.entityMap,pluginContainer:t}}function W(e){let t=H(`Plugin`),n=H(`Output`);return I(e,{plugins:t.entityMap,outputs:n.entityMap,pluginContainer:t,outputContainer:n,suppressions:new Set,finalize:Ce,plugin:we,output:Te,suppress:Ee})}function Ce(){let e=this.pluginContainer.finalize(),t=this.outputContainer.finalize();return{...this,isFinal:!0,plugins:e.entityMap,pluginContainer:e,outputs:t.entityMap,outputContainer:t}}function we(e){if(this.isFinal)return this.pluginContainer.add(e),this;let t=this.pluginContainer.add(e);return{...this,plugins:t.entityMap,pluginContainer:t}}function Te(e,t){let n=t?t(U(e)):U(e);if(this.isFinal)return this.outputContainer.add(n),this;let r=this.outputContainer.add(n);return{...this,outputs:r.entityMap,outputContainer:r}}function Ee(e){return this.suppressions.add(e),this}function De(e,t){return I(e,{suppressions:new Set,loadPlugin:t,suppress:Oe})}function Oe(e){return this.suppressions.add(e),this}function ke(e,t){let n=H(`Pipeline`);return t(I(e,{pipelines:n.entityMap,pipelineContainer:n,finalize:Ae,entry:je,pipeline:Me,build:Ne}))}function Ae(){let e=this.pipelineContainer.finalize();return{...this,isFinal:!0,entries:{},pipelines:e.entityMap,pipelineContainer:e}}function je(e,t){if(!this.isFinal)throw Error(`Cannot add entries to an unfinalized Target.`);return this.entries[e]=t,this}function Me(e,t){let n=t(W(e));if(this.isFinal)return this.pipelineContainer.add(n),this;let r=this.pipelineContainer.add(n);return{...this,pipelines:r.entityMap,pipelineContainer:r}}function Ne(e){let t=this.finalize();f.addBuildTask(async n=>{if(le(n),e(t,n),!Pe(t)||await G(t,n))return[];let r=await t.getConfig({},n);return t.pipelineContainer.collect(async e=>{if(await G(e,n))return null;let i=Array.from(e.suppressions).map(e=>({code:e})),a=await e.getConfig(r,n),o=await K(e.pluginContainer,n,i),s=await e.outputContainer.collect(async e=>{if(await G(e,n))return null;let t=await e.getConfig({},n),r=await K(e.pluginContainer,n,i);return{...t,plugins:r}});return s.length===0?null:{name:`${t.name} · ${e.name}`,outputs:s,input:{...a,input:t.entries,plugins:o,onLog(e,t){if(!(t.pluginCode!==void 0&&i.some(e=>e.code===t.pluginCode&&(!e.plugin||e.plugin===t.plugin)))&&(e!==`debug`||n.isDebugging)){let r=`${t.pluginCode?`[${t.plugin}:${t.pluginCode}] `:``}${t.message}`;n.reporter.log(n.moduleName,r,e)}}}}})})}function Pe(e){return!!e.entries&&Object.keys(e.entries).length>0}async function G(e,t){return!await e.getEnabled(!0,t)}function K(e,t,n){return e.collect(async e=>{if(await G(e,t))return null;let r=await e.getConfig(void 0,t),i=(await e.loadPlugin(t))(r);return e.suppressions.forEach(e=>n.push({code:e,plugin:i.name})),i})}async function q(){let e=await import(`node:fs/promises`);return{glob:e.glob,readFile:e.readFile}}var J=class e{downstreamDependencies=[];upstreamDependents=[];constructor(e,t,n){this.directory=e,this.declaration=t,this.buildConfigPath=n}static cache=new Map;static async discover(t){let n=t?.fs??await q(),r=[],a=null;try{let o=t?.jail?i.resolve(t?.jail):``,s,c,l=t?.cwd?i.resolve(t.cwd):process.cwd(),u=0;for(;l.startsWith(o)&&++u<128;){let t=e.cache.get(l);if(t!==void 0)return t;try{r.push(l),s=i.join(l,`./package.json`),c=await n.readFile(s,`utf8`);break}catch(e){if(!Fe(e))throw e}let a=i.join(l,`..`);if(a===l)break;l=a}if(!c)return null;let d;try{d=JSON.parse(c)}catch(e){throw Error(`could not parse 'package.json' file at: ${s}`,{cause:e})}if(!Ie(d))throw Error(`expected a JSON object in: ${s}`);if(!Y(d.name))throw Error(`name must be a string in: ${s}`);if(d.workspaces!==void 0&&!Le(d.workspaces,Y))throw Error(`workspaces must be an array of strings in: ${s}`);let f=t?.buildConfigGlob??`build.config.{js,mjs}`,p=n.glob(f,{cwd:l}),m;try{for await(let e of p){if(m)throw Error(`multiple build config files found in: ${l}`);m=i.join(l,e)}}finally{await p.return?.()}return a=new e(l,d,m)}catch(e){throw e}finally{r.forEach(t=>{e.cache.set(t,a)})}}};function Fe(e){return e?.code===`ENOENT`}function Ie(e){return typeof e==`object`&&!!e}function Y(e){return typeof e==`string`}function Le(e,t){return Array.isArray(e)&&(e.length===0||t(e[0]))}let X=function(e){return e.Runtime=`dependencies`,e.Development=`devDependencies`,e.Peer=`peerDependencies`,e.Optional=`optionalDependencies`,e}({});const Re=e=>e.startsWith(`workspace:`),Z=[X.Runtime,X.Development,X.Peer];var Q=class e{constructor(e=[],t){this.packages=e,this.workspaceRoot=t}static async discover(t){let n=t?.fs??await q(),r=null,a=t?.cwd?i.resolve(t.cwd):process.cwd(),o=0,s;for(;s=await J.discover({...t,cwd:a,fs:n}),!(!s||(r??=s,s.declaration.workspaces));){let e=i.join(s?.directory??a,`..`);if(e===a||++o>=128)break;a=e}if(!s?.declaration.workspaces)return{currentPackage:r,workspace:null};let c=t?.exclude??[`build-logic`],l=[],u=new Set([s]);a=s.directory;for await(let e of n.glob(s.declaration.workspaces,{cwd:a}))l.push((async()=>{let n=await J.discover({...t,cwd:i.join(a,e)});n&&!c.includes(n.declaration.name)&&u.add(n)})());await Promise.all(l);let d=t?.refFilter??Re,f=t?.followDeps??Z;return u.forEach(e=>{u.forEach(t=>{f.forEach(n=>{let r=e.declaration[n]?.[t.declaration.name];r&&d(r)&&(e.downstreamDependencies.push(t),t.upstreamDependents.push(e))})})}),{currentPackage:r,workspace:new e(Array.from(u),s)}}};const $={dev:M.Development,development:M.Development,stag:M.Staging,staging:M.Staging,prod:M.Production,production:M.Production},ze=h().opt(`env`,{alias:[`environment`],flag:`e`,read:e=>{let t=$[e.toLowerCase()];if(t===void 0)throw Error(`'${e}' is not a valid environment name`);return t}}).opt(`watch`,{flag:`w`}).opt(`debug`,{flag:`d`}).build();async function Be(e){let t=Date.now(),n=e?.stdout===null?A:new k(e?.stdout??process.stdout),r=!1,i=!1;try{let t=v(ze,e?.argv),a=e?.cwd??process.cwd();r=e?.watch??t.opts.watch,i=e?.debug??t.opts.debug,n.reportStackTraces=i,C(n);let o=e?.env??t.opts.env;if(o===void 0){let e;e??=process.env.NODE_ENV,e??=process.env.BUILD_ENV,e??=process.env.ENVIRONMENT,o=$[e?.toLowerCase()??``]??M.Production}let{currentPackage:s,workspace:c}=await Q.discover({...e,cwd:a}),l;if(c&&c.workspaceRoot===s&&!s.buildConfigPath)l=c.packages;else if(s){if(!s.buildConfigPath)throw Error(`package '${s.declaration.name}' has no build config`);l=[s]}else throw Error(`no package was found`);await(await p.run(l,{reporter:n,env:o,isWatching:r,isDebugging:i})).completed,process.exitCode=0}catch(e){n.logError(`Error`,e),process.exitCode=1}finally{let e=``;r||(e=`done in ${b(Date.now()-t)}`),n.finish(e),w()}}export{a as AbortError,f as Builder,X as DependencyKind,p as Dispatcher,M as Env,A as NoOpReporter,J as Package,k as StreamReporter,Q as Workspace,o as activity,Be as build,h as buildCommand,l as deferred,U as defineOutput,W as definePipeline,De as definePlugin,ke as defineTarget,b as formatTime,me as inDebugMode,ue as inDevelopment,F as inEnv,fe as inProduction,de as inStaging,pe as inWatchMode,C as overrideConsole,v as parseArgs,w as restoreConsole};
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -94,12 +94,12 @@ export const Declarations = definePlugin(
|
|
|
94
94
|
);
|
|
95
95
|
```
|
|
96
96
|
|
|
97
|
-
Then, define common build targets in `targets.
|
|
97
|
+
Then, define common build targets in `targets.js`. E.g.:
|
|
98
98
|
|
|
99
99
|
```js
|
|
100
100
|
import { defineTarget, Env, inEnv } from "@calmdown/rolldown-workspace";
|
|
101
101
|
|
|
102
|
-
import * as Plugin from "./plugins.
|
|
102
|
+
import * as Plugin from "./plugins.js";
|
|
103
103
|
|
|
104
104
|
export const TypeScriptLibrary = defineTarget("TypeScriptLibrary", target => target
|
|
105
105
|
.configure({
|
|
@@ -123,7 +123,7 @@ export const TypeScriptLibrary = defineTarget("TypeScriptLibrary", target => tar
|
|
|
123
123
|
// ...
|
|
124
124
|
```
|
|
125
125
|
|
|
126
|
-
Finally add the build command script in `build.
|
|
126
|
+
Finally add the build command script in `build.js`. The build function comes
|
|
127
127
|
with sensible defaults out of the box, however it is recommended to set at least
|
|
128
128
|
the `jail` directory to constrain all lookups to stay within the monorepo.
|
|
129
129
|
|
|
@@ -139,7 +139,7 @@ await build({ jail });
|
|
|
139
139
|
### Other Packages
|
|
140
140
|
|
|
141
141
|
With this setup, any package that needs a Rolldown build can now do so simply by
|
|
142
|
-
adding a dev dependency on `build-logic` and adding a `build.config.
|
|
142
|
+
adding a dev dependency on `build-logic` and adding a `build.config.js` script:
|
|
143
143
|
|
|
144
144
|
```json
|
|
145
145
|
{
|