pdf-lite 1.0.0

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 (206) hide show
  1. package/.commitlintrc.cjs +25 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
  4. package/.github/workflows/docs.yaml +93 -0
  5. package/.github/workflows/prepare-release.yaml +79 -0
  6. package/.github/workflows/release.yaml +80 -0
  7. package/.github/workflows/test.yaml +35 -0
  8. package/.husky/commit-msg +1 -0
  9. package/.husky/pre-commit +1 -0
  10. package/.prettierignore +4 -0
  11. package/.prettierrc +4 -0
  12. package/CONTRIBUTING.md +109 -0
  13. package/EXAMPLES.md +1515 -0
  14. package/LICENSE +21 -0
  15. package/README.md +285 -0
  16. package/examples/001-create-pdf.ts +112 -0
  17. package/examples/002-create-encrypted-pdf.ts +121 -0
  18. package/examples/003-sign-pdf.ts +347 -0
  19. package/examples/004-incremental-update.ts +206 -0
  20. package/examples/005-modify-acroform.ts +374 -0
  21. package/examples/006-tokeniser-example.ts +131 -0
  22. package/examples/007-decoder-example.ts +197 -0
  23. package/package.json +72 -0
  24. package/packages/pdf-lite/README.md +3 -0
  25. package/packages/pdf-lite/package.json +68 -0
  26. package/packages/pdf-lite/scripts/create-encryption-tests.sh +41 -0
  27. package/packages/pdf-lite/scripts/gen-signing-keys.sh +290 -0
  28. package/packages/pdf-lite/scripts/generate-all-signing-keys.sh +70 -0
  29. package/packages/pdf-lite/src/core/decoder.ts +454 -0
  30. package/packages/pdf-lite/src/core/generators.ts +128 -0
  31. package/packages/pdf-lite/src/core/incremental-parser.ts +221 -0
  32. package/packages/pdf-lite/src/core/index.ts +2 -0
  33. package/packages/pdf-lite/src/core/objects/pdf-array.ts +54 -0
  34. package/packages/pdf-lite/src/core/objects/pdf-boolean.ts +19 -0
  35. package/packages/pdf-lite/src/core/objects/pdf-comment.ts +50 -0
  36. package/packages/pdf-lite/src/core/objects/pdf-date.ts +74 -0
  37. package/packages/pdf-lite/src/core/objects/pdf-dictionary.ts +171 -0
  38. package/packages/pdf-lite/src/core/objects/pdf-hexadecimal.ts +54 -0
  39. package/packages/pdf-lite/src/core/objects/pdf-indirect-object.ts +137 -0
  40. package/packages/pdf-lite/src/core/objects/pdf-name.ts +19 -0
  41. package/packages/pdf-lite/src/core/objects/pdf-null.ts +15 -0
  42. package/packages/pdf-lite/src/core/objects/pdf-number.ts +98 -0
  43. package/packages/pdf-lite/src/core/objects/pdf-object-reference.ts +30 -0
  44. package/packages/pdf-lite/src/core/objects/pdf-object.ts +107 -0
  45. package/packages/pdf-lite/src/core/objects/pdf-start-xref.ts +39 -0
  46. package/packages/pdf-lite/src/core/objects/pdf-stream.ts +687 -0
  47. package/packages/pdf-lite/src/core/objects/pdf-string.ts +38 -0
  48. package/packages/pdf-lite/src/core/objects/pdf-trailer.ts +57 -0
  49. package/packages/pdf-lite/src/core/objects/pdf-xref-table.ts +264 -0
  50. package/packages/pdf-lite/src/core/parser.ts +22 -0
  51. package/packages/pdf-lite/src/core/ref.ts +102 -0
  52. package/packages/pdf-lite/src/core/serializer.ts +68 -0
  53. package/packages/pdf-lite/src/core/streams/object-stream.ts +20 -0
  54. package/packages/pdf-lite/src/core/tokeniser.ts +687 -0
  55. package/packages/pdf-lite/src/core/tokens/boolean-token.ts +20 -0
  56. package/packages/pdf-lite/src/core/tokens/byte-offset-token.ts +20 -0
  57. package/packages/pdf-lite/src/core/tokens/comment-token.ts +32 -0
  58. package/packages/pdf-lite/src/core/tokens/end-array-token.ts +10 -0
  59. package/packages/pdf-lite/src/core/tokens/end-dictionary-token.ts +10 -0
  60. package/packages/pdf-lite/src/core/tokens/end-object-token.ts +10 -0
  61. package/packages/pdf-lite/src/core/tokens/end-stream-token.ts +11 -0
  62. package/packages/pdf-lite/src/core/tokens/hexadecimal-token.ts +22 -0
  63. package/packages/pdf-lite/src/core/tokens/name-token.ts +19 -0
  64. package/packages/pdf-lite/src/core/tokens/null-token.ts +9 -0
  65. package/packages/pdf-lite/src/core/tokens/number-token.ts +164 -0
  66. package/packages/pdf-lite/src/core/tokens/object-reference-token.ts +24 -0
  67. package/packages/pdf-lite/src/core/tokens/start-array-token.ts +10 -0
  68. package/packages/pdf-lite/src/core/tokens/start-dictionary-token.ts +10 -0
  69. package/packages/pdf-lite/src/core/tokens/start-object-token.ts +28 -0
  70. package/packages/pdf-lite/src/core/tokens/start-stream-token.ts +52 -0
  71. package/packages/pdf-lite/src/core/tokens/start-xref-token.ts +10 -0
  72. package/packages/pdf-lite/src/core/tokens/stream-chunk-token.ts +8 -0
  73. package/packages/pdf-lite/src/core/tokens/string-token.ts +17 -0
  74. package/packages/pdf-lite/src/core/tokens/token.ts +43 -0
  75. package/packages/pdf-lite/src/core/tokens/trailer-token.ts +12 -0
  76. package/packages/pdf-lite/src/core/tokens/whitespace-token.ts +43 -0
  77. package/packages/pdf-lite/src/core/tokens/xref-table-entry-token.ts +65 -0
  78. package/packages/pdf-lite/src/core/tokens/xref-table-section-start-token.ts +31 -0
  79. package/packages/pdf-lite/src/core/tokens/xref-table-start-token.ts +13 -0
  80. package/packages/pdf-lite/src/crypto/ciphers/aes128.ts +63 -0
  81. package/packages/pdf-lite/src/crypto/ciphers/aes256.ts +50 -0
  82. package/packages/pdf-lite/src/crypto/ciphers/rc4.ts +82 -0
  83. package/packages/pdf-lite/src/crypto/constants.ts +10 -0
  84. package/packages/pdf-lite/src/crypto/key-derivation/key-derivation-aes256.ts +213 -0
  85. package/packages/pdf-lite/src/crypto/key-derivation/key-derivation.ts +122 -0
  86. package/packages/pdf-lite/src/crypto/key-gen/key-gen-aes256.ts +79 -0
  87. package/packages/pdf-lite/src/crypto/key-gen/key-gen-rc4-128.ts +190 -0
  88. package/packages/pdf-lite/src/crypto/key-gen/key-gen-rc4-40.ts +129 -0
  89. package/packages/pdf-lite/src/crypto/types.ts +6 -0
  90. package/packages/pdf-lite/src/crypto/utils.ts +81 -0
  91. package/packages/pdf-lite/src/filters/ascii85.ts +128 -0
  92. package/packages/pdf-lite/src/filters/asciihex.ts +55 -0
  93. package/packages/pdf-lite/src/filters/flate.ts +39 -0
  94. package/packages/pdf-lite/src/filters/lzw.ts +144 -0
  95. package/packages/pdf-lite/src/filters/pass-through.ts +37 -0
  96. package/packages/pdf-lite/src/filters/runlength.ts +92 -0
  97. package/packages/pdf-lite/src/filters/types.ts +21 -0
  98. package/packages/pdf-lite/src/index.ts +4 -0
  99. package/packages/pdf-lite/src/pdf/errors.ts +5 -0
  100. package/packages/pdf-lite/src/pdf/index.ts +4 -0
  101. package/packages/pdf-lite/src/pdf/pdf-document.ts +924 -0
  102. package/packages/pdf-lite/src/pdf/pdf-reader.ts +57 -0
  103. package/packages/pdf-lite/src/pdf/pdf-revision.ts +234 -0
  104. package/packages/pdf-lite/src/pdf/pdf-xref-lookup.ts +527 -0
  105. package/packages/pdf-lite/src/security/crypt-filters/aesv2.ts +58 -0
  106. package/packages/pdf-lite/src/security/crypt-filters/aesv3.ts +56 -0
  107. package/packages/pdf-lite/src/security/crypt-filters/base.ts +140 -0
  108. package/packages/pdf-lite/src/security/crypt-filters/identity.ts +40 -0
  109. package/packages/pdf-lite/src/security/crypt-filters/v2.ts +59 -0
  110. package/packages/pdf-lite/src/security/handlers/base.ts +625 -0
  111. package/packages/pdf-lite/src/security/handlers/pubSec.ts +413 -0
  112. package/packages/pdf-lite/src/security/handlers/utils.ts +304 -0
  113. package/packages/pdf-lite/src/security/handlers/v1.ts +225 -0
  114. package/packages/pdf-lite/src/security/handlers/v2.ts +128 -0
  115. package/packages/pdf-lite/src/security/handlers/v4.ts +379 -0
  116. package/packages/pdf-lite/src/security/handlers/v5.ts +298 -0
  117. package/packages/pdf-lite/src/security/types.ts +158 -0
  118. package/packages/pdf-lite/src/signing/document-security-store.ts +224 -0
  119. package/packages/pdf-lite/src/signing/index.ts +3 -0
  120. package/packages/pdf-lite/src/signing/signatures/adbe-pkcs7-detached.ts +154 -0
  121. package/packages/pdf-lite/src/signing/signatures/adbe-pkcs7-sha1.ts +161 -0
  122. package/packages/pdf-lite/src/signing/signatures/adbe-x509-rsa-sha1.ts +106 -0
  123. package/packages/pdf-lite/src/signing/signatures/base.ts +229 -0
  124. package/packages/pdf-lite/src/signing/signatures/etsi-cades-detached.ts +229 -0
  125. package/packages/pdf-lite/src/signing/signatures/etsi-rfc3161.ts +92 -0
  126. package/packages/pdf-lite/src/signing/signatures/index.ts +6 -0
  127. package/packages/pdf-lite/src/signing/signer.ts +120 -0
  128. package/packages/pdf-lite/src/signing/types.ts +86 -0
  129. package/packages/pdf-lite/src/signing/utils.ts +71 -0
  130. package/packages/pdf-lite/src/types.ts +44 -0
  131. package/packages/pdf-lite/src/utils/IterableReadableStream.ts +30 -0
  132. package/packages/pdf-lite/src/utils/algos.ts +446 -0
  133. package/packages/pdf-lite/src/utils/assert.ts +42 -0
  134. package/packages/pdf-lite/src/utils/bytesToHex.ts +18 -0
  135. package/packages/pdf-lite/src/utils/bytesToHexBytes.ts +27 -0
  136. package/packages/pdf-lite/src/utils/bytesToString.ts +17 -0
  137. package/packages/pdf-lite/src/utils/concatUint8Arrays.ts +26 -0
  138. package/packages/pdf-lite/src/utils/escapeString.ts +49 -0
  139. package/packages/pdf-lite/src/utils/hexBytesToBytes.ts +22 -0
  140. package/packages/pdf-lite/src/utils/hexBytesToString.ts +21 -0
  141. package/packages/pdf-lite/src/utils/hexToBytes.ts +18 -0
  142. package/packages/pdf-lite/src/utils/padBytes.ts +25 -0
  143. package/packages/pdf-lite/src/utils/predictors.ts +332 -0
  144. package/packages/pdf-lite/src/utils/replaceInBuffer.ts +56 -0
  145. package/packages/pdf-lite/src/utils/stringToBytes.ts +22 -0
  146. package/packages/pdf-lite/src/utils/stringToHexBytes.ts +23 -0
  147. package/packages/pdf-lite/src/utils/unescapeString.ts +123 -0
  148. package/packages/pdf-lite/test/acceptance/__snapshots__/versions.node.test.ts.snap +60766 -0
  149. package/packages/pdf-lite/test/acceptance/fixtures/1.3/basic.pdf +0 -0
  150. package/packages/pdf-lite/test/acceptance/fixtures/1.4/basic-aes-128.pdf +0 -0
  151. package/packages/pdf-lite/test/acceptance/fixtures/1.4/basic-aes-256.pdf +0 -0
  152. package/packages/pdf-lite/test/acceptance/fixtures/1.4/basic-rc4-128.pdf +0 -0
  153. package/packages/pdf-lite/test/acceptance/fixtures/1.4/basic-rc4-40.pdf +0 -0
  154. package/packages/pdf-lite/test/acceptance/fixtures/1.4/basic.pdf +0 -0
  155. package/packages/pdf-lite/test/acceptance/fixtures/1.5/basic.pdf +0 -0
  156. package/packages/pdf-lite/test/acceptance/fixtures/1.6/basic.pdf +0 -0
  157. package/packages/pdf-lite/test/acceptance/fixtures/1.7/basic.pdf +0 -0
  158. package/packages/pdf-lite/test/acceptance/fixtures/2.0/basic-aes-128.pdf +43 -0
  159. package/packages/pdf-lite/test/acceptance/fixtures/2.0/basic-aes-256.pdf +43 -0
  160. package/packages/pdf-lite/test/acceptance/fixtures/2.0/basic-rc4-128.pdf +43 -0
  161. package/packages/pdf-lite/test/acceptance/fixtures/2.0/basic-rc4-40.pdf +44 -0
  162. package/packages/pdf-lite/test/acceptance/fixtures/2.0/basic.pdf +79 -0
  163. package/packages/pdf-lite/test/acceptance/versions.node.test.ts +41 -0
  164. package/packages/pdf-lite/test/unit/__snapshots__/decoder.node.test.ts.snap +86947 -0
  165. package/packages/pdf-lite/test/unit/__snapshots__/tokeniser.node.test.ts.snap +131829 -0
  166. package/packages/pdf-lite/test/unit/ciphers.test.ts +61 -0
  167. package/packages/pdf-lite/test/unit/decoder.node.test.ts +21 -0
  168. package/packages/pdf-lite/test/unit/decoder.test.ts +567 -0
  169. package/packages/pdf-lite/test/unit/filters.test.ts +67 -0
  170. package/packages/pdf-lite/test/unit/fixtures/basic.pdf +0 -0
  171. package/packages/pdf-lite/test/unit/fixtures/encrypted_v1/basic-aes-128.pdf +0 -0
  172. package/packages/pdf-lite/test/unit/fixtures/encrypted_v1/basic-aes-256.pdf +0 -0
  173. package/packages/pdf-lite/test/unit/fixtures/encrypted_v1/basic-rc4-128.pdf +0 -0
  174. package/packages/pdf-lite/test/unit/fixtures/encrypted_v1/basic-rc4-40.pdf +43 -0
  175. package/packages/pdf-lite/test/unit/fixtures/protectedAdobeLivecycle.pdf +0 -0
  176. package/packages/pdf-lite/test/unit/fixtures/rsa-2048/index.ts +187 -0
  177. package/packages/pdf-lite/test/unit/fixtures/template.pdf +0 -0
  178. package/packages/pdf-lite/test/unit/incremental-update.test.ts +0 -0
  179. package/packages/pdf-lite/test/unit/objects.test.ts +0 -0
  180. package/packages/pdf-lite/test/unit/pdf-document-signing.test.ts +0 -0
  181. package/packages/pdf-lite/test/unit/pdf-revision.test.ts +195 -0
  182. package/packages/pdf-lite/test/unit/pdf.browser.test.ts +0 -0
  183. package/packages/pdf-lite/test/unit/predictors.test.ts +226 -0
  184. package/packages/pdf-lite/test/unit/ref.test.ts +158 -0
  185. package/packages/pdf-lite/test/unit/security-handlers.test.ts +645 -0
  186. package/packages/pdf-lite/test/unit/serializer.test.ts +81 -0
  187. package/packages/pdf-lite/test/unit/signature-objects.test.ts +814 -0
  188. package/packages/pdf-lite/test/unit/string-escaping.test.ts +84 -0
  189. package/packages/pdf-lite/test/unit/tokeniser.node.test.ts +38 -0
  190. package/packages/pdf-lite/test/unit/tokeniser.test.ts +1213 -0
  191. package/packages/pdf-lite/test/unit/utils.test.ts +248 -0
  192. package/packages/pdf-lite/test/unit/xref-lookup.test.ts +72 -0
  193. package/packages/pdf-lite/tsconfig.json +4 -0
  194. package/packages/pdf-lite/tsconfig.prod.json +8 -0
  195. package/packages/pdf-lite/typedoc.json +14 -0
  196. package/packages/pdf-lite/vitest.config.ts +43 -0
  197. package/pnpm-workspace.yaml +2 -0
  198. package/renovate.json +34 -0
  199. package/scripts/build-examples.ts +30 -0
  200. package/scripts/bump-version.sh +56 -0
  201. package/scripts/gen-html-docs.sh +21 -0
  202. package/scripts/gen-md-docs.sh +15 -0
  203. package/scripts/prepare-release.sh +33 -0
  204. package/tsconfig.json +22 -0
  205. package/tsconfig.prod.json +12 -0
  206. package/typedoc.json +34 -0
