diff --git a/package.json b/package.json index 7868f0a58..f6238bd63 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,7 @@ "lint-staged": "^13.2.0", "prettier": "2.8.3", "typedoc-plugin-markdown": "^3.14.0", - "typescript": "4.9.5", - "wrangler": "^2.12.3" + "typescript": "4.9.5" }, "prettier": { "trailingComma": "es5", @@ -36,7 +35,7 @@ }, "dependencies": { "depcheck": "^1.4.3", - "typedoc": "^0.23.26", + "typedoc": "^0.23.28", "typedoc-plugin-missing-exports": "^1.0.0" }, "packageManager": "pnpm@7.24.3", diff --git a/packages/access-api/migrations/0007_add_delegations_v3.sql b/packages/access-api/migrations/0007_add_delegations_v3.sql new file mode 100644 index 000000000..4220ef3e0 --- /dev/null +++ b/packages/access-api/migrations/0007_add_delegations_v3.sql @@ -0,0 +1,20 @@ +-- Migration number: 0007 2023-03-20T23:48:40.469Z + +/* +goal: add a new table to store delegations in +which doesn't have a 'bytes' column. + +context: we're going to start storing bytes outside of the database (e.g. in R2) +*/ + +CREATE TABLE + IF NOT EXISTS delegations_v3 ( + /* cidv1 dag-ucan/dag-cbor sha2-256 */ + cid TEXT NOT NULL PRIMARY KEY, + audience TEXT NOT NULL, + issuer TEXT NOT NULL, + expiration TEXT, + inserted_at TEXT NOT NULL DEFAULT (strftime ('%Y-%m-%dT%H:%M:%fZ', 'now')), + updated_at TEXT NOT NULL DEFAULT (strftime ('%Y-%m-%dT%H:%M:%fZ', 'now')), + UNIQUE (cid) + ); diff --git a/packages/access-api/package.json b/packages/access-api/package.json index f144fac5b..15b303316 100644 --- a/packages/access-api/package.json +++ b/packages/access-api/package.json @@ -28,7 +28,7 @@ "@web3-storage/capabilities": "workspace:^", "@web3-storage/worker-utils": "0.4.3-dev", "kysely": "^0.23.4", - "kysely-d1": "^0.1.0", + "kysely-d1": "^0.3.0", "multiformats": "^11.0.2", "p-retry": "^5.1.2", "preact": "^10.11.3", @@ -38,9 +38,10 @@ "toucan-js": "^2.7.0" }, "devDependencies": { - "@cloudflare/workers-types": "^3.18.0", + "@cloudflare/workers-types": "^3.19.0", "@databases/split-sql-query": "^1.0.3", "@databases/sql": "^3.2.0", + "@miniflare/r2": "^2.12.1", "@sentry/cli": "2.7.0", "@types/assert": "^1.5.6", "@types/git-rev-sync": "^2.0.0", @@ -55,14 +56,14 @@ "git-rev-sync": "^3.0.2", "hd-scripts": "^4.0.0", "is-subset": "^0.1.1", - "miniflare": "^2.11.0", + "miniflare": "^2.12.1", "mocha": "^10.2.0", "p-wait-for": "^5.0.0", "process": "^0.11.10", "readable-stream": "^4.2.0", "sade": "^1.8.1", "typescript": "4.9.5", - "wrangler": "^2.8.0" + "wrangler": "^2.13.0" }, "eslintConfig": { "extends": [ diff --git a/packages/access-api/src/bindings.d.ts b/packages/access-api/src/bindings.d.ts index 04cc64515..2528ee98e 100644 --- a/packages/access-api/src/bindings.d.ts +++ b/packages/access-api/src/bindings.d.ts @@ -1,9 +1,4 @@ import type { Logging } from '@web3-storage/worker-utils/logging' -import type { - AccountTable, - DelegationTable, - SpaceTable, -} from '@web3-storage/access/types' import type { Handler as _Handler } from '@web3-storage/worker-utils/router' import { Spaces } from './models/spaces.js' import { Validations } from './models/validations.js' @@ -12,6 +7,7 @@ import { ConnectionView, Signer as EdSigner } from '@ucanto/principal/ed25519' import { Accounts } from './models/accounts.js' import { DelegationsStorage as Delegations } from './types/delegations.js' import { ProvisionsStorage } from './types/provisions.js' +import { R2Bucket } from '@miniflare/r2' export {} @@ -53,6 +49,10 @@ export interface Env { SPACES: KVNamespace VALIDATIONS: KVNamespace W3ACCESS_METRICS: AnalyticsEngine + /** + * will be used for storing env.models.delegations CARs + */ + DELEGATIONS_BUCKET: R2Bucket // eslint-disable-next-line @typescript-eslint/naming-convention __D1_BETA__: D1Database } @@ -108,9 +108,3 @@ export interface ModuleWorker { export interface D1ErrorRaw extends Error { cause: Error & { code: string } } - -export interface D1Schema { - spaces: SpaceTable - accounts: AccountTable - delegations: DelegationTable -} diff --git a/packages/access-api/src/config.js b/packages/access-api/src/config.js index aded14a99..c6f1fa21c 100644 --- a/packages/access-api/src/config.js +++ b/packages/access-api/src/config.js @@ -35,6 +35,12 @@ export function loadConfig(env) { } } + if (typeof env.DELEGATIONS_BUCKET !== 'object') { + throw new TypeError( + `expected env.DELEGATIONS_BUCKET to be an R2Bucket object, but got ${typeof env.DELEGATIONS_BUCKET}` + ) + } + return { DEBUG: boolValue(vars.DEBUG), ENV: parseRuntimeEnv(vars.ENV), @@ -67,6 +73,7 @@ export function loadConfig(env) { SPACES: env.SPACES, VALIDATIONS: env.VALIDATIONS, DB: /** @type {D1Database} */ (env.__D1_BETA__), + DELEGATIONS_BUCKET: env.DELEGATIONS_BUCKET, } } diff --git a/packages/access-api/src/models/accounts.js b/packages/access-api/src/models/accounts.js index 2feb1dbc5..0822e8de5 100644 --- a/packages/access-api/src/models/accounts.js +++ b/packages/access-api/src/models/accounts.js @@ -1,35 +1,29 @@ -// eslint-disable-next-line no-unused-vars import * as Ucanto from '@ucanto/interface' import { Kysely } from 'kysely' import { D1Dialect } from 'kysely-d1' import { GenericPlugin } from '../utils/d1.js' -/** - * @typedef {import('@web3-storage/access/src/types.js').DelegationRecord} DelegationRecord - */ - /** * Accounts */ export class Accounts { /** - * * @param {D1Database} d1 */ constructor(d1) { - /** @type {GenericPlugin} */ const objectPlugin = new GenericPlugin({ // eslint-disable-next-line unicorn/no-null expires_at: (v) => (typeof v === 'string' ? new Date(v) : null), inserted_at: (v) => new Date(v), updated_at: (v) => new Date(v), }) - this.d1 = /** @type {Kysely} */ ( - new Kysely({ - dialect: new D1Dialect({ database: d1 }), - plugins: [objectPlugin], - }) - ) + this.d1 = + /** @type {Kysely<{ accounts: import('@web3-storage/access/src/types.js').AccountTable }>} */ ( + new Kysely({ + dialect: new D1Dialect({ database: d1 }), + plugins: [objectPlugin], + }) + ) } /** diff --git a/packages/access-api/src/models/delegations.js b/packages/access-api/src/models/delegations.js index b18efa166..08ba0b25b 100644 --- a/packages/access-api/src/models/delegations.js +++ b/packages/access-api/src/models/delegations.js @@ -3,69 +3,89 @@ import { delegationsToBytes, bytesToDelegations, } from '@web3-storage/access/encoding' +import { base32 } from 'multiformats/bases/base32' +import { CID } from 'multiformats' /** - * @typedef {import('@web3-storage/access/src/types').DelegationTable} DelegationRow + * @typedef {import('../types/access-api-cf-db').R2Bucket} R2Bucket + */ + +/** + * @template {import('../types/access-api-cf-db').DelegationsV3Row} DelegationRow * @typedef {Omit} DelegationRowUpdate */ /** - * @typedef Tables - * @property {DelegationRow} delegations_v2 + * @template Tables + * @typedef {import("../types/database").Database} Database */ +export const delegationsV2TableName = /** @type {const} */ ('delegations_v2') + /** - * @typedef {import("../types/database").Database} DelegationsDatabase + * indicates that processing failed due to encountering an unexpected delegation. + * e.g. if a delegation could not be parsed from underlying storage */ +export class UnexpectedDelegation extends Error { + name = 'UnexpectedDelegation' +} -export const delegationsTable = /** @type {const} */ ('delegations_v2') +/** + * @param {Ucanto.Delegation} d + * @returns {DelegationRowUpdate} + */ +export function createDelegationRowUpdateV3(d) { + return { + cid: d.cid.toString(), + audience: d.audience.did(), + issuer: d.issuer.did(), + } +} /** - * DelegationsStorage that persists using SQL. - * * should work with cloudflare D1 + * @param {Array | Buffer | unknown} sqlValue - value from kysely 'bytes' table - in node it could be a Buffer. In cloudflare it might be an Array + * @returns {ArrayBuffer|undefined} - undefined if unable to convert */ -export class DbDelegationsStorage { - /** @type {DelegationsDatabase} */ - #db - #tables = { - delegations: delegationsTable, +export function delegationsTableBytesToArrayBuffer(sqlValue) { + if (ArrayBuffer.isView(sqlValue)) { + return new Uint8Array( + sqlValue.buffer, + sqlValue.byteOffset, + sqlValue.byteLength + ) } + if (Array.isArray(sqlValue)) { + return Uint8Array.from(sqlValue) + } +} + +export const delegationsV3Table = /** @type {const} */ (`delegations_v3`) + +/** + * @template {Database} DB + */ +export class DbDelegationsStorageWithR2 { + // @todo abstract away R2 specifics into DagStore: ~AsyncMap + /** @type {R2Bucket} */ + #dags + /** @type {DB} */ + #db + #delegationsTableName = delegationsV3Table + #getDagsKey = carFileKeyer /** - * @param {DelegationsDatabase} db + * @param {DB} db + * @param {R2Bucket} dags */ - constructor(db) { + constructor(db, dags) { this.#db = db + this.#dags = dags // eslint-disable-next-line no-void void ( /** @type {import('../types/delegations').DelegationsStorage} */ (this) ) } - async count() { - const { size } = await this.#db - .selectFrom(this.#tables.delegations) - .select((e) => e.fn.count('cid').as('size')) - .executeTakeFirstOrThrow() - return BigInt(size) - } - - /** - * @param {import('../types/delegations').Query} query - */ - async *find(query) { - const { audience } = query - const { delegations } = this.#tables - const selection = await this.#db - .selectFrom(delegations) - .selectAll() - .where(`${delegations}.audience`, '=', audience) - .execute() - for await (const row of selection) { - yield rowToDelegation(row) - } - } - /** * store items * @@ -76,19 +96,37 @@ export class DbDelegationsStorage { if (delegations.length === 0) { return } - const values = delegations.map((d) => createDelegationRowUpdate(d)) + await writeDelegations(this.#dags, delegations, this.#getDagsKey) + const values = delegations.map((d) => createDelegationRowUpdateV3(d)) + // @todo - if this fails, undo writeDelegations that dont need to be stored await this.#db - .insertInto(this.#tables.delegations) + .insertInto(this.#delegationsTableName) .values(values) .onConflict((oc) => oc.column('cid').doNothing()) - .executeTakeFirst() + .execute() + } + + /** @returns {Promise} */ + async count() { + return count(this.#db, this.#delegationsTableName) } /** - * iterate through all stored items - * - * @returns {AsyncIterableIterator} + * @param {import('../types/delegations').Query} query */ + async *find(query) { + const { audience } = query + const delegations = this.#delegationsTableName + const selection = await this.#db + .selectFrom(delegations) + .select(['cid']) + .where(`${delegations}.audience`, '=', audience) + .execute() + for await (const row of selection) { + yield this.#rowToDelegation(row) + } + } + async *[Symbol.asyncIterator]() { if (!this.#db.canStream) { throw Object.assign( @@ -99,83 +137,85 @@ export class DbDelegationsStorage { ) } for await (const row of this.#db - .selectFrom(this.#tables.delegations) - .select(['bytes']) + .selectFrom(this.#delegationsTableName) + .select(['cid']) .stream()) { - yield rowToDelegation(row) + yield this.#rowToDelegation(row) } } + + /** + * @param {Pick} row + * @param {R2Bucket} dags + * @param {(d: { cid: Ucanto.Delegation['cid'] }) => string} keyer - builds k/v key strings for each delegation + * @returns {Promise} + */ + async #rowToDelegation(row, dags = this.#dags, keyer = this.#getDagsKey) { + const cid = /** @type {Ucanto.UCANLink} */ (CID.parse(row.cid)) + const key = keyer({ cid }) + const carBytesR2 = await dags.get(key) + if (!carBytesR2) { + throw new Error(`failed to read car bytes for cid ${row.cid} key ${key}`) + } + const delegations = bytesToDelegations( + new Uint8Array(await carBytesR2.arrayBuffer()) + ) + const delegation = delegations.find((d) => d.cid.equals(cid)) + if (!delegation) { + throw new Error(`failed to parse delegation with expected cid ${row.cid}`) + } + return delegation + } } /** - * indicates that processing failed due to encountering an unexpected delegation. - * e.g. if a delegation could not be parsed from underlying storage + * @typedef {import('../types/access-api-cf-db').DelegationsV3Row} DelegationsV3Row */ -class UnexpectedDelegation extends Error { - name = 'UnexpectedDelegation' + +/** + * @template {string} TableName + * @template {Record} Tables + * @param {import('../types/database').Database} db + * @param {TableName} delegationsTable + * @returns {Promise} - count of table + */ +async function count(db, delegationsTable) { + const { size } = await db + .selectFrom(delegationsTable) + .select((e) => e.fn.count('cid').as('size')) + .executeTakeFirstOrThrow() + return BigInt(size) } /** - * @param {Pick} row - * @returns {Ucanto.Delegation} + * @param {{ cid: Ucanto.Delegation['cid'] }} ucan */ -function rowToDelegation(row) { - /** @type {Ucanto.Delegation[]} */ - let delegations = [] - try { - delegations = bytesToDelegations(row.bytes) - } catch (error) { - if ( - typeof error === 'object' && - error && - error.toString() === 'TypeError: Input should be a non-empty Uint8Array.' - ) { - throw Object.assign( - new UnexpectedDelegation(`failed to create delegation from row`, { - cause: error, - }), - // adding these so they appear in sentry et al and can aid debugging - { - row, - } - ) - } - throw error - } - if (delegations.length !== 1) { - throw new Error( - `unexpected number of delegations from bytes: ${delegations.length}` - ) - } - return delegations[0] +function carFileKeyer(ucan) { + const key = /** @type {const} */ (`${ucan.cid.toString(base32)}.car`) + return key } /** - * @param {Ucanto.Delegation} d - * @returns {DelegationRowUpdate} + * @param {R2Bucket} bucket + * @param {Iterable} delegations + * @param {(d: { cid: Ucanto.Delegation['cid'] }) => string} keyer - builds k/v key strings for each delegation */ -export function createDelegationRowUpdate(d) { - return { - cid: d.cid.toV1().toString(), - audience: d.audience.did(), - issuer: d.issuer.did(), - bytes: delegationsToBytes([d]), - } +async function writeDelegations(bucket, delegations, keyer) { + return writeEntries( + bucket, + [...delegations].map((delegation) => { + const key = keyer(delegation) + const carBytes = delegationsToBytes([delegation]) + const value = carBytes + return /** @type {[key: string, value: Uint8Array]} */ ([key, value]) + }) + ) } /** - * @param {Array | Buffer | unknown} sqlValue - value from kysely 'bytes' table - in node it could be a Buffer. In cloudflare it might be an Array - * @returns {ArrayBuffer|undefined} - undefined if unable to convert + * @param {R2Bucket} bucket + * @param {Iterable} entries */ -export function delegationsTableBytesToArrayBuffer(sqlValue) { - if (ArrayBuffer.isView(sqlValue)) { - return new Uint8Array( - sqlValue.buffer, - sqlValue.byteOffset, - sqlValue.byteLength - ) - } - if (Array.isArray(sqlValue)) { - return Uint8Array.from(sqlValue) - } +async function writeEntries(bucket, entries) { + await Promise.all([...entries].map(([key, value]) => bucket.put(key, value))) } diff --git a/packages/access-api/src/models/provisions.js b/packages/access-api/src/models/provisions.js index ab62340e5..2322b458b 100644 --- a/packages/access-api/src/models/provisions.js +++ b/packages/access-api/src/models/provisions.js @@ -95,15 +95,9 @@ export class DbProvisions { try { await insert.executeTakeFirstOrThrow() } catch (error) { - const d1Error = extractD1Error(error) - switch (d1Error?.code) { - case 'SQLITE_CONSTRAINT_PRIMARYKEY': { - primaryKeyError = error - break - } - default: { - throw error - } + primaryKeyError = getCidUniquenessError(error) + if (!primaryKeyError) { + throw error } } @@ -183,15 +177,34 @@ function deepEqual(x, y) { * @param {unknown} error */ function extractD1Error(error) { - const isD1 = /D1_ALL_ERROR/.test(String(error)) + const isD1 = /D1_(ALL_)?ERROR/.test(String(error)) if (!isD1) return const cause = error && typeof error === 'object' && 'cause' in error && error.cause const code = - cause && - typeof cause === 'object' && - 'code' in cause && - typeof cause.code === 'string' && - cause.code + (cause && + typeof cause === 'object' && + 'code' in cause && + typeof cause.code === 'string' && + cause.code) || + undefined return { cause, code } } + +/** + * return whether or not the provided parameter indicates an error + * writing provision to kysely database because there is already an entry + * for the written a cid + * + * @param {unknown} error + */ +function getCidUniquenessError(error) { + const d1Error = extractD1Error(error) + if (d1Error?.code === 'SQLITE_CONSTRAINT_PRIMARYKEY') { + return d1Error + } else if ( + /UNIQUE constraint failed: provisions.cid/.test(String(d1Error?.cause)) + ) { + return d1Error + } +} diff --git a/packages/access-api/src/models/spaces.js b/packages/access-api/src/models/spaces.js index f136710b1..8db246452 100644 --- a/packages/access-api/src/models/spaces.js +++ b/packages/access-api/src/models/spaces.js @@ -32,7 +32,7 @@ export class Spaces { inserted_at: (v) => new Date(v), updated_at: (v) => new Date(v), }) - this.d1 = /** @type {Kysely} */ ( + this.d1 = /** @type {Kysely<{ spaces: SpaceTable }>} */ ( new Kysely({ dialect: new D1Dialect({ database: d1 }), plugins: [objectPlugin], diff --git a/packages/access-api/src/service/voucher-redeem.js b/packages/access-api/src/service/voucher-redeem.js index 788302dcf..304eedf93 100644 --- a/packages/access-api/src/service/voucher-redeem.js +++ b/packages/access-api/src/service/voucher-redeem.js @@ -5,6 +5,7 @@ import * as Server from '@ucanto/server' import * as Voucher from '@web3-storage/capabilities/voucher' import { Delegation } from '@ucanto/core' import { Failure } from '@ucanto/server' +import { D1Error } from '../utils/d1.js' /** * @param {import('../bindings').RouteContext} ctx */ @@ -46,7 +47,7 @@ export function voucherRedeemProvider(ctx) { ) if (error) { - if ('code' in error && error.code === 'SQLITE_CONSTRAINT_PRIMARYKEY') { + if (isSpaceAlreadyRegisteredError(error)) { return new Failure(`Space ${capability.nb.space} already registered.`) } else { throw error @@ -69,3 +70,19 @@ export function voucherRedeemProvider(ctx) { } }) } + +/** + * @param {D1Error} error + */ +function isSpaceAlreadyRegisteredError(error) { + if ('code' in error && error.code === 'SQLITE_CONSTRAINT_PRIMARYKEY') { + return true + } + if ( + 'cause' in error && + /UNIQUE constraint failed: spaces.did/.test(String(error.cause)) + ) { + return true + } + return false +} diff --git a/packages/access-api/src/types/access-api-cf-db.ts b/packages/access-api/src/types/access-api-cf-db.ts new file mode 100644 index 000000000..c67667383 --- /dev/null +++ b/packages/access-api/src/types/access-api-cf-db.ts @@ -0,0 +1,19 @@ +import { ColumnType, Generated } from 'kysely' + +export { R2Bucket } from '@miniflare/r2' + +// v3 +// * dropped 'bytes' column in favor of storing them in R2 (see DbDelegationsStorageWithR2) + +export interface DelegationsV3Row { + cid: string + audience: `did:${string}` + issuer: `did:${string}` + expires_at: Date | null + inserted_at: Generated + updated_at: ColumnType +} + +export interface DelegationsV3Tables { + delegations_v3: DelegationsV3Row +} diff --git a/packages/access-api/src/utils/context.js b/packages/access-api/src/utils/context.js index c1769dd4c..82cd2c143 100644 --- a/packages/access-api/src/utils/context.js +++ b/packages/access-api/src/utils/context.js @@ -10,7 +10,7 @@ import * as Email from './email.js' import { createUploadApiConnection } from '../service/upload-api-proxy.js' import { DID } from '@ucanto/core' import { - DbDelegationsStorage, + DbDelegationsStorageWithR2, delegationsTableBytesToArrayBuffer, } from '../models/delegations.js' import { createD1Database } from './d1.js' @@ -69,12 +69,13 @@ export function getContext(request, env, ctx) { config, url, models: { - delegations: new DbDelegationsStorage( + delegations: new DbDelegationsStorageWithR2( createD1Database(config.DB, { bytes: (v) => { return delegationsTableBytesToArrayBuffer(v) ?? v }, - }) + }), + config.DELEGATIONS_BUCKET ), spaces: new Spaces(config.DB), validations: new Validations(config.VALIDATIONS), diff --git a/packages/access-api/src/utils/d1.js b/packages/access-api/src/utils/d1.js index a8ab9b60c..3d17bb6a1 100644 --- a/packages/access-api/src/utils/d1.js +++ b/packages/access-api/src/utils/d1.js @@ -3,7 +3,7 @@ import * as Ucanto from '@ucanto/interface' import { Kysely, OperationNodeTransformer } from 'kysely' import { D1Dialect } from 'kysely-d1' -import { isPlainObject, isDate, isBuffer } from './common.js' +import { isPlainObject, isDate } from './common.js' /** * @typedef {import('kysely').KyselyPlugin} KyselyPlugin @@ -74,15 +74,6 @@ export class GenericPlugin { rows: args.result.rows.map((row) => { const custom = {} for (const [key, value] of Object.entries(row)) { - if (isBuffer(value)) { - // @ts-ignore - custom[key] = new Uint8Array( - value.buffer, - value.byteOffset, - value.byteLength - ) - } - // @ts-ignore if (this.resultTransforms[key]) { // @ts-ignore diff --git a/packages/access-api/test/delegations-storage.test.js b/packages/access-api/test/delegations-storage.test.js index 8d8409228..d27114744 100644 --- a/packages/access-api/test/delegations-storage.test.js +++ b/packages/access-api/test/delegations-storage.test.js @@ -1,9 +1,5 @@ import { context } from './helpers/context.js' -import { - createDelegationRowUpdate, - DbDelegationsStorage, - delegationsTable, -} from '../src/models/delegations.js' +import { DbDelegationsStorageWithR2 } from '../src/models/delegations.js' import { createD1Database } from '../src/utils/d1.js' import * as assert from 'node:assert' import { createSampleDelegation } from '../src/utils/ucan.js' @@ -11,22 +7,81 @@ import * as principal from '@ucanto/principal' import * as Ucanto from '@ucanto/interface' import * as ucanto from '@ucanto/core' import { collect } from 'streaming-iterables' +import { CID } from 'multiformats' +import { base32 } from 'multiformats/bases/base32' -describe('DbDelegationsStorage', () => { - it('should persist delegations', async () => { - const { d1 } = await context() - const storage = new DbDelegationsStorage(createD1Database(d1)) +describe('DelegationsStorage with sqlite+R2', () => { + testVariant(createDbDelegationsStorageVariantWithR2, it) + testCloudflareVariant(createDbDelegationsStorageVariantWithR2, it) +}) + +/** + * @param {object} [opts] + * @param {Ucanto.Signer} [opts.issuer] + * @param {Ucanto.Principal} [opts.audience] + * @param {Ucanto.Capabilities} [opts.capabilities] + * @returns {Promise} + */ +async function createDelegation(opts = {}) { + const { + issuer = await principal.ed25519.generate(), + audience = issuer, + capabilities = [ + { + can: 'test/*', + with: issuer.did(), + }, + ], + } = opts + return await ucanto.delegate({ + issuer, + audience, + capabilities, + }) +} + +/** + * create a variant of DelegationsStorage that uses sqlite for most things + * but stores blobs in a separate r2-like key/value store + * + * @see https://github.com/web3-storage/w3protocol/issues/571 + */ +async function createDbDelegationsStorageVariantWithR2() { + const { d1, mf } = await context() + const accessApiR2 = await mf.getR2Bucket('ACCESS_API_R2') + const delegationsStorage = new DbDelegationsStorageWithR2( + createD1Database(d1), + accessApiR2 + ) + return { + d1, + delegations: delegationsStorage, + r2: accessApiR2, + } +} + +/** + * @typedef {object} DelegationsStorageVariant + * @property {Pick} delegations + */ + +/** + * @param {() => Promise} createVariant - create a new test context + * @param {(name: string, test: () => Promise) => void} test - name a test + */ +function testVariant(createVariant, test) { + test('should persist delegations', async () => { + const { delegations: delegationsStorage } = await createVariant() const count = Math.round(Math.random() * 10) const delegations = await Promise.all( Array.from({ length: count }).map(() => createSampleDelegation()) ) - await storage.putMany(...delegations) - assert.deepEqual(await storage.count(), delegations.length) + await delegationsStorage.putMany(...delegations) + assert.deepEqual(await delegationsStorage.count(), delegations.length) }) - - it('can retrieve delegations by audience', async () => { - const { issuer, d1 } = await context() - const delegations = new DbDelegationsStorage(createD1Database(d1)) + test('can retrieve delegations by audience', async () => { + const { delegations } = await createVariant() + const issuer = await principal.ed25519.generate() const alice = await principal.ed25519.generate() const delegationsForAlice = await Promise.all( @@ -69,67 +124,64 @@ describe('DbDelegationsStorage', () => { ) assert.deepEqual(carolDelegations.length, 0) }) +} - it('find throws UnexpectedDelegation when encountering row with empty bytes', async () => { - const { d1, issuer } = await context() - const db = createD1Database(d1) - const delegations = new DbDelegationsStorage(db) - const row = createDelegationRowUpdate( - await ucanto.delegate({ - issuer, - audience: issuer, - capabilities: [{ can: '*', with: 'ucan:*' }], - }) - ) - // insert row with empty bytes - await db - .insertInto(delegationsTable) - .values([ - { - ...row, - bytes: Uint8Array.from([]), - }, - ]) - .onConflict((oc) => oc.column('cid').doNothing()) - .execute() - // now try to find - const find = () => collect(delegations.find({ audience: issuer.did() })) - let findError - try { - await find() - } catch (error) { - findError = error +/** + * @param {() => Promise} createVariant - create a new test context + * @param {(name: string, test: () => Promise) => void} test - name a test + */ +function testCloudflareVariant(createVariant, test) { + test('puts into d1+r2', async () => { + const { d1, delegations, r2 } = await createVariant() + const multibasePrefixes = { base32: base32.prefix } + const expectMultibase = 'base32' + const multihashCodes = { + // https://github.com/multiformats/multicodec/blob/aa0c3a41473c0a3796cdf2175ac5552989b2a905/table.csv#L9 + 'sha2-256': 0x12, } - assert.ok(findError && typeof findError === 'object') + const expectMultihash = multihashCodes['sha2-256'] + + const ucan1 = await createSampleDelegation() + await delegations.putMany(ucan1) + const listResult = await r2.list() + assert.deepEqual(listResult.objects.length, 1) + const r2KeyCidString = listResult.objects[0].key.split('.')[0] + assert.deepEqual( - 'name' in findError && findError?.name, - 'UnexpectedDelegation' + r2KeyCidString[0], + multibasePrefixes[expectMultibase], + `r2 key cid string uses multibase ${expectMultibase}` ) - assert.ok('row' in findError, 'UnexpectedDelegation error contains row') - }) -}) + const r2KeyCid = CID.parse(r2KeyCidString) -/** - * @param {object} [opts] - * @param {Ucanto.Signer} [opts.issuer] - * @param {Ucanto.Principal} [opts.audience] - * @param {Ucanto.Capabilities} [opts.capabilities] - * @returns {Promise} - */ -async function createDelegation(opts = {}) { - const { - issuer = await principal.ed25519.generate(), - audience = issuer, - capabilities = [ - { - can: 'test/*', - with: issuer.did(), - }, - ], - } = opts - return await ucanto.delegate({ - issuer, - audience, - capabilities, + assert.deepEqual(r2KeyCid.version, 1) + assert.deepEqual(r2KeyCid.code, ucanto.UCAN.code) + assert.deepEqual( + r2KeyCid.multihash.code, + expectMultihash, + `keyCid multihash code is ${expectMultihash}` + ) + + // d1 cid column + const delegationsFromD1 = await d1 + .prepare(`select cid from delegations_v3`) + .all() + assert.equal(delegationsFromD1.results?.length, 1) + const d1CidString = /** @type {{cid:string}} */ ( + delegationsFromD1.results?.[0] + ).cid + assert.deepEqual( + d1CidString[0], + multibasePrefixes[expectMultibase], + `d1 cid column uses multibase ${expectMultibase}` + ) + const d1Cid = CID.parse(d1CidString) + assert.deepEqual(d1Cid.version, 1) + assert.deepEqual(d1Cid.code, ucanto.UCAN.code) + assert.deepEqual( + d1Cid.multihash.code, + expectMultihash, + `d1Cid multihash code is ${expectMultihash}` + ) }) } diff --git a/packages/access-api/test/helpers/context.js b/packages/access-api/test/helpers/context.js index 6710f985e..8db2762d8 100644 --- a/packages/access-api/test/helpers/context.js +++ b/packages/access-api/test/helpers/context.js @@ -14,7 +14,7 @@ dotenv.config({ }) /** - * @typedef {Omit} AccessApiBindings - bindings object expected by access-api workers + * @typedef {Omit} AccessApiBindings - bindings object expected by access-api workers */ /** diff --git a/packages/access-api/wrangler.toml b/packages/access-api/wrangler.toml index e9579d28d..fd22ec0b1 100644 --- a/packages/access-api/wrangler.toml +++ b/packages/access-api/wrangler.toml @@ -25,6 +25,10 @@ binding = "__D1_BETA__" database_name = "spaces-dev" database_id = "7c676e0c-b9e7-4711-97c8-7b1c8eb229ae" +[[r2_buckets]] +binding = "DELEGATIONS_BUCKET" +bucket_name = "w3up-delegations-dev-0" + [vars] ENV = "dev" DEBUG = "true" @@ -72,7 +76,9 @@ d1_databases = [ unsafe = { bindings = [ { type = "analytics_engine", dataset = "W3ACCESS_METRICS", name = "W3ACCESS_METRICS" }, ] } - +[[env.staging.r2_buckets]] +binding = "DELEGATIONS_BUCKET" +bucket_name = "w3up-delegations-staging-0" # Production [env.production] @@ -89,6 +95,9 @@ d1_databases = [ unsafe = { bindings = [ { type = "analytics_engine", dataset = "W3ACCESS_METRICS", name = "W3ACCESS_METRICS" }, ] } +[[env.production.r2_buckets]] +binding = "DELEGATIONS_BUCKET" +bucket_name = "w3up-delegations-prod-0" [env.production.vars] DEBUG = "false" DID = "did:web:web3.storage" diff --git a/packages/access-client/src/types.ts b/packages/access-client/src/types.ts index 8777f8998..e011118a4 100644 --- a/packages/access-client/src/types.ts +++ b/packages/access-client/src/types.ts @@ -93,18 +93,6 @@ export interface AccountTable { } export type AccountRecord = Selectable -export interface DelegationTable { - cid: string - bytes: Uint8Array - audience: URI<'did:'> - issuer: URI<'did:'> - expires_at: Date | null - inserted_at: Generated - updated_at: ColumnType -} - -export type DelegationRecord = Selectable - export interface SpaceTableMetadata { space: SpaceMeta agent: AgentMeta diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ebbcf1aec..91c970877 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,30 +9,29 @@ importers: docusaurus-plugin-typedoc: ^0.18.0 lint-staged: ^13.2.0 prettier: 2.8.3 - typedoc: ^0.23.26 + typedoc: ^0.23.28 typedoc-plugin-markdown: ^3.14.0 typedoc-plugin-missing-exports: ^1.0.0 typescript: 4.9.5 - wrangler: ^2.12.3 dependencies: depcheck: 1.4.3 - typedoc: 0.23.26_typescript@4.9.5 - typedoc-plugin-missing-exports: 1.0.0_typedoc@0.23.26 + typedoc: 0.23.28_typescript@4.9.5 + typedoc-plugin-missing-exports: 1.0.0_typedoc@0.23.28 devDependencies: '@docusaurus/core': 2.3.1_typescript@4.9.5 - docusaurus-plugin-typedoc: 0.18.0_fukoy6jgklpnhaz4jx7cggnvsu + docusaurus-plugin-typedoc: 0.18.0_bhwftghzp2kjaeaba4ticsx7k4 lint-staged: 13.2.0 prettier: 2.8.3 - typedoc-plugin-markdown: 3.14.0_typedoc@0.23.26 + typedoc-plugin-markdown: 3.14.0_typedoc@0.23.28 typescript: 4.9.5 - wrangler: 2.12.3 packages/access-api: specifiers: - '@cloudflare/workers-types': ^3.18.0 + '@cloudflare/workers-types': ^3.19.0 '@databases/split-sql-query': ^1.0.3 '@databases/sql': ^3.2.0 '@ipld/dag-ucan': ^3.2.0 + '@miniflare/r2': ^2.12.1 '@sentry/cli': 2.7.0 '@types/assert': ^1.5.6 '@types/git-rev-sync': ^2.0.0 @@ -57,8 +56,8 @@ importers: hd-scripts: ^4.0.0 is-subset: ^0.1.1 kysely: ^0.23.4 - kysely-d1: ^0.1.0 - miniflare: ^2.11.0 + kysely-d1: ^0.3.0 + miniflare: ^2.12.1 mocha: ^10.2.0 multiformats: ^11.0.2 p-retry: ^5.1.2 @@ -72,7 +71,7 @@ importers: streaming-iterables: ^7.1.0 toucan-js: ^2.7.0 typescript: 4.9.5 - wrangler: ^2.8.0 + wrangler: ^2.13.0 dependencies: '@ipld/dag-ucan': 3.2.0 '@ucanto/core': 5.2.0 @@ -85,7 +84,7 @@ importers: '@web3-storage/capabilities': link:../capabilities '@web3-storage/worker-utils': 0.4.3-dev kysely: 0.23.4 - kysely-d1: 0.1.0_kysely@0.23.4 + kysely-d1: 0.3.0_kysely@0.23.4 multiformats: 11.0.2 p-retry: 5.1.2 preact: 10.11.3 @@ -97,6 +96,7 @@ importers: '@cloudflare/workers-types': 3.19.0 '@databases/split-sql-query': 1.0.3_@databases+sql@3.3.0 '@databases/sql': 3.3.0 + '@miniflare/r2': 2.12.1 '@sentry/cli': 2.7.0 '@types/assert': 1.5.6 '@types/git-rev-sync': 2.0.0 @@ -111,14 +111,14 @@ importers: git-rev-sync: 3.0.2 hd-scripts: 4.0.0 is-subset: 0.1.1 - miniflare: 2.11.0 + miniflare: 2.12.1 mocha: 10.2.0 p-wait-for: 5.0.0 process: 0.11.10 readable-stream: 4.3.0 sade: 1.8.1 typescript: 4.9.5 - wrangler: 2.9.0 + wrangler: 2.13.0 packages/access-client: specifiers: @@ -1764,7 +1764,7 @@ packages: '@slorber/static-site-generator-webpack-plugin': 4.0.7 '@svgr/webpack': 6.5.1 autoprefixer: 10.4.14_postcss@8.4.21 - babel-loader: 8.3.0_h5x7dh6zbbyopr7jvxivhylqpa + babel-loader: 8.3.0_qtovpurzjlo3biun26ymnwui7i babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 @@ -1773,31 +1773,31 @@ packages: cli-table3: 0.6.3 combine-promises: 1.1.0 commander: 5.1.0 - copy-webpack-plugin: 11.0.0_webpack@5.76.2 + copy-webpack-plugin: 11.0.0_webpack@5.76.3 core-js: 3.29.1 - css-loader: 6.7.3_webpack@5.76.2 - css-minimizer-webpack-plugin: 4.2.2_7uczfu7hmoatiedqewdadkdxue + css-loader: 6.7.3_webpack@5.76.3 + css-minimizer-webpack-plugin: 4.2.2_6xivdjm2sml3syouufpdefilzi cssnano: 5.1.15_postcss@8.4.21 del: 6.1.1 detect-port: 1.5.1 escape-html: 1.0.3 eta: 2.0.1 - file-loader: 6.2.0_webpack@5.76.2 + file-loader: 6.2.0_webpack@5.76.3 fs-extra: 10.1.0 html-minifier-terser: 6.1.0 html-tags: 3.2.0 - html-webpack-plugin: 5.5.0_webpack@5.76.2 + html-webpack-plugin: 5.5.0_webpack@5.76.3 import-fresh: 3.3.0 leven: 3.1.0 lodash: 4.17.21 - mini-css-extract-plugin: 2.7.3_webpack@5.76.2 + mini-css-extract-plugin: 2.7.5_webpack@5.76.3 postcss: 8.4.21 - postcss-loader: 7.0.2_6puvukfnwbwq425eep7g4z27be + postcss-loader: 7.1.0_twwyhqqim6liv4fz2ggv7g4m5a prompts: 2.4.2 - react-dev-utils: 12.0.1_a37q6j7dwawz22saey2vgkpwqm + react-dev-utils: 12.0.1_t37drsge5fnqkss6ynqsf64hyi react-helmet-async: 1.3.0 react-loadable: /@docusaurus/react-loadable/5.5.2 - react-loadable-ssr-addon-v5-slorber: 1.0.1_vycmgd62fyq7p6lzattvftnbcy + react-loadable-ssr-addon-v5-slorber: 1.0.1_r7pi7vlw6nkfjbr5epugnhqe3u react-router: 5.3.4 react-router-config: 5.1.1_react-router@5.3.4 react-router-dom: 5.3.4 @@ -1805,16 +1805,16 @@ packages: semver: 7.3.8 serve-handler: 6.1.5 shelljs: 0.8.5 - terser-webpack-plugin: 5.3.7_webpack@5.76.2 + terser-webpack-plugin: 5.3.7_webpack@5.76.3 tslib: 2.5.0 update-notifier: 5.1.0 - url-loader: 4.1.1_35ful32yo3wjb53le3l6xb5doy + url-loader: 4.1.1_cj4axkvnwozfmnmvgy4d36yxaq wait-on: 6.0.1 - webpack: 5.76.2 + webpack: 5.76.3 webpack-bundle-analyzer: 4.8.0 - webpack-dev-server: 4.12.0_webpack@5.76.2 + webpack-dev-server: 4.13.1_webpack@5.76.3 webpack-merge: 5.8.0 - webpackbar: 5.0.2_webpack@5.76.2 + webpackbar: 5.0.2_webpack@5.76.3 transitivePeerDependencies: - '@docusaurus/types' - '@parcel/css' @@ -1870,7 +1870,7 @@ packages: '@docusaurus/utils': 2.3.1 '@mdx-js/mdx': 1.6.22 escape-html: 1.0.3 - file-loader: 6.2.0_webpack@5.76.2 + file-loader: 6.2.0_webpack@5.76.3 fs-extra: 10.1.0 image-size: 1.0.2 mdast-util-to-string: 2.0.0 @@ -1879,8 +1879,8 @@ packages: tslib: 2.5.0 unified: 9.2.2 unist-util-visit: 2.0.3 - url-loader: 4.1.1_35ful32yo3wjb53le3l6xb5doy - webpack: 5.76.2 + url-loader: 4.1.1_cj4axkvnwozfmnmvgy4d36yxaq + webpack: 5.76.3 transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -1920,7 +1920,7 @@ packages: dependencies: '@docusaurus/logger': 2.3.1 '@docusaurus/utils': 2.3.1 - joi: 17.8.4 + joi: 17.9.1 js-yaml: 4.1.0 tslib: 2.5.0 transitivePeerDependencies: @@ -1944,7 +1944,7 @@ packages: '@docusaurus/logger': 2.3.1 '@svgr/webpack': 6.5.1 escape-string-regexp: 4.0.0 - file-loader: 6.2.0_webpack@5.76.2 + file-loader: 6.2.0_webpack@5.76.3 fs-extra: 10.1.0 github-slugger: 1.5.0 globby: 11.1.0 @@ -1955,8 +1955,8 @@ packages: resolve-pathname: 3.0.0 shelljs: 0.8.5 tslib: 2.5.0 - url-loader: 4.1.1_35ful32yo3wjb53le3l6xb5doy - webpack: 5.76.2 + url-loader: 4.1.1_cj4axkvnwozfmnmvgy4d36yxaq + webpack: 5.76.3 transitivePeerDependencies: - '@swc/core' - esbuild @@ -1974,14 +1974,6 @@ packages: jsdoc-type-pratt-parser: 3.1.0 dev: true - /@esbuild-plugins/node-globals-polyfill/0.1.1_esbuild@0.14.51: - resolution: {integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==} - peerDependencies: - esbuild: '*' - dependencies: - esbuild: 0.14.51 - dev: true - /@esbuild-plugins/node-globals-polyfill/0.1.1_esbuild@0.16.3: resolution: {integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==} peerDependencies: @@ -1990,16 +1982,6 @@ packages: esbuild: 0.16.3 dev: true - /@esbuild-plugins/node-modules-polyfill/0.1.4_esbuild@0.14.51: - resolution: {integrity: sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==} - peerDependencies: - esbuild: '*' - dependencies: - esbuild: 0.14.51 - escape-string-regexp: 4.0.0 - rollup-plugin-node-polyfills: 0.2.1 - dev: true - /@esbuild-plugins/node-modules-polyfill/0.1.4_esbuild@0.16.3: resolution: {integrity: sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==} peerDependencies: @@ -2743,8 +2725,8 @@ packages: '@jest/schemas': 29.4.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.15.3 - '@types/yargs': 17.0.22 + '@types/node': 18.15.5 + '@types/yargs': 17.0.23 chalk: 4.1.2 dev: true @@ -2822,16 +2804,6 @@ packages: resolution: {integrity: sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==} dev: true - /@miniflare/cache/2.11.0: - resolution: {integrity: sha512-L/kc9AzidPwFuk2fwHpAEePi0kNBk6FWUq3ln+9beRCDrPEpfVrDRFpNleF1NFZz5//oeVMuo8F0IVUQGzR7+Q==} - engines: {node: '>=16.13'} - dependencies: - '@miniflare/core': 2.11.0 - '@miniflare/shared': 2.11.0 - http-cache-semantics: 4.1.1 - undici: 5.9.1 - dev: true - /@miniflare/cache/2.12.1: resolution: {integrity: sha512-6Pj5avy53qULTa13gWxGTDBuwX0yAzr4Zkzb0ZBh40bcbHp4vRkOk7PvHBoxV0M76JxQDHotGaW+ik510z5Xrg==} engines: {node: '>=16.13'} @@ -2842,14 +2814,6 @@ packages: undici: 5.20.0 dev: true - /@miniflare/cli-parser/2.11.0: - resolution: {integrity: sha512-JUmyRzEGAS6CouvXJwBh8p44onfw3KRpfq5JGXEuHModOGjTp6li7PQyCTNPV2Hv/7StAXWnTFGXeAqyDHuTig==} - engines: {node: '>=16.13'} - dependencies: - '@miniflare/shared': 2.11.0 - kleur: 4.1.5 - dev: true - /@miniflare/cli-parser/2.12.1: resolution: {integrity: sha512-iCh4wEyQow8Dha+zpKhjCCXEp6QWbsvE18H5CgeUFT1pX4B+akYIHzdn47Cr5zpuYyjenoL78bAz0IIHIeyeWw==} engines: {node: '>=16.13'} @@ -2858,22 +2822,6 @@ packages: kleur: 4.1.5 dev: true - /@miniflare/core/2.11.0: - resolution: {integrity: sha512-UFMFiCG0co36VpZkgFrSBnrxo71uf1x+cjlzzJi3khmMyDlnLu4RuIQsAqvKbYom6fi3G9Q8lTgM7JuOXFyjhw==} - engines: {node: '>=16.13'} - dependencies: - '@iarna/toml': 2.2.5 - '@miniflare/queues': 2.11.0 - '@miniflare/shared': 2.11.0 - '@miniflare/watcher': 2.11.0 - busboy: 1.6.0 - dotenv: 10.0.0 - kleur: 4.1.5 - set-cookie-parser: 2.5.1 - undici: 5.9.1 - urlpattern-polyfill: 4.0.3 - dev: true - /@miniflare/core/2.12.1: resolution: {integrity: sha512-729xXL6uoMgtja5J7B2WdWAjFfxb74Pk2QqM3VqkWqY3XNlKWI7+ofvb8S6kI6uFEPGj4ma263uYkEAgsvzBWg==} engines: {node: '>=16.13'} @@ -2890,14 +2838,6 @@ packages: urlpattern-polyfill: 4.0.3 dev: true - /@miniflare/d1/2.11.0: - resolution: {integrity: sha512-aDdBVQZ2C0Zs3+Y9ZbRctmuQxozPfpumwJ/6NG6fBadANvune/hW7ddEoxyteIEU9W3IgzVj8s4by4VvasX90A==} - engines: {node: '>=16.7'} - dependencies: - '@miniflare/core': 2.11.0 - '@miniflare/shared': 2.11.0 - dev: true - /@miniflare/d1/2.12.1: resolution: {integrity: sha512-2ldT7xEC7KxoaEJ7nCY9/AB/xwPjbm3mrmpiIspT0b5OgS640Pe9EU4c5bSmzGoUbLvwF+jb+LhLE1QaEbWkBw==} engines: {node: '>=16.7'} @@ -2906,16 +2846,6 @@ packages: '@miniflare/shared': 2.12.1 dev: true - /@miniflare/durable-objects/2.11.0: - resolution: {integrity: sha512-0cKJaMgraTEU1b4kqK8cjD2oTeOjA6QU3Y+lWiZT/k1PMHZULovrSFnjii7qZ8npf4VHSIN6XYPxhyxRyEM65Q==} - engines: {node: '>=16.13'} - dependencies: - '@miniflare/core': 2.11.0 - '@miniflare/shared': 2.11.0 - '@miniflare/storage-memory': 2.11.0 - undici: 5.9.1 - dev: true - /@miniflare/durable-objects/2.12.1: resolution: {integrity: sha512-/n9WIxvHavVUgT+Nf280wNOcmJQBG+eZuqOlORWW9RmXXbAzqzS2Mk2lmRDCzbq3xTXAcsndx6cdarQLNRUzBg==} engines: {node: '>=16.13'} @@ -2926,16 +2856,6 @@ packages: undici: 5.20.0 dev: true - /@miniflare/html-rewriter/2.11.0: - resolution: {integrity: sha512-olTqmuYTHnoTNtiA0vjQ/ixRfbwgPzDrAUbtXDCYW45VFbHfDVJrJGZX3Jg0HpSlxy86Zclle1SUxGbVDzxsBg==} - engines: {node: '>=16.13'} - dependencies: - '@miniflare/core': 2.11.0 - '@miniflare/shared': 2.11.0 - html-rewriter-wasm: 0.4.1 - undici: 5.9.1 - dev: true - /@miniflare/html-rewriter/2.12.1: resolution: {integrity: sha512-yezYzGRBxy7d/oomAUEftdnL4fq6YIek82LtQlXgzcdcbBDnkYADj8WqGV41tAI+V2+rjrFEc1RuCXx/I1yISw==} engines: {node: '>=16.13'} @@ -2946,23 +2866,6 @@ packages: undici: 5.20.0 dev: true - /@miniflare/http-server/2.11.0: - resolution: {integrity: sha512-sMLcrDFzqqAvnQmAUH0hRTo8sBjW79VZYfnIH5FAGSGcKX6kdAGs9RStdYZ4CftQCBAEQScX0KBsMx5FwJRe9Q==} - engines: {node: '>=16.13'} - dependencies: - '@miniflare/core': 2.11.0 - '@miniflare/shared': 2.11.0 - '@miniflare/web-sockets': 2.11.0 - kleur: 4.1.5 - selfsigned: 2.1.1 - undici: 5.9.1 - ws: 8.12.0 - youch: 2.2.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true - /@miniflare/http-server/2.12.1: resolution: {integrity: sha512-nC6POgDKFHxnyXbKCdR9FGZSsu5frXQUETvSVcoETd5RP+Iws0xZ+XkzVMqiiIZk3ifUC9LzdGUOD0J2PlhHJw==} engines: {node: '>=16.13'} @@ -2980,13 +2883,6 @@ packages: - utf-8-validate dev: true - /@miniflare/kv/2.11.0: - resolution: {integrity: sha512-3m9dL2HBBN170V1JvwjjucR5zl4G3mlcsV6C1E7A2wLl2Z2TWvIx/tSY9hrhkD96dFnejwJ9qmPMbXMMuynhjg==} - engines: {node: '>=16.13'} - dependencies: - '@miniflare/shared': 2.11.0 - dev: true - /@miniflare/kv/2.12.1: resolution: {integrity: sha512-8h8wLDMEaWaKAqYTwrckOcNjAz52bzDyLmU4t/lh1/AQOE9eSg/T+H6xQCv0fPGrWPeHmG8iXaFI1JQ+CtkcHw==} engines: {node: '>=16.13'} @@ -2994,13 +2890,6 @@ packages: '@miniflare/shared': 2.12.1 dev: true - /@miniflare/queues/2.11.0: - resolution: {integrity: sha512-fLHjdrNLKhn0LZM/aii/9GsAttFd+lWlGzK8HOg1R0vhfKBwEub4zntjMmOfFbDm1ntc21tdMK7n3ldUphwh5w==} - engines: {node: '>=16.7'} - dependencies: - '@miniflare/shared': 2.11.0 - dev: true - /@miniflare/queues/2.12.1: resolution: {integrity: sha512-L/YJkWWvg1RS3sCB5DLZOsf/kAmkwhvshpl+LmGQT7z/PYXlplbBmuhPwVBXaHqZdYE7063XfTzgAIhVPoo72Q==} engines: {node: '>=16.7'} @@ -3008,14 +2897,6 @@ packages: '@miniflare/shared': 2.12.1 dev: true - /@miniflare/r2/2.11.0: - resolution: {integrity: sha512-MKuyJ/gGNsK3eWbGdygvozqcyaZhM3C6NGHvoaZwH503dwN569j5DpatTWiHGFeDeSu64VqcIsGehz05GDUaag==} - engines: {node: '>=16.13'} - dependencies: - '@miniflare/shared': 2.11.0 - undici: 5.9.1 - dev: true - /@miniflare/r2/2.12.1: resolution: {integrity: sha512-xp8fSSap6o5xSAWp9BtOGgZ4tuf5iHTqrfbAH66LF151j8y69eQtQJ5pxpSvrDJok/F1VOLGc4ihSLmUqxyXhw==} engines: {node: '>=16.13'} @@ -3024,13 +2905,6 @@ packages: undici: 5.20.0 dev: true - /@miniflare/runner-vm/2.11.0: - resolution: {integrity: sha512-bkVSuvCf5+VylqN8lTiLxIYqYcKFbl+BywZGwGQndPC/3wh42J00mM0jw4hRbvXgwuBhlUyCVpEXtYlftFFT/g==} - engines: {node: '>=16.13'} - dependencies: - '@miniflare/shared': 2.11.0 - dev: true - /@miniflare/runner-vm/2.12.1: resolution: {integrity: sha512-pGY/aoQzbvyXOGR6/d3hv5/QsyUXGGbOxAyXdvjlz8h7ZiKOX4dBRS5TUAPS0kb/ofUWCyoYJi8dCVwRGdTYRw==} engines: {node: '>=16.13'} @@ -3038,15 +2912,6 @@ packages: '@miniflare/shared': 2.12.1 dev: true - /@miniflare/scheduler/2.11.0: - resolution: {integrity: sha512-DPdzINhdWeS99eIicGoluMsD4pLTTAWNQbgCv3CTwgdKA3dxdvMSCkNqZzQLiALzvk9+rSfj46FlH++HE7o7/w==} - engines: {node: '>=16.13'} - dependencies: - '@miniflare/core': 2.11.0 - '@miniflare/shared': 2.11.0 - cron-schedule: 3.0.6 - dev: true - /@miniflare/scheduler/2.12.1: resolution: {integrity: sha512-AbOP8YpWNqR/t7zMuTmn6q27USCDBQaYaULRVaNNfCsxMTXAUjYfM85iFvnV9mshw+K0HIEU4zR4Xjd2FeJubg==} engines: {node: '>=16.13'} @@ -3056,16 +2921,6 @@ packages: cron-schedule: 3.0.6 dev: true - /@miniflare/shared/2.11.0: - resolution: {integrity: sha512-fWMqq3ZkWAg+k7CnyzMV/rZHugwn+/JxvVzCxrtvxzwotTN547THlOxgZe8JAP23U9BiTxOfpTfnLvFEjAmegw==} - engines: {node: '>=16.13'} - dependencies: - '@types/better-sqlite3': 7.6.3 - kleur: 4.1.5 - npx-import: 1.1.4 - picomatch: 2.3.1 - dev: true - /@miniflare/shared/2.12.1: resolution: {integrity: sha512-N8sHNM5vcvjvO+znQ7Mbqf0FChRlWxy/svUpQf1GGpii9aTXzOTWB+WkFvJrJNx44SUReEGxUAzxpdeWnHahmA==} engines: {node: '>=16.13'} @@ -3076,15 +2931,6 @@ packages: picomatch: 2.3.1 dev: true - /@miniflare/sites/2.11.0: - resolution: {integrity: sha512-qbefKdWZUJgsdLf+kCw03sn3h/92LZgJAbkOpP6bCrfWkXlJ37EQXO4KWdhn4Ghc7A6GwU1s1I/mdB64B3AewQ==} - engines: {node: '>=16.13'} - dependencies: - '@miniflare/kv': 2.11.0 - '@miniflare/shared': 2.11.0 - '@miniflare/storage-file': 2.11.0 - dev: true - /@miniflare/sites/2.12.1: resolution: {integrity: sha512-LW4r82cfGJvmJFwoBdXfsRcdDggVf8ppjMZGU3zk7xo+u5yD1uHzO2Arf3XbKNiOp7f9WyC/mXxs4zxF605iLA==} engines: {node: '>=16.13'} @@ -3094,14 +2940,6 @@ packages: '@miniflare/storage-file': 2.12.1 dev: true - /@miniflare/storage-file/2.11.0: - resolution: {integrity: sha512-beWF/lTX74x7AiaSB+xQxywPSNdhtEKvqDkRui8eOJ5kqN2o4UaleLKQGgqmCw3WyHRIsckV7If1qpbNiLtWMw==} - engines: {node: '>=16.13'} - dependencies: - '@miniflare/shared': 2.11.0 - '@miniflare/storage-memory': 2.11.0 - dev: true - /@miniflare/storage-file/2.12.1: resolution: {integrity: sha512-eq5wzBwxQC5GVxBfji9svb9FRdSOlA8D8DTgzL29DDjuOYtG9j8ydOlo0J7/2MB/Gq0HYFUHYWHhrklzzwdKQQ==} engines: {node: '>=16.13'} @@ -3110,13 +2948,6 @@ packages: '@miniflare/storage-memory': 2.12.1 dev: true - /@miniflare/storage-memory/2.11.0: - resolution: {integrity: sha512-s0AhPww7fq/Jz80NbPb+ffhcVRKnfPi7H1dHTRTre2Ud23EVJjAWl2gat42x8NOT/Fu3/o/7A72DWQQJqfO98A==} - engines: {node: '>=16.13'} - dependencies: - '@miniflare/shared': 2.11.0 - dev: true - /@miniflare/storage-memory/2.12.1: resolution: {integrity: sha512-E9jbrX0L9N7YIHXj2G4td1EKboVLBdHkwh7RvKEZBwOhxDze5h+jMOou57NIbfC5kLOZPOC1fGXjzpp7xUUE6w==} engines: {node: '>=16.13'} @@ -3124,13 +2955,6 @@ packages: '@miniflare/shared': 2.12.1 dev: true - /@miniflare/watcher/2.11.0: - resolution: {integrity: sha512-RUfjz2iYcsQXLcGySemJl98CJ2iierbWsPGWZhIVZI+NNhROkEy77g/Q+lvP2ATwexG3/dUSfdJ3P8aH+sI4Ig==} - engines: {node: '>=16.13'} - dependencies: - '@miniflare/shared': 2.11.0 - dev: true - /@miniflare/watcher/2.12.1: resolution: {integrity: sha512-3IG/6g38id5ppbZHB/gMfEvoIEFYdmTTLRsHaPNyWIk/r3LMhHLluVsMcs+Lr/fphkPk6Diou4cBLD2GeeoP7A==} engines: {node: '>=16.13'} @@ -3138,19 +2962,6 @@ packages: '@miniflare/shared': 2.12.1 dev: true - /@miniflare/web-sockets/2.11.0: - resolution: {integrity: sha512-NC8RKrmxrO0hZmwpzn5g4hPGA2VblnFTIBobmWoxuK95eW49zfs7dtE/PyFs+blsGv3CjTIjHVSQ782K+C6HFA==} - engines: {node: '>=16.13'} - dependencies: - '@miniflare/core': 2.11.0 - '@miniflare/shared': 2.11.0 - undici: 5.9.1 - ws: 8.12.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true - /@miniflare/web-sockets/2.12.1: resolution: {integrity: sha512-Z+zqZqhVdrbmTQf+ETP5H1TPdXC2tUiYPiHRLWTHUks6VVkuwnUtIKxNPBEBXjCjKYYEm8VLclUAt+0yTucLWA==} engines: {node: '>=16.13'} @@ -3488,7 +3299,7 @@ packages: dependencies: '@svgr/core': 6.5.1 cosmiconfig: 7.1.0 - deepmerge: 4.3.0 + deepmerge: 4.3.1 svgo: 2.8.0 dev: true @@ -3534,26 +3345,26 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.15.3 + '@types/node': 18.15.5 dev: true /@types/bonjour/3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 18.15.3 + '@types/node': 18.15.5 dev: true /@types/connect-history-api-fallback/1.3.5: resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} dependencies: '@types/express-serve-static-core': 4.17.33 - '@types/node': 18.15.3 + '@types/node': 18.15.5 dev: true /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.15.3 + '@types/node': 18.15.5 dev: true /@types/cookie/0.5.0: @@ -3563,12 +3374,12 @@ packages: /@types/eslint-scope/3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: - '@types/eslint': 8.21.2 + '@types/eslint': 8.21.3 '@types/estree': 0.0.51 dev: true - /@types/eslint/8.21.2: - resolution: {integrity: sha512-EMpxUyystd3uZVByZap1DACsMXvb82ypQnGn89e1Y0a+LYu3JJscUd/gqhRsVFDkaD2MIiWo0MT8EfXr3DGRKw==} + /@types/eslint/8.21.3: + resolution: {integrity: sha512-fa7GkppZVEByMWGbTtE5MbmXWJTVbrjjaS8K6uQj+XtuuUv1fsuPAxhygfqLmsb/Ufb3CV8deFCpiMfAgi00Sw==} dependencies: '@types/estree': 0.0.51 '@types/json-schema': 7.0.11 @@ -3581,7 +3392,7 @@ packages: /@types/express-serve-static-core/4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: - '@types/node': 18.15.3 + '@types/node': 18.15.5 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -3612,7 +3423,7 @@ packages: /@types/http-proxy/1.17.10: resolution: {integrity: sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==} dependencies: - '@types/node': 18.15.3 + '@types/node': 18.15.5 dev: true /@types/inquirer/9.0.3: @@ -3649,11 +3460,11 @@ packages: /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.15.3 + '@types/node': 18.15.5 dev: true - /@types/mdast/3.0.10: - resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} + /@types/mdast/3.0.11: + resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==} dependencies: '@types/unist': 2.0.6 dev: true @@ -3672,9 +3483,13 @@ packages: /@types/node/18.11.18: resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} + dev: true /@types/node/18.15.3: resolution: {integrity: sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==} + + /@types/node/18.15.5: + resolution: {integrity: sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==} dev: true /@types/normalize-package-data/2.4.1: @@ -3717,7 +3532,7 @@ packages: /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.15.3 + '@types/node': 18.15.5 dev: true /@types/retry/0.12.0: @@ -3746,13 +3561,13 @@ packages: resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: '@types/mime': 3.0.1 - '@types/node': 18.15.3 + '@types/node': 18.15.5 dev: true /@types/sockjs/0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 18.15.3 + '@types/node': 18.15.5 dev: true /@types/stack-trace/0.0.29: @@ -3762,7 +3577,7 @@ packages: /@types/through/0.0.30: resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.15.3 dev: true /@types/unist/2.0.6: @@ -3778,7 +3593,7 @@ packages: /@types/ws/8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: - '@types/node': 18.15.3 + '@types/node': 18.15.5 dev: true /@types/yargs-parser/21.0.0: @@ -3791,6 +3606,12 @@ packages: '@types/yargs-parser': 21.0.0 dev: true + /@types/yargs/17.0.23: + resolution: {integrity: sha512-yuogunc04OnzGQCrfHx+Kk883Q4X0aSwmYZhKjI21m+SVYzjIbrWl8dOOwSv5hf2Um2pdCOXWo9isteZTNXUZQ==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + /@typescript-eslint/eslint-plugin/5.50.0_go4drrxstycfikanvu45pi4vgq: resolution: {integrity: sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4416,7 +4237,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: delegates: 1.0.0 - readable-stream: 3.6.0 + readable-stream: 3.6.2 dev: true /argparse/1.0.10: @@ -4538,7 +4359,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.21.5 - caniuse-lite: 1.0.30001466 + caniuse-lite: 1.0.30001469 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -4558,7 +4379,7 @@ packages: - debug dev: true - /babel-loader/8.3.0_h5x7dh6zbbyopr7jvxivhylqpa: + /babel-loader/8.3.0_qtovpurzjlo3biun26ymnwui7i: resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: @@ -4570,7 +4391,7 @@ packages: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.76.2 + webpack: 5.76.3 dev: true /babel-plugin-apply-mdx-type-prop/1.6.22_@babel+core@7.12.9: @@ -4677,7 +4498,7 @@ packages: dependencies: buffer: 5.7.1 inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.2 dev: true /bl/5.1.0: @@ -4725,8 +4546,8 @@ packages: - supports-color dev: true - /bonjour-service/1.1.0: - resolution: {integrity: sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==} + /bonjour-service/1.1.1: + resolution: {integrity: sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==} dependencies: array-flatten: 2.1.2 dns-equal: 1.0.0 @@ -4792,8 +4613,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001466 - electron-to-chromium: 1.4.330 + caniuse-lite: 1.0.30001469 + electron-to-chromium: 1.4.335 node-releases: 2.0.10 update-browserslist-db: 1.0.10_browserslist@4.21.5 dev: true @@ -4915,13 +4736,13 @@ packages: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: browserslist: 4.21.5 - caniuse-lite: 1.0.30001466 + caniuse-lite: 1.0.30001469 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true - /caniuse-lite/1.0.30001466: - resolution: {integrity: sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==} + /caniuse-lite/1.0.30001469: + resolution: {integrity: sha512-Rcp7221ScNqQPP3W+lVOYDyjdR6dC+neEQCttoNr5bAyz54AboB4iwpnWgyi8P4YUsPybVzT4LgWiBbI3drL4g==} dev: true /cborg/1.10.0: @@ -5258,7 +5079,7 @@ packages: engines: {node: '>=8'} dependencies: dot-prop: 5.3.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 make-dir: 3.1.0 unique-string: 2.0.0 write-file-atomic: 3.0.3 @@ -5312,7 +5133,7 @@ packages: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - /copy-webpack-plugin/11.0.0_webpack@5.76.2: + /copy-webpack-plugin/11.0.0_webpack@5.76.3: resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -5324,7 +5145,7 @@ packages: normalize-path: 3.0.0 schema-utils: 4.0.0 serialize-javascript: 6.0.1 - webpack: 5.76.2 + webpack: 5.76.3 dev: true /core-js-compat/3.29.1: @@ -5368,6 +5189,16 @@ packages: path-type: 4.0.0 yaml: 1.10.2 + /cosmiconfig/8.1.3: + resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + /cp-file/9.1.0: resolution: {integrity: sha512-3scnzFj/94eb7y4wyXRWwvzLFaQp87yyfTnChIjlfYrVqp5lVO3E2hIJMeQIltUT0K2ZAB3An1qXcBmwGyvuwA==} engines: {node: '>=10'} @@ -5437,7 +5268,7 @@ packages: postcss: 8.4.21 dev: true - /css-loader/6.7.3_webpack@5.76.2: + /css-loader/6.7.3_webpack@5.76.3: resolution: {integrity: sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -5451,10 +5282,10 @@ packages: postcss-modules-values: 4.0.0_postcss@8.4.21 postcss-value-parser: 4.2.0 semver: 7.3.8 - webpack: 5.76.2 + webpack: 5.76.3 dev: true - /css-minimizer-webpack-plugin/4.2.2_7uczfu7hmoatiedqewdadkdxue: + /css-minimizer-webpack-plugin/4.2.2_6xivdjm2sml3syouufpdefilzi: resolution: {integrity: sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -5486,7 +5317,7 @@ packages: schema-utils: 4.0.0 serialize-javascript: 6.0.1 source-map: 0.6.1 - webpack: 5.76.2 + webpack: 5.76.3 dev: true /css-select/4.3.0: @@ -5716,8 +5547,8 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge/4.3.0: - resolution: {integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==} + /deepmerge/4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} dev: true @@ -5767,7 +5598,7 @@ packages: engines: {node: '>=10'} dependencies: globby: 11.1.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 is-glob: 4.0.3 is-path-cwd: 2.2.0 is-path-inside: 3.0.3 @@ -5908,14 +5739,14 @@ packages: esutils: 2.0.3 dev: true - /docusaurus-plugin-typedoc/0.18.0_fukoy6jgklpnhaz4jx7cggnvsu: + /docusaurus-plugin-typedoc/0.18.0_bhwftghzp2kjaeaba4ticsx7k4: resolution: {integrity: sha512-kurIUu8LhVIOPT88HoeBcu0/D2GMDdg0pUYaFlqeuXT9an6Wlgvuy0C22ZMYcJUcp/gA/Mw2XdUHubsLK2M4uA==} peerDependencies: typedoc: '>=0.23.0' typedoc-plugin-markdown: '>=3.13.0' dependencies: - typedoc: 0.23.26_typescript@4.9.5 - typedoc-plugin-markdown: 3.14.0_typedoc@0.23.26 + typedoc: 0.23.28_typescript@4.9.5 + typedoc-plugin-markdown: 3.14.0_typedoc@0.23.28 dev: true /dom-converter/0.2.0: @@ -6004,8 +5835,8 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true - /electron-to-chromium/1.4.330: - resolution: {integrity: sha512-PqyefhybrVdjAJ45HaPLtuVaehiSw7C3ya0aad+rvmV53IVyXmYRk3pwIOb2TxTDTnmgQdn46NjMMaysx79/6Q==} + /electron-to-chromium/1.4.335: + resolution: {integrity: sha512-l/eowQqTnrq3gu+WSrdfkhfNHnPgYqlKAwxz7MTOj6mom19vpEDHNXl6dxDxyTiYuhemydprKr/HCrHfgk+OfQ==} dev: true /emoji-regex/8.0.0: @@ -6042,7 +5873,7 @@ packages: resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} engines: {node: '>=10.13.0'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 tapable: 2.2.1 dev: true @@ -6160,214 +5991,6 @@ packages: resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} dev: true - /esbuild-android-64/0.14.51: - resolution: {integrity: sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /esbuild-android-arm64/0.14.51: - resolution: {integrity: sha512-vBtp//5VVkZWmYYvHsqBRCMMi1MzKuMIn5XDScmnykMTu9+TD9v0NMEDqQxvtFToeYmojdo5UCV2vzMQWJcJ4A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /esbuild-darwin-64/0.14.51: - resolution: {integrity: sha512-YFmXPIOvuagDcwCejMRtCDjgPfnDu+bNeh5FU2Ryi68ADDVlWEpbtpAbrtf/lvFTWPexbgyKgzppNgsmLPr8PA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /esbuild-darwin-arm64/0.14.51: - resolution: {integrity: sha512-juYD0QnSKwAMfzwKdIF6YbueXzS6N7y4GXPDeDkApz/1RzlT42mvX9jgNmyOlWKN7YzQAYbcUEJmZJYQGdf2ow==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /esbuild-freebsd-64/0.14.51: - resolution: {integrity: sha512-cLEI/aXjb6vo5O2Y8rvVSQ7smgLldwYY5xMxqh/dQGfWO+R1NJOFsiax3IS4Ng300SVp7Gz3czxT6d6qf2cw0g==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-freebsd-arm64/0.14.51: - resolution: {integrity: sha512-TcWVw/rCL2F+jUgRkgLa3qltd5gzKjIMGhkVybkjk6PJadYInPtgtUBp1/hG+mxyigaT7ib+od1Xb84b+L+1Mg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-32/0.14.51: - resolution: {integrity: sha512-RFqpyC5ChyWrjx8Xj2K0EC1aN0A37H6OJfmUXIASEqJoHcntuV3j2Efr9RNmUhMfNE6yEj2VpYuDteZLGDMr0w==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-64/0.14.51: - resolution: {integrity: sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-arm/0.14.51: - resolution: {integrity: sha512-LsJynDxYF6Neg7ZC7748yweCDD+N8ByCv22/7IAZglIEniEkqdF4HCaa49JNDLw1UQGlYuhOB8ZT/MmcSWzcWg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-arm64/0.14.51: - resolution: {integrity: sha512-D9rFxGutoqQX3xJPxqd6o+kvYKeIbM0ifW2y0bgKk5HPgQQOo2k9/2Vpto3ybGYaFPCE5qTGtqQta9PoP6ZEzw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-mips64le/0.14.51: - resolution: {integrity: sha512-vS54wQjy4IinLSlb5EIlLoln8buh1yDgliP4CuEHumrPk4PvvP4kTRIG4SzMXm6t19N0rIfT4bNdAxzJLg2k6A==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-ppc64le/0.14.51: - resolution: {integrity: sha512-xcdd62Y3VfGoyphNP/aIV9LP+RzFw5M5Z7ja+zdpQHHvokJM7d0rlDRMN+iSSwvUymQkqZO+G/xjb4/75du8BQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-riscv64/0.14.51: - resolution: {integrity: sha512-syXHGak9wkAnFz0gMmRBoy44JV0rp4kVCEA36P5MCeZcxFq8+fllBC2t6sKI23w3qd8Vwo9pTADCgjTSf3L3rA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-s390x/0.14.51: - resolution: {integrity: sha512-kFAJY3dv+Wq8o28K/C7xkZk/X34rgTwhknSsElIqoEo8armCOjMJ6NsMxm48KaWY2h2RUYGtQmr+RGuUPKBhyw==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-netbsd-64/0.14.51: - resolution: {integrity: sha512-ZZBI7qrR1FevdPBVHz/1GSk1x5GDL/iy42Zy8+neEm/HA7ma+hH/bwPEjeHXKWUDvM36CZpSL/fn1/y9/Hb+1A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-openbsd-64/0.14.51: - resolution: {integrity: sha512-7R1/p39M+LSVQVgDVlcY1KKm6kFKjERSX1lipMG51NPcspJD1tmiZSmmBXoY5jhHIu6JL1QkFDTx94gMYK6vfA==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-sunos-64/0.14.51: - resolution: {integrity: sha512-HoHaCswHxLEYN8eBTtyO0bFEWvA3Kdb++hSQ/lLG7TyKF69TeSG0RNoBRAs45x/oCeWaTDntEZlYwAfQlhEtJA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-32/0.14.51: - resolution: {integrity: sha512-4rtwSAM35A07CBt1/X8RWieDj3ZUHQqUOaEo5ZBs69rt5WAFjP4aqCIobdqOy4FdhYw1yF8Z0xFBTyc9lgPtEg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-64/0.14.51: - resolution: {integrity: sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-arm64/0.14.51: - resolution: {integrity: sha512-JQDqPjuOH7o+BsKMSddMfmVJXrnYZxXDHsoLHc0xgmAZkOOCflRmC43q31pk79F9xuyWY45jDBPolb5ZgGOf9g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /esbuild/0.14.51: - resolution: {integrity: sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - esbuild-android-64: 0.14.51 - esbuild-android-arm64: 0.14.51 - esbuild-darwin-64: 0.14.51 - esbuild-darwin-arm64: 0.14.51 - esbuild-freebsd-64: 0.14.51 - esbuild-freebsd-arm64: 0.14.51 - esbuild-linux-32: 0.14.51 - esbuild-linux-64: 0.14.51 - esbuild-linux-arm: 0.14.51 - esbuild-linux-arm64: 0.14.51 - esbuild-linux-mips64le: 0.14.51 - esbuild-linux-ppc64le: 0.14.51 - esbuild-linux-riscv64: 0.14.51 - esbuild-linux-s390x: 0.14.51 - esbuild-netbsd-64: 0.14.51 - esbuild-openbsd-64: 0.14.51 - esbuild-sunos-64: 0.14.51 - esbuild-windows-32: 0.14.51 - esbuild-windows-64: 0.14.51 - esbuild-windows-arm64: 0.14.51 - dev: true - /esbuild/0.16.10: resolution: {integrity: sha512-z5dIViHoVnw2l+NCJ3zj5behdXjYvXne9gL18OOivCadXDUhyDkeSvEtLcGVAJW2fNmh33TDUpsi704XYlDodw==} engines: {node: '>=12'} @@ -6913,7 +6536,7 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} dependencies: - '@types/node': 18.15.3 + '@types/node': 18.15.5 require-like: 0.1.2 dev: true @@ -6972,7 +6595,7 @@ packages: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 - human-signals: 4.3.0 + human-signals: 4.3.1 is-stream: 3.0.0 merge-stream: 2.0.0 npm-run-path: 5.1.0 @@ -7101,7 +6724,7 @@ packages: flat-cache: 3.0.4 dev: true - /file-loader/6.2.0_webpack@5.76.2: + /file-loader/6.2.0_webpack@5.76.3: resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -7109,7 +6732,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.1.1 - webpack: 5.76.2 + webpack: 5.76.3 dev: true /file-uri-to-path/1.0.0: @@ -7212,8 +6835,8 @@ packages: signal-exit: 3.0.7 dev: true - /fork-ts-checker-webpack-plugin/6.5.2_a37q6j7dwawz22saey2vgkpwqm: - resolution: {integrity: sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==} + /fork-ts-checker-webpack-plugin/6.5.3_t37drsge5fnqkss6ynqsf64hyi: + resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: eslint: '>= 6' @@ -7231,7 +6854,7 @@ packages: chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 - deepmerge: 4.3.0 + deepmerge: 4.3.1 fs-extra: 9.1.0 glob: 7.2.3 memfs: 3.4.13 @@ -7240,7 +6863,7 @@ packages: semver: 7.3.8 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.76.2 + webpack: 5.76.3 dev: true /forwarded/0.2.0: @@ -7265,7 +6888,7 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 dev: true @@ -7275,7 +6898,7 @@ packages: engines: {node: '>=10'} dependencies: at-least-node: 1.0.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 dev: true @@ -7529,6 +7152,10 @@ packages: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: true + /graceful-fs/4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + /grapheme-splitter/1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true @@ -7823,7 +7450,7 @@ packages: resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==} dev: true - /html-webpack-plugin/5.5.0_webpack@5.76.2: + /html-webpack-plugin/5.5.0_webpack@5.76.3: resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} engines: {node: '>=10.13.0'} peerDependencies: @@ -7834,7 +7461,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.76.2 + webpack: 5.76.3 dev: true /htmlparser2/6.1.0: @@ -7929,8 +7556,8 @@ packages: engines: {node: '>=12.20.0'} dev: true - /human-signals/4.3.0: - resolution: {integrity: sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ==} + /human-signals/4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} dev: true @@ -8568,10 +8195,10 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 18.15.3 + '@types/node': 18.15.5 chalk: 4.1.2 ci-info: 3.8.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 picomatch: 2.3.1 dev: true @@ -8579,7 +8206,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.15.3 + '@types/node': 18.15.5 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -8588,14 +8215,14 @@ packages: resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.15.3 + '@types/node': 18.15.5 jest-util: 29.5.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /joi/17.8.4: - resolution: {integrity: sha512-jjdRHb5WtL+KgSHvOULQEPPv4kcl+ixd1ybOFQq3rWLgEEqc03QMmilodL0GVJE14U/SQDXkUhQUSZANGDH/AA==} + /joi/17.9.1: + resolution: {integrity: sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw==} dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -8692,7 +8319,7 @@ packages: dependencies: universalify: 2.0.0 optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true /jsx-ast-utils/3.3.3: @@ -8734,8 +8361,8 @@ packages: engines: {node: '>= 8'} dev: true - /kysely-d1/0.1.0_kysely@0.23.4: - resolution: {integrity: sha512-KTGePYYbRGf7ARHr8/y0HDJDkjRkQs05BstuRAj4RL07Vpy7z9u04J8WE+uKIJ1BzPCcdNMTuK4fB7ZvFC09Qg==} + /kysely-d1/0.3.0_kysely@0.23.4: + resolution: {integrity: sha512-9wTbE6ooLiYtBa4wPg9e4fjfcmvRtgE/2j9pAjYrIq+iz+EsH/Hj9YbtxpEXA6JoRgfulVQ1EtGj6aycGGRpYw==} peerDependencies: kysely: '*' dependencies: @@ -9020,8 +8647,8 @@ packages: resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==} dev: true - /marked/4.2.12: - resolution: {integrity: sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==} + /marked/4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} engines: {node: '>= 12'} hasBin: true @@ -9047,7 +8674,7 @@ packages: /mdast-util-to-hast/10.0.1: resolution: {integrity: sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==} dependencies: - '@types/mdast': 3.0.10 + '@types/mdast': 3.0.11 '@types/unist': 2.0.6 mdast-util-definitions: 4.0.0 mdurl: 1.0.1 @@ -9188,56 +8815,14 @@ packages: engines: {node: '>=4'} dev: true - /mini-css-extract-plugin/2.7.3_webpack@5.76.2: - resolution: {integrity: sha512-CD9cXeKeXLcnMw8FZdtfrRrLaM7gwCl4nKuKn2YkY2Bw5wdlB8zU2cCzw+w2zS9RFvbrufTBkMCJACNPwqQA0w==} + /mini-css-extract-plugin/2.7.5_webpack@5.76.3: + resolution: {integrity: sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: schema-utils: 4.0.0 - webpack: 5.76.2 - dev: true - - /miniflare/2.11.0: - resolution: {integrity: sha512-QA18I1VQXdCo4nBtPJUcUDxW8c9xbc5ex5F61jwhkGVOISSnYdEheolESmjr8MYk28xwi0XD1ozS4rLaTONd+w==} - engines: {node: '>=16.13'} - hasBin: true - peerDependencies: - '@miniflare/storage-redis': 2.11.0 - cron-schedule: ^3.0.4 - ioredis: ^4.27.9 - peerDependenciesMeta: - '@miniflare/storage-redis': - optional: true - cron-schedule: - optional: true - ioredis: - optional: true - dependencies: - '@miniflare/cache': 2.11.0 - '@miniflare/cli-parser': 2.11.0 - '@miniflare/core': 2.11.0 - '@miniflare/d1': 2.11.0 - '@miniflare/durable-objects': 2.11.0 - '@miniflare/html-rewriter': 2.11.0 - '@miniflare/http-server': 2.11.0 - '@miniflare/kv': 2.11.0 - '@miniflare/queues': 2.11.0 - '@miniflare/r2': 2.11.0 - '@miniflare/runner-vm': 2.11.0 - '@miniflare/scheduler': 2.11.0 - '@miniflare/shared': 2.11.0 - '@miniflare/sites': 2.11.0 - '@miniflare/storage-file': 2.11.0 - '@miniflare/storage-memory': 2.11.0 - '@miniflare/web-sockets': 2.11.0 - kleur: 4.1.5 - semiver: 1.1.0 - source-map-support: 0.5.21 - undici: 5.9.1 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + webpack: 5.76.3 dev: true /miniflare/2.12.1: @@ -9298,8 +8883,8 @@ packages: brace-expansion: 2.0.1 dev: true - /minimatch/7.4.2: - resolution: {integrity: sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==} + /minimatch/7.4.3: + resolution: {integrity: sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 @@ -10160,18 +9745,18 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /postcss-loader/7.0.2_6puvukfnwbwq425eep7g4z27be: - resolution: {integrity: sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==} + /postcss-loader/7.1.0_twwyhqqim6liv4fz2ggv7g4m5a: + resolution: {integrity: sha512-vTD2DJ8vJD0Vr1WzMQkRZWRjcynGh3t7NeoLg+Sb1TeuK7etiZfL/ZwHbaVa3M+Qni7Lj/29voV9IggnIUjlIw==} engines: {node: '>= 14.15.0'} peerDependencies: postcss: ^7.0.0 || ^8.0.1 webpack: ^5.0.0 dependencies: - cosmiconfig: 7.1.0 + cosmiconfig: 8.1.3 klona: 2.0.6 postcss: 8.4.21 semver: 7.3.8 - webpack: 5.76.2 + webpack: 5.76.3 dev: true /postcss-merge-idents/5.1.1_postcss@8.4.21: @@ -10608,7 +10193,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 18.11.18 + '@types/node': 18.15.3 long: 5.2.1 /proxy-addr/2.0.7: @@ -10720,7 +10305,7 @@ packages: strip-json-comments: 2.0.1 dev: true - /react-dev-utils/12.0.1_a37q6j7dwawz22saey2vgkpwqm: + /react-dev-utils/12.0.1_t37drsge5fnqkss6ynqsf64hyi: resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -10739,7 +10324,7 @@ packages: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.2_a37q6j7dwawz22saey2vgkpwqm + fork-ts-checker-webpack-plugin: 6.5.3_t37drsge5fnqkss6ynqsf64hyi global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -10755,7 +10340,7 @@ packages: strip-ansi: 6.0.1 text-table: 0.2.0 typescript: 4.9.5 - webpack: 5.76.2 + webpack: 5.76.3 transitivePeerDependencies: - eslint - supports-color @@ -10766,8 +10351,8 @@ packages: resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} dev: true - /react-fast-compare/3.2.0: - resolution: {integrity: sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==} + /react-fast-compare/3.2.1: + resolution: {integrity: sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg==} dev: true /react-helmet-async/1.3.0: @@ -10784,7 +10369,7 @@ packages: '@babel/runtime': 7.21.0 invariant: 2.2.4 prop-types: 15.8.1 - react-fast-compare: 3.2.0 + react-fast-compare: 3.2.1 shallowequal: 1.1.0 dev: true @@ -10792,7 +10377,7 @@ packages: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: true - /react-loadable-ssr-addon-v5-slorber/1.0.1_vycmgd62fyq7p6lzattvftnbcy: + /react-loadable-ssr-addon-v5-slorber/1.0.1_r7pi7vlw6nkfjbr5epugnhqe3u: resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==} engines: {node: '>=10.13.0'} peerDependencies: @@ -10804,7 +10389,7 @@ packages: dependencies: '@babel/runtime': 7.21.0 react-loadable: /@docusaurus/react-loadable/5.5.2 - webpack: 5.76.2 + webpack: 5.76.3 dev: true /react-router-config/5.1.1_react-router@5.3.4: @@ -12036,7 +11621,7 @@ packages: end-of-stream: 1.4.4 fs-constants: 1.0.0 inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.2 dev: true /temp-dir/2.0.0: @@ -12054,7 +11639,7 @@ packages: unique-string: 3.0.0 dev: true - /terser-webpack-plugin/5.3.7_webpack@5.76.2: + /terser-webpack-plugin/5.3.7_webpack@5.76.3: resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -12075,7 +11660,7 @@ packages: schema-utils: 3.1.1 serialize-javascript: 6.0.1 terser: 5.16.6 - webpack: 5.76.2 + webpack: 5.76.3 dev: true /terser/5.16.6: @@ -12297,33 +11882,33 @@ packages: is-typedarray: 1.0.0 dev: true - /typedoc-plugin-markdown/3.14.0_typedoc@0.23.26: + /typedoc-plugin-markdown/3.14.0_typedoc@0.23.28: resolution: {integrity: sha512-UyQLkLRkfTFhLdhSf3RRpA3nNInGn+k6sll2vRXjflaMNwQAAiB61SYbisNZTg16t4K1dt1bPQMMGLrxS0GZ0Q==} peerDependencies: typedoc: '>=0.23.0' dependencies: handlebars: 4.7.7 - typedoc: 0.23.26_typescript@4.9.5 + typedoc: 0.23.28_typescript@4.9.5 dev: true - /typedoc-plugin-missing-exports/1.0.0_typedoc@0.23.26: + /typedoc-plugin-missing-exports/1.0.0_typedoc@0.23.28: resolution: {integrity: sha512-7s6znXnuAj1eD9KYPyzVzR1lBF5nwAY8IKccP5sdoO9crG4lpd16RoFpLsh2PccJM+I2NASpr0+/NMka6ThwVA==} peerDependencies: typedoc: 0.22.x || 0.23.x dependencies: - typedoc: 0.23.26_typescript@4.9.5 + typedoc: 0.23.28_typescript@4.9.5 dev: false - /typedoc/0.23.26_typescript@4.9.5: - resolution: {integrity: sha512-5m4KwR5tOLnk0OtMaRn9IdbeRM32uPemN9kur7YK9wFqx8U0CYrvO9aVq6ysdZSV1c824BTm+BuQl2Ze/k1HtA==} + /typedoc/0.23.28_typescript@4.9.5: + resolution: {integrity: sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==} engines: {node: '>= 14.14'} hasBin: true peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x dependencies: lunr: 2.3.9 - marked: 4.2.12 - minimatch: 7.4.2 + marked: 4.3.0 + minimatch: 7.4.3 shiki: 0.14.1 typescript: 4.9.5 @@ -12362,11 +11947,6 @@ packages: busboy: 1.6.0 dev: true - /undici/5.9.1: - resolution: {integrity: sha512-6fB3a+SNnWEm4CJbgo0/CWR8RGcOCQP68SF4X0mxtYTq2VNN8T88NYrWVBAeSX+zb7bny2dx2iYhP3XHi00omg==} - engines: {node: '>=12.18'} - dev: true - /unherit/1.1.3: resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==} dependencies: @@ -12530,7 +12110,7 @@ packages: dependencies: punycode: 2.3.0 - /url-loader/4.1.1_35ful32yo3wjb53le3l6xb5doy: + /url-loader/4.1.1_cj4axkvnwozfmnmvgy4d36yxaq: resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -12540,11 +12120,11 @@ packages: file-loader: optional: true dependencies: - file-loader: 6.2.0_webpack@5.76.2 + file-loader: 6.2.0_webpack@5.76.3 loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.1.1 - webpack: 5.76.2 + webpack: 5.76.3 dev: true /url-parse-lax/3.0.0: @@ -12651,7 +12231,7 @@ packages: hasBin: true dependencies: axios: 0.25.0 - joi: 17.8.4 + joi: 17.9.1 lodash: 4.17.21 minimist: 1.2.8 rxjs: 7.8.0 @@ -12673,7 +12253,7 @@ packages: engines: {node: '>=10.13.0'} dependencies: glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true /wbuf/1.7.3: @@ -12726,7 +12306,7 @@ packages: - utf-8-validate dev: true - /webpack-dev-middleware/5.3.3_webpack@5.76.2: + /webpack-dev-middleware/5.3.3_webpack@5.76.3: resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -12737,17 +12317,19 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.76.2 + webpack: 5.76.3 dev: true - /webpack-dev-server/4.12.0_webpack@5.76.2: - resolution: {integrity: sha512-XRN9YRnvOj3TQQ5w/0pR1y1xDcVnbWtNkTri46kuEbaWUPTHsWUvOyAAI7PZHLY+hsFki2kRltJjKMw7e+IiqA==} + /webpack-dev-server/4.13.1_webpack@5.76.3: + resolution: {integrity: sha512-5tWg00bnWbYgkN+pd5yISQKDejRBYGEw15RaEEslH+zdbNDxxaZvEAO2WulaSaFKb5n3YG8JXsGaDsut1D0xdA==} engines: {node: '>= 12.13.0'} hasBin: true peerDependencies: webpack: ^4.37.0 || ^5.0.0 webpack-cli: '*' peerDependenciesMeta: + webpack: + optional: true webpack-cli: optional: true dependencies: @@ -12759,14 +12341,14 @@ packages: '@types/sockjs': 0.3.33 '@types/ws': 8.5.4 ansi-html-community: 0.0.8 - bonjour-service: 1.1.0 + bonjour-service: 1.1.1 chokidar: 3.5.3 colorette: 2.0.19 compression: 1.7.4 connect-history-api-fallback: 2.0.0 default-gateway: 6.0.3 express: 4.18.2 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 html-entities: 2.3.3 http-proxy-middleware: 2.0.6_@types+express@4.17.17 ipaddr.js: 2.0.1 @@ -12779,8 +12361,8 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.76.2 - webpack-dev-middleware: 5.3.3_webpack@5.76.2 + webpack: 5.76.3 + webpack-dev-middleware: 5.3.3_webpack@5.76.3 ws: 8.13.0 transitivePeerDependencies: - bufferutil @@ -12802,8 +12384,8 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack/5.76.2: - resolution: {integrity: sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==} + /webpack/5.76.3: + resolution: {integrity: sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -12826,14 +12408,14 @@ packages: eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 - terser-webpack-plugin: 5.3.7_webpack@5.76.2 + terser-webpack-plugin: 5.3.7_webpack@5.76.3 watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -12842,7 +12424,7 @@ packages: - uglify-js dev: true - /webpackbar/5.0.2_webpack@5.76.2: + /webpackbar/5.0.2_webpack@5.76.3: resolution: {integrity: sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==} engines: {node: '>=12'} peerDependencies: @@ -12852,7 +12434,7 @@ packages: consola: 2.15.3 pretty-time: 1.1.0 std-env: 3.3.2 - webpack: 5.76.2 + webpack: 5.76.3 dev: true /websocket-driver/0.7.4: @@ -12962,8 +12544,8 @@ packages: resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} dev: true - /wrangler/2.12.3: - resolution: {integrity: sha512-0skqT9qBbchiVY57YwQKFCFnuUo2Lg7e0vCChJ9FWcWZ/CXsPXeBMeVA8N/p72LuhrtZlqTFN7TsNOd8jm8KcQ==} + /wrangler/2.13.0: + resolution: {integrity: sha512-hU7RpOjDcyOlKO0xuNEOKINwSA1lh5nSkTH8aKKdatv2Ryt5gSS26RwS49QpZCYJGxGHzhHPr++TlSggOAsEVA==} engines: {node: '>=16.13.0'} hasBin: true dependencies: @@ -12992,36 +12574,6 @@ packages: - utf-8-validate dev: true - /wrangler/2.9.0: - resolution: {integrity: sha512-5nyyR4bXKG/Rwz0dH+nOx4SWvJWmTZVSbceLyTV+ZOH1sd2vvPnnW14NUzTNEjY3XaT93XH+28mc5+UNSYsFHw==} - engines: {node: '>=16.13.0'} - hasBin: true - dependencies: - '@cloudflare/kv-asset-handler': 0.2.0 - '@esbuild-plugins/node-globals-polyfill': 0.1.1_esbuild@0.14.51 - '@esbuild-plugins/node-modules-polyfill': 0.1.4_esbuild@0.14.51 - '@miniflare/core': 2.11.0 - '@miniflare/d1': 2.11.0 - '@miniflare/durable-objects': 2.11.0 - blake3-wasm: 2.1.5 - chokidar: 3.5.3 - esbuild: 0.14.51 - miniflare: 2.11.0 - nanoid: 3.3.4 - path-to-regexp: 6.2.1 - selfsigned: 2.1.1 - source-map: 0.7.4 - xxhash-wasm: 1.0.2 - optionalDependencies: - fsevents: 2.3.2 - transitivePeerDependencies: - - '@miniflare/storage-redis' - - bufferutil - - cron-schedule - - ioredis - - utf-8-validate - dev: true - /wrap-ansi/6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -13083,6 +12635,7 @@ packages: optional: true utf-8-validate: optional: true + dev: false /ws/8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==}