@iamjulianacosta/mobx-data 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{JsonApiSerializer-DKemcyw-.cjs → JsonApiSerializer-Bc4iQB0d.cjs} +2 -2
- package/dist/{JsonApiSerializer-DKemcyw-.cjs.map → JsonApiSerializer-Bc4iQB0d.cjs.map} +1 -1
- package/dist/{JsonApiSerializer-BLoE046A.js → JsonApiSerializer-wndq5a1n.js} +2 -2
- package/dist/{JsonApiSerializer-BLoE046A.js.map → JsonApiSerializer-wndq5a1n.js.map} +1 -1
- package/dist/{MemoryAdapter-DH-gzSSl.cjs → MemoryAdapter-BTK2D64s.cjs} +2 -2
- package/dist/{MemoryAdapter-DH-gzSSl.cjs.map → MemoryAdapter-BTK2D64s.cjs.map} +1 -1
- package/dist/{MemoryAdapter-Bp-BGHH3.js → MemoryAdapter-ni25N4H0.js} +2 -2
- package/dist/{MemoryAdapter-Bp-BGHH3.js.map → MemoryAdapter-ni25N4H0.js.map} +1 -1
- package/dist/{ODataAdapter-RQUjVTcf.js → ODataAdapter-DAja_jKM.js} +2 -2
- package/dist/{ODataAdapter-RQUjVTcf.js.map → ODataAdapter-DAja_jKM.js.map} +1 -1
- package/dist/{ODataAdapter-CrDFvBEZ.cjs → ODataAdapter-lMifLyLD.cjs} +2 -2
- package/dist/{ODataAdapter-CrDFvBEZ.cjs.map → ODataAdapter-lMifLyLD.cjs.map} +1 -1
- package/dist/{RestAdapter-CSoJg7D2.cjs → RestAdapter-1V94stW-.cjs} +2 -2
- package/dist/{RestAdapter-CSoJg7D2.cjs.map → RestAdapter-1V94stW-.cjs.map} +1 -1
- package/dist/{RestAdapter-D6bGIHZT.js → RestAdapter-CGWqOR_G.js} +2 -2
- package/dist/{RestAdapter-D6bGIHZT.js.map → RestAdapter-CGWqOR_G.js.map} +1 -1
- package/dist/Store-KvjmBTQ9.cjs +2 -0
- package/dist/Store-KvjmBTQ9.cjs.map +1 -0
- package/dist/{Store-Bm5JivTc.js → Store-mvrDLQEZ.js} +6 -6
- package/dist/Store-mvrDLQEZ.js.map +1 -0
- package/dist/adapter/index.cjs +1 -1
- package/dist/adapter/index.js +2 -2
- package/dist/cache/cache-utils.d.ts +1 -1
- package/dist/cache/cache-utils.d.ts.map +1 -1
- package/dist/cache-utils-2lswvJ87.cjs +2 -0
- package/dist/cache-utils-2lswvJ87.cjs.map +1 -0
- package/dist/{cache-utils-B2wFhisx.js → cache-utils-38Dqu4Qf.js} +15 -15
- package/dist/cache-utils-38Dqu4Qf.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +6 -6
- package/dist/json-api/index.cjs +1 -1
- package/dist/json-api/index.js +1 -1
- package/dist/odata/index.cjs +1 -1
- package/dist/odata/index.js +1 -1
- package/dist/store/index.cjs +1 -1
- package/dist/store/index.js +1 -1
- package/package.json +1 -1
- package/src/cache/cache-utils.ts +4 -4
- package/src/store/Store.ts +4 -4
- package/dist/Store-Bm5JivTc.js.map +0 -1
- package/dist/Store-DX9D0Mmy.cjs +0 -2
- package/dist/Store-DX9D0Mmy.cjs.map +0 -1
- package/dist/cache-utils-B2wFhisx.js.map +0 -1
- package/dist/cache-utils-CSwsqOi3.cjs +0 -2
- package/dist/cache-utils-CSwsqOi3.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RestAdapter-CSoJg7D2.cjs","sources":["../node_modules/.pnpm/change-case@5.4.4/node_modules/change-case/dist/index.js","../src/adapter/Adapter.ts","../src/adapter/RestAdapter.ts"],"sourcesContent":["// Regexps involved with splitting words in various case formats.\nconst SPLIT_LOWER_UPPER_RE = /([\\p{Ll}\\d])(\\p{Lu})/gu;\nconst SPLIT_UPPER_UPPER_RE = /(\\p{Lu})([\\p{Lu}][\\p{Ll}])/gu;\n// Used to iterate over the initial split result and separate numbers.\nconst SPLIT_SEPARATE_NUMBER_RE = /(\\d)\\p{Ll}|(\\p{L})\\d/u;\n// Regexp involved with stripping non-word characters from the result.\nconst DEFAULT_STRIP_REGEXP = /[^\\p{L}\\d]+/giu;\n// The replacement value for splits.\nconst SPLIT_REPLACE_VALUE = \"$1\\0$2\";\n// The default characters to keep after transforming case.\nconst DEFAULT_PREFIX_SUFFIX_CHARACTERS = \"\";\n/**\n * Split any cased input strings into an array of words.\n */\nexport function split(value) {\n let result = value.trim();\n result = result\n .replace(SPLIT_LOWER_UPPER_RE, SPLIT_REPLACE_VALUE)\n .replace(SPLIT_UPPER_UPPER_RE, SPLIT_REPLACE_VALUE);\n result = result.replace(DEFAULT_STRIP_REGEXP, \"\\0\");\n let start = 0;\n let end = result.length;\n // Trim the delimiter from around the output string.\n while (result.charAt(start) === \"\\0\")\n start++;\n if (start === end)\n return [];\n while (result.charAt(end - 1) === \"\\0\")\n end--;\n return result.slice(start, end).split(/\\0/g);\n}\n/**\n * Split the input string into an array of words, separating numbers.\n */\nexport function splitSeparateNumbers(value) {\n const words = split(value);\n for (let i = 0; i < words.length; i++) {\n const word = words[i];\n const match = SPLIT_SEPARATE_NUMBER_RE.exec(word);\n if (match) {\n const offset = match.index + (match[1] ?? match[2]).length;\n words.splice(i, 1, word.slice(0, offset), word.slice(offset));\n }\n }\n return words;\n}\n/**\n * Convert a string to space separated lower case (`foo bar`).\n */\nexport function noCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n return (prefix +\n words.map(lowerFactory(options?.locale)).join(options?.delimiter ?? \" \") +\n suffix);\n}\n/**\n * Convert a string to camel case (`fooBar`).\n */\nexport function camelCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = options?.mergeAmbiguousCharacters\n ? capitalCaseTransformFactory(lower, upper)\n : pascalCaseTransformFactory(lower, upper);\n return (prefix +\n words\n .map((word, index) => {\n if (index === 0)\n return lower(word);\n return transform(word, index);\n })\n .join(options?.delimiter ?? \"\") +\n suffix);\n}\n/**\n * Convert a string to pascal case (`FooBar`).\n */\nexport function pascalCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = options?.mergeAmbiguousCharacters\n ? capitalCaseTransformFactory(lower, upper)\n : pascalCaseTransformFactory(lower, upper);\n return prefix + words.map(transform).join(options?.delimiter ?? \"\") + suffix;\n}\n/**\n * Convert a string to pascal snake case (`Foo_Bar`).\n */\nexport function pascalSnakeCase(input, options) {\n return capitalCase(input, { delimiter: \"_\", ...options });\n}\n/**\n * Convert a string to capital case (`Foo Bar`).\n */\nexport function capitalCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n return (prefix +\n words\n .map(capitalCaseTransformFactory(lower, upper))\n .join(options?.delimiter ?? \" \") +\n suffix);\n}\n/**\n * Convert a string to constant case (`FOO_BAR`).\n */\nexport function constantCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n return (prefix +\n words.map(upperFactory(options?.locale)).join(options?.delimiter ?? \"_\") +\n suffix);\n}\n/**\n * Convert a string to dot case (`foo.bar`).\n */\nexport function dotCase(input, options) {\n return noCase(input, { delimiter: \".\", ...options });\n}\n/**\n * Convert a string to kebab case (`foo-bar`).\n */\nexport function kebabCase(input, options) {\n return noCase(input, { delimiter: \"-\", ...options });\n}\n/**\n * Convert a string to path case (`foo/bar`).\n */\nexport function pathCase(input, options) {\n return noCase(input, { delimiter: \"/\", ...options });\n}\n/**\n * Convert a string to path case (`Foo bar`).\n */\nexport function sentenceCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = capitalCaseTransformFactory(lower, upper);\n return (prefix +\n words\n .map((word, index) => {\n if (index === 0)\n return transform(word);\n return lower(word);\n })\n .join(options?.delimiter ?? \" \") +\n suffix);\n}\n/**\n * Convert a string to snake case (`foo_bar`).\n */\nexport function snakeCase(input, options) {\n return noCase(input, { delimiter: \"_\", ...options });\n}\n/**\n * Convert a string to header case (`Foo-Bar`).\n */\nexport function trainCase(input, options) {\n return capitalCase(input, { delimiter: \"-\", ...options });\n}\nfunction lowerFactory(locale) {\n return locale === false\n ? (input) => input.toLowerCase()\n : (input) => input.toLocaleLowerCase(locale);\n}\nfunction upperFactory(locale) {\n return locale === false\n ? (input) => input.toUpperCase()\n : (input) => input.toLocaleUpperCase(locale);\n}\nfunction capitalCaseTransformFactory(lower, upper) {\n return (word) => `${upper(word[0])}${lower(word.slice(1))}`;\n}\nfunction pascalCaseTransformFactory(lower, upper) {\n return (word, index) => {\n const char0 = word[0];\n const initial = index > 0 && char0 >= \"0\" && char0 <= \"9\" ? \"_\" + char0 : upper(char0);\n return initial + lower(word.slice(1));\n };\n}\nfunction splitPrefixSuffix(input, options = {}) {\n const splitFn = options.split ?? (options.separateNumbers ? splitSeparateNumbers : split);\n const prefixCharacters = options.prefixCharacters ?? DEFAULT_PREFIX_SUFFIX_CHARACTERS;\n const suffixCharacters = options.suffixCharacters ?? DEFAULT_PREFIX_SUFFIX_CHARACTERS;\n let prefixIndex = 0;\n let suffixIndex = input.length;\n while (prefixIndex < input.length) {\n const char = input.charAt(prefixIndex);\n if (!prefixCharacters.includes(char))\n break;\n prefixIndex++;\n }\n while (suffixIndex > prefixIndex) {\n const index = suffixIndex - 1;\n const char = input.charAt(index);\n if (!suffixCharacters.includes(char))\n break;\n suffixIndex = index;\n }\n return [\n input.slice(0, prefixIndex),\n splitFn(input.slice(prefixIndex, suffixIndex)),\n input.slice(suffixIndex),\n ];\n}\n//# sourceMappingURL=index.js.map","/**\n * Abstract base class for all adapters.\n *\n * An adapter translates store operations (findRecord, createRecord, …) into\n * concrete network requests and returns raw payloads that the serializer layer\n * then normalises. Concrete subclasses (`RestAdapter`, `ODataAdapter`, …)\n * override the abstract CRUD methods and may also override the URL-building\n * helpers to produce protocol-specific URLs.\n *\n * URL construction follows an Ember Data–style pipeline:\n * `buildURL` → `urlForFindRecord` / `urlForQuery` / … → `_composeURL`\n *\n * Configuration surface:\n * - `host` – base URL prefix (e.g. `https://api.example.com`)\n * - `namespace` – path segment appended after the host (e.g. `v2`)\n * - `headers` – headers merged into every request\n * - `coalesceFindRequests` – when `true` the store batches separate\n * `findRecord` calls into a single `findMany` call\n */\n\nimport pluralize from 'pluralize';\nimport { kebabCase } from 'change-case';\n\n/** Union of all operation names the store can issue to an adapter. */\nexport type AdapterRequestType =\n | 'findRecord'\n | 'findAll'\n | 'findMany'\n | 'query'\n | 'queryRecord'\n | 'createRecord'\n | 'updateRecord'\n | 'deleteRecord';\n\n/**\n * A frozen view of a model record passed to the adapter.\n * Adapters read but do not mutate snapshots.\n */\nexport interface AdapterSnapshot {\n /** The record's server-assigned id, or `null` for new records. */\n id: string | null;\n /** The model's registered `modelName`. */\n modelName: string;\n /** Returns the current value for an attribute key. */\n attr(key: string): unknown;\n /** Returns the `belongsTo` relationship value (or just its id when `{ id: true }`). */\n belongsTo(key: string, options?: { id: boolean }): unknown;\n /** Returns the `hasMany` relationship values (or just ids when `{ ids: true }`). */\n hasMany(key: string, options?: { ids: boolean }): unknown;\n /** Returns `{ [key]: [oldValue, newValue] }` for attributes that differ from the server state. */\n changedAttributes(): Record<string, [unknown, unknown]>;\n /** Reference to the live record instance. */\n record: unknown;\n}\n\nexport abstract class Adapter {\n /** Base URL prepended to every generated URL. Empty string = relative URLs. */\n namespace: string = '';\n /** Host prefix, e.g. `https://api.example.com`. */\n host: string = '';\n /** Extra headers merged into every request via `defaultHeaders()`. */\n headers: Record<string, string> = {};\n /**\n * When `true` the store will coalesce multiple `findRecord` calls for the\n * same model type into a single `findMany` network request.\n */\n coalesceFindRequests: boolean = false;\n\n /** Fetches a single record by id. */\n abstract findRecord(\n store: unknown,\n modelName: string,\n id: string,\n snapshot: AdapterSnapshot,\n options?: { include?: string },\n ): Promise<unknown>;\n\n /** Fetches all records of a given model type. */\n abstract findAll(\n store: unknown,\n modelName: string,\n sinceToken: string | null,\n snapshotArray: AdapterSnapshot[],\n options?: { include?: string },\n ): Promise<unknown>;\n\n /** Fetches multiple records by id in a single request. */\n abstract findMany(\n store: unknown,\n modelName: string,\n ids: string[],\n snapshots: AdapterSnapshot[],\n ): Promise<unknown>;\n\n /** Executes an arbitrary server-side query, returning an array of records. */\n abstract query(\n store: unknown,\n modelName: string,\n query: Record<string, unknown>,\n ): Promise<unknown>;\n\n /** Like `query` but returns at most one record. */\n abstract queryRecord(\n store: unknown,\n modelName: string,\n query: Record<string, unknown>,\n ): Promise<unknown>;\n\n /** Persists a new record to the server (POST). */\n abstract createRecord(\n store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown>;\n\n /** Persists all attributes of an existing record (PUT). */\n abstract updateRecord(\n store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown>;\n\n /**\n * Persists only the changed attributes of an existing record (PATCH).\n * Default implementation delegates to `updateRecord`.\n * Override in subclasses to send a partial payload via HTTP PATCH.\n */\n patchRecord(\n store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n return this.updateRecord(store, modelName, snapshot);\n }\n\n /** Removes a record from the server (DELETE). */\n abstract deleteRecord(\n store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown>;\n\n /**\n * Returns the URL path segment for a given model name.\n * Default: dasherized, pluralized form — e.g. `userPost` → `user-posts`.\n */\n pathForType(modelName: string): string {\n return pluralize.plural(kebabCase(modelName));\n }\n\n /**\n * Assembles a full URL from `host`, `namespace`, and the supplied `path`.\n * Returns an absolute URL when `host` is set, otherwise a root-relative path.\n */\n protected _composeURL(path: string): string {\n const ns = this.namespace.replace(/^\\/+|\\/+$/g, '');\n const hostPrefix = this.host ? this.host.replace(/\\/+$/, '') : '';\n const parts: string[] = [];\n if (hostPrefix) {\n parts.push(hostPrefix);\n }\n if (ns) {\n parts.push(ns);\n }\n parts.push(path);\n if (hostPrefix) {\n return parts.join('/');\n }\n return `/${parts.filter(Boolean).join('/')}`;\n }\n\n /**\n * Dispatches to the appropriate `urlFor*` method based on `requestType`.\n *\n * @param modelName - Registered model name.\n * @param id - Record id(s), or `null` for collection requests.\n * @param snapshot - Snapshot(s) for the request.\n * @param requestType - Operation being performed.\n * @param query - Query parameters (used for `query` / `queryRecord`).\n */\n buildURL(\n modelName: string,\n id: string | string[] | null,\n snapshot: AdapterSnapshot | AdapterSnapshot[] | null,\n requestType: AdapterRequestType,\n query: Record<string, unknown> = {},\n ): string {\n switch (requestType) {\n case 'findRecord':\n return this.urlForFindRecord(id as string, modelName, snapshot as AdapterSnapshot);\n case 'findAll':\n return this.urlForFindAll(modelName, (snapshot as AdapterSnapshot[]) ?? []);\n case 'findMany':\n return this.urlForFindMany(\n (id as string[]) ?? [],\n modelName,\n (snapshot as AdapterSnapshot[]) ?? [],\n );\n case 'query':\n return this.urlForQuery(query, modelName);\n case 'queryRecord':\n return this.urlForQueryRecord(query, modelName);\n case 'createRecord':\n return this.urlForCreateRecord(modelName, snapshot as AdapterSnapshot);\n case 'updateRecord':\n return this.urlForUpdateRecord(\n id as string,\n modelName,\n snapshot as AdapterSnapshot,\n );\n case 'deleteRecord':\n return this.urlForDeleteRecord(\n id as string,\n modelName,\n snapshot as AdapterSnapshot,\n );\n }\n }\n\n /** URL for a `findRecord` request. Default: `<collection>/<id>`. */\n urlForFindRecord(id: string, modelName: string, _snapshot: AdapterSnapshot): string {\n return this._composeURL(`${this.pathForType(modelName)}/${encodeURIComponent(id)}`);\n }\n\n /** URL for a `findAll` request. Default: `<collection>`. */\n urlForFindAll(modelName: string, _snapshots: AdapterSnapshot[]): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for a `findMany` request. Default: `<collection>` (ids appended by the adapter). */\n urlForFindMany(\n _ids: string[],\n modelName: string,\n _snapshots: AdapterSnapshot[],\n ): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for a `query` request. Default: `<collection>`. */\n urlForQuery(_query: Record<string, unknown>, modelName: string): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for a `queryRecord` request. Default: `<collection>`. */\n urlForQueryRecord(_query: Record<string, unknown>, modelName: string): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for a `createRecord` request. Default: `<collection>`. */\n urlForCreateRecord(modelName: string, _snapshot: AdapterSnapshot): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for an `updateRecord` request. Default: `<collection>/<id>`. */\n urlForUpdateRecord(\n id: string,\n modelName: string,\n _snapshot: AdapterSnapshot,\n ): string {\n return this._composeURL(`${this.pathForType(modelName)}/${encodeURIComponent(id)}`);\n }\n\n /** URL for a `deleteRecord` request. Default: `<collection>/<id>`. */\n urlForDeleteRecord(\n id: string,\n modelName: string,\n _snapshot: AdapterSnapshot,\n ): string {\n return this._composeURL(`${this.pathForType(modelName)}/${encodeURIComponent(id)}`);\n }\n\n /**\n * Groups snapshots into batches for `findMany`.\n * Default implementation puts all snapshots in a single batch.\n */\n groupRecordsForFindMany(\n _store: unknown,\n snapshots: AdapterSnapshot[],\n ): AdapterSnapshot[][] {\n return [snapshots];\n }\n\n /**\n * Returns `true` when the store should bypass the cache and reload this\n * record immediately. Default: always `false`.\n */\n shouldReloadRecord(_store: unknown, _snapshot: AdapterSnapshot): boolean {\n return false;\n }\n\n /**\n * Returns `true` when the store should schedule a background reload for\n * this record after returning the cached version. Default: always `true`.\n */\n shouldBackgroundReloadRecord(\n _store: unknown,\n _snapshot: AdapterSnapshot,\n ): boolean {\n return true;\n }\n\n /**\n * Returns `true` when the store should reload the full collection on every\n * `findAll` call. Default: always `false`.\n */\n shouldReloadAll(_store: unknown, _snapshotRecordArray: AdapterSnapshot[]): boolean {\n return false;\n }\n\n /**\n * Returns `true` when the store should schedule a background reload after\n * returning a cached collection. Default: always `true`.\n */\n shouldBackgroundReloadAll(\n _store: unknown,\n _snapshotRecordArray: AdapterSnapshot[],\n ): boolean {\n return true;\n }\n}\n","/**\n * HTTP/REST adapter that communicates with a JSON REST API.\n *\n * `RestAdapter` is the default concrete adapter. It uses the Fetch API and\n * maps each store operation to a conventional HTTP verb:\n *\n * | Operation | Method |\n * |----------------|--------|\n * | findRecord | GET |\n * | findAll | GET |\n * | findMany | GET |\n * | query | GET |\n * | queryRecord | GET |\n * | createRecord | POST |\n * | updateRecord | PUT |\n * | deleteRecord | DELETE |\n *\n * Subclasses (e.g. `JsonApiAdapter`, `ODataAdapter`) override individual\n * methods to adjust headers, HTTP verbs, or body serialization without\n * reimplementing the full adapter.\n */\n\nimport { injectable } from 'tsyringe';\nimport { Adapter, type AdapterSnapshot } from './Adapter.js';\nimport { attachResponseHeaders } from '../cache/cache-utils.js';\n\n@injectable()\nexport class RestAdapter extends Adapter {\n static serializeSnapshotToObject(\n snapshot: AdapterSnapshot,\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n const record = snapshot.record as { _data?: Record<string, unknown> };\n const data = record._data;\n if (data) {\n for (const [key, value] of Object.entries(data)) {\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n continue;\n }\n body[key] = value;\n }\n }\n return body;\n }\n\n static toQueryString(query: Record<string, unknown>): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) {\n continue;\n }\n parts.push(\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`,\n );\n }\n return parts.length > 0 ? `?${parts.join('&')}` : '';\n }\n\n /** Headers sent with every read (GET) request. */\n defaultHeaders(): Record<string, string> {\n return {\n Accept: 'application/json',\n ...this.headers,\n };\n }\n\n /** Headers sent with every write (POST / PUT / DELETE) request. */\n mutationHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders(),\n };\n }\n\n /**\n * Low-level fetch wrapper used by all operation methods.\n *\n * - Throws an enriched `Error` (with `status` and `body` properties) for\n * any non-2xx response.\n * - Returns `null` for 204 No Content responses.\n * - Attempts JSON parsing; falls back to the raw text string on failure.\n */\n async _fetchJSON(\n url: string,\n init: RequestInit,\n ): Promise<unknown> {\n const response = await fetch(url, init);\n if (!response.ok) {\n let body: unknown = null;\n try {\n body = await response.json();\n } catch {\n /* ignore */\n }\n const error = Object.assign(\n new Error(`Request failed: ${response.status}`),\n { status: response.status, body },\n );\n throw error;\n }\n if (response.status === 204) {\n return null;\n }\n const text = await response.text();\n if (!text) {\n return null;\n }\n let result: unknown;\n try {\n result = JSON.parse(text);\n } catch {\n result = text;\n }\n if (result !== null && typeof result === 'object') {\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n attachResponseHeaders(result, headers);\n }\n return result;\n }\n\n override async findRecord(\n _store: unknown,\n modelName: string,\n id: string,\n snapshot: AdapterSnapshot,\n options?: { include?: string },\n ): Promise<unknown> {\n let url = this.buildURL(modelName, id, snapshot, 'findRecord');\n if (options?.include) {\n url += `${url.includes('?') ? '&' : '?'}include=${encodeURIComponent(options.include)}`;\n }\n return this._fetchJSON(url, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n override async findAll(\n _store: unknown,\n modelName: string,\n _sinceToken: string | null,\n snapshotArray: AdapterSnapshot[],\n options?: { include?: string },\n ): Promise<unknown> {\n let url = this.buildURL(modelName, null, snapshotArray, 'findAll');\n if (options?.include) {\n url += `${url.includes('?') ? '&' : '?'}include=${encodeURIComponent(options.include)}`;\n }\n return this._fetchJSON(url, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n /**\n * Fetches multiple records by appending an `ids` query parameter.\n * e.g. `/posts?ids=1,2,3`\n */\n override async findMany(\n _store: unknown,\n modelName: string,\n ids: string[],\n snapshots: AdapterSnapshot[],\n ): Promise<unknown> {\n const url = this.buildURL(modelName, ids, snapshots, 'findMany');\n const separator = url.includes('?') ? '&' : '?';\n const fullUrl = `${url}${separator}ids=${ids.map(encodeURIComponent).join(',')}`;\n return this._fetchJSON(fullUrl, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n override async query(\n _store: unknown,\n modelName: string,\n query: Record<string, unknown>,\n ): Promise<unknown> {\n const base = this.buildURL(modelName, null, null, 'query', query);\n const url = `${base}${RestAdapter.toQueryString(query)}`;\n return this._fetchJSON(url, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n override async queryRecord(\n _store: unknown,\n modelName: string,\n query: Record<string, unknown>,\n ): Promise<unknown> {\n const base = this.buildURL(modelName, null, null, 'queryRecord', query);\n const url = `${base}${RestAdapter.toQueryString(query)}`;\n return this._fetchJSON(url, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n override async createRecord(\n _store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n const url = this.buildURL(modelName, null, snapshot, 'createRecord');\n return this._fetchJSON(url, {\n method: 'POST',\n headers: this.mutationHeaders(),\n body: JSON.stringify(RestAdapter.serializeSnapshotToObject(snapshot)),\n });\n }\n\n override async updateRecord(\n _store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n const url = this.buildURL(modelName, snapshot.id, snapshot, 'updateRecord');\n return this._fetchJSON(url, {\n method: 'PUT',\n headers: this.mutationHeaders(),\n body: JSON.stringify(RestAdapter.serializeSnapshotToObject(snapshot)),\n });\n }\n\n override async patchRecord(\n _store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n const url = this.buildURL(modelName, snapshot.id, snapshot, 'updateRecord');\n const changed = snapshot.changedAttributes();\n const partial: Record<string, unknown> = {};\n for (const [key, [, current]] of Object.entries(changed)) {\n partial[key] = current;\n }\n return this._fetchJSON(url, {\n method: 'PATCH',\n headers: this.mutationHeaders(),\n body: JSON.stringify(partial),\n });\n }\n\n override async deleteRecord(\n _store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n const url = this.buildURL(modelName, snapshot.id, snapshot, 'deleteRecord');\n return this._fetchJSON(url, {\n method: 'DELETE',\n headers: this.defaultHeaders(),\n });\n }\n}\n"],"names":["SPLIT_LOWER_UPPER_RE","SPLIT_UPPER_UPPER_RE","SPLIT_SEPARATE_NUMBER_RE","DEFAULT_STRIP_REGEXP","SPLIT_REPLACE_VALUE","DEFAULT_PREFIX_SUFFIX_CHARACTERS","split","value","result","start","end","splitSeparateNumbers","words","i","word","match","offset","noCase","input","options","prefix","suffix","splitPrefixSuffix","lowerFactory","pascalCase","lower","upper","upperFactory","transform","pascalCaseTransformFactory","kebabCase","locale","index","char0","splitFn","prefixCharacters","suffixCharacters","prefixIndex","suffixIndex","char","Adapter","store","modelName","snapshot","pluralize","path","ns","hostPrefix","parts","id","requestType","query","_snapshot","_snapshots","_ids","_query","_store","snapshots","_snapshotRecordArray","RestAdapter","body","data","key","url","init","response","text","headers","attachResponseHeaders","_sinceToken","snapshotArray","ids","separator","fullUrl","changed","partial","current","__decorateClass","injectable"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"RestAdapter-1V94stW-.cjs","sources":["../node_modules/.pnpm/change-case@5.4.4/node_modules/change-case/dist/index.js","../src/adapter/Adapter.ts","../src/adapter/RestAdapter.ts"],"sourcesContent":["// Regexps involved with splitting words in various case formats.\nconst SPLIT_LOWER_UPPER_RE = /([\\p{Ll}\\d])(\\p{Lu})/gu;\nconst SPLIT_UPPER_UPPER_RE = /(\\p{Lu})([\\p{Lu}][\\p{Ll}])/gu;\n// Used to iterate over the initial split result and separate numbers.\nconst SPLIT_SEPARATE_NUMBER_RE = /(\\d)\\p{Ll}|(\\p{L})\\d/u;\n// Regexp involved with stripping non-word characters from the result.\nconst DEFAULT_STRIP_REGEXP = /[^\\p{L}\\d]+/giu;\n// The replacement value for splits.\nconst SPLIT_REPLACE_VALUE = \"$1\\0$2\";\n// The default characters to keep after transforming case.\nconst DEFAULT_PREFIX_SUFFIX_CHARACTERS = \"\";\n/**\n * Split any cased input strings into an array of words.\n */\nexport function split(value) {\n let result = value.trim();\n result = result\n .replace(SPLIT_LOWER_UPPER_RE, SPLIT_REPLACE_VALUE)\n .replace(SPLIT_UPPER_UPPER_RE, SPLIT_REPLACE_VALUE);\n result = result.replace(DEFAULT_STRIP_REGEXP, \"\\0\");\n let start = 0;\n let end = result.length;\n // Trim the delimiter from around the output string.\n while (result.charAt(start) === \"\\0\")\n start++;\n if (start === end)\n return [];\n while (result.charAt(end - 1) === \"\\0\")\n end--;\n return result.slice(start, end).split(/\\0/g);\n}\n/**\n * Split the input string into an array of words, separating numbers.\n */\nexport function splitSeparateNumbers(value) {\n const words = split(value);\n for (let i = 0; i < words.length; i++) {\n const word = words[i];\n const match = SPLIT_SEPARATE_NUMBER_RE.exec(word);\n if (match) {\n const offset = match.index + (match[1] ?? match[2]).length;\n words.splice(i, 1, word.slice(0, offset), word.slice(offset));\n }\n }\n return words;\n}\n/**\n * Convert a string to space separated lower case (`foo bar`).\n */\nexport function noCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n return (prefix +\n words.map(lowerFactory(options?.locale)).join(options?.delimiter ?? \" \") +\n suffix);\n}\n/**\n * Convert a string to camel case (`fooBar`).\n */\nexport function camelCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = options?.mergeAmbiguousCharacters\n ? capitalCaseTransformFactory(lower, upper)\n : pascalCaseTransformFactory(lower, upper);\n return (prefix +\n words\n .map((word, index) => {\n if (index === 0)\n return lower(word);\n return transform(word, index);\n })\n .join(options?.delimiter ?? \"\") +\n suffix);\n}\n/**\n * Convert a string to pascal case (`FooBar`).\n */\nexport function pascalCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = options?.mergeAmbiguousCharacters\n ? capitalCaseTransformFactory(lower, upper)\n : pascalCaseTransformFactory(lower, upper);\n return prefix + words.map(transform).join(options?.delimiter ?? \"\") + suffix;\n}\n/**\n * Convert a string to pascal snake case (`Foo_Bar`).\n */\nexport function pascalSnakeCase(input, options) {\n return capitalCase(input, { delimiter: \"_\", ...options });\n}\n/**\n * Convert a string to capital case (`Foo Bar`).\n */\nexport function capitalCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n return (prefix +\n words\n .map(capitalCaseTransformFactory(lower, upper))\n .join(options?.delimiter ?? \" \") +\n suffix);\n}\n/**\n * Convert a string to constant case (`FOO_BAR`).\n */\nexport function constantCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n return (prefix +\n words.map(upperFactory(options?.locale)).join(options?.delimiter ?? \"_\") +\n suffix);\n}\n/**\n * Convert a string to dot case (`foo.bar`).\n */\nexport function dotCase(input, options) {\n return noCase(input, { delimiter: \".\", ...options });\n}\n/**\n * Convert a string to kebab case (`foo-bar`).\n */\nexport function kebabCase(input, options) {\n return noCase(input, { delimiter: \"-\", ...options });\n}\n/**\n * Convert a string to path case (`foo/bar`).\n */\nexport function pathCase(input, options) {\n return noCase(input, { delimiter: \"/\", ...options });\n}\n/**\n * Convert a string to path case (`Foo bar`).\n */\nexport function sentenceCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = capitalCaseTransformFactory(lower, upper);\n return (prefix +\n words\n .map((word, index) => {\n if (index === 0)\n return transform(word);\n return lower(word);\n })\n .join(options?.delimiter ?? \" \") +\n suffix);\n}\n/**\n * Convert a string to snake case (`foo_bar`).\n */\nexport function snakeCase(input, options) {\n return noCase(input, { delimiter: \"_\", ...options });\n}\n/**\n * Convert a string to header case (`Foo-Bar`).\n */\nexport function trainCase(input, options) {\n return capitalCase(input, { delimiter: \"-\", ...options });\n}\nfunction lowerFactory(locale) {\n return locale === false\n ? (input) => input.toLowerCase()\n : (input) => input.toLocaleLowerCase(locale);\n}\nfunction upperFactory(locale) {\n return locale === false\n ? (input) => input.toUpperCase()\n : (input) => input.toLocaleUpperCase(locale);\n}\nfunction capitalCaseTransformFactory(lower, upper) {\n return (word) => `${upper(word[0])}${lower(word.slice(1))}`;\n}\nfunction pascalCaseTransformFactory(lower, upper) {\n return (word, index) => {\n const char0 = word[0];\n const initial = index > 0 && char0 >= \"0\" && char0 <= \"9\" ? \"_\" + char0 : upper(char0);\n return initial + lower(word.slice(1));\n };\n}\nfunction splitPrefixSuffix(input, options = {}) {\n const splitFn = options.split ?? (options.separateNumbers ? splitSeparateNumbers : split);\n const prefixCharacters = options.prefixCharacters ?? DEFAULT_PREFIX_SUFFIX_CHARACTERS;\n const suffixCharacters = options.suffixCharacters ?? DEFAULT_PREFIX_SUFFIX_CHARACTERS;\n let prefixIndex = 0;\n let suffixIndex = input.length;\n while (prefixIndex < input.length) {\n const char = input.charAt(prefixIndex);\n if (!prefixCharacters.includes(char))\n break;\n prefixIndex++;\n }\n while (suffixIndex > prefixIndex) {\n const index = suffixIndex - 1;\n const char = input.charAt(index);\n if (!suffixCharacters.includes(char))\n break;\n suffixIndex = index;\n }\n return [\n input.slice(0, prefixIndex),\n splitFn(input.slice(prefixIndex, suffixIndex)),\n input.slice(suffixIndex),\n ];\n}\n//# sourceMappingURL=index.js.map","/**\n * Abstract base class for all adapters.\n *\n * An adapter translates store operations (findRecord, createRecord, …) into\n * concrete network requests and returns raw payloads that the serializer layer\n * then normalises. Concrete subclasses (`RestAdapter`, `ODataAdapter`, …)\n * override the abstract CRUD methods and may also override the URL-building\n * helpers to produce protocol-specific URLs.\n *\n * URL construction follows an Ember Data–style pipeline:\n * `buildURL` → `urlForFindRecord` / `urlForQuery` / … → `_composeURL`\n *\n * Configuration surface:\n * - `host` – base URL prefix (e.g. `https://api.example.com`)\n * - `namespace` – path segment appended after the host (e.g. `v2`)\n * - `headers` – headers merged into every request\n * - `coalesceFindRequests` – when `true` the store batches separate\n * `findRecord` calls into a single `findMany` call\n */\n\nimport pluralize from 'pluralize';\nimport { kebabCase } from 'change-case';\n\n/** Union of all operation names the store can issue to an adapter. */\nexport type AdapterRequestType =\n | 'findRecord'\n | 'findAll'\n | 'findMany'\n | 'query'\n | 'queryRecord'\n | 'createRecord'\n | 'updateRecord'\n | 'deleteRecord';\n\n/**\n * A frozen view of a model record passed to the adapter.\n * Adapters read but do not mutate snapshots.\n */\nexport interface AdapterSnapshot {\n /** The record's server-assigned id, or `null` for new records. */\n id: string | null;\n /** The model's registered `modelName`. */\n modelName: string;\n /** Returns the current value for an attribute key. */\n attr(key: string): unknown;\n /** Returns the `belongsTo` relationship value (or just its id when `{ id: true }`). */\n belongsTo(key: string, options?: { id: boolean }): unknown;\n /** Returns the `hasMany` relationship values (or just ids when `{ ids: true }`). */\n hasMany(key: string, options?: { ids: boolean }): unknown;\n /** Returns `{ [key]: [oldValue, newValue] }` for attributes that differ from the server state. */\n changedAttributes(): Record<string, [unknown, unknown]>;\n /** Reference to the live record instance. */\n record: unknown;\n}\n\nexport abstract class Adapter {\n /** Base URL prepended to every generated URL. Empty string = relative URLs. */\n namespace: string = '';\n /** Host prefix, e.g. `https://api.example.com`. */\n host: string = '';\n /** Extra headers merged into every request via `defaultHeaders()`. */\n headers: Record<string, string> = {};\n /**\n * When `true` the store will coalesce multiple `findRecord` calls for the\n * same model type into a single `findMany` network request.\n */\n coalesceFindRequests: boolean = false;\n\n /** Fetches a single record by id. */\n abstract findRecord(\n store: unknown,\n modelName: string,\n id: string,\n snapshot: AdapterSnapshot,\n options?: { include?: string },\n ): Promise<unknown>;\n\n /** Fetches all records of a given model type. */\n abstract findAll(\n store: unknown,\n modelName: string,\n sinceToken: string | null,\n snapshotArray: AdapterSnapshot[],\n options?: { include?: string },\n ): Promise<unknown>;\n\n /** Fetches multiple records by id in a single request. */\n abstract findMany(\n store: unknown,\n modelName: string,\n ids: string[],\n snapshots: AdapterSnapshot[],\n ): Promise<unknown>;\n\n /** Executes an arbitrary server-side query, returning an array of records. */\n abstract query(\n store: unknown,\n modelName: string,\n query: Record<string, unknown>,\n ): Promise<unknown>;\n\n /** Like `query` but returns at most one record. */\n abstract queryRecord(\n store: unknown,\n modelName: string,\n query: Record<string, unknown>,\n ): Promise<unknown>;\n\n /** Persists a new record to the server (POST). */\n abstract createRecord(\n store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown>;\n\n /** Persists all attributes of an existing record (PUT). */\n abstract updateRecord(\n store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown>;\n\n /**\n * Persists only the changed attributes of an existing record (PATCH).\n * Default implementation delegates to `updateRecord`.\n * Override in subclasses to send a partial payload via HTTP PATCH.\n */\n patchRecord(\n store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n return this.updateRecord(store, modelName, snapshot);\n }\n\n /** Removes a record from the server (DELETE). */\n abstract deleteRecord(\n store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown>;\n\n /**\n * Returns the URL path segment for a given model name.\n * Default: dasherized, pluralized form — e.g. `userPost` → `user-posts`.\n */\n pathForType(modelName: string): string {\n return pluralize.plural(kebabCase(modelName));\n }\n\n /**\n * Assembles a full URL from `host`, `namespace`, and the supplied `path`.\n * Returns an absolute URL when `host` is set, otherwise a root-relative path.\n */\n protected _composeURL(path: string): string {\n const ns = this.namespace.replace(/^\\/+|\\/+$/g, '');\n const hostPrefix = this.host ? this.host.replace(/\\/+$/, '') : '';\n const parts: string[] = [];\n if (hostPrefix) {\n parts.push(hostPrefix);\n }\n if (ns) {\n parts.push(ns);\n }\n parts.push(path);\n if (hostPrefix) {\n return parts.join('/');\n }\n return `/${parts.filter(Boolean).join('/')}`;\n }\n\n /**\n * Dispatches to the appropriate `urlFor*` method based on `requestType`.\n *\n * @param modelName - Registered model name.\n * @param id - Record id(s), or `null` for collection requests.\n * @param snapshot - Snapshot(s) for the request.\n * @param requestType - Operation being performed.\n * @param query - Query parameters (used for `query` / `queryRecord`).\n */\n buildURL(\n modelName: string,\n id: string | string[] | null,\n snapshot: AdapterSnapshot | AdapterSnapshot[] | null,\n requestType: AdapterRequestType,\n query: Record<string, unknown> = {},\n ): string {\n switch (requestType) {\n case 'findRecord':\n return this.urlForFindRecord(id as string, modelName, snapshot as AdapterSnapshot);\n case 'findAll':\n return this.urlForFindAll(modelName, (snapshot as AdapterSnapshot[]) ?? []);\n case 'findMany':\n return this.urlForFindMany(\n (id as string[]) ?? [],\n modelName,\n (snapshot as AdapterSnapshot[]) ?? [],\n );\n case 'query':\n return this.urlForQuery(query, modelName);\n case 'queryRecord':\n return this.urlForQueryRecord(query, modelName);\n case 'createRecord':\n return this.urlForCreateRecord(modelName, snapshot as AdapterSnapshot);\n case 'updateRecord':\n return this.urlForUpdateRecord(\n id as string,\n modelName,\n snapshot as AdapterSnapshot,\n );\n case 'deleteRecord':\n return this.urlForDeleteRecord(\n id as string,\n modelName,\n snapshot as AdapterSnapshot,\n );\n }\n }\n\n /** URL for a `findRecord` request. Default: `<collection>/<id>`. */\n urlForFindRecord(id: string, modelName: string, _snapshot: AdapterSnapshot): string {\n return this._composeURL(`${this.pathForType(modelName)}/${encodeURIComponent(id)}`);\n }\n\n /** URL for a `findAll` request. Default: `<collection>`. */\n urlForFindAll(modelName: string, _snapshots: AdapterSnapshot[]): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for a `findMany` request. Default: `<collection>` (ids appended by the adapter). */\n urlForFindMany(\n _ids: string[],\n modelName: string,\n _snapshots: AdapterSnapshot[],\n ): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for a `query` request. Default: `<collection>`. */\n urlForQuery(_query: Record<string, unknown>, modelName: string): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for a `queryRecord` request. Default: `<collection>`. */\n urlForQueryRecord(_query: Record<string, unknown>, modelName: string): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for a `createRecord` request. Default: `<collection>`. */\n urlForCreateRecord(modelName: string, _snapshot: AdapterSnapshot): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for an `updateRecord` request. Default: `<collection>/<id>`. */\n urlForUpdateRecord(\n id: string,\n modelName: string,\n _snapshot: AdapterSnapshot,\n ): string {\n return this._composeURL(`${this.pathForType(modelName)}/${encodeURIComponent(id)}`);\n }\n\n /** URL for a `deleteRecord` request. Default: `<collection>/<id>`. */\n urlForDeleteRecord(\n id: string,\n modelName: string,\n _snapshot: AdapterSnapshot,\n ): string {\n return this._composeURL(`${this.pathForType(modelName)}/${encodeURIComponent(id)}`);\n }\n\n /**\n * Groups snapshots into batches for `findMany`.\n * Default implementation puts all snapshots in a single batch.\n */\n groupRecordsForFindMany(\n _store: unknown,\n snapshots: AdapterSnapshot[],\n ): AdapterSnapshot[][] {\n return [snapshots];\n }\n\n /**\n * Returns `true` when the store should bypass the cache and reload this\n * record immediately. Default: always `false`.\n */\n shouldReloadRecord(_store: unknown, _snapshot: AdapterSnapshot): boolean {\n return false;\n }\n\n /**\n * Returns `true` when the store should schedule a background reload for\n * this record after returning the cached version. Default: always `true`.\n */\n shouldBackgroundReloadRecord(\n _store: unknown,\n _snapshot: AdapterSnapshot,\n ): boolean {\n return true;\n }\n\n /**\n * Returns `true` when the store should reload the full collection on every\n * `findAll` call. Default: always `false`.\n */\n shouldReloadAll(_store: unknown, _snapshotRecordArray: AdapterSnapshot[]): boolean {\n return false;\n }\n\n /**\n * Returns `true` when the store should schedule a background reload after\n * returning a cached collection. Default: always `true`.\n */\n shouldBackgroundReloadAll(\n _store: unknown,\n _snapshotRecordArray: AdapterSnapshot[],\n ): boolean {\n return true;\n }\n}\n","/**\n * HTTP/REST adapter that communicates with a JSON REST API.\n *\n * `RestAdapter` is the default concrete adapter. It uses the Fetch API and\n * maps each store operation to a conventional HTTP verb:\n *\n * | Operation | Method |\n * |----------------|--------|\n * | findRecord | GET |\n * | findAll | GET |\n * | findMany | GET |\n * | query | GET |\n * | queryRecord | GET |\n * | createRecord | POST |\n * | updateRecord | PUT |\n * | deleteRecord | DELETE |\n *\n * Subclasses (e.g. `JsonApiAdapter`, `ODataAdapter`) override individual\n * methods to adjust headers, HTTP verbs, or body serialization without\n * reimplementing the full adapter.\n */\n\nimport { injectable } from 'tsyringe';\nimport { Adapter, type AdapterSnapshot } from './Adapter.js';\nimport { attachResponseHeaders } from '../cache/cache-utils.js';\n\n@injectable()\nexport class RestAdapter extends Adapter {\n static serializeSnapshotToObject(\n snapshot: AdapterSnapshot,\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n const record = snapshot.record as { _data?: Record<string, unknown> };\n const data = record._data;\n if (data) {\n for (const [key, value] of Object.entries(data)) {\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n continue;\n }\n body[key] = value;\n }\n }\n return body;\n }\n\n static toQueryString(query: Record<string, unknown>): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) {\n continue;\n }\n parts.push(\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`,\n );\n }\n return parts.length > 0 ? `?${parts.join('&')}` : '';\n }\n\n /** Headers sent with every read (GET) request. */\n defaultHeaders(): Record<string, string> {\n return {\n Accept: 'application/json',\n ...this.headers,\n };\n }\n\n /** Headers sent with every write (POST / PUT / DELETE) request. */\n mutationHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders(),\n };\n }\n\n /**\n * Low-level fetch wrapper used by all operation methods.\n *\n * - Throws an enriched `Error` (with `status` and `body` properties) for\n * any non-2xx response.\n * - Returns `null` for 204 No Content responses.\n * - Attempts JSON parsing; falls back to the raw text string on failure.\n */\n async _fetchJSON(\n url: string,\n init: RequestInit,\n ): Promise<unknown> {\n const response = await fetch(url, init);\n if (!response.ok) {\n let body: unknown = null;\n try {\n body = await response.json();\n } catch {\n /* ignore */\n }\n const error = Object.assign(\n new Error(`Request failed: ${response.status}`),\n { status: response.status, body },\n );\n throw error;\n }\n if (response.status === 204) {\n return null;\n }\n const text = await response.text();\n if (!text) {\n return null;\n }\n let result: unknown;\n try {\n result = JSON.parse(text);\n } catch {\n result = text;\n }\n if (result !== null && typeof result === 'object') {\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n attachResponseHeaders(result, headers);\n }\n return result;\n }\n\n override async findRecord(\n _store: unknown,\n modelName: string,\n id: string,\n snapshot: AdapterSnapshot,\n options?: { include?: string },\n ): Promise<unknown> {\n let url = this.buildURL(modelName, id, snapshot, 'findRecord');\n if (options?.include) {\n url += `${url.includes('?') ? '&' : '?'}include=${encodeURIComponent(options.include)}`;\n }\n return this._fetchJSON(url, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n override async findAll(\n _store: unknown,\n modelName: string,\n _sinceToken: string | null,\n snapshotArray: AdapterSnapshot[],\n options?: { include?: string },\n ): Promise<unknown> {\n let url = this.buildURL(modelName, null, snapshotArray, 'findAll');\n if (options?.include) {\n url += `${url.includes('?') ? '&' : '?'}include=${encodeURIComponent(options.include)}`;\n }\n return this._fetchJSON(url, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n /**\n * Fetches multiple records by appending an `ids` query parameter.\n * e.g. `/posts?ids=1,2,3`\n */\n override async findMany(\n _store: unknown,\n modelName: string,\n ids: string[],\n snapshots: AdapterSnapshot[],\n ): Promise<unknown> {\n const url = this.buildURL(modelName, ids, snapshots, 'findMany');\n const separator = url.includes('?') ? '&' : '?';\n const fullUrl = `${url}${separator}ids=${ids.map(encodeURIComponent).join(',')}`;\n return this._fetchJSON(fullUrl, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n override async query(\n _store: unknown,\n modelName: string,\n query: Record<string, unknown>,\n ): Promise<unknown> {\n const base = this.buildURL(modelName, null, null, 'query', query);\n const url = `${base}${RestAdapter.toQueryString(query)}`;\n return this._fetchJSON(url, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n override async queryRecord(\n _store: unknown,\n modelName: string,\n query: Record<string, unknown>,\n ): Promise<unknown> {\n const base = this.buildURL(modelName, null, null, 'queryRecord', query);\n const url = `${base}${RestAdapter.toQueryString(query)}`;\n return this._fetchJSON(url, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n override async createRecord(\n _store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n const url = this.buildURL(modelName, null, snapshot, 'createRecord');\n return this._fetchJSON(url, {\n method: 'POST',\n headers: this.mutationHeaders(),\n body: JSON.stringify(RestAdapter.serializeSnapshotToObject(snapshot)),\n });\n }\n\n override async updateRecord(\n _store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n const url = this.buildURL(modelName, snapshot.id, snapshot, 'updateRecord');\n return this._fetchJSON(url, {\n method: 'PUT',\n headers: this.mutationHeaders(),\n body: JSON.stringify(RestAdapter.serializeSnapshotToObject(snapshot)),\n });\n }\n\n override async patchRecord(\n _store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n const url = this.buildURL(modelName, snapshot.id, snapshot, 'updateRecord');\n const changed = snapshot.changedAttributes();\n const partial: Record<string, unknown> = {};\n for (const [key, [, current]] of Object.entries(changed)) {\n partial[key] = current;\n }\n return this._fetchJSON(url, {\n method: 'PATCH',\n headers: this.mutationHeaders(),\n body: JSON.stringify(partial),\n });\n }\n\n override async deleteRecord(\n _store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n const url = this.buildURL(modelName, snapshot.id, snapshot, 'deleteRecord');\n return this._fetchJSON(url, {\n method: 'DELETE',\n headers: this.defaultHeaders(),\n });\n }\n}\n"],"names":["SPLIT_LOWER_UPPER_RE","SPLIT_UPPER_UPPER_RE","SPLIT_SEPARATE_NUMBER_RE","DEFAULT_STRIP_REGEXP","SPLIT_REPLACE_VALUE","DEFAULT_PREFIX_SUFFIX_CHARACTERS","split","value","result","start","end","splitSeparateNumbers","words","i","word","match","offset","noCase","input","options","prefix","suffix","splitPrefixSuffix","lowerFactory","pascalCase","lower","upper","upperFactory","transform","pascalCaseTransformFactory","kebabCase","locale","index","char0","splitFn","prefixCharacters","suffixCharacters","prefixIndex","suffixIndex","char","Adapter","store","modelName","snapshot","pluralize","path","ns","hostPrefix","parts","id","requestType","query","_snapshot","_snapshots","_ids","_query","_store","snapshots","_snapshotRecordArray","RestAdapter","body","data","key","url","init","response","text","headers","attachResponseHeaders","_sinceToken","snapshotArray","ids","separator","fullUrl","changed","partial","current","__decorateClass","injectable"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { injectable as p } from "tsyringe";
|
|
2
2
|
import _ from "pluralize";
|
|
3
|
-
import { a as y } from "./cache-utils-
|
|
3
|
+
import { a as y } from "./cache-utils-38Dqu4Qf.js";
|
|
4
4
|
const F = new RegExp("([\\p{Ll}\\d])(\\p{Lu})", "gu"), L = new RegExp("(\\p{Lu})([\\p{Lu}][\\p{Ll}])", "gu"), U = new RegExp("(\\d)\\p{Ll}|(\\p{L})\\d", "u"), b = /[^\p{L}\d]+/giu, i = "$1\0$2", l = "";
|
|
5
5
|
function d(c) {
|
|
6
6
|
let e = c.trim();
|
|
@@ -361,4 +361,4 @@ export {
|
|
|
361
361
|
u as R,
|
|
362
362
|
w as p
|
|
363
363
|
};
|
|
364
|
-
//# sourceMappingURL=RestAdapter-
|
|
364
|
+
//# sourceMappingURL=RestAdapter-CGWqOR_G.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RestAdapter-D6bGIHZT.js","sources":["../node_modules/.pnpm/change-case@5.4.4/node_modules/change-case/dist/index.js","../src/adapter/Adapter.ts","../src/adapter/RestAdapter.ts"],"sourcesContent":["// Regexps involved with splitting words in various case formats.\nconst SPLIT_LOWER_UPPER_RE = /([\\p{Ll}\\d])(\\p{Lu})/gu;\nconst SPLIT_UPPER_UPPER_RE = /(\\p{Lu})([\\p{Lu}][\\p{Ll}])/gu;\n// Used to iterate over the initial split result and separate numbers.\nconst SPLIT_SEPARATE_NUMBER_RE = /(\\d)\\p{Ll}|(\\p{L})\\d/u;\n// Regexp involved with stripping non-word characters from the result.\nconst DEFAULT_STRIP_REGEXP = /[^\\p{L}\\d]+/giu;\n// The replacement value for splits.\nconst SPLIT_REPLACE_VALUE = \"$1\\0$2\";\n// The default characters to keep after transforming case.\nconst DEFAULT_PREFIX_SUFFIX_CHARACTERS = \"\";\n/**\n * Split any cased input strings into an array of words.\n */\nexport function split(value) {\n let result = value.trim();\n result = result\n .replace(SPLIT_LOWER_UPPER_RE, SPLIT_REPLACE_VALUE)\n .replace(SPLIT_UPPER_UPPER_RE, SPLIT_REPLACE_VALUE);\n result = result.replace(DEFAULT_STRIP_REGEXP, \"\\0\");\n let start = 0;\n let end = result.length;\n // Trim the delimiter from around the output string.\n while (result.charAt(start) === \"\\0\")\n start++;\n if (start === end)\n return [];\n while (result.charAt(end - 1) === \"\\0\")\n end--;\n return result.slice(start, end).split(/\\0/g);\n}\n/**\n * Split the input string into an array of words, separating numbers.\n */\nexport function splitSeparateNumbers(value) {\n const words = split(value);\n for (let i = 0; i < words.length; i++) {\n const word = words[i];\n const match = SPLIT_SEPARATE_NUMBER_RE.exec(word);\n if (match) {\n const offset = match.index + (match[1] ?? match[2]).length;\n words.splice(i, 1, word.slice(0, offset), word.slice(offset));\n }\n }\n return words;\n}\n/**\n * Convert a string to space separated lower case (`foo bar`).\n */\nexport function noCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n return (prefix +\n words.map(lowerFactory(options?.locale)).join(options?.delimiter ?? \" \") +\n suffix);\n}\n/**\n * Convert a string to camel case (`fooBar`).\n */\nexport function camelCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = options?.mergeAmbiguousCharacters\n ? capitalCaseTransformFactory(lower, upper)\n : pascalCaseTransformFactory(lower, upper);\n return (prefix +\n words\n .map((word, index) => {\n if (index === 0)\n return lower(word);\n return transform(word, index);\n })\n .join(options?.delimiter ?? \"\") +\n suffix);\n}\n/**\n * Convert a string to pascal case (`FooBar`).\n */\nexport function pascalCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = options?.mergeAmbiguousCharacters\n ? capitalCaseTransformFactory(lower, upper)\n : pascalCaseTransformFactory(lower, upper);\n return prefix + words.map(transform).join(options?.delimiter ?? \"\") + suffix;\n}\n/**\n * Convert a string to pascal snake case (`Foo_Bar`).\n */\nexport function pascalSnakeCase(input, options) {\n return capitalCase(input, { delimiter: \"_\", ...options });\n}\n/**\n * Convert a string to capital case (`Foo Bar`).\n */\nexport function capitalCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n return (prefix +\n words\n .map(capitalCaseTransformFactory(lower, upper))\n .join(options?.delimiter ?? \" \") +\n suffix);\n}\n/**\n * Convert a string to constant case (`FOO_BAR`).\n */\nexport function constantCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n return (prefix +\n words.map(upperFactory(options?.locale)).join(options?.delimiter ?? \"_\") +\n suffix);\n}\n/**\n * Convert a string to dot case (`foo.bar`).\n */\nexport function dotCase(input, options) {\n return noCase(input, { delimiter: \".\", ...options });\n}\n/**\n * Convert a string to kebab case (`foo-bar`).\n */\nexport function kebabCase(input, options) {\n return noCase(input, { delimiter: \"-\", ...options });\n}\n/**\n * Convert a string to path case (`foo/bar`).\n */\nexport function pathCase(input, options) {\n return noCase(input, { delimiter: \"/\", ...options });\n}\n/**\n * Convert a string to path case (`Foo bar`).\n */\nexport function sentenceCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = capitalCaseTransformFactory(lower, upper);\n return (prefix +\n words\n .map((word, index) => {\n if (index === 0)\n return transform(word);\n return lower(word);\n })\n .join(options?.delimiter ?? \" \") +\n suffix);\n}\n/**\n * Convert a string to snake case (`foo_bar`).\n */\nexport function snakeCase(input, options) {\n return noCase(input, { delimiter: \"_\", ...options });\n}\n/**\n * Convert a string to header case (`Foo-Bar`).\n */\nexport function trainCase(input, options) {\n return capitalCase(input, { delimiter: \"-\", ...options });\n}\nfunction lowerFactory(locale) {\n return locale === false\n ? (input) => input.toLowerCase()\n : (input) => input.toLocaleLowerCase(locale);\n}\nfunction upperFactory(locale) {\n return locale === false\n ? (input) => input.toUpperCase()\n : (input) => input.toLocaleUpperCase(locale);\n}\nfunction capitalCaseTransformFactory(lower, upper) {\n return (word) => `${upper(word[0])}${lower(word.slice(1))}`;\n}\nfunction pascalCaseTransformFactory(lower, upper) {\n return (word, index) => {\n const char0 = word[0];\n const initial = index > 0 && char0 >= \"0\" && char0 <= \"9\" ? \"_\" + char0 : upper(char0);\n return initial + lower(word.slice(1));\n };\n}\nfunction splitPrefixSuffix(input, options = {}) {\n const splitFn = options.split ?? (options.separateNumbers ? splitSeparateNumbers : split);\n const prefixCharacters = options.prefixCharacters ?? DEFAULT_PREFIX_SUFFIX_CHARACTERS;\n const suffixCharacters = options.suffixCharacters ?? DEFAULT_PREFIX_SUFFIX_CHARACTERS;\n let prefixIndex = 0;\n let suffixIndex = input.length;\n while (prefixIndex < input.length) {\n const char = input.charAt(prefixIndex);\n if (!prefixCharacters.includes(char))\n break;\n prefixIndex++;\n }\n while (suffixIndex > prefixIndex) {\n const index = suffixIndex - 1;\n const char = input.charAt(index);\n if (!suffixCharacters.includes(char))\n break;\n suffixIndex = index;\n }\n return [\n input.slice(0, prefixIndex),\n splitFn(input.slice(prefixIndex, suffixIndex)),\n input.slice(suffixIndex),\n ];\n}\n//# sourceMappingURL=index.js.map","/**\n * Abstract base class for all adapters.\n *\n * An adapter translates store operations (findRecord, createRecord, …) into\n * concrete network requests and returns raw payloads that the serializer layer\n * then normalises. Concrete subclasses (`RestAdapter`, `ODataAdapter`, …)\n * override the abstract CRUD methods and may also override the URL-building\n * helpers to produce protocol-specific URLs.\n *\n * URL construction follows an Ember Data–style pipeline:\n * `buildURL` → `urlForFindRecord` / `urlForQuery` / … → `_composeURL`\n *\n * Configuration surface:\n * - `host` – base URL prefix (e.g. `https://api.example.com`)\n * - `namespace` – path segment appended after the host (e.g. `v2`)\n * - `headers` – headers merged into every request\n * - `coalesceFindRequests` – when `true` the store batches separate\n * `findRecord` calls into a single `findMany` call\n */\n\nimport pluralize from 'pluralize';\nimport { kebabCase } from 'change-case';\n\n/** Union of all operation names the store can issue to an adapter. */\nexport type AdapterRequestType =\n | 'findRecord'\n | 'findAll'\n | 'findMany'\n | 'query'\n | 'queryRecord'\n | 'createRecord'\n | 'updateRecord'\n | 'deleteRecord';\n\n/**\n * A frozen view of a model record passed to the adapter.\n * Adapters read but do not mutate snapshots.\n */\nexport interface AdapterSnapshot {\n /** The record's server-assigned id, or `null` for new records. */\n id: string | null;\n /** The model's registered `modelName`. */\n modelName: string;\n /** Returns the current value for an attribute key. */\n attr(key: string): unknown;\n /** Returns the `belongsTo` relationship value (or just its id when `{ id: true }`). */\n belongsTo(key: string, options?: { id: boolean }): unknown;\n /** Returns the `hasMany` relationship values (or just ids when `{ ids: true }`). */\n hasMany(key: string, options?: { ids: boolean }): unknown;\n /** Returns `{ [key]: [oldValue, newValue] }` for attributes that differ from the server state. */\n changedAttributes(): Record<string, [unknown, unknown]>;\n /** Reference to the live record instance. */\n record: unknown;\n}\n\nexport abstract class Adapter {\n /** Base URL prepended to every generated URL. Empty string = relative URLs. */\n namespace: string = '';\n /** Host prefix, e.g. `https://api.example.com`. */\n host: string = '';\n /** Extra headers merged into every request via `defaultHeaders()`. */\n headers: Record<string, string> = {};\n /**\n * When `true` the store will coalesce multiple `findRecord` calls for the\n * same model type into a single `findMany` network request.\n */\n coalesceFindRequests: boolean = false;\n\n /** Fetches a single record by id. */\n abstract findRecord(\n store: unknown,\n modelName: string,\n id: string,\n snapshot: AdapterSnapshot,\n options?: { include?: string },\n ): Promise<unknown>;\n\n /** Fetches all records of a given model type. */\n abstract findAll(\n store: unknown,\n modelName: string,\n sinceToken: string | null,\n snapshotArray: AdapterSnapshot[],\n options?: { include?: string },\n ): Promise<unknown>;\n\n /** Fetches multiple records by id in a single request. */\n abstract findMany(\n store: unknown,\n modelName: string,\n ids: string[],\n snapshots: AdapterSnapshot[],\n ): Promise<unknown>;\n\n /** Executes an arbitrary server-side query, returning an array of records. */\n abstract query(\n store: unknown,\n modelName: string,\n query: Record<string, unknown>,\n ): Promise<unknown>;\n\n /** Like `query` but returns at most one record. */\n abstract queryRecord(\n store: unknown,\n modelName: string,\n query: Record<string, unknown>,\n ): Promise<unknown>;\n\n /** Persists a new record to the server (POST). */\n abstract createRecord(\n store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown>;\n\n /** Persists all attributes of an existing record (PUT). */\n abstract updateRecord(\n store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown>;\n\n /**\n * Persists only the changed attributes of an existing record (PATCH).\n * Default implementation delegates to `updateRecord`.\n * Override in subclasses to send a partial payload via HTTP PATCH.\n */\n patchRecord(\n store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n return this.updateRecord(store, modelName, snapshot);\n }\n\n /** Removes a record from the server (DELETE). */\n abstract deleteRecord(\n store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown>;\n\n /**\n * Returns the URL path segment for a given model name.\n * Default: dasherized, pluralized form — e.g. `userPost` → `user-posts`.\n */\n pathForType(modelName: string): string {\n return pluralize.plural(kebabCase(modelName));\n }\n\n /**\n * Assembles a full URL from `host`, `namespace`, and the supplied `path`.\n * Returns an absolute URL when `host` is set, otherwise a root-relative path.\n */\n protected _composeURL(path: string): string {\n const ns = this.namespace.replace(/^\\/+|\\/+$/g, '');\n const hostPrefix = this.host ? this.host.replace(/\\/+$/, '') : '';\n const parts: string[] = [];\n if (hostPrefix) {\n parts.push(hostPrefix);\n }\n if (ns) {\n parts.push(ns);\n }\n parts.push(path);\n if (hostPrefix) {\n return parts.join('/');\n }\n return `/${parts.filter(Boolean).join('/')}`;\n }\n\n /**\n * Dispatches to the appropriate `urlFor*` method based on `requestType`.\n *\n * @param modelName - Registered model name.\n * @param id - Record id(s), or `null` for collection requests.\n * @param snapshot - Snapshot(s) for the request.\n * @param requestType - Operation being performed.\n * @param query - Query parameters (used for `query` / `queryRecord`).\n */\n buildURL(\n modelName: string,\n id: string | string[] | null,\n snapshot: AdapterSnapshot | AdapterSnapshot[] | null,\n requestType: AdapterRequestType,\n query: Record<string, unknown> = {},\n ): string {\n switch (requestType) {\n case 'findRecord':\n return this.urlForFindRecord(id as string, modelName, snapshot as AdapterSnapshot);\n case 'findAll':\n return this.urlForFindAll(modelName, (snapshot as AdapterSnapshot[]) ?? []);\n case 'findMany':\n return this.urlForFindMany(\n (id as string[]) ?? [],\n modelName,\n (snapshot as AdapterSnapshot[]) ?? [],\n );\n case 'query':\n return this.urlForQuery(query, modelName);\n case 'queryRecord':\n return this.urlForQueryRecord(query, modelName);\n case 'createRecord':\n return this.urlForCreateRecord(modelName, snapshot as AdapterSnapshot);\n case 'updateRecord':\n return this.urlForUpdateRecord(\n id as string,\n modelName,\n snapshot as AdapterSnapshot,\n );\n case 'deleteRecord':\n return this.urlForDeleteRecord(\n id as string,\n modelName,\n snapshot as AdapterSnapshot,\n );\n }\n }\n\n /** URL for a `findRecord` request. Default: `<collection>/<id>`. */\n urlForFindRecord(id: string, modelName: string, _snapshot: AdapterSnapshot): string {\n return this._composeURL(`${this.pathForType(modelName)}/${encodeURIComponent(id)}`);\n }\n\n /** URL for a `findAll` request. Default: `<collection>`. */\n urlForFindAll(modelName: string, _snapshots: AdapterSnapshot[]): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for a `findMany` request. Default: `<collection>` (ids appended by the adapter). */\n urlForFindMany(\n _ids: string[],\n modelName: string,\n _snapshots: AdapterSnapshot[],\n ): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for a `query` request. Default: `<collection>`. */\n urlForQuery(_query: Record<string, unknown>, modelName: string): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for a `queryRecord` request. Default: `<collection>`. */\n urlForQueryRecord(_query: Record<string, unknown>, modelName: string): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for a `createRecord` request. Default: `<collection>`. */\n urlForCreateRecord(modelName: string, _snapshot: AdapterSnapshot): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for an `updateRecord` request. Default: `<collection>/<id>`. */\n urlForUpdateRecord(\n id: string,\n modelName: string,\n _snapshot: AdapterSnapshot,\n ): string {\n return this._composeURL(`${this.pathForType(modelName)}/${encodeURIComponent(id)}`);\n }\n\n /** URL for a `deleteRecord` request. Default: `<collection>/<id>`. */\n urlForDeleteRecord(\n id: string,\n modelName: string,\n _snapshot: AdapterSnapshot,\n ): string {\n return this._composeURL(`${this.pathForType(modelName)}/${encodeURIComponent(id)}`);\n }\n\n /**\n * Groups snapshots into batches for `findMany`.\n * Default implementation puts all snapshots in a single batch.\n */\n groupRecordsForFindMany(\n _store: unknown,\n snapshots: AdapterSnapshot[],\n ): AdapterSnapshot[][] {\n return [snapshots];\n }\n\n /**\n * Returns `true` when the store should bypass the cache and reload this\n * record immediately. Default: always `false`.\n */\n shouldReloadRecord(_store: unknown, _snapshot: AdapterSnapshot): boolean {\n return false;\n }\n\n /**\n * Returns `true` when the store should schedule a background reload for\n * this record after returning the cached version. Default: always `true`.\n */\n shouldBackgroundReloadRecord(\n _store: unknown,\n _snapshot: AdapterSnapshot,\n ): boolean {\n return true;\n }\n\n /**\n * Returns `true` when the store should reload the full collection on every\n * `findAll` call. Default: always `false`.\n */\n shouldReloadAll(_store: unknown, _snapshotRecordArray: AdapterSnapshot[]): boolean {\n return false;\n }\n\n /**\n * Returns `true` when the store should schedule a background reload after\n * returning a cached collection. Default: always `true`.\n */\n shouldBackgroundReloadAll(\n _store: unknown,\n _snapshotRecordArray: AdapterSnapshot[],\n ): boolean {\n return true;\n }\n}\n","/**\n * HTTP/REST adapter that communicates with a JSON REST API.\n *\n * `RestAdapter` is the default concrete adapter. It uses the Fetch API and\n * maps each store operation to a conventional HTTP verb:\n *\n * | Operation | Method |\n * |----------------|--------|\n * | findRecord | GET |\n * | findAll | GET |\n * | findMany | GET |\n * | query | GET |\n * | queryRecord | GET |\n * | createRecord | POST |\n * | updateRecord | PUT |\n * | deleteRecord | DELETE |\n *\n * Subclasses (e.g. `JsonApiAdapter`, `ODataAdapter`) override individual\n * methods to adjust headers, HTTP verbs, or body serialization without\n * reimplementing the full adapter.\n */\n\nimport { injectable } from 'tsyringe';\nimport { Adapter, type AdapterSnapshot } from './Adapter.js';\nimport { attachResponseHeaders } from '../cache/cache-utils.js';\n\n@injectable()\nexport class RestAdapter extends Adapter {\n static serializeSnapshotToObject(\n snapshot: AdapterSnapshot,\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n const record = snapshot.record as { _data?: Record<string, unknown> };\n const data = record._data;\n if (data) {\n for (const [key, value] of Object.entries(data)) {\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n continue;\n }\n body[key] = value;\n }\n }\n return body;\n }\n\n static toQueryString(query: Record<string, unknown>): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) {\n continue;\n }\n parts.push(\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`,\n );\n }\n return parts.length > 0 ? `?${parts.join('&')}` : '';\n }\n\n /** Headers sent with every read (GET) request. */\n defaultHeaders(): Record<string, string> {\n return {\n Accept: 'application/json',\n ...this.headers,\n };\n }\n\n /** Headers sent with every write (POST / PUT / DELETE) request. */\n mutationHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders(),\n };\n }\n\n /**\n * Low-level fetch wrapper used by all operation methods.\n *\n * - Throws an enriched `Error` (with `status` and `body` properties) for\n * any non-2xx response.\n * - Returns `null` for 204 No Content responses.\n * - Attempts JSON parsing; falls back to the raw text string on failure.\n */\n async _fetchJSON(\n url: string,\n init: RequestInit,\n ): Promise<unknown> {\n const response = await fetch(url, init);\n if (!response.ok) {\n let body: unknown = null;\n try {\n body = await response.json();\n } catch {\n /* ignore */\n }\n const error = Object.assign(\n new Error(`Request failed: ${response.status}`),\n { status: response.status, body },\n );\n throw error;\n }\n if (response.status === 204) {\n return null;\n }\n const text = await response.text();\n if (!text) {\n return null;\n }\n let result: unknown;\n try {\n result = JSON.parse(text);\n } catch {\n result = text;\n }\n if (result !== null && typeof result === 'object') {\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n attachResponseHeaders(result, headers);\n }\n return result;\n }\n\n override async findRecord(\n _store: unknown,\n modelName: string,\n id: string,\n snapshot: AdapterSnapshot,\n options?: { include?: string },\n ): Promise<unknown> {\n let url = this.buildURL(modelName, id, snapshot, 'findRecord');\n if (options?.include) {\n url += `${url.includes('?') ? '&' : '?'}include=${encodeURIComponent(options.include)}`;\n }\n return this._fetchJSON(url, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n override async findAll(\n _store: unknown,\n modelName: string,\n _sinceToken: string | null,\n snapshotArray: AdapterSnapshot[],\n options?: { include?: string },\n ): Promise<unknown> {\n let url = this.buildURL(modelName, null, snapshotArray, 'findAll');\n if (options?.include) {\n url += `${url.includes('?') ? '&' : '?'}include=${encodeURIComponent(options.include)}`;\n }\n return this._fetchJSON(url, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n /**\n * Fetches multiple records by appending an `ids` query parameter.\n * e.g. `/posts?ids=1,2,3`\n */\n override async findMany(\n _store: unknown,\n modelName: string,\n ids: string[],\n snapshots: AdapterSnapshot[],\n ): Promise<unknown> {\n const url = this.buildURL(modelName, ids, snapshots, 'findMany');\n const separator = url.includes('?') ? '&' : '?';\n const fullUrl = `${url}${separator}ids=${ids.map(encodeURIComponent).join(',')}`;\n return this._fetchJSON(fullUrl, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n override async query(\n _store: unknown,\n modelName: string,\n query: Record<string, unknown>,\n ): Promise<unknown> {\n const base = this.buildURL(modelName, null, null, 'query', query);\n const url = `${base}${RestAdapter.toQueryString(query)}`;\n return this._fetchJSON(url, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n override async queryRecord(\n _store: unknown,\n modelName: string,\n query: Record<string, unknown>,\n ): Promise<unknown> {\n const base = this.buildURL(modelName, null, null, 'queryRecord', query);\n const url = `${base}${RestAdapter.toQueryString(query)}`;\n return this._fetchJSON(url, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n override async createRecord(\n _store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n const url = this.buildURL(modelName, null, snapshot, 'createRecord');\n return this._fetchJSON(url, {\n method: 'POST',\n headers: this.mutationHeaders(),\n body: JSON.stringify(RestAdapter.serializeSnapshotToObject(snapshot)),\n });\n }\n\n override async updateRecord(\n _store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n const url = this.buildURL(modelName, snapshot.id, snapshot, 'updateRecord');\n return this._fetchJSON(url, {\n method: 'PUT',\n headers: this.mutationHeaders(),\n body: JSON.stringify(RestAdapter.serializeSnapshotToObject(snapshot)),\n });\n }\n\n override async patchRecord(\n _store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n const url = this.buildURL(modelName, snapshot.id, snapshot, 'updateRecord');\n const changed = snapshot.changedAttributes();\n const partial: Record<string, unknown> = {};\n for (const [key, [, current]] of Object.entries(changed)) {\n partial[key] = current;\n }\n return this._fetchJSON(url, {\n method: 'PATCH',\n headers: this.mutationHeaders(),\n body: JSON.stringify(partial),\n });\n }\n\n override async deleteRecord(\n _store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n const url = this.buildURL(modelName, snapshot.id, snapshot, 'deleteRecord');\n return this._fetchJSON(url, {\n method: 'DELETE',\n headers: this.defaultHeaders(),\n });\n }\n}\n"],"names":["SPLIT_LOWER_UPPER_RE","SPLIT_UPPER_UPPER_RE","SPLIT_SEPARATE_NUMBER_RE","DEFAULT_STRIP_REGEXP","SPLIT_REPLACE_VALUE","DEFAULT_PREFIX_SUFFIX_CHARACTERS","split","value","result","start","end","splitSeparateNumbers","words","i","word","match","offset","noCase","input","options","prefix","suffix","splitPrefixSuffix","lowerFactory","pascalCase","lower","upper","upperFactory","transform","pascalCaseTransformFactory","kebabCase","locale","index","char0","splitFn","prefixCharacters","suffixCharacters","prefixIndex","suffixIndex","char","Adapter","store","modelName","snapshot","pluralize","path","ns","hostPrefix","parts","id","requestType","query","_snapshot","_snapshots","_ids","_query","_store","snapshots","_snapshotRecordArray","RestAdapter","body","data","key","url","init","response","text","headers","attachResponseHeaders","_sinceToken","snapshotArray","ids","separator","fullUrl","changed","partial","current","__decorateClass","injectable"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"RestAdapter-CGWqOR_G.js","sources":["../node_modules/.pnpm/change-case@5.4.4/node_modules/change-case/dist/index.js","../src/adapter/Adapter.ts","../src/adapter/RestAdapter.ts"],"sourcesContent":["// Regexps involved with splitting words in various case formats.\nconst SPLIT_LOWER_UPPER_RE = /([\\p{Ll}\\d])(\\p{Lu})/gu;\nconst SPLIT_UPPER_UPPER_RE = /(\\p{Lu})([\\p{Lu}][\\p{Ll}])/gu;\n// Used to iterate over the initial split result and separate numbers.\nconst SPLIT_SEPARATE_NUMBER_RE = /(\\d)\\p{Ll}|(\\p{L})\\d/u;\n// Regexp involved with stripping non-word characters from the result.\nconst DEFAULT_STRIP_REGEXP = /[^\\p{L}\\d]+/giu;\n// The replacement value for splits.\nconst SPLIT_REPLACE_VALUE = \"$1\\0$2\";\n// The default characters to keep after transforming case.\nconst DEFAULT_PREFIX_SUFFIX_CHARACTERS = \"\";\n/**\n * Split any cased input strings into an array of words.\n */\nexport function split(value) {\n let result = value.trim();\n result = result\n .replace(SPLIT_LOWER_UPPER_RE, SPLIT_REPLACE_VALUE)\n .replace(SPLIT_UPPER_UPPER_RE, SPLIT_REPLACE_VALUE);\n result = result.replace(DEFAULT_STRIP_REGEXP, \"\\0\");\n let start = 0;\n let end = result.length;\n // Trim the delimiter from around the output string.\n while (result.charAt(start) === \"\\0\")\n start++;\n if (start === end)\n return [];\n while (result.charAt(end - 1) === \"\\0\")\n end--;\n return result.slice(start, end).split(/\\0/g);\n}\n/**\n * Split the input string into an array of words, separating numbers.\n */\nexport function splitSeparateNumbers(value) {\n const words = split(value);\n for (let i = 0; i < words.length; i++) {\n const word = words[i];\n const match = SPLIT_SEPARATE_NUMBER_RE.exec(word);\n if (match) {\n const offset = match.index + (match[1] ?? match[2]).length;\n words.splice(i, 1, word.slice(0, offset), word.slice(offset));\n }\n }\n return words;\n}\n/**\n * Convert a string to space separated lower case (`foo bar`).\n */\nexport function noCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n return (prefix +\n words.map(lowerFactory(options?.locale)).join(options?.delimiter ?? \" \") +\n suffix);\n}\n/**\n * Convert a string to camel case (`fooBar`).\n */\nexport function camelCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = options?.mergeAmbiguousCharacters\n ? capitalCaseTransformFactory(lower, upper)\n : pascalCaseTransformFactory(lower, upper);\n return (prefix +\n words\n .map((word, index) => {\n if (index === 0)\n return lower(word);\n return transform(word, index);\n })\n .join(options?.delimiter ?? \"\") +\n suffix);\n}\n/**\n * Convert a string to pascal case (`FooBar`).\n */\nexport function pascalCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = options?.mergeAmbiguousCharacters\n ? capitalCaseTransformFactory(lower, upper)\n : pascalCaseTransformFactory(lower, upper);\n return prefix + words.map(transform).join(options?.delimiter ?? \"\") + suffix;\n}\n/**\n * Convert a string to pascal snake case (`Foo_Bar`).\n */\nexport function pascalSnakeCase(input, options) {\n return capitalCase(input, { delimiter: \"_\", ...options });\n}\n/**\n * Convert a string to capital case (`Foo Bar`).\n */\nexport function capitalCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n return (prefix +\n words\n .map(capitalCaseTransformFactory(lower, upper))\n .join(options?.delimiter ?? \" \") +\n suffix);\n}\n/**\n * Convert a string to constant case (`FOO_BAR`).\n */\nexport function constantCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n return (prefix +\n words.map(upperFactory(options?.locale)).join(options?.delimiter ?? \"_\") +\n suffix);\n}\n/**\n * Convert a string to dot case (`foo.bar`).\n */\nexport function dotCase(input, options) {\n return noCase(input, { delimiter: \".\", ...options });\n}\n/**\n * Convert a string to kebab case (`foo-bar`).\n */\nexport function kebabCase(input, options) {\n return noCase(input, { delimiter: \"-\", ...options });\n}\n/**\n * Convert a string to path case (`foo/bar`).\n */\nexport function pathCase(input, options) {\n return noCase(input, { delimiter: \"/\", ...options });\n}\n/**\n * Convert a string to path case (`Foo bar`).\n */\nexport function sentenceCase(input, options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = capitalCaseTransformFactory(lower, upper);\n return (prefix +\n words\n .map((word, index) => {\n if (index === 0)\n return transform(word);\n return lower(word);\n })\n .join(options?.delimiter ?? \" \") +\n suffix);\n}\n/**\n * Convert a string to snake case (`foo_bar`).\n */\nexport function snakeCase(input, options) {\n return noCase(input, { delimiter: \"_\", ...options });\n}\n/**\n * Convert a string to header case (`Foo-Bar`).\n */\nexport function trainCase(input, options) {\n return capitalCase(input, { delimiter: \"-\", ...options });\n}\nfunction lowerFactory(locale) {\n return locale === false\n ? (input) => input.toLowerCase()\n : (input) => input.toLocaleLowerCase(locale);\n}\nfunction upperFactory(locale) {\n return locale === false\n ? (input) => input.toUpperCase()\n : (input) => input.toLocaleUpperCase(locale);\n}\nfunction capitalCaseTransformFactory(lower, upper) {\n return (word) => `${upper(word[0])}${lower(word.slice(1))}`;\n}\nfunction pascalCaseTransformFactory(lower, upper) {\n return (word, index) => {\n const char0 = word[0];\n const initial = index > 0 && char0 >= \"0\" && char0 <= \"9\" ? \"_\" + char0 : upper(char0);\n return initial + lower(word.slice(1));\n };\n}\nfunction splitPrefixSuffix(input, options = {}) {\n const splitFn = options.split ?? (options.separateNumbers ? splitSeparateNumbers : split);\n const prefixCharacters = options.prefixCharacters ?? DEFAULT_PREFIX_SUFFIX_CHARACTERS;\n const suffixCharacters = options.suffixCharacters ?? DEFAULT_PREFIX_SUFFIX_CHARACTERS;\n let prefixIndex = 0;\n let suffixIndex = input.length;\n while (prefixIndex < input.length) {\n const char = input.charAt(prefixIndex);\n if (!prefixCharacters.includes(char))\n break;\n prefixIndex++;\n }\n while (suffixIndex > prefixIndex) {\n const index = suffixIndex - 1;\n const char = input.charAt(index);\n if (!suffixCharacters.includes(char))\n break;\n suffixIndex = index;\n }\n return [\n input.slice(0, prefixIndex),\n splitFn(input.slice(prefixIndex, suffixIndex)),\n input.slice(suffixIndex),\n ];\n}\n//# sourceMappingURL=index.js.map","/**\n * Abstract base class for all adapters.\n *\n * An adapter translates store operations (findRecord, createRecord, …) into\n * concrete network requests and returns raw payloads that the serializer layer\n * then normalises. Concrete subclasses (`RestAdapter`, `ODataAdapter`, …)\n * override the abstract CRUD methods and may also override the URL-building\n * helpers to produce protocol-specific URLs.\n *\n * URL construction follows an Ember Data–style pipeline:\n * `buildURL` → `urlForFindRecord` / `urlForQuery` / … → `_composeURL`\n *\n * Configuration surface:\n * - `host` – base URL prefix (e.g. `https://api.example.com`)\n * - `namespace` – path segment appended after the host (e.g. `v2`)\n * - `headers` – headers merged into every request\n * - `coalesceFindRequests` – when `true` the store batches separate\n * `findRecord` calls into a single `findMany` call\n */\n\nimport pluralize from 'pluralize';\nimport { kebabCase } from 'change-case';\n\n/** Union of all operation names the store can issue to an adapter. */\nexport type AdapterRequestType =\n | 'findRecord'\n | 'findAll'\n | 'findMany'\n | 'query'\n | 'queryRecord'\n | 'createRecord'\n | 'updateRecord'\n | 'deleteRecord';\n\n/**\n * A frozen view of a model record passed to the adapter.\n * Adapters read but do not mutate snapshots.\n */\nexport interface AdapterSnapshot {\n /** The record's server-assigned id, or `null` for new records. */\n id: string | null;\n /** The model's registered `modelName`. */\n modelName: string;\n /** Returns the current value for an attribute key. */\n attr(key: string): unknown;\n /** Returns the `belongsTo` relationship value (or just its id when `{ id: true }`). */\n belongsTo(key: string, options?: { id: boolean }): unknown;\n /** Returns the `hasMany` relationship values (or just ids when `{ ids: true }`). */\n hasMany(key: string, options?: { ids: boolean }): unknown;\n /** Returns `{ [key]: [oldValue, newValue] }` for attributes that differ from the server state. */\n changedAttributes(): Record<string, [unknown, unknown]>;\n /** Reference to the live record instance. */\n record: unknown;\n}\n\nexport abstract class Adapter {\n /** Base URL prepended to every generated URL. Empty string = relative URLs. */\n namespace: string = '';\n /** Host prefix, e.g. `https://api.example.com`. */\n host: string = '';\n /** Extra headers merged into every request via `defaultHeaders()`. */\n headers: Record<string, string> = {};\n /**\n * When `true` the store will coalesce multiple `findRecord` calls for the\n * same model type into a single `findMany` network request.\n */\n coalesceFindRequests: boolean = false;\n\n /** Fetches a single record by id. */\n abstract findRecord(\n store: unknown,\n modelName: string,\n id: string,\n snapshot: AdapterSnapshot,\n options?: { include?: string },\n ): Promise<unknown>;\n\n /** Fetches all records of a given model type. */\n abstract findAll(\n store: unknown,\n modelName: string,\n sinceToken: string | null,\n snapshotArray: AdapterSnapshot[],\n options?: { include?: string },\n ): Promise<unknown>;\n\n /** Fetches multiple records by id in a single request. */\n abstract findMany(\n store: unknown,\n modelName: string,\n ids: string[],\n snapshots: AdapterSnapshot[],\n ): Promise<unknown>;\n\n /** Executes an arbitrary server-side query, returning an array of records. */\n abstract query(\n store: unknown,\n modelName: string,\n query: Record<string, unknown>,\n ): Promise<unknown>;\n\n /** Like `query` but returns at most one record. */\n abstract queryRecord(\n store: unknown,\n modelName: string,\n query: Record<string, unknown>,\n ): Promise<unknown>;\n\n /** Persists a new record to the server (POST). */\n abstract createRecord(\n store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown>;\n\n /** Persists all attributes of an existing record (PUT). */\n abstract updateRecord(\n store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown>;\n\n /**\n * Persists only the changed attributes of an existing record (PATCH).\n * Default implementation delegates to `updateRecord`.\n * Override in subclasses to send a partial payload via HTTP PATCH.\n */\n patchRecord(\n store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n return this.updateRecord(store, modelName, snapshot);\n }\n\n /** Removes a record from the server (DELETE). */\n abstract deleteRecord(\n store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown>;\n\n /**\n * Returns the URL path segment for a given model name.\n * Default: dasherized, pluralized form — e.g. `userPost` → `user-posts`.\n */\n pathForType(modelName: string): string {\n return pluralize.plural(kebabCase(modelName));\n }\n\n /**\n * Assembles a full URL from `host`, `namespace`, and the supplied `path`.\n * Returns an absolute URL when `host` is set, otherwise a root-relative path.\n */\n protected _composeURL(path: string): string {\n const ns = this.namespace.replace(/^\\/+|\\/+$/g, '');\n const hostPrefix = this.host ? this.host.replace(/\\/+$/, '') : '';\n const parts: string[] = [];\n if (hostPrefix) {\n parts.push(hostPrefix);\n }\n if (ns) {\n parts.push(ns);\n }\n parts.push(path);\n if (hostPrefix) {\n return parts.join('/');\n }\n return `/${parts.filter(Boolean).join('/')}`;\n }\n\n /**\n * Dispatches to the appropriate `urlFor*` method based on `requestType`.\n *\n * @param modelName - Registered model name.\n * @param id - Record id(s), or `null` for collection requests.\n * @param snapshot - Snapshot(s) for the request.\n * @param requestType - Operation being performed.\n * @param query - Query parameters (used for `query` / `queryRecord`).\n */\n buildURL(\n modelName: string,\n id: string | string[] | null,\n snapshot: AdapterSnapshot | AdapterSnapshot[] | null,\n requestType: AdapterRequestType,\n query: Record<string, unknown> = {},\n ): string {\n switch (requestType) {\n case 'findRecord':\n return this.urlForFindRecord(id as string, modelName, snapshot as AdapterSnapshot);\n case 'findAll':\n return this.urlForFindAll(modelName, (snapshot as AdapterSnapshot[]) ?? []);\n case 'findMany':\n return this.urlForFindMany(\n (id as string[]) ?? [],\n modelName,\n (snapshot as AdapterSnapshot[]) ?? [],\n );\n case 'query':\n return this.urlForQuery(query, modelName);\n case 'queryRecord':\n return this.urlForQueryRecord(query, modelName);\n case 'createRecord':\n return this.urlForCreateRecord(modelName, snapshot as AdapterSnapshot);\n case 'updateRecord':\n return this.urlForUpdateRecord(\n id as string,\n modelName,\n snapshot as AdapterSnapshot,\n );\n case 'deleteRecord':\n return this.urlForDeleteRecord(\n id as string,\n modelName,\n snapshot as AdapterSnapshot,\n );\n }\n }\n\n /** URL for a `findRecord` request. Default: `<collection>/<id>`. */\n urlForFindRecord(id: string, modelName: string, _snapshot: AdapterSnapshot): string {\n return this._composeURL(`${this.pathForType(modelName)}/${encodeURIComponent(id)}`);\n }\n\n /** URL for a `findAll` request. Default: `<collection>`. */\n urlForFindAll(modelName: string, _snapshots: AdapterSnapshot[]): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for a `findMany` request. Default: `<collection>` (ids appended by the adapter). */\n urlForFindMany(\n _ids: string[],\n modelName: string,\n _snapshots: AdapterSnapshot[],\n ): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for a `query` request. Default: `<collection>`. */\n urlForQuery(_query: Record<string, unknown>, modelName: string): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for a `queryRecord` request. Default: `<collection>`. */\n urlForQueryRecord(_query: Record<string, unknown>, modelName: string): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for a `createRecord` request. Default: `<collection>`. */\n urlForCreateRecord(modelName: string, _snapshot: AdapterSnapshot): string {\n return this._composeURL(this.pathForType(modelName));\n }\n\n /** URL for an `updateRecord` request. Default: `<collection>/<id>`. */\n urlForUpdateRecord(\n id: string,\n modelName: string,\n _snapshot: AdapterSnapshot,\n ): string {\n return this._composeURL(`${this.pathForType(modelName)}/${encodeURIComponent(id)}`);\n }\n\n /** URL for a `deleteRecord` request. Default: `<collection>/<id>`. */\n urlForDeleteRecord(\n id: string,\n modelName: string,\n _snapshot: AdapterSnapshot,\n ): string {\n return this._composeURL(`${this.pathForType(modelName)}/${encodeURIComponent(id)}`);\n }\n\n /**\n * Groups snapshots into batches for `findMany`.\n * Default implementation puts all snapshots in a single batch.\n */\n groupRecordsForFindMany(\n _store: unknown,\n snapshots: AdapterSnapshot[],\n ): AdapterSnapshot[][] {\n return [snapshots];\n }\n\n /**\n * Returns `true` when the store should bypass the cache and reload this\n * record immediately. Default: always `false`.\n */\n shouldReloadRecord(_store: unknown, _snapshot: AdapterSnapshot): boolean {\n return false;\n }\n\n /**\n * Returns `true` when the store should schedule a background reload for\n * this record after returning the cached version. Default: always `true`.\n */\n shouldBackgroundReloadRecord(\n _store: unknown,\n _snapshot: AdapterSnapshot,\n ): boolean {\n return true;\n }\n\n /**\n * Returns `true` when the store should reload the full collection on every\n * `findAll` call. Default: always `false`.\n */\n shouldReloadAll(_store: unknown, _snapshotRecordArray: AdapterSnapshot[]): boolean {\n return false;\n }\n\n /**\n * Returns `true` when the store should schedule a background reload after\n * returning a cached collection. Default: always `true`.\n */\n shouldBackgroundReloadAll(\n _store: unknown,\n _snapshotRecordArray: AdapterSnapshot[],\n ): boolean {\n return true;\n }\n}\n","/**\n * HTTP/REST adapter that communicates with a JSON REST API.\n *\n * `RestAdapter` is the default concrete adapter. It uses the Fetch API and\n * maps each store operation to a conventional HTTP verb:\n *\n * | Operation | Method |\n * |----------------|--------|\n * | findRecord | GET |\n * | findAll | GET |\n * | findMany | GET |\n * | query | GET |\n * | queryRecord | GET |\n * | createRecord | POST |\n * | updateRecord | PUT |\n * | deleteRecord | DELETE |\n *\n * Subclasses (e.g. `JsonApiAdapter`, `ODataAdapter`) override individual\n * methods to adjust headers, HTTP verbs, or body serialization without\n * reimplementing the full adapter.\n */\n\nimport { injectable } from 'tsyringe';\nimport { Adapter, type AdapterSnapshot } from './Adapter.js';\nimport { attachResponseHeaders } from '../cache/cache-utils.js';\n\n@injectable()\nexport class RestAdapter extends Adapter {\n static serializeSnapshotToObject(\n snapshot: AdapterSnapshot,\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n const record = snapshot.record as { _data?: Record<string, unknown> };\n const data = record._data;\n if (data) {\n for (const [key, value] of Object.entries(data)) {\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n continue;\n }\n body[key] = value;\n }\n }\n return body;\n }\n\n static toQueryString(query: Record<string, unknown>): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) {\n continue;\n }\n parts.push(\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`,\n );\n }\n return parts.length > 0 ? `?${parts.join('&')}` : '';\n }\n\n /** Headers sent with every read (GET) request. */\n defaultHeaders(): Record<string, string> {\n return {\n Accept: 'application/json',\n ...this.headers,\n };\n }\n\n /** Headers sent with every write (POST / PUT / DELETE) request. */\n mutationHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders(),\n };\n }\n\n /**\n * Low-level fetch wrapper used by all operation methods.\n *\n * - Throws an enriched `Error` (with `status` and `body` properties) for\n * any non-2xx response.\n * - Returns `null` for 204 No Content responses.\n * - Attempts JSON parsing; falls back to the raw text string on failure.\n */\n async _fetchJSON(\n url: string,\n init: RequestInit,\n ): Promise<unknown> {\n const response = await fetch(url, init);\n if (!response.ok) {\n let body: unknown = null;\n try {\n body = await response.json();\n } catch {\n /* ignore */\n }\n const error = Object.assign(\n new Error(`Request failed: ${response.status}`),\n { status: response.status, body },\n );\n throw error;\n }\n if (response.status === 204) {\n return null;\n }\n const text = await response.text();\n if (!text) {\n return null;\n }\n let result: unknown;\n try {\n result = JSON.parse(text);\n } catch {\n result = text;\n }\n if (result !== null && typeof result === 'object') {\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n attachResponseHeaders(result, headers);\n }\n return result;\n }\n\n override async findRecord(\n _store: unknown,\n modelName: string,\n id: string,\n snapshot: AdapterSnapshot,\n options?: { include?: string },\n ): Promise<unknown> {\n let url = this.buildURL(modelName, id, snapshot, 'findRecord');\n if (options?.include) {\n url += `${url.includes('?') ? '&' : '?'}include=${encodeURIComponent(options.include)}`;\n }\n return this._fetchJSON(url, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n override async findAll(\n _store: unknown,\n modelName: string,\n _sinceToken: string | null,\n snapshotArray: AdapterSnapshot[],\n options?: { include?: string },\n ): Promise<unknown> {\n let url = this.buildURL(modelName, null, snapshotArray, 'findAll');\n if (options?.include) {\n url += `${url.includes('?') ? '&' : '?'}include=${encodeURIComponent(options.include)}`;\n }\n return this._fetchJSON(url, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n /**\n * Fetches multiple records by appending an `ids` query parameter.\n * e.g. `/posts?ids=1,2,3`\n */\n override async findMany(\n _store: unknown,\n modelName: string,\n ids: string[],\n snapshots: AdapterSnapshot[],\n ): Promise<unknown> {\n const url = this.buildURL(modelName, ids, snapshots, 'findMany');\n const separator = url.includes('?') ? '&' : '?';\n const fullUrl = `${url}${separator}ids=${ids.map(encodeURIComponent).join(',')}`;\n return this._fetchJSON(fullUrl, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n override async query(\n _store: unknown,\n modelName: string,\n query: Record<string, unknown>,\n ): Promise<unknown> {\n const base = this.buildURL(modelName, null, null, 'query', query);\n const url = `${base}${RestAdapter.toQueryString(query)}`;\n return this._fetchJSON(url, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n override async queryRecord(\n _store: unknown,\n modelName: string,\n query: Record<string, unknown>,\n ): Promise<unknown> {\n const base = this.buildURL(modelName, null, null, 'queryRecord', query);\n const url = `${base}${RestAdapter.toQueryString(query)}`;\n return this._fetchJSON(url, {\n method: 'GET',\n headers: this.defaultHeaders(),\n });\n }\n\n override async createRecord(\n _store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n const url = this.buildURL(modelName, null, snapshot, 'createRecord');\n return this._fetchJSON(url, {\n method: 'POST',\n headers: this.mutationHeaders(),\n body: JSON.stringify(RestAdapter.serializeSnapshotToObject(snapshot)),\n });\n }\n\n override async updateRecord(\n _store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n const url = this.buildURL(modelName, snapshot.id, snapshot, 'updateRecord');\n return this._fetchJSON(url, {\n method: 'PUT',\n headers: this.mutationHeaders(),\n body: JSON.stringify(RestAdapter.serializeSnapshotToObject(snapshot)),\n });\n }\n\n override async patchRecord(\n _store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n const url = this.buildURL(modelName, snapshot.id, snapshot, 'updateRecord');\n const changed = snapshot.changedAttributes();\n const partial: Record<string, unknown> = {};\n for (const [key, [, current]] of Object.entries(changed)) {\n partial[key] = current;\n }\n return this._fetchJSON(url, {\n method: 'PATCH',\n headers: this.mutationHeaders(),\n body: JSON.stringify(partial),\n });\n }\n\n override async deleteRecord(\n _store: unknown,\n modelName: string,\n snapshot: AdapterSnapshot,\n ): Promise<unknown> {\n const url = this.buildURL(modelName, snapshot.id, snapshot, 'deleteRecord');\n return this._fetchJSON(url, {\n method: 'DELETE',\n headers: this.defaultHeaders(),\n });\n }\n}\n"],"names":["SPLIT_LOWER_UPPER_RE","SPLIT_UPPER_UPPER_RE","SPLIT_SEPARATE_NUMBER_RE","DEFAULT_STRIP_REGEXP","SPLIT_REPLACE_VALUE","DEFAULT_PREFIX_SUFFIX_CHARACTERS","split","value","result","start","end","splitSeparateNumbers","words","i","word","match","offset","noCase","input","options","prefix","suffix","splitPrefixSuffix","lowerFactory","pascalCase","lower","upper","upperFactory","transform","pascalCaseTransformFactory","kebabCase","locale","index","char0","splitFn","prefixCharacters","suffixCharacters","prefixIndex","suffixIndex","char","Adapter","store","modelName","snapshot","pluralize","path","ns","hostPrefix","parts","id","requestType","query","_snapshot","_snapshots","_ids","_query","_store","snapshots","_snapshotRecordArray","RestAdapter","body","data","key","url","init","response","text","headers","attachResponseHeaders","_sinceToken","snapshotArray","ids","separator","fullUrl","changed","partial","current","__decorateClass","injectable"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const k=require("tsyringe"),c=require("mobx"),m=require("./SchemaService-Di_yjVzU.cjs"),y=require("./relationships-B55LBaCW.cjs"),R=require("./cache-utils-2lswvJ87.cjs");class A{constructor(){this._buckets=new Map,c.makeObservable(this,{_buckets:c.observable.shallow,set:c.action,delete:c.action,clear:c.action})}bucket(t,e=!1){let s=this._buckets.get(t);return!s&&e&&(s=c.observable.map({},{deep:!1}),this._buckets.set(t,s)),s}set(t,e,s){this.bucket(t,!0).set(e,s)}get(t,e){var s;return((s=this.bucket(t))==null?void 0:s.get(e))??null}has(t,e){var s;return((s=this.bucket(t))==null?void 0:s.has(e))??!1}delete(t,e){var s;return((s=this.bucket(t))==null?void 0:s.delete(e))??!1}all(t){const e=this.bucket(t);return e?Array.from(e.values()):[]}clear(t){var e;if(t)(e=this.bucket(t))==null||e.clear();else for(const s of this._buckets.values())s.clear()}size(t){var s;if(t)return((s=this.bucket(t))==null?void 0:s.size)??0;let e=0;for(const i of this._buckets.values())e+=i.size;return e}}class g{constructor(t){this.updating=!1,this.opts=t,c.makeObservable(this,{resolved:t.keepAlive?c.computed({keepAlive:!0}):c.computed,updating:c.observable,length:c.computed,modelName:c.computed})}get resolved(){return this.opts.source()}get isLoading(){return this.updating}get isUpdating(){return this.updating}get length(){return this.resolved.length}get modelName(){return this.opts.modelName}at(t){return this.resolved[t]}toArray(){return[...this.resolved]}map(t){return this.resolved.map(t)}filter(t){return this.resolved.filter(t)}forEach(t){this.resolved.forEach(t)}includes(t){return this.resolved.includes(t)}async update(){if(!this.opts.update)return this;this.updating=!0;try{await this.opts.update()}finally{this.updating=!1}return this}[Symbol.iterator](){return this.resolved[Symbol.iterator]()}}class v extends g{constructor(t){super(t),this.queryParams=t.query,this.metaData=t.meta??{},this.linksData=t.links??{},c.makeObservable(this,{metaData:c.observable.ref,linksData:c.observable.ref,meta:c.computed,links:c.computed,query:c.computed})}get meta(){return this.metaData}get links(){return this.linksData}get query(){return this.queryParams}_setMeta(t){this.metaData=t}_setLinks(t){this.linksData=t}}var M=Object.getOwnPropertyDescriptor,F=(p,t,e,s)=>{for(var i=s>1?void 0:s?M(t,e):t,n=p.length-1,r;n>=0;n--)(r=p[n])&&(i=r(i)||i);return i},z=(p,t)=>(e,s)=>t(e,s,p);exports.Store=class{constructor(t){this.identityMap=new A,this.adapters=new Map,this.serializers=new Map,this.newRecords=new Map,this.newRecordTypes=new WeakMap,this.relationshipCache=new WeakMap,this.pendingMembers=new WeakMap,this._cache=null,this.coalescePending=new Map,this.coalesceScheduled=new Set,this.schema=t}static refEquals(t,e){return t.id===e.id&&t.type===e.type}registerAdapter(t,e){this.adapters.set(t,e)}registerSerializer(t,e){this.serializers.set(t,e)}registerCache(t){this._cache=t}adapterFor(t){const e=this.adapters.get(t)??this.adapters.get("application");if(!e)throw new Error(`No adapter registered for "${t}"`);return e}serializerFor(t){const e=this.serializers.get(t)??this.serializers.get("application");if(!e)throw new Error(`No serializer registered for "${t}"`);return e}createRecord(t,e={}){if(!this.schema.doesTypeExist(t))throw new Error(`Unknown model type: "${t}"`);const s=this.schema.modelFor(t),i=new s({id:null,data:e,store:this});return this.trackNewRecord(t,i),i}trackNewRecord(t,e){let s=this.newRecords.get(t);s||(s=new Set,this.newRecords.set(t,s)),s.add(e),this.newRecordTypes.set(e,t)}untrackNewRecord(t){var s;const e=this.newRecordTypes.get(t);e&&((s=this.newRecords.get(e))==null||s.delete(t),this.newRecordTypes.delete(t))}peekRecord(t,e){const s=e==null?null:String(e);return s===null?null:this.identityMap.get(t,s)??null}peekAll(t){return new g({modelName:t,source:()=>{const e=this.identityMap.all(t),s=this.newRecords.get(t);return!s||s.size===0?e:[...e,...s]}})}push(t){const e=t;if(e.included)for(const s of e.included)this.pushResource(s);return e.data===null||e.data===void 0?null:Array.isArray(e.data)?e.data.map(s=>this.pushResource(s)):this.pushResource(e.data)}pushPayload(t,e){let s,i;typeof t=="string"?(s=t,i=e):(s=null,i=t);const n=s?this.serializerFor(s).normalizeResponse(this,this.schema.modelFor(s),i,null,"pushPayload"):i;this.push(n)}normalize(t,e){return this.serializerFor(t).normalizeResponse(this,this.schema.modelFor(t),e,null,"normalize")}pushResource(t){const{type:e,id:s}=t;if(!this.schema.doesTypeExist(e))throw new Error(`Unknown model type: "${e}"`);if(s===null)throw new Error(`Cannot push a resource of type "${e}" without an id`);const i=this.identityMap.get(e,s);if(i)return c.runInAction(()=>{i._applyServerData(null,t.attributes??{},t.relationships)}),this.trackInverseForResource(i,t),i;const n=this.schema.modelFor(e),r=y.Model.push.call(n,{id:s,data:t.attributes??{},relationships:t.relationships,store:this});return this.identityMap.set(e,s,r),this.trackInverseForResource(r,t),r}trackInverseForResource(t,e){if(e.relationships)for(const[s,i]of Object.entries(e.relationships)){const n=this.schema.relationshipsDefinitionFor(t.modelName).get(s);if(!n||!n.options.inverse||!i.data)continue;const r=Array.isArray(i.data)?i.data:[i.data];for(const o of r)this.addInverse(o.type,o.id,n.options.inverse,t)}}addInverse(t,e,s,i){const n=this.identityMap.get(t,e);if(!n)return;const o=this.schema.relationshipsDefinitionFor(t).get(s);if(!o)return;const a=n._getRelationshipRef(s),h={type:i.modelName,id:i.id};c.runInAction(()=>{if(o.kind==="hasMany"){const l=a!=null&&a.data&&Array.isArray(a.data)?a.data:[];l.some(u=>exports.Store.refEquals(u,h))||n._setRelationshipRef(s,{data:[...l,h]})}else n._setRelationshipRef(s,{data:h})})}removeInverse(t,e,s,i){const n=this.identityMap.get(t,e);if(!n)return;const o=this.schema.relationshipsDefinitionFor(t).get(s);if(!o)return;const a=n._getRelationshipRef(s);c.runInAction(()=>{if(o.kind==="hasMany"){const l=(a!=null&&a.data&&Array.isArray(a.data)?a.data:[]).filter(u=>!(u.id===i.id&&u.type===i.modelName));n._setRelationshipRef(s,{data:l})}else n._setRelationshipRef(s,{data:null})})}unloadRecord(t){t.id!==null&&this.identityMap.delete(t.modelName,t.id),this.untrackNewRecord(t),this.relationshipCache.delete(t)}unloadAll(t){var e;if(t){for(const s of this.identityMap.all(t))this.relationshipCache.delete(s);this.identityMap.clear(t),(e=this.newRecords.get(t))==null||e.clear()}else this.identityMap.clear(),this.newRecords.clear()}async findRecord(t,e,s={}){const i=this.peekRecord(t,e);if(i&&!s.reload&&!s.include)return i;if(!s.reload&&!s.include&&this._cache){const d=await this._cache.get(t,e);if(d)return this.push({data:{type:d.modelName,id:d.id,attributes:d.attributes,relationships:d.relationships}})}const n=this.adapterFor(t);if(n.coalesceFindRequests&&n.findMany&&!s.include)return this.scheduleCoalescedFind(t,e);const r=i?this.createSnapshot(i):this.createEmptySnapshot(t,e),o=s.include?{include:s.include,adapterOptions:s.adapterOptions}:s.adapterOptions?{adapterOptions:s.adapterOptions}:void 0,a=await n.findRecord(this,t,e,r,o),h=R.extractResponseHeaders(a),l=this.serializerFor(t).normalizeResponse(this,this.schema.modelFor(t),a,e,"findRecord"),u=this.push(l);if(this._cache){const d=h?R.parseCacheTTLFromHeaders(h):void 0;d!==0&&this.cacheNormalizedDocument(l,d)}return u}async findAll(t,e={}){const s=this.adapterFor(t),i=e.include?{include:e.include,adapterOptions:e.adapterOptions}:e.adapterOptions?{adapterOptions:e.adapterOptions}:void 0,n=await s.findAll(this,t,null,[],i),r=R.extractResponseHeaders(n),o=this.serializerFor(t).normalizeResponse(this,this.schema.modelFor(t),n,null,"findAll");if(this.push(o),this._cache){const a=r?R.parseCacheTTLFromHeaders(r):void 0;a!==0&&this.cacheNormalizedDocument(o,a)}return this.peekAll(t)}async query(t,e){const s=[],i=new v({modelName:t,query:e,source:()=>s.map(n=>this.peekRecord(t,n)).filter(n=>n!==null),update:async()=>{await this.runQuery(t,e,i,s)}});return await this.runQuery(t,e,i,s),i}async runQuery(t,e,s,i){const r=await this.adapterFor(t).query(this,t,e,s),o=this.serializerFor(t).normalizeResponse(this,this.schema.modelFor(t),r,null,"query");if(this.push(o),i.length=0,Array.isArray(o.data))for(const a of o.data)a.id&&i.push(a.id);o.meta&&s._setMeta(o.meta),o.links&&s._setLinks(o.links)}async queryRecord(t,e){const i=await this.adapterFor(t).queryRecord(this,t,e),n=this.serializerFor(t).normalizeResponse(this,this.schema.modelFor(t),i,null,"queryRecord"),r=this.push(n);return Array.isArray(r)?r[0]??null:r??null}async saveRecord(t,e={}){const s=this.adapterFor(t.modelName),i=this.createSnapshot(t),{isNew:n}=t;let r;n?r=await s.createRecord(this,t.modelName,i):e.patch&&s.patchRecord?r=await s.patchRecord(this,t.modelName,i):r=await s.updateRecord(this,t.modelName,i);const o=this.serializerFor(t.modelName).normalizeResponse(this,this.schema.modelFor(t.modelName),r,t.id,n?"createRecord":"updateRecord"),a=o.data;if(a){const h=a.id??t.id;c.runInAction(()=>{t._applyServerData(h,a.attributes??{},a.relationships)}),n&&h&&(this.untrackNewRecord(t),this.identityMap.set(t.modelName,h,t))}if(o.included)for(const h of o.included)this.pushResource(h);if(this._cache&&t.id){const h=t,l={};for(const[u,d]of h._relationships)l[u]=d;this._cache.set(t.modelName,t.id,{...h._data},{relationships:Object.keys(l).length>0?l:void 0})}return t}async deleteRecord(t){const e=this.adapterFor(t.modelName),s=this.createSnapshot(t);return await e.deleteRecord(this,t.modelName,s),this._cache&&t.id&&this._cache.invalidate(t.modelName,t.id),this.unloadRecord(t),t}async reloadRecord(t){if(!t.id)throw new Error("Cannot reload a record without an id");const e=this.adapterFor(t.modelName),s=this.createSnapshot(t),i=await e.findRecord(this,t.modelName,t.id,s),n=this.serializerFor(t.modelName).normalizeResponse(this,this.schema.modelFor(t.modelName),i,t.id,"findRecord");return this.push(n),t}createSnapshot(t){const{modelName:e}=t,s=this.schema.attributesDefinitionFor(e),i=this.schema.relationshipsDefinitionFor(e),n=t;return{id:t.id,modelName:e,record:t,attr:r=>n._data[r],belongsTo:(r,o)=>{const a=n._getRelationshipRef(r);return!(a!=null&&a.data)||Array.isArray(a.data)?null:o!=null&&o.id?a.data.id:this.peekRecord(a.data.type,a.data.id)},hasMany:(r,o)=>{const a=n._getRelationshipRef(r),h=a!=null&&a.data&&Array.isArray(a.data)?a.data:[];return o!=null&&o.ids?h.map(l=>l.id):h.map(l=>this.peekRecord(l.type,l.id)).filter(l=>l!==null)},changedAttributes:()=>n.changedAttributes(),eachAttribute:r=>{for(const[o,a]of s)r(o,a)},eachRelationship:r=>{for(const[o,a]of i)r(o,a)}}}createEmptySnapshot(t,e){const s=this.schema.attributesDefinitionFor(t),i=this.schema.relationshipsDefinitionFor(t);return{id:e,modelName:t,record:null,attr:()=>{},belongsTo:()=>null,hasMany:()=>[],changedAttributes:()=>({}),eachAttribute:n=>{for(const[r,o]of s)n(r,o)},eachRelationship:n=>{for(const[r,o]of i)n(r,o)}}}getRelationshipCache(t,e){var s;return(s=this.relationshipCache.get(t))==null?void 0:s.get(e)}setRelationshipCache(t,e,s){let i=this.relationshipCache.get(t);i||(i=new Map,this.relationshipCache.set(t,i)),i.set(e,s)}resolveRelationship(t,e,s){const i=s.options.async===!0,n=this.getRelationshipCache(t,e);if(n)return n;const r={parent:t,name:e,meta:s,store:this};if(i){if(s.kind==="belongsTo"){const h=new y.AsyncBelongsTo(r);return this.setRelationshipCache(t,e,h),h}const a=new y.AsyncHasMany(r);return this.setRelationshipCache(t,e,a),a}if(s.kind==="belongsTo"){const a=t._getRelationshipRef(e);return!(a!=null&&a.data)||Array.isArray(a.data)?null:this.peekRecord(a.data.type,a.data.id)}const o=new y.ManyArray(r);return this.setRelationshipCache(t,e,o),o}setRelationshipValue(t,e,s,i){if(s.kind!=="belongsTo")return;const n=t._getRelationshipRef(e),r=n!=null&&n.data&&!Array.isArray(n.data)?n.data:null;if(i==null){c.runInAction(()=>{t._setRelationshipRef(e,{data:null})}),r&&s.options.inverse&&this.removeInverse(r.type,r.id,s.options.inverse,t);return}const o=i,a={type:o.modelName,id:o.id};c.runInAction(()=>{t._setRelationshipRef(e,{data:a})}),s.options.inverse&&(r&&!exports.Store.refEquals(r,a)&&this.removeInverse(r.type,r.id,s.options.inverse,t),this.addInverse(a.type,a.id,s.options.inverse,t))}_getRelationshipRefFor(t,e){return t._getRelationshipRef(e)}_getPendingMembers(t,e){var s;return((s=this.pendingMembers.get(t))==null?void 0:s.get(e))??[]}addPendingMember(t,e,s){let i=this.pendingMembers.get(t);i||(i=new Map,this.pendingMembers.set(t,i));let n=i.get(e);n||(n=c.observable.set(),i.set(e,n)),n.add(s)}removePendingMember(t,e,s){var i,n;(n=(i=this.pendingMembers.get(t))==null?void 0:i.get(e))==null||n.delete(s)}_hasManyAppend(t,e,s,i){if(i.id===null){if(this.addPendingMember(t,e,i),s.options.inverse){const a=this.schema.relationshipsDefinitionFor(i.modelName).get(s.options.inverse);(a==null?void 0:a.kind)==="belongsTo"&&c.runInAction(()=>{i._setRelationshipRef(s.options.inverse,{data:{type:t.modelName,id:t.id}})})}return}const n=this._getRelationshipRefFor(t,e),r=n!=null&&n.data&&Array.isArray(n.data)?n.data:[],o={type:i.modelName,id:i.id};r.some(a=>exports.Store.refEquals(a,o))||c.runInAction(()=>{t._setRelationshipRef(e,{data:[...r,o]})}),s.options.inverse&&this.addInverse(i.modelName,i.id,s.options.inverse,t)}_hasManyRemove(t,e,s,i){if(i.id===null){this.removePendingMember(t,e,i);return}const n=this._getRelationshipRefFor(t,e),o=(n!=null&&n.data&&Array.isArray(n.data)?n.data:[]).filter(a=>!(a.id===i.id&&a.type===i.modelName));c.runInAction(()=>{t._setRelationshipRef(e,{data:o})}),s.options.inverse&&this.removeInverse(i.modelName,i.id,s.options.inverse,t)}cacheNormalizedDocument(t,e){if(!this._cache)return;const s=[];t.data&&(Array.isArray(t.data)?s.push(...t.data):s.push(t.data)),t.included&&s.push(...t.included);for(const i of s)i.id&&this._cache.set(i.type,i.id,i.attributes??{},{relationships:i.relationships,ttl:e})}scheduleCoalescedFind(t,e){return new Promise((s,i)=>{let n=this.coalescePending.get(t);n||(n=new Map,this.coalescePending.set(t,n));let r=n.get(e);r||(r=[],n.set(e,r)),r.push({resolve:s,reject:i}),this.coalesceScheduled.has(t)||(this.coalesceScheduled.add(t),queueMicrotask(()=>this.flushCoalescedFind(t)))})}async flushCoalescedFind(t){this.coalesceScheduled.delete(t);const e=this.coalescePending.get(t);if(!e||e.size===0)return;const s=new Map(e);e.clear();const i=Array.from(s.keys()),n=this.adapterFor(t);try{const r=i.map(h=>{const l=this.peekRecord(t,h);return l?this.createSnapshot(l):this.createEmptySnapshot(t,h)}),o=await n.findMany(this,t,i,r),a=this.serializerFor(t).normalizeResponse(this,this.schema.modelFor(t),o,null,"findMany");this.push(a);for(const h of i){const l=this.peekRecord(t,h),u=s.get(h);if(u)for(const d of u)l?d.resolve(l):d.reject(new Error(`Record not found after findMany: ${t}:${h}`))}}catch(r){for(const o of s.values())for(const a of o)a.reject(r)}}liveQuery(t,e){return new g({modelName:t,keepAlive:!0,source:()=>{const s=this.identityMap.all(t),i=this.newRecords.get(t);return(i&&i.size>0?[...s,...i]:s).filter(e)}})}async optimisticUpdate(t,e,s){const i=t,n={...i._data};c.runInAction(()=>{Object.assign(i._data,e)});try{return await s(),t}catch(r){throw c.runInAction(()=>{for(const[o,a]of Object.entries(n))i._data[o]=a}),r}}runInTransaction(t){c.runInAction(t)}serialize(t={}){var i;const e={},s=this.identityMap._buckets;for(const[n,r]of s){const o=(i=t.exclude)==null?void 0:i[n],a=[];for(const[h,l]of r){const u=l;let d;if(o&&o.length>0){d={};for(const[f,w]of Object.entries(u._data))o.includes(f)||(d[f]=w)}else d={...u._data};const b={id:h,attributes:d};if(u._relationships&&u._relationships.size>0){const f={};for(const[w,_]of u._relationships)f[w]=_;b.relationships=f}a.push(b)}a.length>0&&(e[n]=a)}return{records:e}}hydrate(t){c.runInAction(()=>{for(const[e,s]of Object.entries(t.records))for(const i of s)this.pushResource({type:e,id:i.id,attributes:i.attributes,relationships:i.relationships})})}static hydrate(t,e){const s=new exports.Store(t);return s.hydrate(e),s}};exports.Store=F([k.singleton(),k.injectable(),z(0,k.inject(m.SchemaService))],exports.Store);exports.AdapterPopulatedRecordArray=v;exports.IdentityMap=A;exports.RecordArray=g;
|
|
2
|
+
//# sourceMappingURL=Store-KvjmBTQ9.cjs.map
|