@plasmicapp/loader-fetcher 1.0.34 → 1.0.36

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/api.d.ts CHANGED
@@ -115,6 +115,11 @@ export declare class Api {
115
115
  });
116
116
  fetchLoaderData(projectIds: string[], opts: {
117
117
  platform?: "react" | "nextjs" | "gatsby";
118
+ platformOptions?: {
119
+ nextjs?: {
120
+ appDir: boolean;
121
+ };
122
+ };
118
123
  preview?: boolean;
119
124
  browserOnly?: boolean;
120
125
  i18nKeyScheme?: "content" | "hash" | "path";
package/dist/fetcher.d.ts CHANGED
@@ -7,6 +7,11 @@ export interface FetcherOptions {
7
7
  }[];
8
8
  cache?: LoaderBundleCache;
9
9
  platform?: "react" | "nextjs" | "gatsby";
10
+ platformOptions?: {
11
+ nextjs?: {
12
+ appDir: boolean;
13
+ };
14
+ };
10
15
  preview?: boolean;
11
16
  host?: string;
12
17
  /**
@@ -0,0 +1,225 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __spreadValues = (a, b) => {
7
+ for (var prop in b || (b = {}))
8
+ if (__hasOwnProp.call(b, prop))
9
+ __defNormalProp(a, prop, b[prop]);
10
+ if (__getOwnPropSymbols)
11
+ for (var prop of __getOwnPropSymbols(b)) {
12
+ if (__propIsEnum.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ }
15
+ return a;
16
+ };
17
+ var __async = (__this, __arguments, generator) => {
18
+ return new Promise((resolve, reject) => {
19
+ var fulfilled = (value) => {
20
+ try {
21
+ step(generator.next(value));
22
+ } catch (e) {
23
+ reject(e);
24
+ }
25
+ };
26
+ var rejected = (value) => {
27
+ try {
28
+ step(generator.throw(value));
29
+ } catch (e) {
30
+ reject(e);
31
+ }
32
+ };
33
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
34
+ step((generator = generator.apply(__this, __arguments)).next());
35
+ });
36
+ };
37
+
38
+ // src/api.ts
39
+ import fetch from "@plasmicapp/isomorphic-unfetch";
40
+ var VERSION = "10";
41
+ var isBrowser = typeof window !== "undefined" && window != null && typeof window.document !== "undefined";
42
+ var Api = class {
43
+ constructor(opts) {
44
+ this.opts = opts;
45
+ var _a;
46
+ this.host = (_a = opts.host) != null ? _a : "https://codegen.plasmic.app";
47
+ }
48
+ fetchLoaderData(projectIds, opts) {
49
+ return __async(this, null, function* () {
50
+ var _a, _b, _c, _d;
51
+ const { platform, preview } = opts;
52
+ const query = new URLSearchParams([
53
+ ["platform", platform != null ? platform : "react"],
54
+ ...((_b = (_a = opts.platformOptions) == null ? void 0 : _a.nextjs) == null ? void 0 : _b.appDir) ? [["nextjsAppDir", "true"]] : [],
55
+ ...projectIds.map((projectId) => ["projectId", projectId]),
56
+ ...opts.browserOnly ? [["browserOnly", "true"]] : [],
57
+ ...opts.i18nKeyScheme ? [["i18nKeyScheme", opts.i18nKeyScheme]] : [],
58
+ ...opts.i18nTagPrefix ? [["i18nTagPrefix", opts.i18nTagPrefix]] : [],
59
+ ...opts.skipHead ? [["skipHead", "true"]] : []
60
+ ]).toString();
61
+ const url = `${this.host}/api/v1/loader/code/${preview ? "preview" : "published"}?${query}`;
62
+ const resp = yield fetch(url, {
63
+ method: "GET",
64
+ headers: this.makeGetHeaders()
65
+ });
66
+ if (resp.status >= 400) {
67
+ const error = yield this.parseJsonResponse(resp);
68
+ throw new Error(
69
+ `Error fetching loader data: ${(_d = (_c = error == null ? void 0 : error.error) == null ? void 0 : _c.message) != null ? _d : resp.statusText}`
70
+ );
71
+ }
72
+ const json = yield this.parseJsonResponse(resp);
73
+ return json;
74
+ });
75
+ }
76
+ parseJsonResponse(resp) {
77
+ return __async(this, null, function* () {
78
+ const text = yield resp.text();
79
+ try {
80
+ return JSON.parse(text);
81
+ } catch (err) {
82
+ throw new Error(
83
+ `Error parsing JSON response: ${err}; status: ${resp.status}; response: ${text}`
84
+ );
85
+ }
86
+ });
87
+ }
88
+ fetchHtmlData(opts) {
89
+ return __async(this, null, function* () {
90
+ const { projectId, component, embedHydrate, hydrate } = opts;
91
+ const query = new URLSearchParams([
92
+ ["projectId", projectId],
93
+ ["component", component],
94
+ ["embedHydrate", embedHydrate ? "1" : "0"],
95
+ ["hydrate", hydrate ? "1" : "0"]
96
+ ]).toString();
97
+ const resp = yield fetch(`${this.host}/api/v1/loader/html?${query}`, {
98
+ method: "GET",
99
+ headers: this.makeGetHeaders()
100
+ });
101
+ const json = yield resp.json();
102
+ return json;
103
+ });
104
+ }
105
+ makeGetHeaders() {
106
+ return __spreadValues({
107
+ "x-plasmic-loader-version": VERSION
108
+ }, this.makeAuthHeaders());
109
+ }
110
+ makeAuthHeaders() {
111
+ const tokens = this.opts.projects.map((p) => `${p.id}:${p.token}`).join(",");
112
+ return {
113
+ "x-plasmic-api-project-tokens": tokens
114
+ };
115
+ }
116
+ };
117
+
118
+ // src/fetcher.ts
119
+ var PlasmicModulesFetcher = class {
120
+ constructor(opts) {
121
+ this.opts = opts;
122
+ this.curFetch = void 0;
123
+ this.api = new Api({
124
+ projects: opts.projects,
125
+ host: opts.host
126
+ });
127
+ }
128
+ fetchAllData() {
129
+ return __async(this, null, function* () {
130
+ const bundle = yield this.getCachedOrFetch();
131
+ this.cacheBundleInNodeServer(bundle);
132
+ return bundle;
133
+ });
134
+ }
135
+ getCachedOrFetch() {
136
+ return __async(this, null, function* () {
137
+ var _a;
138
+ if (this.opts.cache) {
139
+ const cachedData = yield this.opts.cache.get();
140
+ if (cachedData) {
141
+ return cachedData;
142
+ }
143
+ }
144
+ if (this.curFetch) {
145
+ return yield this.curFetch;
146
+ }
147
+ if (typeof process === "undefined" || !((_a = process.env) == null ? void 0 : _a.PLASMIC_QUIET)) {
148
+ console.debug("Plasmic: doing a fresh fetch...");
149
+ }
150
+ this.curFetch = this.doFetch();
151
+ const data = yield this.curFetch;
152
+ this.curFetch = void 0;
153
+ return data;
154
+ });
155
+ }
156
+ doFetch() {
157
+ return __async(this, null, function* () {
158
+ var _a, _b, _c, _d;
159
+ const data = yield this.api.fetchLoaderData(
160
+ this.opts.projects.map(
161
+ (p) => p.version ? `${p.id}@${p.version}` : p.id
162
+ ),
163
+ {
164
+ platform: this.opts.platform,
165
+ platformOptions: this.opts.platformOptions,
166
+ preview: this.opts.preview,
167
+ i18nKeyScheme: (_b = (_a = this.opts.i18n) == null ? void 0 : _a.keyScheme) != null ? _b : this.opts.i18nKeyScheme,
168
+ i18nTagPrefix: (_c = this.opts.i18n) == null ? void 0 : _c.tagPrefix,
169
+ browserOnly: isBrowser,
170
+ skipHead: this.opts.skipHead
171
+ }
172
+ );
173
+ if (this.opts.cache) {
174
+ yield this.opts.cache.set(data);
175
+ }
176
+ if (typeof process === "undefined" || !((_d = process.env) == null ? void 0 : _d.PLASMIC_QUIET)) {
177
+ console.debug(
178
+ `Plasmic: fetched designs for ${data.projects.map((p) => `"${p.name}" (${p.id}@${p.version})`).join(", ")}`
179
+ );
180
+ }
181
+ return data;
182
+ });
183
+ }
184
+ cacheBundleInNodeServer(bundle) {
185
+ if (isBrowser) {
186
+ return;
187
+ }
188
+ const global = globalThis;
189
+ if (global.__PLASMIC_BUNDLES === void 0) {
190
+ global.__PLASMIC_BUNDLES = {};
191
+ }
192
+ global.__PLASMIC_BUNDLES[getBundleKey(this.opts)] = bundle;
193
+ }
194
+ };
195
+ function internal_getCachedBundleInNodeServer(opts) {
196
+ var _a;
197
+ if (isBrowser) {
198
+ throw new Error(`Should not be consulting Node server cache in browser`);
199
+ }
200
+ const global = globalThis;
201
+ return (_a = global.__PLASMIC_BUNDLES) == null ? void 0 : _a[getBundleKey(opts)];
202
+ }
203
+ function getBundleKey({
204
+ host,
205
+ platform,
206
+ i18nKeyScheme,
207
+ preview,
208
+ projects,
209
+ skipHead
210
+ }) {
211
+ return JSON.stringify({
212
+ host,
213
+ platform,
214
+ i18nKeyScheme,
215
+ preview,
216
+ projects,
217
+ skipHead
218
+ });
219
+ }
220
+ export {
221
+ Api,
222
+ PlasmicModulesFetcher,
223
+ internal_getCachedBundleInNodeServer
224
+ };
225
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/api.ts", "../src/fetcher.ts"],
4
+ "sourcesContent": ["import fetch from \"@plasmicapp/isomorphic-unfetch\";\n\nexport interface ComponentMeta {\n id: string;\n usedComponents: string[];\n projectId: string;\n name: string;\n displayName: string;\n cssFile: string;\n path: string | undefined;\n isPage: boolean;\n plumeType?: string;\n entry: string;\n isCode: boolean;\n isGlobalContextProvider: boolean;\n pageMetadata?: PageMetadata;\n metadata?: Record<string, string>;\n}\n\nexport interface PageMeta extends ComponentMeta {\n isPage: true;\n path: string;\n plumeType: never;\n pageMetadata: PageMetadata;\n}\n\nexport interface PageMetadata {\n path: string;\n title?: string | null;\n description?: string | null;\n openGraphImageUrl?: string | null;\n canonical?: string | null;\n}\n\nexport interface GlobalGroupMeta {\n id: string;\n projectId: string;\n name: string;\n type: string;\n contextFile: string;\n useName: string;\n}\n\nexport interface ProjectMeta {\n id: string;\n teamId?: string;\n indirect?: boolean;\n name: string;\n version: string;\n remoteFonts: FontMeta[];\n globalContextsProviderFileName: string;\n}\n\nexport interface FontMeta {\n url: string;\n}\n\ninterface GlobalVariantSplitContent {\n type: \"global-variant\";\n projectId: string;\n group: string;\n variant: string;\n}\n\ninterface Slice {\n id: string;\n contents: GlobalVariantSplitContent[];\n externalId?: string;\n}\n\nexport interface ExperimentSlice extends Slice {\n prob: number;\n}\n\nexport interface SegmentSlice extends Slice {\n cond: any;\n}\n\nexport interface ExperimentSplit {\n id: string;\n externalId?: string;\n type: \"experiment\";\n slices: ExperimentSlice[];\n}\n\nexport interface SegmentSplit {\n id: string;\n externalId?: string;\n type: \"segment\";\n slices: SegmentSlice[];\n}\n\nexport type Split = ExperimentSplit | SegmentSplit;\n\nexport interface LoaderBundleOutput {\n modules: {\n browser: (CodeModule | AssetModule)[];\n server: (CodeModule | AssetModule)[];\n };\n external: string[];\n components: ComponentMeta[];\n globalGroups: GlobalGroupMeta[];\n projects: ProjectMeta[];\n activeSplits: Split[];\n}\n\nexport interface LoaderHtmlOutput {\n html: string;\n}\n\nexport interface CodeModule {\n fileName: string;\n code: string;\n imports: string[];\n type: \"code\";\n}\n\nexport interface AssetModule {\n fileName: string;\n source: string;\n type: \"asset\";\n}\n\nconst VERSION = \"10\";\n\nexport const isBrowser =\n typeof window !== \"undefined\" &&\n window != null &&\n typeof window.document !== \"undefined\";\n\nexport class Api {\n private host: string;\n constructor(\n private opts: {\n projects: { id: string; token: string }[];\n host?: string;\n }\n ) {\n this.host = opts.host ?? \"https://codegen.plasmic.app\";\n }\n\n async fetchLoaderData(\n projectIds: string[],\n opts: {\n platform?: \"react\" | \"nextjs\" | \"gatsby\";\n platformOptions?: {\n nextjs?: {\n appDir: boolean;\n };\n };\n preview?: boolean;\n browserOnly?: boolean;\n i18nKeyScheme?: \"content\" | \"hash\" | \"path\";\n i18nTagPrefix?: string;\n skipHead?: boolean;\n }\n ) {\n const { platform, preview } = opts;\n const query = new URLSearchParams([\n [\"platform\", platform ?? \"react\"],\n ...(opts.platformOptions?.nextjs?.appDir\n ? [[\"nextjsAppDir\", \"true\"]]\n : []),\n ...projectIds.map((projectId) => [\"projectId\", projectId]),\n ...(opts.browserOnly ? [[\"browserOnly\", \"true\"]] : []),\n ...(opts.i18nKeyScheme ? [[\"i18nKeyScheme\", opts.i18nKeyScheme]] : []),\n ...(opts.i18nTagPrefix ? [[\"i18nTagPrefix\", opts.i18nTagPrefix]] : []),\n ...(opts.skipHead ? [[\"skipHead\", \"true\"]] : []),\n ]).toString();\n\n const url = `${this.host}/api/v1/loader/code/${\n preview ? \"preview\" : \"published\"\n }?${query}`;\n const resp = await fetch(url, {\n method: \"GET\",\n headers: this.makeGetHeaders(),\n });\n if (resp.status >= 400) {\n const error = await this.parseJsonResponse(resp);\n throw new Error(\n `Error fetching loader data: ${\n error?.error?.message ?? resp.statusText\n }`\n );\n }\n const json = await this.parseJsonResponse(resp);\n return json as LoaderBundleOutput;\n }\n\n private async parseJsonResponse(resp: Response) {\n const text = await resp.text();\n try {\n return JSON.parse(text);\n } catch (err) {\n throw new Error(\n `Error parsing JSON response: ${err}; status: ${resp.status}; response: ${text}`\n );\n }\n }\n\n async fetchHtmlData(opts: {\n projectId: string;\n component: string;\n hydrate?: boolean;\n embedHydrate?: boolean;\n }) {\n const { projectId, component, embedHydrate, hydrate } = opts;\n const query = new URLSearchParams([\n [\"projectId\", projectId],\n [\"component\", component],\n [\"embedHydrate\", embedHydrate ? \"1\" : \"0\"],\n [\"hydrate\", hydrate ? \"1\" : \"0\"],\n ]).toString();\n const resp = await fetch(`${this.host}/api/v1/loader/html?${query}`, {\n method: \"GET\",\n headers: this.makeGetHeaders(),\n });\n const json = await resp.json();\n return json as LoaderHtmlOutput;\n }\n\n private makeGetHeaders() {\n return {\n \"x-plasmic-loader-version\": VERSION,\n ...this.makeAuthHeaders(),\n };\n }\n\n private makeAuthHeaders() {\n const tokens = this.opts.projects\n .map((p) => `${p.id}:${p.token}`)\n .join(\",\");\n return {\n \"x-plasmic-api-project-tokens\": tokens,\n };\n }\n}\n", "import { Api, isBrowser, LoaderBundleOutput } from \"./api\";\n\nexport interface FetcherOptions {\n projects: {\n id: string;\n version?: string;\n token: string;\n }[];\n cache?: LoaderBundleCache;\n platform?: \"react\" | \"nextjs\" | \"gatsby\";\n platformOptions?: {\n nextjs?: {\n appDir: boolean;\n };\n };\n preview?: boolean;\n host?: string;\n /**\n * @deprecated use i18n.keyScheme instead\n */\n i18nKeyScheme?: \"content\" | \"hash\" | \"path\";\n i18n?: {\n keyScheme: \"content\" | \"hash\" | \"path\";\n tagPrefix?: string;\n };\n skipHead?: boolean;\n}\n\nexport interface LoaderBundleCache {\n set: (data: LoaderBundleOutput) => Promise<void>;\n get: () => Promise<LoaderBundleOutput>;\n}\n\nexport class PlasmicModulesFetcher {\n private api: Api;\n private curFetch: Promise<LoaderBundleOutput> | undefined = undefined;\n constructor(private opts: FetcherOptions) {\n this.api = new Api({\n projects: opts.projects,\n host: opts.host,\n });\n }\n\n async fetchAllData() {\n // getCachedOrFetched uses a cache defined by the user.\n const bundle = await this.getCachedOrFetch();\n\n // For React Server Components (Next.js 13+),\n // we need to pass server modules in LoaderBundleOutput from Server Components to Client Components.\n // We don't want to pass them via normal page props because that will be serialized to the browser.\n // Instead, we pass the bundle (including the server modules) via the Node `global` variable.\n //\n // cacheBundleInNodeServer caches a bundle in the Node server process.\n this.cacheBundleInNodeServer(bundle);\n\n return bundle;\n }\n\n private async getCachedOrFetch() {\n if (this.opts.cache) {\n const cachedData = await this.opts.cache.get();\n if (cachedData) {\n return cachedData;\n }\n }\n if (this.curFetch) {\n return await this.curFetch;\n }\n if (typeof process === \"undefined\" || !process.env?.PLASMIC_QUIET) {\n console.debug(\"Plasmic: doing a fresh fetch...\");\n }\n this.curFetch = this.doFetch();\n const data = await this.curFetch;\n this.curFetch = undefined;\n return data;\n }\n\n private async doFetch() {\n const data = await this.api.fetchLoaderData(\n this.opts.projects.map((p) =>\n p.version ? `${p.id}@${p.version}` : p.id\n ),\n {\n platform: this.opts.platform,\n platformOptions: this.opts.platformOptions,\n preview: this.opts.preview,\n i18nKeyScheme: this.opts.i18n?.keyScheme ?? this.opts.i18nKeyScheme,\n i18nTagPrefix: this.opts.i18n?.tagPrefix,\n browserOnly: isBrowser,\n skipHead: this.opts.skipHead,\n }\n );\n if (this.opts.cache) {\n await this.opts.cache.set(data);\n }\n if (typeof process === \"undefined\" || !process.env?.PLASMIC_QUIET) {\n console.debug(\n `Plasmic: fetched designs for ${data.projects\n .map((p) => `\"${p.name}\" (${p.id}@${p.version})`)\n .join(\", \")}`\n );\n }\n return data;\n }\n\n private cacheBundleInNodeServer(bundle: LoaderBundleOutput) {\n if (isBrowser) {\n return;\n }\n\n const global = globalThis as GlobalWithBundles;\n if (global.__PLASMIC_BUNDLES === undefined) {\n global.__PLASMIC_BUNDLES = {};\n }\n global.__PLASMIC_BUNDLES[getBundleKey(this.opts)] = bundle;\n }\n}\n\nexport function internal_getCachedBundleInNodeServer(\n opts: FetcherOptions\n): LoaderBundleOutput | undefined {\n if (isBrowser) {\n throw new Error(`Should not be consulting Node server cache in browser`);\n }\n\n const global = globalThis as GlobalWithBundles;\n return global.__PLASMIC_BUNDLES?.[getBundleKey(opts)];\n}\n\nfunction getBundleKey({\n host,\n platform,\n i18nKeyScheme,\n preview,\n projects,\n skipHead,\n}: FetcherOptions) {\n return JSON.stringify({\n host,\n platform,\n i18nKeyScheme,\n preview,\n projects,\n skipHead,\n });\n}\n\ninterface GlobalWithBundles {\n __PLASMIC_BUNDLES?: { [bundleKey: string]: LoaderBundleOutput };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/dist/index.js CHANGED
@@ -82,10 +82,11 @@ var Api = class {
82
82
  }
83
83
  fetchLoaderData(projectIds, opts) {
84
84
  return __async(this, null, function* () {
85
- var _a, _b;
85
+ var _a, _b, _c, _d;
86
86
  const { platform, preview } = opts;
87
87
  const query = new URLSearchParams([
88
88
  ["platform", platform != null ? platform : "react"],
89
+ ...((_b = (_a = opts.platformOptions) == null ? void 0 : _a.nextjs) == null ? void 0 : _b.appDir) ? [["nextjsAppDir", "true"]] : [],
89
90
  ...projectIds.map((projectId) => ["projectId", projectId]),
90
91
  ...opts.browserOnly ? [["browserOnly", "true"]] : [],
91
92
  ...opts.i18nKeyScheme ? [["i18nKeyScheme", opts.i18nKeyScheme]] : [],
@@ -100,7 +101,7 @@ var Api = class {
100
101
  if (resp.status >= 400) {
101
102
  const error = yield this.parseJsonResponse(resp);
102
103
  throw new Error(
103
- `Error fetching loader data: ${(_b = (_a = error == null ? void 0 : error.error) == null ? void 0 : _a.message) != null ? _b : resp.statusText}`
104
+ `Error fetching loader data: ${(_d = (_c = error == null ? void 0 : error.error) == null ? void 0 : _c.message) != null ? _d : resp.statusText}`
104
105
  );
105
106
  }
106
107
  const json = yield this.parseJsonResponse(resp);
@@ -196,6 +197,7 @@ var PlasmicModulesFetcher = class {
196
197
  ),
197
198
  {
198
199
  platform: this.opts.platform,
200
+ platformOptions: this.opts.platformOptions,
199
201
  preview: this.opts.preview,
200
202
  i18nKeyScheme: (_b = (_a = this.opts.i18n) == null ? void 0 : _a.keyScheme) != null ? _b : this.opts.i18nKeyScheme,
201
203
  i18nTagPrefix: (_c = this.opts.i18n) == null ? void 0 : _c.tagPrefix,
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/api.ts", "../src/fetcher.ts"],
4
- "sourcesContent": ["export type {\n AssetModule,\n CodeModule,\n ComponentMeta,\n ExperimentSlice,\n FontMeta,\n GlobalGroupMeta,\n LoaderBundleOutput,\n LoaderHtmlOutput,\n PageMeta,\n PageMetadata,\n ProjectMeta,\n SegmentSlice,\n Split,\n} from \"./api\";\nexport { Api } from \"./api\";\nexport type { FetcherOptions, LoaderBundleCache } from \"./fetcher\";\nexport {\n internal_getCachedBundleInNodeServer,\n PlasmicModulesFetcher,\n} from \"./fetcher\";\n", "import fetch from \"@plasmicapp/isomorphic-unfetch\";\n\nexport interface ComponentMeta {\n id: string;\n usedComponents: string[];\n projectId: string;\n name: string;\n displayName: string;\n cssFile: string;\n path: string | undefined;\n isPage: boolean;\n plumeType?: string;\n entry: string;\n isCode: boolean;\n isGlobalContextProvider: boolean;\n pageMetadata?: PageMetadata;\n metadata?: Record<string, string>;\n}\n\nexport interface PageMeta extends ComponentMeta {\n isPage: true;\n path: string;\n plumeType: never;\n pageMetadata: PageMetadata;\n}\n\nexport interface PageMetadata {\n path: string;\n title?: string | null;\n description?: string | null;\n openGraphImageUrl?: string | null;\n canonical?: string | null;\n}\n\nexport interface GlobalGroupMeta {\n id: string;\n projectId: string;\n name: string;\n type: string;\n contextFile: string;\n useName: string;\n}\n\nexport interface ProjectMeta {\n id: string;\n teamId?: string;\n indirect?: boolean;\n name: string;\n version: string;\n remoteFonts: FontMeta[];\n globalContextsProviderFileName: string;\n}\n\nexport interface FontMeta {\n url: string;\n}\n\ninterface GlobalVariantSplitContent {\n type: \"global-variant\";\n projectId: string;\n group: string;\n variant: string;\n}\n\ninterface Slice {\n id: string;\n contents: GlobalVariantSplitContent[];\n externalId?: string;\n}\n\nexport interface ExperimentSlice extends Slice {\n prob: number;\n}\n\nexport interface SegmentSlice extends Slice {\n cond: any;\n}\n\nexport interface ExperimentSplit {\n id: string;\n externalId?: string;\n type: \"experiment\";\n slices: ExperimentSlice[];\n}\n\nexport interface SegmentSplit {\n id: string;\n externalId?: string;\n type: \"segment\";\n slices: SegmentSlice[];\n}\n\nexport type Split = ExperimentSplit | SegmentSplit;\n\nexport interface LoaderBundleOutput {\n modules: {\n browser: (CodeModule | AssetModule)[];\n server: (CodeModule | AssetModule)[];\n };\n external: string[];\n components: ComponentMeta[];\n globalGroups: GlobalGroupMeta[];\n projects: ProjectMeta[];\n activeSplits: Split[];\n}\n\nexport interface LoaderHtmlOutput {\n html: string;\n}\n\nexport interface CodeModule {\n fileName: string;\n code: string;\n imports: string[];\n type: \"code\";\n}\n\nexport interface AssetModule {\n fileName: string;\n source: string;\n type: \"asset\";\n}\n\nconst VERSION = \"10\";\n\nexport const isBrowser =\n typeof window !== \"undefined\" &&\n window != null &&\n typeof window.document !== \"undefined\";\n\nexport class Api {\n private host: string;\n constructor(\n private opts: {\n projects: { id: string; token: string }[];\n host?: string;\n }\n ) {\n this.host = opts.host ?? \"https://codegen.plasmic.app\";\n }\n\n async fetchLoaderData(\n projectIds: string[],\n opts: {\n platform?: \"react\" | \"nextjs\" | \"gatsby\";\n preview?: boolean;\n browserOnly?: boolean;\n i18nKeyScheme?: \"content\" | \"hash\" | \"path\";\n i18nTagPrefix?: string;\n skipHead?: boolean;\n }\n ) {\n const { platform, preview } = opts;\n const query = new URLSearchParams([\n [\"platform\", platform ?? \"react\"],\n ...projectIds.map((projectId) => [\"projectId\", projectId]),\n ...(opts.browserOnly ? [[\"browserOnly\", \"true\"]] : []),\n ...(opts.i18nKeyScheme ? [[\"i18nKeyScheme\", opts.i18nKeyScheme]] : []),\n ...(opts.i18nTagPrefix ? [[\"i18nTagPrefix\", opts.i18nTagPrefix]] : []),\n ...(opts.skipHead ? [[\"skipHead\", \"true\"]] : []),\n ]).toString();\n\n const url = `${this.host}/api/v1/loader/code/${\n preview ? \"preview\" : \"published\"\n }?${query}`;\n const resp = await fetch(url, {\n method: \"GET\",\n headers: this.makeGetHeaders(),\n });\n if (resp.status >= 400) {\n const error = await this.parseJsonResponse(resp);\n throw new Error(\n `Error fetching loader data: ${\n error?.error?.message ?? resp.statusText\n }`\n );\n }\n const json = await this.parseJsonResponse(resp);\n return json as LoaderBundleOutput;\n }\n\n private async parseJsonResponse(resp: Response) {\n const text = await resp.text();\n try {\n return JSON.parse(text);\n } catch (err) {\n throw new Error(\n `Error parsing JSON response: ${err}; status: ${resp.status}; response: ${text}`\n );\n }\n }\n\n async fetchHtmlData(opts: {\n projectId: string;\n component: string;\n hydrate?: boolean;\n embedHydrate?: boolean;\n }) {\n const { projectId, component, embedHydrate, hydrate } = opts;\n const query = new URLSearchParams([\n [\"projectId\", projectId],\n [\"component\", component],\n [\"embedHydrate\", embedHydrate ? \"1\" : \"0\"],\n [\"hydrate\", hydrate ? \"1\" : \"0\"],\n ]).toString();\n const resp = await fetch(`${this.host}/api/v1/loader/html?${query}`, {\n method: \"GET\",\n headers: this.makeGetHeaders(),\n });\n const json = await resp.json();\n return json as LoaderHtmlOutput;\n }\n\n private makeGetHeaders() {\n return {\n \"x-plasmic-loader-version\": VERSION,\n ...this.makeAuthHeaders(),\n };\n }\n\n private makeAuthHeaders() {\n const tokens = this.opts.projects\n .map((p) => `${p.id}:${p.token}`)\n .join(\",\");\n return {\n \"x-plasmic-api-project-tokens\": tokens,\n };\n }\n}\n", "import { Api, isBrowser, LoaderBundleOutput } from \"./api\";\n\nexport interface FetcherOptions {\n projects: {\n id: string;\n version?: string;\n token: string;\n }[];\n cache?: LoaderBundleCache;\n platform?: \"react\" | \"nextjs\" | \"gatsby\";\n preview?: boolean;\n host?: string;\n /**\n * @deprecated use i18n.keyScheme instead\n */\n i18nKeyScheme?: \"content\" | \"hash\" | \"path\";\n i18n?: {\n keyScheme: \"content\" | \"hash\" | \"path\";\n tagPrefix?: string;\n };\n skipHead?: boolean;\n}\n\nexport interface LoaderBundleCache {\n set: (data: LoaderBundleOutput) => Promise<void>;\n get: () => Promise<LoaderBundleOutput>;\n}\n\nexport class PlasmicModulesFetcher {\n private api: Api;\n private curFetch: Promise<LoaderBundleOutput> | undefined = undefined;\n constructor(private opts: FetcherOptions) {\n this.api = new Api({\n projects: opts.projects,\n host: opts.host,\n });\n }\n\n async fetchAllData() {\n // getCachedOrFetched uses a cache defined by the user.\n const bundle = await this.getCachedOrFetch();\n\n // For React Server Components (Next.js 13+),\n // we need to pass server modules in LoaderBundleOutput from Server Components to Client Components.\n // We don't want to pass them via normal page props because that will be serialized to the browser.\n // Instead, we pass the bundle (including the server modules) via the Node `global` variable.\n //\n // cacheBundleInNodeServer caches a bundle in the Node server process.\n this.cacheBundleInNodeServer(bundle);\n\n return bundle;\n }\n\n private async getCachedOrFetch() {\n if (this.opts.cache) {\n const cachedData = await this.opts.cache.get();\n if (cachedData) {\n return cachedData;\n }\n }\n if (this.curFetch) {\n return await this.curFetch;\n }\n if (typeof process === \"undefined\" || !process.env?.PLASMIC_QUIET) {\n console.debug(\"Plasmic: doing a fresh fetch...\");\n }\n this.curFetch = this.doFetch();\n const data = await this.curFetch;\n this.curFetch = undefined;\n return data;\n }\n\n private async doFetch() {\n const data = await this.api.fetchLoaderData(\n this.opts.projects.map((p) =>\n p.version ? `${p.id}@${p.version}` : p.id\n ),\n {\n platform: this.opts.platform,\n preview: this.opts.preview,\n i18nKeyScheme: this.opts.i18n?.keyScheme ?? this.opts.i18nKeyScheme,\n i18nTagPrefix: this.opts.i18n?.tagPrefix,\n browserOnly: isBrowser,\n skipHead: this.opts.skipHead,\n }\n );\n if (this.opts.cache) {\n await this.opts.cache.set(data);\n }\n if (typeof process === \"undefined\" || !process.env?.PLASMIC_QUIET) {\n console.debug(\n `Plasmic: fetched designs for ${data.projects\n .map((p) => `\"${p.name}\" (${p.id}@${p.version})`)\n .join(\", \")}`\n );\n }\n return data;\n }\n\n private cacheBundleInNodeServer(bundle: LoaderBundleOutput) {\n if (isBrowser) {\n return;\n }\n\n const global = globalThis as GlobalWithBundles;\n if (global.__PLASMIC_BUNDLES === undefined) {\n global.__PLASMIC_BUNDLES = {};\n }\n global.__PLASMIC_BUNDLES[getBundleKey(this.opts)] = bundle;\n }\n}\n\nexport function internal_getCachedBundleInNodeServer(\n opts: FetcherOptions\n): LoaderBundleOutput | undefined {\n if (isBrowser) {\n throw new Error(`Should not be consulting Node server cache in browser`);\n }\n\n const global = globalThis as GlobalWithBundles;\n return global.__PLASMIC_BUNDLES?.[getBundleKey(opts)];\n}\n\nfunction getBundleKey({\n host,\n platform,\n i18nKeyScheme,\n preview,\n projects,\n skipHead,\n}: FetcherOptions) {\n return JSON.stringify({\n host,\n platform,\n i18nKeyScheme,\n preview,\n projects,\n skipHead,\n });\n}\n\ninterface GlobalWithBundles {\n __PLASMIC_BUNDLES?: { [bundleKey: string]: LoaderBundleOutput };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export type {\n AssetModule,\n CodeModule,\n ComponentMeta,\n ExperimentSlice,\n FontMeta,\n GlobalGroupMeta,\n LoaderBundleOutput,\n LoaderHtmlOutput,\n PageMeta,\n PageMetadata,\n ProjectMeta,\n SegmentSlice,\n Split,\n} from \"./api\";\nexport { Api } from \"./api\";\nexport type { FetcherOptions, LoaderBundleCache } from \"./fetcher\";\nexport {\n internal_getCachedBundleInNodeServer,\n PlasmicModulesFetcher,\n} from \"./fetcher\";\n", "import fetch from \"@plasmicapp/isomorphic-unfetch\";\n\nexport interface ComponentMeta {\n id: string;\n usedComponents: string[];\n projectId: string;\n name: string;\n displayName: string;\n cssFile: string;\n path: string | undefined;\n isPage: boolean;\n plumeType?: string;\n entry: string;\n isCode: boolean;\n isGlobalContextProvider: boolean;\n pageMetadata?: PageMetadata;\n metadata?: Record<string, string>;\n}\n\nexport interface PageMeta extends ComponentMeta {\n isPage: true;\n path: string;\n plumeType: never;\n pageMetadata: PageMetadata;\n}\n\nexport interface PageMetadata {\n path: string;\n title?: string | null;\n description?: string | null;\n openGraphImageUrl?: string | null;\n canonical?: string | null;\n}\n\nexport interface GlobalGroupMeta {\n id: string;\n projectId: string;\n name: string;\n type: string;\n contextFile: string;\n useName: string;\n}\n\nexport interface ProjectMeta {\n id: string;\n teamId?: string;\n indirect?: boolean;\n name: string;\n version: string;\n remoteFonts: FontMeta[];\n globalContextsProviderFileName: string;\n}\n\nexport interface FontMeta {\n url: string;\n}\n\ninterface GlobalVariantSplitContent {\n type: \"global-variant\";\n projectId: string;\n group: string;\n variant: string;\n}\n\ninterface Slice {\n id: string;\n contents: GlobalVariantSplitContent[];\n externalId?: string;\n}\n\nexport interface ExperimentSlice extends Slice {\n prob: number;\n}\n\nexport interface SegmentSlice extends Slice {\n cond: any;\n}\n\nexport interface ExperimentSplit {\n id: string;\n externalId?: string;\n type: \"experiment\";\n slices: ExperimentSlice[];\n}\n\nexport interface SegmentSplit {\n id: string;\n externalId?: string;\n type: \"segment\";\n slices: SegmentSlice[];\n}\n\nexport type Split = ExperimentSplit | SegmentSplit;\n\nexport interface LoaderBundleOutput {\n modules: {\n browser: (CodeModule | AssetModule)[];\n server: (CodeModule | AssetModule)[];\n };\n external: string[];\n components: ComponentMeta[];\n globalGroups: GlobalGroupMeta[];\n projects: ProjectMeta[];\n activeSplits: Split[];\n}\n\nexport interface LoaderHtmlOutput {\n html: string;\n}\n\nexport interface CodeModule {\n fileName: string;\n code: string;\n imports: string[];\n type: \"code\";\n}\n\nexport interface AssetModule {\n fileName: string;\n source: string;\n type: \"asset\";\n}\n\nconst VERSION = \"10\";\n\nexport const isBrowser =\n typeof window !== \"undefined\" &&\n window != null &&\n typeof window.document !== \"undefined\";\n\nexport class Api {\n private host: string;\n constructor(\n private opts: {\n projects: { id: string; token: string }[];\n host?: string;\n }\n ) {\n this.host = opts.host ?? \"https://codegen.plasmic.app\";\n }\n\n async fetchLoaderData(\n projectIds: string[],\n opts: {\n platform?: \"react\" | \"nextjs\" | \"gatsby\";\n platformOptions?: {\n nextjs?: {\n appDir: boolean;\n };\n };\n preview?: boolean;\n browserOnly?: boolean;\n i18nKeyScheme?: \"content\" | \"hash\" | \"path\";\n i18nTagPrefix?: string;\n skipHead?: boolean;\n }\n ) {\n const { platform, preview } = opts;\n const query = new URLSearchParams([\n [\"platform\", platform ?? \"react\"],\n ...(opts.platformOptions?.nextjs?.appDir\n ? [[\"nextjsAppDir\", \"true\"]]\n : []),\n ...projectIds.map((projectId) => [\"projectId\", projectId]),\n ...(opts.browserOnly ? [[\"browserOnly\", \"true\"]] : []),\n ...(opts.i18nKeyScheme ? [[\"i18nKeyScheme\", opts.i18nKeyScheme]] : []),\n ...(opts.i18nTagPrefix ? [[\"i18nTagPrefix\", opts.i18nTagPrefix]] : []),\n ...(opts.skipHead ? [[\"skipHead\", \"true\"]] : []),\n ]).toString();\n\n const url = `${this.host}/api/v1/loader/code/${\n preview ? \"preview\" : \"published\"\n }?${query}`;\n const resp = await fetch(url, {\n method: \"GET\",\n headers: this.makeGetHeaders(),\n });\n if (resp.status >= 400) {\n const error = await this.parseJsonResponse(resp);\n throw new Error(\n `Error fetching loader data: ${\n error?.error?.message ?? resp.statusText\n }`\n );\n }\n const json = await this.parseJsonResponse(resp);\n return json as LoaderBundleOutput;\n }\n\n private async parseJsonResponse(resp: Response) {\n const text = await resp.text();\n try {\n return JSON.parse(text);\n } catch (err) {\n throw new Error(\n `Error parsing JSON response: ${err}; status: ${resp.status}; response: ${text}`\n );\n }\n }\n\n async fetchHtmlData(opts: {\n projectId: string;\n component: string;\n hydrate?: boolean;\n embedHydrate?: boolean;\n }) {\n const { projectId, component, embedHydrate, hydrate } = opts;\n const query = new URLSearchParams([\n [\"projectId\", projectId],\n [\"component\", component],\n [\"embedHydrate\", embedHydrate ? \"1\" : \"0\"],\n [\"hydrate\", hydrate ? \"1\" : \"0\"],\n ]).toString();\n const resp = await fetch(`${this.host}/api/v1/loader/html?${query}`, {\n method: \"GET\",\n headers: this.makeGetHeaders(),\n });\n const json = await resp.json();\n return json as LoaderHtmlOutput;\n }\n\n private makeGetHeaders() {\n return {\n \"x-plasmic-loader-version\": VERSION,\n ...this.makeAuthHeaders(),\n };\n }\n\n private makeAuthHeaders() {\n const tokens = this.opts.projects\n .map((p) => `${p.id}:${p.token}`)\n .join(\",\");\n return {\n \"x-plasmic-api-project-tokens\": tokens,\n };\n }\n}\n", "import { Api, isBrowser, LoaderBundleOutput } from \"./api\";\n\nexport interface FetcherOptions {\n projects: {\n id: string;\n version?: string;\n token: string;\n }[];\n cache?: LoaderBundleCache;\n platform?: \"react\" | \"nextjs\" | \"gatsby\";\n platformOptions?: {\n nextjs?: {\n appDir: boolean;\n };\n };\n preview?: boolean;\n host?: string;\n /**\n * @deprecated use i18n.keyScheme instead\n */\n i18nKeyScheme?: \"content\" | \"hash\" | \"path\";\n i18n?: {\n keyScheme: \"content\" | \"hash\" | \"path\";\n tagPrefix?: string;\n };\n skipHead?: boolean;\n}\n\nexport interface LoaderBundleCache {\n set: (data: LoaderBundleOutput) => Promise<void>;\n get: () => Promise<LoaderBundleOutput>;\n}\n\nexport class PlasmicModulesFetcher {\n private api: Api;\n private curFetch: Promise<LoaderBundleOutput> | undefined = undefined;\n constructor(private opts: FetcherOptions) {\n this.api = new Api({\n projects: opts.projects,\n host: opts.host,\n });\n }\n\n async fetchAllData() {\n // getCachedOrFetched uses a cache defined by the user.\n const bundle = await this.getCachedOrFetch();\n\n // For React Server Components (Next.js 13+),\n // we need to pass server modules in LoaderBundleOutput from Server Components to Client Components.\n // We don't want to pass them via normal page props because that will be serialized to the browser.\n // Instead, we pass the bundle (including the server modules) via the Node `global` variable.\n //\n // cacheBundleInNodeServer caches a bundle in the Node server process.\n this.cacheBundleInNodeServer(bundle);\n\n return bundle;\n }\n\n private async getCachedOrFetch() {\n if (this.opts.cache) {\n const cachedData = await this.opts.cache.get();\n if (cachedData) {\n return cachedData;\n }\n }\n if (this.curFetch) {\n return await this.curFetch;\n }\n if (typeof process === \"undefined\" || !process.env?.PLASMIC_QUIET) {\n console.debug(\"Plasmic: doing a fresh fetch...\");\n }\n this.curFetch = this.doFetch();\n const data = await this.curFetch;\n this.curFetch = undefined;\n return data;\n }\n\n private async doFetch() {\n const data = await this.api.fetchLoaderData(\n this.opts.projects.map((p) =>\n p.version ? `${p.id}@${p.version}` : p.id\n ),\n {\n platform: this.opts.platform,\n platformOptions: this.opts.platformOptions,\n preview: this.opts.preview,\n i18nKeyScheme: this.opts.i18n?.keyScheme ?? this.opts.i18nKeyScheme,\n i18nTagPrefix: this.opts.i18n?.tagPrefix,\n browserOnly: isBrowser,\n skipHead: this.opts.skipHead,\n }\n );\n if (this.opts.cache) {\n await this.opts.cache.set(data);\n }\n if (typeof process === \"undefined\" || !process.env?.PLASMIC_QUIET) {\n console.debug(\n `Plasmic: fetched designs for ${data.projects\n .map((p) => `\"${p.name}\" (${p.id}@${p.version})`)\n .join(\", \")}`\n );\n }\n return data;\n }\n\n private cacheBundleInNodeServer(bundle: LoaderBundleOutput) {\n if (isBrowser) {\n return;\n }\n\n const global = globalThis as GlobalWithBundles;\n if (global.__PLASMIC_BUNDLES === undefined) {\n global.__PLASMIC_BUNDLES = {};\n }\n global.__PLASMIC_BUNDLES[getBundleKey(this.opts)] = bundle;\n }\n}\n\nexport function internal_getCachedBundleInNodeServer(\n opts: FetcherOptions\n): LoaderBundleOutput | undefined {\n if (isBrowser) {\n throw new Error(`Should not be consulting Node server cache in browser`);\n }\n\n const global = globalThis as GlobalWithBundles;\n return global.__PLASMIC_BUNDLES?.[getBundleKey(opts)];\n}\n\nfunction getBundleKey({\n host,\n platform,\n i18nKeyScheme,\n preview,\n projects,\n skipHead,\n}: FetcherOptions) {\n return JSON.stringify({\n host,\n platform,\n i18nKeyScheme,\n preview,\n projects,\n skipHead,\n });\n}\n\ninterface GlobalWithBundles {\n __PLASMIC_BUNDLES?: { [bundleKey: string]: LoaderBundleOutput };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["fetch"]
7
7
  }
package/package.json CHANGED
@@ -1,12 +1,14 @@
1
1
  {
2
- "version": "1.0.34",
2
+ "version": "1.0.36",
3
3
  "license": "MIT",
4
4
  "types": "./dist/index.d.ts",
5
5
  "main": "./dist/index.js",
6
+ "module": "./dist/index.esm.js",
6
7
  "exports": {
7
8
  ".": {
8
9
  "types": "./dist/index.d.ts",
9
- "default": "./dist/index.js"
10
+ "import": "./dist/index.esm.js",
11
+ "require": "./dist/index.js"
10
12
  }
11
13
  },
12
14
  "files": [
@@ -41,5 +43,5 @@
41
43
  "publishConfig": {
42
44
  "access": "public"
43
45
  },
44
- "gitHead": "2c9707207a827f2e199268a0e53ee3718fc4f828"
46
+ "gitHead": "061bfb393e0e5faabf92ef07b21e60107a5e7971"
45
47
  }