@jpmorganchase/mosaic-source-figma 0.1.0-beta.59

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.
@@ -0,0 +1,115 @@
1
+ import { z } from 'zod';
2
+ import type { Source } from '@jpmorganchase/mosaic-types';
3
+ import type { FigmaPage } from './types/index.js';
4
+ export declare const schema: z.ZodObject<{
5
+ schedule: z.ZodOptional<z.ZodObject<{
6
+ checkIntervalMins: z.ZodNumber;
7
+ initialDelayMs: z.ZodNumber;
8
+ retryEnabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
9
+ retryDelayMins: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
10
+ maxRetries: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
11
+ resetOnSuccess: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ checkIntervalMins: number;
14
+ initialDelayMs: number;
15
+ retryEnabled: boolean;
16
+ retryDelayMins: number;
17
+ maxRetries: number;
18
+ resetOnSuccess: boolean;
19
+ }, {
20
+ checkIntervalMins: number;
21
+ initialDelayMs: number;
22
+ retryEnabled?: boolean | undefined;
23
+ retryDelayMins?: number | undefined;
24
+ maxRetries?: number | undefined;
25
+ resetOnSuccess?: boolean | undefined;
26
+ }>>;
27
+ proxyEndpoint: z.ZodOptional<z.ZodString>;
28
+ noProxy: z.ZodOptional<z.ZodEffects<z.ZodAny, RegExp, any>>;
29
+ requestHeaders: z.ZodOptional<z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>>;
30
+ prefixDir: z.ZodString;
31
+ figmaToken: z.ZodString;
32
+ projects: z.ZodArray<z.ZodObject<{
33
+ id: z.ZodNumber;
34
+ patternPrefix: z.ZodString;
35
+ meta: z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>;
36
+ }, "strip", z.ZodTypeAny, {
37
+ id: number;
38
+ patternPrefix: string;
39
+ meta: {} & {
40
+ [k: string]: unknown;
41
+ };
42
+ }, {
43
+ id: number;
44
+ patternPrefix: string;
45
+ meta: {} & {
46
+ [k: string]: unknown;
47
+ };
48
+ }>, "many">;
49
+ endpoints: z.ZodObject<{
50
+ getFile: z.ZodString;
51
+ getProject: z.ZodString;
52
+ }, "strip", z.ZodTypeAny, {
53
+ getFile: string;
54
+ getProject: string;
55
+ }, {
56
+ getFile: string;
57
+ getProject: string;
58
+ }>;
59
+ requestTimeout: z.ZodDefault<z.ZodNumber>;
60
+ }, "strip", z.ZodTypeAny, {
61
+ endpoints: {
62
+ getFile: string;
63
+ getProject: string;
64
+ };
65
+ prefixDir: string;
66
+ requestTimeout: number;
67
+ figmaToken: string;
68
+ projects: {
69
+ id: number;
70
+ patternPrefix: string;
71
+ meta: {} & {
72
+ [k: string]: unknown;
73
+ };
74
+ }[];
75
+ schedule?: {
76
+ checkIntervalMins: number;
77
+ initialDelayMs: number;
78
+ retryEnabled: boolean;
79
+ retryDelayMins: number;
80
+ maxRetries: number;
81
+ resetOnSuccess: boolean;
82
+ } | undefined;
83
+ proxyEndpoint?: string | undefined;
84
+ noProxy?: RegExp | undefined;
85
+ requestHeaders?: z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
86
+ }, {
87
+ endpoints: {
88
+ getFile: string;
89
+ getProject: string;
90
+ };
91
+ prefixDir: string;
92
+ figmaToken: string;
93
+ projects: {
94
+ id: number;
95
+ patternPrefix: string;
96
+ meta: {} & {
97
+ [k: string]: unknown;
98
+ };
99
+ }[];
100
+ schedule?: {
101
+ checkIntervalMins: number;
102
+ initialDelayMs: number;
103
+ retryEnabled?: boolean | undefined;
104
+ retryDelayMins?: number | undefined;
105
+ maxRetries?: number | undefined;
106
+ resetOnSuccess?: boolean | undefined;
107
+ } | undefined;
108
+ proxyEndpoint?: string | undefined;
109
+ noProxy?: any;
110
+ requestHeaders?: z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
111
+ requestTimeout?: number | undefined;
112
+ }>;
113
+ export declare type FigmaSourceOptions = z.infer<typeof schema>;
114
+ declare const FigmaSource: Source<FigmaSourceOptions, FigmaPage>;
115
+ export default FigmaSource;
package/dist/index.js ADDED
@@ -0,0 +1,91 @@
1
+ import { switchMap } from 'rxjs';
2
+ import { z } from 'zod';
3
+ import deepmerge from 'deepmerge';
4
+ import { validateMosaicSchema } from '@jpmorganchase/mosaic-schemas';
5
+ import { createHttpSource, httpSourceCreatorSchema } from '@jpmorganchase/mosaic-source-http';
6
+ import createFigmaPage from './transformer.js';
7
+ const baseSchema = httpSourceCreatorSchema.omit({
8
+ endpoints: true,
9
+ transformerOptions: true // stories is the prop we need for this so no point duplicating it in source config
10
+ });
11
+ export const schema = baseSchema.merge(z.object({
12
+ prefixDir: z.string(),
13
+ figmaToken: z.string(),
14
+ projects: z.array(z.object({
15
+ id: z.number(),
16
+ patternPrefix: z.string(),
17
+ meta: z.object({}).passthrough()
18
+ })),
19
+ endpoints: z.object({
20
+ getFile: z.string().url(),
21
+ getProject: z.string().url()
22
+ }),
23
+ requestTimeout: z.number().default(5000)
24
+ }));
25
+ const FigmaSource = {
26
+ create(options, sourceConfig) {
27
+ const parsedOptions = validateMosaicSchema(schema, options);
28
+ const { endpoints, projects, figmaToken, proxyEndpoint, prefixDir, requestHeaders: requestHeadersParam } = parsedOptions;
29
+ const projectEndpoints = projects.map(project => endpoints.getProject.replace(':project_id', project.id.toString()));
30
+ const projectsTransformer = (response, _prefixDir, index) => [response].reduce((allProjectFileUrls, { files }) => {
31
+ const projectFileUrls = files.reduce((project, { key }) => {
32
+ const fileUrlAndMetadata = {
33
+ fileUrl: endpoints.getFile.replace(':file_id', key),
34
+ meta: projects[index].meta
35
+ };
36
+ return [...project, fileUrlAndMetadata];
37
+ }, []);
38
+ return [...allProjectFileUrls, ...projectFileUrls];
39
+ }, []);
40
+ const projectFilesTransformer = (response, _prefixDir, index, transformerOptions) => {
41
+ const { document: { sharedPluginData } } = response;
42
+ const { patternPrefix } = projects[index];
43
+ return Object.keys(sharedPluginData).reduce((figmaPagesResult, patternId) => {
44
+ if (patternId.indexOf(patternPrefix) === 0) {
45
+ /** Figma provided metadata */
46
+ const figmaProvidedMetadata = {
47
+ data: {
48
+ patternId,
49
+ ...sharedPluginData[patternId]
50
+ }
51
+ };
52
+ const sourceProvidedMetadata = transformerOptions[index].meta;
53
+ const figmaPageMeta = sourceProvidedMetadata
54
+ ? deepmerge(figmaProvidedMetadata, sourceProvidedMetadata || {})
55
+ : figmaProvidedMetadata;
56
+ return [...figmaPagesResult, createFigmaPage(figmaPageMeta, prefixDir)];
57
+ }
58
+ return figmaPagesResult;
59
+ }, []);
60
+ };
61
+ const projects$ = createHttpSource({
62
+ endpoints: projectEndpoints,
63
+ requestHeaders: {
64
+ 'Content-Type': 'application/json',
65
+ 'X-FIGMA-TOKEN': figmaToken,
66
+ ...requestHeadersParam
67
+ },
68
+ proxyEndpoint,
69
+ prefixDir,
70
+ transformer: projectsTransformer
71
+ }, sourceConfig);
72
+ const figmaSource$ = projects$.pipe(switchMap(fileUrlAndMetaCollection => {
73
+ const fileUrls = fileUrlAndMetaCollection.map(item => item.fileUrl);
74
+ return createHttpSource({
75
+ endpoints: fileUrls,
76
+ requestHeaders: {
77
+ 'Content-Type': 'application/json',
78
+ 'X-FIGMA-TOKEN': figmaToken,
79
+ ...requestHeadersParam
80
+ },
81
+ proxyEndpoint,
82
+ prefixDir,
83
+ transformer: projectFilesTransformer,
84
+ transformerOptions: fileUrlAndMetaCollection
85
+ });
86
+ }));
87
+ return figmaSource$;
88
+ }
89
+ };
90
+ export default FigmaSource;
91
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { FigmaPage } from './types/index.js';
2
+ declare const createFigmaPage: (pageData: Partial<FigmaPage>, prefixDir: string) => {
3
+ title: string | undefined;
4
+ data: {
5
+ source: string;
6
+ };
7
+ description: string | undefined;
8
+ route: string;
9
+ fullPath: string;
10
+ tags: string[];
11
+ content: string;
12
+ } & {
13
+ content: string;
14
+ description?: string | undefined;
15
+ data: import("./types/index.js").FigmaPageData;
16
+ tags: string[];
17
+ } & import("packages/types/dist/Page.js").Page;
18
+ export default createFigmaPage;
@@ -0,0 +1,18 @@
1
+ import deepmerge from 'deepmerge';
2
+ const createFigmaPage = (pageData, prefixDir) => {
3
+ const { data: { name, description, patternId, tags } = {} } = pageData;
4
+ const route = `${prefixDir}/${patternId}`.replace(/\./g, '_').toLowerCase();
5
+ const pageTags = tags ? tags.split(',') : [];
6
+ const figmaPage = {
7
+ title: name,
8
+ data: { source: 'FIGMA' },
9
+ description,
10
+ route,
11
+ fullPath: `${route}.json`,
12
+ tags: pageTags,
13
+ content: ``
14
+ };
15
+ return deepmerge(figmaPage, pageData);
16
+ };
17
+ export default createFigmaPage;
18
+ //# sourceMappingURL=transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.js","sourceRoot":"","sources":["../src/transformer.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAC;AAIlC,MAAM,eAAe,GAAG,CAAC,QAA4B,EAAE,SAAiB,EAAE,EAAE;IAC1E,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,QAAQ,CAAC;IACvE,MAAM,KAAK,GAAG,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG;QAChB,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;QACzB,WAAW;QACX,KAAK;QACL,QAAQ,EAAE,GAAG,KAAK,OAAO;QACzB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;KACZ,CAAC;IACF,OAAO,SAAS,CAA8B,SAAS,EAAE,QAAQ,CAAC,CAAC;AACrE,CAAC,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { Page } from '@jpmorganchase/mosaic-types';
2
+ /** Get project response */
3
+ export declare type ProjectResponseJson = {
4
+ document: {
5
+ id: string;
6
+ name: string;
7
+ sharedPluginData: Record<string, any>;
8
+ };
9
+ name: string;
10
+ lastModified: string;
11
+ thumbnailUrl: string;
12
+ version: string;
13
+ };
14
+ export declare type ProjectFile = {
15
+ key: string;
16
+ thumbnail_url: string;
17
+ last_modified: string;
18
+ branches?: ProjectFile[];
19
+ };
20
+ /** Get project files response */
21
+ export declare type ProjectFilesResponseJson = {
22
+ name: string;
23
+ files: ProjectFile[];
24
+ };
25
+ export declare type FileUrlAndMeta = {
26
+ fileUrl: string;
27
+ meta?: Record<string, unknown>;
28
+ };
29
+ /** Figma page Metadata */
30
+ export declare type FigmaPageData = {
31
+ name: string;
32
+ patternId: string;
33
+ description: string;
34
+ embedLink: string;
35
+ link: string;
36
+ source: 'FIGMA';
37
+ tags?: string;
38
+ };
39
+ /** Figma page */
40
+ export declare type FigmaPage = {
41
+ content: string;
42
+ description?: string;
43
+ data: FigmaPageData;
44
+ tags: string[];
45
+ } & Page;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@jpmorganchase/mosaic-source-figma",
3
+ "version": "0.1.0-beta.59",
4
+ "author": "",
5
+ "description": "Mosaic Figma source for core file system",
6
+ "license": "Apache-2.0",
7
+ "main": "./dist/index.js",
8
+ "type": "module",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "node": "./dist/index.js",
15
+ "default": "./dist/index.js"
16
+ }
17
+ },
18
+ "engines": {
19
+ "node": ">= 16.0.0"
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsc",
26
+ "clean": "rm -fr dist",
27
+ "lint": "eslint --ignore-pattern \"**/__tests__/**\""
28
+ },
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "git@github.com:jpmorganchase/mosaic.git"
32
+ },
33
+ "dependencies": {
34
+ "@jpmorganchase/mosaic-source-http": "^0.1.0-beta.59",
35
+ "@jpmorganchase/mosaic-schemas": "^0.1.0-beta.59",
36
+ "@jpmorganchase/mosaic-types": "^0.1.0-beta.59",
37
+ "deepmerge": "^4.2.2",
38
+ "rxjs": "^7.5.5",
39
+ "zod": "^3.22.3"
40
+ },
41
+ "devDependencies": {
42
+ "msw": "^0.47.4"
43
+ }
44
+ }