From 7296e560150567fbe8e56ec6ca4bbca34fbc0abb Mon Sep 17 00:00:00 2001 From: Furkan Evran Date: Mon, 7 Aug 2023 14:11:39 +0300 Subject: [PATCH] only generate TS localtext proxy for objects - dont generate for values add tests for localtext proxy call localtext when proxy tries to access null keys --- packages/corelib/src/q/localtext.spec.ts | 73 +++++++++++++++++++ packages/corelib/src/q/localtext.ts | 2 - .../ServerTypingsGenerator.Texts.cs | 8 +- 3 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 packages/corelib/src/q/localtext.spec.ts diff --git a/packages/corelib/src/q/localtext.spec.ts b/packages/corelib/src/q/localtext.spec.ts new file mode 100644 index 0000000000..386e4ed6e4 --- /dev/null +++ b/packages/corelib/src/q/localtext.spec.ts @@ -0,0 +1,73 @@ +beforeEach(() => { + jest.resetModules(); + jest.unmock('./system'); +}); + +const mockLocalTextStore = (localTexts: Record) => { + jest.mock('./system', () => ({ + getStateStore: jest.fn(() => localTexts) + })); +} + + + +describe('proxyTexts', () => { + it('proxies simple object', async () => { + mockLocalTextStore({ + 'a.b': 'Abc', + }); + + const proxyTexts = (await import('./localtext')).proxyTexts; + const texts = proxyTexts({}, '', {a: {}}) as any; + + expect(texts.a.b).toEqual('Abc'); + }); + + it('proxies nested object', async () => { + mockLocalTextStore({ + 'a.b.c': 'Ab12c', + 'a.c': 'A1c', + }); + + const proxyTexts = (await import('./localtext')).proxyTexts; + const texts = proxyTexts({}, '', { + a: { + b: {} + } + }) as any; + + expect(texts.a.b.c).toEqual('Ab12c'); + expect(texts.a.c).toEqual('A1c'); + }); + + it('proxies multiple nested object', async () => { + mockLocalTextStore({ + 'a.b.c': 'Ab12c', + 'a.c': 'A1c', + 'b.c.d': 'B1cd', + }); + + const proxyTexts = (await import('./localtext')).proxyTexts; + const texts = proxyTexts({}, '', { + a: { + b: {} + }, + b: { + c: {} + } + }) as any; + + expect(texts.b.c.d).toEqual('B1cd'); + }); + + it('proxies single level object', async () => { + mockLocalTextStore({ + 'a': 'Abc', + }); + + const proxyTexts = (await import('./localtext')).proxyTexts; + const texts = proxyTexts({}, '', {}) as any; + + expect(texts.a).toEqual('Abc'); + }); +}); diff --git a/packages/corelib/src/q/localtext.ts b/packages/corelib/src/q/localtext.ts index d34e03d7b6..7177ba0f98 100644 --- a/packages/corelib/src/q/localtext.ts +++ b/packages/corelib/src/q/localtext.ts @@ -66,8 +66,6 @@ export function proxyTexts(o: Record, p: string, t: Record { var tv = t[y]; if (tv == null) - return; - if (typeof tv == 'number') return localText(p + y); else { var z = o[y]; diff --git a/src/Serenity.Net.CodeGenerator/CodeGeneration/ServerTypings/ServerTypingsGenerator.Texts.cs b/src/Serenity.Net.CodeGenerator/CodeGeneration/ServerTypings/ServerTypingsGenerator.Texts.cs index a65a65d6cb..f4dd4de32d 100644 --- a/src/Serenity.Net.CodeGenerator/CodeGeneration/ServerTypings/ServerTypingsGenerator.Texts.cs +++ b/src/Serenity.Net.CodeGenerator/CodeGeneration/ServerTypings/ServerTypingsGenerator.Texts.cs @@ -89,7 +89,9 @@ protected void GenerateTexts(bool module) var jw = new JsonTextWriter(new System.IO.StringWriter(jwBuilder)) #endif { - QuoteName = false + QuoteName = false, + Formatting = Formatting.Indented, + Indentation = 4 }; jw.WriteStartObject(); List stack = new(); @@ -166,8 +168,6 @@ protected void GenerateTexts(bool module) } else { - jw.WritePropertyName(part); - jw.WriteValue(1); cw.Indented("export const "); sb.Append(part); sb.AppendLine(": string;"); @@ -191,7 +191,7 @@ protected void GenerateTexts(bool module) else sb.Append(@"['Texts'] = Q.proxyTexts(Texts, '', "); jw.Flush(); - sb.Append(jwBuilder); + sb.Append(string.Join("\n ", jwBuilder.ToString().Split('\n'))); sb.AppendLine(") as any;"); });