@makeswift/runtime 0.29.3-canary.0 → 0.29.3-canary.2
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/api-resources-client.js +4 -2
- package/dist/cjs/api/api-resources-client.js.map +1 -1
- package/dist/cjs/api/graphql-api-client.js +1 -1
- package/dist/cjs/api/rest-api-client.js +40 -6
- package/dist/cjs/api/rest-api-client.js.map +1 -1
- package/dist/cjs/api/types.js.map +1 -1
- package/dist/cjs/api-handler/handlers/manifest.js +1 -1
- package/dist/cjs/client/index.js +22 -19
- package/dist/cjs/client/index.js.map +1 -1
- package/dist/cjs/components/builtin/Form/Form.js +1 -1
- package/dist/cjs/components/builtin/Form/Form.js.map +1 -1
- package/dist/cjs/components/builtin/Form/components/Field/index.js +2 -2
- package/dist/cjs/components/builtin/Form/components/Field/index.js.map +1 -1
- package/dist/cjs/components/builtin/Form/types.js.map +1 -1
- package/dist/cjs/next/components/tests/controls/color-control/fixtures.js +19 -0
- package/dist/cjs/next/components/tests/controls/color-control/fixtures.js.map +1 -1
- package/dist/esm/api/api-resources-client.js +2 -1
- package/dist/esm/api/api-resources-client.js.map +1 -1
- package/dist/esm/api/graphql-api-client.js +1 -1
- package/dist/esm/api/rest-api-client.js +40 -6
- package/dist/esm/api/rest-api-client.js.map +1 -1
- package/dist/esm/api/types.js.map +1 -1
- package/dist/esm/api-handler/handlers/manifest.js +1 -1
- package/dist/esm/client/index.js +13 -10
- package/dist/esm/client/index.js.map +1 -1
- package/dist/esm/components/builtin/Form/Form.js +1 -1
- package/dist/esm/components/builtin/Form/Form.js.map +1 -1
- package/dist/esm/components/builtin/Form/components/Field/index.js +2 -2
- package/dist/esm/components/builtin/Form/components/Field/index.js.map +1 -1
- package/dist/esm/next/components/tests/controls/color-control/fixtures.js +16 -0
- package/dist/esm/next/components/tests/controls/color-control/fixtures.js.map +1 -1
- package/dist/types/api/api-resources-client.d.ts +3 -0
- package/dist/types/api/api-resources-client.d.ts.map +1 -1
- package/dist/types/api/rest-api-client.d.ts +3 -0
- package/dist/types/api/rest-api-client.d.ts.map +1 -1
- package/dist/types/api/types.d.ts +9 -1
- package/dist/types/api/types.d.ts.map +1 -1
- package/dist/types/client/index.d.ts +0 -1
- package/dist/types/client/index.d.ts.map +1 -1
- package/dist/types/components/builtin/Form/types.d.ts +9 -9
- package/dist/types/components/builtin/Form/types.d.ts.map +1 -1
- package/dist/types/controls/rich-text-v2/rich-text-v2.d.ts +4 -4
- package/dist/types/next/components/tests/controls/color-control/fixtures.d.ts +36 -2
- package/dist/types/next/components/tests/controls/color-control/fixtures.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -29,7 +29,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
29
29
|
var api_resources_client_exports = {};
|
|
30
30
|
__export(api_resources_client_exports, {
|
|
31
31
|
ApiResourcesClient: () => ApiResourcesClient,
|
|
32
|
-
CacheData: () => CacheData
|
|
32
|
+
CacheData: () => CacheData,
|
|
33
|
+
withTypename: () => withTypename
|
|
33
34
|
});
|
|
34
35
|
module.exports = __toCommonJS(api_resources_client_exports);
|
|
35
36
|
var ApiClientState = __toESM(require("../state/api-client/state"));
|
|
@@ -208,6 +209,7 @@ function withTypename(typename, resource) {
|
|
|
208
209
|
// Annotate the CommonJS export names for ESM import in node:
|
|
209
210
|
0 && (module.exports = {
|
|
210
211
|
ApiResourcesClient,
|
|
211
|
-
CacheData
|
|
212
|
+
CacheData,
|
|
213
|
+
withTypename
|
|
212
214
|
});
|
|
213
215
|
//# sourceMappingURL=api-resources-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/api/api-resources-client.ts"],"sourcesContent":["import { type FetchableValue } from '@makeswift/controls'\n\nimport { type Store as ApiClientStore } from '../state/api-client/store'\nimport * as ApiClientState from '../state/api-client/state'\nimport { fetchAPIResource } from '../state/api-client/fetch-api-resource'\n\nimport {\n type File,\n type GlobalElement,\n type LocalizedGlobalElement,\n type Page,\n type PagePathnameSlice,\n type Site,\n type Snippet,\n type Swatch,\n type Table,\n type Typography,\n APIResourceType,\n} from './types'\n\nimport { type SiteVersion } from './site-version'\n\nexport type CacheData = ApiClientState.SerializedState\n\nexport const CacheData = {\n empty(): CacheData {\n return {\n apiResources: {},\n localizedResourcesMap: {},\n }\n },\n}\n\nexport abstract class ApiResourcesClient {\n readonly store: ApiClientStore\n readonly subscribe: ApiClientStore['subscribe']\n\n constructor({ store }: { store: ApiClientStore }) {\n this.store = store\n this.subscribe = this.store.subscribe\n }\n\n get cacheData(): CacheData {\n return ApiClientState.getSerializedState(this.store.getState())\n }\n\n async fetchSwatch(swatchId: string): Promise<Swatch | null> {\n const fetch = (id: string, version: SiteVersion | null) => this.fetchSwatchImpl(id, version)\n\n return await this.store.dispatch(fetchAPIResource(APIResourceType.Swatch, swatchId, fetch))\n }\n\n readSwatch(swatchId: string): Swatch | null {\n return ApiClientState.getAPIResource(this.store.getState(), APIResourceType.Swatch, swatchId)\n }\n\n resolveSwatch(swatchId: string | undefined): FetchableValue<Swatch | null> {\n return this.resolveResource(APIResourceType.Swatch, {\n id: swatchId,\n read: id => this.readSwatch(id),\n fetch: id => this.fetchSwatch(id),\n })\n }\n\n async fetchFile(fileId: string): Promise<File | null> {\n // The REST `files` endpoint doesn't return `__typename`, which the API resources store requires.\n const fetch = async (id: string, version: SiteVersion | null) =>\n withTypename(APIResourceType.File, await this.fetchFileImpl(id, version))\n\n return await this.store.dispatch(fetchAPIResource(APIResourceType.File, fileId, fetch))\n }\n\n readFile(fileId: string): File | null {\n return ApiClientState.getAPIResource(this.store.getState(), APIResourceType.File, fileId)\n }\n\n resolveFile(fileId: string | undefined): FetchableValue<File | null> {\n return this.resolveResource(APIResourceType.File, {\n id: fileId,\n read: id => this.readFile(id),\n fetch: id => this.fetchFile(id),\n })\n }\n\n async fetchTypography(typographyId: string): Promise<Typography | null> {\n const fetch = (id: string, version: SiteVersion | null) => this.fetchTypographyImpl(id, version)\n\n return await this.store.dispatch(\n fetchAPIResource(APIResourceType.Typography, typographyId, fetch),\n )\n }\n\n readTypography(typographyId: string): Typography | null {\n return ApiClientState.getAPIResource(\n this.store.getState(),\n APIResourceType.Typography,\n typographyId,\n )\n }\n\n resolveTypography(typographyId: string | undefined): FetchableValue<Typography | null> {\n return this.resolveResource(APIResourceType.Typography, {\n id: typographyId,\n read: id => this.readTypography(id),\n fetch: id => this.fetchTypography(id),\n })\n }\n\n async fetchGlobalElement(globalElementId: string): Promise<GlobalElement | null> {\n const fetch = (id: string, version: SiteVersion | null) =>\n this.fetchGlobalElementImpl(id, version)\n\n return await this.store.dispatch(\n fetchAPIResource(APIResourceType.GlobalElement, globalElementId, fetch),\n )\n }\n\n readGlobalElement(globalElementId: string): GlobalElement | null {\n return ApiClientState.getAPIResource(\n this.store.getState(),\n APIResourceType.GlobalElement,\n globalElementId,\n )\n }\n\n async fetchLocalizedGlobalElement({\n globalElementId,\n locale,\n }: {\n globalElementId: string\n locale: string\n }): Promise<LocalizedGlobalElement | null> {\n const fetch = (id: string, version: SiteVersion | null, locale: string | null | undefined) => {\n if (locale == null) throw new Error('Locale is required to fetch LocalizedGlobalElement')\n return this.fetchLocalizedGlobalElementImpl(id, version, locale)\n }\n\n return await this.store.dispatch(\n fetchAPIResource(APIResourceType.LocalizedGlobalElement, globalElementId, fetch, locale),\n )\n }\n\n readLocalizedGlobalElement({\n globalElementId,\n locale,\n }: {\n globalElementId: string\n locale: string\n }): LocalizedGlobalElement | null {\n return ApiClientState.getAPIResource(\n this.store.getState(),\n APIResourceType.LocalizedGlobalElement,\n globalElementId,\n locale,\n )\n }\n\n async fetchPagePathnameSlice({\n pageId,\n locale,\n }: {\n pageId: string\n locale: string | null\n }): Promise<PagePathnameSlice | null> {\n const fetch = (id: string, version: SiteVersion | null, locale: string | null | undefined) =>\n this.fetchPagePathnameSliceImpl(id, version, locale)\n\n return await this.store.dispatch(\n fetchAPIResource(APIResourceType.PagePathnameSlice, pageId, fetch, locale),\n )\n }\n\n readPagePathnameSlice({\n pageId,\n locale,\n }: {\n pageId: string\n locale: string | null\n }): PagePathnameSlice | null {\n return ApiClientState.getAPIResource(\n this.store.getState(),\n APIResourceType.PagePathnameSlice,\n pageId,\n locale,\n )\n }\n\n resolvePagePathnameSlice({\n pageId,\n locale,\n }: {\n pageId: string | undefined\n locale: string | null\n }): FetchableValue<PagePathnameSlice | null> {\n return this.resolveResource(APIResourceType.PagePathnameSlice, {\n id: pageId,\n read: id => this.readPagePathnameSlice({ pageId: id, locale }),\n fetch: id => this.fetchPagePathnameSlice({ pageId: id, locale }),\n })\n }\n\n resolveResource<R>(\n type: APIResourceType,\n {\n id,\n read,\n fetch,\n }: {\n id: string | undefined\n read: (id: string) => R | null\n fetch: (id: string) => Promise<R | null>\n },\n ): FetchableValue<R | null> {\n const _read = () => (id != null ? read(id) : null)\n let lastValue: R | null = null\n return {\n name: `${type}:${id}`,\n readStable: () => (lastValue = _read()),\n subscribe: (onUpdate: () => void) =>\n this.subscribe(() => {\n if (_read() !== lastValue) onUpdate()\n }),\n fetch: async () => (id != null ? fetch(id) : null),\n }\n }\n\n async fetchTable(tableId: string): Promise<Table | null> {\n // The REST `tables` endpoint doesn't return `__typename`, which the API resources store requires.\n const fetch = async (id: string, version: SiteVersion | null) =>\n withTypename(APIResourceType.Table, await this.fetchTableImpl(id, version))\n\n return await this.store.dispatch(fetchAPIResource(APIResourceType.Table, tableId, fetch))\n }\n\n readTable(tableId: string): Table | null {\n return ApiClientState.getAPIResource(this.store.getState(), APIResourceType.Table, tableId)\n }\n\n readSite(siteId: string): Site | null {\n return ApiClientState.getAPIResource(this.store.getState(), APIResourceType.Site, siteId)\n }\n\n readPage(pageId: string): Page | null {\n return ApiClientState.getAPIResource(this.store.getState(), APIResourceType.Page, pageId)\n }\n\n readSnippet(snippetId: string): Snippet | null {\n return ApiClientState.getAPIResource(this.store.getState(), APIResourceType.Snippet, snippetId)\n }\n\n protected abstract fetchSwatchImpl(\n id: string,\n version: SiteVersion | null,\n ): Promise<Swatch | null>\n\n protected abstract fetchFileImpl(id: string, version: SiteVersion | null): Promise<File | null>\n protected abstract fetchTypographyImpl(\n id: string,\n version: SiteVersion | null,\n ): Promise<Typography | null>\n\n protected abstract fetchGlobalElementImpl(\n id: string,\n version: SiteVersion | null,\n ): Promise<GlobalElement | null>\n\n protected abstract fetchLocalizedGlobalElementImpl(\n id: string,\n version: SiteVersion | null,\n locale: string,\n ): Promise<LocalizedGlobalElement | null>\n\n protected abstract fetchPagePathnameSliceImpl(\n id: string,\n version: SiteVersion | null,\n locale: string | null | undefined,\n ): Promise<PagePathnameSlice | null>\n\n protected abstract fetchTableImpl(id: string, version: SiteVersion | null): Promise<Table | null>\n}\n\nfunction withTypename<T extends APIResourceType, R extends object>(\n typename: T,\n resource: R | null,\n): (R & { __typename: T }) | null {\n return resource == null ? null : { ...resource, __typename: typename }\n}\n"],"mappings":"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","names":["locale"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/api/api-resources-client.ts"],"sourcesContent":["import { type FetchableValue } from '@makeswift/controls'\n\nimport { type Store as ApiClientStore } from '../state/api-client/store'\nimport * as ApiClientState from '../state/api-client/state'\nimport { fetchAPIResource } from '../state/api-client/fetch-api-resource'\n\nimport {\n type File,\n type GlobalElement,\n type LocalizedGlobalElement,\n type Page,\n type PagePathnameSlice,\n type Site,\n type Snippet,\n type Swatch,\n type Table,\n type Typography,\n APIResourceType,\n} from './types'\n\nimport { type SiteVersion } from './site-version'\n\nexport type CacheData = ApiClientState.SerializedState\n\nexport const CacheData = {\n empty(): CacheData {\n return {\n apiResources: {},\n localizedResourcesMap: {},\n }\n },\n}\n\nexport abstract class ApiResourcesClient {\n readonly store: ApiClientStore\n readonly subscribe: ApiClientStore['subscribe']\n\n constructor({ store }: { store: ApiClientStore }) {\n this.store = store\n this.subscribe = this.store.subscribe\n }\n\n get cacheData(): CacheData {\n return ApiClientState.getSerializedState(this.store.getState())\n }\n\n async fetchSwatch(swatchId: string): Promise<Swatch | null> {\n const fetch = (id: string, version: SiteVersion | null) => this.fetchSwatchImpl(id, version)\n\n return await this.store.dispatch(fetchAPIResource(APIResourceType.Swatch, swatchId, fetch))\n }\n\n readSwatch(swatchId: string): Swatch | null {\n return ApiClientState.getAPIResource(this.store.getState(), APIResourceType.Swatch, swatchId)\n }\n\n resolveSwatch(swatchId: string | undefined): FetchableValue<Swatch | null> {\n return this.resolveResource(APIResourceType.Swatch, {\n id: swatchId,\n read: id => this.readSwatch(id),\n fetch: id => this.fetchSwatch(id),\n })\n }\n\n async fetchFile(fileId: string): Promise<File | null> {\n // The REST `files` endpoint doesn't return `__typename`, which the API resources store requires.\n const fetch = async (id: string, version: SiteVersion | null) =>\n withTypename(APIResourceType.File, await this.fetchFileImpl(id, version))\n\n return await this.store.dispatch(fetchAPIResource(APIResourceType.File, fileId, fetch))\n }\n\n readFile(fileId: string): File | null {\n return ApiClientState.getAPIResource(this.store.getState(), APIResourceType.File, fileId)\n }\n\n resolveFile(fileId: string | undefined): FetchableValue<File | null> {\n return this.resolveResource(APIResourceType.File, {\n id: fileId,\n read: id => this.readFile(id),\n fetch: id => this.fetchFile(id),\n })\n }\n\n async fetchTypography(typographyId: string): Promise<Typography | null> {\n const fetch = (id: string, version: SiteVersion | null) => this.fetchTypographyImpl(id, version)\n\n return await this.store.dispatch(\n fetchAPIResource(APIResourceType.Typography, typographyId, fetch),\n )\n }\n\n readTypography(typographyId: string): Typography | null {\n return ApiClientState.getAPIResource(\n this.store.getState(),\n APIResourceType.Typography,\n typographyId,\n )\n }\n\n resolveTypography(typographyId: string | undefined): FetchableValue<Typography | null> {\n return this.resolveResource(APIResourceType.Typography, {\n id: typographyId,\n read: id => this.readTypography(id),\n fetch: id => this.fetchTypography(id),\n })\n }\n\n async fetchGlobalElement(globalElementId: string): Promise<GlobalElement | null> {\n const fetch = (id: string, version: SiteVersion | null) =>\n this.fetchGlobalElementImpl(id, version)\n\n return await this.store.dispatch(\n fetchAPIResource(APIResourceType.GlobalElement, globalElementId, fetch),\n )\n }\n\n readGlobalElement(globalElementId: string): GlobalElement | null {\n return ApiClientState.getAPIResource(\n this.store.getState(),\n APIResourceType.GlobalElement,\n globalElementId,\n )\n }\n\n async fetchLocalizedGlobalElement({\n globalElementId,\n locale,\n }: {\n globalElementId: string\n locale: string\n }): Promise<LocalizedGlobalElement | null> {\n const fetch = (id: string, version: SiteVersion | null, locale: string | null | undefined) => {\n if (locale == null) throw new Error('Locale is required to fetch LocalizedGlobalElement')\n return this.fetchLocalizedGlobalElementImpl(id, version, locale)\n }\n\n return await this.store.dispatch(\n fetchAPIResource(APIResourceType.LocalizedGlobalElement, globalElementId, fetch, locale),\n )\n }\n\n readLocalizedGlobalElement({\n globalElementId,\n locale,\n }: {\n globalElementId: string\n locale: string\n }): LocalizedGlobalElement | null {\n return ApiClientState.getAPIResource(\n this.store.getState(),\n APIResourceType.LocalizedGlobalElement,\n globalElementId,\n locale,\n )\n }\n\n async fetchPagePathnameSlice({\n pageId,\n locale,\n }: {\n pageId: string\n locale: string | null\n }): Promise<PagePathnameSlice | null> {\n const fetch = (id: string, version: SiteVersion | null, locale: string | null | undefined) =>\n this.fetchPagePathnameSliceImpl(id, version, locale)\n\n return await this.store.dispatch(\n fetchAPIResource(APIResourceType.PagePathnameSlice, pageId, fetch, locale),\n )\n }\n\n readPagePathnameSlice({\n pageId,\n locale,\n }: {\n pageId: string\n locale: string | null\n }): PagePathnameSlice | null {\n return ApiClientState.getAPIResource(\n this.store.getState(),\n APIResourceType.PagePathnameSlice,\n pageId,\n locale,\n )\n }\n\n resolvePagePathnameSlice({\n pageId,\n locale,\n }: {\n pageId: string | undefined\n locale: string | null\n }): FetchableValue<PagePathnameSlice | null> {\n return this.resolveResource(APIResourceType.PagePathnameSlice, {\n id: pageId,\n read: id => this.readPagePathnameSlice({ pageId: id, locale }),\n fetch: id => this.fetchPagePathnameSlice({ pageId: id, locale }),\n })\n }\n\n resolveResource<R>(\n type: APIResourceType,\n {\n id,\n read,\n fetch,\n }: {\n id: string | undefined\n read: (id: string) => R | null\n fetch: (id: string) => Promise<R | null>\n },\n ): FetchableValue<R | null> {\n const _read = () => (id != null ? read(id) : null)\n let lastValue: R | null = null\n return {\n name: `${type}:${id}`,\n readStable: () => (lastValue = _read()),\n subscribe: (onUpdate: () => void) =>\n this.subscribe(() => {\n if (_read() !== lastValue) onUpdate()\n }),\n fetch: async () => (id != null ? fetch(id) : null),\n }\n }\n\n async fetchTable(tableId: string): Promise<Table | null> {\n // The REST `tables` endpoint doesn't return `__typename`, which the API resources store requires.\n const fetch = async (id: string, version: SiteVersion | null) =>\n withTypename(APIResourceType.Table, await this.fetchTableImpl(id, version))\n\n return await this.store.dispatch(fetchAPIResource(APIResourceType.Table, tableId, fetch))\n }\n\n readTable(tableId: string): Table | null {\n return ApiClientState.getAPIResource(this.store.getState(), APIResourceType.Table, tableId)\n }\n\n readSite(siteId: string): Site | null {\n return ApiClientState.getAPIResource(this.store.getState(), APIResourceType.Site, siteId)\n }\n\n readPage(pageId: string): Page | null {\n return ApiClientState.getAPIResource(this.store.getState(), APIResourceType.Page, pageId)\n }\n\n readSnippet(snippetId: string): Snippet | null {\n return ApiClientState.getAPIResource(this.store.getState(), APIResourceType.Snippet, snippetId)\n }\n\n protected abstract fetchSwatchImpl(\n id: string,\n version: SiteVersion | null,\n ): Promise<Swatch | null>\n\n protected abstract fetchFileImpl(id: string, version: SiteVersion | null): Promise<File | null>\n protected abstract fetchTypographyImpl(\n id: string,\n version: SiteVersion | null,\n ): Promise<Typography | null>\n\n protected abstract fetchGlobalElementImpl(\n id: string,\n version: SiteVersion | null,\n ): Promise<GlobalElement | null>\n\n protected abstract fetchLocalizedGlobalElementImpl(\n id: string,\n version: SiteVersion | null,\n locale: string,\n ): Promise<LocalizedGlobalElement | null>\n\n protected abstract fetchPagePathnameSliceImpl(\n id: string,\n version: SiteVersion | null,\n locale: string | null | undefined,\n ): Promise<PagePathnameSlice | null>\n\n protected abstract fetchTableImpl(id: string, version: SiteVersion | null): Promise<Table | null>\n}\n\nexport function withTypename<T extends APIResourceType, R extends object>(\n typename: T,\n resource: R | null,\n): (R & { __typename: T }) | null {\n return resource == null ? null : { ...resource, __typename: typename }\n}\n"],"mappings":"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","names":["locale"]}
|
|
@@ -27,7 +27,7 @@ class MakeswiftGraphQLApiClient {
|
|
|
27
27
|
graphqlClient;
|
|
28
28
|
constructor({ endpoint }) {
|
|
29
29
|
this.graphqlClient = new import_client.GraphQLClient(endpoint, {
|
|
30
|
-
"makeswift-runtime-version": "0.29.3-canary.
|
|
30
|
+
"makeswift-runtime-version": "0.29.3-canary.2"
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
33
|
async getUnversionedResources({
|
|
@@ -35,7 +35,14 @@ __export(rest_api_client_exports, {
|
|
|
35
35
|
module.exports = __toCommonJS(rest_api_client_exports);
|
|
36
36
|
var import_ky = __toESM(require("./ky"));
|
|
37
37
|
var Schema = __toESM(require("./schema"));
|
|
38
|
-
const
|
|
38
|
+
const MAX_BULK_IDS_PER_REQUEST = 100;
|
|
39
|
+
function chunkRequestIds(ids) {
|
|
40
|
+
const batches = [];
|
|
41
|
+
for (let i = 0; i < ids.length; i += MAX_BULK_IDS_PER_REQUEST) {
|
|
42
|
+
batches.push(ids.slice(i, i + MAX_BULK_IDS_PER_REQUEST));
|
|
43
|
+
}
|
|
44
|
+
return batches;
|
|
45
|
+
}
|
|
39
46
|
const RetryBackoffConfig = {
|
|
40
47
|
MaxAttempts: 3,
|
|
41
48
|
MaxDelayMs: 5e3
|
|
@@ -146,10 +153,7 @@ class MakeswiftRestAPIClient {
|
|
|
146
153
|
}
|
|
147
154
|
return await response.json();
|
|
148
155
|
};
|
|
149
|
-
const batches =
|
|
150
|
-
for (let i = 0; i < globalElementIds.length; i += MAX_GLOBAL_ELEMENTS_PER_REQUEST) {
|
|
151
|
-
batches.push(globalElementIds.slice(i, i + MAX_GLOBAL_ELEMENTS_PER_REQUEST));
|
|
152
|
-
}
|
|
156
|
+
const batches = chunkRequestIds(globalElementIds);
|
|
153
157
|
const results = await Promise.all(batches.map(getGlobalElementsBatch));
|
|
154
158
|
return results.flat();
|
|
155
159
|
}
|
|
@@ -184,6 +188,36 @@ class MakeswiftRestAPIClient {
|
|
|
184
188
|
const table = await response.json();
|
|
185
189
|
return table;
|
|
186
190
|
}
|
|
191
|
+
async getFiles(fileIds) {
|
|
192
|
+
if (fileIds.length === 0)
|
|
193
|
+
return [];
|
|
194
|
+
const batches = chunkRequestIds(fileIds);
|
|
195
|
+
const results = await Promise.all(
|
|
196
|
+
batches.map((ids) => this.getUnversionedResourcesBatch("files", ids))
|
|
197
|
+
);
|
|
198
|
+
return results.flat();
|
|
199
|
+
}
|
|
200
|
+
async getTables(tableIds) {
|
|
201
|
+
if (tableIds.length === 0)
|
|
202
|
+
return [];
|
|
203
|
+
const batches = chunkRequestIds(tableIds);
|
|
204
|
+
const results = await Promise.all(
|
|
205
|
+
batches.map((ids) => this.getUnversionedResourcesBatch("tables", ids))
|
|
206
|
+
);
|
|
207
|
+
return results.flat();
|
|
208
|
+
}
|
|
209
|
+
async getUnversionedResourcesBatch(resource, ids) {
|
|
210
|
+
const url = new URL(`v1/${resource}/bulk`, this.apiOrigin);
|
|
211
|
+
ids.forEach((id) => url.searchParams.append("ids", id));
|
|
212
|
+
const response = await this.fetch(url.pathname + url.search, null);
|
|
213
|
+
if (!response.ok) {
|
|
214
|
+
const failedBody = await failedResponseBody(response);
|
|
215
|
+
throw new RestApiClientError(`Failed to get ${resource} for [${ids.join(", ")}]`, response, {
|
|
216
|
+
body: failedBody
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
return await response.json();
|
|
220
|
+
}
|
|
187
221
|
async getPagePathnameSlices(pageIds, siteVersion, { locale }) {
|
|
188
222
|
if (pageIds.length === 0)
|
|
189
223
|
return [];
|
|
@@ -223,7 +257,7 @@ class MakeswiftRestAPIClient {
|
|
|
223
257
|
const requestHeaders = new Headers({
|
|
224
258
|
"x-api-key": this.apiKey,
|
|
225
259
|
"makeswift-site-api-key": this.apiKey,
|
|
226
|
-
"makeswift-runtime-version": "0.29.3-canary.
|
|
260
|
+
"makeswift-runtime-version": "0.29.3-canary.2"
|
|
227
261
|
});
|
|
228
262
|
if (siteVersion?.token) {
|
|
229
263
|
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 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 { type SiteVersion } from './site-version'\nimport * as Schema from './schema'\n\nexport type GlobalElementWithLocalized = {\n base: GlobalElement | null\n localized: LocalizedGlobalElement | null\n}\n\nconst MAX_GLOBAL_ELEMENTS_PER_REQUEST = 100\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: [408, 429, 500, 502, 503, 504],\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 getGlobalElements(\n globalElementIds: string[],\n siteVersion: SiteVersion | null,\n { locale }: { locale?: string | null } = {},\n ): Promise<GlobalElementWithLocalized[]> {\n const getGlobalElementsBatch = async (ids: string[]): Promise<GlobalElementWithLocalized[]> => {\n const url = new URL(`content/v1/global-elements/bulk`, this.apiOrigin)\n\n ids.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\n throw new RestApiClientError(\n `Failed to get global elements for [${ids.join(', ')}]`,\n response,\n { body: failedBody, siteVersion, locale },\n )\n }\n\n return await response.json()\n }\n\n const batches: string[][] = []\n\n for (let i = 0; i < globalElementIds.length; i += MAX_GLOBAL_ELEMENTS_PER_REQUEST) {\n batches.push(globalElementIds.slice(i, i + MAX_GLOBAL_ELEMENTS_PER_REQUEST))\n }\n\n const results = await Promise.all(batches.map(getGlobalElementsBatch))\n\n return results.flat()\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 getTable(tableId: string): Promise<Table | null> {\n const response = await this.fetch(`v1/tables/${tableId}`, 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 table '${tableId}'`, response, {\n body: failedBody,\n })\n }\n\n const table = await response.json()\n\n return table\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAA4D;AAc5D,aAAwB;AAOxB,MAAM,kCAAkC;AAExC,MAAM,qBAAqB;AAAA,EACzB,aAAa;AAAA,EACb,YAAY;AACd;AAEO,MAAM,uBAAuB;AAAA,EAC1B;AAAA,EAEC;AAAA,EACA;AAAA,EAET,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIG;AACD,SAAK,SAAS,UAAAA,QAAG,OAAO;AAAA,MACtB;AAAA,MACA,SAAS;AAAA,MACT,OAAO;AAAA,QACL,aAAa,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,QAC1C,OAAO,mBAAmB;AAAA,QAC1B,cAAc,mBAAmB;AAAA,QACjC,OAAO,kBAAgB,MAAM,eAAe,KAAK;AAAA,QACjD,QAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,aAAa;AAAA,UACX,OAAO,EAAE,SAAS,OAAO,WAAW,MAAM;AACxC,oBAAQ;AAAA,cACN,cAAc,QAAQ,GAAG,gBAAgB,KAAK,eAAe,UAAU,IAAI,mBAAmB,WAAW;AAAA,YAC3G;AAGA,oBAAI,uBAAY,KAAK;AAAG,oBAAM,mBAAmB,MAAM,QAAQ;AAAA,UACjE;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,SAAS;AACd,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,UAAU,UAAkB,aAAyD;AACzF,UAAM,WAAW,MAAM,KAAK,MAAM,eAAe,QAAQ,IAAI,WAAW;AAExE,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,aAAa,MAAM,mBAAmB,QAAQ;AACpD,UAAI,SAAS,WAAW;AAAK,eAAO;AAEpC,YAAM,IAAI,mBAAmB,yBAAyB,QAAQ,KAAK,UAAU;AAAA,QAC3E,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,MAAM,SAAS,KAAK;AAEnC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,QAAsC;AAClD,UAAM,WAAW,MAAM,KAAK,MAAM,YAAY,MAAM,IAAI,IAAI;AAE5D,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,aAAa,MAAM,mBAAmB,QAAQ;AACpD,UAAI,SAAS,WAAW;AAAK,eAAO;AAEpC,YAAM,IAAI,mBAAmB,uBAAuB,MAAM,KAAK,UAAU;AAAA,QACvE,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cACJ,cACA,aAC4B;AAC5B,UAAM,WAAW,MAAM,KAAK,MAAM,mBAAmB,YAAY,IAAI,WAAW;AAEhF,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,aAAa,MAAM,mBAAmB,QAAQ;AACpD,UAAI,SAAS,WAAW;AAAK,eAAO;AAEpC,YAAM,IAAI,mBAAmB,6BAA6B,YAAY,KAAK,UAAU;AAAA,QACnF,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,aAAa,MAAM,SAAS,KAAK;AAEvC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,iBACJ,iBACA,aAC+B;AAC/B,UAAM,WAAW,MAAM,KAAK,MAAM,sBAAsB,eAAe,IAAI,WAAW;AAEtF,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,aAAa,MAAM,mBAAmB,QAAQ;AACpD,UAAI,SAAS,WAAW;AAAK,eAAO;AAEpC,YAAM,IAAI,mBAAmB,iCAAiC,eAAe,KAAK,UAAU;AAAA,QAC1F,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,gBAAgB,MAAM,SAAS,KAAK;AAE1C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,kBACJ,kBACA,aACA,EAAE,OAAO,IAAgC,CAAC,GACH;AACvC,UAAM,yBAAyB,OAAO,QAAyD;AAC7F,YAAM,MAAM,IAAI,IAAI,mCAAmC,KAAK,SAAS;AAErE,UAAI,QAAQ,QAAM,IAAI,aAAa,OAAO,OAAO,EAAE,CAAC;AACpD,UAAI,UAAU;AAAM,YAAI,aAAa,IAAI,UAAU,MAAM;AAEzD,YAAM,WAAW,MAAM,KAAK,MAAM,IAAI,WAAW,IAAI,QAAQ,WAAW;AAExE,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,aAAa,MAAM,mBAAmB,QAAQ;AAEpD,cAAM,IAAI;AAAA,UACR,sCAAsC,IAAI,KAAK,IAAI,CAAC;AAAA,UACpD;AAAA,UACA,EAAE,MAAM,YAAY,aAAa,OAAO;AAAA,QAC1C;AAAA,MACF;AAEA,aAAO,MAAM,SAAS,KAAK;AAAA,IAC7B;AAEA,UAAM,UAAsB,CAAC;AAE7B,aAAS,IAAI,GAAG,IAAI,iBAAiB,QAAQ,KAAK,iCAAiC;AACjF,cAAQ,KAAK,iBAAiB,MAAM,GAAG,IAAI,+BAA+B,CAAC;AAAA,IAC7E;AAEA,UAAM,UAAU,MAAM,QAAQ,IAAI,QAAQ,IAAI,sBAAsB,CAAC;AAErE,WAAO,QAAQ,KAAK;AAAA,EACtB;AAAA,EAEA,MAAM,0BACJ,iBACA,QACA,aACwC;AACxC,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,gCAAgC,eAAe,WAAW,MAAM;AAAA,MAChE;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,aAAa,MAAM,mBAAmB,QAAQ;AACpD,UAAI,SAAS,WAAW;AAAK,eAAO;AAEpC,YAAM,IAAI;AAAA,QACR,2CAA2C,eAAe;AAAA,QAC1D;AAAA,QACA,EAAE,MAAM,YAAY,aAAa,OAAO;AAAA,MAC1C;AAAA,IACF;AAEA,UAAM,yBAAyB,MAAM,SAAS,KAAK;AAEnD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,SAAwC;AACrD,UAAM,WAAW,MAAM,KAAK,MAAM,aAAa,OAAO,IAAI,IAAI;AAE9D,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,aAAa,MAAM,mBAAmB,QAAQ;AACpD,UAAI,SAAS,WAAW;AAAK,eAAO;AAEpC,YAAM,IAAI,mBAAmB,wBAAwB,OAAO,KAAK,UAAU;AAAA,QACzE,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,UAAM,QAAQ,MAAM,SAAS,KAAK;AAElC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,sBACJ,SACA,aACA,EAAE,OAAO,GAC8B;AACvC,QAAI,QAAQ,WAAW;AAAG,aAAO,CAAC;AAElC,UAAM,MAAM,IAAI,IAAI,gCAAgC,KAAK,SAAS;AAElE,YAAQ,QAAQ,QAAM,IAAI,aAAa,OAAO,OAAO,EAAE,CAAC;AACxD,QAAI,UAAU;AAAM,UAAI,aAAa,IAAI,UAAU,MAAM;AAEzD,UAAM,WAAW,MAAM,KAAK,MAAM,IAAI,WAAW,IAAI,QAAQ,WAAW;AAExE,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,aAAa,MAAM,mBAAmB,QAAQ;AACpD,UAAI,SAAS,WAAW;AAAK,eAAO,CAAC;AAErC,YAAM,IAAI;AAAA,QACR,4CAA4C,QAAQ,KAAK,IAAI,CAAC;AAAA,QAC9D;AAAA,QACA,EAAE,MAAM,YAAY,aAAa,OAAO;AAAA,MAC1C;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,UAAM,qBAAqB,OAAO,mBAAmB,MAAM,IAAI;AAM/D,WAAO,mBAAmB,IAAI,uBAAqB;AACjD,UAAI,qBAAqB;AAAM,eAAO;AAEtC,aAAO;AAAA,QACL,GAAG;AAAA,QACH,IAAI,kBAAkB;AAAA,QACtB,mBAAmB,kBAAkB,qBAAqB;AAAA,MAC5D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,qBACJ,QACA,aACA,EAAE,OAAO,IAAgC,CAAC,GACP;AACnC,UAAM,qBAAqB,MAAM,KAAK,sBAAsB,CAAC,MAAM,GAAG,aAAa,EAAE,OAAO,CAAC;AAE7F,WAAO,mBAAmB,GAAG,CAAC,KAAK;AAAA,EACrC;AAAA,EAEA,MAAgB,MACd,MACA,aACA,MACmB;AACnB,UAAM,aAAa,IAAI,IAAI,MAAM,KAAK,SAAS;AAE/C,UAAM,iBAAiB,IAAI,QAAQ;AAAA,MACjC,aAAa,KAAK;AAAA,MAClB,0BAA0B,KAAK;AAAA,MAC/B,6BAA6B;AAAA,IAC/B,CAAC;AAED,QAAI,aAAa,OAAO;AACtB,iBAAW,aAAa,IAAI,WAAW,YAAY,OAAO;AAC1D,qBAAe,IAAI,2BAA2B,YAAY,KAAK;AAAA,IACjE;AAEA,QAAI,MAAM,SAAS;AACjB,UAAI,QAAQ,KAAK,OAAO,EAAE,QAAQ,CAAC,OAAO,QAAQ;AAChD,uBAAe,IAAI,KAAK,KAAK;AAAA,MAC/B,CAAC;AAAA,IACH;AAEA,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,WAAW,SAAS,GAAG;AAAA,QAC9C,GAAG;AAAA,QACH,SAAS;AAAA,QACT,GAAI,eAAe,OAAO,EAAE,OAAO,WAAW,IAAI,CAAC;AAAA,MACrD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,iBAAiB;AAAW,eAAO,MAAM;AAC7C,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAYA,eAAsB,mBAAmB,UAAsC;AAC7E,MAAI;AACF,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,SAAS,GAAG;AACV,WAAO,oCAAoC,CAAC;AAAA,EAC9C;AACF;AAEA,SAAS,cAAc,UAA4B;AACjD,SAAO,GAAG,SAAS,MAAM,IAAI,SAAS,UAAU;AAClD;AAEO,MAAM,2BAA2B,MAAM;AAAA,EACnC;AAAA,EAET,YAAY,SAAiB,UAAoB,OAAgC;AAC/E,UAAM,GAAG,OAAO,KAAK,cAAc,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;AAEzD,SAAK,OAAO;AACZ,SAAK,SAAS,SAAS;AAAA,EACzB;AACF;","names":["ky"]}
|
|
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 Table,\n type Typography,\n type HttpFetch,\n} from './types'\n\nimport { type SiteVersion } from './site-version'\nimport * as Schema from './schema'\n\nexport type GlobalElementWithLocalized = {\n base: GlobalElement | null\n localized: LocalizedGlobalElement | null\n}\n\nconst MAX_BULK_IDS_PER_REQUEST = 100\n\nfunction chunkRequestIds(ids: string[]): string[][] {\n const batches: string[][] = []\n\n for (let i = 0; i < ids.length; i += MAX_BULK_IDS_PER_REQUEST) {\n batches.push(ids.slice(i, i + MAX_BULK_IDS_PER_REQUEST))\n }\n\n return batches\n}\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: [408, 429, 500, 502, 503, 504],\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 getGlobalElements(\n globalElementIds: string[],\n siteVersion: SiteVersion | null,\n { locale }: { locale?: string | null } = {},\n ): Promise<GlobalElementWithLocalized[]> {\n const getGlobalElementsBatch = async (ids: string[]): Promise<GlobalElementWithLocalized[]> => {\n const url = new URL(`content/v1/global-elements/bulk`, this.apiOrigin)\n\n ids.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\n throw new RestApiClientError(\n `Failed to get global elements for [${ids.join(', ')}]`,\n response,\n { body: failedBody, siteVersion, locale },\n )\n }\n\n return await response.json()\n }\n\n const batches = chunkRequestIds(globalElementIds)\n\n const results = await Promise.all(batches.map(getGlobalElementsBatch))\n\n return results.flat()\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 getTable(tableId: string): Promise<Table | null> {\n const response = await this.fetch(`v1/tables/${tableId}`, 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 table '${tableId}'`, response, {\n body: failedBody,\n })\n }\n\n const table = await response.json()\n\n return table\n }\n\n async getFiles(fileIds: string[]): Promise<(File | null)[]> {\n if (fileIds.length === 0) return []\n\n const batches = chunkRequestIds(fileIds)\n\n const results = await Promise.all(\n batches.map(ids => this.getUnversionedResourcesBatch<File>('files', ids)),\n )\n\n return results.flat()\n }\n\n async getTables(tableIds: string[]): Promise<(Table | null)[]> {\n if (tableIds.length === 0) return []\n\n const batches = chunkRequestIds(tableIds)\n\n const results = await Promise.all(\n batches.map(ids => this.getUnversionedResourcesBatch<Table>('tables', ids)),\n )\n\n return results.flat()\n }\n\n private async getUnversionedResourcesBatch<T>(\n resource: 'files' | 'tables',\n ids: string[],\n ): Promise<(T | null)[]> {\n const url = new URL(`v1/${resource}/bulk`, this.apiOrigin)\n\n ids.forEach(id => url.searchParams.append('ids', id))\n\n const response = await this.fetch(url.pathname + url.search, null)\n\n if (!response.ok) {\n const failedBody = await failedResponseBody(response)\n\n throw new RestApiClientError(`Failed to get ${resource} for [${ids.join(', ')}]`, response, {\n body: failedBody,\n })\n }\n\n return await response.json()\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":["ky"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/api/types.ts"],"sourcesContent":["import {\n SwatchFragment as Swatch,\n FileFragment as File,\n TypographyFragment as Typography,\n PagePathnameSliceFragment,\n GlobalElementFragment as GlobalElement,\n LocalizedGlobalElementFragment as LocalizedGlobalElement,\n TableFragment
|
|
1
|
+
{"version":3,"sources":["../../../src/api/types.ts"],"sourcesContent":["import {\n SwatchFragment as Swatch,\n FileFragment as File,\n TypographyFragment as Typography,\n PagePathnameSliceFragment,\n GlobalElementFragment as GlobalElement,\n LocalizedGlobalElementFragment as LocalizedGlobalElement,\n TableFragment,\n SnippetFragment as Snippet,\n PageFragment as Page,\n SiteFragment as Site,\n} from './graphql/generated/types'\n\n// The REST `tables` endpoint returns each column's discriminator as `type` rather than the GraphQL\n// `__typename`.\ntype WithColumnType<C> = C extends { __typename: infer T }\n ? Omit<C, '__typename'> & { type: T }\n : never\n\ntype Table = Omit<TableFragment, 'columns'> & {\n columns: Array<WithColumnType<TableFragment['columns'][number]>>\n}\n\ntype PagePathnameSlice = PagePathnameSliceFragment & {\n basePageId?: string\n localizedPathname?: string | null\n}\n\nexport type {\n Swatch,\n File,\n Typography,\n PagePathnameSlice,\n GlobalElement,\n LocalizedGlobalElement,\n Table,\n Snippet,\n Page,\n Site,\n}\n\nexport type LocalizableAPIResource = PagePathnameSlice | LocalizedGlobalElement\n\nexport const LocalizableAPIResourceType: {\n [R in LocalizableAPIResource as R['__typename']]: R['__typename']\n} = {\n PagePathnameSlice: 'PagePathnameSlice',\n LocalizedGlobalElement: 'LocalizedGlobalElement',\n}\n\nexport type LocalizableAPIResourceType =\n (typeof LocalizableAPIResourceType)[keyof typeof LocalizableAPIResourceType]\n\nexport type APIResource =\n | LocalizableAPIResource\n | Swatch\n | File\n | Typography\n | GlobalElement\n | Table\n | Snippet\n | Page\n | Site\n\nexport const APIResourceType: { [R in APIResource as R['__typename']]: R['__typename'] } = {\n ...LocalizableAPIResourceType,\n Swatch: 'Swatch',\n File: 'File',\n Typography: 'Typography',\n GlobalElement: 'GlobalElement',\n Table: 'Table',\n Snippet: 'Snippet',\n Page: 'Page',\n Site: 'Site',\n}\n\nexport type APIResourceType = (typeof APIResourceType)[keyof typeof APIResourceType]\n\nexport type APIResourceByType<T extends APIResourceType> = Extract<APIResource, { __typename: T }>\n\nexport type APIResourceLocale<R extends APIResource | APIResourceType> = R extends\n | LocalizableAPIResource\n | LocalizableAPIResourceType\n ? string | null\n : never\n\nexport type HttpFetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CO,MAAM,6BAET;AAAA,EACF,mBAAmB;AAAA,EACnB,wBAAwB;AAC1B;AAgBO,MAAM,kBAA8E;AAAA,EACzF,GAAG;AAAA,EACH,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AACR;","names":[]}
|
|
@@ -28,7 +28,7 @@ async function manifestHandler(req, { apiKey, manifest }) {
|
|
|
28
28
|
return import_request_response.ApiResponse.json({ message: "Unauthorized" }, { status: 401 });
|
|
29
29
|
}
|
|
30
30
|
return import_request_response.ApiResponse.json({
|
|
31
|
-
version: "0.29.3-canary.
|
|
31
|
+
version: "0.29.3-canary.2",
|
|
32
32
|
interactionMode: true,
|
|
33
33
|
clientSideNavigation: false,
|
|
34
34
|
elementFromPoint: false,
|
package/dist/cjs/client/index.js
CHANGED
|
@@ -29,14 +29,13 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
29
29
|
var client_exports = {};
|
|
30
30
|
__export(client_exports, {
|
|
31
31
|
MakeswiftClient: () => MakeswiftClient,
|
|
32
|
-
SnippetLocation: () =>
|
|
32
|
+
SnippetLocation: () => import_types2.SnippetLocation,
|
|
33
33
|
componentDocumentToRootEmbeddedDocument: () => import_component_snapshot2.componentDocumentToRootEmbeddedDocument,
|
|
34
34
|
pageToRootDocument: () => import_page_snapshot2.pageToRootDocument
|
|
35
35
|
});
|
|
36
36
|
module.exports = __toCommonJS(client_exports);
|
|
37
|
-
var
|
|
37
|
+
var import_types = require("../api/types");
|
|
38
38
|
var import_api_resources_client = require("../api/api-resources-client");
|
|
39
|
-
var import_graphql_api_client = require("../api/graphql-api-client");
|
|
40
39
|
var import_rest_api_client = require("../api/rest-api-client");
|
|
41
40
|
var import_introspection = require("../prop-controllers/introspection");
|
|
42
41
|
var import_read_only_state = require("../state/read-only-state");
|
|
@@ -46,11 +45,10 @@ var import_deterministic_uuid = require("../utils/deterministic-uuid");
|
|
|
46
45
|
var import_pagination = require("../utils/pagination");
|
|
47
46
|
var import_isNonNullable = require("../utils/isNonNullable");
|
|
48
47
|
var Schema = __toESM(require("./schema"));
|
|
49
|
-
var
|
|
48
|
+
var import_types2 = require("../api/graphql/generated/types");
|
|
50
49
|
var import_component_snapshot2 = require("./component-snapshot");
|
|
51
50
|
var import_page_snapshot2 = require("./page-snapshot");
|
|
52
51
|
class MakeswiftClient extends import_rest_api_client.MakeswiftRestAPIClient {
|
|
53
|
-
graphqlClient;
|
|
54
52
|
runtime;
|
|
55
53
|
constructor(apiKey, {
|
|
56
54
|
runtime
|
|
@@ -66,9 +64,6 @@ Received "${apiKey}" instead.`
|
|
|
66
64
|
apiKey,
|
|
67
65
|
apiOrigin: runtime.apiOrigin
|
|
68
66
|
});
|
|
69
|
-
this.graphqlClient = new import_graphql_api_client.MakeswiftGraphQLApiClient({
|
|
70
|
-
endpoint: runtime.graphqlApiEndpoint
|
|
71
|
-
});
|
|
72
67
|
this.runtime = runtime;
|
|
73
68
|
}
|
|
74
69
|
getPagesInternal = async ({
|
|
@@ -181,11 +176,19 @@ Received "${apiKey}" instead.`
|
|
|
181
176
|
}
|
|
182
177
|
async getIntrospectedResources({
|
|
183
178
|
swatchIds,
|
|
184
|
-
|
|
179
|
+
fileIds,
|
|
180
|
+
tableIds
|
|
185
181
|
}, siteVersion) {
|
|
186
|
-
const
|
|
187
|
-
|
|
188
|
-
|
|
182
|
+
const [swatches, files, tables] = await Promise.all([
|
|
183
|
+
this.getSwatches(swatchIds, siteVersion),
|
|
184
|
+
this.getFiles(fileIds),
|
|
185
|
+
this.getTables(tableIds)
|
|
186
|
+
]);
|
|
187
|
+
return {
|
|
188
|
+
swatches,
|
|
189
|
+
files: files.map((file) => (0, import_api_resources_client.withTypename)(import_types.APIResourceType.File, file)),
|
|
190
|
+
tables: tables.map((table) => (0, import_api_resources_client.withTypename)(import_types.APIResourceType.Table, table))
|
|
191
|
+
};
|
|
189
192
|
}
|
|
190
193
|
async introspect(element, siteVersion, locale) {
|
|
191
194
|
const treeId = "root";
|
|
@@ -352,34 +355,34 @@ Received "${apiKey}" instead.`
|
|
|
352
355
|
const result = /* @__PURE__ */ new Map();
|
|
353
356
|
for (const [treeId, { cache: currentTreeCache }] of traversals) {
|
|
354
357
|
const apiResources = {
|
|
355
|
-
[
|
|
358
|
+
[import_types.APIResourceType.Swatch]: [...currentTreeCache.swatchIds].map((id) => ({
|
|
356
359
|
id,
|
|
357
360
|
value: swatches.find((swatch) => swatch?.id === id) ?? null
|
|
358
361
|
})),
|
|
359
|
-
[
|
|
362
|
+
[import_types.APIResourceType.File]: [...currentTreeCache.fileIds].map((id) => ({
|
|
360
363
|
id,
|
|
361
364
|
value: files.find((file) => file?.id === id) ?? null
|
|
362
365
|
})),
|
|
363
|
-
[
|
|
366
|
+
[import_types.APIResourceType.Typography]: [...currentTreeCache.typographyIds].map((id) => ({
|
|
364
367
|
id,
|
|
365
368
|
value: typographies.find((typography) => typography?.id === id) ?? null
|
|
366
369
|
})),
|
|
367
|
-
[
|
|
370
|
+
[import_types.APIResourceType.Table]: [...currentTreeCache.tableIds].map((id) => ({
|
|
368
371
|
id,
|
|
369
372
|
value: tables.find((table) => table?.id === id) ?? null
|
|
370
373
|
})),
|
|
371
|
-
[
|
|
374
|
+
[import_types.APIResourceType.PagePathnameSlice]: [...currentTreeCache.pageIds].map((id) => ({
|
|
372
375
|
id,
|
|
373
376
|
value: pagePathnames.find((pagePathnameSlice) => pagePathnameSlice?.id === id) ?? null,
|
|
374
377
|
locale
|
|
375
378
|
})),
|
|
376
|
-
[
|
|
379
|
+
[import_types.APIResourceType.GlobalElement]: [...currentTreeCache.globalElements.entries()].map(
|
|
377
380
|
([id, value]) => ({
|
|
378
381
|
id,
|
|
379
382
|
value
|
|
380
383
|
})
|
|
381
384
|
),
|
|
382
|
-
[
|
|
385
|
+
[import_types.APIResourceType.LocalizedGlobalElement]: [
|
|
383
386
|
...currentTreeCache.localizedGlobalElements.entries()
|
|
384
387
|
].map(([id, value]) => ({
|
|
385
388
|
id,
|
|
@@ -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 GlobalElement,\n type LocalizedGlobalElement,\n type Swatch,\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 private async introspect(\n element: Element,\n siteVersion: SiteVersion | null,\n locale: string | null,\n ): Promise<CacheData> {\n const treeId = 'root'\n const cacheDataMap = await this.introspectMany(\n [{ id: treeId, data: element }],\n siteVersion,\n locale,\n )\n\n return cacheDataMap.get(treeId)!\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 function createTreeCache() {\n return {\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 // Per-tree tracking, keyed by tree ID\n const traversals = new Map(\n trees.map(tree => [\n tree.id,\n {\n cache: createTreeCache(),\n remaining: [tree.data],\n seen: new Set<string>(),\n },\n ]),\n )\n\n // Layered DFS traversal: each pass walks every tree as far as the caches allow, then\n // fetches every newly discovered global element in one bulk round-trip before resuming.\n while (true) {\n const pendingGlobalElementIds = new Set<string>()\n const deferred: { treeId: string; element: Element }[] = []\n\n for (const [treeId, traversal] of traversals) {\n const { remaining, seen, cache: currentTreeCache } = traversal\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 // Defer until the global element is fetched as part of this layer's bulk request\n if (!globalElementCache.has(globalElementId)) {\n pendingGlobalElementIds.add(globalElementId)\n deferred.push({ treeId, element: current })\n continue\n }\n\n const globalElement = globalElementCache.get(globalElementId) ?? null\n\n let elementData = globalElement?.data\n\n if (locale) {\n const localizedGlobalElement =\n localizedGlobalElementCache.get(globalElementId) ?? null\n\n if (localizedGlobalElement) {\n // Update the logic here when we can merge element trees\n elementData = localizedGlobalElement.data\n\n currentTreeCache.localizedResourcesMap.set(\n globalElementId,\n localizedGlobalElement.id,\n )\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 // If there are no pendingGlobalElementIds then all elements have been traversed completely\n if (pendingGlobalElementIds.size === 0) break\n\n const ids = [...pendingGlobalElementIds]\n const results = await this.getGlobalElements(ids, siteVersion, { locale })\n\n ids.forEach((id, index) => {\n globalElementCache.set(id, results[index]?.base ?? null)\n localizedGlobalElementCache.set(id, results[index]?.localized ?? null)\n })\n\n deferred.forEach(({ treeId, element }) => traversals.get(treeId)!.remaining.push(element))\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 { cache: currentTreeCache } of traversals.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 { cache: currentTreeCache } of traversals.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, { cache: currentTreeCache }] of traversals) {\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 }: {\n siteVersion: SiteVersion | null | Promise<SiteVersion | null>\n locale?: string\n allowLocaleFallback?: boolean\n },\n ): Promise<MakeswiftComponentSnapshot> {\n const siteVersion = await siteVersionPromise\n const key = deterministicUUID({ id, locale, seed: this.apiKey.split('-').at(0) })\n const searchParams = new URLSearchParams()\n if (locale) searchParams.set('locale', locale)\n\n const response = await this.fetch(\n `content/v1/element-trees/${encodeURIComponent(id)}?${searchParams.toString()}`,\n siteVersion,\n )\n\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 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 documentResponse = Schema.componentDocumentResponse.parse(responseBody)\n\n const document =\n !allowLocaleFallback && documentResponse.locale != locale\n ? {\n id,\n locale: locale ?? null,\n data: null,\n }\n : documentResponse\n\n const cacheData =\n document.data == null\n ? CacheData.empty()\n : 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 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":["import_types","import_component_snapshot","import_page_snapshot","getResourcesFromElementDescriptors","elementDescriptors"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/client/index.ts"],"sourcesContent":["import { z } from 'zod'\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, withTypename } from '../api/api-resources-client'\n\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 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.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 fileIds,\n tableIds,\n }: { swatchIds: string[]; fileIds: string[]; tableIds: string[] },\n siteVersion: SiteVersion | null,\n ): Promise<{\n swatches: (Swatch | null)[]\n files: (File | null)[]\n tables: (Table | null)[]\n }> {\n const [swatches, files, tables] = await Promise.all([\n this.getSwatches(swatchIds, siteVersion),\n this.getFiles(fileIds),\n this.getTables(tableIds),\n ])\n\n // The REST bulk endpoints don't return `__typename`, which the API resources store requires.\n return {\n swatches,\n files: files.map(file => withTypename(APIResourceType.File, file)),\n tables: tables.map(table => withTypename(APIResourceType.Table, table)),\n }\n }\n\n private async introspect(\n element: Element,\n siteVersion: SiteVersion | null,\n locale: string | null,\n ): Promise<CacheData> {\n const treeId = 'root'\n const cacheDataMap = await this.introspectMany(\n [{ id: treeId, data: element }],\n siteVersion,\n locale,\n )\n\n return cacheDataMap.get(treeId)!\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 function createTreeCache() {\n return {\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 // Per-tree tracking, keyed by tree ID\n const traversals = new Map(\n trees.map(tree => [\n tree.id,\n {\n cache: createTreeCache(),\n remaining: [tree.data],\n seen: new Set<string>(),\n },\n ]),\n )\n\n // Layered DFS traversal: each pass walks every tree as far as the caches allow, then\n // fetches every newly discovered global element in one bulk round-trip before resuming.\n while (true) {\n const pendingGlobalElementIds = new Set<string>()\n const deferred: { treeId: string; element: Element }[] = []\n\n for (const [treeId, traversal] of traversals) {\n const { remaining, seen, cache: currentTreeCache } = traversal\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 // Defer until the global element is fetched as part of this layer's bulk request\n if (!globalElementCache.has(globalElementId)) {\n pendingGlobalElementIds.add(globalElementId)\n deferred.push({ treeId, element: current })\n continue\n }\n\n const globalElement = globalElementCache.get(globalElementId) ?? null\n\n let elementData = globalElement?.data\n\n if (locale) {\n const localizedGlobalElement =\n localizedGlobalElementCache.get(globalElementId) ?? null\n\n if (localizedGlobalElement) {\n // Update the logic here when we can merge element trees\n elementData = localizedGlobalElement.data\n\n currentTreeCache.localizedResourcesMap.set(\n globalElementId,\n localizedGlobalElement.id,\n )\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 // If there are no pendingGlobalElementIds then all elements have been traversed completely\n if (pendingGlobalElementIds.size === 0) break\n\n const ids = [...pendingGlobalElementIds]\n const results = await this.getGlobalElements(ids, siteVersion, { locale })\n\n ids.forEach((id, index) => {\n globalElementCache.set(id, results[index]?.base ?? null)\n localizedGlobalElementCache.set(id, results[index]?.localized ?? null)\n })\n\n deferred.forEach(({ treeId, element }) => traversals.get(treeId)!.remaining.push(element))\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 { cache: currentTreeCache } of traversals.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 { cache: currentTreeCache } of traversals.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, { cache: currentTreeCache }] of traversals) {\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 }: {\n siteVersion: SiteVersion | null | Promise<SiteVersion | null>\n locale?: string\n allowLocaleFallback?: boolean\n },\n ): Promise<MakeswiftComponentSnapshot> {\n const siteVersion = await siteVersionPromise\n const key = deterministicUUID({ id, locale, seed: this.apiKey.split('-').at(0) })\n const searchParams = new URLSearchParams()\n if (locale) searchParams.set('locale', locale)\n\n const response = await this.fetch(\n `content/v1/element-trees/${encodeURIComponent(id)}?${searchParams.toString()}`,\n siteVersion,\n )\n\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 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 documentResponse = Schema.componentDocumentResponse.parse(responseBody)\n\n const document =\n !allowLocaleFallback && documentResponse.locale != locale\n ? {\n id,\n locale: locale ?? null,\n data: null,\n }\n : documentResponse\n\n const cacheData =\n document.data == null\n ? CacheData.empty()\n : 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 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":["import_types","import_component_snapshot","import_page_snapshot","getResourcesFromElementDescriptors","elementDescriptors"]}
|
|
@@ -154,7 +154,7 @@ function ErrorMessage({ className, ...restOfProps }) {
|
|
|
154
154
|
] });
|
|
155
155
|
}
|
|
156
156
|
function getTableColumnDefaultValue(tableColumn) {
|
|
157
|
-
switch (tableColumn.
|
|
157
|
+
switch (tableColumn.type) {
|
|
158
158
|
case "CheckboxTableColumn":
|
|
159
159
|
return false;
|
|
160
160
|
case "MultipleSelectTableColumn":
|