Skip to content

Commit 4673272

Browse files
Merge pull request #1 from Space48/translation-support
Add translations support to start and publish commands
2 parents 47030f7 + 10e7610 commit 4673272

File tree

9 files changed

+54
-17
lines changed

9 files changed

+54
-17
lines changed

src/cli/run/validate.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Command } from 'commander';
66

77
import validateSchema from '../../services/schema/schemaValidator/validateSchema';
88
import validateQueryParamsBuilder from '../../services/query/queryParamsBuilderValidator/validateQueryParamsBuilder';
9-
import validateTranslation from '../../services/translation/validate';
9+
import validateTranslation from '../../services/translation/translationValidator/validateTranslation';
1010

1111
const helperText = `
1212
Usage:

src/server/index.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import generateQueryParams from '../services/query/generateQueryParams';
1616
import validateQueryParamsBuilder from '../services/query/queryParamsBuilderValidator/validateQueryParamsBuilder';
1717
import renderWidget from '../services/widgetRenderer/widgetRenderer';
1818
import generateConfig from '../services/widgetConfig/generateConfig';
19+
import validateTranslation from '../services/translation/translationValidator/validateTranslation';
1920

2021
const BUILDER_ADDRESS = `${host}:${port}`;
2122

@@ -62,6 +63,14 @@ function setupFileWatcher({ directory, sockets, options }: Watcher) {
6263

6364
break;
6465

66+
case WidgetFileType.TRANSLATION:
67+
validateTranslation(directory);
68+
69+
liveReload({
70+
directory, sockets, fileEvent, filePath, options,
71+
});
72+
break;
73+
6574
case WidgetFileType.META:
6675
// We are not currently handling this file type
6776
break;

src/services/api/widget.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export interface WidgetPreviewRenderRequest {
2222
storefront_api_query: string;
2323
storefront_api_query_params: object;
2424
channel_id: number;
25+
schema_translations?: string;
2526
}
2627

2728
export function getWidget(data: WidgetPreviewRenderRequest): Promise<string> {

src/services/translation/translationLoader/translationLoader.test.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import fs from 'fs';
22

3-
import { messages } from '../../../messages';
4-
5-
import translationLoader, { handleSchemaLoader } from './translationLoader';
3+
import translationLoader, { handleSchemaLoader, translationDefaultPayload } from './translationLoader';
64

75
const schemaData = fs.readFileSync('src/services/__fixtures__/schema_translations.json', 'utf8').toString();
86

@@ -33,7 +31,7 @@ describe('Schema Loader', () => {
3331
it('should return with no data', () => {
3432
const result = translationLoader('dummyPath');
3533

36-
expect(result).rejects.toEqual(messages.invalidTranslationSchema());
34+
expect(result).resolves.toEqual(translationDefaultPayload);
3735
});
3836
});
3937
});

src/services/translation/translationLoader/translationLoader.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,32 @@ import * as fs from 'fs';
33
import WidgetFileType, { FileLoaderResponse } from '../../../types';
44
import { messages } from '../../../messages';
55

6-
export function handleSchemaLoader(error: Error | null, schemaData: string): FileLoaderResponse {
7-
const payload = {
8-
type: WidgetFileType.TRANSLATION,
9-
data: '',
10-
};
6+
export const translationDefaultPayload = {
7+
type: WidgetFileType.TRANSLATION,
8+
data: '{}',
9+
};
1110

11+
export function handleSchemaLoader(error: Error | null, schemaData: string): FileLoaderResponse {
1212
if (schemaData && !error) {
13-
payload.data = schemaData;
13+
return {
14+
...translationDefaultPayload,
15+
data: schemaData,
16+
}
1417
}
1518

16-
return payload;
19+
return translationDefaultPayload;
1720
}
1821

1922
export default function translationLoader(widgetDir: string): Promise<FileLoaderResponse> {
2023
return new Promise((resolve, reject) => {
2124
fs.readFile(
2225
`${widgetDir}/${WidgetFileType.TRANSLATION}`,
2326
'utf8',
24-
(error: Error, schemaData: string) => {
27+
(error: NodeJS.ErrnoException, schemaData: string) => {
28+
if (error && error.code === 'ENOENT') {
29+
resolve(translationDefaultPayload);
30+
}
31+
2532
const schemaResults = handleSchemaLoader(error, schemaData);
2633

2734
if (!schemaResults.data) {

src/services/translation/validate.ts renamed to src/services/translation/translationValidator/validateTranslation.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { FileLoaderResponse } from '../../types';
2-
import { log } from '../../messages';
1+
import { FileLoaderResponse } from '../../../types';
2+
import { log } from '../../../messages';
33

4-
import TranslationValidator from './translationValidator/translationValidator';
5-
import translationLoader from './translationLoader/translationLoader';
4+
import TranslationValidator from './translationValidator';
5+
import translationLoader from '../translationLoader/translationLoader';
66

77
export default function validateTranslation(directory: string) {
88
return translationLoader(directory)

src/services/widgetRenderer/widgetRenderer.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import WidgetFileType, { FileLoaderResponse } from '../../types';
55
import { generateRenderPayloadFromFileLoaderResults } from './widgetRenderer';
66

77
const configurationData = fs.readFileSync('src/services/__fixtures__/config.json', 'utf8').toString();
8+
const translationsData = fs.readFileSync('src/services/__fixtures__/schema_translations.json', 'utf8').toString();
89
const htmlData = fs.readFileSync('src/services/__fixtures__/widget.html', 'utf8').toString();
910
const query = fs.readFileSync('src/services/__fixtures__/query.graphql', 'utf8').toString();
1011
const queryParams = fs.readFileSync('src/services/__fixtures__/queryParams.json', 'utf8').toString();
@@ -26,6 +27,10 @@ const fileLoaderResponseData: FileLoaderResponse[] = [
2627
type: WidgetFileType.QUERY_PARAMS,
2728
data: queryParams,
2829
},
30+
{
31+
type: WidgetFileType.TRANSLATION,
32+
data: translationsData,
33+
},
2934
];
3035

3136
describe('Widget Renderer', () => {
@@ -38,6 +43,7 @@ describe('Widget Renderer', () => {
3843
widget_uuid,
3944
storefront_api_query,
4045
storefront_api_query_params,
46+
schema_translations,
4147
} = generateRenderPayloadFromFileLoaderResults(fileLoaderResponseData);
4248

4349

@@ -47,5 +53,6 @@ describe('Widget Renderer', () => {
4753
expect(storefront_api_query_params).toEqual(JSON.parse(queryParams));
4854
expect(placement_uuid).not.toBeNull();
4955
expect(widget_uuid).not.toBeNull();
56+
expect(schema_translations).toEqual(JSON.parse(translationsData));
5057
});
5158
});

src/services/widgetRenderer/widgetRenderer.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import widgetTemplateLoader from '../widgetTemplate/widgetTemplateLoader/widgetT
66
import widgetConfigLoader from '../widgetConfig/widgetConfigLoader/widgetConfigLoader';
77
import queryLoader from '../query/queryLoader/queryLoader';
88
import queryParamsLoader from '../query/queryParamsLoader/queryParamsLoader';
9+
import translationsLoader from '../translation/translationLoader/translationLoader';
910

1011
const channelId = process.env.WIDGET_BUILDER_CHANNEL_ID ? parseInt(process.env.WIDGET_BUILDER_CHANNEL_ID, 10) : 1;
1112

@@ -17,6 +18,7 @@ const getInitialRenderingPayload = (): WidgetPreviewRenderRequest => ({
1718
storefront_api_query: '',
1819
storefront_api_query_params: {},
1920
channel_id: channelId,
21+
schema_translations: '',
2022
});
2123

2224
export function generateRenderPayloadFromFileLoaderResults(results: FileLoaderResponse[]): WidgetPreviewRenderRequest {
@@ -40,6 +42,10 @@ export function generateRenderPayloadFromFileLoaderResults(results: FileLoaderRe
4042
return { ...acc, storefront_api_query_params: JSON.parse(data) };
4143
}
4244

45+
if (type === WidgetFileType.TRANSLATION) {
46+
return { ...acc, schema_translations: JSON.parse(data) };
47+
}
48+
4349
return acc;
4450
}, getInitialRenderingPayload(),
4551
);
@@ -51,6 +57,7 @@ export default function renderWidget(widgetDir: string): Promise<string> {
5157
widgetConfigLoader(widgetDir),
5258
queryLoader(widgetDir),
5359
queryParamsLoader(widgetDir),
60+
translationsLoader(widgetDir),
5461
]).then(
5562
(results: FileLoaderResponse[]) => getWidget(
5663
generateRenderPayloadFromFileLoaderResults(results),

src/services/widgetTemplate/publish.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import WidgetFileType, { FileLoaderResponse } from '../../types';
66
import schemaLoader from '../schema/schemaLoader/schemaLoader';
77

88
import widgetTemplateLoader from './widgetTemplateLoader/widgetTemplateLoader';
9+
import translationsLoader from '../translation/translationLoader/translationLoader';
910
import track from './track';
1011

1112
interface CreateWidgetTemplateReq {
@@ -14,6 +15,7 @@ interface CreateWidgetTemplateReq {
1415
template: string;
1516
storefront_api_query: string;
1617
channel_id: number;
18+
schema_translations?: string;
1719
}
1820

1921
const widgetTemplatePayload = (widgetName: string): CreateWidgetTemplateReq => ({
@@ -22,6 +24,7 @@ const widgetTemplatePayload = (widgetName: string): CreateWidgetTemplateReq => (
2224
template: '',
2325
storefront_api_query: '',
2426
channel_id: 1,
27+
schema_translations: ''
2528
});
2629

2730
const publishWidgetTemplate = async (widgetName: string, widgetTemplateDir: string) => {
@@ -30,6 +33,7 @@ const publishWidgetTemplate = async (widgetName: string, widgetTemplateDir: stri
3033
try {
3134
const widgetConfiguration = await Promise.all([
3235
widgetTemplateLoader(widgetTemplateDir),
36+
translationsLoader(widgetTemplateDir),
3337
schemaLoader(widgetTemplateDir),
3438
queryLoader(widgetTemplateDir),
3539
queryParamsLoader(widgetTemplateDir),
@@ -49,6 +53,10 @@ const publishWidgetTemplate = async (widgetName: string, widgetTemplateDir: stri
4953
return { ...acc, storefront_api_query: data };
5054
}
5155

56+
if (type === WidgetFileType.TRANSLATION) {
57+
return { ...acc, schema_translations: data };
58+
}
59+
5260
return acc;
5361
}, widgetTemplatePayload(widgetName),
5462
));

0 commit comments

Comments
 (0)