portapack 0.2.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.
Files changed (76) hide show
  1. package/.eslintrc.json +9 -0
  2. package/.github/workflows/ci.yml +73 -0
  3. package/.github/workflows/deploy-pages.yml +56 -0
  4. package/.prettierrc +9 -0
  5. package/.releaserc.js +29 -0
  6. package/CHANGELOG.md +21 -0
  7. package/README.md +288 -0
  8. package/commitlint.config.js +36 -0
  9. package/dist/cli/cli-entry.js +1694 -0
  10. package/dist/cli/cli-entry.js.map +1 -0
  11. package/dist/index.d.ts +275 -0
  12. package/dist/index.js +1405 -0
  13. package/dist/index.js.map +1 -0
  14. package/docs/.vitepress/config.ts +89 -0
  15. package/docs/.vitepress/sidebar-generator.ts +73 -0
  16. package/docs/cli.md +117 -0
  17. package/docs/code-of-conduct.md +65 -0
  18. package/docs/configuration.md +151 -0
  19. package/docs/contributing.md +107 -0
  20. package/docs/demo.md +46 -0
  21. package/docs/deployment.md +132 -0
  22. package/docs/development.md +168 -0
  23. package/docs/getting-started.md +106 -0
  24. package/docs/index.md +40 -0
  25. package/docs/portapack-transparent.png +0 -0
  26. package/docs/portapack.jpg +0 -0
  27. package/docs/troubleshooting.md +107 -0
  28. package/examples/main.ts +118 -0
  29. package/examples/sample-project/index.html +12 -0
  30. package/examples/sample-project/logo.png +1 -0
  31. package/examples/sample-project/script.js +1 -0
  32. package/examples/sample-project/styles.css +1 -0
  33. package/jest.config.ts +124 -0
  34. package/jest.setup.cjs +211 -0
  35. package/nodemon.json +11 -0
  36. package/output.html +1 -0
  37. package/package.json +161 -0
  38. package/site-packed.html +1 -0
  39. package/src/cli/cli-entry.ts +28 -0
  40. package/src/cli/cli.ts +139 -0
  41. package/src/cli/options.ts +151 -0
  42. package/src/core/bundler.ts +201 -0
  43. package/src/core/extractor.ts +618 -0
  44. package/src/core/minifier.ts +233 -0
  45. package/src/core/packer.ts +191 -0
  46. package/src/core/parser.ts +115 -0
  47. package/src/core/web-fetcher.ts +292 -0
  48. package/src/index.ts +262 -0
  49. package/src/types.ts +163 -0
  50. package/src/utils/font.ts +41 -0
  51. package/src/utils/logger.ts +139 -0
  52. package/src/utils/meta.ts +100 -0
  53. package/src/utils/mime.ts +90 -0
  54. package/src/utils/slugify.ts +70 -0
  55. package/test-output.html +0 -0
  56. package/tests/__fixtures__/sample-project/index.html +5 -0
  57. package/tests/unit/cli/cli-entry.test.ts +104 -0
  58. package/tests/unit/cli/cli.test.ts +230 -0
  59. package/tests/unit/cli/options.test.ts +316 -0
  60. package/tests/unit/core/bundler.test.ts +287 -0
  61. package/tests/unit/core/extractor.test.ts +1129 -0
  62. package/tests/unit/core/minifier.test.ts +414 -0
  63. package/tests/unit/core/packer.test.ts +193 -0
  64. package/tests/unit/core/parser.test.ts +540 -0
  65. package/tests/unit/core/web-fetcher.test.ts +374 -0
  66. package/tests/unit/index.test.ts +339 -0
  67. package/tests/unit/utils/font.test.ts +81 -0
  68. package/tests/unit/utils/logger.test.ts +275 -0
  69. package/tests/unit/utils/meta.test.ts +70 -0
  70. package/tests/unit/utils/mime.test.ts +96 -0
  71. package/tests/unit/utils/slugify.test.ts +71 -0
  72. package/tsconfig.build.json +11 -0
  73. package/tsconfig.jest.json +17 -0
  74. package/tsconfig.json +20 -0
  75. package/tsup.config.ts +71 -0
  76. package/typedoc.json +28 -0
