diff --git a/.changeset/eighty-fishes-shake.md b/.changeset/eighty-fishes-shake.md deleted file mode 100644 index d75e6297ac..0000000000 --- a/.changeset/eighty-fishes-shake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'houdini-svelte': patch ---- - -Fix filesystem patches to not use illegal paths diff --git a/e2e/react/package.json b/e2e/react/package.json index 41c3cbb799..78e4063808 100644 --- a/e2e/react/package.json +++ b/e2e/react/package.json @@ -6,7 +6,6 @@ "scripts": { "build:": "cd ../../ && ((pnpm run build && cd -) || (cd - && exit 1))", "build:dev": "pnpm build: && pnpm dev", - "build:web": "pnpm build: && pnpm web", "build:test": "pnpm build: && pnpm test", "build:generate": "pnpm build: && pnpm houdini generate", "build:build": "pnpm build: && pnpm build", diff --git a/e2e/react/src/routes/optimistic-keys/test.ts b/e2e/react/src/routes/optimistic-keys/test.ts index 30a4ae99e9..216ac86845 100644 --- a/e2e/react/src/routes/optimistic-keys/test.ts +++ b/e2e/react/src/routes/optimistic-keys/test.ts @@ -40,3 +40,24 @@ test('@optimisticKey', async ({ page }) => { // the value in the last row should be 'final value' expect(await getValue()).toBe('final value') }) + +test('@optimisticKey - double click', async ({ page }) => { + await goto(page, routes.optimistic_keys) + + // all we have to do is double click twice and make sure we didn't get an error when it resolves + await page.click('[data-test-action="create"]') + await page.click('[data-test-action="create"]') + + // wait a few seconds and make sure there are no errors + await sleep(300) + + // wait a few seconds and make sure there are no errors + await sleep(300) + let found = false + try { + await page.waitForSelector('h1', { timeout: 100 }) + found = true + } catch {} + + expect(found).toBe(false) +}) diff --git a/packages/adapter-auto/CHANGELOG.md b/packages/adapter-auto/CHANGELOG.md index 9686268ed6..d21ff93ab9 100644 --- a/packages/adapter-auto/CHANGELOG.md +++ b/packages/adapter-auto/CHANGELOG.md @@ -1,5 +1,19 @@ # houdini-adapter-auto +## 1.2.55 + +### Patch Changes + +- Updated dependencies [[`98859e78`](https://github.com/HoudiniGraphql/houdini/commit/98859e78e088cf733edc35b3ad96b1a1f9f48b79), [`5add29a6`](https://github.com/HoudiniGraphql/houdini/commit/5add29a68489fd9382d0809cf574a1db2746aae8)]: + - houdini@1.2.55 + +## 1.2.54 + +### Patch Changes + +- Updated dependencies []: + - houdini@1.2.54 + ## 1.2.53 ### Patch Changes diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json index 77ef133b21..79a3e73731 100644 --- a/packages/adapter-auto/package.json +++ b/packages/adapter-auto/package.json @@ -1,6 +1,6 @@ { "name": "houdini-adapter-auto", - "version": "1.2.53", + "version": "1.2.55", "description": "An adapter for deploying your Houdini application according to the build environment ", "keywords": [ "houdini", diff --git a/packages/adapter-cloudflare/CHANGELOG.md b/packages/adapter-cloudflare/CHANGELOG.md index 4f589e433c..2c411d2e98 100644 --- a/packages/adapter-cloudflare/CHANGELOG.md +++ b/packages/adapter-cloudflare/CHANGELOG.md @@ -1,5 +1,19 @@ # houdini-adapter-cloudflare +## 1.2.55 + +### Patch Changes + +- Updated dependencies [[`98859e78`](https://github.com/HoudiniGraphql/houdini/commit/98859e78e088cf733edc35b3ad96b1a1f9f48b79), [`5add29a6`](https://github.com/HoudiniGraphql/houdini/commit/5add29a68489fd9382d0809cf574a1db2746aae8)]: + - houdini@1.2.55 + +## 1.2.54 + +### Patch Changes + +- Updated dependencies []: + - houdini@1.2.54 + ## 1.2.53 ### Patch Changes diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index 5ee507ff8d..5afbfb6b72 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "houdini-adapter-cloudflare", - "version": "1.2.53", + "version": "1.2.55", "description": "The adapter for deploying your Houdini application to Cloudflare Pages", "keywords": [ "houdini", diff --git a/packages/adapter-node/CHANGELOG.md b/packages/adapter-node/CHANGELOG.md index 4c6bc19b9c..91fae52ea7 100644 --- a/packages/adapter-node/CHANGELOG.md +++ b/packages/adapter-node/CHANGELOG.md @@ -1,5 +1,19 @@ # houdini-adapter-node +## 1.2.55 + +### Patch Changes + +- Updated dependencies [[`98859e78`](https://github.com/HoudiniGraphql/houdini/commit/98859e78e088cf733edc35b3ad96b1a1f9f48b79), [`5add29a6`](https://github.com/HoudiniGraphql/houdini/commit/5add29a68489fd9382d0809cf574a1db2746aae8)]: + - houdini@1.2.55 + +## 1.2.54 + +### Patch Changes + +- Updated dependencies []: + - houdini@1.2.54 + ## 1.2.53 ### Patch Changes diff --git a/packages/adapter-node/package.json b/packages/adapter-node/package.json index 456d52d81c..0e57653b30 100644 --- a/packages/adapter-node/package.json +++ b/packages/adapter-node/package.json @@ -1,6 +1,6 @@ { "name": "houdini-adapter-node", - "version": "1.2.53", + "version": "1.2.55", "description": "The adapter for deploying your Houdini application as a standalone node server", "keywords": [ "houdini", diff --git a/packages/adapter-static/CHANGELOG.md b/packages/adapter-static/CHANGELOG.md index ab80826a76..47e1497cb4 100644 --- a/packages/adapter-static/CHANGELOG.md +++ b/packages/adapter-static/CHANGELOG.md @@ -1,5 +1,19 @@ # houdini-adapter-static +## 1.2.55 + +### Patch Changes + +- Updated dependencies [[`98859e78`](https://github.com/HoudiniGraphql/houdini/commit/98859e78e088cf733edc35b3ad96b1a1f9f48b79), [`5add29a6`](https://github.com/HoudiniGraphql/houdini/commit/5add29a68489fd9382d0809cf574a1db2746aae8)]: + - houdini@1.2.55 + +## 1.2.54 + +### Patch Changes + +- Updated dependencies []: + - houdini@1.2.54 + ## 1.2.53 ### Patch Changes diff --git a/packages/adapter-static/package.json b/packages/adapter-static/package.json index 602785d607..4b50d6534d 100644 --- a/packages/adapter-static/package.json +++ b/packages/adapter-static/package.json @@ -1,6 +1,6 @@ { "name": "houdini-adapter-static", - "version": "1.2.53", + "version": "1.2.55", "description": "The adapter for deploying your Houdini application as a single-page application without a server component", "keywords": [ "houdini", diff --git a/packages/create-houdini/CHANGELOG.md b/packages/create-houdini/CHANGELOG.md index 44b10514fa..2b8b9ce258 100644 --- a/packages/create-houdini/CHANGELOG.md +++ b/packages/create-houdini/CHANGELOG.md @@ -1,5 +1,9 @@ # create-houdini +## 1.2.55 + +## 1.2.54 + ## 1.2.53 ## 1.2.52 diff --git a/packages/create-houdini/package.json b/packages/create-houdini/package.json index 209db1c24c..62994ced01 100644 --- a/packages/create-houdini/package.json +++ b/packages/create-houdini/package.json @@ -1,6 +1,6 @@ { "name": "create-houdini", - "version": "1.2.53", + "version": "1.2.55", "description": "A CLI for creating new Houdini projects", "repository": { "type": "git", diff --git a/packages/houdini-react/CHANGELOG.md b/packages/houdini-react/CHANGELOG.md index d36da8fe19..80dc123b36 100644 --- a/packages/houdini-react/CHANGELOG.md +++ b/packages/houdini-react/CHANGELOG.md @@ -1,5 +1,21 @@ # houdini-react +## 1.2.55 + +### Patch Changes + +- [#1337](https://github.com/HoudiniGraphql/houdini/pull/1337) [`5add29a6`](https://github.com/HoudiniGraphql/houdini/commit/5add29a68489fd9382d0809cf574a1db2746aae8) Thanks [@AlecAivazis](https://github.com/AlecAivazis)! - Various fixes for optimistic use cases + +- Updated dependencies [[`98859e78`](https://github.com/HoudiniGraphql/houdini/commit/98859e78e088cf733edc35b3ad96b1a1f9f48b79), [`5add29a6`](https://github.com/HoudiniGraphql/houdini/commit/5add29a68489fd9382d0809cf574a1db2746aae8)]: + - houdini@1.2.55 + +## 1.2.54 + +### Patch Changes + +- Updated dependencies []: + - houdini@1.2.54 + ## 1.2.53 ### Patch Changes diff --git a/packages/houdini-react/package.json b/packages/houdini-react/package.json index bb95109b64..ce352901df 100644 --- a/packages/houdini-react/package.json +++ b/packages/houdini-react/package.json @@ -1,6 +1,6 @@ { "name": "houdini-react", - "version": "1.2.53", + "version": "1.2.55", "description": "The React plugin for houdini", "keywords": [ "typescript", diff --git a/packages/houdini-svelte/CHANGELOG.md b/packages/houdini-svelte/CHANGELOG.md index 7d405024e9..7bfd0c5ebd 100644 --- a/packages/houdini-svelte/CHANGELOG.md +++ b/packages/houdini-svelte/CHANGELOG.md @@ -1,5 +1,21 @@ # houdini-svelte +## 1.2.55 + +### Patch Changes + +- Updated dependencies [[`98859e78`](https://github.com/HoudiniGraphql/houdini/commit/98859e78e088cf733edc35b3ad96b1a1f9f48b79), [`5add29a6`](https://github.com/HoudiniGraphql/houdini/commit/5add29a68489fd9382d0809cf574a1db2746aae8)]: + - houdini@1.2.55 + +## 1.2.54 + +### Patch Changes + +- [#1334](https://github.com/HoudiniGraphql/houdini/pull/1334) [`a4fac956`](https://github.com/HoudiniGraphql/houdini/commit/a4fac95634584d38f9e78329fc69b1bd8cc2412d) Thanks @fnimick! - Fix filesystem patches to not use illegal paths + +- Updated dependencies []: + - houdini@1.2.54 + ## 1.2.53 ### Patch Changes diff --git a/packages/houdini-svelte/package.json b/packages/houdini-svelte/package.json index d16bfb7b71..f5e570b5aa 100644 --- a/packages/houdini-svelte/package.json +++ b/packages/houdini-svelte/package.json @@ -1,6 +1,6 @@ { "name": "houdini-svelte", - "version": "1.2.53", + "version": "1.2.55", "description": "The svelte plugin for houdini", "keywords": [ "typescript", diff --git a/packages/houdini/CHANGELOG.md b/packages/houdini/CHANGELOG.md index cf6fd490eb..80807716bf 100644 --- a/packages/houdini/CHANGELOG.md +++ b/packages/houdini/CHANGELOG.md @@ -1,5 +1,15 @@ # houdini +## 1.2.55 + +### Patch Changes + +- [#1339](https://github.com/HoudiniGraphql/houdini/pull/1339) [`98859e78`](https://github.com/HoudiniGraphql/houdini/commit/98859e78e088cf733edc35b3ad96b1a1f9f48b79) Thanks [@AlecAivazis](https://github.com/AlecAivazis)! - Fix circular import in generated runtime + +- [#1337](https://github.com/HoudiniGraphql/houdini/pull/1337) [`5add29a6`](https://github.com/HoudiniGraphql/houdini/commit/5add29a68489fd9382d0809cf574a1db2746aae8) Thanks [@AlecAivazis](https://github.com/AlecAivazis)! - Various fixes for optimistic use cases + +## 1.2.54 + ## 1.2.53 ### Patch Changes diff --git a/packages/houdini/package.json b/packages/houdini/package.json index e784f9ca0f..19c81e50fe 100644 --- a/packages/houdini/package.json +++ b/packages/houdini/package.json @@ -1,6 +1,6 @@ { "name": "houdini", - "version": "1.2.53", + "version": "1.2.55", "description": "The disappearing GraphQL clients", "keywords": [ "typescript", diff --git a/packages/houdini/src/runtime/cache/cache.ts b/packages/houdini/src/runtime/cache/cache.ts index 1ef490d907..581314933b 100644 --- a/packages/houdini/src/runtime/cache/cache.ts +++ b/packages/houdini/src/runtime/cache/cache.ts @@ -20,7 +20,7 @@ import { ListManager } from './lists' import { StaleManager } from './staleManager' import type { Layer, LayerID } from './storage' import { InMemoryStorage } from './storage' -import { evaluateKey } from './stuff' +import { evaluateKey, rootID } from './stuff' import { InMemorySubscriptions, type FieldSelection } from './subscription' export class Cache { @@ -146,21 +146,28 @@ export class Cache { } // when an optimistic key resolves, we might momentarily know the same record by different IDs - registerKeyMap(source: string | number, mapped: string | number) { + registerKeyMap(source: string, mapped: string) { this._internal_unstable.storage.registerIDMapping(source, mapped) + this._internal_unstable.subscriptions.copySubscribers(source, mapped) } // remove the record from the cache's store and unsubscribe from it delete(id: string, layer?: Layer) { - // clean up any subscribers associated with the record before we destroy the actual values that will let us - // walk down - this._internal_unstable.subscriptions.removeAllSubscribers(id) + const recordIDs = [this._internal_unstable.storage.idMaps[id], id].filter( + Boolean + ) as string[] - // make sure we remove the id from any lists that it appears in - this._internal_unstable.lists.removeIDFromAllLists(id, layer) + for (const recordID of recordIDs) { + // clean up any subscribers associated with the record before we destroy the actual values that will let us + // walk down + this._internal_unstable.subscriptions.removeAllSubscribers(recordID) - // delete the record from the store - this._internal_unstable.storage.delete(id, layer) + // make sure we remove the id from any lists that it appears in + this._internal_unstable.lists.removeIDFromAllLists(recordID, layer) + + // delete the record from the store + this._internal_unstable.storage.delete(recordID, layer) + } } // set the cache's config @@ -702,6 +709,12 @@ class CacheInternal { forceNotify, }) + // we have to do something different if we are writing to an optimistic layer or not + let action = () => { + // update the cached value + layer.writeLink(parent, key, linkedIDs) + } + // if we're supposed to apply this write as an update, we need to figure out how if (applyUpdates && updates) { // if we are updating the edges field, we might need to do a little more than just @@ -738,7 +751,6 @@ class CacheInternal { // look up the node reference const { value } = this.storage.get(id, 'node') const node = value as string - // if the id is being adding and is part of the empty edges, don't include it if (newNodeIDs.includes(node) && emptyEdges.includes(node)) { return false @@ -759,10 +771,28 @@ class CacheInternal { // if we have to prepend it, do so if (update === 'prepend') { linkedIDs = newIDs.concat(oldIDs as (string | null)[]) + if (layer?.optimistic) { + action = () => { + for (const id of newIDs) { + if (id) { + layer.insert(parent, key, 'start', id) + } + } + } + } } // otherwise we might have to append it else if (update === 'append') { linkedIDs = oldIDs.concat(newIDs) + if (layer?.optimistic) { + action = () => { + for (const id of newIDs) { + if (id) { + layer.insert(parent, key, 'end', id) + } + } + } + } } // if the update is a replace do the right thing else if (update === 'replace') { @@ -798,8 +828,7 @@ class CacheInternal { // if there was a change in the list if (contentChanged || (oldIDs.length === 0 && newIDs.length === 0)) { - // update the cached value - layer.writeLink(parent, key, linkedIDs) + action() } // every new id that isn't a prevous relationship needs a new subscriber @@ -903,6 +932,13 @@ class CacheInternal { if (!targetID) { continue } + + toNotify.push( + ...this.subscriptions + .getAll(targetID) + .filter((sub) => sub[0].parentID !== targetID) + ) + this.cache.delete(targetID, layer) } } @@ -928,7 +964,7 @@ class CacheInternal { stepsFromConnection?: number | null ignoreMasking?: boolean loading?: boolean - // if this is true then we are ignoring masking and checking the full selection for + // if this is true then we are ignoring masking and checking the full select // data. we will still return the masked value if we have it. fullCheck?: boolean }): { @@ -1549,9 +1585,6 @@ export function variableValue(value: ValueNode, args: GraphQLObject): GraphQLVal } } -// fields on the root of the data store are keyed with a fixed id -export const rootID = '_ROOT_' - type DisplaySummary = { id: string; field: string; value?: any } export function fragmentReference({ diff --git a/packages/houdini/src/runtime/cache/constants.ts b/packages/houdini/src/runtime/cache/constants.ts new file mode 100644 index 0000000000..c2057ff7cb --- /dev/null +++ b/packages/houdini/src/runtime/cache/constants.ts @@ -0,0 +1,2 @@ +// fields on the root of the data store are keyed with a fixed id +export const rootID = '_ROOT_' diff --git a/packages/houdini/src/runtime/cache/lists.ts b/packages/houdini/src/runtime/cache/lists.ts index 72302e81e5..a06c2f0cfa 100644 --- a/packages/houdini/src/runtime/cache/lists.ts +++ b/packages/houdini/src/runtime/cache/lists.ts @@ -1,8 +1,8 @@ import { flatten } from '../lib/flatten' import type { SubscriptionSelection, ListWhen, SubscriptionSpec, NestedList } from '../lib/types' import type { Cache } from './cache' -import { rootID } from './cache' import type { Layer } from './storage' +import { rootID } from './stuff' export class ListManager { rootID: string @@ -120,11 +120,16 @@ export class ListManager { } removeIDFromAllLists(id: string, layer?: Layer) { + let removed = false for (const fieldMap of this.lists.values()) { for (const list of fieldMap.values()) { - list.removeID(id, undefined, layer) + if (list.removeID(id, undefined, layer)) { + removed = true + } } } + + return removed } deleteField(parentID: string, field: string) { @@ -239,7 +244,7 @@ export class List { // figure out the id of the type we are adding const dataID = this.cache._internal_unstable.id(listType, data) - // if there are conditions for this operation + // validate any conditions for this operation if (!this.validateWhen() || !dataID) { return } @@ -544,7 +549,14 @@ export class ListCollection { } removeID(...args: Parameters) { - this.lists.forEach((list) => list.removeID(...args)) + let removed = false + this.lists.forEach((list) => { + if (list.removeID(...args)) { + removed = true + } + }) + + return removed } remove(...args: Parameters) { diff --git a/packages/houdini/src/runtime/cache/schema.ts b/packages/houdini/src/runtime/cache/schema.ts deleted file mode 100644 index 9bb03bea2e..0000000000 --- a/packages/houdini/src/runtime/cache/schema.ts +++ /dev/null @@ -1,68 +0,0 @@ -import type { ConfigFile } from '../lib/config' -import type { Cache } from './cache' -import { rootID } from './cache' - -export type TypeInfo = { - type: string - nullable: boolean - link: boolean -} - -export class SchemaManager { - cache: Cache - - // fundamentally the schema manager is responsible for tracking - // the type information of every field for a given type in the schema - fieldTypes: Record> = {} - - constructor(cache: Cache) { - this.cache = cache - } - - setFieldType({ - parent, - key, - type, - nullable = false, - link, - }: { - parent: string - key: string - type: string - nullable?: boolean - link?: boolean - }) { - // convert the key into the field name - let parensIndex = key.indexOf('(') - if (parensIndex !== -1) { - key = key.substring(0, parensIndex) - } - - // convert the id into a type - if (parent === rootID) { - parent = 'Query' - } else if (parent.includes(':')) { - parent = parent.substring(0, parent.indexOf(':')) - } - - // make sure there is a place to register the field information - if (!this.fieldTypes[parent]) { - this.fieldTypes[parent] = {} - } - - // register the field information - this.fieldTypes[parent][key] = { - type, - nullable, - link: !!link, - } - } - - fieldType(type: string, field: string) { - return this.fieldTypes[type]?.[field] || null - } - - get config(): ConfigFile { - return this.cache._internal_unstable.config - } -} diff --git a/packages/houdini/src/runtime/cache/storage.ts b/packages/houdini/src/runtime/cache/storage.ts index 2a11cd84ce..80c6a6eb87 100644 --- a/packages/houdini/src/runtime/cache/storage.ts +++ b/packages/houdini/src/runtime/cache/storage.ts @@ -10,7 +10,7 @@ export class InMemoryStorage { data: Layer[] private idCount = 1 private rank = 0 - private idMaps: Record = {} + idMaps: Record = {} constructor() { this.data = [] @@ -24,8 +24,9 @@ export class InMemoryStorage { return this.rank++ } - registerIDMapping(from: string | number, to: string | number) { + registerIDMapping(from: string, to: string) { this.idMaps[from] = to + this.idMaps[to] = from } // create a layer and return its id @@ -45,12 +46,12 @@ export class InMemoryStorage { return this.topLayer.insert(id, field, location, target) } - remove(id: string, field: string, target: string, layerToUser = this.topLayer) { - return layerToUser.remove(id, field, target) + remove(id: string, field: string, target: string, layer = this.topLayer) { + return layer.remove(id, field, target) } - delete(id: string, layerToUser = this.topLayer) { - return layerToUser.delete(id) + delete(id: string, layer = this.topLayer) { + return layer.delete(id) } deleteField(id: string, field: string) { @@ -112,6 +113,9 @@ export class InMemoryStorage { return } operations.remove.add(v) + if (this.idMaps[v]) { + operations.remove.add(this.idMaps[v]) + } }) // if we don't have a value to return, we're done @@ -153,7 +157,11 @@ export class InMemoryStorage { } // inserts are sorted by location if (isInsertOperation(op)) { - operations.insert[op.location].unshift(op.id) + if (op.location === OperationLocation.end) { + operations.insert[op.location].unshift(op.id) + } else { + operations.insert[op.location].push(op.id) + } } // if we found a delete operation, we're done if (isDeleteOperation(op)) { @@ -519,7 +527,7 @@ export class Layer { const fields: OperationMap['fieldName']['fields'] = {} // merge the two operation maps - for (const opMap of [this.operations[id], layer.operations[id]].filter(Boolean)) { + for (const opMap of [layer.operations[id], this.operations[id]].filter(Boolean)) { for (const [fieldName, operations] of Object.entries(opMap.fields || {})) { fields[fieldName] = [...(fields[fieldName] || []), ...operations] } diff --git a/packages/houdini/src/runtime/cache/stuff.ts b/packages/houdini/src/runtime/cache/stuff.ts index 790bfc91a8..7085ffebbd 100644 --- a/packages/houdini/src/runtime/cache/stuff.ts +++ b/packages/houdini/src/runtime/cache/stuff.ts @@ -51,3 +51,6 @@ export function evaluateKey(key: string, variables: Record | null = // the list of characters that make up a valid graphql variable name const varChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789' + +// fields on the root of the data store are keyed with a fixed id +export const rootID = '_ROOT_' diff --git a/packages/houdini/src/runtime/cache/subscription.ts b/packages/houdini/src/runtime/cache/subscription.ts index c9569f8f0b..c61d6dcf64 100644 --- a/packages/houdini/src/runtime/cache/subscription.ts +++ b/packages/houdini/src/runtime/cache/subscription.ts @@ -6,8 +6,8 @@ import type { SubscriptionSpec, NestedList, } from '../lib/types' -import { rootID, type Cache } from './cache' -import { evaluateKey } from './stuff' +import { type Cache } from './cache' +import { evaluateKey, rootID } from './stuff' export type FieldSelection = [ SubscriptionSpec, @@ -39,6 +39,10 @@ export class InMemorySubscriptions { return Object.keys(this.subscribers.get(parent) || {}) } + copySubscribers(from: string, to: string) { + this.subscribers.set(to, this.subscribers.get(from) || new Map()) + } + add({ parent, spec, @@ -304,6 +308,12 @@ export class InMemorySubscriptions { return this.subscribers.get(id)?.get(field)?.selections || [] } + getAll(id: string): FieldSelection[] { + return [...(this.subscribers.get(id)?.values() || [])].flatMap( + (fieldSub) => fieldSub.selections + ) + } + remove( id: string, selection: SubscriptionSelection, @@ -379,9 +389,8 @@ export class InMemorySubscriptions { return } const subscriberField = subscriber.get(fieldName) - for (const spec of specs) { - const counts = subscriber.get(fieldName)?.referenceCounts + const counts = subscriberField?.referenceCounts // if we dont know this field/set combo, there's nothing to do (probably a bug somewhere) if (!counts?.has(spec.set)) { @@ -417,42 +426,28 @@ export class InMemorySubscriptions { } } - removeAllSubscribers(id: string, targets?: SubscriptionSpec[], visited: string[] = []) { - visited.push(id) - - const subscriber = this.subscribers.get(id) - // every field that currently being subscribed to needs to be cleaned up - for (const [key, val] of subscriber?.entries() ?? []) { - // grab the current set of subscribers - const subscribers = targets || val.selections.map(([spec]) => spec) - - // delete the subscriber for the field - this.removeSubscribers(id, key, subscribers) - - // look up the value for the field so we can remove any subscribers that existed because of a - // subscriber to this record - const { value, kind } = this.cache._internal_unstable.storage.get(id, key) - - // if the field is a scalar, there's nothing more to do - if (kind === 'scalar') { - continue - } - - // if the value is a single link , wrap it in a list. otherwise, flatten the link list - const nextTargets = Array.isArray(value) - ? flatten(value as NestedList) - : [value as string] - - for (const id of nextTargets) { - // if we have already visited this id, move on - if (visited.includes(id)) { - continue - } + removeAllSubscribers(id: string, targets?: SubscriptionSpec[]) { + // get the list of subscriptions specs for the id if we didn't provide a specific list + if (!targets) { + targets = [...(this.subscribers.get(id)?.values() || [])].flatMap((spec) => + spec.selections.flatMap((sel) => sel[0]!) + ) + } - // keep walking down - this.removeAllSubscribers(id, subscribers, visited) + for (const target of targets) { + // we shouldn't use the root selection here because we only care about the subselections + // related to the target + for (const subselection of this.findSubSelections( + target.parentID || rootID, + target.selection, + target.variables || {}, + id + )) { + this.remove(id, subselection, targets, target.variables || {}) } } + + return } get size() { @@ -465,4 +460,58 @@ export class InMemorySubscriptions { return size } + + findSubSelections( + parentID: string, + selection: SubscriptionSelection, + variables: {}, + searchTarget: string, + selections = [] as Array + ): Array { + // walk down the selection, looking up cached information along the way to identity instances where + // the target id is embedded inside of the selection + + // figure out the correct selection + const __typename = this.cache._internal_unstable.storage.get(parentID, '__typename') + .value as string + let targetSelection = getFieldsForType(selection, __typename, false) + + // look at the fields for ones corresponding to links + for (const fieldSelection of Object.values(targetSelection || {})) { + // if the field points to a link then we need to see if the linked record + // is the one we are looking for + if (!fieldSelection.selection) { + continue + } + + const key = evaluateKey(fieldSelection.keyRaw, variables || {}) + + const linkedRecord = this.cache._internal_unstable.storage.get(parentID, key) + // if the links aren't an array then wrap it + const links = !Array.isArray(linkedRecord.value) + ? [linkedRecord.value as string] + : flatten(linkedRecord.value as NestedList) + + // if we found a selection that includes the target, great - we're done and walking down + // will unsubscribe from everything + if (links.includes(searchTarget)) { + selections.push(fieldSelection.selection) + } + // if we didn't find the target, we need to keep walking down the selection. maybe its somewhere + else { + // we need to keep walking down the selection + for (const link of links) { + this.findSubSelections( + link, + fieldSelection.selection, + variables, + searchTarget, + selections + ) + } + } + } + + return selections + } } diff --git a/packages/houdini/src/runtime/cache/tests/list.test.ts b/packages/houdini/src/runtime/cache/tests/list.test.ts index 076f84af1b..296b872d8e 100644 --- a/packages/houdini/src/runtime/cache/tests/list.test.ts +++ b/packages/houdini/src/runtime/cache/tests/list.test.ts @@ -1522,7 +1522,7 @@ test('inserting data with an update overwrites a record inserted with list.appen }, } - // start off associated with one object + // start off associated with just one object cache.write({ selection, data: { @@ -1685,6 +1685,38 @@ test('inserting data with an update overwrites a record inserted with list.appen }, }, }) + + expect( + cache.read({ + selection, + }) + ).toEqual({ + data: { + viewer: { + friends: { + edges: [ + { + node: { + __typename: 'User', + firstName: 'jane', + id: '2', + }, + }, + { + node: { + __typename: 'User', + firstName: 'mary', + id: '3', + }, + }, + ], + }, + id: '1', + }, + }, + partial: false, + stale: false, + }) }) test('list filter - must_not positive', function () { @@ -5327,8 +5359,42 @@ test('inserting in list at a specific layer affects just that layer', function ( {} ) + // write some data before the layer + cache.write({ + selection: { + fields: { + newUser: { + type: 'User', + visible: true, + keyRaw: 'newUser', + operations: [ + { + action: 'insert', + list: 'All_Users', + }, + ], + selection: { + fields: { + id: { + type: 'ID', + visible: true, + keyRaw: 'id', + }, + }, + }, + }, + }, + }, + data: { + newUser: { + id: '2', + }, + }, + }) + // create a layer that we will write against const layer = cache._internal_unstable.storage.createLayer(true) + // write some data to the specific layer cache.write({ selection: { @@ -5363,6 +5429,12 @@ test('inserting in list at a specific layer affects just that layer', function ( }, }) - // make sure the layer has what we expect - expect(layer.links['User:1'].friends).toEqual(['User:3']) + expect(layer.operations['User:1'].fields['friends']).toEqual([ + { + id: 'User:3', + kind: 'insert', + location: 'end', + }, + ]) + expect(layer.links['User:1']).not.toBeDefined() }) diff --git a/packages/houdini/src/runtime/cache/tests/readwrite.test.ts b/packages/houdini/src/runtime/cache/tests/readwrite.test.ts index 5bd6aeae0c..20c7d6e722 100644 --- a/packages/houdini/src/runtime/cache/tests/readwrite.test.ts +++ b/packages/houdini/src/runtime/cache/tests/readwrite.test.ts @@ -2,7 +2,8 @@ import { test, expect } from 'vitest' import { testConfigFile } from '../../../test' import type { SubscriptionSelection } from '../../lib' -import { Cache, rootID } from '../cache' +import { Cache } from '../cache' +import { rootID } from '../stuff' const config = testConfigFile() diff --git a/packages/houdini/src/runtime/cache/tests/required.test.ts b/packages/houdini/src/runtime/cache/tests/required.test.ts index 11e67ec2bc..8731677266 100644 --- a/packages/houdini/src/runtime/cache/tests/required.test.ts +++ b/packages/houdini/src/runtime/cache/tests/required.test.ts @@ -2,7 +2,8 @@ import { test, expect } from 'vitest' import { testConfigFile } from '../../../test' import type { SubscriptionSelection } from '../../lib/types' -import { Cache, rootID } from '../cache' +import { Cache } from '../cache' +import { rootID } from '../stuff' const config = testConfigFile() diff --git a/packages/houdini/src/runtime/cache/tests/scalars.test.ts b/packages/houdini/src/runtime/cache/tests/scalars.test.ts index d75b6f988e..a750a3bc23 100644 --- a/packages/houdini/src/runtime/cache/tests/scalars.test.ts +++ b/packages/houdini/src/runtime/cache/tests/scalars.test.ts @@ -3,7 +3,8 @@ import { test, expect } from 'vitest' import { testConfigFile } from '../../../test' import type { SubscriptionSelection } from '../../lib/types' import { RefetchUpdateMode } from '../../lib/types' -import { Cache, rootID } from '../cache' +import { Cache } from '../cache' +import { rootID } from '../stuff' const config = testConfigFile({ scalars: { diff --git a/packages/houdini/src/runtime/cache/tests/storage.test.ts b/packages/houdini/src/runtime/cache/tests/storage.test.ts index 8b32e02a92..ce9e685e67 100644 --- a/packages/houdini/src/runtime/cache/tests/storage.test.ts +++ b/packages/houdini/src/runtime/cache/tests/storage.test.ts @@ -346,34 +346,103 @@ describe('in memory layers', function () { }) }) - test('insert into linked list', function () { + test('insert into end of linked list', function () { const storage = new InMemoryStorage() // add a linked list that we will append to in an optimistic layer const baseLayerID = storage.writeLink('User:1', 'friends', ['User:2']) // create an optimistic layer and insert a new friend - const layer = storage.createLayer(true) - layer.insert('User:1', 'friends', OperationLocation.end, 'User:3') + const layer1 = storage.createLayer(true) + layer1.insert('User:1', 'friends', OperationLocation.end, 'User:3') // insert some more records in a non-optimistic layer storage.insert('User:1', 'friends', OperationLocation.end, 'User:5') + const layer3 = storage.topLayer // make sure we got the full list back expect(storage.get('User:1', 'friends')).toEqual({ value: ['User:2', 'User:3', 'User:5'], - displayLayers: [storage.topLayer.id, layer.id, baseLayerID], + displayLayers: [storage.topLayer.id, layer1.id, baseLayerID], + kind: 'link', + }) + + // create an optimistic layer and insert a new friend + const layer2 = storage.createLayer(true) + layer2.insert('User:1', 'friends', OperationLocation.end, 'User:6') + + // make sure we got the full list back + expect(storage.get('User:1', 'friends')).toEqual({ + value: ['User:2', 'User:3', 'User:5', 'User:6'], + displayLayers: [layer2.id, layer3.id, layer1.id, baseLayerID], kind: 'link', }) // simulate a mutation response with different data (clear the layer, add a new record, and resolve it) - layer.clear() - layer.insert('User:1', 'friends', OperationLocation.end, 'User:4') - storage.resolveLayer(layer.id) + layer2.clear() + layer2.insert('User:1', 'friends', OperationLocation.end, 'User:7') + storage.resolveLayer(layer2.id) + + // simulate a mutation response with different data (clear the layer, add a new record, and resolve it) + layer1.clear() + layer1.insert('User:1', 'friends', OperationLocation.end, 'User:4') + storage.resolveLayer(layer1.id) // look up the linked list expect(storage.get('User:1', 'friends')).toEqual({ - value: ['User:2', 'User:5', 'User:4'], + value: ['User:2', 'User:4', 'User:5', 'User:7'], + displayLayers: [baseLayerID], + kind: 'link', + }) + // there should only be one layer + expect(storage.layerCount).toEqual(1) + }) + + test('insert into start of linked list', function () { + const storage = new InMemoryStorage() + + // add a linked list that we will append to in an optimistic layer + const baseLayerID = storage.writeLink('User:1', 'friends', ['User:2']) + + // create an optimistic layer and insert a new friend + const layer1 = storage.createLayer(true) + layer1.insert('User:1', 'friends', OperationLocation.start, 'User:3') + + // insert some more records in a non-optimistic layer + storage.insert('User:1', 'friends', OperationLocation.start, 'User:5') + const layer3 = storage.topLayer + + // make sure we got the full list back + expect(storage.get('User:1', 'friends')).toEqual({ + value: ['User:5', 'User:3', 'User:2'], + displayLayers: [storage.topLayer.id, layer1.id, baseLayerID], + kind: 'link', + }) + + // create an optimistic layer and insert a new friend + const layer2 = storage.createLayer(true) + layer2.insert('User:1', 'friends', OperationLocation.start, 'User:6') + + // make sure we got the full list back + expect(storage.get('User:1', 'friends')).toEqual({ + value: ['User:6', 'User:5', 'User:3', 'User:2'], + displayLayers: [layer2.id, layer3.id, layer1.id, baseLayerID], + kind: 'link', + }) + + // simulate a mutation response with different data (clear the layer, add a new record, and resolve it) + layer2.clear() + layer2.insert('User:1', 'friends', OperationLocation.start, 'User:7') + storage.resolveLayer(layer2.id) + + // simulate a mutation response with different data (clear the layer, add a new record, and resolve it) + layer1.clear() + layer1.insert('User:1', 'friends', OperationLocation.start, 'User:4') + storage.resolveLayer(layer1.id) + + // look up the linked list + expect(storage.get('User:1', 'friends')).toEqual({ + value: ['User:7', 'User:5', 'User:4', 'User:2'], displayLayers: [baseLayerID], kind: 'link', }) @@ -417,6 +486,33 @@ describe('in memory layers', function () { expect(storage.layerCount).toEqual(1) }) + test('a delete and insert on the same layer correctly cancel out', function () { + const storage = new InMemoryStorage() + + // add a linked list we will remove from in a layer + const baseLayerID = storage.writeLink('User:1', 'friends', ['User:3', 'User:4']) + + // create an optimistic layer we will use to mutate the list + const layer = storage.createLayer(true) + // insert the same user + layer.remove('User:1', 'friends', 'User:2') + layer.insert('User:1', 'friends', 'end', 'User:2') + + // make sure we removed the user from the list + expect(storage.get('User:1', 'friends')).toEqual({ + value: ['User:3', 'User:4'], + displayLayers: [layer.id, baseLayerID], + kind: 'link', + }) + + // make sure we removed the user from the list + expect(storage.get('User:1', 'friends')).toEqual({ + value: ['User:3', 'User:4'], + displayLayers: [layer.id, baseLayerID], + kind: 'link', + }) + }) + test.todo( 'resolving layer with deletes and fields removes old data and retains the new stuff' ) diff --git a/packages/houdini/src/runtime/cache/tests/subscriptions.test.ts b/packages/houdini/src/runtime/cache/tests/subscriptions.test.ts index e2ecaef0a7..0a09e5f2cb 100644 --- a/packages/houdini/src/runtime/cache/tests/subscriptions.test.ts +++ b/packages/houdini/src/runtime/cache/tests/subscriptions.test.ts @@ -4,6 +4,7 @@ import { testConfigFile } from '../../../test' import type { SubscriptionSelection } from '../../lib' import { RefetchUpdateMode } from '../../lib' import { Cache } from '../cache' +import { rootID } from '../stuff' const config = testConfigFile() @@ -1128,6 +1129,11 @@ test('deleting a node removes nested subscriptions', function () { keyRaw: 'viewer', selection: { fields: { + __typename: { + type: 'String', + visible: true, + keyRaw: '__typename', + }, id: { type: 'ID', visible: true, @@ -1144,6 +1150,11 @@ test('deleting a node removes nested subscriptions', function () { }, selection: { fields: { + __typename: { + type: 'String', + visible: true, + keyRaw: '__typename', + }, id: { type: 'ID', visible: true, @@ -1168,9 +1179,11 @@ test('deleting a node removes nested subscriptions', function () { selection, data: { viewer: { + __typename: 'User', id: '1', friends: [ { + __typename: 'User', id: '2', firstName: 'jane', }, @@ -1199,6 +1212,369 @@ test('deleting a node removes nested subscriptions', function () { expect(cache._internal_unstable.subscriptions.get('User:2', 'firstName')).toHaveLength(0) }) +test('find subSelection', function () { + // instantiate a cache + const cache = new Cache(config) + + const selection: SubscriptionSelection = { + fields: { + viewer: { + type: 'User', + visible: true, + keyRaw: 'viewer', + selection: { + fields: { + __typename: { + type: 'String', + visible: true, + keyRaw: '__typename', + }, + id: { + type: 'ID', + visible: true, + keyRaw: 'id', + }, + friends: { + type: 'User', + visible: true, + keyRaw: 'friends', + list: { + name: 'All_Users', + connection: false, + type: 'User', + }, + selection: { + fields: { + __typename: { + type: 'String', + visible: true, + keyRaw: '__typename', + }, + id: { + type: 'ID', + visible: true, + keyRaw: 'id', + }, + firstName: { + type: 'String', + visible: true, + keyRaw: 'firstName', + }, + }, + }, + }, + }, + }, + }, + }, + } + + // start off associated with one object + cache.write({ + selection, + data: { + viewer: { + __typename: 'User', + id: '1', + friends: [ + { + __typename: 'User', + id: '2', + firstName: 'jane', + }, + ], + }, + }, + }) + + const subSelections = cache._internal_unstable.subscriptions.findSubSelections( + rootID, + selection, + {}, + 'User:1' + ) + + expect(subSelections).toEqual([ + { + fields: { + __typename: { + type: 'String', + visible: true, + keyRaw: '__typename', + }, + id: { + type: 'ID', + visible: true, + keyRaw: 'id', + }, + friends: { + type: 'User', + visible: true, + keyRaw: 'friends', + list: { + name: 'All_Users', + connection: false, + type: 'User', + }, + selection: { + fields: { + __typename: { + type: 'String', + visible: true, + keyRaw: '__typename', + }, + id: { + type: 'ID', + visible: true, + keyRaw: 'id', + }, + firstName: { + type: 'String', + visible: true, + keyRaw: 'firstName', + }, + }, + }, + }, + }, + }, + ]) +}) + +test('find subSelection - avoid cycles', function () { + // instantiate a cache + const cache = new Cache(config) + + const selection: SubscriptionSelection = { + fields: { + viewer: { + type: 'User', + visible: true, + keyRaw: 'viewer', + selection: { + fields: { + __typename: { + type: 'String', + visible: true, + keyRaw: '__typename', + }, + id: { + type: 'ID', + visible: true, + keyRaw: 'id', + }, + friends: { + type: 'User', + visible: true, + keyRaw: 'friends', + list: { + name: 'All_Users', + connection: false, + type: 'User', + }, + selection: { + fields: { + __typename: { + type: 'String', + visible: true, + keyRaw: '__typename', + }, + id: { + type: 'ID', + visible: true, + keyRaw: 'id', + }, + firstName: { + type: 'String', + visible: true, + keyRaw: 'firstName', + }, + }, + }, + }, + }, + }, + }, + }, + } + + // start off associated with one object + cache.write({ + selection, + data: { + viewer: { + __typename: 'User', + id: '1', + friends: [ + { + __typename: 'User', + id: '1', + firstName: 'jane', + }, + ], + }, + }, + }) + + const subSelections = cache._internal_unstable.subscriptions.findSubSelections( + rootID, + selection, + {}, + 'User:1' + ) + + expect(subSelections).toEqual([ + { + fields: { + __typename: { + type: 'String', + visible: true, + keyRaw: '__typename', + }, + id: { + type: 'ID', + visible: true, + keyRaw: 'id', + }, + friends: { + type: 'User', + visible: true, + keyRaw: 'friends', + list: { + name: 'All_Users', + connection: false, + type: 'User', + }, + selection: { + fields: { + __typename: { + type: 'String', + visible: true, + keyRaw: '__typename', + }, + id: { + type: 'ID', + visible: true, + keyRaw: 'id', + }, + firstName: { + type: 'String', + visible: true, + keyRaw: 'firstName', + }, + }, + }, + }, + }, + }, + ]) +}) + +test('find subSelection - deeply nested', function () { + // instantiate a cache + const cache = new Cache(config) + + const selection: SubscriptionSelection = { + fields: { + viewer: { + type: 'User', + visible: true, + keyRaw: 'viewer', + selection: { + fields: { + __typename: { + type: 'String', + visible: true, + keyRaw: '__typename', + }, + id: { + type: 'ID', + visible: true, + keyRaw: 'id', + }, + friends: { + type: 'User', + visible: true, + keyRaw: 'friends', + list: { + name: 'All_Users', + connection: false, + type: 'User', + }, + selection: { + fields: { + __typename: { + type: 'String', + visible: true, + keyRaw: '__typename', + }, + id: { + type: 'ID', + visible: true, + keyRaw: 'id', + }, + firstName: { + type: 'String', + visible: true, + keyRaw: 'firstName', + }, + }, + }, + }, + }, + }, + }, + }, + } + + // start off associated with one object + cache.write({ + selection, + data: { + viewer: { + __typename: 'User', + id: '1', + friends: [ + { + __typename: 'User', + id: '2', + firstName: 'jane', + }, + ], + }, + }, + }) + + const subSelections = cache._internal_unstable.subscriptions.findSubSelections( + rootID, + selection, + {}, + 'User:2' + ) + + expect(subSelections).toEqual([ + { + fields: { + __typename: { + type: 'String', + visible: true, + keyRaw: '__typename', + }, + id: { + type: 'ID', + visible: true, + keyRaw: 'id', + }, + firstName: { + type: 'String', + visible: true, + keyRaw: 'firstName', + }, + }, + }, + ]) +}) + test('same record twice in a query survives one unsubscribe (reference counting)', function () { // instantiate a cache const cache = new Cache(config) diff --git a/packages/houdini/src/runtime/client/plugins/optimisticKeys.ts b/packages/houdini/src/runtime/client/plugins/optimisticKeys.ts index 656adc2186..0a9e102405 100644 --- a/packages/houdini/src/runtime/client/plugins/optimisticKeys.ts +++ b/packages/houdini/src/runtime/client/plugins/optimisticKeys.ts @@ -137,8 +137,9 @@ export const optimisticKeys = // clean up the caches since we're done with this key delete callbackCache[optimisticValue] }, - onIDChange: (optimisticValue, realValue) => - cache.registerKeyMap(optimisticValue, realValue), + onIDChange: (optimisticValue, realValue) => { + cache.registerKeyMap(optimisticValue, realValue) + }, } ) } @@ -296,7 +297,7 @@ function extractResponseKeys( mutationID: number, events: { onNewKey: (optimisticValue: string | number, realValue: string | number) => void - onIDChange: (optimisticValue: string | number, realValue: string | number) => void + onIDChange: (optimisticValue: string, realValue: string) => void }, objectIDs: OptimisticObjectIDMap = objectIDMap, path: string = '', diff --git a/packages/houdini/src/runtime/public/record.ts b/packages/houdini/src/runtime/public/record.ts index d5333fa968..54e1abf2e7 100644 --- a/packages/houdini/src/runtime/public/record.ts +++ b/packages/houdini/src/runtime/public/record.ts @@ -1,4 +1,4 @@ -import { rootID } from '../cache/cache' +import { rootID } from '../cache/stuff' import { marshalInputs } from '../lib' import { keyFieldsForType } from '../lib/config' import type { FragmentArtifact, GraphQLObject } from '../lib/types' diff --git a/packages/plugin-svelte-global-stores/CHANGELOG.md b/packages/plugin-svelte-global-stores/CHANGELOG.md index 2b6211a09d..31d8f047c8 100644 --- a/packages/plugin-svelte-global-stores/CHANGELOG.md +++ b/packages/plugin-svelte-global-stores/CHANGELOG.md @@ -1,5 +1,21 @@ # houdini-plugin-svelte-global-stores +## 1.2.55 + +### Patch Changes + +- Updated dependencies [[`98859e78`](https://github.com/HoudiniGraphql/houdini/commit/98859e78e088cf733edc35b3ad96b1a1f9f48b79), [`5add29a6`](https://github.com/HoudiniGraphql/houdini/commit/5add29a68489fd9382d0809cf574a1db2746aae8)]: + - houdini@1.2.55 + - houdini-svelte@1.2.55 + +## 1.2.54 + +### Patch Changes + +- Updated dependencies [[`a4fac956`](https://github.com/HoudiniGraphql/houdini/commit/a4fac95634584d38f9e78329fc69b1bd8cc2412d)]: + - houdini-svelte@1.2.54 + - houdini@1.2.54 + ## 1.2.53 ### Patch Changes diff --git a/packages/plugin-svelte-global-stores/package.json b/packages/plugin-svelte-global-stores/package.json index a8538e87fa..79307f84bc 100644 --- a/packages/plugin-svelte-global-stores/package.json +++ b/packages/plugin-svelte-global-stores/package.json @@ -1,6 +1,6 @@ { "name": "houdini-plugin-svelte-global-stores", - "version": "1.2.53", + "version": "1.2.55", "description": "The svelte global store plugin for houdini", "keywords": [ "typescript", diff --git a/packages/plugin-svelte-global-stores/src/plugin/codegen/stores/mutation.test.ts b/packages/plugin-svelte-global-stores/src/plugin/codegen/stores/mutation.test.ts index a0b6cf94cc..c9b70a95d5 100644 --- a/packages/plugin-svelte-global-stores/src/plugin/codegen/stores/mutation.test.ts +++ b/packages/plugin-svelte-global-stores/src/plugin/codegen/stores/mutation.test.ts @@ -31,7 +31,7 @@ test('generates a store for every mutation', async function () { expect(parsed).toMatchInlineSnapshot( ` - import { TestMutation1Store } from '../../houdini-svelte/stores' + import { TestMutation1Store } from '../../houdini-svelte/stores/TestMutation1' export const GQL_TestMutation1 = new TestMutation1Store() ` diff --git a/packages/plugin-svelte-global-stores/src/plugin/codegen/stores/mutation.ts b/packages/plugin-svelte-global-stores/src/plugin/codegen/stores/mutation.ts index 675beb75da..65762d3434 100644 --- a/packages/plugin-svelte-global-stores/src/plugin/codegen/stores/mutation.ts +++ b/packages/plugin-svelte-global-stores/src/plugin/codegen/stores/mutation.ts @@ -11,12 +11,16 @@ export async function mutationStore({ config, pluginRoot }: GenerateHookInput, d const storeName = store_name({ config, name: doc.name }) const globalStoreName = global_store_name({ config, name: doc.name }) - const storeData = `import { ${storeName} } from '../../houdini-svelte/${stores_directory_name()}' + const storeData = `import { ${storeName} } from '../../houdini-svelte/${stores_directory_name()}/${ + doc.name + }' export const ${globalStoreName} = new ${storeName}()` // the type definitions for the store - const typeDefs = `import { ${storeName} } from '../../houdini-svelte/${stores_directory_name()}' + const typeDefs = `import { ${storeName} } from '../../houdini-svelte/${stores_directory_name()}/${ + doc.name + }' export const ${globalStoreName}: ${storeName}` diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d55f8694c..e062f7569f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -110,10 +110,10 @@ importers: dependencies: '@sveltejs/adapter-node': specifier: ^5.0.1 - version: 5.0.1(@sveltejs/kit@2.5.10) + version: 5.0.1(@sveltejs/kit@2.5.24) '@sveltejs/adapter-static': specifier: ^3.0.2 - version: 3.0.2(@sveltejs/kit@2.5.10) + version: 3.0.2(@sveltejs/kit@2.5.24) graphql-ws: specifier: ^5.8.2 version: 5.11.2(graphql@15.5.0) @@ -126,19 +126,19 @@ importers: version: 1.44.0 '@sveltejs/adapter-auto': specifier: ^3.2.1 - version: 3.2.1(@sveltejs/kit@2.5.10) + version: 3.2.4(@sveltejs/kit@2.5.24) '@sveltejs/kit': specifier: ^2.5.10 - version: 2.5.10(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.208)(vite@5.3.3) + version: 2.5.24(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.208)(vite@5.3.3) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.1 version: 3.1.1(svelte@5.0.0-next.208)(vite@5.3.3) '@typescript-eslint/eslint-plugin': specifier: ^7.11.0 - version: 7.11.0(@typescript-eslint/parser@7.11.0)(eslint@8.57.0)(typescript@5.4.2) + version: 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.4.2) '@typescript-eslint/parser': specifier: ^7.11.0 - version: 7.11.0(eslint@8.57.0)(typescript@5.4.2) + version: 7.18.0(eslint@8.57.0)(typescript@5.4.2) concurrently: specifier: 7.1.0 version: 7.1.0 @@ -156,7 +156,7 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-plugin-svelte: specifier: ^2.39.0 - version: 2.39.0(eslint@8.57.0)(svelte@5.0.0-next.208) + version: 2.43.0(eslint@8.57.0)(svelte@5.0.0-next.208) houdini: specifier: workspace:^ version: link:../../packages/houdini @@ -168,22 +168,22 @@ importers: version: link:../../packages/houdini-svelte prettier: specifier: ^3.2.5 - version: 3.2.5 + version: 3.3.3 prettier-plugin-svelte: specifier: ^3.2.3 - version: 3.2.3(prettier@3.2.5)(svelte@5.0.0-next.208) + version: 3.2.6(prettier@3.3.3)(svelte@5.0.0-next.208) svelte: specifier: 5.0.0-next.208 version: 5.0.0-next.208 svelte-check: specifier: ^3.8.0 - version: 3.8.0(@babel/core@7.20.7)(postcss@8.4.38)(svelte@5.0.0-next.208) + version: 3.8.0(@babel/core@7.20.7)(postcss@8.4.39)(svelte@5.0.0-next.208) svelte-eslint-parser: specifier: ^0.36.0 version: 0.36.0(svelte@5.0.0-next.208) svelte-preprocess: specifier: ^5.1.4 - version: 5.1.4(@babel/core@7.20.7)(postcss@8.4.38)(svelte@5.0.0-next.208)(typescript@5.4.2) + version: 5.1.4(@babel/core@7.20.7)(postcss@8.4.39)(svelte@5.0.0-next.208)(typescript@5.4.2) tslib: specifier: ^2.3.1 version: 2.4.1 @@ -286,7 +286,7 @@ importers: version: 4.9.4 vite: specifier: ^4.1.0 - version: 4.1.4 + version: 4.1.4(@types/node@18.11.15) wrangler: specifier: ^3.7.0 version: 3.7.0 @@ -668,7 +668,7 @@ importers: version: 0.8.2 '@sveltejs/kit': specifier: ^2.5.3 - version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.208)(vite@5.3.3) + version: 2.5.24(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.208)(vite@5.3.3) ast-types: specifier: ^0.16.1 version: 0.16.1 @@ -699,7 +699,7 @@ importers: version: 5.1.2 prettier-plugin-svelte: specifier: ^3.2.2 - version: 3.2.3(prettier@3.2.5)(svelte@5.0.0-next.208) + version: 3.2.6(prettier@3.3.3)(svelte@5.0.0-next.208) scripts: specifier: workspace:^ version: link:../_scripts @@ -711,7 +711,7 @@ importers: dependencies: '@sveltejs/kit': specifier: ^2.5.3 - version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.208)(vite@5.3.3) + version: 2.5.24(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.208)(vite@5.3.3) houdini: specifier: workspace:^ version: link:../houdini @@ -918,7 +918,7 @@ packages: debug: 4.3.4(supports-color@9.3.1) gensync: 1.0.0-beta.2 json5: 2.2.2 - semver: 6.3.0 + semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -982,7 +982,7 @@ packages: '@babel/helper-validator-option': 7.21.0 browserslist: 4.21.4 lru-cache: 5.1.1 - semver: 6.3.0 + semver: 6.3.1 dev: true /@babel/helper-compilation-targets@7.21.4(@babel/core@7.20.7): @@ -996,7 +996,7 @@ packages: '@babel/helper-validator-option': 7.21.0 browserslist: 4.21.4 lru-cache: 5.1.1 - semver: 6.3.0 + semver: 6.3.1 /@babel/helper-compilation-targets@7.21.4(@babel/core@7.21.4): resolution: {integrity: sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==} @@ -1009,7 +1009,7 @@ packages: '@babel/helper-validator-option': 7.21.0 browserslist: 4.21.4 lru-cache: 5.1.1 - semver: 6.3.0 + semver: 6.3.1 /@babel/helper-environment-visitor@7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} @@ -2700,6 +2700,7 @@ packages: /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4(supports-color@9.3.1) @@ -2730,6 +2731,7 @@ packages: /@humanwhocodes/object-schema@2.0.3: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead dev: true /@iarna/toml@2.2.5: @@ -2883,7 +2885,6 @@ packages: engines: {node: ^16.14 || >=18} dependencies: esm-env: 1.0.0 - dev: false /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -3057,7 +3058,7 @@ packages: nopt: 7.2.1 proc-log: 3.0.0 read-package-json-fast: 3.0.2 - semver: 7.6.0 + semver: 7.6.3 walk-up-path: 3.0.1 dev: true @@ -3091,6 +3092,7 @@ packages: /@playwright/test@1.30.0: resolution: {integrity: sha512-SVxkQw1xvn/Wk/EvBnqWIq6NLo1AppwbYOjNLmyU0R1RoQ3rLEBtmjTnElcnz8VEtn11fptj1ECxK0tgURhajw==} engines: {node: '>=14'} + deprecated: Please update to the latest version of Playwright to test up-to-date browsers. hasBin: true dependencies: '@types/node': 18.11.15 @@ -3348,12 +3350,12 @@ packages: import-meta-resolve: 2.2.0 dev: false - /@sveltejs/adapter-auto@3.2.1(@sveltejs/kit@2.5.10): - resolution: {integrity: sha512-/3xx8ZFCD5UBc/7AbyXkFF3HNCzWAp2xncH8HA4doGjoGQEN7PmwiRx4Y9nOzi4mqDqYYUic0gaIAE2khWWU4Q==} + /@sveltejs/adapter-auto@3.2.4(@sveltejs/kit@2.5.24): + resolution: {integrity: sha512-a64AKYbfTUrVwU0xslzv1Jf3M8bj0IwhptaXmhgIkjXspBXhD0od9JiItQHchijpLMGdEDcYBlvqySkEawv6mQ==} peerDependencies: '@sveltejs/kit': ^2.0.0 dependencies: - '@sveltejs/kit': 2.5.10(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.208)(vite@5.3.3) + '@sveltejs/kit': 2.5.24(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.208)(vite@5.3.3) import-meta-resolve: 4.1.0 dev: true @@ -3368,7 +3370,7 @@ packages: set-cookie-parser: 2.5.1 dev: false - /@sveltejs/adapter-node@5.0.1(@sveltejs/kit@2.5.10): + /@sveltejs/adapter-node@5.0.1(@sveltejs/kit@2.5.24): resolution: {integrity: sha512-eYdmxdUWMW+dad1JfMsWBPY2vjXz9eE+52A2AQnXPScPJlIxIVk5mmbaEEzrZivLfO2wEcLTZ5vdC03W69x+iA==} peerDependencies: '@sveltejs/kit': ^2.4.0 @@ -3376,16 +3378,16 @@ packages: '@rollup/plugin-commonjs': 25.0.7(rollup@4.16.4) '@rollup/plugin-json': 6.1.0(rollup@4.16.4) '@rollup/plugin-node-resolve': 15.2.3(rollup@4.16.4) - '@sveltejs/kit': 2.5.10(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.208)(vite@5.3.3) + '@sveltejs/kit': 2.5.24(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.208)(vite@5.3.3) rollup: 4.16.4 dev: false - /@sveltejs/adapter-static@3.0.2(@sveltejs/kit@2.5.10): + /@sveltejs/adapter-static@3.0.2(@sveltejs/kit@2.5.24): resolution: {integrity: sha512-/EBFydZDwfwFfFEuF1vzUseBoRziwKP7AoHAwv+Ot3M084sE/HTVBHf9mCmXfdM9ijprY5YEugZjleflncX5fQ==} peerDependencies: '@sveltejs/kit': ^2.0.0 dependencies: - '@sveltejs/kit': 2.5.10(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.208)(vite@5.3.3) + '@sveltejs/kit': 2.5.24(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.208)(vite@5.3.3) dev: false /@sveltejs/kit@1.9.3(svelte@3.57.0)(vite@4.1.1): @@ -3415,39 +3417,13 @@ packages: transitivePeerDependencies: - supports-color - /@sveltejs/kit@2.5.10(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.208)(vite@5.3.3): - resolution: {integrity: sha512-OqoyTmFG2cYmCFAdBfW+Qxbg8m23H4dv6KqwEt7ofr/ROcfcIl3Z/VT56L22H9f0uNZyr+9Bs1eh2gedOCK9kA==} - engines: {node: '>=18.13'} - hasBin: true - requiresBuild: true - peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 - svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.3 - dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.208)(vite@5.3.3) - '@types/cookie': 0.6.0 - cookie: 0.6.0 - devalue: 5.0.0 - esm-env: 1.0.0 - import-meta-resolve: 4.1.0 - kleur: 4.1.5 - magic-string: 0.30.10 - mrmime: 2.0.0 - sade: 1.8.1 - set-cookie-parser: 2.6.0 - sirv: 2.0.4 - svelte: 5.0.0-next.208 - tiny-glob: 0.2.9 - vite: 5.3.3(@types/node@18.11.15) - - /@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.208)(vite@5.3.3): - resolution: {integrity: sha512-6uedTzrb7nQrw6HALxnPrPaXdIN2jJJTzTIl96Z3P5NiG+OAfpdPbrWrvkJ3GN4CfWqrmU4dJqwMMRMTD/C7ow==} + /@sveltejs/kit@2.5.24(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.208)(vite@5.3.3): + resolution: {integrity: sha512-Nr2oxsCsDfEkdS/zzQQQbsPYTbu692Qs3/iE3L7VHzCVjG2+WujF9oMUozWI7GuX98KxYSoPMlAsfmDLSg44hQ==} engines: {node: '>=18.13'} hasBin: true requiresBuild: true peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.3 dependencies: @@ -3466,7 +3442,6 @@ packages: svelte: 5.0.0-next.208 tiny-glob: 0.2.9 vite: 5.3.3(@types/node@18.11.15) - dev: false /@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.5.3)(svelte@3.57.0)(vite@4.1.1): resolution: {integrity: sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==} @@ -3567,12 +3542,12 @@ packages: eslint: ^8.24.0 dependencies: '@rushstack/eslint-patch': 1.10.3 - '@typescript-eslint/eslint-plugin': 5.50.0(@typescript-eslint/parser@5.50.0)(eslint@8.57.0)(typescript@4.9.4) - '@typescript-eslint/parser': 5.50.0(eslint@8.57.0)(typescript@4.9.4) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@4.9.4) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.4) eslint: 8.57.0 eslint-config-prettier: 8.6.0(eslint@8.57.0) - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.50.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.50.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-jsonc: 2.16.0(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) eslint-plugin-mdx: 2.3.4(eslint@8.57.0) @@ -3965,18 +3940,18 @@ packages: debug: 4.3.4(supports-color@9.3.1) eslint: 8.33.0 grapheme-splitter: 1.0.4 - ignore: 5.2.4 + ignore: 5.3.1 natural-compare-lite: 1.4.0 regexpp: 3.2.0 - semver: 7.5.4 + semver: 7.6.0 tsutils: 3.21.0(typescript@4.9.4) typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin@5.50.0(@typescript-eslint/parser@5.50.0)(eslint@8.57.0)(typescript@4.9.4): - resolution: {integrity: sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==} + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@4.9.4): + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -3986,25 +3961,25 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.50.0(eslint@8.57.0)(typescript@4.9.4) - '@typescript-eslint/scope-manager': 5.50.0 - '@typescript-eslint/type-utils': 5.50.0(eslint@8.57.0)(typescript@4.9.4) - '@typescript-eslint/utils': 5.50.0(eslint@8.57.0)(typescript@4.9.4) + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.4) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@4.9.4) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.9.4) debug: 4.3.4(supports-color@9.3.1) eslint: 8.57.0 - grapheme-splitter: 1.0.4 + graphemer: 1.4.0 ignore: 5.3.1 natural-compare-lite: 1.4.0 - regexpp: 3.2.0 - semver: 7.5.4 + semver: 7.6.3 tsutils: 3.21.0(typescript@4.9.4) typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin@7.11.0(@typescript-eslint/parser@7.11.0)(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==} + /@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -4015,11 +3990,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/scope-manager': 7.11.0 - '@typescript-eslint/type-utils': 7.11.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/visitor-keys': 7.11.0 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -4050,8 +4025,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@5.50.0(eslint@8.57.0)(typescript@4.9.4): - resolution: {integrity: sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==} + /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@4.9.4): + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -4060,9 +4035,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.50.0 - '@typescript-eslint/types': 5.50.0 - '@typescript-eslint/typescript-estree': 5.50.0(typescript@4.9.4) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.4) debug: 4.3.4(supports-color@9.3.1) eslint: 8.57.0 typescript: 4.9.4 @@ -4070,8 +4045,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-yimw99teuaXVWsBcPO1Ais02kwJ1jmNA1KxE7ng0aT7ndr1pT1wqj0OJnsYVGKKlc4QJai86l/025L6z8CljOg==} + /@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -4080,10 +4055,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.11.0 - '@typescript-eslint/types': 7.11.0 - '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.2) - '@typescript-eslint/visitor-keys': 7.11.0 + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.4.2) + '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.4(supports-color@9.3.1) eslint: 8.57.0 typescript: 5.4.2 @@ -4099,12 +4074,20 @@ packages: '@typescript-eslint/visitor-keys': 5.50.0 dev: true - /@typescript-eslint/scope-manager@7.11.0: - resolution: {integrity: sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==} + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true + + /@typescript-eslint/scope-manager@7.18.0: + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.11.0 - '@typescript-eslint/visitor-keys': 7.11.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 dev: true /@typescript-eslint/type-utils@5.50.0(eslint@8.33.0)(typescript@4.9.4): @@ -4127,8 +4110,8 @@ packages: - supports-color dev: true - /@typescript-eslint/type-utils@5.50.0(eslint@8.57.0)(typescript@4.9.4): - resolution: {integrity: sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==} + /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@4.9.4): + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -4137,8 +4120,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.50.0(typescript@4.9.4) - '@typescript-eslint/utils': 5.50.0(eslint@8.57.0)(typescript@4.9.4) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.4) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.9.4) debug: 4.3.4(supports-color@9.3.1) eslint: 8.57.0 tsutils: 3.21.0(typescript@4.9.4) @@ -4147,8 +4130,8 @@ packages: - supports-color dev: true - /@typescript-eslint/type-utils@7.11.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==} + /@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -4157,8 +4140,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.2) - '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.4.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.4.2) debug: 4.3.4(supports-color@9.3.1) eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.2) @@ -4172,8 +4155,13 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/types@7.11.0: - resolution: {integrity: sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==} + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/types@7.18.0: + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} dev: true @@ -4191,15 +4179,36 @@ packages: debug: 4.3.4(supports-color@9.3.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 + semver: 7.6.0 tsutils: 3.21.0(typescript@4.9.4) typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.11.0(typescript@5.4.2): - resolution: {integrity: sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==} + /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.4): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4(supports-color@9.3.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.3 + tsutils: 3.21.0(typescript@4.9.4) + typescript: 4.9.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@7.18.0(typescript@5.4.2): + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -4207,13 +4216,13 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.11.0 - '@typescript-eslint/visitor-keys': 7.11.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.4(supports-color@9.3.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 - semver: 7.6.0 + semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.4.2) typescript: 5.4.2 transitivePeerDependencies: @@ -4234,42 +4243,42 @@ packages: eslint: 8.33.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0(eslint@8.33.0) - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils@5.50.0(eslint@8.57.0)(typescript@4.9.4): - resolution: {integrity: sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==} + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@4.9.4): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.11 '@types/semver': 7.3.13 - '@typescript-eslint/scope-manager': 5.50.0 - '@typescript-eslint/types': 5.50.0 - '@typescript-eslint/typescript-estree': 5.50.0(typescript@4.9.4) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.4) eslint: 8.57.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@8.57.0) - semver: 7.5.4 + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils@7.11.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==} + /@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.11.0 - '@typescript-eslint/types': 7.11.0 - '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.2) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.4.2) eslint: 8.57.0 transitivePeerDependencies: - supports-color @@ -4284,11 +4293,19 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@7.11.0: - resolution: {integrity: sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==} + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@7.18.0: + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 dev: true @@ -4311,7 +4328,7 @@ packages: '@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.21.4) magic-string: 0.27.0 react-refresh: 0.14.0 - vite: 4.1.4 + vite: 4.1.4(@types/node@18.11.15) transitivePeerDependencies: - supports-color dev: true @@ -4326,11 +4343,11 @@ packages: debug: 4.3.4(supports-color@9.3.1) istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.4 + istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 magic-string: 0.30.10 magicast: 0.3.4 - picocolors: 1.0.0 + picocolors: 1.0.1 std-env: 3.7.0 strip-literal: 2.1.0 test-exclude: 6.0.0 @@ -5013,7 +5030,7 @@ packages: /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: - semver: 7.5.4 + semver: 7.6.3 /bundle-require@4.0.1(esbuild@0.18.17): resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} @@ -6732,14 +6749,14 @@ packages: engines: {node: '>=10'} dev: true - /eslint-compat-utils@0.5.0(eslint@8.57.0): - resolution: {integrity: sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==} + /eslint-compat-utils@0.5.1(eslint@8.57.0): + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} engines: {node: '>=12'} peerDependencies: eslint: '>=6.0.0' dependencies: eslint: 8.57.0 - semver: 7.6.0 + semver: 7.6.3 dev: true /eslint-config-prettier@8.6.0(eslint@8.33.0): @@ -6779,7 +6796,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.50.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -6789,8 +6806,8 @@ packages: debug: 4.3.4(supports-color@9.3.1) enhanced-resolve: 5.16.1 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.50.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.50.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.5 is-core-module: 2.13.1 @@ -6827,7 +6844,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.1(@typescript-eslint/parser@5.50.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + /eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: @@ -6848,11 +6865,11 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.50.0(eslint@8.57.0)(typescript@4.9.4) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.4) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.50.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color dev: true @@ -6868,7 +6885,7 @@ packages: regexpp: 3.2.0 dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.50.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -6878,7 +6895,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.50.0(eslint@8.57.0)(typescript@4.9.4) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.4) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -6887,7 +6904,7 @@ packages: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.50.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -6911,7 +6928,7 @@ packages: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) eslint: 8.57.0 - eslint-compat-utils: 0.5.0(eslint@8.57.0) + eslint-compat-utils: 0.5.1(eslint@8.57.0) espree: 9.6.1 graphemer: 1.4.0 jsonc-eslint-parser: 2.1.0 @@ -6989,7 +7006,7 @@ packages: is-core-module: 2.13.1 minimatch: 3.1.2 resolve: 1.22.8 - semver: 7.6.0 + semver: 7.6.3 dev: true /eslint-plugin-promise@6.1.1(eslint@8.57.0): @@ -7056,32 +7073,30 @@ packages: svelte: 3.57.0 dev: true - /eslint-plugin-svelte@2.39.0(eslint@8.57.0)(svelte@5.0.0-next.208): - resolution: {integrity: sha512-FXktBLXsrxbA+6ZvJK2z/sQOrUKyzSg3fNWK5h0reSCjr2fjAsc9ai/s/JvSl4Hgvz3nYVtTIMwarZH5RcB7BA==} + /eslint-plugin-svelte@2.43.0(eslint@8.57.0)(svelte@5.0.0-next.208): + resolution: {integrity: sha512-REkxQWvg2pp7QVLxQNa+dJ97xUqRe7Y2JJbSWkHSuszu0VcblZtXkPBPckkivk99y5CdLw4slqfPylL2d/X4jQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.112 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.191 peerDependenciesMeta: svelte: optional: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@jridgewell/sourcemap-codec': 1.4.15 - debug: 4.3.4(supports-color@9.3.1) eslint: 8.57.0 - eslint-compat-utils: 0.5.0(eslint@8.57.0) + eslint-compat-utils: 0.5.1(eslint@8.57.0) esutils: 2.0.3 - known-css-properties: 0.31.0 - postcss: 8.4.38 - postcss-load-config: 3.1.4(postcss@8.4.38) - postcss-safe-parser: 6.0.0(postcss@8.4.38) - postcss-selector-parser: 6.0.16 - semver: 7.6.0 + known-css-properties: 0.34.0 + postcss: 8.4.39 + postcss-load-config: 3.1.4(postcss@8.4.39) + postcss-safe-parser: 6.0.0(postcss@8.4.39) + postcss-selector-parser: 6.1.2 + semver: 7.6.3 svelte: 5.0.0-next.208 - svelte-eslint-parser: 0.36.0(svelte@5.0.0-next.208) + svelte-eslint-parser: 0.41.0(svelte@5.0.0-next.208) transitivePeerDependencies: - - supports-color - ts-node dev: true @@ -7106,7 +7121,7 @@ packages: regexp-tree: 0.1.27 regjsparser: 0.9.1 safe-regex: 2.1.1 - semver: 7.6.0 + semver: 7.6.3 strip-indent: 3.0.0 dev: true @@ -7132,7 +7147,7 @@ packages: dependencies: debug: 4.3.4(supports-color@9.3.1) eslint: 8.57.0 - eslint-compat-utils: 0.5.0(eslint@8.57.0) + eslint-compat-utils: 0.5.1(eslint@8.57.0) lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.3 @@ -8278,11 +8293,6 @@ packages: engines: {node: '>= 4'} dev: true - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: true - /ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -8746,8 +8756,8 @@ packages: supports-color: 7.2.0 dev: true - /istanbul-lib-source-maps@5.0.4: - resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} + /istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -8993,7 +9003,7 @@ packages: acorn: 8.11.3 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - semver: 7.6.0 + semver: 7.6.3 dev: true /jsonc-parser@3.2.0: @@ -9044,8 +9054,8 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - /known-css-properties@0.31.0: - resolution: {integrity: sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ==} + /known-css-properties@0.34.0: + resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} dev: true /language-subtag-registry@0.3.22: @@ -9290,14 +9300,14 @@ packages: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: - semver: 6.3.0 + semver: 6.3.1 dev: false /make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: - semver: 7.6.0 + semver: 7.6.3 dev: true /makeerror@1.0.12: @@ -10046,7 +10056,7 @@ packages: resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} engines: {node: '>=10'} dependencies: - semver: 7.6.0 + semver: 7.6.3 dev: true /node-domexception@1.0.0: @@ -10606,7 +10616,7 @@ packages: postcss: 8.4.31 dev: true - /postcss-load-config@3.1.4(postcss@8.4.38): + /postcss-load-config@3.1.4(postcss@8.4.39): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -10619,7 +10629,7 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.38 + postcss: 8.4.39 yaml: 1.10.2 dev: true @@ -10650,22 +10660,22 @@ packages: postcss-selector-parser: 6.0.13 dev: true - /postcss-safe-parser@6.0.0(postcss@8.4.38): + /postcss-safe-parser@6.0.0(postcss@8.4.39): resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.3.3 dependencies: - postcss: 8.4.38 + postcss: 8.4.39 dev: true - /postcss-scss@4.0.9(postcss@8.4.38): + /postcss-scss@4.0.9(postcss@8.4.39): resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.4.29 dependencies: - postcss: 8.4.38 + postcss: 8.4.39 dev: true /postcss-selector-parser@6.0.13: @@ -10676,8 +10686,8 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss-selector-parser@6.0.16: - resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + /postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 @@ -10693,7 +10703,7 @@ packages: engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.6 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.0.2 dev: true @@ -10714,15 +10724,6 @@ packages: source-map-js: 1.0.2 dev: true - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 - dev: true - /postcss@8.4.39: resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} engines: {node: ^10 || ^12 || >=14} @@ -10775,13 +10776,13 @@ packages: svelte: 3.57.0 dev: true - /prettier-plugin-svelte@3.2.3(prettier@3.2.5)(svelte@5.0.0-next.208): - resolution: {integrity: sha512-wJq8RunyFlWco6U0WJV5wNCM7zpBFakS76UBSbmzMGpncpK98NZABaE+s7n8/APDCEVNHXC5Mpq+MLebQtsRlg==} + /prettier-plugin-svelte@3.2.6(prettier@3.3.3)(svelte@5.0.0-next.208): + resolution: {integrity: sha512-Y1XWLw7vXUQQZmgv1JAEiLcErqUniAF2wO7QJsw8BVMvpLET2dI5WpEIEJx1r11iHVdSMzQxivyfrH9On9t2IQ==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 dependencies: - prettier: 3.2.5 + prettier: 3.3.3 svelte: 5.0.0-next.208 dev: true @@ -10797,8 +10798,8 @@ packages: hasBin: true dev: true - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + /prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} hasBin: true dev: true @@ -11528,13 +11529,6 @@ packages: lru-cache: 6.0.0 dev: false - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - /semver@7.6.0: resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} @@ -11543,6 +11537,11 @@ packages: lru-cache: 6.0.0 dev: true + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -12173,7 +12172,7 @@ packages: - sugarss dev: true - /svelte-check@3.8.0(@babel/core@7.20.7)(postcss@8.4.38)(svelte@5.0.0-next.208): + /svelte-check@3.8.0(@babel/core@7.20.7)(postcss@8.4.39)(svelte@5.0.0-next.208): resolution: {integrity: sha512-7Nxn+3X97oIvMzYJ7t27w00qUf1Y52irE2RU2dQAd5PyvfGp4E7NLhFKVhb6PV2fx7dCRMpNKDIuazmGthjpSQ==} hasBin: true peerDependencies: @@ -12183,11 +12182,11 @@ packages: chokidar: 3.5.3 fast-glob: 3.3.2 import-fresh: 3.3.0 - picocolors: 1.0.0 + picocolors: 1.0.1 sade: 1.8.1 svelte: 5.0.0-next.208 - svelte-preprocess: 5.1.4(@babel/core@7.20.7)(postcss@8.4.38)(svelte@5.0.0-next.208)(typescript@5.4.2) - typescript: 5.4.2 + svelte-preprocess: 5.1.4(@babel/core@7.20.7)(postcss@8.4.39)(svelte@5.0.0-next.208)(typescript@5.5.4) + typescript: 5.5.4 transitivePeerDependencies: - '@babel/core' - coffeescript @@ -12212,8 +12211,25 @@ packages: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - postcss: 8.4.38 - postcss-scss: 4.0.9(postcss@8.4.38) + postcss: 8.4.39 + postcss-scss: 4.0.9(postcss@8.4.39) + svelte: 5.0.0-next.208 + dev: true + + /svelte-eslint-parser@0.41.0(svelte@5.0.0-next.208): + resolution: {integrity: sha512-L6f4hOL+AbgfBIB52Z310pg1d2QjRqm7wy3kI1W6hhdhX5bvu7+f0R6w4ykp5HoDdzq+vGhIJmsisaiJDGmVfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.191 + peerDependenciesMeta: + svelte: + optional: true + dependencies: + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + postcss: 8.4.39 + postcss-scss: 4.0.9(postcss@8.4.39) svelte: 5.0.0-next.208 dev: true @@ -12349,7 +12365,7 @@ packages: typescript: 4.9.4 dev: false - /svelte-preprocess@5.1.4(@babel/core@7.20.7)(postcss@8.4.38)(svelte@5.0.0-next.208)(typescript@5.4.2): + /svelte-preprocess@5.1.4(@babel/core@7.20.7)(postcss@8.4.39)(svelte@5.0.0-next.208)(typescript@5.4.2): resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==} engines: {node: '>= 16.0.0'} requiresBuild: true @@ -12391,13 +12407,62 @@ packages: '@types/pug': 2.0.6 detect-indent: 6.1.0 magic-string: 0.30.10 - postcss: 8.4.38 + postcss: 8.4.39 sorcery: 0.11.0 strip-indent: 3.0.0 svelte: 5.0.0-next.208 typescript: 5.4.2 dev: true + /svelte-preprocess@5.1.4(@babel/core@7.20.7)(postcss@8.4.39)(svelte@5.0.0-next.208)(typescript@5.5.4): + resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==} + engines: {node: '>= 16.0.0'} + requiresBuild: true + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.55.0 + sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 + svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 + typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + dependencies: + '@babel/core': 7.20.7 + '@types/pug': 2.0.6 + detect-indent: 6.1.0 + magic-string: 0.30.10 + postcss: 8.4.39 + sorcery: 0.11.0 + strip-indent: 3.0.0 + svelte: 5.0.0-next.208 + typescript: 5.5.4 + dev: true + /svelte-preprocess@5.1.4(@babel/core@7.20.7)(svelte@3.57.0)(typescript@4.9.4): resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==} engines: {node: '>= 16.0.0'} @@ -13172,7 +13237,7 @@ packages: dependencies: browserslist: 4.21.4 escalade: 3.1.1 - picocolors: 1.0.0 + picocolors: 1.0.1 /update-browserslist-db@1.0.13(browserslist@4.22.1): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} @@ -13334,7 +13399,7 @@ packages: cac: 6.7.14 debug: 4.3.4(supports-color@9.3.1) pathe: 1.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 vite: 5.3.3(@types/node@18.11.15) transitivePeerDependencies: - '@types/node' @@ -13351,7 +13416,7 @@ packages: resolution: {integrity: sha512-GJYcFZnqIND7aXnsKVtYNeVcUh/pSDQC5oriSR2n28iddNavHdSkNjWc7ReVXftV763vI+4Db7gPn0CDODFAAQ==} hasBin: true dependencies: - '@kitql/helpers': 0.8.2 + '@kitql/helpers': 0.8.9 terser: 5.16.1 dev: true @@ -13395,39 +13460,6 @@ packages: optionalDependencies: fsevents: 2.3.3 - /vite@4.1.4: - resolution: {integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.16.17 - postcss: 8.4.28 - resolve: 1.22.1 - rollup: 3.27.1 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /vite@4.1.4(@types/node@18.11.15): resolution: {integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -13460,7 +13492,6 @@ packages: rollup: 3.27.1 optionalDependencies: fsevents: 2.3.3 - dev: false /vite@5.3.3(@types/node@18.11.15): resolution: {integrity: sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==}