@mbc-cqrs-serverless/survey-template 1.1.0-beta.0 → 1.1.0

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,412 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const common_1 = require("@nestjs/common");
4
+ const testing_1 = require("@nestjs/testing");
5
+ const core_1 = require("@mbc-cqrs-serverless/core");
6
+ const survey_template_service_1 = require("./survey-template.service");
7
+ const survey_template_data_entity_1 = require("./entity/survey-template-data.entity");
8
+ const survey_template_module_definition_1 = require("./survey-template.module-definition");
9
+ // Mock getUserContext
10
+ jest.mock('@mbc-cqrs-serverless/core', () => {
11
+ const original = jest.requireActual('@mbc-cqrs-serverless/core');
12
+ return {
13
+ ...original,
14
+ getUserContext: jest.fn(),
15
+ generateId: jest.fn().mockImplementation((pk, sk) => `${pk}#${sk}`),
16
+ };
17
+ });
18
+ // Mock ulid
19
+ jest.mock('ulid', () => ({
20
+ ulid: jest.fn().mockReturnValue('01HTEST123456789ABCDEF'),
21
+ }));
22
+ const mockGetUserContext = core_1.getUserContext;
23
+ describe('SurveyTemplateService', () => {
24
+ let service;
25
+ let commandService;
26
+ let dataService;
27
+ let prismaService;
28
+ const mockInvokeContext = {
29
+ event: {
30
+ requestContext: {
31
+ authorizer: {
32
+ jwt: {
33
+ claims: {
34
+ 'custom:tenant': 'test-tenant',
35
+ 'cognito:username': 'test-user',
36
+ name: 'Test User',
37
+ },
38
+ },
39
+ },
40
+ },
41
+ },
42
+ };
43
+ const mockCommandService = {
44
+ publishAsync: jest.fn(),
45
+ publishPartialUpdateAsync: jest.fn(),
46
+ tableName: 'test-table',
47
+ };
48
+ const mockDataService = {
49
+ getItem: jest.fn(),
50
+ getItemVersion: jest.fn(),
51
+ };
52
+ const mockPrismaService = {
53
+ surveyTemplate: {
54
+ count: jest.fn(),
55
+ findMany: jest.fn(),
56
+ },
57
+ };
58
+ beforeEach(async () => {
59
+ // Default mock for getUserContext
60
+ mockGetUserContext.mockReturnValue({
61
+ tenantCode: 'test-tenant',
62
+ userId: 'test-user',
63
+ });
64
+ const module = await testing_1.Test.createTestingModule({
65
+ providers: [
66
+ survey_template_service_1.SurveyTemplateService,
67
+ {
68
+ provide: core_1.CommandService,
69
+ useValue: mockCommandService,
70
+ },
71
+ {
72
+ provide: core_1.DataService,
73
+ useValue: mockDataService,
74
+ },
75
+ {
76
+ provide: survey_template_module_definition_1.PRISMA_SERVICE,
77
+ useValue: mockPrismaService,
78
+ },
79
+ ],
80
+ }).compile();
81
+ service = module.get(survey_template_service_1.SurveyTemplateService);
82
+ commandService = module.get(core_1.CommandService);
83
+ dataService = module.get(core_1.DataService);
84
+ prismaService = module.get(survey_template_module_definition_1.PRISMA_SERVICE);
85
+ });
86
+ afterEach(() => {
87
+ jest.clearAllMocks();
88
+ });
89
+ it('should be defined', () => {
90
+ expect(service).toBeDefined();
91
+ });
92
+ describe('searchData', () => {
93
+ it('should search data with default parameters', async () => {
94
+ const mockItems = [
95
+ {
96
+ id: 'survey1',
97
+ pk: 'SURVEY#test-tenant',
98
+ sk: 'TEMPLATE#01HTEST123',
99
+ name: 'Test Survey',
100
+ description: 'Test description',
101
+ surveyTemplate: { questions: [] },
102
+ },
103
+ ];
104
+ mockPrismaService.surveyTemplate.count.mockResolvedValue(1);
105
+ mockPrismaService.surveyTemplate.findMany.mockResolvedValue(mockItems);
106
+ const result = await service.searchData('test-tenant', {});
107
+ expect(prismaService.surveyTemplate.count).toHaveBeenCalledWith({
108
+ where: { isDeleted: false, tenantCode: 'test-tenant' },
109
+ });
110
+ expect(prismaService.surveyTemplate.findMany).toHaveBeenCalledWith({
111
+ where: { isDeleted: false, tenantCode: 'test-tenant' },
112
+ take: 10,
113
+ skip: 0,
114
+ orderBy: [{ createdAt: 'desc' }],
115
+ });
116
+ expect(result.total).toBe(1);
117
+ expect(result.items).toHaveLength(1);
118
+ });
119
+ it('should search data with keyword filter', async () => {
120
+ const searchDto = { keyword: 'test' };
121
+ mockPrismaService.surveyTemplate.count.mockResolvedValue(0);
122
+ mockPrismaService.surveyTemplate.findMany.mockResolvedValue([]);
123
+ await service.searchData('test-tenant', searchDto);
124
+ expect(prismaService.surveyTemplate.count).toHaveBeenCalledWith({
125
+ where: {
126
+ isDeleted: false,
127
+ tenantCode: 'test-tenant',
128
+ OR: [
129
+ { name: { contains: 'test', mode: 'insensitive' } },
130
+ { description: { contains: 'test', mode: 'insensitive' } },
131
+ ],
132
+ },
133
+ });
134
+ });
135
+ it('should search data with pagination', async () => {
136
+ const searchDto = { pageSize: 5, page: 2 };
137
+ mockPrismaService.surveyTemplate.count.mockResolvedValue(10);
138
+ mockPrismaService.surveyTemplate.findMany.mockResolvedValue([]);
139
+ await service.searchData('test-tenant', searchDto);
140
+ expect(prismaService.surveyTemplate.findMany).toHaveBeenCalledWith(expect.objectContaining({
141
+ take: 5,
142
+ skip: 5, // (page - 1) * pageSize = (2 - 1) * 5 = 5
143
+ }));
144
+ });
145
+ it('should search data with id filter', async () => {
146
+ const searchDto = { id: 'survey1' };
147
+ mockPrismaService.surveyTemplate.count.mockResolvedValue(1);
148
+ mockPrismaService.surveyTemplate.findMany.mockResolvedValue([]);
149
+ await service.searchData('test-tenant', searchDto);
150
+ expect(prismaService.surveyTemplate.count).toHaveBeenCalledWith({
151
+ where: expect.objectContaining({ id: 'survey1' }),
152
+ });
153
+ });
154
+ it('should search data with pk filter', async () => {
155
+ const searchDto = { pk: 'SURVEY#test-tenant' };
156
+ mockPrismaService.surveyTemplate.count.mockResolvedValue(1);
157
+ mockPrismaService.surveyTemplate.findMany.mockResolvedValue([]);
158
+ await service.searchData('test-tenant', searchDto);
159
+ expect(prismaService.surveyTemplate.count).toHaveBeenCalledWith({
160
+ where: expect.objectContaining({ pk: 'SURVEY#test-tenant' }),
161
+ });
162
+ });
163
+ it('should search data with sk filter', async () => {
164
+ const searchDto = { sk: 'TEMPLATE#01HTEST' };
165
+ mockPrismaService.surveyTemplate.count.mockResolvedValue(1);
166
+ mockPrismaService.surveyTemplate.findMany.mockResolvedValue([]);
167
+ await service.searchData('test-tenant', searchDto);
168
+ expect(prismaService.surveyTemplate.count).toHaveBeenCalledWith({
169
+ where: expect.objectContaining({ sk: 'TEMPLATE#01HTEST' }),
170
+ });
171
+ });
172
+ it('should apply custom orderBys', async () => {
173
+ const searchDto = { orderBys: ['name', '-updatedAt'] };
174
+ mockPrismaService.surveyTemplate.count.mockResolvedValue(0);
175
+ mockPrismaService.surveyTemplate.findMany.mockResolvedValue([]);
176
+ await service.searchData('test-tenant', searchDto);
177
+ expect(prismaService.surveyTemplate.findMany).toHaveBeenCalledWith(expect.objectContaining({
178
+ orderBy: [{ name: 'asc' }, { updatedAt: 'desc' }],
179
+ }));
180
+ });
181
+ it('should trim keyword whitespace', async () => {
182
+ const searchDto = { keyword: ' test ' };
183
+ mockPrismaService.surveyTemplate.count.mockResolvedValue(0);
184
+ mockPrismaService.surveyTemplate.findMany.mockResolvedValue([]);
185
+ await service.searchData('test-tenant', searchDto);
186
+ expect(prismaService.surveyTemplate.count).toHaveBeenCalledWith({
187
+ where: expect.objectContaining({
188
+ OR: [
189
+ { name: { contains: 'test', mode: 'insensitive' } },
190
+ { description: { contains: 'test', mode: 'insensitive' } },
191
+ ],
192
+ }),
193
+ });
194
+ });
195
+ });
196
+ describe('create', () => {
197
+ it('should create a survey template successfully', async () => {
198
+ const createDto = {
199
+ name: 'New Survey',
200
+ attributes: {
201
+ surveyTemplate: { questions: [{ id: 1, text: 'Question 1' }] },
202
+ },
203
+ };
204
+ const mockCreatedItem = {
205
+ pk: 'SURVEY#test-tenant',
206
+ sk: 'TEMPLATE#01HTEST123456789ABCDEF',
207
+ id: 'SURVEY#test-tenant#TEMPLATE#01HTEST123456789ABCDEF',
208
+ name: 'New Survey',
209
+ version: 1,
210
+ };
211
+ mockCommandService.publishAsync.mockResolvedValue(mockCreatedItem);
212
+ const result = await service.create(createDto, {
213
+ invokeContext: mockInvokeContext,
214
+ });
215
+ expect(commandService.publishAsync).toHaveBeenCalledWith(expect.objectContaining({
216
+ pk: 'SURVEY#test-tenant',
217
+ sk: 'TEMPLATE#01HTEST123456789ABCDEF',
218
+ tenantCode: 'test-tenant',
219
+ name: 'New Survey',
220
+ type: 'TEMPLATE',
221
+ }), expect.objectContaining({
222
+ invokeContext: mockInvokeContext,
223
+ }));
224
+ expect(result).toBeInstanceOf(survey_template_data_entity_1.SurveyTemplateDataEntity);
225
+ });
226
+ it('should use tenant from user context', async () => {
227
+ mockGetUserContext.mockReturnValue({
228
+ tenantCode: 'custom-tenant',
229
+ userId: 'test-user',
230
+ });
231
+ const createDto = {
232
+ name: 'New Survey',
233
+ attributes: { surveyTemplate: {} },
234
+ };
235
+ mockCommandService.publishAsync.mockResolvedValue({
236
+ pk: 'SURVEY#custom-tenant',
237
+ });
238
+ await service.create(createDto, { invokeContext: mockInvokeContext });
239
+ expect(commandService.publishAsync).toHaveBeenCalledWith(expect.objectContaining({
240
+ pk: 'SURVEY#custom-tenant',
241
+ tenantCode: 'custom-tenant',
242
+ }), expect.any(Object));
243
+ });
244
+ });
245
+ describe('findOne', () => {
246
+ it('should return survey template when found', async () => {
247
+ const detailDto = { pk: 'SURVEY#test-tenant', sk: 'TEMPLATE#01HTEST' };
248
+ const mockItem = {
249
+ pk: 'SURVEY#test-tenant',
250
+ sk: 'TEMPLATE#01HTEST',
251
+ name: 'Test Survey',
252
+ version: 1,
253
+ };
254
+ mockDataService.getItem.mockResolvedValue(mockItem);
255
+ const result = await service.findOne(detailDto);
256
+ expect(dataService.getItem).toHaveBeenCalledWith(detailDto);
257
+ expect(result).toBeInstanceOf(survey_template_data_entity_1.SurveyTemplateDataEntity);
258
+ expect(result.name).toBe('Test Survey');
259
+ });
260
+ it('should throw NotFoundException when not found', async () => {
261
+ const detailDto = { pk: 'SURVEY#test-tenant', sk: 'TEMPLATE#notfound' };
262
+ mockDataService.getItem.mockResolvedValue(null);
263
+ await expect(service.findOne(detailDto)).rejects.toThrow(common_1.NotFoundException);
264
+ await expect(service.findOne(detailDto)).rejects.toThrow('Survey template not found!');
265
+ });
266
+ });
267
+ describe('update', () => {
268
+ it('should update survey template successfully', async () => {
269
+ const detailDto = { pk: 'SURVEY#test-tenant', sk: 'TEMPLATE#01HTEST' };
270
+ const updateDto = {
271
+ name: 'Updated Survey',
272
+ attributes: { description: 'Updated description' },
273
+ };
274
+ const existingItem = {
275
+ pk: 'SURVEY#test-tenant',
276
+ sk: 'TEMPLATE#01HTEST',
277
+ name: 'Original Survey',
278
+ version: 1,
279
+ attributes: { surveyTemplate: {} },
280
+ };
281
+ const updatedItem = {
282
+ ...existingItem,
283
+ name: 'Updated Survey',
284
+ version: 2,
285
+ };
286
+ mockDataService.getItem.mockResolvedValue(existingItem);
287
+ mockCommandService.publishPartialUpdateAsync.mockResolvedValue(updatedItem);
288
+ const result = await service.update(detailDto, updateDto, {
289
+ invokeContext: mockInvokeContext,
290
+ });
291
+ expect(dataService.getItem).toHaveBeenCalledWith(detailDto);
292
+ expect(commandService.publishPartialUpdateAsync).toHaveBeenCalledWith(expect.objectContaining({
293
+ pk: 'SURVEY#test-tenant',
294
+ sk: 'TEMPLATE#01HTEST',
295
+ name: 'Updated Survey',
296
+ version: 1,
297
+ }), expect.any(Object));
298
+ expect(result).toBeInstanceOf(survey_template_data_entity_1.SurveyTemplateDataEntity);
299
+ });
300
+ it('should throw BadRequestException for tenant mismatch', async () => {
301
+ mockGetUserContext.mockReturnValue({
302
+ tenantCode: 'other-tenant',
303
+ userId: 'test-user',
304
+ });
305
+ const detailDto = { pk: 'SURVEY#test-tenant', sk: 'TEMPLATE#01HTEST' };
306
+ const updateDto = { name: 'Updated' };
307
+ await expect(service.update(detailDto, updateDto, {
308
+ invokeContext: mockInvokeContext,
309
+ })).rejects.toThrow(common_1.BadRequestException);
310
+ await expect(service.update(detailDto, updateDto, {
311
+ invokeContext: mockInvokeContext,
312
+ })).rejects.toThrow('Invalid tenant code');
313
+ });
314
+ it('should throw NotFoundException when item not found', async () => {
315
+ const detailDto = { pk: 'SURVEY#test-tenant', sk: 'TEMPLATE#notfound' };
316
+ const updateDto = { name: 'Updated' };
317
+ mockDataService.getItem.mockResolvedValue(null);
318
+ await expect(service.update(detailDto, updateDto, {
319
+ invokeContext: mockInvokeContext,
320
+ })).rejects.toThrow(common_1.NotFoundException);
321
+ });
322
+ it('should preserve existing attributes when updating', async () => {
323
+ const detailDto = { pk: 'SURVEY#test-tenant', sk: 'TEMPLATE#01HTEST' };
324
+ const updateDto = {
325
+ attributes: { newField: 'value' },
326
+ };
327
+ const existingItem = {
328
+ pk: 'SURVEY#test-tenant',
329
+ sk: 'TEMPLATE#01HTEST',
330
+ name: 'Original Survey',
331
+ version: 1,
332
+ attributes: { existingField: 'existing' },
333
+ };
334
+ mockDataService.getItem.mockResolvedValue(existingItem);
335
+ mockCommandService.publishPartialUpdateAsync.mockResolvedValue(existingItem);
336
+ await service.update(detailDto, updateDto, {
337
+ invokeContext: mockInvokeContext,
338
+ });
339
+ expect(commandService.publishPartialUpdateAsync).toHaveBeenCalledWith(expect.objectContaining({
340
+ attributes: {
341
+ existingField: 'existing',
342
+ newField: 'value',
343
+ },
344
+ }), expect.any(Object));
345
+ });
346
+ it('should update isDeleted flag', async () => {
347
+ const detailDto = { pk: 'SURVEY#test-tenant', sk: 'TEMPLATE#01HTEST' };
348
+ const updateDto = { isDeleted: true };
349
+ const existingItem = {
350
+ pk: 'SURVEY#test-tenant',
351
+ sk: 'TEMPLATE#01HTEST',
352
+ name: 'Survey',
353
+ version: 1,
354
+ isDeleted: false,
355
+ attributes: {},
356
+ };
357
+ mockDataService.getItem.mockResolvedValue(existingItem);
358
+ mockCommandService.publishPartialUpdateAsync.mockResolvedValue({
359
+ ...existingItem,
360
+ isDeleted: true,
361
+ });
362
+ await service.update(detailDto, updateDto, {
363
+ invokeContext: mockInvokeContext,
364
+ });
365
+ expect(commandService.publishPartialUpdateAsync).toHaveBeenCalledWith(expect.objectContaining({
366
+ isDeleted: true,
367
+ }), expect.any(Object));
368
+ });
369
+ });
370
+ describe('remove', () => {
371
+ it('should soft delete survey template', async () => {
372
+ const detailDto = { pk: 'SURVEY#test-tenant', sk: 'TEMPLATE#01HTEST' };
373
+ const existingItem = {
374
+ pk: 'SURVEY#test-tenant',
375
+ sk: 'TEMPLATE#01HTEST',
376
+ name: 'Survey',
377
+ version: 1,
378
+ isDeleted: false,
379
+ };
380
+ const deletedItem = {
381
+ ...existingItem,
382
+ isDeleted: true,
383
+ version: 2,
384
+ };
385
+ mockDataService.getItem.mockResolvedValue(existingItem);
386
+ mockCommandService.publishPartialUpdateAsync.mockResolvedValue(deletedItem);
387
+ const result = await service.remove(detailDto, {
388
+ invokeContext: mockInvokeContext,
389
+ });
390
+ expect(commandService.publishPartialUpdateAsync).toHaveBeenCalledWith(expect.objectContaining({
391
+ pk: 'SURVEY#test-tenant',
392
+ sk: 'TEMPLATE#01HTEST',
393
+ isDeleted: true,
394
+ }), expect.any(Object));
395
+ expect(result).toBeInstanceOf(survey_template_data_entity_1.SurveyTemplateDataEntity);
396
+ });
397
+ it('should throw BadRequestException for tenant mismatch', async () => {
398
+ mockGetUserContext.mockReturnValue({
399
+ tenantCode: 'other-tenant',
400
+ userId: 'test-user',
401
+ });
402
+ const detailDto = { pk: 'SURVEY#test-tenant', sk: 'TEMPLATE#01HTEST' };
403
+ await expect(service.remove(detailDto, { invokeContext: mockInvokeContext })).rejects.toThrow(common_1.BadRequestException);
404
+ });
405
+ it('should throw NotFoundException when item not found', async () => {
406
+ const detailDto = { pk: 'SURVEY#test-tenant', sk: 'TEMPLATE#notfound' };
407
+ mockDataService.getItem.mockResolvedValue(null);
408
+ await expect(service.remove(detailDto, { invokeContext: mockInvokeContext })).rejects.toThrow(common_1.NotFoundException);
409
+ });
410
+ });
411
+ });
412
+ //# sourceMappingURL=survey-template.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"survey-template.service.spec.js","sourceRoot":"","sources":["../src/survey-template.service.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("./index");
4
+ describe('Survey Template Utils', () => {
5
+ describe('parsePk', () => {
6
+ it('should parse valid pk with two parts', () => {
7
+ const result = (0, index_1.parsePk)('SURVEY#test-tenant');
8
+ expect(result).toEqual({
9
+ type: 'SURVEY',
10
+ tenantCode: 'test-tenant',
11
+ });
12
+ });
13
+ it('should throw error for pk with less than two parts', () => {
14
+ expect(() => (0, index_1.parsePk)('SURVEY')).toThrow('Invalid PK');
15
+ });
16
+ it('should throw error for pk with more than two parts', () => {
17
+ expect(() => (0, index_1.parsePk)('SURVEY#test-tenant#extra')).toThrow('Invalid PK');
18
+ });
19
+ it('should handle different types', () => {
20
+ const result = (0, index_1.parsePk)('MASTER#tenant-123');
21
+ expect(result).toEqual({
22
+ type: 'MASTER',
23
+ tenantCode: 'tenant-123',
24
+ });
25
+ });
26
+ it('should handle tenant codes with special characters', () => {
27
+ const result = (0, index_1.parsePk)('SURVEY#tenant_with_underscore');
28
+ expect(result).toEqual({
29
+ type: 'SURVEY',
30
+ tenantCode: 'tenant_with_underscore',
31
+ });
32
+ });
33
+ });
34
+ describe('getOrderBy', () => {
35
+ it('should return ascending order for plain field name', () => {
36
+ const result = (0, index_1.getOrderBy)('name');
37
+ expect(result).toEqual({ name: index_1.SortOrder.asc });
38
+ });
39
+ it('should return descending order for field prefixed with -', () => {
40
+ const result = (0, index_1.getOrderBy)('-createdAt');
41
+ expect(result).toEqual({ createdAt: index_1.SortOrder.desc });
42
+ });
43
+ it('should handle different field names', () => {
44
+ expect((0, index_1.getOrderBy)('updatedAt')).toEqual({ updatedAt: index_1.SortOrder.asc });
45
+ expect((0, index_1.getOrderBy)('-version')).toEqual({ version: index_1.SortOrder.desc });
46
+ expect((0, index_1.getOrderBy)('id')).toEqual({ id: index_1.SortOrder.asc });
47
+ });
48
+ });
49
+ describe('getOrderBys', () => {
50
+ it('should convert array of order strings', () => {
51
+ const result = (0, index_1.getOrderBys)(['name', '-createdAt', 'version']);
52
+ expect(result).toEqual([
53
+ { name: index_1.SortOrder.asc },
54
+ { createdAt: index_1.SortOrder.desc },
55
+ { version: index_1.SortOrder.asc },
56
+ ]);
57
+ });
58
+ it('should return undefined for undefined input', () => {
59
+ const result = (0, index_1.getOrderBys)(undefined);
60
+ expect(result).toBeUndefined();
61
+ });
62
+ it('should handle empty array', () => {
63
+ const result = (0, index_1.getOrderBys)([]);
64
+ expect(result).toEqual([]);
65
+ });
66
+ it('should handle single item array', () => {
67
+ const result = (0, index_1.getOrderBys)(['-updatedAt']);
68
+ expect(result).toEqual([{ updatedAt: index_1.SortOrder.desc }]);
69
+ });
70
+ });
71
+ describe('SortOrder enum', () => {
72
+ it('should have correct values', () => {
73
+ expect(index_1.SortOrder.asc).toBe('asc');
74
+ expect(index_1.SortOrder.desc).toBe('desc');
75
+ });
76
+ });
77
+ });
78
+ //# sourceMappingURL=utils.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.spec.js","sourceRoot":"","sources":["../../src/utils/utils.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mbc-cqrs-serverless/survey-template",
3
- "version": "1.1.0-beta.0",
3
+ "version": "1.1.0",
4
4
  "description": "Survey module",
5
5
  "keywords": [
6
6
  "mbc",
@@ -41,8 +41,8 @@
41
41
  "access": "public"
42
42
  },
43
43
  "dependencies": {
44
- "@mbc-cqrs-serverless/core": "1.1.0-beta.0",
45
- "@mbc-cqrs-serverless/master": "1.1.0-beta.0"
44
+ "@mbc-cqrs-serverless/core": "1.1.0",
45
+ "@mbc-cqrs-serverless/master": "1.1.0"
46
46
  },
47
- "gitHead": "b16d8982c02933fd41a455d3e41f9750bbcf668c"
47
+ "gitHead": "f5ce26f50fa1d446a29a5a1771ca107ce426e7bc"
48
48
  }