@@ -0,0 +1,168 @@
1
+ # šŸ› ļø PortaPack Development Guide
2
+
3
+ ## šŸ“‹ Prerequisites
4
+
5
+ - **Node.js**: v18+ (recommended v20)
6
+ - **npm**: v9+
7
+ - **Git**
8
+
9
+ ### Optional Tools
10
+
11
+ ```bash
12
+ # Install Commitizen CLI globally
13
+ npm install -g commitizen
14
+ ```
15
+
16
+ ## šŸš€ Getting Started
17
+
18
+ 1. Clone the repository:
19
+ ```bash
20
+ git clone https://github.com/manicinc/portapack.git
21
+ cd portapack
22
+ ```
23
+
24
+ 2. Install dependencies:
25
+ ```bash
26
+ # Recommended for clean installs
27
+ npm ci
28
+ # or
29
+ npm install
30
+ ```
31
+
32
+ ## āš™ļø Development Workflow
33
+
34
+ ### Primary Development Command
35
+
36
+ ```bash
37
+ npm run dev
38
+ ```
39
+
40
+ This command simultaneously runs:
41
+ - TypeScript rebuild watcher
42
+ - Documentation server
43
+ - Test runner
44
+
45
+ ### Specific Development Scripts
46
+
47
+ | Command | Purpose |
48
+ |---------|---------|
49
+ | `npm run dev:build` | Watch and rebuild TypeScript |
50
+ | `npm run dev:docs` | Start documentation server |
51
+ | `npm run dev:test` | Run tests in watch mode |
52
+
53
+ ## 🧪 Testing Strategies
54
+
55
+ ### Test Runners
56
+
57
+ ```bash
58
+ # Full test suite with coverage
59
+ npm test
60
+
61
+ # Interactive test watch mode
62
+ npm run dev:test
63
+
64
+ # Targeted test debugging
65
+ npm run dev:test:debug -- tests/specific/file.test.ts
66
+
67
+ # Clear Jest cache
68
+ npm run test:clear
69
+ ```
70
+
71
+ ## 🧰 Code Quality
72
+
73
+ ```bash
74
+ # Lint code
75
+ npm run lint
76
+
77
+ # Format code
78
+ npm run format
79
+
80
+ # Check formatting
81
+ npm run format:check
82
+ ```
83
+
84
+ ## šŸ“¦ Building
85
+
86
+ ```bash
87
+ # Build project
88
+ npm run build
89
+ ```
90
+
91
+ Builds include:
92
+ - TypeScript compilation
93
+ - API documentation generation
94
+ - Documentation site build
95
+
96
+ ## šŸ“š Documentation
97
+
98
+ ```bash
99
+ # Start documentation development
100
+ npm run docs:dev
101
+
102
+ # Generate API docs
103
+ npm run docs:api
104
+
105
+ # Build documentation
106
+ npm run docs:build
107
+ ```
108
+
109
+ ## šŸ’¬ Committing Changes
110
+
111
+ ```bash
112
+ # Stage changes
113
+ git add .
114
+
115
+ # Use commit helper
116
+ npm run commit
117
+ ```
118
+
119
+ Follow the Conventional Commits specification guided by Commitizen.
120
+
121
+ ## šŸ¤ Contribution Workflow
122
+
123
+ 1. Fork the repository
124
+ 2. Create a feature branch
125
+ ```bash
126
+ git checkout -b feature/your-feature
127
+ ```
128
+ 3. Make changes
129
+ 4. Run tests
130
+ ```bash
131
+ npm test
132
+ npm run lint
133
+ npm run format
134
+ ```
135
+ 5. Commit using `npm run commit`
136
+ 6. Push to your fork
137
+ 7. Open a Pull Request
138
+
139
+ ## šŸ“ Project Structure
140
+
141
+ ```
142
+ portapack/
143
+ ā”œā”€ā”€ .github/ # GitHub Actions
144
+ ā”œā”€ā”€ dist/ # Compiled output
145
+ ā”œā”€ā”€ docs/ # Documentation source
146
+ ā”œā”€ā”€ examples/ # Example scripts
147
+ ā”œā”€ā”€ src/ # Source code
148
+ │ ā”œā”€ā”€ cli/ # CLI logic
149
+ │ ā”œā”€ā”€ core/ # Core bundling logic
150
+ │ └── utils/ # Utility functions
151
+ ā”œā”€ā”€ tests/ # Test files
152
+ └── package.json # Project configuration
153
+ ```
154
+
155
+ ## 🚨 Troubleshooting
156
+
157
+ - Clear Jest cache: `npm run test:clear`
158
+ - Ensure Node.js and npm versions match prerequisites
159
+ - Verify dependencies with `npm ci`
160
+
161
+ ## šŸŒ Community & Support
162
+
163
+ - [GitHub Repository](https://github.com/manicinc/portapack)
164
+ - [Issue Tracker](https://github.com/manicinc/portapack/issues)
165
+
166
+ ## šŸ“„ License
167
+
168
+ MIT License - Built by Manic Agency
@@ -0,0 +1,106 @@
1
+ # šŸš€ Getting Started with PortaPack
2
+
3
+ ## Prerequisites
4
+
5
+ - Node.js (v16.0.0+)
6
+ - npm (v8.0.0+)
7
+
8
+ ## Quick Installation
9
+
10
+ ```bash
11
+ # Global installation
12
+ npm install -g portapack
13
+
14
+ # Or as a project dependency
15
+ npm install --save-dev portapack
16
+ ```
17
+
18
+ ## Documentation
19
+
20
+ Our documentation is automatically generated and hosted locally:
21
+
22
+ - 🌐 **Local Docs**: at `http://localhost:5173`
23
+ - šŸ“¦ **Auto-Generated API Docs**: Dynamically created from TypeDoc comments
24
+ - 🧩 **Sidebar Generation**: Intelligent, automated sidebar creation
25
+
26
+ ### Running Documentation Locally
27
+
28
+ ```bash
29
+ # Start documentation development server
30
+ npm run docs:dev
31
+ ```
32
+
33
+ ## Basic Usage
34
+
35
+ ### CLI Quickstart
36
+
37
+ ```bash
38
+ # Bundle a local HTML file
39
+ portapack -i ./index.html -o portable.html
40
+
41
+ # Bundle a remote website
42
+ portapack -i https://example.com --recursive -o site.html
43
+ ```
44
+
45
+ ### Node.js API Basic Example
46
+
47
+ ```typescript
48
+ import { generatePortableHTML } from 'portapack';
49
+
50
+ // Simple usage with a string path
51
+ async function bundleLocalSite() {
52
+ const portableHtml = await generatePortableHTML('./index.html');
53
+ console.log(portableHtml);
54
+ }
55
+
56
+ // Advanced options using configuration object
57
+ async function bundleWithOptions() {
58
+ const portableHtml = await generatePortableHTML({
59
+ input: './index.html',
60
+ minify: true,
61
+ minifyLevel: 2,
62
+ baseUrl: 'https://example.com'
63
+ });
64
+
65
+ // Use or save the bundled HTML
66
+ console.log(portableHtml);
67
+ }
68
+ ```
69
+
70
+ ## Documentation Architecture
71
+
72
+ ### Automatic Documentation Generation
73
+
74
+ PortaPack uses a custom sidebar generator (`buildDocsSidebar()`) to:
75
+ - Automatically scan TypeDoc-generated markdown files
76
+ - Create dynamic, organized documentation sidebars
77
+ - Support multiple documentation types (modules, classes, interfaces, etc.)
78
+
79
+ #### How It Works
80
+
81
+ 1. TypeDoc generates markdown from source code comments
82
+ 2. Custom sidebar generator reads generated files
83
+ 3. VitePress renders dynamically generated sidebar
84
+
85
+ ## Next Steps
86
+
87
+ - šŸ“– [Explore CLI Options](/cli)
88
+ - šŸ›  [Advanced Configuration](/configuration)
89
+ - šŸ’» [API Reference](/api/README)
90
+
91
+ ## Troubleshooting
92
+
93
+ Encountering issues? Check our [Troubleshooting Guide](/troubleshooting)
94
+
95
+ ## Contributing
96
+
97
+ Interested in improving PortaPack?
98
+ - [View Contributing Guidelines](/contributing)
99
+ - [Development Guide](/development)
100
+
101
+ ## Support
102
+
103
+ - šŸ› [Report an Issue](https://github.com/manicinc/portapack/issues)
104
+ - šŸ’¬ [Community Support](https://discord.gg/DzNgXdYm)
105
+
106
+ Built by [Manic.agency](https://manic.agency)
package/docs/index.md ADDED
@@ -0,0 +1,40 @@
1
+ ---
2
+ title: PortaPack
3
+ description: šŸ“¦ Bundle and minify HTML and all its dependencies into a single portable file.
4
+ layout: home
5
+ hero:
6
+ name: PortaPack
7
+ text: Bundle any HTML or site into one optimized file.
8
+ tagline: Recursively crawl, embed, and minify all scripts, styles, and images into a single portable .html.
9
+ image:
10
+ src: https://res.cloudinary.com/dwaypfftw/image/upload/v1744373244/portapack-transparent_qlyfpm.png
11
+ alt: PortaPack Logo
12
+ actions:
13
+ - theme: brand
14
+ text: Get Started
15
+ link: /getting-started
16
+ - theme: alt
17
+ text: GitHub
18
+ link: https://github.com/manicinc/portapack
19
+ features:
20
+ - icon: 🧳
21
+ title: Single-File Output
22
+ details: Everything packed — HTML, CSS, JS, fonts, images — into one fully portable file.
23
+ - icon: šŸš€
24
+ title: CLI + Node API
25
+ details: Use it as a CLI or integrate with Node.js scripts and build tools.
26
+ - icon: 🌐
27
+ title: Recursively Crawl Pages
28
+ details: Follow internal links, crawl sites, and bundle multiple pages with templates.
29
+ - icon: 🧼
30
+ title: Minify Everything
31
+ details: Minify HTML, CSS, and JS with fine-grained control over what gets compressed.
32
+ - icon: 🧠
33
+ title: Smart Defaults
34
+ details: Sensible output paths, base URLs, and intelligent embedding for fast builds.
35
+ - icon: šŸ¤
36
+ title: Open Source & Developer Friendly
37
+ details: MIT licensed, tested, documented, and easy to contribute to.
38
+
39
+ footer: Built by [Manic.agency](https://manic.agency) — Open Source & Empowering Designers and Developers
40
+ ---
Binary file
Binary file
@@ -0,0 +1,107 @@
1
+ # šŸ›  PortaPack Troubleshooting Guide
2
+
3
+ ## 🚨 Common Issues
4
+
5
+ ### 1. Installation Problems
6
+
7
+ #### npm Install Fails
8
+ - **Symptom**: Error during `npm install`
9
+ - **Solutions**:
10
+ ```bash
11
+ # Clear npm cache
12
+ npm cache clean --force
13
+
14
+ # Reinstall dependencies
15
+ rm -rf node_modules
16
+ npm install
17
+ ```
18
+
19
+ ### 2. CLI Errors
20
+
21
+ #### Permission Denied
22
+ - **Symptom**: `EACCES` errors
23
+ - **Solutions**:
24
+ ```bash
25
+ # Use npm with sudo (not recommended long-term)
26
+ sudo npm install -g portapack
27
+
28
+ # Or fix npm permissions
29
+ npm config set prefix ~/.npm
30
+ npm install -g portapack
31
+ ```
32
+
33
+ #### Asset Embedding Failures
34
+ - **Symptom**: Some assets not embedded
35
+ - **Possible Causes**:
36
+ - Incorrect base URL
37
+ - Network restrictions
38
+ - Large file sizes
39
+
40
+ ### 3. Performance Issues
41
+
42
+ #### Slow Recursive Crawling
43
+ - **Solution**: Limit crawl depth
44
+ ```bash
45
+ portapack -i https://site.com --recursive --max-depth 2
46
+ ```
47
+
48
+ ### 4. Minification Problems
49
+
50
+ #### CSS/JS Not Minifying
51
+ - **Check**:
52
+ - Use `--no-minify-css` or `--no-minify-js` flags
53
+ - Verify asset paths
54
+ - Check file permissions
55
+
56
+ ## šŸ” Debugging Techniques
57
+
58
+ ### Verbose Logging
59
+ ```bash
60
+ # Enable verbose output
61
+ portapack -i ./site --verbose
62
+ ```
63
+
64
+ ### Dry Run
65
+ ```bash
66
+ # Preview bundling without generating file
67
+ portapack -i ./site --dry-run
68
+ ```
69
+
70
+ ## 🌐 Network & Security
71
+
72
+ ### Proxy Configuration
73
+ ```bash
74
+ # Set proxy for asset fetching
75
+ export HTTP_PROXY=http://proxy.example.com
76
+ portapack -i https://site.com
77
+ ```
78
+
79
+ ## šŸ“Š Diagnostics
80
+
81
+ ### Generate Diagnostic Report
82
+ ```bash
83
+ # Create debug information
84
+ portapack --diagnostics > portapack-debug.log
85
+ ```
86
+
87
+ ## šŸ†˜ Getting Help
88
+
89
+ 1. Check [GitHub Issues](https://github.com/manicinc/portapack/issues)
90
+ 2. Open a new issue with:
91
+ - PortaPack version
92
+ - Node.js version
93
+ - Detailed error message
94
+ - Reproduction steps
95
+
96
+ ## šŸ’” Pro Tips
97
+
98
+ - Keep PortaPack updated
99
+ - Use the latest Node.js LTS
100
+ - Check network connectivity
101
+ - Validate input files/URLs
102
+
103
+ ## 🚧 Known Limitations
104
+
105
+ - Limited support for complex Single Page Applications (SPAs)
106
+ - Some dynamic content may not embed correctly
107
+ - Large sites might require significant memory
@@ -0,0 +1,118 @@
1
+ /**
2
+ * examples/main.ts
3
+ *
4
+ * Demo showcasing PortaPack API usage with clear file output and metadata.
5
+ */
6
+
7
+ import fs from 'fs/promises';
8
+ import path from 'path';
9
+ import os from 'os';
10
+ import chalk from 'chalk';
11
+
12
+ import {
13
+ generatePortableHTML,
14
+ bundleMultiPageHTML,
15
+ generateRecursivePortableHTML,
16
+ fetchAndPackWebPage
17
+ } from '../src/index'; // šŸ”§ use '../src/index' for dev, '../dist/index' for built
18
+
19
+ const TEMP_DIR = path.join(os.tmpdir(), 'portapack-example');
20
+
21
+ async function writeTempFile(name: string, html: string): Promise<string> {
22
+ await fs.mkdir(TEMP_DIR, { recursive: true });
23
+ const fullPath = path.join(TEMP_DIR, name);
24
+ await fs.writeFile(fullPath, html, 'utf-8');
25
+ return fullPath;
26
+ }
27
+
28
+ function logMetadata(meta: any, filePath: string) {
29
+ console.log(chalk.gray('\n--- Metadata ---'));
30
+ console.log(`šŸ“„ Output: file://${filePath}`);
31
+ if (meta.input) console.log(`šŸ”— Input: ${meta.input}`);
32
+ if (meta.outputSize) console.log(`šŸ“¦ Size: ${(meta.outputSize / 1024).toFixed(2)} KB`);
33
+ if (meta.buildTimeMs) console.log(`ā± Time: ${meta.buildTimeMs} ms`);
34
+ if (meta.pagesBundled) console.log(`🧩 Pages: ${meta.pagesBundled}`);
35
+ if (meta.errors?.length) {
36
+ console.warn(chalk.yellow(`āš ļø ${meta.errors.length} warning(s):`));
37
+ meta.errors.forEach((e: string) => console.warn(`- ${e}`));
38
+ }
39
+ console.log(chalk.gray('----------------\n'));
40
+ }
41
+
42
+ // Accepts a function that returns { html, metadata }
43
+ async function timedBundle(
44
+ name: string,
45
+ task: () => Promise<{ html: string; metadata: any }>
46
+ ) {
47
+ const start = Date.now();
48
+ console.log(chalk.cyanBright(`\nā³ ${name}`));
49
+
50
+ try {
51
+ const { html, metadata } = await task();
52
+ const outputFile = await writeTempFile(`${name.toLowerCase().replace(/\s+/g, '-')}.html`, html);
53
+ console.log(chalk.green(`āœ… Finished in ${Date.now() - start}ms`));
54
+ logMetadata(metadata, outputFile);
55
+ } catch (err) {
56
+ console.error(chalk.red(`āŒ ${name} failed:`), err);
57
+ }
58
+ }
59
+
60
+ (async () => {
61
+ console.log(chalk.magenta.bold('\n🌐 PortaPack API Examples'));
62
+
63
+ // šŸ”¹ Single local HTML file
64
+ await timedBundle('Local HTML File Bundling', () =>
65
+ generatePortableHTML('./examples/sample-project/index.html', {
66
+ embedAssets: true,
67
+ minifyHtml: true,
68
+ minifyCss: true,
69
+ minifyJs: true
70
+ })
71
+ );
72
+
73
+ // šŸ”¹ Fetch and display raw HTML from remote site (no metadata)
74
+ console.log(chalk.cyan('\nā³ Fetch and Pack Web Page (raw)'));
75
+ try {
76
+ const { html, metadata } = await fetchAndPackWebPage('https://getbootstrap.com');
77
+ const filePath = await writeTempFile('fetched-page.html', html);
78
+ console.log(chalk.green('āœ… Saved fetched HTML:'), `file://${filePath}`);
79
+ console.log(`šŸ“¦ Size: ${(metadata.outputSize / 1024).toFixed(2)} KB`);
80
+ } catch (err) {
81
+ console.error(chalk.red('āŒ Failed to fetch web page:'), err);
82
+ }
83
+
84
+ // šŸ”¹ Multi-page manual bundle
85
+ await timedBundle('Multi-Page Site Bundling', async () => {
86
+ const pages = [
87
+ { url: 'https://example.com', html: '<html><body>Page 1</body></html>' },
88
+ { url: 'https://example.com/about', html: '<html><body>Page 2</body></html>' }
89
+ ];
90
+ const html = bundleMultiPageHTML(pages);
91
+ return {
92
+ html,
93
+ metadata: {
94
+ input: 'manual pages',
95
+ pagesBundled: pages.length,
96
+ outputSize: html.length,
97
+ buildTimeMs: 0
98
+ }
99
+ };
100
+ });
101
+
102
+ // šŸ”¹ Recursive crawl & bundle
103
+ await timedBundle('Recursive Site Bundling', () =>
104
+ generateRecursivePortableHTML('https://getbootstrap.com', 2)
105
+ );
106
+
107
+ // šŸ”¹ Broken page test
108
+ console.log(chalk.cyan('\nā³ Broken Page Test'));
109
+ try {
110
+ const { html, metadata} = await fetchAndPackWebPage('https://example.com/404');
111
+ const brokenOut = await writeTempFile('broken-page.html', html);
112
+ console.log(chalk.yellow('āš ļø Page returned something, saved to:'), `file://${brokenOut}`);
113
+ } catch {
114
+ console.log(chalk.red('🚫 Could not fetch broken page as expected.'));
115
+ }
116
+
117
+ console.log(chalk.gray(`\nšŸ“ Output directory: ${TEMP_DIR}\n`));
118
+ })();
@@ -0,0 +1,12 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Test</title>
5
+ <link rel="stylesheet" href="styles.css">
6
+ </head>
7
+ <body>
8
+ <h1>Hello</h1>
9
+ <img src="logo.png" />
10
+ <script src="script.js"></script>
11
+ </body>
12
+ </html>
@@ -0,0 +1 @@
1
+ fake image data
@@ -0,0 +1 @@
1
+ console.log('hello');
@@ -0,0 +1 @@
1
+ body { margin: 0; }
package/jest.config.ts ADDED
@@ -0,0 +1,124 @@
1
+ import type { Config } from 'jest';
2
+ import path from 'path';
3
+
4
+ const config: Config = {
5
+ /**
6
+ * Use ts-jest with ESM support.
7
+ */
8
+ preset: 'ts-jest/presets/default-esm',
9
+
10
+ /**
11
+ * Node test environment
12
+ */
13
+ testEnvironment: 'node',
14
+
15
+ /**
16
+ * Custom setup scripts after env is ready.
17
+ */
18
+ setupFilesAfterEnv: ['<rootDir>/jest.setup.cjs'],
19
+
20
+ /**
21
+ * Tell ts-jest to use ESM transformation
22
+ */
23
+ transform: {
24
+ '^.+\\.tsx?$': [
25
+ 'ts-jest',
26
+ {
27
+ useESM: true,
28
+ tsconfig: './tsconfig.jest.json'
29
+ }
30
+ ]
31
+ },
32
+
33
+ /**
34
+ * Treat `.ts` files as ESM modules.
35
+ */
36
+ extensionsToTreatAsEsm: ['.ts'],
37
+
38
+ /**
39
+ * Module name mapping to handle extensions in imports for ESM
40
+ */
41
+ moduleNameMapper: {
42
+ // Map imports ending in '.js' back to source file (remove .js)
43
+ '^(\\.{1,2}/.*)\\.js$': '$1',
44
+ // Keep absolute path alias
45
+ '^portapack(.*)$': '<rootDir>/src$1',
46
+ // Mock path support
47
+ '^__mocks__/(.*)$': '<rootDir>/__mocks__/$1'
48
+ },
49
+
50
+ /**
51
+ * Collect coverage from source files only.
52
+ */
53
+ collectCoverageFrom: [
54
+ 'src/**/*.ts',
55
+ '!src/**/*.d.ts',
56
+ '!src/**/*.test.ts',
57
+ '!src/types.ts',
58
+ '!src/cli/cli-entry.ts'
59
+ ],
60
+
61
+ /**
62
+ * Output coverage report here.
63
+ */
64
+ coverageDirectory: './coverage',
65
+
66
+ /**
67
+ * Global coverage enforcement - temporarily lowered to help get tests passing and an initial package build live for testing
68
+ */
69
+ coverageThreshold: {
70
+ global: {
71
+ branches: 60,
72
+ functions: 60,
73
+ lines: 60,
74
+ statements: 60,
75
+ },
76
+ },
77
+
78
+ /**
79
+ * Increase test timeout to allow Puppeteer + network-dependent tests.
80
+ */
81
+ testTimeout: 60000, // Increased from 30s to 60s
82
+
83
+ /**
84
+ * Type-ahead filters for watch mode
85
+ */
86
+ watchPlugins: [
87
+ 'jest-watch-typeahead/filename',
88
+ 'jest-watch-typeahead/testname'
89
+ ],
90
+
91
+ /**
92
+ * Don't error if no tests found (for initial development)
93
+ */
94
+ passWithNoTests: true,
95
+
96
+ /**
97
+ * Ignore specific paths in watch mode
98
+ */
99
+ watchPathIgnorePatterns: [
100
+ path.join('<rootDir>', 'tests', '__fixtures__', 'output')
101
+ ],
102
+
103
+ /**
104
+ * Mock implementations
105
+ */
106
+ modulePathIgnorePatterns: ['<rootDir>/dist/'],
107
+
108
+ /**
109
+ * Make all tests deterministic - resets mocks between tests
110
+ */
111
+ resetMocks: false, // Changed to false to allow persistent mocks when needed
112
+
113
+ /**
114
+ * Verbosity level
115
+ */
116
+ verbose: true,
117
+
118
+ /**
119
+ * Add test failure diagnostics
120
+ */
121
+ errorOnDeprecated: true,
122
+ };
123
+
124
+ export default config;