From e104dd53dccaa54d5aaec3b78c604855a66b74d9 Mon Sep 17 00:00:00 2001 From: goenning Date: Fri, 1 Sep 2023 14:40:08 +0100 Subject: [PATCH] working versions of nextjs and web --- .../next-with-approuter/src/app/Counter.tsx | 2 +- .../next-with-approuter/src/app/layout.tsx | 2 +- .../src/instrumentation.ts | 2 +- .../src/components/Counter.tsx | 2 +- .../next-with-pages/src/instrumentation.ts | 2 +- examples/next-with-pages/src/pages/_app.tsx | 2 +- .../next-with-pages/src/pages/api/hello.ts | 1 - package-lock.json | 347 +----------------- package.json | 2 + packages/nextjs/package.json | 36 +- packages/nextjs/src/client.tsx | 1 + packages/nextjs/src/index.ts | 6 +- packages/nextjs/src/server.ts | 54 +-- packages/nextjs/tsconfig.json | 30 +- packages/nextjs/tsup.config.ts | 11 + packages/node/CHANGELOG.md | 0 packages/node/LICENSE | 21 ++ packages/node/README.md | 0 packages/node/package.json | 35 ++ packages/{nextjs => node}/src/global.d.ts | 0 packages/node/src/index.js | 52 +++ packages/node/src/index.ts | 50 +++ packages/node/tsconfig.json | 14 + packages/node/tsup.config.ts | 11 + packages/react/package.json | 4 +- packages/web/package.json | 5 +- 26 files changed, 267 insertions(+), 425 deletions(-) create mode 100644 packages/nextjs/src/client.tsx create mode 100644 packages/nextjs/tsup.config.ts create mode 100644 packages/node/CHANGELOG.md create mode 100644 packages/node/LICENSE create mode 100644 packages/node/README.md create mode 100644 packages/node/package.json rename packages/{nextjs => node}/src/global.d.ts (100%) create mode 100644 packages/node/src/index.js create mode 100644 packages/node/src/index.ts create mode 100644 packages/node/tsconfig.json create mode 100644 packages/node/tsup.config.ts diff --git a/examples/next-with-approuter/src/app/Counter.tsx b/examples/next-with-approuter/src/app/Counter.tsx index cdac6dd..80f6bdf 100644 --- a/examples/next-with-approuter/src/app/Counter.tsx +++ b/examples/next-with-approuter/src/app/Counter.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useAptabase } from '@aptabase/nextjs'; +import { useAptabase } from '@aptabase/nextjs/client'; import { useState } from 'react'; export function Counter() { diff --git a/examples/next-with-approuter/src/app/layout.tsx b/examples/next-with-approuter/src/app/layout.tsx index 3d5895e..051d90f 100644 --- a/examples/next-with-approuter/src/app/layout.tsx +++ b/examples/next-with-approuter/src/app/layout.tsx @@ -1,4 +1,4 @@ -import { AptabaseProvider } from '@aptabase/nextjs'; +import { AptabaseProvider } from '@aptabase/nextjs/client'; export default function RootLayout({ children }: { children: React.ReactNode }) { return ( diff --git a/examples/next-with-approuter/src/instrumentation.ts b/examples/next-with-approuter/src/instrumentation.ts index 9de5fce..5232de9 100644 --- a/examples/next-with-approuter/src/instrumentation.ts +++ b/examples/next-with-approuter/src/instrumentation.ts @@ -1,4 +1,4 @@ -import { init } from '@aptabase/nextjs'; +import { init } from '@aptabase/nextjs/server'; export function register() { init('A-DEV-0000000000'); diff --git a/examples/next-with-pages/src/components/Counter.tsx b/examples/next-with-pages/src/components/Counter.tsx index 6e11999..67ef1c7 100644 --- a/examples/next-with-pages/src/components/Counter.tsx +++ b/examples/next-with-pages/src/components/Counter.tsx @@ -1,4 +1,4 @@ -import { useAptabase } from '@aptabase/nextjs'; +import { useAptabase } from '@aptabase/nextjs/client'; import { useState } from 'react'; export function Counter() { diff --git a/examples/next-with-pages/src/instrumentation.ts b/examples/next-with-pages/src/instrumentation.ts index 9de5fce..5232de9 100644 --- a/examples/next-with-pages/src/instrumentation.ts +++ b/examples/next-with-pages/src/instrumentation.ts @@ -1,4 +1,4 @@ -import { init } from '@aptabase/nextjs'; +import { init } from '@aptabase/nextjs/server'; export function register() { init('A-DEV-0000000000'); diff --git a/examples/next-with-pages/src/pages/_app.tsx b/examples/next-with-pages/src/pages/_app.tsx index 1372cda..91f34a0 100644 --- a/examples/next-with-pages/src/pages/_app.tsx +++ b/examples/next-with-pages/src/pages/_app.tsx @@ -1,4 +1,4 @@ -import { AptabaseProvider } from '@aptabase/nextjs'; +import { AptabaseProvider } from '@aptabase/nextjs/client'; import type { AppProps } from 'next/app'; export default function App({ Component, pageProps }: AppProps) { diff --git a/examples/next-with-pages/src/pages/api/hello.ts b/examples/next-with-pages/src/pages/api/hello.ts index 1d31a5c..e459823 100644 --- a/examples/next-with-pages/src/pages/api/hello.ts +++ b/examples/next-with-pages/src/pages/api/hello.ts @@ -1,4 +1,3 @@ -// Next.js API route support: https://nextjs.org/docs/api-routes/introduction import { trackEvent } from '@aptabase/nextjs/server'; import type { NextApiRequest, NextApiResponse } from 'next'; diff --git a/package-lock.json b/package-lock.json index f07e30c..c938529 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,9 @@ "packages/*" ], "devDependencies": { + "@types/node": "20.5.7", "prettier": "3.0.3", + "tsup": "7.2.0", "turbo": "1.10.13" }, "engines": { @@ -73,6 +75,10 @@ "resolved": "packages/nextjs", "link": true }, + "node_modules/@aptabase/node": { + "resolved": "packages/node", + "link": true + }, "node_modules/@aptabase/react": { "resolved": "packages/react", "link": true @@ -465,16 +471,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", @@ -666,97 +662,6 @@ "node": ">= 8" } }, - "node_modules/@rollup/plugin-replace": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.2.tgz", - "integrity": "sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "magic-string": "^0.27.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-terser": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.3.tgz", - "integrity": "sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==", - "dev": true, - "dependencies": { - "serialize-javascript": "^6.0.1", - "smob": "^1.0.0", - "terser": "^5.17.4" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.x || ^3.x" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-typescript": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.3.tgz", - "integrity": "sha512-8o6cNgN44kQBcpsUJTbTXMTtb87oR1O0zgP3Dxm71hrNgparap3VujgofEilTYJo+ivf2ke6uy3/E5QEaiRlDA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.14.0||^3.0.0", - "tslib": "*", - "typescript": ">=3.7.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - }, - "tslib": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.4.tgz", - "integrity": "sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, "node_modules/@swc/helpers": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", @@ -765,12 +670,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true - }, "node_modules/@types/node": { "version": "20.5.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", @@ -804,18 +703,6 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -881,12 +768,6 @@ "node": ">=8" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, "node_modules/bundle-require": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.0.1.tgz", @@ -1073,12 +954,6 @@ "@esbuild/win32-x64": "0.18.20" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -1159,12 +1034,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -1239,18 +1108,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -1297,18 +1154,6 @@ "node": ">=8" } }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1412,18 +1257,6 @@ "loose-envify": "cli.js" } }, - "node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -1633,12 +1466,6 @@ "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -1770,15 +1597,6 @@ } ] }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -1814,23 +1632,6 @@ "node": ">=8.10.0" } }, - "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -1850,23 +1651,6 @@ "node": ">=0.10.0" } }, - "node_modules/rollup": { - "version": "2.78.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.0.tgz", - "integrity": "sha512-4+YfbQC9QEVvKTanHhIAFVUFSRsezvQF8vFOJwtGfb9Bb+r014S+qryr9PSmw8x6sMnPkmFBGAvIFVQxvJxjtg==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -1890,12 +1674,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -1904,15 +1682,6 @@ "loose-envify": "^1.1.0" } }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1949,21 +1718,6 @@ "node": ">=8" } }, - "node_modules/smob": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.0.tgz", - "integrity": "sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -1972,16 +1726,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -2043,42 +1787,6 @@ "node": ">=8" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/terser": { - "version": "5.19.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.3.tgz", - "integrity": "sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -2422,42 +2130,18 @@ "version": "0.1.0", "license": "MIT", "dependencies": { + "@aptabase/node": "*", "@aptabase/react": "*" }, - "devDependencies": { - "@rollup/plugin-replace": "5.0.2", - "@rollup/plugin-terser": "0.4.3", - "@rollup/plugin-typescript": "11.1.3", - "rollup": "3.28.1", - "tslib": "2.6.2", - "typescript": "5.2.2" - }, "peerDependencies": { "next": "^13.0.0", "react": "^18.0.0" } }, - "packages/nextjs/node_modules/rollup": { - "version": "3.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", - "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "packages/nextjs/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true + "packages/node": { + "name": "@aptabase/node", + "version": "0.1.0", + "license": "MIT" }, "packages/react": { "name": "@aptabase/react", @@ -2466,8 +2150,8 @@ "dependencies": { "@aptabase/web": "*" }, - "devDependencies": { - "tsup": "7.2.0" + "peerDependencies": { + "react": "^18.0.0" } }, "packages/react-native": { @@ -2508,10 +2192,7 @@ "packages/web": { "name": "@aptabase/web", "version": "0.1.3", - "license": "MIT", - "devDependencies": { - "tsup": "7.2.0" - } + "license": "MIT" } } } diff --git a/package.json b/package.json index f708d49..3df6791 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,8 @@ "format": "prettier --write \"**/*.{ts,tsx,md}\"" }, "devDependencies": { + "tsup": "7.2.0", + "@types/node": "20.5.7", "prettier": "3.0.3", "turbo": "1.10.13" }, diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 778207e..43fe7eb 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -3,15 +3,30 @@ "version": "0.1.0", "type": "module", "description": "Next.js SDK for Aptabase: Open Source, Privacy-First and Simple Analytics for Mobile, Desktop and Web Apps", - "types": "./dist/index.d.ts", + "sideEffects": false, "exports": { + "./package.json": "./package.json", ".": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" + "import": "./dist/index.js", + "require": "./dist/index.cjs", + "types": "./dist/index.d.ts" + }, + "./client": { + "import": "./dist/client.js", + "require": "./dist/client.cjs", + "types": "./dist/client.d.ts" }, "./server": { - "types": "./dist/server.d.ts", - "default": "./dist/server.js" + "import": "./dist/server.js", + "require": "./dist/server.cjs", + "types": "./dist/server.d.ts" + } + }, + "typesVersions": { + "*": { + "*": [ + "dist/*" + ] } }, "repository": { @@ -25,7 +40,7 @@ "homepage": "https://github.com/aptabase/aptabase-js", "license": "MIT", "scripts": { - "build": "tsc" + "build": "tsup" }, "files": [ "README.md", @@ -34,16 +49,9 @@ "package.json" ], "dependencies": { + "@aptabase/node": "*", "@aptabase/react": "*" }, - "devDependencies": { - "@rollup/plugin-replace": "5.0.2", - "@rollup/plugin-typescript": "11.1.3", - "rollup": "3.28.1", - "@rollup/plugin-terser": "0.4.3", - "tslib": "2.6.2", - "typescript": "5.2.2" - }, "peerDependencies": { "react": "^18.0.0", "next": "^13.0.0" diff --git a/packages/nextjs/src/client.tsx b/packages/nextjs/src/client.tsx new file mode 100644 index 0000000..faf287d --- /dev/null +++ b/packages/nextjs/src/client.tsx @@ -0,0 +1 @@ +export * from '@aptabase/react'; diff --git a/packages/nextjs/src/index.ts b/packages/nextjs/src/index.ts index 18d09f2..4da5940 100644 --- a/packages/nextjs/src/index.ts +++ b/packages/nextjs/src/index.ts @@ -1,5 +1 @@ -export * from '@aptabase/react'; - -export function init(appKey: string) { - globalThis.__APTABASE__ = { appKey }; -} +export type README = 'Use @aptabase/next/server or @aptabase/next/client instead.'; diff --git a/packages/nextjs/src/server.ts b/packages/nextjs/src/server.ts index aef9837..c88da7c 100644 --- a/packages/nextjs/src/server.ts +++ b/packages/nextjs/src/server.ts @@ -1,62 +1,34 @@ +import { trackEvent as nodeTrackEvent } from '@aptabase/node'; import { type NextIncomingMessage } from 'next/dist/server/request-meta'; import { headers } from 'next/headers'; +export { init } from '@aptabase/node'; + export async function trackEvent( eventName: string, props?: Record, req?: NextIncomingMessage, ): Promise { - const appKey = globalThis.__APTABASE__.appKey; - if (!appKey) return Promise.resolve(); + const headers = getHeaders(req); + if (!headers) return Promise.resolve(); - const userAgent = getUserAgent(req); - if (!userAgent) return Promise.resolve(); - - const body = JSON.stringify({ - timestamp: new Date().toISOString(), - sessionId: 'CHANGE-THIS', - eventName: eventName, - systemProps: { - isDebug: true, - locale: 'en', - appVersion: '', - sdkVersion: 'aptabase-nextjs@0.0.1', - }, - props: props, - }); - - try { - const response = await fetch('http://localhost:3000/api/v0/event', { - method: 'POST', - headers: { - 'User-Agent': userAgent, - 'Content-Type': 'application/json', - 'App-Key': appKey, - }, - credentials: 'omit', - body, - }); - - if (response.status >= 300) { - const responseBody = await response.text(); - console.warn(`Failed to send event "${eventName}": ${response.status} ${responseBody}`); - } - } catch (e) { - console.warn(`Failed to send event "${eventName}": ${e}`); - } + return nodeTrackEvent({ headers }, eventName, props); } -function getUserAgent(req?: NextIncomingMessage): string | undefined { +function getHeaders(req?: NextIncomingMessage): Headers | undefined { if (req) { - return req.headers['user-agent'] ?? 'Unknown'; + // we only need the user-agent header + return new Headers({ + 'user-agent': req.headers['user-agent'] ?? '', + }); } // headers() might throw an error if called outside of a request context. try { - return headers().get('User-Agent') ?? 'Unknown'; + return headers(); } catch {} - // If we're here, we're probably using the Pages Router and the user forgot to pass the req parameter. + // If we're here, the app is probably using the Pages Router and the developer forgot to pass the req parameter. if (!req) { console.warn("Aptabase: The 'req' parameter of trackEvent is required when using Pages Router."); } diff --git a/packages/nextjs/tsconfig.json b/packages/nextjs/tsconfig.json index 00f5a87..52dec5c 100644 --- a/packages/nextjs/tsconfig.json +++ b/packages/nextjs/tsconfig.json @@ -1,22 +1,14 @@ { "compilerOptions": { - "declaration": true, - "esModuleInterop": true, - "lib": ["esnext", "dom"], - "module": "esnext", - "jsx": "react-jsx", - "moduleResolution": "node", - "noEmitOnError": true, - "noFallthroughCasesInSwitch": true, - "noImplicitReturns": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "outDir": "dist", - "sourceMap": true, + "target": "es6", "strict": true, - "target": "es2020", - "types": ["node"], - }, - "include": ["src/*", "src/global.d.ts"], - "exclude": ["node_modules"] -} \ No newline at end of file + "moduleResolution": "node", + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "types": ["@types"] + }, + "declaration": true, + "declarationDir": "./dist" + } +} diff --git a/packages/nextjs/tsup.config.ts b/packages/nextjs/tsup.config.ts new file mode 100644 index 0000000..6c9e25e --- /dev/null +++ b/packages/nextjs/tsup.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + entry: ['src/index.ts', 'src/server.ts', 'src/client.tsx'], + format: ['cjs', 'esm'], + dts: true, + splitting: false, + minify: true, + sourcemap: true, + clean: true, +}); diff --git a/packages/node/CHANGELOG.md b/packages/node/CHANGELOG.md new file mode 100644 index 0000000..e69de29 diff --git a/packages/node/LICENSE b/packages/node/LICENSE new file mode 100644 index 0000000..a5e3447 --- /dev/null +++ b/packages/node/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Sumbit Labs Ltd. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/node/README.md b/packages/node/README.md new file mode 100644 index 0000000..e69de29 diff --git a/packages/node/package.json b/packages/node/package.json new file mode 100644 index 0000000..518dcf6 --- /dev/null +++ b/packages/node/package.json @@ -0,0 +1,35 @@ +{ + "name": "@aptabase/node", + "version": "0.1.0", + "type": "module", + "description": "Node.js SDK for Aptabase: Open Source, Privacy-First and Simple Analytics for Mobile, Desktop and Web Apps", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.cjs", + "import": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "repository": { + "type": "git", + "url": "git+https://github.com/aptabase/aptabase-js.git", + "directory": "packages/node" + }, + "bugs": { + "url": "https://github.com/aptabase/aptabase-js/issues" + }, + "homepage": "https://github.com/aptabase/aptabase-js", + "license": "MIT", + "scripts": { + "build": "tsup" + }, + "files": [ + "README.md", + "LICENSE", + "dist", + "package.json" + ] +} diff --git a/packages/nextjs/src/global.d.ts b/packages/node/src/global.d.ts similarity index 100% rename from packages/nextjs/src/global.d.ts rename to packages/node/src/global.d.ts diff --git a/packages/node/src/index.js b/packages/node/src/index.js new file mode 100644 index 0000000..2908e07 --- /dev/null +++ b/packages/node/src/index.js @@ -0,0 +1,52 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +export function init(appKey) { + globalThis.__APTABASE__ = { appKey }; +} +export function trackEvent(req, eventName, props) { + var _a; + return __awaiter(this, void 0, void 0, function* () { + const appKey = globalThis.__APTABASE__.appKey; + if (!appKey) + return Promise.resolve(); + const userAgent = (_a = req.headers['user-agent']) !== null && _a !== void 0 ? _a : ''; + const body = JSON.stringify({ + timestamp: new Date().toISOString(), + sessionId: 'CHANGE-THIS', + eventName: eventName, + systemProps: { + isDebug: true, + locale: 'en', + appVersion: '', + sdkVersion: 'aptabase-node@0.1.0', + }, + props: props, + }); + try { + const response = yield fetch('http://localhost:3000/api/v0/event', { + method: 'POST', + headers: { + 'User-Agent': userAgent, + 'Content-Type': 'application/json', + 'App-Key': appKey, + }, + credentials: 'omit', + body, + }); + if (response.status >= 300) { + const responseBody = yield response.text(); + console.warn(`Failed to send event "${eventName}": ${response.status} ${responseBody}`); + } + } + catch (e) { + console.warn(`Failed to send event "${eventName}": ${e}`); + } + }); +} diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts new file mode 100644 index 0000000..1717a91 --- /dev/null +++ b/packages/node/src/index.ts @@ -0,0 +1,50 @@ +export function init(appKey: string) { + globalThis.__APTABASE__ = { appKey }; +} + +// We only need the headers from the request object +type PartialRequest = Pick; + +export async function trackEvent( + req: PartialRequest, + eventName: string, + props?: Record, +): Promise { + const appKey = globalThis.__APTABASE__?.appKey; + if (!appKey) return Promise.resolve(); + + const userAgent = req.headers.get('user-agent') ?? ''; + + const body = JSON.stringify({ + timestamp: new Date().toISOString(), + sessionId: 'CHANGE-THIS', + eventName: eventName, + systemProps: { + isDebug: true, + locale: 'en', + appVersion: '', + sdkVersion: 'aptabase-node@0.1.0', + }, + props: props, + }); + + try { + const response = await fetch('http://localhost:3000/api/v0/event', { + method: 'POST', + headers: { + 'User-Agent': userAgent, + 'Content-Type': 'application/json', + 'App-Key': appKey, + }, + credentials: 'omit', + body, + }); + + if (response.status >= 300) { + const responseBody = await response.text(); + console.warn(`Failed to send event "${eventName}": ${response.status} ${responseBody}`); + } + } catch (e) { + console.warn(`Failed to send event "${eventName}": ${e}`); + } +} diff --git a/packages/node/tsconfig.json b/packages/node/tsconfig.json new file mode 100644 index 0000000..52dec5c --- /dev/null +++ b/packages/node/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "es6", + "strict": true, + "moduleResolution": "node", + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "types": ["@types"] + }, + "declaration": true, + "declarationDir": "./dist" + } +} diff --git a/packages/node/tsup.config.ts b/packages/node/tsup.config.ts new file mode 100644 index 0000000..1a6f630 --- /dev/null +++ b/packages/node/tsup.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + entry: ['src/index.ts'], + format: ['cjs', 'esm'], + dts: true, + splitting: false, + minify: true, + sourcemap: true, + clean: true, +}); diff --git a/packages/react/package.json b/packages/react/package.json index 0a37283..b7de67d 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -35,7 +35,7 @@ "dependencies": { "@aptabase/web": "*" }, - "devDependencies": { - "tsup": "7.2.0" + "peerDependencies": { + "react": "^18.0.0" } } diff --git a/packages/web/package.json b/packages/web/package.json index cef6a0b..9589e4e 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -31,8 +31,5 @@ "LICENSE", "dist", "package.json" - ], - "devDependencies": { - "tsup": "7.2.0" - } + ] }