bits-to-dead-trees 0.0.10 → 1.0.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.
package/.eslintrc.json CHANGED
@@ -3,16 +3,10 @@
3
3
  "es2021": true,
4
4
  "node": true
5
5
  },
6
- "extends": [
7
- "eslint:recommended",
8
- "plugin:@typescript-eslint/recommended",
9
- "prettier"
10
- ],
11
- "parser": "@typescript-eslint/parser",
6
+ "extends": ["eslint:recommended", "prettier"],
12
7
  "parserOptions": {
13
8
  "ecmaVersion": "latest",
14
9
  "sourceType": "module"
15
10
  },
16
- "plugins": ["@typescript-eslint"],
17
11
  "rules": {}
18
12
  }
@@ -0,0 +1,11 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "github-actions"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+
8
+ - package-ecosystem: "docker"
9
+ directory: "/"
10
+ schedule:
11
+ interval: "weekly"
@@ -16,14 +16,14 @@ jobs:
16
16
  ref: ${{ github.ref_name }}
17
17
 
18
18
  - name: Login to GitHub Container Registry
19
- uses: docker/login-action@v1
19
+ uses: docker/login-action@v2
20
20
  with:
21
21
  registry: ghcr.io
22
22
  username: ${{ github.repository_owner }}
23
23
  password: ${{ secrets.GITHUB_TOKEN }}
24
24
 
25
25
  - name: Build and push builder image
26
- uses: docker/build-push-action@v2
26
+ uses: docker/build-push-action@v3
27
27
  with:
28
28
  file: Dockerfile
29
29
  push: true
@@ -27,3 +27,6 @@ jobs:
27
27
 
28
28
  - name: Run prettier
29
29
  run: npm run check-format
30
+
31
+ - name: Run typecheck
32
+ run: npm run ts-check
package/.tool-versions CHANGED
@@ -1 +1 @@
1
- nodejs 16.14.2
1
+ nodejs 16.15.1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # bits-to-dead-trees
2
2
 
3
+ ## 1.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - cd71c2f: Update playwright to 1.23.2 (new browser versions)
8
+
9
+ ## 1.0.0
10
+
11
+ ### Major Changes
12
+
13
+ - eccf614: Remove TypeScript, use vanilla JS with JSDoc types.
14
+
15
+ This actually improves DX by not having that extra build step, while still having
16
+ good support in your IDE, since we still have the types as JSDoc.
17
+
18
+ This is the v1.0. This has been very stable and it's unlikely that the API will change
19
+ a lot. Nothing should break for users with this release.
20
+
21
+ ### Patch Changes
22
+
23
+ - 7ef95e5: Update playwright to 1.21.1
24
+ - d651f7a: Update playwright to 1.21.0
25
+
26
+ ## 0.0.11
27
+
28
+ ### Patch Changes
29
+
30
+ - a3c12a4: Wait for network idle event before creating pdf
31
+
3
32
  ## 0.0.10
4
33
 
5
34
  ### Patch Changes
package/Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- FROM mcr.microsoft.com/playwright:v1.20.2-focal
1
+ FROM mcr.microsoft.com/playwright:v1.23.2-focal
2
2
 
3
3
  ENV NODE_ENV=production
4
4
  ENV SERVER_PORT=8000
@@ -11,15 +11,11 @@ RUN apt-get update -yqq && \
11
11
  apt-get clean && \
