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.
- package/.commitlintrc.cjs +25 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
- package/.github/workflows/docs.yaml +93 -0
- package/.github/workflows/prepare-release.yaml +79 -0
- package/.github/workflows/release.yaml +80 -0
- package/.github/workflows/test.yaml +35 -0
- package/.husky/commit-msg +1 -0
- package/.husky/pre-commit +1 -0
- package/.prettierignore +4 -0
- package/.prettierrc +4 -0
- package/CONTRIBUTING.md +109 -0
- package/EXAMPLES.md +1515 -0
- package/LICENSE +21 -0
- package/README.md +285 -0
- package/examples/001-create-pdf.ts +112 -0
- package/examples/002-create-encrypted-pdf.ts +121 -0
- package/examples/003-sign-pdf.ts +347 -0
- package/examples/004-incremental-update.ts +206 -0
- package/examples/005-modify-acroform.ts +374 -0
- package/examples/006-tokeniser-example.ts +131 -0
- package/examples/007-decoder-example.ts +197 -0
- package/package.json +72 -0
- package/packages/pdf-lite/README.md +3 -0
- package/packages/pdf-lite/package.json +68 -0
- package/packages/pdf-lite/scripts/create-encryption-tests.sh +41 -0
- package/packages/pdf-lite/scripts/gen-signing-keys.sh +290 -0
- package/packages/pdf-lite/scripts/generate-all-signing-keys.sh +70 -0
- package/packages/pdf-lite/src/core/decoder.ts +454 -0
- package/packages/pdf-lite/src/core/generators.ts +128 -0
- package/packages/pdf-lite/src/core/incremental-parser.ts +221 -0
- package/packages/pdf-lite/src/core/index.ts +2 -0
- package/packages/pdf-lite/src/core/objects/pdf-array.ts +54 -0
- package/packages/pdf-lite/src/core/objects/pdf-boolean.ts +19 -0
- package/packages/pdf-lite/src/core/objects/pdf-comment.ts +50 -0
- package/packages/pdf-lite/src/core/objects/pdf-date.ts +74 -0
- package/packages/pdf-lite/src/core/objects/pdf-dictionary.ts +171 -0
- package/packages/pdf-lite/src/core/objects/pdf-hexadecimal.ts +54 -0
- package/packages/pdf-lite/src/core/objects/pdf-indirect-object.ts +137 -0
- package/packages/pdf-lite/src/core/objects/pdf-name.ts +19 -0
- package/packages/pdf-lite/src/core/objects/pdf-null.ts +15 -0
- package/packages/pdf-lite/src/core/objects/pdf-number.ts +98 -0
- package/packages/pdf-lite/src/core/objects/pdf-object-reference.ts +30 -0
- package/packages/pdf-lite/src/core/objects/pdf-object.ts +107 -0
- package/packages/pdf-lite/src/core/objects/pdf-start-xref.ts +39 -0
- package/packages/pdf-lite/src/core/objects/pdf-stream.ts +687 -0
- package/packages/pdf-lite/src/core/objects/pdf-string.ts +38 -0
- package/packages/pdf-lite/src/core/objects/pdf-trailer.ts +57 -0
- package/packages/pdf-lite/src/core/objects/pdf-xref-table.ts +264 -0
- package/packages/pdf-lite/src/core/parser.ts +22 -0
- package/packages/pdf-lite/src/core/ref.ts +102 -0
- package/packages/pdf-lite/src/core/serializer.ts +68 -0
- package/packages/pdf-lite/src/core/streams/object-stream.ts +20 -0
- package/packages/pdf-lite/src/core/tokeniser.ts +687 -0
- package/packages/pdf-lite/src/core/tokens/boolean-token.ts +20 -0
- package/packages/pdf-lite/src/core/tokens/byte-offset-token.ts +20 -0
- package/packages/pdf-lite/src/core/tokens/comment-token.ts +32 -0
- package/packages/pdf-lite/src/core/tokens/end-array-token.ts +10 -0
- package/packages/pdf-lite/src/core/tokens/end-dictionary-token.ts +10 -0
- package/packages/pdf-lite/src/core/tokens/end-object-token.ts +10 -0
- package/packages/pdf-lite/src/core/tokens/end-stream-token.ts +11 -0
- package/packages/pdf-lite/src/core/tokens/hexadecimal-token.ts +22 -0
- package/packages/pdf-lite/src/core/tokens/name-token.ts +19 -0
- package/packages/pdf-lite/src/core/tokens/null-token.ts +9 -0
- package/packages/pdf-lite/src/core/tokens/number-token.ts +164 -0
- package/packages/pdf-lite/src/core/tokens/object-reference-token.ts +24 -0
- package/packages/pdf-lite/src/core/tokens/start-array-token.ts +10 -0
- package/packages/pdf-lite/src/core/tokens/start-dictionary-token.ts +10 -0
- package/packages/pdf-lite/src/core/tokens/start-object-token.ts +28 -0
- package/packages/pdf-lite/src/core/tokens/start-stream-token.ts +52 -0
- package/packages/pdf-lite/src/core/tokens/start-xref-token.ts +10 -0
- package/packages/pdf-lite/src/core/tokens/stream-chunk-token.ts +8 -0
- package/packages/pdf-lite/src/core/tokens/string-token.ts +17 -0
- package/packages/pdf-lite/src/core/tokens/token.ts +43 -0
- package/packages/pdf-lite/src/core/tokens/trailer-token.ts +12 -0
- package/packages/pdf-lite/src/core/tokens/whitespace-token.ts +43 -0
- package/packages/pdf-lite/src/core/tokens/xref-table-entry-token.ts +65 -0
- package/packages/pdf-lite/src/core/tokens/xref-table-section-start-token.ts +31 -0
- package/packages/pdf-lite/src/core/tokens/xref-table-start-token.ts +13 -0
- package/packages/pdf-lite/src/crypto/ciphers/aes128.ts +63 -0
- package/packages/pdf-lite/src/crypto/ciphers/aes256.ts +50 -0
- package/packages/pdf-lite/src/crypto/ciphers/rc4.ts +82 -0
- package/packages/pdf-lite/src/crypto/constants.ts +10 -0
- package/packages/pdf-lite/src/crypto/key-derivation/key-derivation-aes256.ts +213 -0
- package/packages/pdf-lite/src/crypto/key-derivation/key-derivation.ts +122 -0
- package/packages/pdf-lite/src/crypto/key-gen/key-gen-aes256.ts +79 -0
- package/packages/pdf-lite/src/crypto/key-gen/key-gen-rc4-128.ts +190 -0
- package/packages/pdf-lite/src/crypto/key-gen/key-gen-rc4-40.ts +129 -0
- package/packages/pdf-lite/src/crypto/types.ts +6 -0
- package/packages/pdf-lite/src/crypto/utils.ts +81 -0
- package/packages/pdf-lite/src/filters/ascii85.ts +128 -0
- package/packages/pdf-lite/src/filters/asciihex.ts +55 -0
- package/packages/pdf-lite/src/filters/flate.ts +39 -0
- package/packages/pdf-lite/src/filters/lzw.ts +144 -0
- package/packages/pdf-lite/src/filters/pass-through.ts +37 -0
- package/packages/pdf-lite/src/filters/runlength.ts +92 -0
- package/packages/pdf-lite/src/filters/types.ts +21 -0
- package/packages/pdf-lite/src/index.ts +4 -0
- package/packages/pdf-lite/src/pdf/errors.ts +5 -0
- package/packages/pdf-lite/src/pdf/index.ts +4 -0
- package/packages/pdf-lite/src/pdf/pdf-document.ts +924 -0
- package/packages/pdf-lite/src/pdf/pdf-reader.ts +57 -0
- package/packages/pdf-lite/src/pdf/pdf-revision.ts +234 -0
- package/packages/pdf-lite/src/pdf/pdf-xref-lookup.ts +527 -0
- package/packages/pdf-lite/src/security/crypt-filters/aesv2.ts +58 -0
- package/packages/pdf-lite/src/security/crypt-filters/aesv3.ts +56 -0
- package/packages/pdf-lite/src/security/crypt-filters/base.ts +140 -0
- package/packages/pdf-lite/src/security/crypt-filters/identity.ts +40 -0
- package/packages/pdf-lite/src/security/crypt-filters/v2.ts +59 -0
- package/packages/pdf-lite/src/security/handlers/base.ts +625 -0
- package/packages/pdf-lite/src/security/handlers/pubSec.ts +413 -0
- package/packages/pdf-lite/src/security/handlers/utils.ts +304 -0
- package/packages/pdf-lite/src/security/handlers/v1.ts +225 -0
- package/packages/pdf-lite/src/security/handlers/v2.ts +128 -0
- package/packages/pdf-lite/src/security/handlers/v4.ts +379 -0
- package/packages/pdf-lite/src/security/handlers/v5.ts +298 -0
- package/packages/pdf-lite/src/security/types.ts +158 -0
- package/packages/pdf-lite/src/signing/document-security-store.ts +224 -0
- package/packages/pdf-lite/src/signing/index.ts +3 -0
- package/packages/pdf-lite/src/signing/signatures/adbe-pkcs7-detached.ts +154 -0
- package/packages/pdf-lite/src/signing/signatures/adbe-pkcs7-sha1.ts +161 -0
- package/packages/pdf-lite/src/signing/signatures/adbe-x509-rsa-sha1.ts +106 -0
- package/packages/pdf-lite/src/signing/signatures/base.ts +229 -0
- package/packages/pdf-lite/src/signing/signatures/etsi-cades-detached.ts +229 -0
- package/packages/pdf-lite/src/signing/signatures/etsi-rfc3161.ts +92 -0
- package/packages/pdf-lite/src/signing/signatures/index.ts +6 -0
- package/packages/pdf-lite/src/signing/signer.ts +120 -0
- package/packages/pdf-lite/src/signing/types.ts +86 -0
- package/packages/pdf-lite/src/signing/utils.ts +71 -0
- package/packages/pdf-lite/src/types.ts +44 -0
- package/packages/pdf-lite/src/utils/IterableReadableStream.ts +30 -0
- package/packages/pdf-lite/src/utils/algos.ts +446 -0
- package/packages/pdf-lite/src/utils/assert.ts +42 -0
- package/packages/pdf-lite/src/utils/bytesToHex.ts +18 -0
- package/packages/pdf-lite/src/utils/bytesToHexBytes.ts +27 -0
- package/packages/pdf-lite/src/utils/bytesToString.ts +17 -0
- package/packages/pdf-lite/src/utils/concatUint8Arrays.ts +26 -0
- package/packages/pdf-lite/src/utils/escapeString.ts +49 -0
- package/packages/pdf-lite/src/utils/hexBytesToBytes.ts +22 -0
- package/packages/pdf-lite/src/utils/hexBytesToString.ts +21 -0
- package/packages/pdf-lite/src/utils/hexToBytes.ts +18 -0
- package/packages/pdf-lite/src/utils/padBytes.ts +25 -0
- package/packages/pdf-lite/src/utils/predictors.ts +332 -0
- package/packages/pdf-lite/src/utils/replaceInBuffer.ts +56 -0
- package/packages/pdf-lite/src/utils/stringToBytes.ts +22 -0
- package/packages/pdf-lite/src/utils/stringToHexBytes.ts +23 -0
- package/packages/pdf-lite/src/utils/unescapeString.ts +123 -0
- package/packages/pdf-lite/test/acceptance/__snapshots__/versions.node.test.ts.snap +60766 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.3/basic.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.4/basic-aes-128.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.4/basic-aes-256.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.4/basic-rc4-128.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.4/basic-rc4-40.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.4/basic.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.5/basic.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.6/basic.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/1.7/basic.pdf +0 -0
- package/packages/pdf-lite/test/acceptance/fixtures/2.0/basic-aes-128.pdf +43 -0
- package/packages/pdf-lite/test/acceptance/fixtures/2.0/basic-aes-256.pdf +43 -0
- package/packages/pdf-lite/test/acceptance/fixtures/2.0/basic-rc4-128.pdf +43 -0
- package/packages/pdf-lite/test/acceptance/fixtures/2.0/basic-rc4-40.pdf +44 -0
- package/packages/pdf-lite/test/acceptance/fixtures/2.0/basic.pdf +79 -0
- package/packages/pdf-lite/test/acceptance/versions.node.test.ts +41 -0
- package/packages/pdf-lite/test/unit/__snapshots__/decoder.node.test.ts.snap +86947 -0
- package/packages/pdf-lite/test/unit/__snapshots__/tokeniser.node.test.ts.snap +131829 -0
- package/packages/pdf-lite/test/unit/ciphers.test.ts +61 -0
- package/packages/pdf-lite/test/unit/decoder.node.test.ts +21 -0
- package/packages/pdf-lite/test/unit/decoder.test.ts +567 -0
- package/packages/pdf-lite/test/unit/filters.test.ts +67 -0
- package/packages/pdf-lite/test/unit/fixtures/basic.pdf +0 -0
- package/packages/pdf-lite/test/unit/fixtures/encrypted_v1/basic-aes-128.pdf +0 -0
- package/packages/pdf-lite/test/unit/fixtures/encrypted_v1/basic-aes-256.pdf +0 -0
- package/packages/pdf-lite/test/unit/fixtures/encrypted_v1/basic-rc4-128.pdf +0 -0
- package/packages/pdf-lite/test/unit/fixtures/encrypted_v1/basic-rc4-40.pdf +43 -0
- package/packages/pdf-lite/test/unit/fixtures/protectedAdobeLivecycle.pdf +0 -0
- package/packages/pdf-lite/test/unit/fixtures/rsa-2048/index.ts +187 -0
- package/packages/pdf-lite/test/unit/fixtures/template.pdf +0 -0
- package/packages/pdf-lite/test/unit/incremental-update.test.ts +0 -0
- package/packages/pdf-lite/test/unit/objects.test.ts +0 -0
- package/packages/pdf-lite/test/unit/pdf-document-signing.test.ts +0 -0
- package/packages/pdf-lite/test/unit/pdf-revision.test.ts +195 -0
- package/packages/pdf-lite/test/unit/pdf.browser.test.ts +0 -0
- package/packages/pdf-lite/test/unit/predictors.test.ts +226 -0
- package/packages/pdf-lite/test/unit/ref.test.ts +158 -0
- package/packages/pdf-lite/test/unit/security-handlers.test.ts +645 -0
- package/packages/pdf-lite/test/unit/serializer.test.ts +81 -0
- package/packages/pdf-lite/test/unit/signature-objects.test.ts +814 -0
- package/packages/pdf-lite/test/unit/string-escaping.test.ts +84 -0
- package/packages/pdf-lite/test/unit/tokeniser.node.test.ts +38 -0
- package/packages/pdf-lite/test/unit/tokeniser.test.ts +1213 -0
- package/packages/pdf-lite/test/unit/utils.test.ts +248 -0
- package/packages/pdf-lite/test/unit/xref-lookup.test.ts +72 -0
- package/packages/pdf-lite/tsconfig.json +4 -0
- package/packages/pdf-lite/tsconfig.prod.json +8 -0
- package/packages/pdf-lite/typedoc.json +14 -0
- package/packages/pdf-lite/vitest.config.ts +43 -0
- package/pnpm-workspace.yaml +2 -0
- package/renovate.json +34 -0
- package/scripts/build-examples.ts +30 -0
- package/scripts/bump-version.sh +56 -0
- package/scripts/gen-html-docs.sh +21 -0
- package/scripts/gen-md-docs.sh +15 -0
- package/scripts/prepare-release.sh +33 -0
- package/tsconfig.json +22 -0
- package/tsconfig.prod.json +12 -0
- 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
|
package/.prettierignore
ADDED
package/.prettierrc
ADDED
package/CONTRIBUTING.md
ADDED
|
@@ -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! 🎉
|