Compare commits

..

7 Commits

Author SHA1 Message Date
Balázs Orbán
b57dea40e2 chore: don't run build before tests 2022-12-23 03:09:39 +01:00
Balázs Orbán
1387445600 chore: more formatting 2022-12-23 03:03:52 +01:00
Balázs Orbán
b2d7f5529f chore: format 2022-12-23 03:02:26 +01:00
Balázs Orbán
7c101f5a73 chore: add auth packages as docs dependency 2022-12-23 02:56:02 +01:00
Balázs Orbán
92c96a267f chore: format 2022-12-23 02:50:00 +01:00
Balázs Orbán
b31bad15fe feat(sveltekit): update to use latest @auth/core 2022-12-23 02:38:36 +01:00
Balázs Orbán
d225bbe600 docs(sveltekit): autogenerate API reference 2022-12-23 02:37:43 +01:00
105 changed files with 1686 additions and 1384 deletions

View File

@@ -1,70 +0,0 @@
.eslintrc.js
.cache-loader
.DS_Store
.pnpm-debug.log
.turbo
.vscode/generated*
/_work
/actions-runner
node_modules
patches
pnpm-lock.yaml
.github/actions/issue-validator/index.mjs
*.cjs
*.js
*.d.ts
*.d.ts.map
.svelte-kit
.next
.nuxt
# --------------- Docs ---------------
.docusaurus
build
docs/docs/reference/03-core
docs/docs/reference/04-sveltekit
static
# --------------- Packages ---------------
coverage
dist
# @auth/core
packages/core/src/providers/oauth-types.ts
packages/core/src/lib/pages/styles.ts
# @auth/sveltekit
packages/frameworks-sveltekit/package
packages/frameworks-sveltekit/vite.config.{js,ts}.timestamp-*
# next-auth
packages/next-auth/src/providers/oauth-types.ts
packages/next-auth/css/index.css
# Adapters
.branches
db.sqlite
dev.db
dynamodblocal-bin
firebase-debug.log
firestore-debug.log
migrations
test.schema.gql
# --------------- Apps ---------------
# Examples should have their own Prettier config since they are templates too
apps/example-sveltekit
# Development app
apps
# --------------- Tests ---------------
# TODO: these should be linted
packages/**/*test*

View File

@@ -1,37 +1,31 @@
// @ts-check
const path = require("path")
/** @type {import("eslint").ESLint.ConfigData} */
module.exports = {
env: { browser: true, es2022: true, node: true },
extends: ["eslint:recommended", "prettier"],
root: true,
parser: "@typescript-eslint/parser",
extends: ["standard-with-typescript", "prettier"],
rules: {
camelcase: "off",
"@typescript-eslint/naming-convention": "off",
"@typescript-eslint/strict-boolean-expressions": "off",
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/restrict-template-expressions": "off",
},
overrides: [
{
files: ["*.ts", "*.tsx"],
parser: "@typescript-eslint/parser",
parserOptions: {
project: ["./packages/**/tsconfig.json", "./apps/**/tsconfig.json"],
},
settings: { react: { version: "18" } },
extends: [
"plugin:react/recommended",
"plugin:react/jsx-runtime",
"standard-with-typescript",
"prettier",
],
rules: {
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/method-signature-style": "off",
"@typescript-eslint/naming-convention": "off",
"@typescript-eslint/no-non-null-assertion": "off",
"@typescript-eslint/restrict-template-expressions": "off",
"@typescript-eslint/strict-boolean-expressions": "off",
"react/prop-types": "off",
"react/no-unescaped-entities": "off",
project: [
path.resolve(__dirname, "./packages/**/tsconfig.eslint.json"),
path.resolve(__dirname, "./packages/frameworks/**/tsconfig.json"),
path.resolve(__dirname, "./apps/**/tsconfig.json"),
],
},
},
{
files: ["*.test.ts", "*.test.js"],
extends: ["plugin:jest/recommended"],
env: { jest: true },
},
{
@@ -40,8 +34,7 @@ module.exports = {
extends: ["plugin:@docusaurus/recommended"],
},
{
// TODO: Expand to all packages
files: ["packages/{core,sveltekit}/*.ts"],
files: ["packages/core/src/**/*"],
plugins: ["jsdoc"],
extends: ["plugin:jsdoc/recommended"],
rules: {
@@ -56,20 +49,19 @@ module.exports = {
},
},
{
files: ["packages/frameworks-sveltekit"],
plugins: ["svelte3"],
overrides: [{ files: ["*.svelte"], processor: "svelte3/svelte3" }],
settings: {
"svelte3/typescript": () => require("typescript"),
files: ["packages/core/src/adapters.ts"],
rules: {
"@typescript-eslint/method-signature-style": "off",
},
parserOptions: { sourceType: "module", ecmaVersion: 2020 },
env: { browser: true, es2017: true, node: true },
},
],
parserOptions: {
sourceType: "module",
ecmaVersion: "latest",
ecmaFeatures: { jsx: true },
},
root: true,
plugins: ["jest"],
ignorePatterns: [
"**/dist/**",
"**/node_modules/**",
".eslintrc.js",
"**/.turbo/**",
"**/coverage/**",
"**/build/**",
],
}

View File

@@ -1 +1 @@
blank_issues_enabled: false
blank_issues_enabled: false

File diff suppressed because one or more lines are too long

View File

@@ -526,7 +526,7 @@ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
root
ISC License
Copyright (c) 2022-2023, Balázs Orbán
Copyright (c) 2018-2021, Iain Collins
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
@@ -540,7 +540,6 @@ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
tr46
MIT

View File

@@ -35,3 +35,4 @@ Upvoting issues to show your interest will help us prioritize and address them a
- [How to create a Minimal, Complete, and Verifiable example](https://stackoverflow.com/help/mcve)
- [Reporting a NextAuth.js bug](https://github.com/nextauthjs/next-auth/blob/main/.github/ISSUE_TEMPLATE/1_bug_framework.yml)
- [How to Contribute to Open Source (Next.js)](https://www.youtube.com/watch?v=cuoNzXFLitc)

View File

@@ -4,7 +4,6 @@ import * as github from "@actions/github"
// @ts-expect-error
import * as core from "@actions/core"
import { readFileSync } from "node:fs"
import { join } from "node:path"
const addReproductionLabel = "incomplete"
@@ -41,13 +40,7 @@ async function run() {
label: { name: newLabel },
} = payload
if (
pull_request ||
!issue?.body ||
!process.env.GITHUB_TOKEN ||
!process.env.GITHUB_ACTION_PATH
)
return
if (pull_request || !issue?.body || !process.env.GITHUB_TOKEN) return
const labels = issue.labels.map((l) => l.name)
// const isBugReport =
@@ -77,10 +70,7 @@ async function run() {
}),
client.issues.createComment({
...issueCommon,
body: readFileSync(
join(process.env.GITHUB_ACTION_PATH, "repro.md"),
"utf8"
),
body: readFileSync("repro.md", "utf8"),
}),
])
return core.info(

View File

@@ -20,6 +20,8 @@ jobs:
fetch-depth: 2
- name: Install pnpm
uses: pnpm/action-setup@v2.2.4
with:
version: 7.5.1
- name: Setup Node
uses: actions/setup-node@v3
with:
@@ -48,9 +50,10 @@ jobs:
uses: actions/checkout@v3
with:
fetch-depth: 0
token: ${{ secrets.GH_PAT_CLASSIC }}
- name: Install pnpm
uses: pnpm/action-setup@v2.2.4
with:
version: 7.5.1
- name: Setup Node
uses: actions/setup-node@v3
with:
@@ -61,10 +64,10 @@ jobs:
- name: Publish to npm and GitHub
run: pnpm release
env:
# Use GH_PAT when this is fixed:
# https://github.com/github/roadmap/issues/622
GITHUB_TOKEN: ${{ secrets.GH_PAT_CLASSIC }}
GITHUB_TOKEN: ${{ secrets.GH_PAT }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
NO_VERFIY: 1
DRY_RUN: 1
release-pr:
name: Publish PR
runs-on: ubuntu-latest
@@ -76,6 +79,8 @@ jobs:
uses: actions/checkout@v3
- name: Install pnpm
uses: pnpm/action-setup@v2.2.4
with:
version: 7.5.1
- name: Setup Node
uses: actions/setup-node@v3
with:
@@ -106,3 +111,4 @@ jobs:
env:
VERSION: ${{ steps.determine-version.outputs.version }}
GITHUB_TOKEN: ${{ secrets.GH_PAT }}

View File

@@ -14,6 +14,6 @@ jobs:
# Can update to v1 when https://github.com/BetaHuhn/repo-file-sync-action/issues/168 is resolved
uses: BetaHuhn/repo-file-sync-action@v1.16.5
with:
GH_PAT: ${{ secrets.GH_PAT_CLASSIC }}
GH_PAT: ${{ secrets.SYNC_EXAMPLE_PAT }}
SKIP_PR: true
ORIGINAL_MESSAGE: true

2
.gitignore vendored
View File

@@ -1,7 +1,7 @@
# Misc
.DS_Store
.npmrc
.eslintcache
.env
.env.local
.env.development.local

1
.husky/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
_

4
.husky/pre-commit Executable file
View File

@@ -0,0 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
# npx pretty-quick --staged

View File

@@ -1,67 +0,0 @@
.cache-loader
.DS_Store
.pnpm-debug.log
.turbo
.vscode/generated*
/_work
/actions-runner
node_modules
patches
pnpm-lock.yaml
.github/actions/issue-validator/index.mjs
*.d.ts
*.d.ts.map
.svelte-kit
.next
.nuxt
# --------------- Docs ---------------
.docusaurus
build
docs/docs/reference/03-core
docs/docs/reference/04-sveltekit
static
docs/providers.json
# --------------- Packages ---------------
coverage
dist
packages/**/*.cjs
packages/**/*.js
# @auth/core
packages/core/src/providers/oauth-types.ts
packages/core/src/lib/pages/styles.ts
# @auth/sveltekit
packages/frameworks-sveltekit/package
packages/frameworks-sveltekit/vite.config.{js,ts}.timestamp-*
# next-auth
packages/next-auth/src/providers/oauth-types.ts
packages/next-auth/css/index.css
# Adapters
.branches
db.sqlite
dev.db
dynamodblocal-bin
firebase-debug.log
firestore-debug.log
migrations
test.schema.gql
# --------------- Apps ---------------
# Examples should have their own Prettier config since they are templates too
apps/example-sveltekit
# Development app
apps/dev/prisma
apps/dev/migrations
apps/dev/typeorm

View File

@@ -12,11 +12,5 @@ module.exports = {
],
options: { printWidth: 150 },
},
{
files: ["**/*package.json"],
options: {
trailingComma: "none",
},
},
],
}

14
.vscode/settings.json vendored
View File

@@ -1,8 +1,8 @@
{
"files.exclude": {
"packages/core/{lib,providers,*.js,*.d.ts,*.d.ts.map}": true,
"packages/next-auth/{client,core,css,jwt,next,providers,react,utils,*.js,*.d.ts}": true
},
"typescript.tsdk": "node_modules/typescript/lib",
"openInGitHub.remote.branch": "main"
}
"files.exclude": {
"packages/core/{lib,providers,*.js,*.d.ts,*.d.ts.map}": true,
"packages/next-auth/{client,core,css,jwt,next,providers,react,utils,*.js,*.d.ts}": true
},
"typescript.tsdk": "node_modules/typescript/lib",
"openInGitHub.remote.branch": "main",
}

View File

@@ -3,12 +3,16 @@
"description": "Markdown link to OAuth 2 specification",
"scope": "typescript",
"prefix": "oauth2",
"body": ["[OAuth 2](https://datatracker.ietf.org/doc/html/rfc6749)"]
"body": [
"[OAuth 2](https://datatracker.ietf.org/doc/html/rfc6749)"
]
},
"oidc-spec": {
"description": "Markdown link to OpenID Connect specification",
"scope": "typescript",
"prefix": "oidc",
"body": ["[OIDC](https://openid.net/specs/openid-connect-core-1_0.html)"]
}
}
"body": [
"[OIDC](https://openid.net/specs/openid-connect-core-1_0.html)"
]
},
}