12
12
  rm -rf /var/lib/apt/lists/*
13
13
 
14
- COPY ["package.json", "package-lock.json*", "tsconfig.json", "./"]
14
+ COPY ["package.json", "package-lock.json*", "./"]
15
15
 
16
- RUN npm install --production=false --ignore-scripts
16
+ RUN npm install --production --ignore-scripts
17
17
 
18
- COPY src src
19
-
20
- RUN npm run build && \
21
- rm -Rf src && \
22
- npm install --production --ignore-scripts
18
+ COPY ["index.js", "schemas", "./"]
23
19
 
24
20
  ENTRYPOINT ["tini", "-v", "--"]
25
- CMD ["node", "dist/index.js"]
21
+ CMD ["node", "index.js"]
package/README.md CHANGED
@@ -5,6 +5,8 @@
5
5
  Exposes a web server with a single endpoint to take in a URL and create a PDF out
6
6
  of that. It's using [Playwright](https://playwright.dev) in the background for this.
7
7
 
8
+ [![Depfu](https://badges.depfu.com/badges/74bd86ac2a33c6c6f6817cafc6419e84/overview.svg)](https://depfu.com/github/rmehner/bits-to-dead-trees?project_id=35056)
9
+
8
10
  ## Setup
9
11
 
10
12
  ### Requirements
@@ -17,8 +19,7 @@ of that. It's using [Playwright](https://playwright.dev) in the background for t
17
19
  1. `git checkout https://github.com/rmehner/bits-to-dead-trees`
18
20
  2. `cd bits-to-dead-trees`
19
21
  3. `npm install`
20
- 4. `npm run build` to build the app
21
- 5. `npm start` to start the server. It'll listen to port 8000 on localhost by default.
22
+ 4. `npm start` to start the server. It'll listen to port 8000 on localhost by default.
22
23
 
23
24
  ### Development
24
25
 
@@ -40,3 +41,17 @@ The server exposes the `/pdf` endpoint that listens to a POST request and expect
40
41
  `options` are the options Playwright knows about PDF: https://playwright.dev/docs/api/class-page#page-pdf. We pass them to Playwright directly, so please refer to their docs.
41
42
 
42
43
  The response is the PDF file.
44
+
45
+ ## Docker
46
+
47
+ Versions are automatically build as Docker images and are available on [GitHub's package registry](https://github.com/rmehner/bits-to-dead-trees/pkgs/container/bits-to-dead-trees)
48
+
49
+ If you want to use it internally with docker-compose, this should give you a good idea to start:
50
+
51
+ ```yml
52
+ services:
53
+ pdf:
54
+ image: ghcr.io/rmehner/bits-to-dead-trees:v1.0.0
55
+ ports:
56
+ - 8000:8000
57
+ ```
@@ -1,7 +1,18 @@
1
- import fastify from "fastify";
2
- import playwright from "playwright-core";
3
- import PdfRequestBodySchema from "./schemas/pdf_request_body.json";
4
- import { PdfOptions, PdfRequestBody } from "./types/schemas";
1
+ // @ts-check
2
+
3
+ /**
4
+ * @typedef {Parameters<import("playwright-core").Page["pdf"]>[0]} PdfOptions
5
+ */
6
+
7
+ /**
8
+ * @typedef {Object} PdfRequestBody
9
+ * @property {string} url
10
+ * @property {PdfOptions} options
11
+ */
12
+
13
+ const { fastify } = require("fastify");
14
+ const playwright = require("playwright-core");
15
+ const PdfRequestBodySchema = require("./schemas/pdf_request_body.json");
5
16
 
6
17
  const SERVER_PORT = process.env["SERVER_PORT"] ?? 8000;
7
18
  const SERVER_ADDRESS = process.env["SERVER_ADDRESS"] ?? "localhost";
@@ -18,11 +29,18 @@ const server = fastify({
18
29
  },
19
30
  });
20
31
 