@@ -0,0 +1,25 @@
1
+ module.exports = {
2
+ extends: ['@commitlint/config-conventional'],
3
+ rules: {
4
+ 'type-empty': [2, 'never'],
5
+ 'type-enum': [
6
+ 2,
7
+ 'always',
8
+ [
9
+ 'ci',
10
+ 'feat',
11
+ 'fix',
12
+ 'refactor',
13
+ 'revert',
14
+ 'style',
15
+ 'chore',
16
+ 'docs',
17
+ 'test',
18
+ 'bump',
19
+ 'perf',
20
+ 'security',
21
+ 'release',
22
+ ],
23
+ ],
24
+ },
25
+ }
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: Bug report
3
+ about: Create a report to help us improve
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+ ---
8
+
9
+ **Describe the bug**
10
+ A clear and concise description of what the bug is.
11
+
12
+ **To Reproduce**
13
+ Steps to reproduce the behavior:
14
+
15
+ 1. Go to '...'
16
+ 2. Click on '....'
17
+ 3. Scroll down to '....'
18
+ 4. See error
19
+
20
+ **Expected behavior**
21
+ A clear and concise description of what you expected to happen.
22
+
23
+ **Screenshots**
24
+ If applicable, add screenshots to help explain your problem.
25
+
26
+ **Desktop (please complete the following information):**
27
+
28
+ - OS: [e.g. iOS]
29
+ - Browser [e.g. chrome, safari]
30
+ - Version [e.g. 22]
31
+
32
+ **Smartphone (please complete the following information):**
33
+
34
+ - Device: [e.g. iPhone6]
35
+ - OS: [e.g. iOS8.1]
36
+ - Browser [e.g. stock browser, safari]
37
+ - Version [e.g. 22]
38
+
39
+ **Additional context**
40
+ Add any other context about the problem here.
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea for this project
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+ ---
8
+
9
+ **Is your feature request related to a problem? Please describe.**
10
+ A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
11
+
12
+ **Describe the solution you'd like**
13
+ A clear and concise description of what you want to happen.
14
+
15
+ **Describe alternatives you've considered**
16
+ A clear and concise description of any alternative solutions or features you've considered.
17
+
18
+ **Additional context**
19
+ Add any other context or screenshots about the feature request here.
@@ -0,0 +1,93 @@
1
+ name: Deploy Docs
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ - docs/* # Useful for testing changes to docs
8
+ tags:
9
+ - 'v*.*.*' # Trigger on version tags like v1.0.0, v2.1.3, etc.
10
+ - 'v*'
11
+ - 'latest'
12
+
13
+ workflow_dispatch:
14
+
15
+ permissions:
16
+ contents: read
17
+ pages: write
18
+ id-token: write
19
+
20
+ concurrency:
21
+ group: 'pages'
22
+ cancel-in-progress: false
23
+
24
+ defaults:
25
+ run:
26
+ shell: bash
27
+
28
+ jobs:
29
+ build:
30
+ name: Build Docs for ${{ matrix.version }}
31
+ runs-on: ubuntu-latest
32
+ strategy:
33
+ matrix:
34
+ version:
35
+ - ${{ github.ref_name }}
36
+ steps:
37
+ - name: Checkout ${{ matrix.version }}
38
+ uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6
39
+ with:
40
+ ref: ${{ matrix.version }}
41
+ - name: Get formatted ref name
42
+ id: formatted-ref-name
43
+ run: echo "formatted_ref_name=${{ matrix.version }}" | sed 's/\//_/g' >> $GITHUB_OUTPUT
44
+ - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4
45
+ with:
46
+ run_install: true
47
+ - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6
48
+ with:
49
+ node-version: '24'
50
+ cache: 'pnpm'
51
+ - name: Setup Pages
52
+ id: pages
53
+ uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b #v5
54
+ - name: Compile TypeScript
55
+ run: pnpm compile
56
+ - name: Build docs
57
+ run: pnpm docs:gen ${{ steps.formatted-ref-name.outputs.formatted_ref_name }}
58
+ - name: Copy latest to root
59
+ if: matrix.version == 'latest'
60
+ run: cp -r docs-html/latest/* docs-html/
61
+ - name: Upload artifact
62
+ uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
63
+ with:
64
+ name: docs-${{ steps.formatted-ref-name.outputs.formatted_ref_name }}
65
+ path: ./docs-html
66
+ retention-days: 1
67
+ - name: Where to find the docs
68
+ run: echo "You can find the documentation for version ${{ matrix.version }} at https://jacobshirley.github.io/pdf-lite/${{ steps.formatted-ref-name.outputs.formatted_ref_name }}" >> $GITHUB_STEP_SUMMARY
69
+ combine:
70
+ name: Combine Docs
71
+ runs-on: ubuntu-latest
72
+ needs: build
73
+ steps:
74
+ - name: Download artifacts
75
+ uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
76
+ with:
77
+ merge-multiple: true
78
+ path: ./docs-html
79
+ - name: Upload combined artifact
80
+ uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4
81
+ with:
82
+ path: ./docs-html
83
+ retention-days: 1
84
+ name: 'github-pages'
85
+
86
+ deploy:
87
+ name: Deploy
88
+ runs-on: ubuntu-latest
89
+ needs: combine
90
+ steps:
91
+ - name: Deploy to GitHub Pages
92
+ id: deployment
93
+ uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e #v4
@@ -0,0 +1,79 @@
1
+ name: Prepare Release
2
+ on:
3
+ workflow_dispatch:
4
+ inputs:
5
+ version:
6
+ description: 'Version to prepare as (e.g. patch, minor, major)'
7
+ type: choice
8
+ options:
9
+ - patch
10
+ - minor
11
+ - major
12
+ - prepatch
13
+ - preminor
14
+ - premajor
15
+ - prerelease
16
+ required: true
17
+ preid:
18
+ description: 'Prerelease identifier (e.g. alpha, beta, rc). Only used if version is a prerelease type'
19
+ type: choice
20
+ required: false
21
+ options:
22
+ - alpha
23
+ - beta
24
+ - rc
25
+ force:
26
+ description: 'Force prepare even if no changes detected'
27
+ required: false
28
+ type: boolean
29
+ push:
30
+ branches:
31
+ - release/**
32
+ permissions:
33
+ actions: write
34
+ checks: write
35
+ contents: write
36
+ pull-requests: write
37
+ jobs:
38
+ prepare-release:
39
+ runs-on: ubuntu-latest
40
+ name: Prepare Release
41
+ steps:
42
+ - name: Checkout repository
43
+ uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6
44
+ - name: Set up pnpm
45
+ uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4
46
+ with:
47
+ run_install: true
48
+ - name: Set up Node.js
49
+ uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6
50
+ with:
51
+ node-version: '24'
52
+ cache: 'pnpm'
53
+ - name: Compile
54
+ run: pnpm compile
55
+ - name: Bump version
56
+ run: ./scripts/bump-version.sh ${{ github.event.inputs.version }} --preid='${{ github.event.inputs.preid }}'
57
+ - name: Generate docs
58
+ run: pnpm docs:gen:md
59
+ - name: Set up committer
60
+ run: |
61
+ git config --global user.name "github-actions[bot]"
62
+ git config --global user.email "github-actions[bot]@users.noreply.github.com"
63
+ - name: Prepare release
64
+ if: github.event_name == 'workflow_dispatch'
65
+ run: ./scripts/prepare-release.sh --create-pr --force=${{ github.event.inputs.force }}
66
+ env:
67
+ GH_TOKEN: ${{ github.token }}
68
+ - name: Get release version
69
+ id: get_release_version
70
+ run: echo "version=$(cat .release-version)" >> $GITHUB_OUTPUT
71
+ - name: Pack
72
+ run: pnpm pack -r
73
+ - name: Push artifacts
74
+ uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
75
+ with:
76
+ name: pdf-lite-${{ steps.get_release_version.outputs.version }}
77
+ path: ./*.tgz
78
+ - name: Test publish
79
+ run: pnpm publish -r --dry-run --publish-branch=$(git branch --show-current) --no-git-checks
@@ -0,0 +1,80 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - 'master'
7
+
8
+ # Manual trigger
9
+ workflow_dispatch:
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ publish:
15
+ runs-on: ubuntu-latest
16
+ name: Publish to npm
17
+ permissions:
18
+ contents: write
19
+ id-token: write
20
+ if: github.event_name == 'workflow_dispatch' || contains( github.event.head_commit.message, 'release' )
21
+ steps:
22
+ - name: Checkout repository
23
+ uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6
24
+ - name: Set up pnpm
25
+ uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4
26
+ with:
27
+ run_install: true
28
+ - name: Set up Node.js
29
+ uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6
30
+ with:
31
+ node-version: '24'
32
+ cache: 'pnpm'
33
+ - name: Get release version
34
+ id: get_release_version
35
+ run: echo "version=$(jq -r .version ./package.json)" >> $GITHUB_OUTPUT
36
+ - name: Compile
37
+ run: pnpm compile
38
+ - name: Publish packages
39
+ run: pnpm -r publish --tag=latest --provenance
40
+ - name: Tag version
41
+ run: |
42
+ git config --global user.name "github-actions[bot]"
43
+ git config --global user.email "github-actions[bot]@users.noreply.github.com"
44
+ git tag v${{ steps.get_release_version.outputs.version }} --force
45
+ MAJOR_VERSION=$(echo ${{ steps.get_release_version.outputs.version }} | cut -d. -f1)
46
+ git tag v${MAJOR_VERSION} --force
47
+ git tag latest --force
48
+ git push origin v${{ steps.get_release_version.outputs.version }} --force
49
+ git push origin v${MAJOR_VERSION} --force
50
+ git push origin latest --force
51
+ env:
52
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
53
+ - name: Pack
54
+ run: pnpm -r pack
55
+ - name: Push artifacts
56
+ uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
57
+ with:
58
+ name: pdf-lite-${{ steps.get_release_version.outputs.version }}
59
+ path: ./*.tgz
60
+ github-release:
61
+ runs-on: ubuntu-latest
62
+ name: Create GitHub Release
63
+ needs: publish
64
+ permissions:
65
+ contents: write
66
+ steps:
67
+ - name: Download artifacts
68
+ uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
69
+ - name: Get release version
70
+ id: get_release_version
71
+ run: VERSION_FILE=$(ls *.tgz | head -n 1) && echo "version=$(echo $VERSION_FILE | sed -E 's/^pdf-lite-(.*)\.tgz$/\1/')" >> $GITHUB_OUTPUT
72
+ - name: Create Release
73
+ id: create_release
74
+ uses: softprops/action-gh-release@6cbd405e2c4e67a21c47fa9e383d020e4e28b836 # v2
75
+ with:
76
+ draft: false
77
+ prerelease: ${{ contains(steps.get_release_version.outputs.version, '-') }}
78
+ generate_release_notes: true
79
+ tag_name: v${{ steps.get_release_version.outputs.version }}
80
+ files: './*.tgz'
@@ -0,0 +1,35 @@
1
+ name: Test
2
+ on:
3
+ push:
4
+ branches:
5
+ - master
6
+ - ci/test # For testing changes to this workflow
7
+ pull_request:
8
+ branches:
9
+ - master
10
+ merge_group:
11
+ workflow_dispatch:
12
+ workflow_call:
13
+ permissions:
14
+ contents: read
15
+ actions: read
16
+ checks: write
17
+ jobs:
18
+ Tests:
19
+ runs-on: ubuntu-latest
20
+ name: Tests
21
+ steps:
22
+ - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6
23
+ - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4
24
+ with:
25
+ run_install: true
26
+ - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6
27
+ with:
28
+ node-version: '24'
29
+ cache: 'pnpm'
30
+ - name: Install Playwright Browsers
31
+ run: pnpm exec playwright install chromium --only-shell
32
+ - name: Compile
33
+ run: pnpm compile
34
+ - name: Run tests
35
+ run: pnpm test
@@ -0,0 +1 @@
1
+ pnpm lint:commit
@@ -0,0 +1 @@
1
+ pnpm lint:staged
@@ -0,0 +1,4 @@
1
+ **/*.autogenerated.*
2
+ **/*.generated.*
3
+ **/*.gen.*
4
+ pnpm-lock.yaml
package/.prettierrc ADDED
@@ -0,0 +1,4 @@
1
+ trailingComma: 'all'
2
+ tabWidth: 4
3
+ semi: false
4
+ singleQuote: true
@@ -0,0 +1,109 @@
1
+ # Contributing to PDF-Lite
2
+
3
+ Thank you for contributing to PDF-Lite! This guide will help you understand the project structure and maintain consistency.
4
+
5
+ ## Project Structure
6
+
7
+ ```
8
+ packages/pdf-lite/
9
+ ├── src/
10
+ │ ├── core/ # PDF primitives (objects, parser, tokenizer, streams)
11
+ │ ├── pdf/ # High-level PDF document handling
12
+ │ ├── crypto/ # Encryption algorithms (RC4, AES)
13
+ │ ├── security/ # Security handlers
14
+ │ ├── signing/ # Digital signature support
15
+ │ ├── filters/ # Compression filters (Flate, LZW, etc.)
16
+ │ └── utils/ # Utility functions
17
+ ├── test/
18
+ │ ├── unit/ # Unit tests
19
+ │ └── acceptance/ # Acceptance tests
20
+ examples/ # Numbered example scripts (001-create-pdf.ts, etc.)
21
+ ```
22
+
23
+ ## Development
24
+
25
+ ### Setup
26
+
27
+ ```bash
28
+ pnpm install
29
+ ```
30
+
31
+ ### Commands
32
+
33
+ ```bash
34
+ pnpm test # Run all tests
35
+ pnpm compile # Compile TypeScript
36
+ pnpm format # Format code with Prettier
37
+ ```
38
+
39
+ ### Making Changes
40
+
41
+ 1. Create a branch: `git checkout -b feature/your-feature-name`
42
+ 2. Make your changes
43
+ 3. Ensure tests pass: `pnpm test`
44
+ 4. Format code: `pnpm format`
45
+ 5. Check for TypeScript errors: `pnpm compile`
46
+ 6. Submit a pull request
47
+
48
+ ### Commit Guidelines
49
+
50
+ This project uses [Conventional Commits](https://www.conventionalcommits.org/):
51
+
52
+ ```bash
53
+ feat: add support for XYZ PDF feature
54
+ fix: correct parsing of encrypted streams
55
+ docs: update encryption examples
56
+ test: add tests for compression algorithms
57
+ refactor: simplify stream processing logic
58
+ ```
59
+
60
+ Other valid types: `ci`, `chore`, `bump`, `perf`, `security`, `release`, `revert`, `style`
61
+
62
+ ## Code Standards
63
+
64
+ ### File Naming
65
+
66
+ Use kebab-case for all files: `pdf-dictionary.ts`, `pdf-stream.ts`
67
+
68
+ ### Documentation
69
+
70
+ Use JSDoc comments for public APIs:
71
+
72
+ ```typescript
73
+ /**
74
+ * Encrypts a PDF stream using the specified algorithm.
75
+ *
76
+ * @param stream - The stream to encrypt
77
+ * @param algorithm - The encryption algorithm to use
78
+ * @returns The encrypted stream
79
+ */
80
+ export function encryptStream(stream: PdfStream, algorithm: string): PdfStream {
81
+ // Implementation
82
+ }
83
+ ```
84
+
85
+ ### Testing
86
+
87
+ Tests are located in `packages/pdf-lite/test/`:
88
+
89
+ - `unit/` - Unit tests for individual components
90
+ - `acceptance/` - Integration tests with real PDFs
91
+
92
+ Use Vitest for testing:
93
+
94
+ ```typescript
95
+ import { describe, it, expect } from 'vitest'
96
+
97
+ describe('Component', () => {
98
+ it('should do something', () => {
99
+ expect(result).toBe(expected)
100
+ })
101
+ })
102
+ ```
103
+
104
+ ## Getting Help
105
+
106
+ - **Issues**: Open an issue for bugs or feature requests
107
+ - **Examples**: Check the `examples/` folder for reference implementations
108
+
109
+ Thank you for contributing! 🎉