View File

@@ -12,4 +12,4 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

View File

@@ -1,4 +1,4 @@
{
"typescript.tsdk": "../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib",
"typescript.tsdk": "../../node_modules/.pnpm/typescript@4.8.4/node_modules/typescript/lib",
"typescript.enablePromptUseWorkspaceTsdk": true
}

View File

@@ -3,4 +3,4 @@
This folder contains a Next.js app using NextAuth.js for local development. See the following section on how to start:
[Setting up local environment
](https://github.com/nextauthjs/next-auth/blob/main/CONTRIBUTING.md#setting-up-local-environment)
](https://github.com/nextauthjs/next-auth/blob/main/CONTRIBUTING.md#setting-up-local-environment)

View File

@@ -11,4 +11,4 @@
.navItem {
display: inline-block;
margin-right: 1rem;
}
}

View File

@@ -11,10 +11,10 @@
top: 0;
opacity: 1;
overflow: hidden;
border-radius: 0 0 0.6rem 0.6rem;
padding: 0.6rem 1rem;
border-radius: 0 0 .6rem .6rem;
padding: .6rem 1rem;
margin: 0;
background-color: rgba(0, 0, 0, 0.05);
background-color: rgba(0,0,0,.05);
transition: all 0.2s ease-in;
}
@@ -26,13 +26,13 @@
.signedInText,
.notSignedInText {
position: absolute;
padding-top: 0.8rem;
padding-top: .8rem;
left: 1rem;
right: 6.5rem;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
display: inherit;
display: inherit;
z-index: 1;
line-height: 1.3rem;
}
@@ -55,13 +55,13 @@
.button,
.buttonPrimary {
float: right;
margin-right: -0.4rem;
margin-right: -.4rem;
font-weight: 500;
border-radius: 0.3rem;
border-radius: .3rem;
cursor: pointer;
font-size: 1rem;
line-height: 1.4rem;
padding: 0.7rem 0.8rem;
padding: .7rem .8rem;
position: relative;
z-index: 10;
background-color: transparent;
@@ -73,11 +73,11 @@
border-color: #346df1;
color: #fff;
text-decoration: none;
padding: 0.7rem 1.4rem;
padding: .7rem 1.4rem;
}
.buttonPrimary:hover {
box-shadow: inset 0 0 5rem rgba(0, 0, 0, 0.2);
box-shadow: inset 0 0 5rem rgba(0,0,0,0.2)
}
.navItems {
@@ -89,4 +89,4 @@
.navItem {
display: inline-block;
margin-right: 1rem;
}
}

View File

