or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

asset-system.mdbundler-api.mdcli.mdindex.md

asset-system.mddocs/

0

# Asset System

1

2

The Parcel Asset System is an extensible framework for processing different file types during the build process. Each asset type handles parsing, dependency collection, transformation, and code generation for specific file formats.

3

4

## Capabilities

5

6

### Base Asset Class

7

8

The foundation class that all asset types extend, providing common functionality for file processing.

9

10

```javascript { .api }

11

/**

12

* Base Asset class for all file types

13

* @param name - Absolute file path

14

* @param options - Asset processing options

15

*/

16

class Asset {

17

constructor(name, options);

18

19

/** Load file contents from disk */

20

load();

21

22

/** Parse file contents into AST or structured data */

23

parse(code);

24

25

/** Extract dependencies from parsed content */

26

collectDependencies();

27

28

/** Apply transformations to the asset */

29

transform();

30

31

/** Generate output code for different targets */

32

generate();

33

34

/** Add a dependency to this asset */

35

addDependency(name, opts);

36

37

/** Check if asset might have dependencies */

38

mightHaveDependencies();

39

40

/** Determine if asset should be invalidated */

41

shouldInvalidate(cacheData);

42

}

43

```

44

45

**Usage Examples:**

46

47

```javascript

48

// Create custom asset type

49

class CustomAsset extends Asset {

50

async parse(code) {

51

// Parse the file contents

52

return customParser(code);

53

}

54

55

collectDependencies() {

56

// Extract dependencies from AST

57

this.addDependency('./helper.js');

58

}

59

60

generate() {

61

// Generate output code

62

return { js: this.generateJS() };

63

}

64

}

65

66

// Register custom asset type

67

bundler.addAssetType('.custom', CustomAsset);

68

```

69

70

### Asset Properties

71

72

Core properties available on all Asset instances:

73

74

```javascript { .api }

75

interface AssetProperties {

76

/** Unique asset identifier */

77

id: string | null;

78

79

/** Absolute file path */

80

name: string;

81

82

/** Base filename */

83

basename: string;

84

85

/** Path relative to project root */

86

relativeName: string;

87

88

/** File extension without dot */

89

type: string;

90

91

/** Raw file contents */

92

contents: string | Buffer | null;

93

94

/** Parsed AST or structured data */

95

ast: any;

96

97

/** Generated outputs by type */

98

generated: { [type: string]: any } | null;

99

100

/** Content hash for caching */

101

hash: string | null;

102

103

/** Source maps */

104

sourceMaps: any;

105

106

/** Asset dependencies */

107

dependencies: Map<string, any>;

108

109

/** Resolved dependency assets */

110

depAssets: Map<string, Asset>;

111

112

/** Bundle containing this asset */

113

parentBundle: Bundle | null;

114

115

/** All bundles containing this asset */

116

bundles: Set<Bundle>;

117

118

/** Build timing information */

119

startTime: number;

120

endTime: number;

121

buildTime: number;

122

123

/** Bundle size information */

124

bundledSize: number;

125

}

126

```

127

128

## JavaScript Assets

129

130

### JSAsset Class

131

132

Processes JavaScript files with Babel transformations, dependency extraction, and code generation.

133

134

```javascript { .api }

135

/**

136

* JavaScript asset processor with Babel support

137

* Handles: .js, .jsx, .es6, .jsm, .mjs files

138

*/

139

class JSAsset extends Asset {

140

/** Parse JavaScript code into Babel AST */

141

parse(code);

142

143

/** Extract imports, requires, and dynamic imports */

144

collectDependencies();

145

146

/** Apply Babel transforms and optimizations */

147

transform();

148

149

/** Generate JavaScript output with source maps */

150

generate();

151

152

/** Check if code might contain dependencies */

153

mightHaveDependencies();

154

}

155

```

156

157

**Features:**

158

- ES6+ syntax transformation via Babel

159

- CommonJS and ES modules support

160

- Dynamic import code splitting

161

- Environment variable injection

162

- Global variable handling

163

- Tree shaking preparation

164

165

### TypeScriptAsset Class

166

167

Processes TypeScript files with type checking and compilation.

168

169

```javascript { .api }

170

/**

171

* TypeScript asset processor

172

* Handles: .ts, .tsx files

173

*/

174

class TypeScriptAsset extends Asset {

175

/** Parse TypeScript code with type information */

176

parse(code);

177

178

/** Apply TypeScript compiler transformations */

179

transform();

180

181

/** Generate JavaScript output from TypeScript */

182

generate();

183

}

184

```

185

186

**Features:**

187

- TypeScript compilation to JavaScript

188

- Type checking (configurable)

189

- JSX support in .tsx files

190

- Source map generation

191

- tsconfig.json configuration support

192

193

### Other JavaScript Variants

194

195

