@makeswift/runtime 0.28.10-canary.1 → 0.28.10-canary.3
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/cjs/api/graphql/documents/queries.js +0 -28
- package/dist/cjs/api/graphql/documents/queries.js.map +1 -1
- package/dist/cjs/api/graphql/generated/types.js.map +1 -1
- package/dist/cjs/api/graphql-api-client.js +1 -11
- package/dist/cjs/api/graphql-api-client.js.map +1 -1
- package/dist/cjs/api/makeswift-api-resources-client.js +1 -1
- package/dist/cjs/api/makeswift-api-resources-client.js.map +1 -1
- package/dist/cjs/api/rest-api-client.js +14 -1
- package/dist/cjs/api/rest-api-client.js.map +1 -1
- package/dist/cjs/api/table-record-client.js +47 -0
- package/dist/cjs/api/table-record-client.js.map +1 -0
- package/dist/cjs/api-handler/handlers/manifest.js +1 -1
- package/dist/cjs/api-handler/handlers/table-record.js +63 -0
- package/dist/cjs/api-handler/handlers/table-record.js.map +1 -0
- package/dist/cjs/api-handler/index.js +3 -0
- package/dist/cjs/api-handler/index.js.map +1 -1
- package/dist/cjs/client/index.js +17 -2
- package/dist/cjs/client/index.js.map +1 -1
- package/dist/cjs/components/builtin/Form/Form.js +2 -2
- package/dist/cjs/components/builtin/Form/Form.js.map +1 -1
- package/dist/cjs/runtimes/react/hooks/{use-graphql-api-client.js → use-table-record-client.js} +9 -9
- package/dist/cjs/runtimes/react/hooks/use-table-record-client.js.map +1 -0
- package/dist/esm/api/graphql/documents/queries.js +0 -26
- package/dist/esm/api/graphql/documents/queries.js.map +1 -1
- package/dist/esm/api/graphql/generated/types.js.map +1 -1
- package/dist/esm/api/graphql-api-client.js +2 -17
- package/dist/esm/api/graphql-api-client.js.map +1 -1
- package/dist/esm/api/makeswift-api-resources-client.js +1 -1
- package/dist/esm/api/makeswift-api-resources-client.js.map +1 -1
- package/dist/esm/api/rest-api-client.js +14 -1
- package/dist/esm/api/rest-api-client.js.map +1 -1
- package/dist/esm/api/table-record-client.js +23 -0
- package/dist/esm/api/table-record-client.js.map +1 -0
- package/dist/esm/api-handler/handlers/manifest.js +1 -1
- package/dist/esm/api-handler/handlers/table-record.js +29 -0
- package/dist/esm/api-handler/handlers/table-record.js.map +1 -0
- package/dist/esm/api-handler/index.js +3 -0
- package/dist/esm/api-handler/index.js.map +1 -1
- package/dist/esm/client/index.js +17 -2
- package/dist/esm/client/index.js.map +1 -1
- package/dist/esm/components/builtin/Form/Form.js +2 -2
- package/dist/esm/components/builtin/Form/Form.js.map +1 -1
- package/dist/esm/runtimes/react/hooks/use-table-record-client.js +11 -0
- package/dist/esm/runtimes/react/hooks/use-table-record-client.js.map +1 -0
- package/dist/types/api/graphql/documents/queries.d.ts +0 -2
- package/dist/types/api/graphql/documents/queries.d.ts.map +1 -1
- package/dist/types/api/graphql/generated/types.d.ts +0 -16
- package/dist/types/api/graphql/generated/types.d.ts.map +1 -1
- package/dist/types/api/graphql-api-client.d.ts +1 -3
- package/dist/types/api/graphql-api-client.d.ts.map +1 -1
- package/dist/types/api/rest-api-client.d.ts +2 -1
- package/dist/types/api/rest-api-client.d.ts.map +1 -1
- package/dist/types/api/table-record-client.d.ts +13 -0
- package/dist/types/api/table-record-client.d.ts.map +1 -0
- package/dist/types/api-handler/handlers/table-record.d.ts +6 -0
- package/dist/types/api-handler/handlers/table-record.d.ts.map +1 -0
- package/dist/types/api-handler/index.d.ts +2 -1
- package/dist/types/api-handler/index.d.ts.map +1 -1
- package/dist/types/client/index.d.ts +5 -2
- package/dist/types/client/index.d.ts.map +1 -1
- package/dist/types/next/tests/server.api-handler-table-record.test.d.ts +2 -0
- package/dist/types/next/tests/server.api-handler-table-record.test.d.ts.map +1 -0
- package/dist/types/runtimes/react/hooks/use-table-record-client.d.ts +3 -0
- package/dist/types/runtimes/react/hooks/use-table-record-client.d.ts.map +1 -0
- package/package.json +1 -1
- package/dist/cjs/runtimes/react/hooks/use-graphql-api-client.js.map +0 -1
- package/dist/esm/runtimes/react/hooks/use-graphql-api-client.js +0 -11
- package/dist/esm/runtimes/react/hooks/use-graphql-api-client.js.map +0 -1
- package/dist/types/runtimes/react/hooks/use-graphql-api-client.d.ts +0 -3
- package/dist/types/runtimes/react/hooks/use-graphql-api-client.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/api/makeswift-api-resources-client.ts"],"sourcesContent":["import { type State as ApiClientState } from '../state/api-client/state'\nimport { configureClientStore } from '../state/api-client/client-store'\n\nimport {\n type File,\n type GlobalElement,\n type LocalizedGlobalElement,\n type PagePathnameSlice,\n type Swatch,\n type Table,\n type Typography,\n type HttpFetch,\n} from './types'\n\nimport { ApiResourcesClient } from './api-resources-client'\nimport { type SiteVersion } from './site-version'\n\n// see the comment in `MakeswiftApiResourcesClient` constructor below\nimport { type MakeswiftGraphQLApiClient } from './graphql-api-client'\nimport { type MakeswiftRestAPIClient } from './rest-api-client'\n\n/**\n * Server-side implementation that makes direct authenticated requests to the Makeswift API.\n * Requires an API key.\n *\n * For client-side usage, see `HostApiResourcesClient`, which goes through the host via\n * `/api/makeswift/...` endpoints.\n */\nexport class MakeswiftApiResourcesClient extends ApiResourcesClient {\n private restApiClient: Promise<MakeswiftRestAPIClient>\n private graphQlClient: Promise<MakeswiftGraphQLApiClient>\n\n constructor({\n fetch,\n apiKey,\n apiOrigin,\n graphqlApiEndpoint,\n preloadedState,\n }: {\n fetch: HttpFetch\n apiKey: string\n apiOrigin: string\n graphqlApiEndpoint: string\n preloadedState: Partial<ApiClientState>\n }) {\n super({\n store: configureClientStore({ preloadedState }),\n })\n\n // `MakeswiftApiResourcesClient` is used by the runtime and therefore will be imported\n // on the client; lazy import server-side REST/GraphQL clients to avoid unnecessarily\n // pulling their code into a client bundle.\n //\n // (we can't easily lazy-load `MakeswiftApiResourcesClient` itself, at it will make its\n // construction async, but because it shares most of its implementation with\n // `HostApiResourcesClient`, the overhead of this module on its own is negligible)\n this.restApiClient = (async () => {\n const { MakeswiftRestAPIClient } = await import('./rest-api-client')\n return new MakeswiftRestAPIClient({ fetch, apiKey, apiOrigin })\n })()\n\n this.graphQlClient = (async () => {\n const { MakeswiftGraphQLApiClient } = await import('./graphql-api-client')\n return new MakeswiftGraphQLApiClient({ endpoint: graphqlApiEndpoint })\n })()\n }\n\n protected async fetchSwatchImpl(id: string, version: SiteVersion | null): Promise<Swatch | null> {\n return (await this.restApiClient).getSwatch(id, version)\n }\n\n protected async fetchFileImpl(id: string, _version: SiteVersion | null): Promise<File | null> {\n // files are unversioned\n return (await this.
|
|
1
|
+
{"version":3,"sources":["../../../src/api/makeswift-api-resources-client.ts"],"sourcesContent":["import { type State as ApiClientState } from '../state/api-client/state'\nimport { configureClientStore } from '../state/api-client/client-store'\n\nimport {\n type File,\n type GlobalElement,\n type LocalizedGlobalElement,\n type PagePathnameSlice,\n type Swatch,\n type Table,\n type Typography,\n type HttpFetch,\n} from './types'\n\nimport { ApiResourcesClient } from './api-resources-client'\nimport { type SiteVersion } from './site-version'\n\n// see the comment in `MakeswiftApiResourcesClient` constructor below\nimport { type MakeswiftGraphQLApiClient } from './graphql-api-client'\nimport { type MakeswiftRestAPIClient } from './rest-api-client'\n\n/**\n * Server-side implementation that makes direct authenticated requests to the Makeswift API.\n * Requires an API key.\n *\n * For client-side usage, see `HostApiResourcesClient`, which goes through the host via\n * `/api/makeswift/...` endpoints.\n */\nexport class MakeswiftApiResourcesClient extends ApiResourcesClient {\n private restApiClient: Promise<MakeswiftRestAPIClient>\n private graphQlClient: Promise<MakeswiftGraphQLApiClient>\n\n constructor({\n fetch,\n apiKey,\n apiOrigin,\n graphqlApiEndpoint,\n preloadedState,\n }: {\n fetch: HttpFetch\n apiKey: string\n apiOrigin: string\n graphqlApiEndpoint: string\n preloadedState: Partial<ApiClientState>\n }) {\n super({\n store: configureClientStore({ preloadedState }),\n })\n\n // `MakeswiftApiResourcesClient` is used by the runtime and therefore will be imported\n // on the client; lazy import server-side REST/GraphQL clients to avoid unnecessarily\n // pulling their code into a client bundle.\n //\n // (we can't easily lazy-load `MakeswiftApiResourcesClient` itself, at it will make its\n // construction async, but because it shares most of its implementation with\n // `HostApiResourcesClient`, the overhead of this module on its own is negligible)\n this.restApiClient = (async () => {\n const { MakeswiftRestAPIClient } = await import('./rest-api-client')\n return new MakeswiftRestAPIClient({ fetch, apiKey, apiOrigin })\n })()\n\n this.graphQlClient = (async () => {\n const { MakeswiftGraphQLApiClient } = await import('./graphql-api-client')\n return new MakeswiftGraphQLApiClient({ endpoint: graphqlApiEndpoint })\n })()\n }\n\n protected async fetchSwatchImpl(id: string, version: SiteVersion | null): Promise<Swatch | null> {\n return (await this.restApiClient).getSwatch(id, version)\n }\n\n protected async fetchFileImpl(id: string, _version: SiteVersion | null): Promise<File | null> {\n // files are unversioned\n return (await this.restApiClient).getFile(id)\n }\n\n protected async fetchTypographyImpl(\n id: string,\n version: SiteVersion | null,\n ): Promise<Typography | null> {\n return (await this.restApiClient).getTypography(id, version)\n }\n\n protected async fetchGlobalElementImpl(\n id: string,\n version: SiteVersion | null,\n ): Promise<GlobalElement | null> {\n return (await this.restApiClient).getGlobalElement(id, version)\n }\n\n protected async fetchLocalizedGlobalElementImpl(\n id: string,\n version: SiteVersion | null,\n locale: string,\n ): Promise<LocalizedGlobalElement | null> {\n return (await this.restApiClient).getLocalizedGlobalElement(id, locale, version)\n }\n\n protected async fetchPagePathnameSliceImpl(\n id: string,\n version: SiteVersion | null,\n locale: string | null | undefined,\n ): Promise<PagePathnameSlice | null> {\n return (await this.restApiClient).getPagePathnameSlice(id, version, { locale })\n }\n\n protected async fetchTableImpl(id: string, _version: SiteVersion | null): Promise<Table | null> {\n // tables are unversioned\n return (await this.graphQlClient).getTable(id)\n }\n}\n"],"mappings":"AACA,SAAS,4BAA4B;AAarC,SAAS,0BAA0B;AAc5B,MAAM,oCAAoC,mBAAmB;AAAA,EAC1D;AAAA,EACA;AAAA,EAER,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAMG;AACD,UAAM;AAAA,MACJ,OAAO,qBAAqB,EAAE,eAAe,CAAC;AAAA,IAChD,CAAC;AASD,SAAK,iBAAiB,YAAY;AAChC,YAAM,EAAE,uBAAuB,IAAI,MAAM,OAAO,mBAAmB;AACnE,aAAO,IAAI,uBAAuB,EAAE,OAAO,QAAQ,UAAU,CAAC;AAAA,IAChE,GAAG;AAEH,SAAK,iBAAiB,YAAY;AAChC,YAAM,EAAE,0BAA0B,IAAI,MAAM,OAAO,sBAAsB;AACzE,aAAO,IAAI,0BAA0B,EAAE,UAAU,mBAAmB,CAAC;AAAA,IACvE,GAAG;AAAA,EACL;AAAA,EAEA,MAAgB,gBAAgB,IAAY,SAAqD;AAC/F,YAAQ,MAAM,KAAK,eAAe,UAAU,IAAI,OAAO;AAAA,EACzD;AAAA,EAEA,MAAgB,cAAc,IAAY,UAAoD;AAE5F,YAAQ,MAAM,KAAK,eAAe,QAAQ,EAAE;AAAA,EAC9C;AAAA,EAEA,MAAgB,oBACd,IACA,SAC4B;AAC5B,YAAQ,MAAM,KAAK,eAAe,cAAc,IAAI,OAAO;AAAA,EAC7D;AAAA,EAEA,MAAgB,uBACd,IACA,SAC+B;AAC/B,YAAQ,MAAM,KAAK,eAAe,iBAAiB,IAAI,OAAO;AAAA,EAChE;AAAA,EAEA,MAAgB,gCACd,IACA,SACA,QACwC;AACxC,YAAQ,MAAM,KAAK,eAAe,0BAA0B,IAAI,QAAQ,OAAO;AAAA,EACjF;AAAA,EAEA,MAAgB,2BACd,IACA,SACA,QACmC;AACnC,YAAQ,MAAM,KAAK,eAAe,qBAAqB,IAAI,SAAS,EAAE,OAAO,CAAC;AAAA,EAChF;AAAA,EAEA,MAAgB,eAAe,IAAY,UAAqD;AAE9F,YAAQ,MAAM,KAAK,eAAe,SAAS,EAAE;AAAA,EAC/C;AACF;","names":[]}
|
|
@@ -52,6 +52,19 @@ class MakeswiftRestAPIClient {
|
|
|
52
52
|
const swatch = await response.json();
|
|
53
53
|
return swatch;
|
|
54
54
|
}
|
|
55
|
+
async getFile(fileId) {
|
|
56
|
+
const response = await this.fetch(`v1/files/${fileId}`, null);
|
|
57
|
+
if (!response.ok) {
|
|
58
|
+
const failedBody = await failedResponseBody(response);
|
|
59
|
+
if (response.status === 404)
|
|
60
|
+
return null;
|
|
61
|
+
throw new RestApiClientError(`Failed to get file '${fileId}'`, response, {
|
|
62
|
+
body: failedBody
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const file = await response.json();
|
|
66
|
+
return file;
|
|
67
|
+
}
|
|
55
68
|
async getTypography(typographyId, siteVersion) {
|
|
56
69
|
const response = await this.fetch(`v3/typographies/${typographyId}`, siteVersion);
|
|
57
70
|
if (!response.ok) {
|
|
@@ -137,7 +150,7 @@ class MakeswiftRestAPIClient {
|
|
|
137
150
|
const requestHeaders = new Headers({
|
|
138
151
|
"x-api-key": this.apiKey,
|
|
139
152
|
"makeswift-site-api-key": this.apiKey,
|
|
140
|
-
"makeswift-runtime-version": "0.28.10-canary.
|
|
153
|
+
"makeswift-runtime-version": "0.28.10-canary.3"
|
|
141
154
|
});
|
|
142
155
|
if (siteVersion?.token) {
|
|
143
156
|
requestUrl.searchParams.set("version", siteVersion.version);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/api/rest-api-client.ts"],"sourcesContent":["import ky, { HTTPError, isHTTPError, type KyInstance } from './ky'\n\nimport {\n type GlobalElement,\n type LocalizedGlobalElement,\n type PagePathnameSlice,\n type Swatch,\n type Typography,\n type HttpFetch,\n} from './types'\n\nimport { type SiteVersion } from './site-version'\nimport * as Schema from './schema'\n\nconst RetryBackoffConfig = {\n MaxAttempts: 3,\n MaxDelayMs: 5_000,\n}\n\nexport class MakeswiftRestAPIClient {\n private _fetch: KyInstance\n\n readonly apiKey: string\n readonly apiOrigin: string\n\n constructor({\n fetch,\n apiKey,\n apiOrigin,\n }: {\n fetch: HttpFetch\n apiKey: string\n apiOrigin: string\n }) {\n this._fetch = ky.create({\n fetch,\n timeout: false,\n retry: {\n statusCodes: [429],\n limit: RetryBackoffConfig.MaxAttempts,\n backoffLimit: RetryBackoffConfig.MaxDelayMs,\n delay: attemptCount => 2 ** (attemptCount - 1) * 1000,\n jitter: true,\n },\n hooks: {\n beforeRetry: [\n async ({ request, error, retryCount }) => {\n console.warn(\n `Request to ${request.url} failed with ${error}. Retrying (${retryCount}/${RetryBackoffConfig.MaxAttempts})`,\n )\n // Drain the response body before retrying so we don't leak unconsumed\n // response bodies (see the comment on `failedResponseBody` below).\n if (isHTTPError(error)) await failedResponseBody(error.response)\n },\n ],\n },\n })\n\n this.apiKey = apiKey\n this.apiOrigin = apiOrigin\n }\n\n async getSwatch(swatchId: string, siteVersion: SiteVersion | null): Promise<Swatch | null> {\n const response = await this.fetch(`v3/swatches/${swatchId}`, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to get swatch '${swatchId}'`, response, {\n body: failedBody,\n siteVersion,\n })\n }\n\n const swatch = await response.json()\n\n return swatch\n }\n\n async getTypography(\n typographyId: string,\n siteVersion: SiteVersion | null,\n ): Promise<Typography | null> {\n const response = await this.fetch(`v3/typographies/${typographyId}`, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to get typography '${typographyId}'`, response, {\n body: failedBody,\n siteVersion,\n })\n }\n\n const typography = await response.json()\n\n return typography\n }\n\n async getGlobalElement(\n globalElementId: string,\n siteVersion: SiteVersion | null,\n ): Promise<GlobalElement | null> {\n const response = await this.fetch(`v3/global-elements/${globalElementId}`, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to get global element '${globalElementId}'`, response, {\n body: failedBody,\n siteVersion,\n })\n }\n\n const globalElement = await response.json()\n\n return globalElement\n }\n\n async getLocalizedGlobalElement(\n globalElementId: string,\n locale: string,\n siteVersion: SiteVersion | null,\n ): Promise<LocalizedGlobalElement | null> {\n const response = await this.fetch(\n `v3/localized-global-elements/${globalElementId}?locale=${locale}`,\n siteVersion,\n )\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(\n `Failed to get localized global element '${globalElementId}'`,\n response,\n { body: failedBody, siteVersion, locale },\n )\n }\n\n const localizedGlobalElement = await response.json()\n\n return localizedGlobalElement\n }\n\n async getPagePathnameSlices(\n pageIds: string[],\n siteVersion: SiteVersion | null,\n { locale }: { locale?: string | null },\n ): Promise<(PagePathnameSlice | null)[]> {\n if (pageIds.length === 0) return []\n\n const url = new URL(`v3/page-pathname-slices/bulk`, this.apiOrigin)\n\n pageIds.forEach(id => url.searchParams.append('ids', id))\n if (locale != null) url.searchParams.set('locale', locale)\n\n const response = await this.fetch(url.pathname + url.search, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return []\n\n throw new RestApiClientError(\n `Failed to get page pathname slice(s) for ${pageIds.join(', ')}`,\n response,\n { body: failedBody, siteVersion, locale },\n )\n }\n\n const json = await response.json()\n\n const pagePathnameSlices = Schema.pagePathnameSlices.parse(json)\n\n // We're mapping the basePageId to be the id, because we're still using the GraphQL\n // fragment as our APIResource. The id on the APIResource needs to match the pageId\n // so that we can find the corresponding page pathname slice when we call getPagePathnameSlice(pageId).\n // TODO: Update this once we move away from the GraphQL fragments.\n return pagePathnameSlices.map(pagePathnameSlice => {\n if (pagePathnameSlice == null) return null\n\n return {\n ...pagePathnameSlice,\n id: pagePathnameSlice.basePageId,\n localizedPathname: pagePathnameSlice.localizedPathname ?? null,\n }\n })\n }\n\n async getPagePathnameSlice(\n pageId: string,\n siteVersion: SiteVersion | null,\n { locale }: { locale?: string | null } = {},\n ): Promise<PagePathnameSlice | null> {\n const pagePathnameSlices = await this.getPagePathnameSlices([pageId], siteVersion, { locale })\n\n return pagePathnameSlices.at(0) ?? null\n }\n\n protected async fetch(\n path: string,\n siteVersion: SiteVersion | null,\n init?: RequestInit,\n ): Promise<Response> {\n const requestUrl = new URL(path, this.apiOrigin)\n\n const requestHeaders = new Headers({\n 'x-api-key': this.apiKey,\n 'makeswift-site-api-key': this.apiKey,\n 'makeswift-runtime-version': PACKAGE_VERSION,\n })\n\n if (siteVersion?.token) {\n requestUrl.searchParams.set('version', siteVersion.version)\n requestHeaders.set('makeswift-preview-token', siteVersion.token)\n }\n\n if (init?.headers) {\n new Headers(init.headers).forEach((value, key) => {\n requestHeaders.set(key, value)\n })\n }\n\n try {\n return await this._fetch(requestUrl.toString(), {\n ...init,\n headers: requestHeaders,\n ...(siteVersion != null ? { cache: 'no-store' } : {}),\n })\n } catch (error) {\n if (error instanceof HTTPError) return error.response\n throw error\n }\n }\n}\n\n// This function attempts to consume the response body of a failed response, and\n// returns either the parsed JSON or raw text. This is useful for logging more\n// detailed error information when an API request fails.\n//\n// Cloudflare Worker Note: The Cloudflare Worker runtime has automatic deadlock\n// prevention (in the form of auto-cancelling responses) that triggers when too\n// many response bodies are unconsumed. This applies for error responses as\n// well. As such, in this client we use this function to consume the response\n// body whenever the request fails, even if we don't end up logging the body\n// itself, to avoid hitting the deadlock prevention.\nexport async function failedResponseBody(response: Response): Promise<unknown> {\n try {\n const text = await response.text()\n try {\n return JSON.parse(text)\n } catch {\n return text\n }\n } catch (e) {\n return `Failed to extract response body: ${e}`\n }\n}\n\nfunction responseError(response: Response): string {\n return `${response.status} ${response.statusText}`\n}\n\nexport class RestApiClientError extends Error {\n readonly status: number\n\n constructor(message: string, response: Response, cause: Record<string, unknown>) {\n super(`${message}: ${responseError(response)}`, { cause })\n\n this.name = 'RestApiClientError'\n this.status = response.status\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/api/rest-api-client.ts"],"sourcesContent":["import ky, { HTTPError, isHTTPError, type KyInstance } from './ky'\n\nimport {\n type File,\n type GlobalElement,\n type LocalizedGlobalElement,\n type PagePathnameSlice,\n type Swatch,\n type Typography,\n type HttpFetch,\n} from './types'\n\nimport { type SiteVersion } from './site-version'\nimport * as Schema from './schema'\n\nconst RetryBackoffConfig = {\n MaxAttempts: 3,\n MaxDelayMs: 5_000,\n}\n\nexport class MakeswiftRestAPIClient {\n private _fetch: KyInstance\n\n readonly apiKey: string\n readonly apiOrigin: string\n\n constructor({\n fetch,\n apiKey,\n apiOrigin,\n }: {\n fetch: HttpFetch\n apiKey: string\n apiOrigin: string\n }) {\n this._fetch = ky.create({\n fetch,\n timeout: false,\n retry: {\n statusCodes: [429],\n limit: RetryBackoffConfig.MaxAttempts,\n backoffLimit: RetryBackoffConfig.MaxDelayMs,\n delay: attemptCount => 2 ** (attemptCount - 1) * 1000,\n jitter: true,\n },\n hooks: {\n beforeRetry: [\n async ({ request, error, retryCount }) => {\n console.warn(\n `Request to ${request.url} failed with ${error}. Retrying (${retryCount}/${RetryBackoffConfig.MaxAttempts})`,\n )\n // Drain the response body before retrying so we don't leak unconsumed\n // response bodies (see the comment on `failedResponseBody` below).\n if (isHTTPError(error)) await failedResponseBody(error.response)\n },\n ],\n },\n })\n\n this.apiKey = apiKey\n this.apiOrigin = apiOrigin\n }\n\n async getSwatch(swatchId: string, siteVersion: SiteVersion | null): Promise<Swatch | null> {\n const response = await this.fetch(`v3/swatches/${swatchId}`, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to get swatch '${swatchId}'`, response, {\n body: failedBody,\n siteVersion,\n })\n }\n\n const swatch = await response.json()\n\n return swatch\n }\n\n async getFile(fileId: string): Promise<File | null> {\n const response = await this.fetch(`v1/files/${fileId}`, null)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to get file '${fileId}'`, response, {\n body: failedBody,\n })\n }\n\n const file = await response.json()\n\n return file\n }\n\n async getTypography(\n typographyId: string,\n siteVersion: SiteVersion | null,\n ): Promise<Typography | null> {\n const response = await this.fetch(`v3/typographies/${typographyId}`, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to get typography '${typographyId}'`, response, {\n body: failedBody,\n siteVersion,\n })\n }\n\n const typography = await response.json()\n\n return typography\n }\n\n async getGlobalElement(\n globalElementId: string,\n siteVersion: SiteVersion | null,\n ): Promise<GlobalElement | null> {\n const response = await this.fetch(`v3/global-elements/${globalElementId}`, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to get global element '${globalElementId}'`, response, {\n body: failedBody,\n siteVersion,\n })\n }\n\n const globalElement = await response.json()\n\n return globalElement\n }\n\n async getLocalizedGlobalElement(\n globalElementId: string,\n locale: string,\n siteVersion: SiteVersion | null,\n ): Promise<LocalizedGlobalElement | null> {\n const response = await this.fetch(\n `v3/localized-global-elements/${globalElementId}?locale=${locale}`,\n siteVersion,\n )\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(\n `Failed to get localized global element '${globalElementId}'`,\n response,\n { body: failedBody, siteVersion, locale },\n )\n }\n\n const localizedGlobalElement = await response.json()\n\n return localizedGlobalElement\n }\n\n async getPagePathnameSlices(\n pageIds: string[],\n siteVersion: SiteVersion | null,\n { locale }: { locale?: string | null },\n ): Promise<(PagePathnameSlice | null)[]> {\n if (pageIds.length === 0) return []\n\n const url = new URL(`v3/page-pathname-slices/bulk`, this.apiOrigin)\n\n pageIds.forEach(id => url.searchParams.append('ids', id))\n if (locale != null) url.searchParams.set('locale', locale)\n\n const response = await this.fetch(url.pathname + url.search, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return []\n\n throw new RestApiClientError(\n `Failed to get page pathname slice(s) for ${pageIds.join(', ')}`,\n response,\n { body: failedBody, siteVersion, locale },\n )\n }\n\n const json = await response.json()\n\n const pagePathnameSlices = Schema.pagePathnameSlices.parse(json)\n\n // We're mapping the basePageId to be the id, because we're still using the GraphQL\n // fragment as our APIResource. The id on the APIResource needs to match the pageId\n // so that we can find the corresponding page pathname slice when we call getPagePathnameSlice(pageId).\n // TODO: Update this once we move away from the GraphQL fragments.\n return pagePathnameSlices.map(pagePathnameSlice => {\n if (pagePathnameSlice == null) return null\n\n return {\n ...pagePathnameSlice,\n id: pagePathnameSlice.basePageId,\n localizedPathname: pagePathnameSlice.localizedPathname ?? null,\n }\n })\n }\n\n async getPagePathnameSlice(\n pageId: string,\n siteVersion: SiteVersion | null,\n { locale }: { locale?: string | null } = {},\n ): Promise<PagePathnameSlice | null> {\n const pagePathnameSlices = await this.getPagePathnameSlices([pageId], siteVersion, { locale })\n\n return pagePathnameSlices.at(0) ?? null\n }\n\n protected async fetch(\n path: string,\n siteVersion: SiteVersion | null,\n init?: RequestInit,\n ): Promise<Response> {\n const requestUrl = new URL(path, this.apiOrigin)\n\n const requestHeaders = new Headers({\n 'x-api-key': this.apiKey,\n 'makeswift-site-api-key': this.apiKey,\n 'makeswift-runtime-version': PACKAGE_VERSION,\n })\n\n if (siteVersion?.token) {\n requestUrl.searchParams.set('version', siteVersion.version)\n requestHeaders.set('makeswift-preview-token', siteVersion.token)\n }\n\n if (init?.headers) {\n new Headers(init.headers).forEach((value, key) => {\n requestHeaders.set(key, value)\n })\n }\n\n try {\n return await this._fetch(requestUrl.toString(), {\n ...init,\n headers: requestHeaders,\n ...(siteVersion != null ? { cache: 'no-store' } : {}),\n })\n } catch (error) {\n if (error instanceof HTTPError) return error.response\n throw error\n }\n }\n}\n\n// This function attempts to consume the response body of a failed response, and\n// returns either the parsed JSON or raw text. This is useful for logging more\n// detailed error information when an API request fails.\n//\n// Cloudflare Worker Note: The Cloudflare Worker runtime has automatic deadlock\n// prevention (in the form of auto-cancelling responses) that triggers when too\n// many response bodies are unconsumed. This applies for error responses as\n// well. As such, in this client we use this function to consume the response\n// body whenever the request fails, even if we don't end up logging the body\n// itself, to avoid hitting the deadlock prevention.\nexport async function failedResponseBody(response: Response): Promise<unknown> {\n try {\n const text = await response.text()\n try {\n return JSON.parse(text)\n } catch {\n return text\n }\n } catch (e) {\n return `Failed to extract response body: ${e}`\n }\n}\n\nfunction responseError(response: Response): string {\n return `${response.status} ${response.statusText}`\n}\n\nexport class RestApiClientError extends Error {\n readonly status: number\n\n constructor(message: string, response: Response, cause: Record<string, unknown>) {\n super(`${message}: ${responseError(response)}`, { cause })\n\n this.name = 'RestApiClientError'\n this.status = response.status\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class MakeswiftTableRecordClient {
|
|
2
|
+
fetch;
|
|
3
|
+
constructor({ fetch }) {
|
|
4
|
+
this.fetch = fetch;
|
|
5
|
+
}
|
|
6
|
+
async createTableRecord(tableId, columns) {
|
|
7
|
+
const response = await this.fetch("/api/makeswift/table-records", {
|
|
8
|
+
method: "POST",
|
|
9
|
+
headers: { "Content-Type": "application/json" },
|
|
10
|
+
body: JSON.stringify({ tableId, columns })
|
|
11
|
+
});
|
|
12
|
+
if (!response.ok) {
|
|
13
|
+
const message = await response.json().then((body) => typeof body?.message === "string" ? body.message : null).catch(() => null);
|
|
14
|
+
throw new Error(
|
|
15
|
+
message ?? `Failed to create table record for table '${tableId}': ${response.status}`
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
MakeswiftTableRecordClient
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=table-record-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/api/table-record-client.ts"],"sourcesContent":["import { type HttpFetch } from './types'\n\nexport type TableRecordColumn = { columnId: string; data: unknown }\n\nexport class MakeswiftTableRecordClient {\n private readonly fetch: HttpFetch\n\n constructor({ fetch }: { fetch: HttpFetch }) {\n this.fetch = fetch\n }\n\n async createTableRecord(tableId: string, columns: TableRecordColumn[]): Promise<void> {\n const response = await this.fetch('/api/makeswift/table-records', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ tableId, columns }),\n })\n\n if (!response.ok) {\n const message = await response\n .json()\n .then(body => (typeof body?.message === 'string' ? body.message : null))\n .catch(() => null)\n\n throw new Error(\n message ?? `Failed to create table record for table '${tableId}': ${response.status}`,\n )\n }\n }\n}\n"],"mappings":"AAIO,MAAM,2BAA2B;AAAA,EACrB;AAAA,EAEjB,YAAY,EAAE,MAAM,GAAyB;AAC3C,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,MAAM,kBAAkB,SAAiB,SAA6C;AACpF,UAAM,WAAW,MAAM,KAAK,MAAM,gCAAgC;AAAA,MAChE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,SAAS,QAAQ,CAAC;AAAA,IAC3C,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,UAAU,MAAM,SACnB,KAAK,EACL,KAAK,UAAS,OAAO,MAAM,YAAY,WAAW,KAAK,UAAU,IAAK,EACtE,MAAM,MAAM,IAAI;AAEnB,YAAM,IAAI;AAAA,QACR,WAAW,4CAA4C,OAAO,MAAM,SAAS,MAAM;AAAA,MACrF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
|
@@ -8,7 +8,7 @@ async function manifestHandler(req, { apiKey, manifest }) {
|
|
|
8
8
|
return ApiResponse.json({ message: "Unauthorized" }, { status: 401 });
|
|
9
9
|
}
|
|
10
10
|
return ApiResponse.json({
|
|
11
|
-
version: "0.28.10-canary.
|
|
11
|
+
version: "0.28.10-canary.3",
|
|
12
12
|
interactionMode: true,
|
|
13
13
|
clientSideNavigation: false,
|
|
14
14
|
elementFromPoint: false,
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { RestApiClientError } from "../../api/rest-api-client";
|
|
2
|
+
import { ApiResponse } from "../request-response";
|
|
3
|
+
import isErrorWithMessage from "../../utils/isErrorWithMessage";
|
|
4
|
+
async function tableRecordHandler(req, { client }) {
|
|
5
|
+
const body = await req.json();
|
|
6
|
+
const { tableId, columns } = body;
|
|
7
|
+
if (typeof tableId !== "string") {
|
|
8
|
+
return ApiResponse.json({ message: "tableId must be a string" }, { status: 400 });
|
|
9
|
+
}
|
|
10
|
+
if (!Array.isArray(columns)) {
|
|
11
|
+
return ApiResponse.json({ message: "columns must be an array" }, { status: 400 });
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
await client.createTableRecord(tableId, columns);
|
|
15
|
+
return new Response(null, { status: 204 });
|
|
16
|
+
} catch (error) {
|
|
17
|
+
if (error instanceof RestApiClientError) {
|
|
18
|
+
return ApiResponse.json({ message: error.message }, { status: error.status });
|
|
19
|
+
}
|
|
20
|
+
if (isErrorWithMessage(error)) {
|
|
21
|
+
return ApiResponse.json({ message: error.message }, { status: 500 });
|
|
22
|
+
}
|
|
23
|
+
return ApiResponse.json({ message: "Error creating table record" }, { status: 500 });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
tableRecordHandler
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=table-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/api-handler/handlers/table-record.ts"],"sourcesContent":["import { MakeswiftClient } from '../../client'\nimport { RestApiClientError } from '../../api/rest-api-client'\nimport { type ApiRequest, ApiResponse, type ErrorResponseBody } from '../request-response'\nimport isErrorWithMessage from '../../utils/isErrorWithMessage'\n\nexport async function tableRecordHandler(\n req: ApiRequest,\n { client }: { client: MakeswiftClient },\n): Promise<ApiResponse<ErrorResponseBody> | Response> {\n const body = await req.json()\n const { tableId, columns } = body\n\n if (typeof tableId !== 'string') {\n return ApiResponse.json({ message: 'tableId must be a string' }, { status: 400 })\n }\n\n if (!Array.isArray(columns)) {\n return ApiResponse.json({ message: 'columns must be an array' }, { status: 400 })\n }\n\n try {\n await client.createTableRecord(tableId, columns)\n return new Response(null, { status: 204 })\n } catch (error) {\n if (error instanceof RestApiClientError) {\n return ApiResponse.json({ message: error.message }, { status: error.status })\n }\n\n if (isErrorWithMessage(error)) {\n return ApiResponse.json({ message: error.message }, { status: 500 })\n }\n\n return ApiResponse.json({ message: 'Error creating table record' }, { status: 500 })\n }\n}\n"],"mappings":"AACA,SAAS,0BAA0B;AACnC,SAA0B,mBAA2C;AACrE,OAAO,wBAAwB;AAE/B,eAAsB,mBACpB,KACA,EAAE,OAAO,GAC2C;AACpD,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAM,EAAE,SAAS,QAAQ,IAAI;AAE7B,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,YAAY,KAAK,EAAE,SAAS,2BAA2B,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EAClF;AAEA,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,WAAO,YAAY,KAAK,EAAE,SAAS,2BAA2B,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EAClF;AAEA,MAAI;AACF,UAAM,OAAO,kBAAkB,SAAS,OAAO;AAC/C,WAAO,IAAI,SAAS,MAAM,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC3C,SAAS,OAAO;AACd,QAAI,iBAAiB,oBAAoB;AACvC,aAAO,YAAY,KAAK,EAAE,SAAS,MAAM,QAAQ,GAAG,EAAE,QAAQ,MAAM,OAAO,CAAC;AAAA,IAC9E;AAEA,QAAI,mBAAmB,KAAK,GAAG;AAC7B,aAAO,YAAY,KAAK,EAAE,SAAS,MAAM,QAAQ,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,IACrE;AAEA,WAAO,YAAY,KAAK,EAAE,SAAS,8BAA8B,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACrF;AACF;","names":[]}
|
|
@@ -6,6 +6,7 @@ import { fontsHandler } from "./handlers/fonts";
|
|
|
6
6
|
import { manifestHandler } from "./handlers/manifest";
|
|
7
7
|
import { mergeTranslatedDataHandler } from "./handlers/merge-translated-data";
|
|
8
8
|
import { revalidateHandler } from "./handlers/revalidate";
|
|
9
|
+
import { tableRecordHandler } from "./handlers/table-record";
|
|
9
10
|
import { translatableDataHandler } from "./handlers/translatable-data";
|
|
10
11
|
import { webhookHandler } from "./handlers/webhook";
|
|
11
12
|
import {
|
|
@@ -52,6 +53,8 @@ function createApiHandler(apiKey, {
|
|
|
52
53
|
if (matches("/revalidate")) {
|
|
53
54
|
return revalidateHandler(req, { apiKey, revalidatePath: revalidationHandler });
|
|
54
55
|
}
|
|
56
|
+
if (matches("/table-records"))
|
|
57
|
+
return tableRecordHandler(req, { client });
|
|
55
58
|
if (matches("/translatable-data"))
|
|
56
59
|
return translatableDataHandler(req, { client });
|
|
57
60
|
if (matches("/webhook")) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/api-handler/index.ts"],"sourcesContent":["import { Match, match as matchPattern } from 'path-to-regexp'\n\nimport { APIResource } from '../api'\nimport { ApiHandlerHeaders, deserializeSiteVersion } from '../api/site-version'\n\nimport { MakeswiftClient } from '../client'\nimport { type ReactRuntimeCore } from '../runtimes/react/react-runtime-core'\n\nimport { redirectLiveHandler } from './handlers/redirect-live'\nimport { elementTreeHandler } from './handlers/element-tree'\nimport { fontsHandler, type Font, type GetFonts } from './handlers/fonts'\nimport { manifestHandler, type Manifest } from './handlers/manifest'\nimport { mergeTranslatedDataHandler } from './handlers/merge-translated-data'\nimport { revalidateHandler } from './handlers/revalidate'\nimport { translatableDataHandler } from './handlers/translatable-data'\nimport { webhookHandler } from './handlers/webhook'\nimport { type OnPublish, type SitePublishedWebhookPayloadData } from './handlers/webhook/types'\n\nimport {\n type ApiRequest,\n type ErrorResponseBody,\n ApiResponse,\n searchParams,\n} from './request-response'\n\nimport { applyCorsHeaders } from './cors'\n\nexport type { Manifest, Font, SitePublishedWebhookPayloadData }\n\ntype Events = { onPublish: OnPublish }\n\nexport type ApiHandlerUserConfig = {\n runtime: ReactRuntimeCore\n getFonts?: GetFonts\n events?: Events\n}\n\nexport type ApiHandlerInternalConfig = {\n client: MakeswiftClient\n manifest?: Partial<Manifest>\n revalidationHandler: (path?: string) => Promise<void>\n previewCookieNames: string[]\n}\n\ntype ApiHandlerConfig = ApiHandlerUserConfig & ApiHandlerInternalConfig\n\ntype ResponseType =\n | Awaited<\n | ReturnType<typeof redirectLiveHandler>\n | ReturnType<typeof elementTreeHandler>\n | ReturnType<typeof fontsHandler>\n | ReturnType<typeof manifestHandler>\n | ReturnType<typeof mergeTranslatedDataHandler>\n | ReturnType<typeof revalidateHandler>\n | ReturnType<typeof translatableDataHandler>\n | ReturnType<typeof webhookHandler>\n >\n | ApiResponse<APIResource>\n | ApiResponse<ErrorResponseBody>\n | Response\n\ntype ApiHandler = (req: ApiRequest, route: string) => Promise<ResponseType>\n\nexport function createApiHandler(\n apiKey: string,\n {\n runtime,\n getFonts,\n events,\n client,\n manifest,\n revalidationHandler,\n previewCookieNames,\n }: ApiHandlerConfig,\n): ApiHandler {\n if (typeof apiKey !== 'string') {\n throw new Error(\n 'The Makeswift API handler must be passed a valid Makeswift site API key. ' +\n `Received \"${apiKey}\" instead.`,\n )\n }\n\n return async function (req: ApiRequest, route: string): Promise<ResponseType> {\n const res =\n req.method.toUpperCase() !== 'OPTIONS'\n ? await apiRouteHandler(req, route)\n : new Response(null, { status: 204, headers: [['Content-Length', '0']] })\n\n applyCorsHeaders(res.headers, {\n origin: runtime.appOrigin,\n allowedHeaders: ['Content-Type', 'Authorization'],\n })\n\n return res\n }\n\n async function apiRouteHandler(req: ApiRequest, route: string): Promise<ResponseType> {\n const versionHeader = req.headers.get(ApiHandlerHeaders.SiteVersion)\n\n const siteVersion = versionHeader != null ? deserializeSiteVersion(versionHeader) : null\n\n const matches = <T extends object>(pattern: string): Match<T> =>\n matchPattern<T>(pattern, { decode: decodeURIComponent })(route)\n\n if (matches('/redirect-live')) return redirectLiveHandler(req, { previewCookieNames })\n if (matches('/element-tree')) return elementTreeHandler(req, { runtime })\n if (matches('/fonts')) return fontsHandler(req, { getFonts })\n if (matches('/manifest')) return manifestHandler(req, { apiKey, manifest })\n if (matches('/merge-translated-data')) return mergeTranslatedDataHandler(req, { client })\n if (matches('/revalidate')) {\n return revalidateHandler(req, { apiKey, revalidatePath: revalidationHandler })\n }\n\n if (matches('/translatable-data')) return translatableDataHandler(req, { client })\n if (matches('/webhook')) {\n return webhookHandler(req, { apiKey, events, revalidate: revalidationHandler })\n }\n\n const handleResource = <T extends APIResource>(\n resource: T | null,\n ): ApiResponse<APIResource | ErrorResponseBody> => {\n return resource !== null\n ? ApiResponse.json(resource)\n : ApiResponse.json({ message: 'Not Found' }, { status: 404 })\n }\n\n let m\n\n if ((m = matches<{ id: string }>('/swatches/:id'))) {\n return client.getSwatch(m.params.id, siteVersion).then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/files/:id'))) {\n return client.getFile(m.params.id).then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/typographies/:id'))) {\n return client.getTypography(m.params.id, siteVersion).then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/global-elements/:id'))) {\n return client.getGlobalElement(m.params.id, siteVersion).then(handleResource)\n }\n\n if (\n (m = matches<{ globalElementId: string; locale: string }>(\n '/localized-global-elements/:globalElementId/:locale',\n ))\n ) {\n return client\n .getLocalizedGlobalElement(m.params.globalElementId, m.params.locale, siteVersion)\n .then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/page-pathname-slices/:id'))) {\n const localeParam = searchParams(req).get('locale')\n const locale = typeof localeParam === 'string' ? localeParam : undefined\n\n return client.getPagePathnameSlice(m.params.id, siteVersion, { locale }).then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/tables/:id'))) {\n return client.getTable(m.params.id).then(handleResource)\n }\n\n return ApiResponse.json({ message: 'Not Found' }, { status: 404 })\n }\n}\n"],"mappings":"AAAA,SAAgB,SAAS,oBAAoB;AAG7C,SAAS,mBAAmB,8BAA8B;AAK1D,SAAS,2BAA2B;AACpC,SAAS,0BAA0B;AACnC,SAAS,oBAA8C;AACvD,SAAS,uBAAsC;AAC/C,SAAS,kCAAkC;AAC3C,SAAS,yBAAyB;AAClC,SAAS,+BAA+B;AACxC,SAAS,sBAAsB;AAG/B;AAAA,EAGE;AAAA,EACA;AAAA,OACK;AAEP,SAAS,wBAAwB;
|
|
1
|
+
{"version":3,"sources":["../../../src/api-handler/index.ts"],"sourcesContent":["import { Match, match as matchPattern } from 'path-to-regexp'\n\nimport { APIResource } from '../api'\nimport { ApiHandlerHeaders, deserializeSiteVersion } from '../api/site-version'\n\nimport { MakeswiftClient } from '../client'\nimport { type ReactRuntimeCore } from '../runtimes/react/react-runtime-core'\n\nimport { redirectLiveHandler } from './handlers/redirect-live'\nimport { elementTreeHandler } from './handlers/element-tree'\nimport { fontsHandler, type Font, type GetFonts } from './handlers/fonts'\nimport { manifestHandler, type Manifest } from './handlers/manifest'\nimport { mergeTranslatedDataHandler } from './handlers/merge-translated-data'\nimport { revalidateHandler } from './handlers/revalidate'\nimport { tableRecordHandler } from './handlers/table-record'\nimport { translatableDataHandler } from './handlers/translatable-data'\nimport { webhookHandler } from './handlers/webhook'\nimport { type OnPublish, type SitePublishedWebhookPayloadData } from './handlers/webhook/types'\n\nimport {\n type ApiRequest,\n type ErrorResponseBody,\n ApiResponse,\n searchParams,\n} from './request-response'\n\nimport { applyCorsHeaders } from './cors'\n\nexport type { Manifest, Font, SitePublishedWebhookPayloadData }\n\ntype Events = { onPublish: OnPublish }\n\nexport type ApiHandlerUserConfig = {\n runtime: ReactRuntimeCore\n getFonts?: GetFonts\n events?: Events\n}\n\nexport type ApiHandlerInternalConfig = {\n client: MakeswiftClient\n manifest?: Partial<Manifest>\n revalidationHandler: (path?: string) => Promise<void>\n previewCookieNames: string[]\n}\n\ntype ApiHandlerConfig = ApiHandlerUserConfig & ApiHandlerInternalConfig\n\ntype ResponseType =\n | Awaited<\n | ReturnType<typeof redirectLiveHandler>\n | ReturnType<typeof elementTreeHandler>\n | ReturnType<typeof fontsHandler>\n | ReturnType<typeof manifestHandler>\n | ReturnType<typeof mergeTranslatedDataHandler>\n | ReturnType<typeof revalidateHandler>\n | ReturnType<typeof tableRecordHandler>\n | ReturnType<typeof translatableDataHandler>\n | ReturnType<typeof webhookHandler>\n >\n | ApiResponse<APIResource>\n | ApiResponse<ErrorResponseBody>\n | Response\n\ntype ApiHandler = (req: ApiRequest, route: string) => Promise<ResponseType>\n\nexport function createApiHandler(\n apiKey: string,\n {\n runtime,\n getFonts,\n events,\n client,\n manifest,\n revalidationHandler,\n previewCookieNames,\n }: ApiHandlerConfig,\n): ApiHandler {\n if (typeof apiKey !== 'string') {\n throw new Error(\n 'The Makeswift API handler must be passed a valid Makeswift site API key. ' +\n `Received \"${apiKey}\" instead.`,\n )\n }\n\n return async function (req: ApiRequest, route: string): Promise<ResponseType> {\n const res =\n req.method.toUpperCase() !== 'OPTIONS'\n ? await apiRouteHandler(req, route)\n : new Response(null, { status: 204, headers: [['Content-Length', '0']] })\n\n applyCorsHeaders(res.headers, {\n origin: runtime.appOrigin,\n allowedHeaders: ['Content-Type', 'Authorization'],\n })\n\n return res\n }\n\n async function apiRouteHandler(req: ApiRequest, route: string): Promise<ResponseType> {\n const versionHeader = req.headers.get(ApiHandlerHeaders.SiteVersion)\n\n const siteVersion = versionHeader != null ? deserializeSiteVersion(versionHeader) : null\n\n const matches = <T extends object>(pattern: string): Match<T> =>\n matchPattern<T>(pattern, { decode: decodeURIComponent })(route)\n\n if (matches('/redirect-live')) return redirectLiveHandler(req, { previewCookieNames })\n if (matches('/element-tree')) return elementTreeHandler(req, { runtime })\n if (matches('/fonts')) return fontsHandler(req, { getFonts })\n if (matches('/manifest')) return manifestHandler(req, { apiKey, manifest })\n if (matches('/merge-translated-data')) return mergeTranslatedDataHandler(req, { client })\n if (matches('/revalidate')) {\n return revalidateHandler(req, { apiKey, revalidatePath: revalidationHandler })\n }\n\n if (matches('/table-records')) return tableRecordHandler(req, { client })\n if (matches('/translatable-data')) return translatableDataHandler(req, { client })\n if (matches('/webhook')) {\n return webhookHandler(req, { apiKey, events, revalidate: revalidationHandler })\n }\n\n const handleResource = <T extends APIResource>(\n resource: T | null,\n ): ApiResponse<APIResource | ErrorResponseBody> => {\n return resource !== null\n ? ApiResponse.json(resource)\n : ApiResponse.json({ message: 'Not Found' }, { status: 404 })\n }\n\n let m\n\n if ((m = matches<{ id: string }>('/swatches/:id'))) {\n return client.getSwatch(m.params.id, siteVersion).then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/files/:id'))) {\n return client.getFile(m.params.id).then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/typographies/:id'))) {\n return client.getTypography(m.params.id, siteVersion).then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/global-elements/:id'))) {\n return client.getGlobalElement(m.params.id, siteVersion).then(handleResource)\n }\n\n if (\n (m = matches<{ globalElementId: string; locale: string }>(\n '/localized-global-elements/:globalElementId/:locale',\n ))\n ) {\n return client\n .getLocalizedGlobalElement(m.params.globalElementId, m.params.locale, siteVersion)\n .then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/page-pathname-slices/:id'))) {\n const localeParam = searchParams(req).get('locale')\n const locale = typeof localeParam === 'string' ? localeParam : undefined\n\n return client.getPagePathnameSlice(m.params.id, siteVersion, { locale }).then(handleResource)\n }\n\n if ((m = matches<{ id: string }>('/tables/:id'))) {\n return client.getTable(m.params.id).then(handleResource)\n }\n\n return ApiResponse.json({ message: 'Not Found' }, { status: 404 })\n }\n}\n"],"mappings":"AAAA,SAAgB,SAAS,oBAAoB;AAG7C,SAAS,mBAAmB,8BAA8B;AAK1D,SAAS,2BAA2B;AACpC,SAAS,0BAA0B;AACnC,SAAS,oBAA8C;AACvD,SAAS,uBAAsC;AAC/C,SAAS,kCAAkC;AAC3C,SAAS,yBAAyB;AAClC,SAAS,0BAA0B;AACnC,SAAS,+BAA+B;AACxC,SAAS,sBAAsB;AAG/B;AAAA,EAGE;AAAA,EACA;AAAA,OACK;AAEP,SAAS,wBAAwB;AAuC1B,SAAS,iBACd,QACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACY;AACZ,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI;AAAA,MACR,sFACe,MAAM;AAAA,IACvB;AAAA,EACF;AAEA,SAAO,eAAgB,KAAiB,OAAsC;AAC5E,UAAM,MACJ,IAAI,OAAO,YAAY,MAAM,YACzB,MAAM,gBAAgB,KAAK,KAAK,IAChC,IAAI,SAAS,MAAM,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC;AAE5E,qBAAiB,IAAI,SAAS;AAAA,MAC5B,QAAQ,QAAQ;AAAA,MAChB,gBAAgB,CAAC,gBAAgB,eAAe;AAAA,IAClD,CAAC;AAED,WAAO;AAAA,EACT;AAEA,iBAAe,gBAAgB,KAAiB,OAAsC;AACpF,UAAM,gBAAgB,IAAI,QAAQ,IAAI,kBAAkB,WAAW;AAEnE,UAAM,cAAc,iBAAiB,OAAO,uBAAuB,aAAa,IAAI;AAEpF,UAAM,UAAU,CAAmB,YACjC,aAAgB,SAAS,EAAE,QAAQ,mBAAmB,CAAC,EAAE,KAAK;AAEhE,QAAI,QAAQ,gBAAgB;AAAG,aAAO,oBAAoB,KAAK,EAAE,mBAAmB,CAAC;AACrF,QAAI,QAAQ,eAAe;AAAG,aAAO,mBAAmB,KAAK,EAAE,QAAQ,CAAC;AACxE,QAAI,QAAQ,QAAQ;AAAG,aAAO,aAAa,KAAK,EAAE,SAAS,CAAC;AAC5D,QAAI,QAAQ,WAAW;AAAG,aAAO,gBAAgB,KAAK,EAAE,QAAQ,SAAS,CAAC;AAC1E,QAAI,QAAQ,wBAAwB;AAAG,aAAO,2BAA2B,KAAK,EAAE,OAAO,CAAC;AACxF,QAAI,QAAQ,aAAa,GAAG;AAC1B,aAAO,kBAAkB,KAAK,EAAE,QAAQ,gBAAgB,oBAAoB,CAAC;AAAA,IAC/E;AAEA,QAAI,QAAQ,gBAAgB;AAAG,aAAO,mBAAmB,KAAK,EAAE,OAAO,CAAC;AACxE,QAAI,QAAQ,oBAAoB;AAAG,aAAO,wBAAwB,KAAK,EAAE,OAAO,CAAC;AACjF,QAAI,QAAQ,UAAU,GAAG;AACvB,aAAO,eAAe,KAAK,EAAE,QAAQ,QAAQ,YAAY,oBAAoB,CAAC;AAAA,IAChF;AAEA,UAAM,iBAAiB,CACrB,aACiD;AACjD,aAAO,aAAa,OAChB,YAAY,KAAK,QAAQ,IACzB,YAAY,KAAK,EAAE,SAAS,YAAY,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,IAChE;AAEA,QAAI;AAEJ,QAAK,IAAI,QAAwB,eAAe,GAAI;AAClD,aAAO,OAAO,UAAU,EAAE,OAAO,IAAI,WAAW,EAAE,KAAK,cAAc;AAAA,IACvE;AAEA,QAAK,IAAI,QAAwB,YAAY,GAAI;AAC/C,aAAO,OAAO,QAAQ,EAAE,OAAO,EAAE,EAAE,KAAK,cAAc;AAAA,IACxD;AAEA,QAAK,IAAI,QAAwB,mBAAmB,GAAI;AACtD,aAAO,OAAO,cAAc,EAAE,OAAO,IAAI,WAAW,EAAE,KAAK,cAAc;AAAA,IAC3E;AAEA,QAAK,IAAI,QAAwB,sBAAsB,GAAI;AACzD,aAAO,OAAO,iBAAiB,EAAE,OAAO,IAAI,WAAW,EAAE,KAAK,cAAc;AAAA,IAC9E;AAEA,QACG,IAAI;AAAA,MACH;AAAA,IACF,GACA;AACA,aAAO,OACJ,0BAA0B,EAAE,OAAO,iBAAiB,EAAE,OAAO,QAAQ,WAAW,EAChF,KAAK,cAAc;AAAA,IACxB;AAEA,QAAK,IAAI,QAAwB,2BAA2B,GAAI;AAC9D,YAAM,cAAc,aAAa,GAAG,EAAE,IAAI,QAAQ;AAClD,YAAM,SAAS,OAAO,gBAAgB,WAAW,cAAc;AAE/D,aAAO,OAAO,qBAAqB,EAAE,OAAO,IAAI,aAAa,EAAE,OAAO,CAAC,EAAE,KAAK,cAAc;AAAA,IAC9F;AAEA,QAAK,IAAI,QAAwB,aAAa,GAAI;AAChD,aAAO,OAAO,SAAS,EAAE,OAAO,EAAE,EAAE,KAAK,cAAc;AAAA,IACzD;AAEA,WAAO,YAAY,KAAK,EAAE,SAAS,YAAY,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACnE;AACF;","names":[]}
|
package/dist/esm/client/index.js
CHANGED
|
@@ -656,8 +656,23 @@ Received "${apiKey}" instead.`
|
|
|
656
656
|
};
|
|
657
657
|
});
|
|
658
658
|
}
|
|
659
|
-
async
|
|
660
|
-
|
|
659
|
+
async createTableRecord(tableId, columns) {
|
|
660
|
+
const response = await this.fetch("v1/table-records", null, {
|
|
661
|
+
method: "POST",
|
|
662
|
+
headers: { "content-type": "application/json" },
|
|
663
|
+
body: JSON.stringify({ tableId, columns })
|
|
664
|
+
});
|
|
665
|
+
if (!response.ok) {
|
|
666
|
+
const failedBody = await failedResponseBody(response);
|
|
667
|
+
throw new RestApiClientError(
|
|
668
|
+
`Failed to create table record for table '${tableId}'`,
|
|
669
|
+
response,
|
|
670
|
+
{
|
|
671
|
+
body: failedBody,
|
|
672
|
+
tableId
|
|
673
|
+
}
|
|
674
|
+
);
|
|
675
|
+
}
|
|
661
676
|
}
|
|
662
677
|
async getTable(tableId) {
|
|
663
678
|
return this.graphqlClient.getTable(tableId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/client/index.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport {\n type UnversionedResourcesQueryResult,\n type UnversionedResourcesQueryVariables,\n} from '../api/graphql/generated/types'\n\nimport {\n APIResourceType,\n type File,\n type GlobalElement,\n type LocalizedGlobalElement,\n type Swatch,\n type Table,\n type Typography,\n} from '../api/types'\n\nimport { CacheData } from '../api/api-resources-client'\n\nimport { MakeswiftGraphQLApiClient } from '../api/graphql-api-client'\nimport {\n MakeswiftRestAPIClient,\n failedResponseBody,\n RestApiClientError,\n} from '../api/rest-api-client'\nimport { type SiteVersion } from '../api/site-version'\n\nimport { Descriptor as PropControllerDescriptor } from '../prop-controllers/descriptors'\nimport {\n getElementChildren,\n getSwatchIds,\n getFileIds,\n getPageIds,\n getTableIds,\n getTypographyIds,\n} from '../prop-controllers/introspection'\n\nimport { type ReactRuntimeCore } from '../runtimes/react/react-runtime-core'\n\nimport {\n type Element,\n type ElementData,\n type Data,\n getPropControllerDescriptors,\n isElementReference,\n} from '../state/read-only-state'\n\nimport { mergeTranslatedContent } from '../state/translations/merge'\nimport { getTranslatableContent } from '../state/translations/get'\n\nimport { deterministicUUID } from '../utils/deterministic-uuid'\nimport { toIterablePaginationResult } from '../utils/pagination'\nimport { isNonNullable } from '../utils/isNonNullable'\n\nimport {\n type MakeswiftComponentDocument,\n type MakeswiftComponentSnapshot,\n} from './component-snapshot'\n\nimport { type MakeswiftPageDocument, type MakeswiftPageSnapshot } from './page-snapshot'\n\nimport * as Schema from './schema'\n\nexport { SnippetLocation } from '../api/graphql/generated/types'\n\n// TODO: clean up the exports below, as most of them are for internal consumptions only\n// and should not be publicly exposed\nexport {\n type MakeswiftComponentDocument,\n type MakeswiftComponentDocumentFallback,\n type MakeswiftComponentSnapshot,\n type MakeswiftComponentMetadata as MakeswiftComponentSnapshotMetadata,\n componentDocumentToRootEmbeddedDocument,\n} from './component-snapshot'\n\nexport {\n type Snippet,\n type Font,\n type MakeswiftPageDocument,\n type MakeswiftPageSnapshot,\n pageToRootDocument,\n} from './page-snapshot'\n\n// TODO: remove, leftover from the `getSitemap` method removed in 0.25.0:\n// https://github.com/makeswift/makeswift/releases/tag/%40makeswift%2Fruntime%400.25.0\nexport type Sitemap = {\n id: string\n loc: string\n lastmod?: string\n changefreq?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n priority?: number\n alternateRefs?: {\n hreflang: string\n href: string\n }[]\n}[]\n\nexport type MakeswiftPage = z.infer<typeof Schema.pageData>\nexport type MakeswiftGetPagesResult = z.infer<typeof Schema.getPagesResult>\nexport type PreviewTokenPayload = z.infer<typeof Schema.previewTokenPayload>\nexport type GetFontsAPI = z.infer<typeof Schema.fonts>\n\ntype GetPagesParams = z.infer<typeof Schema.getPagesParams>\ntype GetPageResult = z.infer<typeof Schema.getPageResult>\n\nexport class MakeswiftClient extends MakeswiftRestAPIClient {\n private graphqlClient: MakeswiftGraphQLApiClient\n private runtime: ReactRuntimeCore\n\n constructor(\n apiKey: string,\n {\n runtime,\n }: {\n runtime: ReactRuntimeCore\n },\n ) {\n if (typeof apiKey !== 'string') {\n throw new Error(\n 'The Makeswift client must be passed a valid Makeswift site API key: ' +\n \"`new Makeswift('<makeswift_site_api_key>')`\\n\" +\n `Received \"${apiKey}\" instead.`,\n )\n }\n\n super({\n fetch: runtime.fetch,\n apiKey,\n apiOrigin: runtime.apiOrigin,\n })\n\n this.graphqlClient = new MakeswiftGraphQLApiClient({\n endpoint: runtime.graphqlApiEndpoint,\n })\n\n this.runtime = runtime\n }\n\n private getPagesInternal = async ({\n siteVersion = null,\n ...params\n }: {\n siteVersion?: SiteVersion | null\n } & GetPagesParams = {}): Promise<MakeswiftGetPagesResult> => {\n const queryParams = getPagesQueryParams(params)\n\n const response = await this.fetch(`v5/pages?${queryParams.toString()}`, siteVersion)\n if (!response.ok) {\n const body = await failedResponseBody(response)\n throw new RestApiClientError('Failed to get pages', response, {\n body: body,\n siteVersion,\n params,\n })\n }\n\n const result = await response.json()\n const parsedResponse = Schema.getPagesResult.safeParse(result)\n if (!parsedResponse.success) {\n throw new Error(\n `Failed to parse 'getPages' response: ${parsedResponse.error.errors.map(e => e.message).join('; ')}`,\n )\n }\n return parsedResponse.data\n }\n\n getPages = toIterablePaginationResult(this.getPagesInternal)\n\n async getPage(\n pathname: string,\n { siteVersion = null, locale }: { siteVersion?: SiteVersion | null; locale?: string } = {},\n ): Promise<GetPageResult | null> {\n const url = new URL(`v3/pages/${encodeURIComponent(pathname)}`, this.apiOrigin)\n if (locale) url.searchParams.set('locale', locale)\n\n const response = await this.fetch(url.pathname + url.search, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to get page snapshot for '${pathname}'`, response, {\n body: failedBody,\n siteVersion,\n locale,\n })\n }\n\n const json = await response.json()\n\n return Schema.getPageResult.parse(json)\n }\n\n private async getTypographies(\n typographyIds: string[],\n siteVersion: SiteVersion | null,\n ): Promise<(Typography | null)[]> {\n if (typographyIds.length === 0) return []\n\n const url = new URL(`v3/typographies/bulk`, this.apiOrigin)\n\n typographyIds.forEach(id => {\n url.searchParams.append('ids', id)\n })\n\n const response = await this.fetch(url.pathname + url.search, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return []\n\n throw new RestApiClientError(\n `Failed to get typographies for [${typographyIds.join(', ')}]`,\n response,\n { body: failedBody, siteVersion },\n )\n }\n\n const body = await response.json()\n\n return body\n }\n\n private async getSwatches(\n ids: string[],\n siteVersion: SiteVersion | null,\n ): Promise<(Swatch | null)[]> {\n if (ids.length === 0) return []\n\n const url = new URL(`v3/swatches/bulk`, this.apiOrigin)\n\n ids.forEach(id => {\n url.searchParams.append('ids', id)\n })\n\n const response = await this.fetch(url.pathname + url.search, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return []\n\n throw new RestApiClientError(`Failed to get swatches for ${ids.join(', ')}`, response, {\n body: failedBody,\n siteVersion,\n })\n }\n\n return await response.json()\n }\n\n private async getElementTreesBulk(\n ids: string[],\n siteVersion: SiteVersion | null,\n locale?: string,\n ): Promise<(MakeswiftComponentDocument | null)[]> {\n if (ids.length === 0) return []\n\n const requestBody: { ids: string[]; locale?: string } = { ids }\n if (locale != null) requestBody.locale = locale\n\n const response = await this.fetch('v0/element-trees/bulk', siteVersion, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n\n // 404 can mean the requested version has no commit (e.g., site never published)\n if (response.status === 404) return ids.map(() => null)\n\n throw new RestApiClientError(\n `Failed to get element trees for [${ids.join(', ')}]`,\n response,\n { body: failedBody, siteVersion, locale },\n )\n }\n\n const responseBody = await response.json()\n\n return responseBody.map((item: unknown) =>\n item != null ? Schema.componentDocument.parse(item) : null,\n )\n }\n\n private async getIntrospectedResources(\n {\n swatchIds,\n ...unversionedResourceIds\n }: UnversionedResourcesQueryVariables & { swatchIds: string[] },\n siteVersion: SiteVersion | null,\n ): Promise<UnversionedResourcesQueryResult & { swatches: (Swatch | null)[] }> {\n const unversionedResources =\n await this.graphqlClient.getUnversionedResources(unversionedResourceIds)\n\n const swatches = await this.getSwatches(swatchIds, siteVersion)\n\n return { ...unversionedResources, swatches }\n }\n\n // TODO: Consolidate this method with the introspectMany method once the\n // unstable_getComponentSnapshots method is stable and tested in production.\n private async introspect(\n element: Element,\n siteVersion: SiteVersion | null,\n locale: string | null,\n ): Promise<CacheData> {\n const descriptors = this.getElementDescriptors()\n const swatchIds = new Set<string>()\n const fileIds = new Set<string>()\n const typographyIds = new Set<string>()\n const tableIds = new Set<string>()\n const pageIds = new Set<string>()\n const globalElements = new Map<string, GlobalElement | null>()\n const localizedGlobalElements = new Map<string, LocalizedGlobalElement | null>()\n const localizedResourcesMap = new Map<string, string | null>()\n\n const remaining = [element]\n const seen = new Set<string>()\n let current: Element | undefined\n\n while ((current = remaining.pop())) {\n let element: ElementData\n\n if (isElementReference(current)) {\n const globalElementId = current.value\n const globalElement = await this.getGlobalElement(globalElementId, siteVersion)\n let elementData = globalElement?.data\n\n if (locale) {\n const localizedGlobalElement = await this.getLocalizedGlobalElement(\n globalElementId,\n locale,\n siteVersion,\n )\n\n if (localizedGlobalElement) {\n // Update the logic here when we can merge element trees\n elementData = localizedGlobalElement.data\n\n localizedResourcesMap.set(globalElementId, localizedGlobalElement.id)\n localizedGlobalElements.set(localizedGlobalElement.id, localizedGlobalElement)\n } else {\n // Record that this localized global element doesn't exist so the\n // client won't try to fetch it again (which would result in a 404).\n localizedResourcesMap.set(globalElementId, null)\n }\n }\n\n globalElements.set(globalElementId, globalElement)\n\n if (elementData == null) continue\n\n element = elementData as ElementData\n } else {\n element = current\n }\n\n const elementDescriptors = descriptors.get(element.type)\n\n if (elementDescriptors == null) continue\n\n getResourcesFromElementDescriptors(elementDescriptors, element.props)\n\n function getResourcesFromElementDescriptors(\n elementDescriptors: Record<string, PropControllerDescriptor>,\n props: ElementData['props'],\n ) {\n Object.entries(elementDescriptors).forEach(([propName, descriptor]) => {\n getSwatchIds(descriptor, props[propName]).forEach(swatchId => {\n swatchIds.add(swatchId)\n })\n\n getFileIds(descriptor, props[propName]).forEach(fileId => fileIds.add(fileId))\n\n getTypographyIds(descriptor, props[propName]).forEach(typographyId =>\n typographyIds.add(typographyId),\n )\n\n getTableIds(descriptor, props[propName]).forEach(tableId => tableIds.add(tableId))\n\n getPageIds(descriptor, props[propName]).forEach(pageId => pageIds.add(pageId))\n\n getElementChildren(descriptor, props[propName]).forEach(child => {\n if (!seen.has(child.key)) {\n seen.add(child.key)\n\n remaining.push(child)\n }\n })\n })\n }\n }\n\n const typographies = await this.getTypographies([...typographyIds], siteVersion)\n\n typographies.forEach(typography => {\n typography?.style.forEach(style => {\n const swatchId = style.value.color?.swatchId\n\n if (swatchId != null) swatchIds.add(swatchId)\n })\n })\n\n const pagePathnames = await this.getPagePathnameSlices([...pageIds], siteVersion, { locale })\n\n const { swatches, files, tables } = await this.getIntrospectedResources(\n {\n swatchIds: [...swatchIds],\n fileIds: [...fileIds],\n tableIds: [...tableIds],\n },\n siteVersion,\n )\n\n const apiResources = {\n [APIResourceType.Swatch]: [...swatchIds].map(id => ({\n id,\n value: swatches.find(swatch => swatch?.id === id) ?? null,\n })),\n [APIResourceType.File]: [...fileIds].map(id => ({\n id,\n value: files.find(file => file?.id === id) ?? null,\n })),\n [APIResourceType.Typography]: [...typographyIds].map(id => ({\n id,\n value: typographies.find(typography => typography?.id === id) ?? null,\n })),\n [APIResourceType.Table]: [...tableIds].map(id => ({\n id,\n value: tables.find(table => table?.id === id) ?? null,\n })),\n [APIResourceType.PagePathnameSlice]: [...pageIds].map(id => ({\n id,\n value: pagePathnames.find(pagePathnameSlice => pagePathnameSlice?.id === id) ?? null,\n locale,\n })),\n [APIResourceType.GlobalElement]: [...globalElements.entries()].map(([id, value]) => ({\n id,\n value,\n })),\n [APIResourceType.LocalizedGlobalElement]: [...localizedGlobalElements.entries()].map(\n ([id, value]) => ({\n id,\n value,\n locale,\n }),\n ),\n }\n\n return {\n apiResources,\n localizedResourcesMap:\n locale != null ? { [locale]: Object.fromEntries(localizedResourcesMap.entries()) } : {},\n }\n }\n\n private async introspectMany(\n trees: { id: string; data: Element }[],\n siteVersion: SiteVersion | null,\n locale: string | null,\n ): Promise<Map<string, CacheData>> {\n if (trees.length === 0) return new Map()\n\n const descriptors = this.getElementDescriptors()\n\n // Shared caches for global elements (deduplication across trees)\n const globalElementCache = new Map<string, GlobalElement | null>()\n const localizedGlobalElementCache = new Map<string, LocalizedGlobalElement | null>()\n\n // Per-tree tracking, keyed by tree ID\n const treeCaches = new Map(\n trees.map(tree => [\n tree.id,\n {\n data: tree.data,\n swatchIds: new Set<string>(),\n fileIds: new Set<string>(),\n typographyIds: new Set<string>(),\n tableIds: new Set<string>(),\n pageIds: new Set<string>(),\n globalElements: new Map<string, GlobalElement | null>(),\n localizedGlobalElements: new Map<string, LocalizedGlobalElement | null>(),\n localizedResourcesMap: new Map<string, string | null>(),\n },\n ]),\n )\n\n // DFS traversal per tree\n for (const currentTreeCache of treeCaches.values()) {\n const remaining = [currentTreeCache.data]\n const seen = new Set<string>()\n let current: Element | undefined\n\n while ((current = remaining.pop())) {\n let element: ElementData\n\n if (isElementReference(current)) {\n const globalElementId = current.value\n\n // Fetch global element, using cache if already fetched for another tree\n let globalElement: GlobalElement | null\n if (globalElementCache.has(globalElementId)) {\n globalElement = globalElementCache.get(globalElementId)!\n } else {\n globalElement = await this.getGlobalElement(globalElementId, siteVersion)\n globalElementCache.set(globalElementId, globalElement)\n }\n\n let elementData = globalElement?.data\n\n if (locale) {\n let localizedGlobalElement: LocalizedGlobalElement | null\n if (localizedGlobalElementCache.has(globalElementId)) {\n localizedGlobalElement = localizedGlobalElementCache.get(globalElementId)!\n } else {\n localizedGlobalElement = await this.getLocalizedGlobalElement(\n globalElementId,\n locale,\n siteVersion,\n )\n localizedGlobalElementCache.set(globalElementId, localizedGlobalElement)\n }\n\n if (localizedGlobalElement) {\n // Update the logic here when we can merge element trees\n elementData = localizedGlobalElement.data\n\n currentTreeCache.localizedResourcesMap.set(globalElementId, localizedGlobalElement.id)\n currentTreeCache.localizedGlobalElements.set(\n localizedGlobalElement.id,\n localizedGlobalElement,\n )\n } else {\n // Record that this localized global element doesn't exist so the\n // client won't try to fetch it again (which would result in a 404).\n currentTreeCache.localizedResourcesMap.set(globalElementId, null)\n }\n }\n\n currentTreeCache.globalElements.set(globalElementId, globalElement)\n\n if (elementData == null) continue\n\n element = elementData as ElementData\n } else {\n element = current\n }\n\n const elementDescriptors = descriptors.get(element.type)\n\n if (elementDescriptors == null) continue\n\n getResourcesFromElementDescriptors(elementDescriptors, element.props)\n\n function getResourcesFromElementDescriptors(\n elementDescriptors: Record<string, PropControllerDescriptor>,\n props: ElementData['props'],\n ) {\n Object.entries(elementDescriptors).forEach(([propName, descriptor]) => {\n getSwatchIds(descriptor, props[propName]).forEach(swatchId => {\n currentTreeCache.swatchIds.add(swatchId)\n })\n\n getFileIds(descriptor, props[propName]).forEach(fileId => {\n currentTreeCache.fileIds.add(fileId)\n })\n\n getTypographyIds(descriptor, props[propName]).forEach(typographyId => {\n currentTreeCache.typographyIds.add(typographyId)\n })\n\n getTableIds(descriptor, props[propName]).forEach(tableId => {\n currentTreeCache.tableIds.add(tableId)\n })\n\n getPageIds(descriptor, props[propName]).forEach(pageId => {\n currentTreeCache.pageIds.add(pageId)\n })\n\n getElementChildren(descriptor, props[propName]).forEach(child => {\n if (!seen.has(child.key)) {\n seen.add(child.key)\n remaining.push(child)\n }\n })\n })\n }\n }\n }\n\n // Accumulate shared sets from per-tree state for bulk calls\n const allSwatchIds = new Set<string>()\n const allFileIds = new Set<string>()\n const allTypographyIds = new Set<string>()\n const allTableIds = new Set<string>()\n const allPageIds = new Set<string>()\n\n for (const currentTreeCache of treeCaches.values()) {\n currentTreeCache.swatchIds.forEach(id => allSwatchIds.add(id))\n currentTreeCache.fileIds.forEach(id => allFileIds.add(id))\n currentTreeCache.typographyIds.forEach(id => allTypographyIds.add(id))\n currentTreeCache.tableIds.forEach(id => allTableIds.add(id))\n currentTreeCache.pageIds.forEach(id => allPageIds.add(id))\n }\n\n // One combined round of bulk sub-resource calls\n\n // 1. Fetch typographies first (needed for secondary swatch discovery)\n const typographies = await this.getTypographies([...allTypographyIds], siteVersion)\n\n // 2. Secondary discovery: check for additional swatch IDs in typography styles\n typographies.forEach(typography => {\n if (typography == null) return\n\n const secondarySwatchIds: string[] = []\n typography.style.forEach(style => {\n const swatchId = style.value.color?.swatchId\n if (swatchId != null) {\n secondarySwatchIds.push(swatchId)\n allSwatchIds.add(swatchId)\n }\n })\n\n if (secondarySwatchIds.length > 0) {\n // Add discovered swatches to per-tree sets for trees that reference this typography\n for (const currentTreeCache of treeCaches.values()) {\n if (currentTreeCache.typographyIds.has(typography.id)) {\n secondarySwatchIds.forEach(id => currentTreeCache.swatchIds.add(id))\n }\n }\n }\n })\n\n // 3. Fetch remaining resources in parallel\n const [pagePathnames, { swatches, files, tables }] = await Promise.all([\n this.getPagePathnameSlices([...allPageIds], siteVersion, { locale }),\n this.getIntrospectedResources(\n {\n swatchIds: [...allSwatchIds],\n fileIds: [...allFileIds],\n tableIds: [...allTableIds],\n },\n siteVersion,\n ),\n ])\n\n // Build per-tree CacheData using only the resources that tree references\n const result = new Map<string, CacheData>()\n\n for (const [treeId, currentTreeCache] of treeCaches) {\n const apiResources = {\n [APIResourceType.Swatch]: [...currentTreeCache.swatchIds].map(id => ({\n id,\n value: swatches.find(swatch => swatch?.id === id) ?? null,\n })),\n [APIResourceType.File]: [...currentTreeCache.fileIds].map(id => ({\n id,\n value: files.find(file => file?.id === id) ?? null,\n })),\n [APIResourceType.Typography]: [...currentTreeCache.typographyIds].map(id => ({\n id,\n value: typographies.find(typography => typography?.id === id) ?? null,\n })),\n [APIResourceType.Table]: [...currentTreeCache.tableIds].map(id => ({\n id,\n value: tables.find(table => table?.id === id) ?? null,\n })),\n [APIResourceType.PagePathnameSlice]: [...currentTreeCache.pageIds].map(id => ({\n id,\n value: pagePathnames.find(pagePathnameSlice => pagePathnameSlice?.id === id) ?? null,\n locale,\n })),\n [APIResourceType.GlobalElement]: [...currentTreeCache.globalElements.entries()].map(\n ([id, value]) => ({\n id,\n value,\n }),\n ),\n [APIResourceType.LocalizedGlobalElement]: [\n ...currentTreeCache.localizedGlobalElements.entries(),\n ].map(([id, value]) => ({\n id,\n value,\n locale,\n })),\n }\n\n result.set(treeId, {\n apiResources,\n localizedResourcesMap:\n locale != null\n ? { [locale]: Object.fromEntries(currentTreeCache.localizedResourcesMap.entries()) }\n : {},\n })\n }\n\n return result\n }\n\n async getPageSnapshot(\n pathname: string,\n {\n siteVersion: siteVersionPromise,\n locale,\n allowLocaleFallback = true,\n }: {\n siteVersion: SiteVersion | null | Promise<SiteVersion | null>\n locale?: string\n allowLocaleFallback?: boolean\n },\n ): Promise<MakeswiftPageSnapshot | null> {\n const queryParams = (): string => {\n const params = new URLSearchParams()\n if (locale) params.set('locale', locale)\n if (allowLocaleFallback != null) params.set('allowLocaleFallback', `${allowLocaleFallback}`)\n return params.toString()\n }\n\n const siteVersion = await siteVersionPromise\n const response = await this.fetch(\n `v4/pages/${encodeURIComponent(pathname)}/document?${queryParams()}`,\n siteVersion,\n )\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to get page snapshot for '${pathname}'`, response, {\n body: failedBody,\n siteVersion,\n locale,\n })\n }\n\n const document: MakeswiftPageDocument = await response.json()\n const baseLocalizedPage = document.localizedPages.find(({ parentId }) => parentId == null)\n\n const cacheData = await this.introspect(\n baseLocalizedPage?.data ?? document.data,\n siteVersion,\n // The /v3/pages endpoint returns null for document.locale when the requested locale is the default.\n // This legacy behavior is set to change with the upcoming /v4/pages endpoint.\n // We rely on document.locale when reading from the API cache, so ensure the cache is built during\n // introspection using the same value.\n document.locale,\n )\n\n return {\n document,\n cacheData,\n }\n }\n\n async getComponentSnapshot(\n id: string,\n {\n siteVersion: siteVersionPromise,\n locale,\n allowLocaleFallback = true,\n unstable_enforceSuccess = false,\n }: {\n siteVersion: SiteVersion | null | Promise<SiteVersion | null>\n locale?: string\n allowLocaleFallback?: boolean\n unstable_enforceSuccess?: boolean\n },\n ): Promise<MakeswiftComponentSnapshot> {\n const siteVersion = await siteVersionPromise\n const key = deterministicUUID({ id, locale, seed: this.apiKey.split('-').at(0) })\n const baseLocaleWasRequested = locale == null\n const canAttemptLocaleFallback = !baseLocaleWasRequested && allowLocaleFallback\n\n const parseElementTreeResponse = async (\n response: Response,\n ): Promise<MakeswiftComponentDocument | null> => {\n if (!response.ok) {\n // See comment on `failedResponseBody` for why we always consume the\n // response body of failed responses.\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) {\n return null\n }\n\n throw new RestApiClientError(`Failed to get component snapshot for '${id}'`, response, {\n body: failedBody,\n siteVersion,\n locale,\n })\n }\n\n const responseBody = await response.json()\n const parsed = Schema.componentDocumentResponse.parse(responseBody)\n if ('notFound' in parsed) return null\n return parsed\n }\n\n const getElementTree = async (\n searchParams: URLSearchParams,\n ): Promise<MakeswiftComponentDocument | null> => {\n const response = await this.fetch(\n `v2/element-trees/${encodeURIComponent(id)}?${searchParams.toString()}`,\n siteVersion,\n )\n return await parseElementTreeResponse(response)\n }\n\n const getPrimaryTree = async (): Promise<MakeswiftComponentDocument | null> => {\n const searchParams = new URLSearchParams()\n if (locale) searchParams.set('locale', locale)\n if (unstable_enforceSuccess) searchParams.set('unstable_enforceSuccess', 'true')\n return await getElementTree(searchParams)\n }\n\n const getFallbackTree = async (): Promise<MakeswiftComponentDocument | null> => {\n const searchParams = new URLSearchParams()\n if (unstable_enforceSuccess) searchParams.set('unstable_enforceSuccess', 'true')\n return await getElementTree(searchParams)\n }\n\n const primaryTree = await getPrimaryTree()\n\n const result =\n primaryTree == null && canAttemptLocaleFallback ? await getFallbackTree() : primaryTree\n\n if (result == null) {\n return {\n document: {\n id,\n locale: locale ?? null,\n data: null,\n },\n key,\n cacheData: CacheData.empty(),\n meta: {\n allowLocaleFallback,\n requestedLocale: locale ?? null,\n },\n }\n }\n\n const document = result\n const cacheData = await this.introspect(document.data, siteVersion, document.locale)\n\n return {\n document,\n cacheData,\n key,\n meta: {\n allowLocaleFallback,\n requestedLocale: locale ?? null,\n },\n }\n }\n\n /**\n * Fetches multiple component snapshots in a single bulk request with unified introspection.\n *\n * @param ids - Element tree IDs to fetch. Maximum 100 IDs per call.\n */\n // TODO: Make getComponentSnapshot use this method under the hood once the v0 bulk endpoint is stable.\n async unstable_getComponentSnapshots(\n ids: string[],\n {\n siteVersion: siteVersionPromise,\n locale,\n allowLocaleFallback = true,\n }: {\n siteVersion: SiteVersion | null | Promise<SiteVersion | null>\n locale?: string\n allowLocaleFallback?: boolean\n },\n ): Promise<MakeswiftComponentSnapshot[]> {\n if (ids.length === 0) return []\n const siteVersion = await siteVersionPromise\n\n // Step 1: Bulk fetch\n let documents = await this.getElementTreesBulk(ids, siteVersion, locale)\n\n // Step 2: Locale fallback — second-pass for IDs that returned null\n const baseLocaleWasRequested = locale == null\n const canAttemptLocaleFallback = !baseLocaleWasRequested && allowLocaleFallback\n const fallbackIndices: number[] = []\n\n if (canAttemptLocaleFallback) {\n documents.forEach((doc, i) => {\n if (doc == null) fallbackIndices.push(i)\n })\n\n if (fallbackIndices.length > 0) {\n const fallbackIds = fallbackIndices.map(i => ids[i])\n const fallbackDocuments = await this.getElementTreesBulk(fallbackIds, siteVersion)\n\n fallbackIndices.forEach((originalIndex, fallbackIndex) => {\n documents[originalIndex] = fallbackDocuments[fallbackIndex]\n })\n }\n }\n\n // Step 3: Unified introspection for all trees that have data\n const treesToIntrospect = documents\n .map(doc => (doc?.data != null ? { id: doc.id, data: doc.data } : null))\n .filter(isNonNullable)\n\n const cacheDataMap = await this.introspectMany(treesToIntrospect, siteVersion, locale ?? null)\n\n // Step 4: Build per-component results\n return ids.map((id, i) => {\n const document = documents[i]\n const key = deterministicUUID({ id, locale, seed: this.apiKey.split('-').at(0) })\n\n if (document == null || document.data == null) {\n return {\n document: { id, locale: locale ?? null, data: null },\n key,\n cacheData: CacheData.empty(),\n meta: { allowLocaleFallback, requestedLocale: locale ?? null },\n }\n }\n\n return {\n document,\n key,\n cacheData: cacheDataMap.get(id) ?? CacheData.empty(),\n meta: { allowLocaleFallback, requestedLocale: locale ?? null },\n }\n })\n }\n\n async getFile(fileId: string): Promise<File | null> {\n return this.graphqlClient.getFile(fileId)\n }\n\n async getTable(tableId: string): Promise<Table | null> {\n return this.graphqlClient.getTable(tableId)\n }\n\n getTranslatableData(elementTree: ElementData): Record<string, Data> {\n return getTranslatableContent(this.getElementDescriptors(), elementTree)\n }\n\n mergeTranslatedData(elementTree: ElementData, translatedData: Record<string, Data>): Element {\n return mergeTranslatedContent(this.getElementDescriptors(), elementTree, translatedData)\n }\n\n async readPreviewToken(token: string): Promise<PreviewTokenPayload | null> {\n const response = await this.fetch('v1/preview-tokens/reads', null, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ token }),\n cache: 'no-store',\n })\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 401) {\n console.error(`Preview token is invalid or expired`, {\n response: failedBody,\n })\n\n return null\n }\n\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to verify preview token`, response, {\n body: failedBody,\n })\n }\n\n const json = await response.json()\n\n const parsed = Schema.previewTokenPayload.safeParse(json)\n if (!parsed.success) {\n throw new Error(\n `Failed to parse preview token payload: ${parsed.error.errors.map(e => e.message).join('; ')}`,\n )\n }\n\n return parsed.data\n }\n\n async unstable_getFonts(siteVersion: SiteVersion | null = null): Promise<GetFontsAPI | null> {\n const response = await this.fetch('v1_unstable/fonts', siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError('Failed to fetch fonts', response, {\n body: failedBody,\n siteVersion,\n })\n }\n\n const json = await response.json()\n\n const parsed = Schema.fonts.safeParse(json)\n if (!parsed.success) {\n console.error('Failed to parse fonts API response', {\n response: json,\n siteVersion,\n })\n\n return null\n }\n\n return parsed.data\n }\n\n private getElementDescriptors() {\n return getPropControllerDescriptors(this.runtime.protoStore.getState())\n }\n}\n\nfunction getPagesQueryParams({\n limit = 100,\n after,\n sortBy,\n sortDirection,\n includeOffline,\n pathPrefix,\n locale,\n}: GetPagesParams): URLSearchParams {\n const params = new URLSearchParams()\n\n if (limit != null) params.set('limit', limit.toString())\n if (after != null) params.set('after', after)\n if (sortBy != null) params.set('sortBy', sortBy)\n if (sortDirection != null) params.set('sortDirection', sortDirection)\n if (includeOffline != null) params.set('includeOffline', includeOffline.toString())\n if (pathPrefix != null) params.set('pathPrefix', pathPrefix)\n if (locale != null) params.set('locale', locale)\n\n return params\n}\n"],"mappings":"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","names":["getResourcesFromElementDescriptors","elementDescriptors","element"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/client/index.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport {\n type UnversionedResourcesQueryResult,\n type UnversionedResourcesQueryVariables,\n} from '../api/graphql/generated/types'\n\nimport {\n APIResourceType,\n type GlobalElement,\n type LocalizedGlobalElement,\n type Swatch,\n type Table,\n type Typography,\n} from '../api/types'\n\nimport { CacheData } from '../api/api-resources-client'\n\nimport { MakeswiftGraphQLApiClient } from '../api/graphql-api-client'\nimport {\n MakeswiftRestAPIClient,\n failedResponseBody,\n RestApiClientError,\n} from '../api/rest-api-client'\nimport { type SiteVersion } from '../api/site-version'\n\nimport { Descriptor as PropControllerDescriptor } from '../prop-controllers/descriptors'\nimport {\n getElementChildren,\n getSwatchIds,\n getFileIds,\n getPageIds,\n getTableIds,\n getTypographyIds,\n} from '../prop-controllers/introspection'\n\nimport { type ReactRuntimeCore } from '../runtimes/react/react-runtime-core'\n\nimport {\n type Element,\n type ElementData,\n type Data,\n getPropControllerDescriptors,\n isElementReference,\n} from '../state/read-only-state'\n\nimport { mergeTranslatedContent } from '../state/translations/merge'\nimport { getTranslatableContent } from '../state/translations/get'\n\nimport { deterministicUUID } from '../utils/deterministic-uuid'\nimport { toIterablePaginationResult } from '../utils/pagination'\nimport { isNonNullable } from '../utils/isNonNullable'\n\nimport {\n type MakeswiftComponentDocument,\n type MakeswiftComponentSnapshot,\n} from './component-snapshot'\n\nimport { type MakeswiftPageDocument, type MakeswiftPageSnapshot } from './page-snapshot'\n\nimport * as Schema from './schema'\n\nexport { SnippetLocation } from '../api/graphql/generated/types'\n\n// TODO: clean up the exports below, as most of them are for internal consumptions only\n// and should not be publicly exposed\nexport {\n type MakeswiftComponentDocument,\n type MakeswiftComponentDocumentFallback,\n type MakeswiftComponentSnapshot,\n type MakeswiftComponentMetadata as MakeswiftComponentSnapshotMetadata,\n componentDocumentToRootEmbeddedDocument,\n} from './component-snapshot'\n\nexport {\n type Snippet,\n type Font,\n type MakeswiftPageDocument,\n type MakeswiftPageSnapshot,\n pageToRootDocument,\n} from './page-snapshot'\n\n// TODO: remove, leftover from the `getSitemap` method removed in 0.25.0:\n// https://github.com/makeswift/makeswift/releases/tag/%40makeswift%2Fruntime%400.25.0\nexport type Sitemap = {\n id: string\n loc: string\n lastmod?: string\n changefreq?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n priority?: number\n alternateRefs?: {\n hreflang: string\n href: string\n }[]\n}[]\n\nexport type MakeswiftPage = z.infer<typeof Schema.pageData>\nexport type MakeswiftGetPagesResult = z.infer<typeof Schema.getPagesResult>\nexport type PreviewTokenPayload = z.infer<typeof Schema.previewTokenPayload>\nexport type GetFontsAPI = z.infer<typeof Schema.fonts>\n\ntype GetPagesParams = z.infer<typeof Schema.getPagesParams>\ntype GetPageResult = z.infer<typeof Schema.getPageResult>\n\nexport class MakeswiftClient extends MakeswiftRestAPIClient {\n private graphqlClient: MakeswiftGraphQLApiClient\n private runtime: ReactRuntimeCore\n\n constructor(\n apiKey: string,\n {\n runtime,\n }: {\n runtime: ReactRuntimeCore\n },\n ) {\n if (typeof apiKey !== 'string') {\n throw new Error(\n 'The Makeswift client must be passed a valid Makeswift site API key: ' +\n \"`new Makeswift('<makeswift_site_api_key>')`\\n\" +\n `Received \"${apiKey}\" instead.`,\n )\n }\n\n super({\n fetch: runtime.fetch,\n apiKey,\n apiOrigin: runtime.apiOrigin,\n })\n\n this.graphqlClient = new MakeswiftGraphQLApiClient({\n endpoint: runtime.graphqlApiEndpoint,\n })\n\n this.runtime = runtime\n }\n\n private getPagesInternal = async ({\n siteVersion = null,\n ...params\n }: {\n siteVersion?: SiteVersion | null\n } & GetPagesParams = {}): Promise<MakeswiftGetPagesResult> => {\n const queryParams = getPagesQueryParams(params)\n\n const response = await this.fetch(`v5/pages?${queryParams.toString()}`, siteVersion)\n if (!response.ok) {\n const body = await failedResponseBody(response)\n throw new RestApiClientError('Failed to get pages', response, {\n body: body,\n siteVersion,\n params,\n })\n }\n\n const result = await response.json()\n const parsedResponse = Schema.getPagesResult.safeParse(result)\n if (!parsedResponse.success) {\n throw new Error(\n `Failed to parse 'getPages' response: ${parsedResponse.error.errors.map(e => e.message).join('; ')}`,\n )\n }\n return parsedResponse.data\n }\n\n getPages = toIterablePaginationResult(this.getPagesInternal)\n\n async getPage(\n pathname: string,\n { siteVersion = null, locale }: { siteVersion?: SiteVersion | null; locale?: string } = {},\n ): Promise<GetPageResult | null> {\n const url = new URL(`v3/pages/${encodeURIComponent(pathname)}`, this.apiOrigin)\n if (locale) url.searchParams.set('locale', locale)\n\n const response = await this.fetch(url.pathname + url.search, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to get page snapshot for '${pathname}'`, response, {\n body: failedBody,\n siteVersion,\n locale,\n })\n }\n\n const json = await response.json()\n\n return Schema.getPageResult.parse(json)\n }\n\n private async getTypographies(\n typographyIds: string[],\n siteVersion: SiteVersion | null,\n ): Promise<(Typography | null)[]> {\n if (typographyIds.length === 0) return []\n\n const url = new URL(`v3/typographies/bulk`, this.apiOrigin)\n\n typographyIds.forEach(id => {\n url.searchParams.append('ids', id)\n })\n\n const response = await this.fetch(url.pathname + url.search, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return []\n\n throw new RestApiClientError(\n `Failed to get typographies for [${typographyIds.join(', ')}]`,\n response,\n { body: failedBody, siteVersion },\n )\n }\n\n const body = await response.json()\n\n return body\n }\n\n private async getSwatches(\n ids: string[],\n siteVersion: SiteVersion | null,\n ): Promise<(Swatch | null)[]> {\n if (ids.length === 0) return []\n\n const url = new URL(`v3/swatches/bulk`, this.apiOrigin)\n\n ids.forEach(id => {\n url.searchParams.append('ids', id)\n })\n\n const response = await this.fetch(url.pathname + url.search, siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return []\n\n throw new RestApiClientError(`Failed to get swatches for ${ids.join(', ')}`, response, {\n body: failedBody,\n siteVersion,\n })\n }\n\n return await response.json()\n }\n\n private async getElementTreesBulk(\n ids: string[],\n siteVersion: SiteVersion | null,\n locale?: string,\n ): Promise<(MakeswiftComponentDocument | null)[]> {\n if (ids.length === 0) return []\n\n const requestBody: { ids: string[]; locale?: string } = { ids }\n if (locale != null) requestBody.locale = locale\n\n const response = await this.fetch('v0/element-trees/bulk', siteVersion, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n\n // 404 can mean the requested version has no commit (e.g., site never published)\n if (response.status === 404) return ids.map(() => null)\n\n throw new RestApiClientError(\n `Failed to get element trees for [${ids.join(', ')}]`,\n response,\n { body: failedBody, siteVersion, locale },\n )\n }\n\n const responseBody = await response.json()\n\n return responseBody.map((item: unknown) =>\n item != null ? Schema.componentDocument.parse(item) : null,\n )\n }\n\n private async getIntrospectedResources(\n {\n swatchIds,\n ...unversionedResourceIds\n }: UnversionedResourcesQueryVariables & { swatchIds: string[] },\n siteVersion: SiteVersion | null,\n ): Promise<UnversionedResourcesQueryResult & { swatches: (Swatch | null)[] }> {\n const unversionedResources =\n await this.graphqlClient.getUnversionedResources(unversionedResourceIds)\n\n const swatches = await this.getSwatches(swatchIds, siteVersion)\n\n return { ...unversionedResources, swatches }\n }\n\n // TODO: Consolidate this method with the introspectMany method once the\n // unstable_getComponentSnapshots method is stable and tested in production.\n private async introspect(\n element: Element,\n siteVersion: SiteVersion | null,\n locale: string | null,\n ): Promise<CacheData> {\n const descriptors = this.getElementDescriptors()\n const swatchIds = new Set<string>()\n const fileIds = new Set<string>()\n const typographyIds = new Set<string>()\n const tableIds = new Set<string>()\n const pageIds = new Set<string>()\n const globalElements = new Map<string, GlobalElement | null>()\n const localizedGlobalElements = new Map<string, LocalizedGlobalElement | null>()\n const localizedResourcesMap = new Map<string, string | null>()\n\n const remaining = [element]\n const seen = new Set<string>()\n let current: Element | undefined\n\n while ((current = remaining.pop())) {\n let element: ElementData\n\n if (isElementReference(current)) {\n const globalElementId = current.value\n const globalElement = await this.getGlobalElement(globalElementId, siteVersion)\n let elementData = globalElement?.data\n\n if (locale) {\n const localizedGlobalElement = await this.getLocalizedGlobalElement(\n globalElementId,\n locale,\n siteVersion,\n )\n\n if (localizedGlobalElement) {\n // Update the logic here when we can merge element trees\n elementData = localizedGlobalElement.data\n\n localizedResourcesMap.set(globalElementId, localizedGlobalElement.id)\n localizedGlobalElements.set(localizedGlobalElement.id, localizedGlobalElement)\n } else {\n // Record that this localized global element doesn't exist so the\n // client won't try to fetch it again (which would result in a 404).\n localizedResourcesMap.set(globalElementId, null)\n }\n }\n\n globalElements.set(globalElementId, globalElement)\n\n if (elementData == null) continue\n\n element = elementData as ElementData\n } else {\n element = current\n }\n\n const elementDescriptors = descriptors.get(element.type)\n\n if (elementDescriptors == null) continue\n\n getResourcesFromElementDescriptors(elementDescriptors, element.props)\n\n function getResourcesFromElementDescriptors(\n elementDescriptors: Record<string, PropControllerDescriptor>,\n props: ElementData['props'],\n ) {\n Object.entries(elementDescriptors).forEach(([propName, descriptor]) => {\n getSwatchIds(descriptor, props[propName]).forEach(swatchId => {\n swatchIds.add(swatchId)\n })\n\n getFileIds(descriptor, props[propName]).forEach(fileId => fileIds.add(fileId))\n\n getTypographyIds(descriptor, props[propName]).forEach(typographyId =>\n typographyIds.add(typographyId),\n )\n\n getTableIds(descriptor, props[propName]).forEach(tableId => tableIds.add(tableId))\n\n getPageIds(descriptor, props[propName]).forEach(pageId => pageIds.add(pageId))\n\n getElementChildren(descriptor, props[propName]).forEach(child => {\n if (!seen.has(child.key)) {\n seen.add(child.key)\n\n remaining.push(child)\n }\n })\n })\n }\n }\n\n const typographies = await this.getTypographies([...typographyIds], siteVersion)\n\n typographies.forEach(typography => {\n typography?.style.forEach(style => {\n const swatchId = style.value.color?.swatchId\n\n if (swatchId != null) swatchIds.add(swatchId)\n })\n })\n\n const pagePathnames = await this.getPagePathnameSlices([...pageIds], siteVersion, { locale })\n\n const { swatches, files, tables } = await this.getIntrospectedResources(\n {\n swatchIds: [...swatchIds],\n fileIds: [...fileIds],\n tableIds: [...tableIds],\n },\n siteVersion,\n )\n\n const apiResources = {\n [APIResourceType.Swatch]: [...swatchIds].map(id => ({\n id,\n value: swatches.find(swatch => swatch?.id === id) ?? null,\n })),\n [APIResourceType.File]: [...fileIds].map(id => ({\n id,\n value: files.find(file => file?.id === id) ?? null,\n })),\n [APIResourceType.Typography]: [...typographyIds].map(id => ({\n id,\n value: typographies.find(typography => typography?.id === id) ?? null,\n })),\n [APIResourceType.Table]: [...tableIds].map(id => ({\n id,\n value: tables.find(table => table?.id === id) ?? null,\n })),\n [APIResourceType.PagePathnameSlice]: [...pageIds].map(id => ({\n id,\n value: pagePathnames.find(pagePathnameSlice => pagePathnameSlice?.id === id) ?? null,\n locale,\n })),\n [APIResourceType.GlobalElement]: [...globalElements.entries()].map(([id, value]) => ({\n id,\n value,\n })),\n [APIResourceType.LocalizedGlobalElement]: [...localizedGlobalElements.entries()].map(\n ([id, value]) => ({\n id,\n value,\n locale,\n }),\n ),\n }\n\n return {\n apiResources,\n localizedResourcesMap:\n locale != null ? { [locale]: Object.fromEntries(localizedResourcesMap.entries()) } : {},\n }\n }\n\n private async introspectMany(\n trees: { id: string; data: Element }[],\n siteVersion: SiteVersion | null,\n locale: string | null,\n ): Promise<Map<string, CacheData>> {\n if (trees.length === 0) return new Map()\n\n const descriptors = this.getElementDescriptors()\n\n // Shared caches for global elements (deduplication across trees)\n const globalElementCache = new Map<string, GlobalElement | null>()\n const localizedGlobalElementCache = new Map<string, LocalizedGlobalElement | null>()\n\n // Per-tree tracking, keyed by tree ID\n const treeCaches = new Map(\n trees.map(tree => [\n tree.id,\n {\n data: tree.data,\n swatchIds: new Set<string>(),\n fileIds: new Set<string>(),\n typographyIds: new Set<string>(),\n tableIds: new Set<string>(),\n pageIds: new Set<string>(),\n globalElements: new Map<string, GlobalElement | null>(),\n localizedGlobalElements: new Map<string, LocalizedGlobalElement | null>(),\n localizedResourcesMap: new Map<string, string | null>(),\n },\n ]),\n )\n\n // DFS traversal per tree\n for (const currentTreeCache of treeCaches.values()) {\n const remaining = [currentTreeCache.data]\n const seen = new Set<string>()\n let current: Element | undefined\n\n while ((current = remaining.pop())) {\n let element: ElementData\n\n if (isElementReference(current)) {\n const globalElementId = current.value\n\n // Fetch global element, using cache if already fetched for another tree\n let globalElement: GlobalElement | null\n if (globalElementCache.has(globalElementId)) {\n globalElement = globalElementCache.get(globalElementId)!\n } else {\n globalElement = await this.getGlobalElement(globalElementId, siteVersion)\n globalElementCache.set(globalElementId, globalElement)\n }\n\n let elementData = globalElement?.data\n\n if (locale) {\n let localizedGlobalElement: LocalizedGlobalElement | null\n if (localizedGlobalElementCache.has(globalElementId)) {\n localizedGlobalElement = localizedGlobalElementCache.get(globalElementId)!\n } else {\n localizedGlobalElement = await this.getLocalizedGlobalElement(\n globalElementId,\n locale,\n siteVersion,\n )\n localizedGlobalElementCache.set(globalElementId, localizedGlobalElement)\n }\n\n if (localizedGlobalElement) {\n // Update the logic here when we can merge element trees\n elementData = localizedGlobalElement.data\n\n currentTreeCache.localizedResourcesMap.set(globalElementId, localizedGlobalElement.id)\n currentTreeCache.localizedGlobalElements.set(\n localizedGlobalElement.id,\n localizedGlobalElement,\n )\n } else {\n // Record that this localized global element doesn't exist so the\n // client won't try to fetch it again (which would result in a 404).\n currentTreeCache.localizedResourcesMap.set(globalElementId, null)\n }\n }\n\n currentTreeCache.globalElements.set(globalElementId, globalElement)\n\n if (elementData == null) continue\n\n element = elementData as ElementData\n } else {\n element = current\n }\n\n const elementDescriptors = descriptors.get(element.type)\n\n if (elementDescriptors == null) continue\n\n getResourcesFromElementDescriptors(elementDescriptors, element.props)\n\n function getResourcesFromElementDescriptors(\n elementDescriptors: Record<string, PropControllerDescriptor>,\n props: ElementData['props'],\n ) {\n Object.entries(elementDescriptors).forEach(([propName, descriptor]) => {\n getSwatchIds(descriptor, props[propName]).forEach(swatchId => {\n currentTreeCache.swatchIds.add(swatchId)\n })\n\n getFileIds(descriptor, props[propName]).forEach(fileId => {\n currentTreeCache.fileIds.add(fileId)\n })\n\n getTypographyIds(descriptor, props[propName]).forEach(typographyId => {\n currentTreeCache.typographyIds.add(typographyId)\n })\n\n getTableIds(descriptor, props[propName]).forEach(tableId => {\n currentTreeCache.tableIds.add(tableId)\n })\n\n getPageIds(descriptor, props[propName]).forEach(pageId => {\n currentTreeCache.pageIds.add(pageId)\n })\n\n getElementChildren(descriptor, props[propName]).forEach(child => {\n if (!seen.has(child.key)) {\n seen.add(child.key)\n remaining.push(child)\n }\n })\n })\n }\n }\n }\n\n // Accumulate shared sets from per-tree state for bulk calls\n const allSwatchIds = new Set<string>()\n const allFileIds = new Set<string>()\n const allTypographyIds = new Set<string>()\n const allTableIds = new Set<string>()\n const allPageIds = new Set<string>()\n\n for (const currentTreeCache of treeCaches.values()) {\n currentTreeCache.swatchIds.forEach(id => allSwatchIds.add(id))\n currentTreeCache.fileIds.forEach(id => allFileIds.add(id))\n currentTreeCache.typographyIds.forEach(id => allTypographyIds.add(id))\n currentTreeCache.tableIds.forEach(id => allTableIds.add(id))\n currentTreeCache.pageIds.forEach(id => allPageIds.add(id))\n }\n\n // One combined round of bulk sub-resource calls\n\n // 1. Fetch typographies first (needed for secondary swatch discovery)\n const typographies = await this.getTypographies([...allTypographyIds], siteVersion)\n\n // 2. Secondary discovery: check for additional swatch IDs in typography styles\n typographies.forEach(typography => {\n if (typography == null) return\n\n const secondarySwatchIds: string[] = []\n typography.style.forEach(style => {\n const swatchId = style.value.color?.swatchId\n if (swatchId != null) {\n secondarySwatchIds.push(swatchId)\n allSwatchIds.add(swatchId)\n }\n })\n\n if (secondarySwatchIds.length > 0) {\n // Add discovered swatches to per-tree sets for trees that reference this typography\n for (const currentTreeCache of treeCaches.values()) {\n if (currentTreeCache.typographyIds.has(typography.id)) {\n secondarySwatchIds.forEach(id => currentTreeCache.swatchIds.add(id))\n }\n }\n }\n })\n\n // 3. Fetch remaining resources in parallel\n const [pagePathnames, { swatches, files, tables }] = await Promise.all([\n this.getPagePathnameSlices([...allPageIds], siteVersion, { locale }),\n this.getIntrospectedResources(\n {\n swatchIds: [...allSwatchIds],\n fileIds: [...allFileIds],\n tableIds: [...allTableIds],\n },\n siteVersion,\n ),\n ])\n\n // Build per-tree CacheData using only the resources that tree references\n const result = new Map<string, CacheData>()\n\n for (const [treeId, currentTreeCache] of treeCaches) {\n const apiResources = {\n [APIResourceType.Swatch]: [...currentTreeCache.swatchIds].map(id => ({\n id,\n value: swatches.find(swatch => swatch?.id === id) ?? null,\n })),\n [APIResourceType.File]: [...currentTreeCache.fileIds].map(id => ({\n id,\n value: files.find(file => file?.id === id) ?? null,\n })),\n [APIResourceType.Typography]: [...currentTreeCache.typographyIds].map(id => ({\n id,\n value: typographies.find(typography => typography?.id === id) ?? null,\n })),\n [APIResourceType.Table]: [...currentTreeCache.tableIds].map(id => ({\n id,\n value: tables.find(table => table?.id === id) ?? null,\n })),\n [APIResourceType.PagePathnameSlice]: [...currentTreeCache.pageIds].map(id => ({\n id,\n value: pagePathnames.find(pagePathnameSlice => pagePathnameSlice?.id === id) ?? null,\n locale,\n })),\n [APIResourceType.GlobalElement]: [...currentTreeCache.globalElements.entries()].map(\n ([id, value]) => ({\n id,\n value,\n }),\n ),\n [APIResourceType.LocalizedGlobalElement]: [\n ...currentTreeCache.localizedGlobalElements.entries(),\n ].map(([id, value]) => ({\n id,\n value,\n locale,\n })),\n }\n\n result.set(treeId, {\n apiResources,\n localizedResourcesMap:\n locale != null\n ? { [locale]: Object.fromEntries(currentTreeCache.localizedResourcesMap.entries()) }\n : {},\n })\n }\n\n return result\n }\n\n async getPageSnapshot(\n pathname: string,\n {\n siteVersion: siteVersionPromise,\n locale,\n allowLocaleFallback = true,\n }: {\n siteVersion: SiteVersion | null | Promise<SiteVersion | null>\n locale?: string\n allowLocaleFallback?: boolean\n },\n ): Promise<MakeswiftPageSnapshot | null> {\n const queryParams = (): string => {\n const params = new URLSearchParams()\n if (locale) params.set('locale', locale)\n if (allowLocaleFallback != null) params.set('allowLocaleFallback', `${allowLocaleFallback}`)\n return params.toString()\n }\n\n const siteVersion = await siteVersionPromise\n const response = await this.fetch(\n `v4/pages/${encodeURIComponent(pathname)}/document?${queryParams()}`,\n siteVersion,\n )\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to get page snapshot for '${pathname}'`, response, {\n body: failedBody,\n siteVersion,\n locale,\n })\n }\n\n const document: MakeswiftPageDocument = await response.json()\n const baseLocalizedPage = document.localizedPages.find(({ parentId }) => parentId == null)\n\n const cacheData = await this.introspect(\n baseLocalizedPage?.data ?? document.data,\n siteVersion,\n // The /v3/pages endpoint returns null for document.locale when the requested locale is the default.\n // This legacy behavior is set to change with the upcoming /v4/pages endpoint.\n // We rely on document.locale when reading from the API cache, so ensure the cache is built during\n // introspection using the same value.\n document.locale,\n )\n\n return {\n document,\n cacheData,\n }\n }\n\n async getComponentSnapshot(\n id: string,\n {\n siteVersion: siteVersionPromise,\n locale,\n allowLocaleFallback = true,\n unstable_enforceSuccess = false,\n }: {\n siteVersion: SiteVersion | null | Promise<SiteVersion | null>\n locale?: string\n allowLocaleFallback?: boolean\n unstable_enforceSuccess?: boolean\n },\n ): Promise<MakeswiftComponentSnapshot> {\n const siteVersion = await siteVersionPromise\n const key = deterministicUUID({ id, locale, seed: this.apiKey.split('-').at(0) })\n const baseLocaleWasRequested = locale == null\n const canAttemptLocaleFallback = !baseLocaleWasRequested && allowLocaleFallback\n\n const parseElementTreeResponse = async (\n response: Response,\n ): Promise<MakeswiftComponentDocument | null> => {\n if (!response.ok) {\n // See comment on `failedResponseBody` for why we always consume the\n // response body of failed responses.\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) {\n return null\n }\n\n throw new RestApiClientError(`Failed to get component snapshot for '${id}'`, response, {\n body: failedBody,\n siteVersion,\n locale,\n })\n }\n\n const responseBody = await response.json()\n const parsed = Schema.componentDocumentResponse.parse(responseBody)\n if ('notFound' in parsed) return null\n return parsed\n }\n\n const getElementTree = async (\n searchParams: URLSearchParams,\n ): Promise<MakeswiftComponentDocument | null> => {\n const response = await this.fetch(\n `v2/element-trees/${encodeURIComponent(id)}?${searchParams.toString()}`,\n siteVersion,\n )\n return await parseElementTreeResponse(response)\n }\n\n const getPrimaryTree = async (): Promise<MakeswiftComponentDocument | null> => {\n const searchParams = new URLSearchParams()\n if (locale) searchParams.set('locale', locale)\n if (unstable_enforceSuccess) searchParams.set('unstable_enforceSuccess', 'true')\n return await getElementTree(searchParams)\n }\n\n const getFallbackTree = async (): Promise<MakeswiftComponentDocument | null> => {\n const searchParams = new URLSearchParams()\n if (unstable_enforceSuccess) searchParams.set('unstable_enforceSuccess', 'true')\n return await getElementTree(searchParams)\n }\n\n const primaryTree = await getPrimaryTree()\n\n const result =\n primaryTree == null && canAttemptLocaleFallback ? await getFallbackTree() : primaryTree\n\n if (result == null) {\n return {\n document: {\n id,\n locale: locale ?? null,\n data: null,\n },\n key,\n cacheData: CacheData.empty(),\n meta: {\n allowLocaleFallback,\n requestedLocale: locale ?? null,\n },\n }\n }\n\n const document = result\n const cacheData = await this.introspect(document.data, siteVersion, document.locale)\n\n return {\n document,\n cacheData,\n key,\n meta: {\n allowLocaleFallback,\n requestedLocale: locale ?? null,\n },\n }\n }\n\n /**\n * Fetches multiple component snapshots in a single bulk request with unified introspection.\n *\n * @param ids - Element tree IDs to fetch. Maximum 100 IDs per call.\n */\n // TODO: Make getComponentSnapshot use this method under the hood once the v0 bulk endpoint is stable.\n async unstable_getComponentSnapshots(\n ids: string[],\n {\n siteVersion: siteVersionPromise,\n locale,\n allowLocaleFallback = true,\n }: {\n siteVersion: SiteVersion | null | Promise<SiteVersion | null>\n locale?: string\n allowLocaleFallback?: boolean\n },\n ): Promise<MakeswiftComponentSnapshot[]> {\n if (ids.length === 0) return []\n const siteVersion = await siteVersionPromise\n\n // Step 1: Bulk fetch\n let documents = await this.getElementTreesBulk(ids, siteVersion, locale)\n\n // Step 2: Locale fallback — second-pass for IDs that returned null\n const baseLocaleWasRequested = locale == null\n const canAttemptLocaleFallback = !baseLocaleWasRequested && allowLocaleFallback\n const fallbackIndices: number[] = []\n\n if (canAttemptLocaleFallback) {\n documents.forEach((doc, i) => {\n if (doc == null) fallbackIndices.push(i)\n })\n\n if (fallbackIndices.length > 0) {\n const fallbackIds = fallbackIndices.map(i => ids[i])\n const fallbackDocuments = await this.getElementTreesBulk(fallbackIds, siteVersion)\n\n fallbackIndices.forEach((originalIndex, fallbackIndex) => {\n documents[originalIndex] = fallbackDocuments[fallbackIndex]\n })\n }\n }\n\n // Step 3: Unified introspection for all trees that have data\n const treesToIntrospect = documents\n .map(doc => (doc?.data != null ? { id: doc.id, data: doc.data } : null))\n .filter(isNonNullable)\n\n const cacheDataMap = await this.introspectMany(treesToIntrospect, siteVersion, locale ?? null)\n\n // Step 4: Build per-component results\n return ids.map((id, i) => {\n const document = documents[i]\n const key = deterministicUUID({ id, locale, seed: this.apiKey.split('-').at(0) })\n\n if (document == null || document.data == null) {\n return {\n document: { id, locale: locale ?? null, data: null },\n key,\n cacheData: CacheData.empty(),\n meta: { allowLocaleFallback, requestedLocale: locale ?? null },\n }\n }\n\n return {\n document,\n key,\n cacheData: cacheDataMap.get(id) ?? CacheData.empty(),\n meta: { allowLocaleFallback, requestedLocale: locale ?? null },\n }\n })\n }\n\n async createTableRecord(\n tableId: string,\n columns: { columnId: string; data: unknown }[],\n ): Promise<void> {\n const response = await this.fetch('v1/table-records', null, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ tableId, columns }),\n })\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n\n throw new RestApiClientError(\n `Failed to create table record for table '${tableId}'`,\n response,\n {\n body: failedBody,\n tableId,\n },\n )\n }\n }\n\n async getTable(tableId: string): Promise<Table | null> {\n return this.graphqlClient.getTable(tableId)\n }\n\n getTranslatableData(elementTree: ElementData): Record<string, Data> {\n return getTranslatableContent(this.getElementDescriptors(), elementTree)\n }\n\n mergeTranslatedData(elementTree: ElementData, translatedData: Record<string, Data>): Element {\n return mergeTranslatedContent(this.getElementDescriptors(), elementTree, translatedData)\n }\n\n async readPreviewToken(token: string): Promise<PreviewTokenPayload | null> {\n const response = await this.fetch('v1/preview-tokens/reads', null, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ token }),\n cache: 'no-store',\n })\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 401) {\n console.error(`Preview token is invalid or expired`, {\n response: failedBody,\n })\n\n return null\n }\n\n if (response.status === 404) return null\n\n throw new RestApiClientError(`Failed to verify preview token`, response, {\n body: failedBody,\n })\n }\n\n const json = await response.json()\n\n const parsed = Schema.previewTokenPayload.safeParse(json)\n if (!parsed.success) {\n throw new Error(\n `Failed to parse preview token payload: ${parsed.error.errors.map(e => e.message).join('; ')}`,\n )\n }\n\n return parsed.data\n }\n\n async unstable_getFonts(siteVersion: SiteVersion | null = null): Promise<GetFontsAPI | null> {\n const response = await this.fetch('v1_unstable/fonts', siteVersion)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n if (response.status === 404) return null\n\n throw new RestApiClientError('Failed to fetch fonts', response, {\n body: failedBody,\n siteVersion,\n })\n }\n\n const json = await response.json()\n\n const parsed = Schema.fonts.safeParse(json)\n if (!parsed.success) {\n console.error('Failed to parse fonts API response', {\n response: json,\n siteVersion,\n })\n\n return null\n }\n\n return parsed.data\n }\n\n private getElementDescriptors() {\n return getPropControllerDescriptors(this.runtime.protoStore.getState())\n }\n}\n\nfunction getPagesQueryParams({\n limit = 100,\n after,\n sortBy,\n sortDirection,\n includeOffline,\n pathPrefix,\n locale,\n}: GetPagesParams): URLSearchParams {\n const params = new URLSearchParams()\n\n if (limit != null) params.set('limit', limit.toString())\n if (after != null) params.set('after', after)\n if (sortBy != null) params.set('sortBy', sortBy)\n if (sortDirection != null) params.set('sortDirection', sortDirection)\n if (includeOffline != null) params.set('includeOffline', includeOffline.toString())\n if (pathPrefix != null) params.set('pathPrefix', pathPrefix)\n if (locale != null) params.set('locale', locale)\n\n return params\n}\n"],"mappings":"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","names":["getResourcesFromElementDescriptors","elementDescriptors","element"]}
|
|
@@ -25,7 +25,7 @@ import { getBox } from "../../../state/modules/read-write/box-models";
|
|
|
25
25
|
import { useTableFormFieldRefs } from "../../hooks/useTableFormFieldRefs";
|
|
26
26
|
import { cx } from "@emotion/css";
|
|
27
27
|
import { useResponsiveGridItem, useResponsiveStyle } from "../../utils/responsive-style";
|
|
28
|
-
import {
|
|
28
|
+
import { useTableRecordClient } from "../../../runtimes/react/hooks/use-table-record-client";
|
|
29
29
|
import { useStyle } from "../../../runtimes/react/use-style";
|
|
30
30
|
import { useTable } from "../../../runtimes/react/hooks/makeswift-api";
|
|
31
31
|
const LOCAL_STORAGE_NAMESPACE = "@@makeswift/components/form";
|
|
@@ -181,7 +181,7 @@ const Form = forwardRef(function Form2({
|
|
|
181
181
|
const fields = useMemo(() => fieldsProp?.fields ?? [], [fieldsProp]);
|
|
182
182
|
const grid = useMemo(() => fieldsProp?.grid ?? [], [fieldsProp]);
|
|
183
183
|
const table = useTable(tableId ?? null);
|
|
184
|
-
const client =
|
|
184
|
+
const client = useTableRecordClient();
|
|
185
185
|
const [refEl, setRefEl] = useState(null);
|
|
186
186
|
const [propControllers, setPropControllers] = useState(null);
|
|
187
187
|
const [initialValues, setInitialValues] = useState(
|