@@ -1,11 +1,13 @@
import Header from "components/header"
import Footer from "components/footer"
import Header from 'components/header'
import Footer from 'components/footer'
export default function Layout({ children }) {
export default function Layout ({ children }) {
return (
<>
<Header />
<main>{children}</main>
<main>
{children}
</main>
<Footer />
</>
)

View File

@@ -20,7 +20,7 @@
"@prisma/client": "^3",
"@supabase/supabase-js": "^2.0.5",
"faunadb": "^4",
"next": "13.1.1",
"next": "13.0.6",
"next-auth": "workspace:*",
"@auth/core": "workspace:*",
"nodemailer": "^6",

View File

@@ -1,19 +1,17 @@
import Layout from "../components/layout"
import Layout from '../components/layout'
export default function Page() {
export default function Page () {
return (
<Layout>
<h1>API Example</h1>
<p>The examples below show responses from the example API endpoints.</p>
<p>
<em>You must be signed in to see responses.</em>
</p>
<p><em>You must be signed in to see responses.</em></p>
<h2>Session</h2>
<p>/api/examples/session</p>
<iframe src="/api/examples/session" />
<iframe src='/api/examples/session' />
<h2>JSON Web Token</h2>
<p>/api/examples/jwt</p>
<iframe src="/api/examples/jwt" />
<iframe src='/api/examples/jwt' />
</Layout>
)
}

View File

@@ -1,26 +1,21 @@
import Layout from "../components/layout"
import Layout from '../components/layout'
export default function Page() {
export default function Page () {
return (
<Layout>
<h1>Client Side Rendering</h1>
<p>
This page uses the <strong>useSession()</strong> React Hook in the{" "}
<strong>&lt;/Header&gt;</strong> component.
This page uses the <strong>useSession()</strong> React Hook in the <strong>&lt;/Header&gt;</strong> component.
</p>
<p>
The <strong>useSession()</strong> React Hook easy to use and allows
pages to render very quickly.
The <strong>useSession()</strong> React Hook easy to use and allows pages to render very quickly.
</p>
<p>
The advantage of this approach is that session state is shared between
pages by using the <strong>Provider</strong> in <strong>_app.js</strong>{" "}
so that navigation between pages using <strong>useSession()</strong> is
very fast.
The advantage of this approach is that session state is shared between pages by using the <strong>Provider</strong> in <strong>_app.js</strong> so
that navigation between pages using <strong>useSession()</strong> is very fast.
</p>
<p>
The disadvantage of <strong>useSession()</strong> is that it requires
client side JavaScript.
The disadvantage of <strong>useSession()</strong> is that it requires client side JavaScript.
</p>
</Layout>
)

View File

@@ -1,11 +1,11 @@
import Layout from "components/layout"
import Layout from 'components/layout'
export default function Page() {
export default function Page () {
return (
<Layout>
<h1>NextAuth.js Example</h1>
<p>
This is an example site to demonstrate how to use{" "}
This is an example site to demonstrate how to use{' '}
<a href="https://authjs.dev">NextAuth.js</a> for authentication.
</p>
</Layout>

View File

@@ -1,6 +1,6 @@
import { unstable_getServerSession } from "next-auth/next"
import Layout from "../components/layout"
import { authOptions } from "./api/auth/[...nextauth]"
import { authOptions } from './api/auth/[...nextauth]';
export default function Page() {
// As this page uses Server Side Rendering, the `session` will be already

View File

@@ -27,6 +27,6 @@ iframe {
border: 1px solid #ccc;
height: 10rem;
width: 100%;
border-radius: 0.5rem;
border-radius: .5rem;
filter: invert(1);
}
}

View File

@@ -1,7 +1,11 @@
{
"compilerOptions": {
"target": "esnext",
"lib": ["dom", "dom.iterable", "esnext"],
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"strict": false,
@@ -21,6 +25,14 @@
}
]
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules", "jest.config.js"]
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts"
],
"exclude": [
"node_modules",
"jest.config.js"
]
}

View File

@@ -37,7 +37,7 @@ NextAuth.js is an easy to implement, full-stack (client/server) open source auth
Go to [next-auth.js.org](https://next-auth.js.org) for more information and documentation.
> _NextAuth.js is not officially associated with Vercel or Next.js._
> *NextAuth.js is not officially associated with Vercel or Next.js.*
## Getting Started
@@ -67,7 +67,7 @@ You **can** skip configuring a database and come back to it later if you want.
For more information about setting up a database, please check out the following links:
- Docs: [next-auth.js.org/adapters/overview](https://next-auth.js.org/adapters/overview)
* Docs: [next-auth.js.org/adapters/overview](https://next-auth.js.org/adapters/overview)
### 3. Configure Authentication Providers
@@ -75,9 +75,9 @@ For more information about setting up a database, please check out the following
2. When setting up OAuth, in the developer admin page for each of your OAuth services, you should configure the callback URL to use a callback path of `{server}/api/auth/callback/{provider}`.
e.g. For Google OAuth you would use: `http://localhost:3000/api/auth/callback/google`
e.g. For Google OAuth you would use: `http://localhost:3000/api/auth/callback/google`
A list of configured providers and their callback URLs is available from the endpoint `/api/auth/providers`. You can find more information at https://next-auth.js.org/configuration/providers/oauth
A list of configured providers and their callback URLs is available from the endpoint `/api/auth/providers`. You can find more information at https://next-auth.js.org/configuration/providers/oauth
3. You can also choose to specify an SMTP server for passwordless sign in via email.
@@ -110,3 +110,4 @@ Follow the [Deployment documentation](https://next-auth.js.org/deployment)
## License
ISC

View File

@@ -18,6 +18,7 @@ export default function ProtectedPage() {
}
fetchData()
}, [session])
// If no session exists, display access denied message
if (!session) {

View File

@@ -1,7 +1,11 @@
{
"compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
@@ -15,12 +19,6 @@
"jsx": "preserve",
"incremental": true
},
"include": [
"process.d.ts",
"next-env.d.ts",
"next-auth.d.ts",
"**/*.ts",
"**/*.tsx"
],
"include": ["process.d.ts", "next-env.d.ts", "next-auth.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"]
}
}

View File

@@ -1,4 +1,4 @@
import { SvelteKitAuth } from "@auth/sveltekit"
import SvelteKitAuth from "@auth/sveltekit"
import GitHub from "@auth/core/providers/github"
import { GITHUB_ID, GITHUB_SECRET } from "$env/static/private"

View File

@@ -34,7 +34,7 @@ Auth.js is an easy to implement, full-stack (client/server) open source authenti
Go to [authjs.dev](https://authjs.dev) for more information and documentation.
> Auth.js is not officially associated with Vercel or Next.js.\_
> Auth.js is not officially associated with Vercel or Next.js._
## Getting Started

View File

@@ -1,7 +1,7 @@
module.exports = {
root: true,
extends: ["@nuxt/eslint-config"],
extends: ['@nuxt/eslint-config'],
rules: {
"vue/multi-word-component-names": "off",
},
'vue/multi-word-component-names': 'off'
}
}

View File

@@ -28,9 +28,9 @@ Here's an example of what it looks like:
```ts
// server/api/auth/[...].ts
import { NuxtAuthHandler } from "@/lib/auth/server"
import GithubProvider from "@auth/core/providers/github"
import type { AuthOptions } from "@auth/core"
import { NuxtAuthHandler } from '@/lib/auth/server'
import GithubProvider from '@auth/core/providers/github'
import type { AuthOptions } from '@auth/core'
const runtimeConfig = useRuntimeConfig()
@@ -39,9 +39,9 @@ export const authOptions: AuthOptions = {
providers: [
GithubProvider({
clientId: runtimeConfig.github.clientId,
clientSecret: runtimeConfig.github.clientSecret,
}),
],
clientSecret: runtimeConfig.github.clientSecret
})
]
}
export default NuxtAuthHandler(authOptions)

View File

@@ -7,9 +7,7 @@
<style>
body {
font-family: -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans,
sans-serif, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif,
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
font-family: -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
padding: 0 1rem 1rem 1rem;
max-width: 680px;
margin: 0 auto;

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import { signIn, signOut } from "@/lib/auth/client"
import { signIn, signOut } from '@/lib/auth/client'
const session = useSession()
</script>
@@ -9,37 +9,30 @@ const session = useSession()
<div class="signedInStatus">
<p :class="['nojs-show', 'loaded']">
<template v-if="session">
<span
v-if="session.user?.image"
:style="{ backgroundImage: `url(${session.user.image})` }"
class="avatar"
/>
<span v-if="session.user?.image" :style="{ backgroundImage: `url(${session.user.image})` }" class="avatar" />
<span class="signedInText">
<small>Signed in as</small><br />
<small>Signed in as</small><br>
<strong>{{ session.user?.email || session.user?.name }}</strong>
</span>
<a href="/api/auth/signout" class="button" @click.prevent="signOut"
>Sign out</a
>
<a href="/api/auth/signout" class="button" @click.prevent="signOut">Sign out</a>
</template>
<template v-else>
<span class="notSignedInText">You are not signed in</span>
<a
href="/api/auth/signin"
class="buttonPrimary"
@click.prevent="signIn"
>Sign in</a
>
<a href="/api/auth/signin" class="buttonPrimary" @click.prevent="signIn">Sign in</a>
</template>
</p>
</div>
<nav>
<ul class="navItems">
<li class="navItem">
<NuxtLink to="/"> Home </NuxtLink>
<NuxtLink to="/">
Home
</NuxtLink>
</li>
<li class="navItem">
<NuxtLink to="/protected"> Protected </NuxtLink>
<NuxtLink to="/protected">
Protected
</NuxtLink>
</li>
</ul>
</nav>
@@ -64,10 +57,10 @@ const session = useSession()
top: 0;
opacity: 1;
overflow: hidden;
border-radius: 0 0 0.6rem 0.6rem;
padding: 0.6rem 1rem;
border-radius: 0 0 .6rem .6rem;
padding: .6rem 1rem;
margin: 0;
background-color: rgba(0, 0, 0, 0.05);
background-color: rgba(0,0,0,.05);
transition: all 0.2s ease-in;
}
@@ -79,7 +72,7 @@ const session = useSession()
.signedInText,
.notSignedInText {
position: absolute;
padding-top: 0.8rem;
padding-top: .8rem;
left: 1rem;
right: 6.5rem;
white-space: nowrap;
@@ -108,13 +101,13 @@ const session = useSession()
.button,
.buttonPrimary {
float: right;
margin-right: -0.4rem;
margin-right: -.4rem;
font-weight: 500;
border-radius: 0.3rem;
border-radius: .3rem;
cursor: pointer;
font-size: 1rem;
line-height: 1.4rem;
padding: 0.7rem 0.8rem;
padding: .7rem .8rem;
position: relative;
z-index: 10;
background-color: transparent;
@@ -126,11 +119,11 @@ const session = useSession()
border-color: #346df1;
color: #fff;
text-decoration: none;
padding: 0.7rem 1.4rem;
padding: .7rem 1.4rem;
}
.buttonPrimary:hover {
box-shadow: inset 0 0 5rem rgba(0, 0, 0, 0.2);
box-shadow: inset 0 0 5rem rgba(0,0,0,0.2)
}
.navItems {

View File

@@ -1,5 +1,5 @@
import { Session } from "@auth/core"
import { Session } from '@auth/core'
export default function useSession() {
return useState<Session | null>("session", () => null)
return useState<Session | null>('session', () => null)
}

View File

@@ -3,11 +3,11 @@ import type {
SignInOptions,
SignInAuthorizationParams,
SignOutParams,
} from "./types"
} from './types'
import type {
BuiltInProviderType,
RedirectableProviderType,
} from "@auth/core/providers"
} from '@auth/core/providers'
/**
* Client-side method to initiate a signin flow

View File

@@ -1,9 +1,9 @@
import { AuthHandler, AuthOptions, Session } from "@auth/core"
import { fromNodeMiddleware, H3Event } from "h3"
import getURL from "requrl"
import { createMiddleware } from "@hattip/adapter-node"
import { AuthHandler, AuthOptions, Session } from '@auth/core'
import { fromNodeMiddleware, H3Event } from 'h3'
import getURL from 'requrl'
import { createMiddleware } from "@hattip/adapter-node";
export function NuxtAuthHandler(options: AuthOptions) {
export function NuxtAuthHandler (options: AuthOptions) {
async function handler(ctx: { request: Request }) {
options.trustHost ??= true
@@ -24,7 +24,7 @@ export async function getSession(
const headers = getRequestHeaders(event)
const nodeHeaders = new Headers()
const url = new URL("/api/auth/session", getURL(event.node.req))
const url = new URL('/api/auth/session', getURL(event.node.req))
Object.keys(headers).forEach((key) => {
nodeHeaders.append(key, headers[key] as any)

View File

@@ -1,48 +1,42 @@
// Taken from next-auth/react
import type { BuiltInProviderType, ProviderType } from "@auth/core/providers"
import type { BuiltInProviderType, ProviderType } from '@auth/core/providers'
/**
* Util type that matches some strings literally, but allows any other string as well.
* @source https://github.com/microsoft/TypeScript/issues/29729#issuecomment-832522611
*/
export declare type LiteralUnion<T extends U, U = string> =
| T
| (U & Record<never, never>)
export declare type LiteralUnion<T extends U, U = string> = T | (U & Record<never, never>);
export interface ClientSafeProvider {
id: LiteralUnion<BuiltInProviderType>
name: string
type: ProviderType
signinUrl: string
callbackUrl: string
id: LiteralUnion<BuiltInProviderType>;
name: string;
type: ProviderType;
signinUrl: string;
callbackUrl: string;
}
export interface SignInOptions extends Record<string, unknown> {
/**
* Specify to which URL the user will be redirected after signing in. Defaults to the page URL the sign-in is initiated from.
*
* [Documentation](https://next-auth.js.org/getting-started/client#specifying-a-callbackurl)
*/
callbackUrl?: string
/** [Documentation](https://next-auth.js.org/getting-started/client#using-the-redirect-false-option) */
redirect?: boolean
/**
* Specify to which URL the user will be redirected after signing in. Defaults to the page URL the sign-in is initiated from.
*
* [Documentation](https://next-auth.js.org/getting-started/client#specifying-a-callbackurl)
*/
callbackUrl?: string;
/** [Documentation](https://next-auth.js.org/getting-started/client#using-the-redirect-false-option) */
redirect?: boolean;
}
export interface SignInResponse {
error: string | undefined
status: number
ok: boolean
url: string | null
error: string | undefined;
status: number;
ok: boolean;
url: string | null;
}
/** Match `inputType` of `new URLSearchParams(inputType)` */
export declare type SignInAuthorizationParams =
| string
| string[][]
| Record<string, string>
| URLSearchParams
export declare type SignInAuthorizationParams = string | string[][] | Record<string, string> | URLSearchParams;
/** [Documentation](https://next-auth.js.org/getting-started/client#using-the-redirect-false-option-1) */
export interface SignOutResponse {
url: string
url: string;
}
export interface SignOutParams<R extends boolean = true> {
/** [Documentation](https://next-auth.js.org/getting-started/client#specifying-a-callbackurl-1) */
callbackUrl?: string
/** [Documentation](https://next-auth.js.org/getting-started/client#using-the-redirect-false-option-1 */
redirect?: R
/** [Documentation](https://next-auth.js.org/getting-started/client#specifying-a-callbackurl-1) */
callbackUrl?: string;
/** [Documentation](https://next-auth.js.org/getting-started/client#using-the-redirect-false-option-1 */
redirect?: R;
}

View File

@@ -4,16 +4,14 @@ export default defineNuxtConfig({
secret: process.env.NEXTAUTH_SECRET,
github: {
clientId: process.env.GITHUB_CLIENT_ID,
clientSecret: process.env.GITHUB_CLIENT_SECRET,
},
clientSecret: process.env.GITHUB_CLIENT_SECRET
}
},
vite: {
define: {
"process.env.NEXTAUTH_URL": JSON.stringify(process.env.NEXTAUTH_URL),
"process.env.AUTH_TRUST_HOST": JSON.stringify(
process.env.AUTH_TRUST_HOST
),
"process.env.VERCEL_URL": JSON.stringify(process.env.VERCEL_URL),
},
},
'process.env.NEXTAUTH_URL': JSON.stringify(process.env.NEXTAUTH_URL),
'process.env.AUTH_TRUST_HOST': JSON.stringify(process.env.AUTH_TRUST_HOST),
'process.env.VERCEL_URL': JSON.stringify(process.env.VERCEL_URL),
}
}
})

View File

@@ -2,9 +2,7 @@
<div>
<h1>Nuxt Auth Example</h1>
<p>
This is an example site to demonstrate how to use
<a href="https://v3.nuxtjs.org/">Nuxt 3</a> with
<a href="https://authjs.dev/">Auth.js</a> for authentication.
This is an example site to demonstrate how to use <a href="https://v3.nuxtjs.org/">Nuxt 3</a> with <a href="https://authjs.dev/">Auth.js</a> for authentication.
</p>
</div>
</template>

View File

@@ -2,7 +2,7 @@
const session = useSession()
definePageMeta({
middleware: "auth",
middleware: 'auth'
})
</script>

View File

@@ -1,17 +1,17 @@
import { Session } from "@auth/core"
import { Session } from '@auth/core'
export default defineNuxtPlugin(async () => {
const session = useSession()
addRouteMiddleware("auth", () => {
if (!session.value) return navigateTo("/")
addRouteMiddleware('auth', () => {
if (!session.value) return navigateTo('/')
})
if (process.server) {
const data = await $fetch<Session>("/api/auth/session", {
headers: useRequestHeaders() as any,
const data = await $fetch<Session>('/api/auth/session', {
headers: useRequestHeaders() as any
})
const hasSession = data && Object.keys(data).length
session.value = hasSession ? data : null

View File

@@ -1,6 +1,6 @@
import { NuxtAuthHandler } from "@/lib/auth/server"
import GithubProvider from "@auth/core/providers/github"
import type { AuthOptions } from "@auth/core"
import { NuxtAuthHandler } from '@/lib/auth/server'
import GithubProvider from '@auth/core/providers/github'
import type { AuthOptions } from '@auth/core'
const runtimeConfig = useRuntimeConfig()
@@ -9,9 +9,9 @@ export const authOptions: AuthOptions = {
providers: [
GithubProvider({
clientId: runtimeConfig.github.clientId,
clientSecret: runtimeConfig.github.clientSecret,
}),
],
clientSecret: runtimeConfig.github.clientSecret
})
]
}
export default NuxtAuthHandler(authOptions)

View File

@@ -1,4 +1,4 @@
{
// https://v3.nuxtjs.org/concepts/typescript
"extends": "./.nuxt/tsconfig.json"
"extends": "./.nuxt/tsconfig.json",
}

5
docs/.prettierignore Normal file
View File

@@ -0,0 +1,5 @@
node_modules
.docusaurus
build
.turbo
static

View File

@@ -39,8 +39,6 @@ const docusaurusConfig = {
apiKey: "97c0894508f2d1d4a2fef4fe6db28448",
indexName: "next-auth",
searchParameters: {},
contextualSearch: false,
externalUrlRegex: "authjs\\.dev|next-auth\\.js\\.org",
},
navbar: {
title: "Auth.js",
@@ -225,75 +223,16 @@ const docusaurusConfig = {
}
docusaurusConfig.headTags = [
{
tagName: "meta",
attributes: {
charSet: "utf-8",
},
},
{
tagName: "link",
attributes: {
rel: "canonical",
href: docusaurusConfig.url,
},
},
{
tagName: "meta",
attributes: {
property: "og:title",
content: docusaurusConfig.title,
},
},
{
tagName: "meta",
attributes: {
property: "og:description",
content: docusaurusConfig.tagline,
},
},
{
tagName: "meta",
attributes: {
property: "og:image",
content: `${docusaurusConfig.url}/img/og-image.png`,
},
},
{
tagName: "meta",
attributes: {
property: "og:url",
content: docusaurusConfig.url,
},
},
{
tagName: "meta",
attributes: {
name: "twitter:card",
content: "summary_large_image",
},
},
{
tagName: "meta",
attributes: {
name: "twitter:title",
content: docusaurusConfig.title,
},
},
{
tagName: "meta",
attributes: {
name: "twitter:description",
content: docusaurusConfig.tagline,
},
},
{
tagName: "meta",
attributes: {
name: "twitter:image",
content: `${docusaurusConfig.url}/img/og-image.png`,
},
},
{ tagName: "meta", attributes: { charSet: "utf-8" } },
{ tagName: "link", attributes: { rel: "canonical", href: docusaurusConfig.url } },
{ tagName: "meta", attributes: { property: "og:title", content: docusaurusConfig.title } },
{ tagName: "meta", attributes: { property: "og:description", content: docusaurusConfig.tagline } },
{ tagName: "meta", attributes: { property: "og:image", content: `${docusaurusConfig.url}/img/og-image.png` } },
{ tagName: "meta", attributes: { property: "og:url", content: docusaurusConfig.url } },
{ tagName: "meta", attributes: { name: "twitter:card", content: "summary_large_image" } },
{ tagName: "meta", attributes: { name: "twitter:title", content: docusaurusConfig.title } },
{ tagName: "meta", attributes: { name: "twitter:description", content: docusaurusConfig.tagline } },
{ tagName: "meta", attributes: { name: "twitter:image", content: `${docusaurusConfig.url}/img/og-image.png` } },
]
module.exports = docusaurusConfig

View File

@@ -11,8 +11,10 @@
"deploy": "docusaurus deploy",
"serve": "docusaurus serve",
"clear": "docusaurus clear",
"providers": "node scripts/generate-providers.mjs",
"snippets": "node scripts/generate-snippets.mjs"
"lint": "eslint .",
"format": "prettier --write .",
"providers": "node ./scripts/generate-providers",
"snippets": "node ./scripts/generate-snippets"
},
"dependencies": {
"@auth/core": "workspace:*",

View File

@@ -0,0 +1,25 @@
const path = require("path")
const fs = require("fs")
// TODO: generate from core package
const providersPath = path.join(
process.cwd(),
"/docs/reference/05-oauth-providers"
)
const files = fs.readdirSync(providersPath, "utf8")
const result = files.reduce((acc, file) => {
if (file === "index.md" || file === "_category_.json") return acc
const provider = fs.readFileSync(path.join(providersPath, file), "utf8")
const { id, title } = provider.match(
/id: (?<id>.+)\ntitle: (?<title>.+)\n/
).groups
acc[id] = title
return acc
}, {})
fs.writeFileSync(
path.join(process.cwd(), "providers.json"),
JSON.stringify(result, null, 2)
)

View File

@@ -1,22 +0,0 @@
import { join } from "path"
import { readdirSync, readFileSync, writeFileSync } from "fs"
// TODO: generate from core package
const providersPath = join(process.cwd(), "/docs/reference/05-oauth-providers")
const files = readdirSync(providersPath, "utf8")
const result = files.reduce((acc, file) => {
if (file === "index.md" || file === "_category_.json") return acc
const provider = readFileSync(join(providersPath, file), "utf8")
const { id, title } = provider.match(
/id: (?<id>.+)\ntitle: (?<title>.+)\n/
).groups
acc[id] = title
return acc
}, {})
writeFileSync(
join(process.cwd(), "providers.json"),
JSON.stringify(result, null, 2)
)

View File

@@ -1,13 +1,13 @@
import { join } from "path"
import { readdirSync, readFileSync, writeFileSync } from "fs"
const path = require("path")
const fs = require("fs")
const snippetsPath = join(process.cwd(), "snippets")
const snippetsPath = path.join(process.cwd(), "snippets")
const files = readdirSync(snippetsPath, "utf8")
const files = fs.readdirSync(snippetsPath, "utf8")
const result = {}
for (const file of files) {
const snippet = readFileSync(join(snippetsPath, file), "utf-8")
const snippet = fs.readFileSync(path.join(snippetsPath, file), "utf-8")
const body = snippet
.replace(/\n/g, "\n * ")
.split("\n")
@@ -25,7 +25,7 @@ for (const file of files) {
}
}
writeFileSync(
join(process.cwd(), "../.vscode/generated-snippets.code-snippets"),
fs.writeFileSync(
path.join(process.cwd(), "../.vscode/generated-snippets.code-snippets"),
JSON.stringify(result, null, 2)
)

View File

@@ -1,3 +1,4 @@
// eslint-disable-next-line no-use-before-define
import * as React from "react"
import Link from "@docusaurus/Link"
import useBaseUrl from "@docusaurus/useBaseUrl"

View File

@@ -68,7 +68,7 @@
"value": "sveltekit.authjs.dev"
}
],
"destination": "https://authjs.dev/reference/sveltekit/modules/main"
"destination": "https://authjs.dev/reference/sveltekit/"
},
{
"source": "/:path(.*)",

View File

@@ -6,47 +6,53 @@
"scripts": {
"build:app": "turbo run build --filter=next-auth-app",
"build": "turbo run build --filter=next-auth --filter=@next-auth/* --filter=@auth/* --no-deps",
"test": "turbo run test --concurrency=1 --filter=[HEAD^1] --filter=./packages/* --filter=!*pouchdb-* --filter=!@*upstash* --filter=!*dynamodb-*",
"lint": "turbo run lint --parallel",
"format": "turbo run format --parallel",
"test": "turbo run test --concurrency=1 --filter=[HEAD^1] --filter=./packages/* --filter=!*pouchdb-* --filter=!@*upstash*",
"clean": "turbo run clean --no-cache",
"dev:db": "turbo run dev --parallel --continue --filter=next-auth-app...",
"dev": "turbo run dev --parallel --continue --filter=next-auth-app... --filter=!./packages/adapter-*",
"dev:kit": "turbo run dev --parallel --continue --filter=sveltekit-nextauth...",
"dev:docs": "turbo run dev --filter=docs",
"email": "cd apps/dev && pnpm email",
"eslint": "eslint --cache .",
"lint": "prettier --check .",
"format": "prettier --write .",
"release": "release",
"version:pr": "node ./config/version-pr"
},
"devDependencies": {
"@actions/core": "^1.10.0",
"@balazsorban/monorepo-release": "0.1.8",
"@actions/core": "^1.6.0",
"@balazsorban/monorepo-release": "0.1.1",
"@types/jest": "^28.1.3",
"@types/node": "^17.0.25",
"@typescript-eslint/eslint-plugin": "5.47.0",
"@typescript-eslint/parser": "5.47.0",
"eslint": "8.30.0",
"eslint-config-prettier": "^8.5.0",
"@typescript-eslint/eslint-plugin": "^5.10.2",
"@typescript-eslint/parser": "^4.33.0",
"eslint": "^7.32.0",
"eslint-config-prettier": "^8.3.0",
"eslint-config-standard-with-typescript": "^21.0.1",
"eslint-plugin-import": "^2.25.4",
"eslint-plugin-jest": "^27.0.1",
"eslint-plugin-jsdoc": "^39.6.4",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^6.0.0",
"eslint-plugin-react": "^7.31.11",
"eslint-plugin-svelte3": "^4.0.0",
"husky": "^7.0.4",
"prettier": "2.8.1",
"prettier-plugin-svelte": "^2.8.1",
"turbo": "1.6.3",
"pretty-quick": "^3.1.2",
"semver": "7.3.5",
"stream-to-array": "2.3.0",
"ts-node": "10.5.0",
"turbo": "1.3.1",
"typedoc": "^0.23.22",
"typedoc-plugin-markdown": "^3.14.0",
"typescript": "4.9.4"
"typescript": "4.8.4"
},
"release": {
"packageDirectories": [
"packages"
]
},
"engines": {
"node": "^16.13.0 || ^18.12.0"
"node": "^12.19.0 || ^14.15.0 || ^16.13.0 || ^18.12.0"
},
"packageManager": "pnpm@7.19.0",
"packageManager": "pnpm@7.13.3",
"funding": [
{
"type": "github",
@@ -62,8 +68,7 @@
"undici": "5.11.0"
},
"patchedDependencies": {
"typedoc-plugin-markdown@3.14.0": "patches/typedoc-plugin-markdown@3.14.0.patch",
"@balazsorban/monorepo-release@0.1.8": "patches/@balazsorban__monorepo-release@0.1.8.patch"
"typedoc-plugin-markdown@3.14.0": "patches/typedoc-plugin-markdown@3.14.0.patch"
}
}
}

View File

@@ -0,0 +1,8 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -0,0 +1,8 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -69,7 +69,7 @@ export const format = {
const newObject: Record<string, unknown> = {}
for (const key in object) {
const value = object[key]
if (value?.value && typeof value.value === "string") {
if (value?.value && typeof value.value === 'string') {
newObject[key] = new Date(value.value)
} else {
newObject[key] = value

View File

@@ -0,0 +1,8 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -250,8 +250,12 @@ export function FirestoreAdapter({
const verificationTokenSnapshot = await getDoc(verificationTokenRef)
if (verificationTokenSnapshot.exists() && VerificationTokens.converter) {
const { id, ...verificationToken } =
VerificationTokens.converter.fromFirestore(verificationTokenSnapshot)
const {
id,
...verificationToken
} = VerificationTokens.converter.fromFirestore(
verificationTokenSnapshot
)
return verificationToken
}
@@ -270,8 +274,12 @@ export function FirestoreAdapter({
if (verificationTokenSnapshot?.exists() && VerificationTokens.converter) {
await deleteDoc(verificationTokenSnapshot.ref)
const { id, ...verificationToken } =
VerificationTokens.converter.fromFirestore(verificationTokenSnapshot)
const {
id,
...verificationToken
} = VerificationTokens.converter.fromFirestore(
verificationTokenSnapshot
)
return verificationToken
}

View File

@@ -1,117 +1,76 @@
import { runBasicTests } from "@next-auth/adapter-test"
import { FirestoreAdapter } from "../src"
import {
getFirestore,
connectFirestoreEmulator,
terminate,
collection,
query,
where,
limit,
getDocs,
getDoc,
doc,
} from "firebase/firestore"
import { initializeApp } from "firebase/app"
import { getConverter } from "../src/converter"
import type {
AdapterSession,
AdapterUser,
VerificationToken,
} from "next-auth/adapters"
import type { Account } from "next-auth"
import { getFirestore, connectFirestoreEmulator, terminate, collection, query, where, limit, getDocs, getDoc, doc } from "firebase/firestore"
import { initializeApp } from "firebase/app";
import { getConverter } from "../src/converter";
import type { AdapterSession, AdapterUser, VerificationToken } from "next-auth/adapters";
import type { Account } from "next-auth";
const app = initializeApp({ projectId: "next-auth-test" })
const firestore = getFirestore(app)
const app = initializeApp({ projectId: "next-auth-test" });
const firestore = getFirestore(app);
connectFirestoreEmulator(firestore, "localhost", 8080)
connectFirestoreEmulator(firestore, 'localhost', 8080);
type IndexableObject = Record<string, unknown>
type IndexableObject = Record<string, unknown>;
const Users = collection(firestore, "users").withConverter(
getConverter<AdapterUser & IndexableObject>()
)
const Sessions = collection(firestore, "sessions").withConverter(
getConverter<AdapterSession & IndexableObject>()
)
const Accounts = collection(firestore, "accounts").withConverter(
getConverter<Account>()
)
const VerificationTokens = collection(
firestore,
"verificationTokens"
).withConverter(
getConverter<VerificationToken & IndexableObject>({ excludeId: true })
)
const Users = collection(firestore, 'users').withConverter(getConverter<AdapterUser & IndexableObject>());
const Sessions = collection(firestore, 'sessions').withConverter(getConverter<AdapterSession & IndexableObject>());
const Accounts = collection(firestore, 'accounts').withConverter(getConverter<Account>());
const VerificationTokens = collection(firestore, 'verificationTokens').withConverter(getConverter<VerificationToken & IndexableObject>({ excludeId: true }));
runBasicTests({
adapter: FirestoreAdapter({ projectId: "next-auth-test" }),
db: {
async disconnect() {
await terminate(firestore)
await terminate(firestore);
},
async session(sessionToken) {
const snapshotQuery = query(
Sessions,
where("sessionToken", "==", sessionToken),
limit(1)
)
const snapshots = await getDocs(snapshotQuery)
const snapshot = snapshots.docs[0]
const snapshotQuery = query(Sessions, where("sessionToken", "==", sessionToken), limit(1));
const snapshots = await getDocs(snapshotQuery);
const snapshot = snapshots.docs[0];
if (snapshot?.exists() && Sessions.converter) {
const session = Sessions.converter.fromFirestore(snapshot)
const session = Sessions.converter.fromFirestore(snapshot);
return session
return session;
}
return null
return null;
},
async user(id) {
const snapshot = await getDoc(doc(Users, id))
const snapshot = await getDoc(doc(Users, id));
if (snapshot?.exists() && Users.converter) {
const user = Users.converter.fromFirestore(snapshot)
const user = Users.converter.fromFirestore(snapshot);
return user
return user;
}
return null
return null;
},
async account({ provider, providerAccountId }) {
const snapshotQuery = query(
Accounts,
where("provider", "==", provider),
where("providerAccountId", "==", providerAccountId),
limit(1)
)
const snapshots = await getDocs(snapshotQuery)
const snapshot = snapshots.docs[0]
const snapshotQuery = query(Accounts, where("provider", "==", provider), where("providerAccountId", "==", providerAccountId), limit(1));
const snapshots = await getDocs(snapshotQuery);
const snapshot = snapshots.docs[0];
if (snapshot?.exists() && Accounts.converter) {
const account = Accounts.converter.fromFirestore(snapshot)
const account = Accounts.converter.fromFirestore(snapshot);
return account
return account;
}
return null
return null;
},
async verificationToken({ identifier, token }) {
const snapshotQuery = query(
VerificationTokens,
where("identifier", "==", identifier),
where("token", "==", token),
limit(1)
)
const snapshots = await getDocs(snapshotQuery)
const snapshot = snapshots.docs[0]
const snapshotQuery = query(VerificationTokens, where("identifier", "==", identifier), where("token", "==", token), limit(1));
const snapshots = await getDocs(snapshotQuery);
const snapshot = snapshots.docs[0];
if (snapshot?.exists() && VerificationTokens.converter) {
const verificationToken =
VerificationTokens.converter.fromFirestore(snapshot)
const verificationToken = VerificationTokens.converter.fromFirestore(snapshot);
return verificationToken
return verificationToken;
}
},
},

View File

@@ -0,0 +1,8 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -1,28 +1,28 @@
import { MikroORM, Options } from "@mikro-orm/core"
import { SqliteDriver } from "@mikro-orm/sqlite"
import { defaultEntities } from "../src"
import { MikroORM, Options } from "@mikro-orm/core";
import { SqliteDriver } from "@mikro-orm/sqlite";
import { defaultEntities } from "../src";
const config: Options<SqliteDriver> = {
dbName: "./db.sqlite",
type: "sqlite",
entities: [
defaultEntities.User,
defaultEntities.Account,
defaultEntities.Session,
defaultEntities.VerificationToken,
],
dbName: "./db.sqlite",
type: "sqlite",
entities: [
defaultEntities.User,
defaultEntities.Account,
defaultEntities.Session,
defaultEntities.VerificationToken,
],
}
it("run migrations", async () => {
const orm = await MikroORM.init(config)
await orm.getSchemaGenerator().dropSchema()
const orm = await MikroORM.init(config)
await orm.getSchemaGenerator().dropSchema()
const createSchemaSQL = await orm.getSchemaGenerator().getCreateSchemaSQL()
expect(createSchemaSQL).toMatchSnapshot("createSchemaSQL")
const createSchemaSQL = await orm.getSchemaGenerator().getCreateSchemaSQL()
expect(createSchemaSQL).toMatchSnapshot('createSchemaSQL')
const targetSchema = await orm.getSchemaGenerator().getTargetSchema()
expect(targetSchema).toMatchSnapshot("targetSchema")
const targetSchema = await orm.getSchemaGenerator().getTargetSchema()
expect(targetSchema).toMatchSnapshot('targetSchema')
await orm.getSchemaGenerator().dropSchema()
await orm.close().catch(() => null)
await orm.getSchemaGenerator().dropSchema()
await orm.close().catch(() => null)
})

View File

@@ -0,0 +1,8 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -0,0 +1,8 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -0,0 +1,8 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -0,0 +1,8 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -0,0 +1,8 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -0,0 +1,8 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -1,6 +1,6 @@
{
"name": "@next-auth/supabase-adapter",
"version": "0.2.1",
"version": "0.2.0",
"description": "Supabase adapter for next-auth.",
"homepage": "https://authjs.dev",
"repository": "https://github.com/nextauthjs/next-auth",
@@ -25,7 +25,7 @@
},
"peerDependencies": {
"@supabase/supabase-js": "^2.0.5",
"next-auth": "^4.18.7"
"next-auth": "workspace:*"
},
"devDependencies": {
"@next-auth/adapter-test": "workspace:^0.0.0",
@@ -37,4 +37,4 @@
"jest": {
"preset": "@next-auth/adapter-test/jest"
}
}
}

View File

@@ -137,3 +137,4 @@ export interface Database {
}
}
}

View File

@@ -17,8 +17,17 @@
"@babel/preset-env": "^7.14.2",
"@types/jest": "^26.0.23",
"@types/nodemailer": "^6.4.4",
"@typescript-eslint/eslint-plugin": "^4.24.0",
"@typescript-eslint/parser": "^4.24.0",
"eslint": "^7.27.0",
"eslint-config-prettier": "^8.3.0",
"eslint-config-standard-with-typescript": "^20.0.0",
"eslint-plugin-import": "^2.23.3",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^5.1.0",
"jest": "^27.0.3",
"next-auth": "workspace:*",
"prettier": "^2.3.0",
"ts-jest": "^27.0.3",
"typescript": "^4.2.4"
}

View File

@@ -0,0 +1,8 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -0,0 +1,8 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -1,24 +1,3 @@
<p align="center">
<br/>
<a href="https://authjs.dev" target="_blank"><img width="150px" src="https://authjs.dev/img/logo/logo-sm.png" /></a>
<h3 align="center">Auth.js core library</a></h3>
<h4 align="center">Authentication for the Web.</h4>
<p align="center" style="align: center;">
<a href="https://npm.im/next-auth">
<img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" />
</a>
<a href="https://npm.im/@auth/core">
<img alt="npm" src="https://img.shields.io/npm/v/@auth/core?color=green&label=@auth/core&style=flat-square">
</a>
<a href="https://www.npmtrends.com/@auth/core">
<img src="https://img.shields.io/npm/dm/@auth/core?label=%20downloads&style=flat-square" alt="Downloads" />
</a>
<a href="https://github.com/nextauthjs/next-auth/stargazers">
<img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" />
</a>
</p>
</p>
# Auth.js
---
Check out the documentation at [authjs.dev](https://authjs.dev/reference/core/modules/main).
Authentication for the web.

View File

@@ -1,18 +1,7 @@
{
"name": "@auth/core",
"version": "0.2.3",
"description": "Authentication for the Web.",
"keywords": [
"authentication",
"authjs",
"jwt",
"oauth",
"oidc",
"passwordless",
"standard",
"vanilla",
"webapi"
],
"version": "0.1.4",
"description": "Authentication for the web.",
"homepage": "https://authjs.dev",
"repository": "https://github.com/nextauthjs/next-auth.git",
"author": "Balázs Orbán <info@balazsorban.com>",
@@ -80,6 +69,8 @@
"build": "pnpm clean && pnpm css && tsc",
"clean": "rm -rf *.js *.d.ts lib providers",
"css": "node ./scripts/generate-css.js",
"lint": "pnpm prettier --check src && eslint src",
"format": "pnpm prettier --write . && eslint src --fix",
"dev": "pnpm css && tsc -w"
},
"devDependencies": {
@@ -92,4 +83,4 @@
"postcss": "8.4.19",
"postcss-nested": "6.0.0"
}
}
}

View File

@@ -158,6 +158,7 @@ export async function Auth(
*
* const request = new Request("https://example.com")
* const resposne = await AuthHandler(request, authConfig)
*
* ```
*
* @see [Initiailzation](https://authjs.dev/reference/configuration/auth-options)
@@ -167,8 +168,10 @@ export interface AuthConfig {
* List of authentication providers for signing in
* (e.g. Google, Facebook, Twitter, GitHub, Email, etc) in any order.
* This can be one of the built-in providers or an object with a custom provider.
* * **Default value**: `[]`
* * **Required**: *Yes*
*
* @default []
* [Documentation](https://next-auth.js.org/configuration/options#providers) | [Providers documentation](https://next-auth.js.org/configuration/providers)
*/
providers: Provider[]
/**
@@ -178,23 +181,36 @@ export interface AuthConfig {
*
* On Unix systems: `openssl rand -hex 32`
* Or go to https://generate-secret.vercel.app/32
*
* @default process.env.AUTH_SECRET ?? process.env.NEXTAUTH_SECRET
*
* [Documentation](https://next-auth.js.org/configuration/options#secret)
*/
secret?: string
/**
* Configure your session like if you want to use JWT or a database,
* how long until an idle session expires, or to throttle write operations in case you are using a database.
* * **Default value**: See the documentation page
* * **Required**: No
*
* [Documentation](https://next-auth.js.org/configuration/options#session)
*/
session?: Partial<SessionOptions>
/**
* JSON Web Tokens are enabled by default if you have not specified an {@link AuthConfig.adapter}.
* JSON Web Tokens are enabled by default if you have not specified an adapter.
* JSON Web Tokens are encrypted (JWE) by default. We recommend you keep this behaviour.
* * **Default value**: See the documentation page
* * **Required**: *No*
*
* [Documentation](https://next-auth.js.org/configuration/options#jwt)
*/
jwt?: Partial<JWTOptions>
/**
* Specify URLs to be used if you want to create custom sign in, sign out and error pages.
* Pages specified will override the corresponding built-in page.
* * **Default value**: `{}`
* * **Required**: *No*
*
* @default {}
* @example
*
* ```ts
@@ -206,12 +222,18 @@ export interface AuthConfig {
* newUser: '/auth/new-user'
* }
* ```
*
* [Documentation](https://next-auth.js.org/configuration/options#pages) | [Pages documentation](https://next-auth.js.org/configuration/pages)
*/
pages?: Partial<PagesOptions>
/**
* Callbacks are asynchronous functions you can use to control what happens when an action is performed.
* Callbacks are *extremely powerful*, especially in scenarios involving JSON Web Tokens
* as they **allow you to implement access controls without a database** and to **integrate with external databases or APIs**.
* * **Default value**: See the Callbacks documentation
* * **Required**: *No*
*
* [Documentation](https://next-auth.js.org/configuration/options#callbacks) | [Callbacks documentation](https://next-auth.js.org/configuration/callbacks)
*/
callbacks?: Partial<CallbacksOptions>
/**
@@ -221,23 +243,36 @@ export interface AuthConfig {
* (e.g. OAuth or Email authentication flow, JWT or database sessions, etc),
* but typically contains a user object and/or contents of the JSON Web Token
* and other information relevant to the event.
* * **Default value**: `{}`
* * **Required**: *No*
*
* @default {}
* [Documentation](https://next-auth.js.org/configuration/options#events) | [Events documentation](https://next-auth.js.org/configuration/events)
*/
events?: Partial<EventCallbacks>
/** You can use the adapter option to pass in your database adapter. */
/**
* You can use the adapter option to pass in your database adapter.
*
* * **Required**: *No*
*
* [Documentation](https://next-auth.js.org/configuration/options#adapter) |
* [Adapters Overview](https://next-auth.js.org/adapters/overview)
*/
adapter?: Adapter
/**
* Set debug to true to enable debug messages for authentication and database operations.
* * **Default value**: `false`
* * **Required**: *No*
*
* - ⚠ If you added a custom {@link AuthConfig.logger}, this setting is ignored.
* - ⚠ If you added a custom `logger`, this setting is ignored.
*
* @default false
* [Documentation](https://next-auth.js.org/configuration/options#debug) | [Logger documentation](https://next-auth.js.org/configuration/options#logger)
*/
debug?: boolean
/**
* Override any of the logger levels (`undefined` levels will use the built-in logger),
* and intercept logs in NextAuth. You can use this option to send NextAuth logs to a third-party logging service.
* * **Default value**: `console`
* * **Required**: *No*
*
* @example
*
@@ -259,24 +294,36 @@ export interface AuthConfig {
* })
* ```
*
* - ⚠ When set, the {@link AuthConfig.debug} option is ignored
* - ⚠ When set, the `debug` option is ignored
*
* @default console
* [Documentation](https://next-auth.js.org/configuration/options#logger) |
* [Debug documentation](https://next-auth.js.org/configuration/options#debug)
*/
logger?: Partial<LoggerInstance>
/** Changes the theme of built-in {@link AuthConfig.pages}. */
/**
* Changes the theme of pages.
* Set to `"light"` if you want to force pages to always be light.
* Set to `"dark"` if you want to force pages to always be dark.
* Set to `"auto"`, (or leave this option out)if you want the pages to follow the preferred system theme.
* * **Default value**: `"auto"`
* * **Required**: *No*
*
* [Documentation](https://next-auth.js.org/configuration/options#theme) | [Pages documentation]("https://next-auth.js.org/configuration/pages")
*/
theme?: Theme
/**
* When set to `true` then all cookies set by NextAuth.js will only be accessible from HTTPS URLs.
* This option defaults to `false` on URLs that start with `http://` (e.g. http://localhost:3000) for developer convenience.
* You can manually set this option to `false` to disable this security feature and allow cookies
* to be accessible from non-secured URLs (this is not recommended).
* * **Default value**: `true` for HTTPS and `false` for HTTP sites
* * **Required**: No
*
* [Documentation](https://next-auth.js.org/configuration/options#usesecurecookies)
*
* - ⚠ **This is an advanced option.** Advanced options are passed the same way as basic options,
* but **may have complex implications** or side effects.
* You should **try to avoid using advanced options** unless you are very comfortable using them.
*
* The default is `false` HTTP and `true` for HTTPS sites.
*/
useSecureCookies?: boolean
/**
@@ -286,14 +333,25 @@ export interface AuthConfig {
* If you use this feature, you will likely want to create conditional behavior
* to support setting different cookies policies in development and production builds,
* as you will be opting out of the built-in dynamic policy.
* * **Default value**: `{}`
* * **Required**: No
*
* - ⚠ **This is an advanced option.** Advanced options are passed the same way as basic options,
* but **may have complex implications** or side effects.
* You should **try to avoid using advanced options** unless you are very comfortable using them.
*
* @default {}
* [Documentation](https://next-auth.js.org/configuration/options#cookies) | [Usage example](https://next-auth.js.org/configuration/options#example)
*/
cookies?: Partial<CookiesOptions>
/** @todo */
/**
* If set to `true`, NextAuth.js will use either the `x-forwarded-host` or `host` headers,
* instead of `NEXTAUTH_URL`
* Make sure that reading `x-forwarded-host` on your hosting platform can be trusted.
* - ⚠ **This is an advanced option.** Advanced options are passed the same way as basic options,
* but **may have complex implications** or side effects.
* You should **try to avoid using advanced options** unless you are very comfortable using them.
*
* @default Boolean(process.env.NEXTAUTH_URL ?? process.env.AUTH_TRUST_HOST ?? process.env.VERCEL)
*/
trustHost?: boolean
}

View File

@@ -1,2 +1,2 @@
export default `:root{--border-width:1px;--border-radius:0.5rem;--color-error:#c94b4b;--color-info:#157efb;--color-info-text:#fff}.__next-auth-theme-auto,.__next-auth-theme-light{--color-background:#fff;--color-text:#000;--color-primary:#444;--color-control-border:#bbb;--color-button-active-background:#f9f9f9;--color-button-active-border:#aaa;--color-seperator:#ccc}.__next-auth-theme-dark{--color-background:#000;--color-text:#fff;--color-primary:#ccc;--color-control-border:#555;--color-button-active-background:#060606;--color-button-active-border:#666;--color-seperator:#444}@media (prefers-color-scheme:dark){.__next-auth-theme-auto{--color-background:#000;--color-text:#fff;--color-primary:#ccc;--color-control-border:#555;--color-button-active-background:#060606;--color-button-active-border:#666;--color-seperator:#444}}body{background-color:var(--color-background);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;margin:0;padding:0}h1{font-weight:400;margin-bottom:1.5rem;padding:0 1rem}h1,p{color:var(--color-text)}form{margin:0;padding:0}label{font-weight:500;margin-bottom:.25rem;text-align:left}input[type],label{color:var(--color-text);display:block}input[type]{background:var(--color-background);border:var(--border-width) solid var(--color-control-border);border-radius:var(--border-radius);box-shadow:inset 0 .1rem .2rem rgba(0,0,0,.2);box-sizing:border-box;font-size:1rem;padding:.5rem 1rem;width:100%}input[type]:focus{box-shadow:none}p{font-size:1.1rem;line-height:2rem;margin:0 0 1.5rem;padding:0 1rem}a.button{line-height:1rem;text-decoration:none}a.button:link,a.button:visited{background-color:var(--color-background);color:var(--color-primary)}a.button,button{align-items:center;background-color:var(--provider-bg,var(--color-background));border-color:rgba(0,0,0,.1);border-radius:var(--border-radius);box-shadow:0 0 0 0 #000,0 0 0 0 #000,0 10px 15px -3px rgba(0,0,0,.2),0 4px 6px -4px rgba(0,0,0,.1);color:var(--provider-color,var(--color-primary));display:flex;font-size:1.1rem;font-weight:500;justify-content:center;margin:0 0 .75rem;min-height:62px;padding:.75rem 1rem;position:relative;transition:all .1s ease-in-out}a.button:has(img),button:has(img){justify-content:unset}a.button:has(img) span,button:has(img) span{flex-grow:1}a.button:hover,button:hover{cursor:pointer}a.button:active,button:active{box-shadow:0 .15rem .3rem rgba(0,0,0,.15),inset 0 .1rem .2rem var(--color-background),inset 0 -.1rem .1rem rgba(0,0,0,.1);cursor:pointer}a.button #provider-logo,button #provider-logo{display:block}a.button #provider-logo-dark,button #provider-logo-dark{display:none}@media (prefers-color-scheme:dark){a.button,button{background-color:var(--provider-dark-bg,var(--color-background));border:1px solid #0d0d0d;box-shadow:0 0 0 0 #000,0 0 0 0 #ccc,0 5px 5px -3px hsla(0,0%,100%,.01),0 4px 6px -4px hsla(0,0%,100%,.05);color:var(--provider-dark-color,var(--color-primary))}#provider-logo{display:none!important}#provider-logo-dark{display:block!important}}a.site{color:var(--color-primary);font-size:1rem;line-height:2rem;text-decoration:none}a.site:hover{text-decoration:underline}.page{display:grid;height:100%;margin:0;padding:0;place-items:center;position:absolute;width:100%}.page>div{padding:.5rem;text-align:center}.error a.button{display:inline-block;margin-top:.5rem;padding-left:2rem;padding-right:2rem}.error .message{margin-bottom:1.5rem}.signin input[type=text]{display:block;margin-left:auto;margin-right:auto}.signin hr{border:0;border-top:1px solid var(--color-seperator);display:block;margin:1.5em auto 0;overflow:visible}.signin hr:before{background:var(--color-background);color:#888;content:"or";padding:0 .4rem;position:relative;top:-.6rem}.signin .error{background:#f5f5f5;background:var(--color-info);border-radius:.3rem;font-weight:500}.signin .error p{color:var(--color-info-text);font-size:.9rem;line-height:1.2rem;padding:.5rem 1rem;text-align:left}.signin form,.signin>div{display:block}.signin form input[type],.signin>div input[type]{margin-bottom:.5rem}.signin form button,.signin>div button{width:100%}.signin form,.signin>div{max-width:300px}.signout .message{margin-bottom:1.5rem}.logo{display:inline-block;margin-top:100px;max-height:150px;max-width:300px}.card{border:1px solid var(--color-control-border);border-radius:5px;margin:50px auto;max-width:-moz-max-content;max-width:max-content;padding:20px 50px}.card .header{color:var(--color-primary)}.section-header{color:var(--brand-color,var(--color-text))}`
// Generated by `pnpm css`
// Generated by `pnpm css`

View File

@@ -97,5 +97,5 @@ function normalizeEndpoint(
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
for (const k in e.params) url.searchParams.set(k, e.params[k] as any)
return { ...e, url }
return { url }
}

View File

@@ -146,7 +146,6 @@ export default function Twitter<
id: "twitter",
name: "Twitter",
type: "oauth",
checks: ["pkce", "state"],
authorization: {
url: "https://twitter.com/i/oauth2/authorize",
params: { scope: "users.read tweet.read offline.access" },

View File

@@ -0,0 +1,11 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"watch": true,
"emitDeclarationOnly": false
},
"watchOptions": {
"excludeDirectories": ["jwt", "lib", "providers"],
"excludeFiles": ["./*.d.ts", "./*.js"]
}
}

View File

@@ -0,0 +1,4 @@
{
"extends": "./tsconfig.json",
"exclude": ["./*.js", "./*.d.ts"]
}

View File

@@ -0,0 +1,7 @@
.DS_Store
node_modules
/build
/.svelte-kit
/package
/index.*
/client.*

View File

@@ -1,24 +1,3 @@
<p align="center">
<br/>
<a href="https://authjs.dev" target="_blank"><img width="150px" src="https://authjs.dev/img/logo/logo-sm.png" /></a>
<h3 align="center">SvelteKit Auth</a></h3>
<h4 align="center">Authentication for SvelteKit.</h4>
<p align="center" style="align: center;">
<a href="https://npm.im/next-auth">
<img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" />
</a>
<a href="https://npm.im/@auth/sveltekit">
<img alt="npm" src="https://img.shields.io/npm/v/@auth/sveltekit?color=green&label=@auth/sveltekit&style=flat-square">
</a>
<a href="https://www.npmtrends.com/@auth/sveltekit">
<img src="https://img.shields.io/npm/dm/@auth/sveltekit?label=%20downloads&style=flat-square" alt="Downloads" />
</a>
<a href="https://github.com/nextauthjs/next-auth/stargazers">
<img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" />
</a>
</p>
</p>
# SvelteKit Auth
---
Check out the documentation at [sveltekit.authjs.dev](https://sveltekit.authjs.dev).
Authentication for SvelteKit.

View File

@@ -1,17 +1,7 @@
{
"name": "@auth/sveltekit",
"version": "0.1.10",
"version": "0.1.6",
"description": "Authentication for SvelteKit.",
"keywords": [
"authentication",
"authjs",
"jwt",
"sveltekit",
"oauth",
"oidc",
"passwordless",
"svelte"
],
"homepage": "https://sveltekit.authjs.dev",
"repository": "https://github.com/nextauthjs/next-auth.git",
"author": "Thang Huu Vu <hi@thvu.dev>",
@@ -29,14 +19,23 @@
"preview": "vite preview",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"test:unit": "vitest"
"test:unit": "vitest",
"lint": "prettier --plugin-search-dir . --check . && eslint .",
"format": "prettier --plugin-search-dir . --write ."
},
"devDependencies": {
"@playwright/test": "^1.28.1",
"@sveltejs/adapter-auto": "^1.0.0",
"@sveltejs/kit": "^1.0.0",
"@sveltejs/package": "^1.0.0",
"@sveltejs/adapter-auto": "next",
"@sveltejs/kit": "next",
"@sveltejs/package": "1.0.0-next.6",
"@typescript-eslint/eslint-plugin": "^5.45.0",
"@typescript-eslint/parser": "^5.45.0",
"eslint": "^8.28.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-svelte3": "^4.0.0",
"next-auth": "workspace:*",
"prettier": "2.8.1",
"prettier-plugin-svelte": "^2.8.1",
"svelte": "^3.54.0",
"svelte-check": "^2.9.2",
"tslib": "^2.4.1",
@@ -69,4 +68,4 @@
},
"./package.json": "./package.json"
}
}
}

View File

@@ -1,7 +1,7 @@
module.exports = {
plugins: [
require("autoprefixer"),
require("postcss-nested"),
require("cssnano")({ preset: "default" }),
],
require('autoprefixer'),
require('postcss-nested'),
require('cssnano')({ preset: 'default' })
]
}

View File

@@ -42,11 +42,12 @@
"clean": "rm -rf coverage client css utils providers core jwt react next index.d.ts index.js adapters.d.ts middleware.d.ts middleware.js",
"build:css": "postcss --config config/postcss.config.js src/**/*.css --base src --dir . && node config/wrap-css.js",
"dev": "pnpm clean && pnpm generate-providers && concurrently \"pnpm watch:css\" \"pnpm watch:ts\"",
"watch:ts": "pnpm tsc",
"watch:ts": "pnpm tsc --project tsconfig.dev.json",
"watch:css": "postcss --config config/postcss.config.js --watch src/**/*.css --base src --dir .",
"test": "jest --config ./config/jest.config.js",
"prepublishOnly": "pnpm build",
"generate-providers": "node ./config/generate-providers.js"
"generate-providers": "node ./config/generate-providers.js",
"lint": "eslint src config tests"
},
"files": [
"lib",
@@ -102,7 +103,7 @@
"@testing-library/dom": "^8.13.0",
"@testing-library/jest-dom": "^5.16.4",
"@testing-library/react": "^13.3.0",
"@testing-library/react-hooks": "^8.0.1",
"@testing-library/react-hooks": "^8.0.0",
"@testing-library/user-event": "^14.2.0",
"@types/jest": "^28.1.3",
"@types/node": "^17.0.42",
@@ -119,7 +120,7 @@
"jest-environment-jsdom": "^28.1.1",
"jest-watch-typeahead": "^1.1.0",
"msw": "^0.42.3",
"next": "13.1.1",
"next": "13.0.6",
"postcss": "^8.4.14",
"postcss-cli": "^9.1.0",
"postcss-nested": "^5.0.6",
@@ -130,4 +131,4 @@
"engines": {
"node": "^12.19.0 || ^14.15.0 || ^16.13.0 || ^18.12.0"
}
}
}

View File

@@ -181,11 +181,11 @@ export default async function callbackHandler(params: {
? await getUserByEmail(profile.email)
: null
if (userByEmail) {
const provider = options.provider as OAuthConfig<any>
const provider = options.provider as OAuthConfig<any>;
if (provider?.allowDangerousEmailAccountLinking) {
// If you trust the oauth provider to correctly verify email addresses, you can opt-in to
// If you trust the oauth provider to correctly verify email addresses, you can opt-in to
// account linking even when the user is not signed-in.
user = userByEmail
user = userByEmail;
} else {
// We end up here when we don't have an account with the same [provider].id *BUT*
// we do already have an account with the same email address as the one in the

View File

@@ -114,7 +114,7 @@ export function defaultCookies(useSecureCookies: boolean): CookiesOptions {
path: "/",
secure: useSecureCookies,
},
},
}
}
}

View File

@@ -5,7 +5,7 @@ import type { Cookie } from "../cookie"
const NONCE_MAX_AGE = 60 * 15 // 15 minutes in seconds
/**
/**
* Returns nonce if the provider supports it
* and saves it in a cookie */
export async function createNonce(options: InternalOptions<"oauth">): Promise<
@@ -62,7 +62,7 @@ export async function useNonce(
return
}
const value = (await jwt.decode({ ...options.jwt, token: nonce })) as any
const value = (await jwt.decode({...options.jwt, token: nonce })) as any
return {
value: value?.nonce ?? undefined,

View File

@@ -1,5 +1,5 @@
export { default as callback } from "./callback"
export { default as signin } from "./signin"
export { default as signout } from "./signout"
export { default as session } from "./session"
export { default as providers } from "./providers"
export { default as callback } from './callback'
export { default as signin } from './signin'
export { default as signout } from './signout'
export { default as session } from './session'
export { default as providers } from './providers'

View File

@@ -4,12 +4,7 @@
import fs from "fs"
import path from "path"
const pathToCss = path.join(
process.cwd(),
process.env.NODE_ENV === "development"
? "node_modules/next-auth/css/index.css"
: "/src/css/index.css"
)
const pathToCss = path.join(process.cwd(), process.env.NODE_ENV === "development" ? "node_modules/next-auth/css/index.css" : "/src/css/index.css")
export default function css() {
return fs.readFileSync(pathToCss, "utf8")

View File

@@ -118,9 +118,8 @@ export default function Apple<P extends AppleProfile>(
},
checks: ["pkce"],
style: {
logo: "https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/apple.svg",
logoDark:
"https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/apple-dark.svg",
logo: 'https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/apple.svg',
logoDark: 'https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/apple-dark.svg',
bg: "#fff",
text: "#000",
bgDark: "#000",

View File

@@ -17,8 +17,7 @@ export default function EVEOnline<P extends EVEOnlineProfile>(
id: "eveonline",
name: "EVE Online",
type: "oauth",
authorization:
"https://login.eveonline.com/v2/oauth/authorize?scope=publicData",
authorization: "https://login.eveonline.com/v2/oauth/authorize?scope=publicData",
token: "https://login.eveonline.com/v2/oauth/token",
userinfo: "https://login.eveonline.com/oauth/verify",
profile(profile) {

View File

@@ -34,9 +34,8 @@ export default function LINE<P extends LineProfile>(
id_token_signed_response_alg: "HS256",
},
style: {
logo: "https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/line.svg",
logoDark:
"https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/line.svg",
logo: 'https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/line.svg',
logoDark: 'https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/line.svg',
bg: "#fff",
text: "#00C300",
bgDark: "#00C300",

View File

@@ -28,4 +28,4 @@ export default function UnitedEffects<P extends UnitedEffectsProfile>(
},
options,
}
}
}

View File

@@ -0,0 +1,27 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"watch": true,
"emitDeclarationOnly": false
},
"watchOptions": {
"excludeDirectories": [
"lib",
"css",
"jwt",
"react",
"next",
"client",
"providers",
"core",
"utils"
],
"excludeFiles": [
"index.d.ts",
"index.js",
"adapters.d.ts",
"middleware.d.ts",
"middleware.js"
]
}
}

View File

@@ -0,0 +1,8 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"types": ["@types/jest"],
"typeRoots": ["./node_modules/@types"]
},
"exclude": ["./coverage", "./*.js", "./*.d.ts"]
}

Some files were not shown because too many files have changed in this diff Show More