@jpmorganchase/mosaic-source-figma 0.1.0-beta.94 → 0.1.0-beta.96

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/index.d.ts CHANGED
@@ -60,6 +60,16 @@ export declare const schema: z.ZodObject<{
60
60
  generateThumbnail: string;
61
61
  }>;
62
62
  requestTimeout: z.ZodDefault<z.ZodNumber>;
63
+ cache: z.ZodOptional<z.ZodObject<{
64
+ ttl: z.ZodDefault<z.ZodNumber>;
65
+ dir: z.ZodOptional<z.ZodString>;
66
+ }, "strip", z.ZodTypeAny, {
67
+ ttl: number;
68
+ dir?: string | undefined;
69
+ }, {
70
+ ttl?: number | undefined;
71
+ dir?: string | undefined;
72
+ }>>;
63
73
  }, "strip", z.ZodTypeAny, {
64
74
  endpoints: {
65
75
  getFile: string;
@@ -87,6 +97,10 @@ export declare const schema: z.ZodObject<{
87
97
  proxyEndpoint?: string | undefined;
88
98
  noProxy?: RegExp | undefined;
89
99
  requestHeaders?: z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
100
+ cache?: {
101
+ ttl: number;
102
+ dir?: string | undefined;
103
+ } | undefined;
90
104
  }, {
91
105
  endpoints: {
92
106
  getFile: string;
@@ -114,6 +128,10 @@ export declare const schema: z.ZodObject<{
114
128
  noProxy?: any;
115
129
  requestHeaders?: z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
116
130
  requestTimeout?: number | undefined;
131
+ cache?: {
132
+ ttl?: number | undefined;
133
+ dir?: string | undefined;
134
+ } | undefined;
117
135
  }>;
118
136
  export type FigmaSourceOptions = z.infer<typeof schema>;
119
137
  declare const FigmaSource: Source<FigmaSourceOptions, FigmaPage>;
package/dist/index.js CHANGED
@@ -1,11 +1,13 @@
1
- import { switchMap } from 'rxjs';
1
+ import { switchMap, of, tap, map } from 'rxjs';
2
2
  import { z } from 'zod';
3
3
  import deepmerge from 'deepmerge';
4
+ import path from 'path';
4
5
  import { validateMosaicSchema } from '@jpmorganchase/mosaic-schemas';
5
6
  import { createHttpSource, httpSourceCreatorSchema } from '@jpmorganchase/mosaic-source-http';
7
+ import { ThumbnailCache } from './utils/thumbnailCache.js';
6
8
  const baseSchema = httpSourceCreatorSchema.omit({
7
- endpoints: true, // will be generated from the url in the stories object,
8
- transformerOptions: true // stories is the prop we need for this so no point duplicating it in source config
9
+ endpoints: true,
10
+ transformerOptions: true
9
11
  });
10
12
  export const schema = baseSchema.merge(z.object({
11
13
  prefixDir: z.string(),
@@ -20,7 +22,13 @@ export const schema = baseSchema.merge(z.object({
20
22
  getProject: z.string().url(),
21
23
  generateThumbnail: z.string().url()
22
24
  }),
23
- requestTimeout: z.number().default(5000)
25
+ requestTimeout: z.number().default(5000),
26
+ cache: z
27
+ .object({
28
+ ttl: z.number().default(24 * 60 * 60 * 1000),
29
+ dir: z.string().optional()
30
+ })
31
+ .optional()
24
32
  }));
25
33
  const createFigmaPage = (pageData, prefixDir) => {
26
34
  const { data: { name, description, patternId } = {} } = pageData;
@@ -37,7 +45,13 @@ const createFigmaPage = (pageData, prefixDir) => {
37
45
  const FigmaSource = {
38
46
  create(options, sourceConfig) {
39
47
  const parsedOptions = validateMosaicSchema(schema, options);
40
- const { endpoints, projects, figmaToken, prefixDir, ...rest } = parsedOptions;
48
+ const { endpoints, projects, figmaToken, prefixDir, cache, ...rest } = parsedOptions;
49
+ const thumbnailCache = cache
50
+ ? new ThumbnailCache({
51
+ cacheDir: cache.dir || path.join(process.cwd(), '.tmp', '.cache', 'figma-thumbnails'),
52
+ ttl: cache.ttl
53
+ })
54
+ : null;
41
55
  const projectEndpoints = {};
42
56
  const projectById = {};
43
57
  projects.forEach(project => {
@@ -67,7 +81,7 @@ const FigmaSource = {
67
81
  };
68
82
  const getPatternPrefix = (metadata) => projectById[metadata?.data?.projectId].patternPrefix ?? null;
69
83
  const projectFilesTransformer = (response, _prefixDir, index, transformerOptions) => {
70
- const { document: { sharedPluginData = {} } = {} } = response;
84
+ const { document: { sharedPluginData = {} } = {}, lastModified } = response;
71
85
  const sourceProvidedMetadata = transformerOptions[index].meta ?? {};
72
86
  const patternPrefix = getPatternPrefix(sourceProvidedMetadata);
73
87
  return Object.keys(sharedPluginData).reduce((figmaPagesResult, patternId) => {
@@ -79,6 +93,7 @@ const FigmaSource = {
79
93
  tags,
80
94
  data: {
81
95
  patternId,
96
+ lastModified,
82
97
  ...patternData
83
98
  }
84
99
  };
@@ -88,21 +103,6 @@ const FigmaSource = {
88
103
  return figmaPagesResult;
89
104
  }, []);
90
105
  };
91
- const generateThumbnailTransformer = (response, _prefixDir, index, transformerOptions) => {
92
- const fileId = transformerOptions.fileIds[index];
93
- if (response.err) {
94
- console.error(`Figma returned ${response.err} for ${fileId} thumbnail generation `);
95
- return transformerOptions.pages;
96
- }
97
- const thumbnailNodes = Object.keys(response.images);
98
- thumbnailNodes.forEach(thumbnailNodeId => {
99
- const pageForNode = transformerOptions.pages.find(page => page.data.fileId === fileId && page.data.nodeId === thumbnailNodeId);
100
- if (pageForNode) {
101
- pageForNode.data.contentUrl = response.images[thumbnailNodeId];
102
- }
103
- });
104
- return transformerOptions.pages;
105
- };
106
106
  const projects$ = createHttpSource({
107
107
  endpoints: Object.values(projectEndpoints),
108
108
  prefixDir,
@@ -114,7 +114,12 @@ const FigmaSource = {
114
114
  },
115
115
  transformer: projectsTransformer,
116
116
  transformerOptions: { projectIds: Object.keys(projectEndpoints) }
117
- }, sourceConfig);
117
+ }, sourceConfig).pipe(tap(summary => {
118
+ if (summary.errors.length > 0) {
119
+ console.error('[Mosaic][Source-Figma] Project fetch errors:');
120
+ console.error(JSON.stringify(summary.errors, null, 2));
121
+ }
122
+ }), map(summary => summary.results.map(result => result.data)));
118
123
  const figmaPages$ = projects$.pipe(switchMap(projectFiles => {
119
124
  const fileUrls = projectFiles.map(item => item.fileUrl);
120
125
  return createHttpSource({
@@ -128,9 +133,19 @@ const FigmaSource = {
128
133
  },
129
134
  transformer: projectFilesTransformer,
130
135
  transformerOptions: projectFiles
131
- });
136
+ }).pipe(tap(summary => {
137
+ if (summary.errors.length > 0) {
138
+ console.error('[Mosaic][Source-Figma] Project files fetch errors:');
139
+ console.error(JSON.stringify(summary.errors, null, 2));
140
+ }
141
+ }), map(summary => summary.results.map(result => result.data)));
132
142
  }));
133
143
  const figmaPagesWithThumbnails$ = figmaPages$.pipe(switchMap(figmaPages => {
144
+ figmaPages.forEach(page => {
145
+ if (page.data && !page.data.contentUrl) {
146
+ page.data.contentUrl = undefined;
147
+ }
148
+ });
134
149
  const thumbnailNodes = figmaPages.reduce((thumbnailNodeMap, page) => {
135
150
  const { fileId } = page.data;
136
151
  if (thumbnailNodeMap[fileId]) {
@@ -141,10 +156,74 @@ const FigmaSource = {
141
156
  }
142
157
  return thumbnailNodeMap;
143
158
  }, {});
144
- const thumbnailRequestUrls = Object.keys(thumbnailNodes).map(fileId => {
159
+ const fileMetadata = figmaPages.reduce((metadataMap, page) => {
160
+ const { fileId } = page.data;
161
+ if (!metadataMap[fileId]) {
162
+ metadataMap[fileId] = {
163
+ lastModified: page.data.lastModified || new Date().toISOString()
164
+ };
165
+ }
166
+ return metadataMap;
167
+ }, {});
168
+ const filesToFetch = [];
169
+ const fileIds = Object.keys(thumbnailNodes);
170
+ if (thumbnailCache) {
171
+ for (const fileId of fileIds) {
172
+ const fileLastModified = fileMetadata[fileId]?.lastModified;
173
+ const cachedThumbnails = thumbnailCache.getThumbnails(fileId, fileLastModified);
174
+ if (cachedThumbnails) {
175
+ console.log(`[Mosaic][Source-Figma] Using cached thumbnail files for ${fileId} (lastModified: ${fileLastModified})`);
176
+ for (const page of figmaPages) {
177
+ if (page.data.fileId === fileId &&
178
+ cachedThumbnails[page.data.nodeId] &&
179
+ cachedThumbnails[page.data.nodeId] !== null) {
180
+ page.data.contentUrl = cachedThumbnails[page.data.nodeId];
181
+ }
182
+ }
183
+ }
184
+ else {
185
+ filesToFetch.push(fileId);
186
+ }
187
+ }
188
+ }
189
+ else {
190
+ filesToFetch.push(...fileIds);
191
+ }
192
+ if (filesToFetch.length === 0) {
193
+ return of(figmaPages);
194
+ }
195
+ const thumbnailRequestUrls = filesToFetch.map(fileId => {
145
196
  const generateThumbnailUrl = endpoints.generateThumbnail.replace(':project_id', fileId);
146
197
  return generateThumbnailUrl.replace(':node_id', thumbnailNodes[fileId].join(','));
147
198
  });
199
+ const cachedThumbnailTransformer = (response, _prefixDir, index, transformerOptions) => {
200
+ const fileId = transformerOptions.fileIds[index];
201
+ if (response.err) {
202
+ console.error(`[Source-Figma] Figma returned ${response.err} for ${fileId} thumbnail generation`);
203
+ }
204
+ if (thumbnailCache && !response.err && response.images) {
205
+ const validThumbnails = {};
206
+ for (const nodeId in response.images) {
207
+ if (response.images[nodeId] && response.images[nodeId] !== null) {
208
+ validThumbnails[nodeId] = response.images[nodeId];
209
+ }
210
+ }
211
+ if (Object.keys(validThumbnails).length > 0) {
212
+ const fileLastModified = fileMetadata[fileId]?.lastModified;
213
+ thumbnailCache.storeThumbnails(fileId, validThumbnails, fileLastModified);
214
+ }
215
+ }
216
+ if (response.images) {
217
+ const thumbnailNodes = Object.keys(response.images);
218
+ thumbnailNodes.forEach(thumbnailNodeId => {
219
+ const pageForNode = transformerOptions.pages.find(page => page.data.fileId === fileId && page.data.nodeId === thumbnailNodeId);
220
+ if (pageForNode && response.images[thumbnailNodeId]) {
221
+ pageForNode.data.contentUrl = response.images[thumbnailNodeId];
222
+ }
223
+ });
224
+ }
225
+ return transformerOptions.pages;
226
+ };
148
227
  return createHttpSource({
149
228
  endpoints: thumbnailRequestUrls,
150
229
  prefixDir,
@@ -154,9 +233,14 @@ const FigmaSource = {
154
233
  'X-FIGMA-TOKEN': figmaToken,
155
234
  ...rest.requestHeaders
156
235
  },
157
- transformer: generateThumbnailTransformer,
158
- transformerOptions: { fileIds: Object.keys(thumbnailNodes), pages: figmaPages }
159
- });
236
+ transformer: cachedThumbnailTransformer,
237
+ transformerOptions: { fileIds: filesToFetch, pages: figmaPages }
238
+ }).pipe(tap(summary => {
239
+ if (summary.errors.length > 0) {
240
+ console.error('[Mosaic][Source-Figma] Thumbnail fetch errors:');
241
+ console.error(JSON.stringify(summary.errors, null, 2));
242
+ }
243
+ }), map(summary => summary.results.map(result => result.data)));
160
244
  }));
161
245
  return figmaPagesWithThumbnails$;
162
246
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -49,6 +49,7 @@ export type FigmaPageData = {
49
49
  nodeId: string;
50
50
  link: string;
51
51
  contentUrl?: string;
52
+ lastModified?: string;
52
53
  };
53
54
  /** Figma page */
54
55
  export type FigmaPage = {
@@ -0,0 +1,15 @@
1
+ /**
2
+ * A cache for Figma thumbnail URLs to reduce API calls and avoid rate limits
3
+ */
4
+ export declare class ThumbnailCache {
5
+ private cacheDir;
6
+ private ttl;
7
+ constructor(options: {
8
+ cacheDir: string;
9
+ ttl: number;
10
+ });
11
+ private getCacheFilePath;
12
+ private isCacheValidWithModificationCheck;
13
+ getThumbnails(fileId: string, fileLastModified?: string): Record<string, string> | null;
14
+ storeThumbnails(fileId: string, thumbnails: Record<string, string>, fileLastModified?: string): void;
15
+ }
@@ -0,0 +1,86 @@
1
+ import fs, { existsSync, mkdirSync } from 'fs';
2
+ import path from 'path';
3
+ /**
4
+ * A cache for Figma thumbnail URLs to reduce API calls and avoid rate limits
5
+ */
6
+ export class ThumbnailCache {
7
+ cacheDir;
8
+ ttl;
9
+ constructor(options) {
10
+ this.cacheDir = options.cacheDir;
11
+ this.ttl = options.ttl;
12
+ if (!existsSync(this.cacheDir)) {
13
+ mkdirSync(this.cacheDir, { recursive: true });
14
+ }
15
+ }
16
+ getCacheFilePath(fileId) {
17
+ return path.join(this.cacheDir, `thumbnail-${fileId}.json`);
18
+ }
19
+ isCacheValidWithModificationCheck(cacheFilePath, currentFileLastModified) {
20
+ try {
21
+ if (!fs.existsSync(cacheFilePath)) {
22
+ return false;
23
+ }
24
+ const cacheContent = fs.readFileSync(cacheFilePath, 'utf8');
25
+ const cacheEntry = JSON.parse(cacheContent);
26
+ const ageInMs = Date.now() - cacheEntry.cachedAt;
27
+ if (ageInMs >= this.ttl) {
28
+ return false;
29
+ }
30
+ if (currentFileLastModified) {
31
+ const currentModTime = new Date(currentFileLastModified).getTime();
32
+ const cachedModTime = new Date(cacheEntry.fileLastModified).getTime();
33
+ if (currentModTime > cachedModTime) {
34
+ console.log(`[Mosaic][Source-Figma] File was modified after cache (file: ${currentFileLastModified}, cache: ${cacheEntry.fileLastModified})`);
35
+ return false;
36
+ }
37
+ }
38
+ return true;
39
+ }
40
+ catch (error) {
41
+ console.error('[Mosaic][Source-Figma] Error reading cache for modification check:', error);
42
+ return false;
43
+ }
44
+ }
45
+ getThumbnails(fileId, fileLastModified) {
46
+ const cacheFilePath = this.getCacheFilePath(fileId);
47
+ if (!this.isCacheValidWithModificationCheck(cacheFilePath, fileLastModified)) {
48
+ if (existsSync(cacheFilePath)) {
49
+ try {
50
+ const reason = fileLastModified ? 'file modification or TTL expiry' : 'TTL expiry';
51
+ fs.unlinkSync(cacheFilePath);
52
+ console.log(`[Mosaic][Source-Figma] Removed invalid cache file: thumbnail-${fileId}.json (reason: ${reason})`);
53
+ }
54
+ catch (error) {
55
+ console.error('[Mosaic][Source-Figma] Error removing invalid cache file:', error);
56
+ }
57
+ }
58
+ return null;
59
+ }
60
+ try {
61
+ const cacheContent = fs.readFileSync(cacheFilePath, 'utf8');
62
+ const cacheEntry = JSON.parse(cacheContent);
63
+ return cacheEntry.thumbnails;
64
+ }
65
+ catch (error) {
66
+ console.error('[Mosaic][Source-Figma] Error reading thumbnail cache:', error);
67
+ return null;
68
+ }
69
+ }
70
+ storeThumbnails(fileId, thumbnails, fileLastModified) {
71
+ const cacheFilePath = this.getCacheFilePath(fileId);
72
+ const cacheEntry = {
73
+ thumbnails,
74
+ fileLastModified: fileLastModified || new Date().toISOString(),
75
+ cachedAt: Date.now()
76
+ };
77
+ try {
78
+ fs.writeFileSync(cacheFilePath, JSON.stringify(cacheEntry));
79
+ console.log(`[Mosaic][Source-Figma] Cached ${Object.keys(thumbnails).length} thumbnails for file ${fileId} (lastModified: ${cacheEntry.fileLastModified})`);
80
+ }
81
+ catch (error) {
82
+ console.error('[Mosaic][Source-Figma] Error writing thumbnail cache:', error);
83
+ }
84
+ }
85
+ }
86
+ //# sourceMappingURL=thumbnailCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thumbnailCache.js","sourceRoot":"","sources":["../../src/utils/thumbnailCache.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jpmorganchase/mosaic-source-figma",
3
- "version": "0.1.0-beta.94",
3
+ "version": "0.1.0-beta.96",
4
4
  "author": "",
5
5
  "description": "Mosaic Figma source for core file system",
6
6
  "license": "Apache-2.0",
@@ -31,9 +31,9 @@
31
31
  "url": "git@github.com:jpmorganchase/mosaic.git"
32
32
  },
33
33
  "dependencies": {
34
- "@jpmorganchase/mosaic-source-http": "^0.1.0-beta.94",
35
- "@jpmorganchase/mosaic-schemas": "^0.1.0-beta.94",
36
- "@jpmorganchase/mosaic-types": "^0.1.0-beta.94",
34
+ "@jpmorganchase/mosaic-schemas": "^0.1.0-beta.96",
35
+ "@jpmorganchase/mosaic-source-http": "^0.1.0-beta.96",
36
+ "@jpmorganchase/mosaic-types": "^0.1.0-beta.96",
37
37
  "deepmerge": "^4.2.2",
38
38
  "rxjs": "^7.5.5",
39
39
  "zod": "^3.22.3"
@@ -41,4 +41,4 @@
41
41
  "devDependencies": {
42
42
  "msw": "^2.0.0"
43
43
  }
44
- }
44
+ }