21
- const createPDF = async (url: string, options?: PdfOptions) => {
32
+ /**
33
+ *
34
+ * @param {string} url
35
+ * @param {PdfOptions} options
36
+ * @returns Buffer
37
+ */
38
+ const createPDF = async (url, options = {}) => {
22
39
  const browser = await playwright.chromium.launch();
23
40
  const context = await browser.newContext({ ignoreHTTPSErrors: true });
24
41
  const page = await context.newPage();
25
- await page.goto(url);
42
+ await page.goto(url, { timeout: 60000 });
43
+ await page.waitForLoadState("networkidle");
26
44
 
27
45
  const pdf = await page.pdf(options);
28
46
  await browser.close();
@@ -30,9 +48,14 @@ const createPDF = async (url: string, options?: PdfOptions) => {
30
48
  return pdf;
31
49
  };
32
50
 
33
- server.post<{ Body: PdfRequestBody }>(
51
+ server.post(
34
52
  "/pdf",
35
53
  { schema: { body: PdfRequestBodySchema }, attachValidation: true },
54
+ /**
55
+ *
56
+ * @param {import('fastify').FastifyRequest<{Body: PdfRequestBody}>} request
57
+ * @param {import('fastify').FastifyReply} response
58
+ */
36
59
  async (request, response) => {
37
60
  if (request.validationError) {
38
61
  response.code(400);
@@ -59,7 +82,7 @@ server.get("/health", async (_, response) => response.code(200).send());
59
82
 
60
83
  const startServer = async () => {
61
84
  try {
62
- await server.listen(+SERVER_PORT, SERVER_ADDRESS);
85
+ await server.listen({ port: +SERVER_PORT, host: SERVER_ADDRESS });
63
86
  } catch (error) {
64
87
  console.error(error);
65
88
  process.exit(1);
package/nodemon.json CHANGED
@@ -1,5 +1,4 @@
1
1
  {
2
- "delay": 2000,
3
- "watch": ["src/", "package-lock.json", "package.json"],
4
- "ext": "ts,json"
2
+ "watch": ["index.js", "schemas/pdf_request_body.json", "package-lock.json"],
3
+ "ext": "js,json"
5
4
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bits-to-dead-trees",
3
3
  "author": "Robin Mehner <robin@coding-robin.de>",
4
- "version": "0.0.10",
4
+ "version": "1.0.1",
5
5
  "description": "Turn HTML into PDF files",
6
6
  "repository": "github:rmehner/bits-to-dead-trees",
7
7
  "license": "Apache-2.0",
@@ -13,38 +13,32 @@
13
13
  "engines": {
14
14
  "node": ">= 16"
15
15
  },
16
- "main": "dist/index.js",
16
+ "main": "index.js",
17
17
  "scripts": {
18
- "check-format": "prettier --check 'src/**/*.ts'",
19
- "clean": "rimraf dist",
20
- "lint": "eslint src/*.ts",
21
- "format": "prettier --write src/**/*.{ts,json}",
22
- "build": "npm run clean && tsc",
23
- "start": "node dist/index.js",
24
- "start:dev": "concurrently --kill-others \"npm run build -- --watch\" \"nodemon --inspect dist/index.js\" ",
25
- "dump-schemas": "typescript-json-schema src/types/schemas.ts PdfRequestBody --out src/schemas/pdf_request_body.json",
18
+ "check-format": "prettier --check **/*.{js,ts,json,md}",
19
+ "lint": "eslint *.js",
20
+ "format": "prettier --write **/*.{js,ts,json,md}",
21
+ "start": "node index.js",
22
+ "start:dev": "nodemon --inspect index.js",
23
+ "dump-schemas": "typescript-json-schema types/schemas.ts PdfRequestBody --out schemas/pdf_request_body.json",
26
24
  "update-schemas": "npm run dump-schemas && npm run format",
27
25
  "postinstall": "npx playwright install chromium",
28
26
  "add-changeset": "changeset",
29
- "release": "changeset publish"
27
+ "release": "changeset publish",
28
+ "ts-check": "npx tsc --noEmit"
30
29
  },
31
30
  "dependencies": {
32
- "fastify": "^3.28.0",
33
- "playwright-core": "^1.20.2"
31
+ "fastify": "^4.2.0",
32
+ "playwright-core": "^1.23.2"
34
33
  },
35
34
  "devDependencies": {
36
- "@changesets/cli": "^2.22.0",
37
- "@types/node": "^16",
38
- "@typescript-eslint/eslint-plugin": "^5.18.0",
39
- "@typescript-eslint/parser": "^5.18.0",
40
- "concurrently": "^7.1.0",
41
- "eslint": "^8.13.0",
35
+ "@changesets/cli": "^2.23.1",
36
+ "eslint": "^8.19.0",
42
37
  "eslint-config-prettier": "^8.5.0",
43
- "nodemon": "^2.0.15",
44
- "pino-pretty": "^7.6.1",
45
- "prettier": "^2.6.2",
46
- "rimraf": "^3.0.2",
47
- "typescript": "^4.6.3",
48
- "typescript-json-schema": "^0.53.0"
38
+ "nodemon": "^2.0.19",
39
+ "pino-pretty": "^8.1.0",
40
+ "prettier": "^2.7.1",
41
+ "tslib": "^2.4.0",
42
+ "typescript-json-schema": "^0.54.0"
49
43
  }
50
44
  }
File without changes
package/tsconfig.json CHANGED
@@ -1,16 +1,13 @@
1
1
  {
2
2
  "compilerOptions": {
3
- /* Visit https://aka.ms/tsconfig.json to read more about this file */
4
- "target": "ES2021",
5
- "lib": ["ES2021", "DOM"],
6
- "module": "CommonJS",
7
- "rootDir": "./src",
3
+ "lib": ["es2021"],
4
+
5
+ "strict": true,
8
6
  "moduleResolution": "node",
9
- "resolveJsonModule": true,
10
- "outDir": "./dist",
11
- "esModuleInterop": true,
7
+ "skipLibCheck": true,
12
8
  "forceConsistentCasingInFileNames": true,
13
- "strict": true
14
- },
15
- "files": ["./src/index.ts"]
9
+ "resolveJsonModule": true,
10
+
11
+ "checkJs": true
12
+ }
16
13
  }
File without changes