diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 4e78af7..de630e3 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -51,52 +51,6 @@ jobs: working-directory: ./playwright run: npx playwright test - test-deno-kv-store: - timeout-minutes: 60 - runs-on: ubuntu-latest - env: - STORE: kv - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 20 - - uses: denoland/setup-deno@v2 - with: - deno-version: "2.0.0" - - name: Install dependencies - working-directory: ./playwright - run: npm ci - - name: Install Playwright Browsers - working-directory: ./playwright - run: npx playwright install chromium - - name: Run Playwright tests - working-directory: ./playwright - run: npx playwright test - - test-deno-sqlite-store: - timeout-minutes: 60 - runs-on: ubuntu-latest - env: - STORE: sqlite - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 20 - - uses: denoland/setup-deno@v2 - with: - deno-version: "2.0.0" - - name: Install dependencies - working-directory: ./playwright - run: npm ci - - name: Install Playwright Browsers - working-directory: ./playwright - run: npx playwright install chromium - - name: Run Playwright tests - working-directory: ./playwright - run: npx playwright test - test-bun-cookie-store: timeout-minutes: 60 runs-on: ubuntu-latest diff --git a/README.md b/README.md index e631701..b945c29 100644 --- a/README.md +++ b/README.md @@ -13,11 +13,6 @@ Hono Sessions is currently tested on these runtimes: Other runtimes may work, but are untested. In addition to Hono's requirements, the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) is required for this library. -If you want to use a backend storage driver (instead of just storing session data in an encrypted cookie), you'll need to use a storage engine provided by Hono Sessions. Right now, those include: - -- Deno KV -- Bun SQLite - ### 🛠️ Features - Flash messages — data that is deleted once it's read (one-off error messages, etc.) - Built-in Memory and Cookie storage drivers, as well as [community-supported drivers](https://github.com/jcs224/hono_sessions/wiki) @@ -99,29 +94,6 @@ app.get('/', async (c, next) => { Deno.serve(app.fetch) ``` -#### Using Deno KV storage driver - -```ts -import { Hono } from 'npm:hono' -import { sessionMiddleware } from 'jsr:@jcs224/hono-sessions' -import { DenoKvStore } from 'https://deno.land/x/hono_sessions/src/store/deno/DenoKvStore.ts' - -const app = new Hono() - -const kv = await Deno.openKv() -const store = new DenoKvStore(kv) - -app.use('*', sessionMiddleware({ - store, - // ... other session options -})) - -// Other app code - -Deno.serve(app.fetch) - -``` - ### Bun ```ts diff --git a/playwright/test_setup.ts b/playwright/test_setup.ts index 66fc7a3..7208447 100644 --- a/playwright/test_setup.ts +++ b/playwright/test_setup.ts @@ -4,7 +4,7 @@ export function runtimeCommand() { switch(process.env.JS_RUNTIME) { case 'deno': - command = `cd ../test/deno && deno run -A ${ process.env.STORE === 'kv' ? '--unstable-kv ': '' }server_deno.ts` + command = `cd ../test/deno && deno run -A server_deno.ts` server_url = 'http://127.0.0.1:8000' break case 'bun': @@ -24,7 +24,7 @@ export function runtimeCommand() { server_url = 'http://127.0.0.1:3000' break default: // Deno by default - command = `cd ../test/deno && deno run -A ${ process.env.STORE === 'kv' ? '--unstable-kv ': '' }server_deno.ts` + command = `cd ../test/deno && deno run -A server_deno.ts` server_url = 'http://127.0.0.1:8000' } diff --git a/playwright/tests-examples/demo-todo-app.spec.ts b/playwright/tests-examples/demo-todo-app.spec.ts deleted file mode 100644 index 2fd6016..0000000 --- a/playwright/tests-examples/demo-todo-app.spec.ts +++ /dev/null @@ -1,437 +0,0 @@ -import { test, expect, type Page } from '@playwright/test'; - -test.beforeEach(async ({ page }) => { - await page.goto('https://demo.playwright.dev/todomvc'); -}); - -const TODO_ITEMS = [ - 'buy some cheese', - 'feed the cat', - 'book a doctors appointment' -]; - -test.describe('New Todo', () => { - test('should allow me to add todo items', async ({ page }) => { - // create a new todo locator - const newTodo = page.getByPlaceholder('What needs to be done?'); - - // Create 1st todo. - await newTodo.fill(TODO_ITEMS[0]); - await newTodo.press('Enter'); - - // Make sure the list only has one todo item. - await expect(page.getByTestId('todo-title')).toHaveText([ - TODO_ITEMS[0] - ]); - - // Create 2nd todo. - await newTodo.fill(TODO_ITEMS[1]); - await newTodo.press('Enter'); - - // Make sure the list now has two todo items. - await expect(page.getByTestId('todo-title')).toHaveText([ - TODO_ITEMS[0], - TODO_ITEMS[1] - ]); - - await checkNumberOfTodosInLocalStorage(page, 2); - }); - - test('should clear text input field when an item is added', async ({ page }) => { - // create a new todo locator - const newTodo = page.getByPlaceholder('What needs to be done?'); - - // Create one todo item. - await newTodo.fill(TODO_ITEMS[0]); - await newTodo.press('Enter'); - - // Check that input is empty. - await expect(newTodo).toBeEmpty(); - await checkNumberOfTodosInLocalStorage(page, 1); - }); - - test('should append new items to the bottom of the list', async ({ page }) => { - // Create 3 items. - await createDefaultTodos(page); - - // create a todo count locator - const todoCount = page.getByTestId('todo-count') - - // Check test using different methods. - await expect(page.getByText('3 items left')).toBeVisible(); - await expect(todoCount).toHaveText('3 items left'); - await expect(todoCount).toContainText('3'); - await expect(todoCount).toHaveText(/3/); - - // Check all items in one call. - await expect(page.getByTestId('todo-title')).toHaveText(TODO_ITEMS); - await checkNumberOfTodosInLocalStorage(page, 3); - }); -}); - -test.describe('Mark all as completed', () => { - test.beforeEach(async ({ page }) => { - await createDefaultTodos(page); - await checkNumberOfTodosInLocalStorage(page, 3); - }); - - test.afterEach(async ({ page }) => { - await checkNumberOfTodosInLocalStorage(page, 3); - }); - - test('should allow me to mark all items as completed', async ({ page }) => { - // Complete all todos. - await page.getByLabel('Mark all as complete').check(); - - // Ensure all todos have 'completed' class. - await expect(page.getByTestId('todo-item')).toHaveClass(['completed', 'completed', 'completed']); - await checkNumberOfCompletedTodosInLocalStorage(page, 3); - }); - - test('should allow me to clear the complete state of all items', async ({ page }) => { - const toggleAll = page.getByLabel('Mark all as complete'); - // Check and then immediately uncheck. - await toggleAll.check(); - await toggleAll.uncheck(); - - // Should be no completed classes. - await expect(page.getByTestId('todo-item')).toHaveClass(['', '', '']); - }); - - test('complete all checkbox should update state when items are completed / cleared', async ({ page }) => { - const toggleAll = page.getByLabel('Mark all as complete'); - await toggleAll.check(); - await expect(toggleAll).toBeChecked(); - await checkNumberOfCompletedTodosInLocalStorage(page, 3); - - // Uncheck first todo. - const firstTodo = page.getByTestId('todo-item').nth(0); - await firstTodo.getByRole('checkbox').uncheck(); - - // Reuse toggleAll locator and make sure its not checked. - await expect(toggleAll).not.toBeChecked(); - - await firstTodo.getByRole('checkbox').check(); - await checkNumberOfCompletedTodosInLocalStorage(page, 3); - - // Assert the toggle all is checked again. - await expect(toggleAll).toBeChecked(); - }); -}); - -test.describe('Item', () => { - - test('should allow me to mark items as complete', async ({ page }) => { - // create a new todo locator - const newTodo = page.getByPlaceholder('What needs to be done?'); - - // Create two items. - for (const item of TODO_ITEMS.slice(0, 2)) { - await newTodo.fill(item); - await newTodo.press('Enter'); - } - - // Check first item. - const firstTodo = page.getByTestId('todo-item').nth(0); - await firstTodo.getByRole('checkbox').check(); - await expect(firstTodo).toHaveClass('completed'); - - // Check second item. - const secondTodo = page.getByTestId('todo-item').nth(1); - await expect(secondTodo).not.toHaveClass('completed'); - await secondTodo.getByRole('checkbox').check(); - - // Assert completed class. - await expect(firstTodo).toHaveClass('completed'); - await expect(secondTodo).toHaveClass('completed'); - }); - - test('should allow me to un-mark items as complete', async ({ page }) => { - // create a new todo locator - const newTodo = page.getByPlaceholder('What needs to be done?'); - - // Create two items. - for (const item of TODO_ITEMS.slice(0, 2)) { - await newTodo.fill(item); - await newTodo.press('Enter'); - } - - const firstTodo = page.getByTestId('todo-item').nth(0); - const secondTodo = page.getByTestId('todo-item').nth(1); - const firstTodoCheckbox = firstTodo.getByRole('checkbox'); - - await firstTodoCheckbox.check(); - await expect(firstTodo).toHaveClass('completed'); - await expect(secondTodo).not.toHaveClass('completed'); - await checkNumberOfCompletedTodosInLocalStorage(page, 1); - - await firstTodoCheckbox.uncheck(); - await expect(firstTodo).not.toHaveClass('completed'); - await expect(secondTodo).not.toHaveClass('completed'); - await checkNumberOfCompletedTodosInLocalStorage(page, 0); - }); - - test('should allow me to edit an item', async ({ page }) => { - await createDefaultTodos(page); - - const todoItems = page.getByTestId('todo-item'); - const secondTodo = todoItems.nth(1); - await secondTodo.dblclick(); - await expect(secondTodo.getByRole('textbox', { name: 'Edit' })).toHaveValue(TODO_ITEMS[1]); - await secondTodo.getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); - await secondTodo.getByRole('textbox', { name: 'Edit' }).press('Enter'); - - // Explicitly assert the new text value. - await expect(todoItems).toHaveText([ - TODO_ITEMS[0], - 'buy some sausages', - TODO_ITEMS[2] - ]); - await checkTodosInLocalStorage(page, 'buy some sausages'); - }); -}); - -test.describe('Editing', () => { - test.beforeEach(async ({ page }) => { - await createDefaultTodos(page); - await checkNumberOfTodosInLocalStorage(page, 3); - }); - - test('should hide other controls when editing', async ({ page }) => { - const todoItem = page.getByTestId('todo-item').nth(1); - await todoItem.dblclick(); - await expect(todoItem.getByRole('checkbox')).not.toBeVisible(); - await expect(todoItem.locator('label', { - hasText: TODO_ITEMS[1], - })).not.toBeVisible(); - await checkNumberOfTodosInLocalStorage(page, 3); - }); - - test('should save edits on blur', async ({ page }) => { - const todoItems = page.getByTestId('todo-item'); - await todoItems.nth(1).dblclick(); - await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); - await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).dispatchEvent('blur'); - - await expect(todoItems).toHaveText([ - TODO_ITEMS[0], - 'buy some sausages', - TODO_ITEMS[2], - ]); - await checkTodosInLocalStorage(page, 'buy some sausages'); - }); - - test('should trim entered text', async ({ page }) => { - const todoItems = page.getByTestId('todo-item'); - await todoItems.nth(1).dblclick(); - await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill(' buy some sausages '); - await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Enter'); - - await expect(todoItems).toHaveText([ - TODO_ITEMS[0], - 'buy some sausages', - TODO_ITEMS[2], - ]); - await checkTodosInLocalStorage(page, 'buy some sausages'); - }); - - test('should remove the item if an empty text string was entered', async ({ page }) => { - const todoItems = page.getByTestId('todo-item'); - await todoItems.nth(1).dblclick(); - await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill(''); - await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Enter'); - - await expect(todoItems).toHaveText([ - TODO_ITEMS[0], - TODO_ITEMS[2], - ]); - }); - - test('should cancel edits on escape', async ({ page }) => { - const todoItems = page.getByTestId('todo-item'); - await todoItems.nth(1).dblclick(); - await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); - await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Escape'); - await expect(todoItems).toHaveText(TODO_ITEMS); - }); -}); - -test.describe('Counter', () => { - test('should display the current number of todo items', async ({ page }) => { - // create a new todo locator - const newTodo = page.getByPlaceholder('What needs to be done?'); - - // create a todo count locator - const todoCount = page.getByTestId('todo-count') - - await newTodo.fill(TODO_ITEMS[0]); - await newTodo.press('Enter'); - - await expect(todoCount).toContainText('1'); - - await newTodo.fill(TODO_ITEMS[1]); - await newTodo.press('Enter'); - await expect(todoCount).toContainText('2'); - - await checkNumberOfTodosInLocalStorage(page, 2); - }); -}); - -test.describe('Clear completed button', () => { - test.beforeEach(async ({ page }) => { - await createDefaultTodos(page); - }); - - test('should display the correct text', async ({ page }) => { - await page.locator('.todo-list li .toggle').first().check(); - await expect(page.getByRole('button', { name: 'Clear completed' })).toBeVisible(); - }); - - test('should remove completed items when clicked', async ({ page }) => { - const todoItems = page.getByTestId('todo-item'); - await todoItems.nth(1).getByRole('checkbox').check(); - await page.getByRole('button', { name: 'Clear completed' }).click(); - await expect(todoItems).toHaveCount(2); - await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]); - }); - - test('should be hidden when there are no items that are completed', async ({ page }) => { - await page.locator('.todo-list li .toggle').first().check(); - await page.getByRole('button', { name: 'Clear completed' }).click(); - await expect(page.getByRole('button', { name: 'Clear completed' })).toBeHidden(); - }); -}); - -test.describe('Persistence', () => { - test('should persist its data', async ({ page }) => { - // create a new todo locator - const newTodo = page.getByPlaceholder('What needs to be done?'); - - for (const item of TODO_ITEMS.slice(0, 2)) { - await newTodo.fill(item); - await newTodo.press('Enter'); - } - - const todoItems = page.getByTestId('todo-item'); - const firstTodoCheck = todoItems.nth(0).getByRole('checkbox'); - await firstTodoCheck.check(); - await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]); - await expect(firstTodoCheck).toBeChecked(); - await expect(todoItems).toHaveClass(['completed', '']); - - // Ensure there is 1 completed item. - await checkNumberOfCompletedTodosInLocalStorage(page, 1); - - // Now reload. - await page.reload(); - await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]); - await expect(firstTodoCheck).toBeChecked(); - await expect(todoItems).toHaveClass(['completed', '']); - }); -}); - -test.describe('Routing', () => { - test.beforeEach(async ({ page }) => { - await createDefaultTodos(page); - // make sure the app had a chance to save updated todos in storage - // before navigating to a new view, otherwise the items can get lost :( - // in some frameworks like Durandal - await checkTodosInLocalStorage(page, TODO_ITEMS[0]); - }); - - test('should allow me to display active items', async ({ page }) => { - const todoItem = page.getByTestId('todo-item'); - await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); - - await checkNumberOfCompletedTodosInLocalStorage(page, 1); - await page.getByRole('link', { name: 'Active' }).click(); - await expect(todoItem).toHaveCount(2); - await expect(todoItem).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]); - }); - - test('should respect the back button', async ({ page }) => { - const todoItem = page.getByTestId('todo-item'); - await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); - - await checkNumberOfCompletedTodosInLocalStorage(page, 1); - - await test.step('Showing all items', async () => { - await page.getByRole('link', { name: 'All' }).click(); - await expect(todoItem).toHaveCount(3); - }); - - await test.step('Showing active items', async () => { - await page.getByRole('link', { name: 'Active' }).click(); - }); - - await test.step('Showing completed items', async () => { - await page.getByRole('link', { name: 'Completed' }).click(); - }); - - await expect(todoItem).toHaveCount(1); - await page.goBack(); - await expect(todoItem).toHaveCount(2); - await page.goBack(); - await expect(todoItem).toHaveCount(3); - }); - - test('should allow me to display completed items', async ({ page }) => { - await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); - await checkNumberOfCompletedTodosInLocalStorage(page, 1); - await page.getByRole('link', { name: 'Completed' }).click(); - await expect(page.getByTestId('todo-item')).toHaveCount(1); - }); - - test('should allow me to display all items', async ({ page }) => { - await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); - await checkNumberOfCompletedTodosInLocalStorage(page, 1); - await page.getByRole('link', { name: 'Active' }).click(); - await page.getByRole('link', { name: 'Completed' }).click(); - await page.getByRole('link', { name: 'All' }).click(); - await expect(page.getByTestId('todo-item')).toHaveCount(3); - }); - - test('should highlight the currently applied filter', async ({ page }) => { - await expect(page.getByRole('link', { name: 'All' })).toHaveClass('selected'); - - //create locators for active and completed links - const activeLink = page.getByRole('link', { name: 'Active' }); - const completedLink = page.getByRole('link', { name: 'Completed' }); - await activeLink.click(); - - // Page change - active items. - await expect(activeLink).toHaveClass('selected'); - await completedLink.click(); - - // Page change - completed items. - await expect(completedLink).toHaveClass('selected'); - }); -}); - -async function createDefaultTodos(page: Page) { - // create a new todo locator - const newTodo = page.getByPlaceholder('What needs to be done?'); - - for (const item of TODO_ITEMS) { - await newTodo.fill(item); - await newTodo.press('Enter'); - } -} - -async function checkNumberOfTodosInLocalStorage(page: Page, expected: number) { - return await page.waitForFunction(e => { - return JSON.parse(localStorage['react-todos']).length === e; - }, expected); -} - -async function checkNumberOfCompletedTodosInLocalStorage(page: Page, expected: number) { - return await page.waitForFunction(e => { - return JSON.parse(localStorage['react-todos']).filter((todo: any) => todo.completed).length === e; - }, expected); -} - -async function checkTodosInLocalStorage(page: Page, title: string) { - return await page.waitForFunction(t => { - return JSON.parse(localStorage['react-todos']).map((todo: any) => todo.title).includes(t); - }, title); -} diff --git a/scripts/build_npm.ts b/scripts/build_npm.ts index 7658d93..2bdbdb1 100644 --- a/scripts/build_npm.ts +++ b/scripts/build_npm.ts @@ -7,9 +7,6 @@ await build({ entryPoints: ["./mod.ts", { name: './bun-sqlite-store', path: './src/store/bun/BunSqliteStore.ts' - }, { - name: './cloudflare-d1-store', - path: './src/store/cloudflare/CloudflareD1Store.ts' }], outDir: "./npm", shims: { diff --git a/scripts/generate_key.ts b/scripts/generate_key.ts deleted file mode 100644 index c703dd7..0000000 --- a/scripts/generate_key.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { encode } from 'https://deno.land/std@0.165.0/encoding/base64.ts' - -const key = await crypto.subtle.generateKey( - { - name: 'AES-GCM', - length: 128 - }, - true, - [ - 'encrypt', - 'decrypt', - ] -) - -const key_buffer = await crypto.subtle.exportKey('raw', key) - -const key_string = encode(key_buffer) - -console.log(key_string) \ No newline at end of file diff --git a/src/store/cloudflare/CloudflareD1Store.ts b/src/store/cloudflare/CloudflareD1Store.ts deleted file mode 100644 index 4fe9512..0000000 --- a/src/store/cloudflare/CloudflareD1Store.ts +++ /dev/null @@ -1,35 +0,0 @@ -import Store from '../Store.ts' -import { SessionData } from '../../Session.ts' - -export class CloudflareD1Store implements Store { - db: any - tableName: string - - constructor(tableName: string = 'sessions') { - this.tableName = tableName - } - - async getSessionById(sessionId?: string|undefined) { - const session = await this.db.prepare(`SELECT data FROM ${ this.tableName } WHERE id = ?`) - .bind(sessionId) - .first('data') - - if (session) { - return JSON.parse(session) - } else { - return null - } - } - - async createSession(sessionId: string,initialData: SessionData) { - await this.db.prepare(`INSERT INTO ${ this.tableName } (id, data) VALUES (?, ?)`).bind(sessionId, JSON.stringify(initialData)).run() - } - - async deleteSession(sessionId: string) { - await this.db.prepare(`DELETE FROM ${ this.tableName } WHERE id = ?`).bind(sessionId).run() - } - - async persistSessionData(sessionId: string, sessionData: SessionData) { - await this.db.prepare(`UPDATE ${ this.tableName } SET data = ? WHERE id = ?`).bind(JSON.stringify(sessionData), sessionId).run() - } -} \ No newline at end of file diff --git a/src/store/deno/DenoKvStore.ts b/src/store/deno/DenoKvStore.ts deleted file mode 100644 index d7f3e40..0000000 --- a/src/store/deno/DenoKvStore.ts +++ /dev/null @@ -1,29 +0,0 @@ -import Store from '../Store.ts' -import { SessionData } from '../../Session.ts' - -export class DenoKvStore implements Store { - kv: Deno.Kv - collectionName: string - - constructor(kv: Deno.Kv, collectionName = 'sessions') { - this.kv = kv - this.collectionName = collectionName - } - - async getSessionById(sessionId: string) { - const session = (await this.kv.get([this.collectionName, sessionId])).value - return session as SessionData - } - - async createSession(sessionId: string, initialData: SessionData) { - await this.kv.set([this.collectionName, sessionId], initialData) - } - - async deleteSession(sessionId: string){ - await this.kv.delete([this.collectionName, sessionId]) - } - - async persistSessionData(sessionId: string, sessionData: SessionData) { - await this.kv.set([this.collectionName, sessionId], sessionData) - } -} \ No newline at end of file diff --git a/src/store/deno/DenoSqliteStore.ts b/src/store/deno/DenoSqliteStore.ts deleted file mode 100644 index 87545f0..0000000 --- a/src/store/deno/DenoSqliteStore.ts +++ /dev/null @@ -1,38 +0,0 @@ -import Store from '../Store.ts' -import { SessionData } from '../../Session.ts' -import { DB } from 'https://deno.land/x/sqlite@v3.9.1/mod.ts' - -export class DenoSqliteStore implements Store { - db: DB - tableName: string - - constructor(db : DB, tableName = 'sessions') { - this.db = db - this.tableName = tableName - this.db.query(`CREATE TABLE IF NOT EXISTS ${this.tableName} (id TEXT NOT NULL PRIMARY KEY, data TEXT)`) - } - - getSessionById(sessionId : string) { - let session = '' - - for (const [sess] of this.db.query(`SELECT data FROM ${this.tableName} WHERE id = ?`, [sessionId])) { - session = sess - } - - return session ? JSON.parse(session) as SessionData : null; - } - - createSession(sessionId : string, initialData : SessionData) { - this.db.query(`INSERT INTO ${this.tableName} (id, data) VALUES (?, ?)`, [sessionId, JSON.stringify(initialData)]); - } - - deleteSession(sessionId : string) { - this.db.query(`DELETE FROM ${this.tableName} WHERE id = ?`, [sessionId]) - } - - persistSessionData(sessionId : string, sessionData : SessionData) { - this.db.query(`UPDATE ${this.tableName} SET data = ? WHERE id = ?`, [ - JSON.stringify(sessionData), sessionId - ]); - } -} \ No newline at end of file diff --git a/test/deno/MakeStore.ts b/test/deno/MakeStore.ts index 9730c85..b3f18d8 100644 --- a/test/deno/MakeStore.ts +++ b/test/deno/MakeStore.ts @@ -1,7 +1,4 @@ import { Store, CookieStore, MemoryStore } from '../../mod.ts' -import { DenoKvStore } from '../../src/store/deno/DenoKvStore.ts' -import { DenoSqliteStore } from '../../src/store/deno/DenoSqliteStore.ts' -import { DB } from 'https://deno.land/x/sqlite@v3.9.1/mod.ts' export async function MakeDenoStore(storeDriver: string | undefined): Promise { let store: Store | CookieStore @@ -13,16 +10,6 @@ export async function MakeDenoStore(storeDriver: string | undefined): Promise