diff --git a/scripts/toDataParser/buildContext.ts b/scripts/toDataParser/buildContext.ts index 9a35ebd..5ee53fa 100644 --- a/scripts/toDataParser/buildContext.ts +++ b/scripts/toDataParser/buildContext.ts @@ -12,6 +12,7 @@ export interface BuildedContext { readonly typescriptContext: TST.MapContext; readonly importContext: TST.MapImportContext; readonly importMode: ImportMode; + readonly keepIdentifier?: boolean; } export interface BuildContextParams { @@ -25,6 +26,7 @@ export interface BuildContextParams { readonly importContext?: TST.MapImportContext; readonly importMode?: ImportMode; readonly hooks?: readonly TransformerHook[]; + readonly keepIdentifier?: boolean; readonly toTypescript?: { readonly mode?: TST.TransformerMode; readonly hooks?: readonly TST.TransformerHook[]; @@ -48,6 +50,7 @@ export function buildContext( const importContext: TST.MapImportContext = params.importContext ?? new Map(); const dependenciesContext: DependenciesContext = new Set(); const importMode = params.importMode ?? "lite"; + const keepIdentifier = params.keepIdentifier ?? false; importContext.set("@duplojs/utils/dataParser", { namespace: ["DP"], @@ -70,6 +73,7 @@ export function buildContext( recursiveDataParsers: getRecursiveDataParser(schema), dependencyIdentifier: factory.createIdentifier(importMode === "extended" ? "DPE" : "DP"), dependenciesContext, + keepIdentifier, }, ); @@ -106,5 +110,6 @@ export function buildContext( importContext: importContext, typescriptContext, importMode, + keepIdentifier, }); } diff --git a/scripts/toDataParser/dataParserTransformer/getDefinitionDataParser.ts b/scripts/toDataParser/dataParserTransformer/getDefinitionDataParser.ts index e113d06..d5fa4eb 100644 --- a/scripts/toDataParser/dataParserTransformer/getDefinitionDataParser.ts +++ b/scripts/toDataParser/dataParserTransformer/getDefinitionDataParser.ts @@ -4,29 +4,43 @@ import { type CallExpression, factory, type Identifier, type PropertyAssignment import type * as TST from "@scripts/toTypescript"; export interface getDefinitionDataParserParams { - readonly dataParser: DP.DataParser; readonly checkerTransformers: readonly ReturnType[]; readonly importContext: TST.MapImportContext; readonly customProperties: readonly PropertyAssignment[]; + readonly keepIdentifier: boolean; } -export function getDefinitionDataParser(params: getDefinitionDataParserParams) { +export function getDefinitionDataParser( + dataParser: DP.DataParser, + params: getDefinitionDataParserParams, +) { const propertyAssignments: PropertyAssignment[] = []; - if (params.dataParser.definition.errorMessage) { + if (dataParser.definition.errorMessage) { propertyAssignments.push( factory.createPropertyAssignment( factory.createIdentifier("errorMessage"), - factory.createStringLiteral(params.dataParser.definition.errorMessage), + factory.createStringLiteral(dataParser.definition.errorMessage), ), ); } + + if (params.keepIdentifier && dataParser.definition.identifier) { + propertyAssignments.push( + factory.createPropertyAssignment( + factory.createIdentifier("identifier"), + factory.createStringLiteral(dataParser.definition.identifier), + ), + ); + } + if (A.minElements(params.customProperties, 1)) { propertyAssignments.push(...params.customProperties); } - if (A.minElements(params.dataParser.definition.checkers, 1)) { + + if (A.minElements(dataParser.definition.checkers, 1)) { const checkers = A.reduce( - params.dataParser.definition.checkers, + dataParser.definition.checkers, A.reduceFrom<(CallExpression | Identifier)[]>([]), ({ element, lastValue, nextPush, exit }) => pipe( checkerTransformer( @@ -48,7 +62,7 @@ export function getDefinitionDataParser(params: getDefinitionDataParserParams) { if (E.isLeft(checkers)) { return E.left("buildDataParserGetDefinitionError", { - dataParser: params.dataParser, + dataParser, error: checkers, }); } diff --git a/scripts/toDataParser/dataParserTransformer/transformer.ts b/scripts/toDataParser/dataParserTransformer/transformer.ts index cae0806..da79bd4 100644 --- a/scripts/toDataParser/dataParserTransformer/transformer.ts +++ b/scripts/toDataParser/dataParserTransformer/transformer.ts @@ -19,6 +19,7 @@ export interface TransformerFunctionParams { readonly dependencyIdentifier: Identifier; readonly hooks: readonly TransformerHook[]; readonly recursiveDataParsers: DP.DataParser[]; + readonly keepIdentifier: boolean; readonly toTypescript?: { readonly mode?: TST.TransformerMode; readonly hooks?: readonly TST.TransformerHook[]; @@ -113,12 +114,15 @@ export function transformer( }, importContext: params.importContext, getDefinition(customProperties = []) { - return getDefinitionDataParser({ - dataParser: currentDataParser, - checkerTransformers: params.checkerTransformers, - importContext: params.importContext, - customProperties, - }); + return getDefinitionDataParser( + currentDataParser, + { + checkerTransformers: params.checkerTransformers, + importContext: params.importContext, + keepIdentifier: params.keepIdentifier, + customProperties, + }, + ); }, addImport: TST.createAddImport(params.importContext), }; diff --git a/scripts/toDataParser/getOverrideDeclaration.ts b/scripts/toDataParser/getOverrideDeclaration.ts new file mode 100644 index 0000000..d105e35 --- /dev/null +++ b/scripts/toDataParser/getOverrideDeclaration.ts @@ -0,0 +1,32 @@ +import { factory, SyntaxKind } from "typescript"; + +export function getOverrideDeclaration() { + return [ + factory.createImportDeclaration( + undefined, + undefined, + factory.createStringLiteral("@duplojs/utils/dataParser"), + undefined, + ), + factory.createModuleDeclaration( + [factory.createToken(SyntaxKind.DeclareKeyword)], + factory.createStringLiteral("@duplojs/utils/dataParser"), + factory.createModuleBlock([ + factory.createInterfaceDeclaration( + undefined, + factory.createIdentifier("DataParserDefinition"), + undefined, + undefined, + [ + factory.createPropertySignature( + undefined, + factory.createIdentifier("identifier"), + factory.createToken(SyntaxKind.QuestionToken), + factory.createKeywordTypeNode(SyntaxKind.StringKeyword), + ), + ], + ), + ]), + ), + ]; +} diff --git a/scripts/toDataParser/index.ts b/scripts/toDataParser/index.ts index c7996cf..a8ec351 100644 --- a/scripts/toDataParser/index.ts +++ b/scripts/toDataParser/index.ts @@ -5,3 +5,4 @@ export * from "./dataParserTransformer"; export * from "./render"; export * from "./buildContext"; export * from "./printer"; +export * from "./getOverrideDeclaration"; diff --git a/scripts/toDataParser/printer.ts b/scripts/toDataParser/printer.ts index 2b277fe..3f15555 100644 --- a/scripts/toDataParser/printer.ts +++ b/scripts/toDataParser/printer.ts @@ -2,6 +2,7 @@ import { createPrinter, createSourceFile, EmitHint, factory, NodeFlags, ScriptKi import { type BuildedContext } from "./buildContext"; import { A, G, pipe, S } from "@duplojs/utils"; import * as TST from "@scripts/toTypescript"; +import { getOverrideDeclaration } from "./getOverrideDeclaration"; export function printer(params: BuildedContext) { const sourceFile = createSourceFile("print.ts", "", ScriptTarget.Latest, false, ScriptKind.TS); @@ -43,6 +44,11 @@ export function printer(params: BuildedContext) { return pipe( [ ...TST.createImportDeclaration(params.importContext), + ...( + params.keepIdentifier + ? getOverrideDeclaration() + : [] + ), ...params.typescriptContext.values(), ...dataParserStatements, ], diff --git a/tests/toDataParser/__snapshots__/render.test.ts.snap b/tests/toDataParser/__snapshots__/render.test.ts.snap index 85a7cf9..3d54f2d 100644 --- a/tests/toDataParser/__snapshots__/render.test.ts.snap +++ b/tests/toDataParser/__snapshots__/render.test.ts.snap @@ -1,5 +1,19 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html +exports[`render > keep identifier 1`] = ` +"import * as DP from "@duplojs/utils/dataParser"; + +import "@duplojs/utils/dataParser"; + +declare module "@duplojs/utils/dataParser" { + interface DataParserDefinition { + identifier?: string; + } +} + +export const testKeepIdentifierDataParser = DP.number({ identifier: "testKeepIdentifier" });" +`; + exports[`render > renders anonymous recursive dataParser in extended mode 1`] = ` "import * as DP from "@duplojs/utils/dataParser"; diff --git a/tests/toDataParser/dataParserTransformer/definitionError.test.ts b/tests/toDataParser/dataParserTransformer/definitionError.test.ts index f87dc95..ef3be3c 100644 --- a/tests/toDataParser/dataParserTransformer/definitionError.test.ts +++ b/tests/toDataParser/dataParserTransformer/definitionError.test.ts @@ -86,16 +86,19 @@ describe("default dataParser transformers definition error", () => { }); expect( - getDefinitionDataParser({ + getDefinitionDataParser( dataParser, - checkerTransformers: [ - (checker, { buildError }) => DP.checkerStringMinKind.has(checker) - ? buildError() - : E.left("checkerNotSupport", checker), - ], - importContext: new Map(), - customProperties: [], - }), + { + checkerTransformers: [ + (checker, { buildError }) => DP.checkerStringMinKind.has(checker) + ? buildError() + : E.left("checkerNotSupport", checker), + ], + importContext: new Map(), + customProperties: [], + keepIdentifier: true, + }, + ), ).toStrictEqual( E.left("buildDataParserGetDefinitionError", { dataParser, diff --git a/tests/toDataParser/render.test.ts b/tests/toDataParser/render.test.ts index ec490ad..850e469 100644 --- a/tests/toDataParser/render.test.ts +++ b/tests/toDataParser/render.test.ts @@ -413,4 +413,19 @@ describe("render", () => { expect(replaceHook).toHaveBeenCalledTimes(1); expect(result).toContain("DP.string()"); }); + + it("keep identifier", () => { + const result = render( + DPE.number().setIdentifier("testKeepIdentifier"), + { + identifier: "testKeepIdentifier", + dataParserTransformers: defaultTransformers, + checkerTransformers: defaultCheckerTransformers, + typescriptTransformers: tsDefaultTransformers, + keepIdentifier: true, + }, + ); + + expect(result).toMatchSnapshot(); + }); });