```javascript { .api }

196

/** CoffeeScript asset processor (.coffee) */

197

class CoffeeScriptAsset extends Asset;

198

199

/** Vue Single File Component processor (.vue) */

200

class VueAsset extends Asset;

201

202

/** ReasonML asset processor (.ml, .re) */

203

class ReasonAsset extends Asset;

204

205

/** Elm asset processor (.elm) */

206

class ElmAsset extends Asset;

207

208

/** Kotlin asset processor (.kt) */

209

class KotlinAsset extends Asset;

210

211

/** Rust asset processor (.rs) */

212

class RustAsset extends Asset;

213

```

214

215

## Stylesheet Assets

216

217

### CSSAsset Class

218

219

Processes CSS files with PostCSS transformations and dependency resolution.

220

221

```javascript { .api }

222

/**

223

* CSS asset processor with PostCSS support

224

* Handles: .css, .pcss, .postcss files

225

*/

226

class CSSAsset extends Asset {

227

/** Parse CSS with PostCSS */

228

parse(code);

229

230

/** Extract @import and url() dependencies */

231

collectDependencies();

232

233

/** Apply PostCSS plugins and transformations */

234

transform();

235

236

/** Generate CSS output with source maps */

237

generate();

238

}

239

```

240

241

**Features:**

242

- PostCSS plugin system

243

- CSS imports resolution

244

- URL rewriting for assets

245

- Source map support

246

- CSS Modules support

247

- Autoprefixer integration

248

249

### Preprocessor Assets

250

251

```javascript { .api }

252

/** Sass/SCSS asset processor (.sass, .scss) */

253

class SASSAsset extends Asset {

254

/** Compile Sass to CSS using node-sass or Dart Sass */

255

transform();

256

}

257

258

/** Less asset processor (.less) */

259

class LESSAsset extends Asset {

260

/** Compile Less to CSS */

261

transform();

262

}

263

264

/** Stylus asset processor (.styl, .stylus) */

265

class StylusAsset extends Asset {

266

/** Compile Stylus to CSS */

267

transform();

268

}

269

270

/** SugarSS asset processor (.sss) */

271

class SSSAsset extends Asset {

272

/** Process SugarSS syntax to CSS */

273

transform();

274

}

275

```

276

277

## Markup Assets

278

279

### HTMLAsset Class

280

281

Processes HTML files with dependency extraction and template processing.

282

283

```javascript { .api }

284

/**

285

* HTML asset processor

286

* Handles: .html, .htm files

287

*/

288

class HTMLAsset extends Asset {

289

/** Parse HTML using PostHTML */

290

parse(code);

291

292

/** Extract script, link, img, and other asset references */

293

collectDependencies();

294

295

/** Apply PostHTML transforms */

296

transform();

297

298

/** Generate HTML output */

299

generate();

300

}

301

```

302

303

**Features:**

304

- Script and stylesheet injection

305

- Asset URL rewriting

306

- Image optimization integration

307

- Template variable substitution

308

- PostHTML plugin support

309

310

### Template Assets

311

312

```javascript { .api }

313

/** Pug template processor (.jade, .pug) */

314

class PugAsset extends Asset {

315

/** Compile Pug templates to HTML */

316

transform();

317

}

318

```

319

320

## Data Format Assets

321

322

### JSON Assets

323

324

```javascript { .api }

325

/** JSON asset processor (.json, .json5) */

326

class JSONAsset extends Asset {

327

/** Parse JSON/JSON5 data */

328

parse(code);

329

330

/** Generate JavaScript module from JSON */

331

generate();

332

}

333

334

/** JSON-LD asset processor (.jsonld) */

335

class JSONLDAsset extends Asset;

336

```

337

338

### Configuration Assets

339

340

```javascript { .api }

341

/** YAML asset processor (.yaml, .yml) */

342

class YAMLAsset extends Asset {

343

/** Parse YAML and convert to JavaScript */

344

parse(code);

345

}

346

347

/** TOML asset processor (.toml) */

348

class TOMLAsset extends Asset {

349

/** Parse TOML and convert to JavaScript */

350

parse(code);

351

}

352

```

353

354

## Specialized Assets

355

356

### GraphQL Assets

357

358

```javascript { .api }

359

/** GraphQL asset processor (.gql, .graphql) */

360

class GraphqlAsset extends Asset {

361

/** Parse GraphQL queries and schemas */

362

parse(code);

363

364

/** Generate JavaScript modules from GraphQL */

365

generate();

366

}

367

```

368

369

### Shader Assets

370

371

```javascript { .api }

372

/** GLSL shader processor (.glsl, .vert, .frag) */

373

class GLSLAsset extends Asset {

374

/** Process GLSL shaders */

375

parse(code);

376

377

/** Generate string modules for shaders */

378

generate();

379

}

380

```

381

382

### WebAssembly Assets

383

384

```javascript { .api }

385

/** WebAssembly processor (.wasm) */

386

class WASMAsset extends Asset {

387

/** Load and optimize WASM binary */

388

load();

389

390

/** Generate loader code for WASM */

391

generate();

392

}

393

```

394

395

### Raw Assets

396

397

```javascript { .api }

398

/** Raw file processor (fallback for unknown types) */

399

class RawAsset extends Asset {

400

/** Copy files without processing */

401

generate();

402

}

403

404

/** Glob pattern processor */

405

class GlobAsset extends Asset {

406

/** Resolve glob patterns to file dependencies */

407

collectDependencies();

408

}

409

```

410

411

## Asset Registration

412

413

### Built-in Asset Types

414

415

Parcel includes built-in support for these file extensions:

416

417

```javascript { .api }

418

// JavaScript and variants

419

'.js', '.jsx', '.es6', '.jsm', '.mjs' // JSAsset

420

'.ts', '.tsx' // TypeScriptAsset

421

'.coffee' // CoffeeScriptAsset

422

'.vue' // VueAsset

423

'.re', '.ml' // ReasonAsset

424

'.elm' // ElmAsset

425

'.kt' // KotlinAsset

426

'.rs' // RustAsset

427

428

// Stylesheets

429

'.css', '.pcss', '.postcss' // CSSAsset

430

'.sass', '.scss' // SASSAsset

431

'.less' // LESSAsset

432

'.styl', '.stylus' // StylusAsset

433

'.sss' // SSSAsset

434

435

// Markup

436

'.html', '.htm' // HTMLAsset

437

'.pug', '.jade' // PugAsset

438

439

// Data formats

440

'.json', '.json5' // JSONAsset

441

'.jsonld' // JSONLDAsset

442

'.yaml', '.yml' // YAMLAsset

443

'.toml' // TOMLAsset

444

445

// Specialized

446

'.gql', '.graphql' // GraphqlAsset

447

'.glsl', '.vert', '.frag' // GLSLAsset

448

'.webmanifest' // WebManifestAsset

449

450

// Binary and raw

451

'.wasm' // WASMAsset

452

// All other extensions // RawAsset (fallback)

453

```

454

455

### Custom Asset Registration

456

457

```javascript { .api }

458

/**

459

* Register custom asset type

460

* @param extension - File extension including dot

461

* @param AssetClass - Asset class or module path

462

*/

463

bundler.addAssetType(extension, AssetClass)

464

```

465

466

**Usage Examples:**

467

468

```javascript

469

// Register custom asset class

470

class ProtobufAsset extends Asset {

471

async parse(code) {

472

return protobuf.parse(code);

473

}

474

475

generate() {

476

return { js: this.generateProtobufModule() };

477

}

478

}

479

480

bundler.addAssetType('.proto', ProtobufAsset);

481

482

// Register by module path

483

bundler.addAssetType('.custom', require.resolve('./CustomAsset'));

484

485

// Register multiple extensions

486

bundler.addAssetType('.data', DataAsset);

487

bundler.addAssetType('.config', DataAsset);

488

```

489

490

## Asset Processing Pipeline

491

492

### Processing Lifecycle

493

494

1. **Load**: Read file contents from disk

495

2. **Parse**: Convert contents to AST or structured data

496

3. **Collect Dependencies**: Extract import/require statements

497

4. **Transform**: Apply language-specific transformations

498

5. **Generate**: Produce output code for target environment

499

500

### Dependency Types

501

502

Assets can declare different types of dependencies:

503

504

```javascript { .api }

505

/**

506

* Add dependency to asset

507

* @param name - Module name or file path

508

* @param opts - Dependency options

509

*/

510

addDependency(name, opts = {})

511

512

// Options:

513

interface DependencyOptions {

514

/** Resolved dependency name */

515

name?: string;

516

517

/** Dynamic import (code splitting) */

518

dynamic?: boolean;

519

520

/** Optional dependency */

521

optional?: boolean;

522

523

/** Import location in source */

524

loc?: SourceLocation;

525

526

/** Parent asset */

527

parent?: string;

528

529

/** Environment-specific dependency */

530

env?: string;

531

}

532

```

533

534

**Usage Examples:**

535

536

```javascript

537

// Static import

538

this.addDependency('./module.js');

539

540

// Dynamic import (code splitting)

541

this.addDependency('./lazy-module.js', { dynamic: true });

542

543

// Optional dependency

544

this.addDependency('optional-plugin', { optional: true });

545

546

// Environment-specific

547

this.addDependency('node-specific', { env: 'node' });

548

```

549

550

## Caching and Performance

551

552

### Asset Caching

553

554

Assets implement caching for improved build performance:

555

556

```javascript { .api }

557

interface AssetCaching {

558

/** Cache invalidation check */

559

shouldInvalidate(cacheData): boolean;

560

561

/** Cache data for persistence */

562

cacheData: { [key: string]: any };

563

564

/** Content hash for change detection */

565

hash: string | null;

566

}

567

```

568

569

### Build Timing

570

571

Assets track build performance metrics:

572

573

```javascript { .api }

574

interface AssetTiming {

575

startTime: number; // Build start timestamp

576

endTime: number; // Build end timestamp

577

buildTime: number; // Total build time in ms

578

bundledSize: number; // Final bundled size in bytes

579

}

580

```