@nemmtor/ts-databuilders 0.0.1-alpha.22 → 0.0.1-alpha.23
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.
- package/README.md +15 -0
- package/dist/main.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -64,6 +64,7 @@ pnpm ts-databuilders init --wizard
|
|
|
64
64
|
|
|
65
65
|
| Name (in config file) | Flag (cli flags) | Description | Default |
|
|
66
66
|
|---------------|-------------------------------------------------------|-----------------------------------------|----------------------|
|
|
67
|
+
| tsconfig | `--tsconfig -t` | Path to tsconfig file | `tsconfig.json` |
|
|
67
68
|
| builderJsDocTagName | `--builder-jsdoc-tag-name` | JSDoc tag to mark types for generation | `DataBuilder` |
|
|
68
69
|
| inlineDefaultJsDocTagName | `--inline-default-jsdoc-tag-name` | JSDoc tag used to set default value of given field | `DataBuilderDefault` |
|
|
69
70
|
| withNestedBuilders | `--with-nested-builders` | When set to true ts-databuilders will use nested builders approach | `true` |
|
|
@@ -79,6 +80,20 @@ pnpm ts-databuilders init --wizard
|
|
|
79
80
|
#### Debugging
|
|
80
81
|
In order to turn on debug logs pass a flag: `--log-level debug`.
|
|
81
82
|
|
|
83
|
+
#### TSConfig References
|
|
84
|
+
If your project uses multiple tsconfig files, point ts-databuilders to the one that includes your source files in its `include` field.
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
pnpm ts-databuilders --tsconfig tsconfig.app.json
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Or in config file:
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"tsconfig": "tsconfig.app.json"
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
82
97
|
## Quick Start
|
|
83
98
|
**1. Annotate your types with JSDoc:**
|
|
84
99
|
```ts
|
package/dist/main.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import*as ii from"@effect/platform-node/NodeContext";import*as oi from"@effect/platform-node/NodeRuntime";import*as ni from"effect/Effect";import*as I from"@effect/cli/Command";import*as l from"@effect/cli/Options";import*as oe from"effect/Layer";import*as _r from"@effect/platform/FileSystem";import*as Wr from"@effect/platform/Path";import*as se from"effect/Effect";import*as Dr from"@effect/platform/FileSystem";import*as Rr from"@effect/platform/Path";import*as vr from"effect/Context";import*as T from"effect/Effect";import*as D from"effect/Option";import*as o from"effect/Schema";import*as Ar from"effect/Data";import*as Q from"effect/Effect";var N=class extends Q.Service()("@TSDataBuilders/Process",{effect:Q.gen(function*(){return yield*Q.logDebug("[Process]: Instantiating"),{cwd:Q.try({try:()=>process.cwd(),catch:t=>new Cr({cause:t})})}})}){},Cr=class extends Ar.TaggedError("GetProcessCwdError"){};var ci=r=>r!==void 0,be=r=>Object.fromEntries(Object.entries(r).filter(([t,n])=>ci(n)));var m={builderJsDocTagName:"JSDoc tag used to mark types for data building generation.",inlineDefaultJsDocTagName:"JSDoc tag used to set default value of given field.",withNestedbuilders:"When set to true ts-databuilders will use nested builders approach.",outputDir:"Output directory for generated builders.",include:"Glob pattern for files included while searching for jsdoc tag.",fileSuffix:"File suffix for created builder files.",fileCase:"Naming convention for generated builder file",builderSuffix:"Suffix for generated classes.",defaults:"Default values to be used in data builder constructor.",defaultString:"Default string value to be used in data builder constructor.",defaultNumber:"Default number value to be used in data builder constructor.",defaultBoolean:"Default boolean value to be used in data builder constructor."};var Pr="ts-databuilders.json",fi=o.Struct({builderJsDocTagName:o.NonEmptyTrimmedString,inlineDefaultJsDocTagName:o.NonEmptyTrimmedString,withNestedBuilders:o.Boolean,outputDir:o.NonEmptyTrimmedString,include:o.NonEmptyTrimmedString,fileSuffix:o.NonEmptyTrimmedString,fileCase:o.Literal("kebab","camel","pascal"),builderSuffix:o.NonEmptyTrimmedString,defaults:o.Struct({string:o.String,number:o.Number,boolean:o.Boolean})}),w=fi.make({builderJsDocTagName:"DataBuilder",inlineDefaultJsDocTagName:"DataBuilderDefault",withNestedBuilders:!0,outputDir:"generated/builders",include:"src/**/*.ts{,x}",fileSuffix:".builder",fileCase:"kebab",builderSuffix:"Builder",defaults:{string:"",number:0,boolean:!1}}),Nr=o.Struct({$schema:o.optional(o.String),builderJsDocTagName:o.String.pipe(o.annotations({description:m.builderJsDocTagName})),inlineDefaultJsDocTagName:o.String.pipe(o.annotations({description:m.inlineDefaultJsDocTagName})),withNestedBuilders:o.Boolean.pipe(o.annotations({description:m.withNestedbuilders})),outputDir:o.String.pipe(o.annotations({description:m.outputDir})),include:o.String.pipe(o.annotations({description:m.include})),fileSuffix:o.String.pipe(o.annotations({description:m.fileSuffix})),fileCase:o.Literal("kebab","camel","pascal").pipe(o.annotations({description:m.fileCase})),builderSuffix:o.String.pipe(o.annotations({description:m.builderSuffix})),defaults:o.Struct({string:o.String.pipe(o.annotations({description:m.defaultString})),number:o.Number.pipe(o.annotations({description:m.defaultNumber})),boolean:o.Boolean.pipe(o.annotations({description:m.defaultBoolean}))}).pipe(o.partial,o.annotations({description:m.defaults}))}).pipe(o.partial),x=class extends vr.Tag("Configuration")(){},F=o.Struct({builderJsDocTagName:o.NonEmptyTrimmedString,inlineDefaultJsDocTagName:o.NonEmptyTrimmedString,withNestedBuilders:o.BooleanFromString,outputDir:o.NonEmptyTrimmedString,include:o.NonEmptyTrimmedString,fileSuffix:o.NonEmptyTrimmedString,fileCase:o.Literal("kebab","camel","pascal"),builderSuffix:o.NonEmptyTrimmedString,defaultString:o.String,defaultNumber:o.NumberFromString,defaultBoolean:o.BooleanFromString}),Kr=T.fnUntraced(function*(r){yield*T.logDebug("[Configuration]: Loading configuration");let n=yield*(yield*N).cwd,a=(yield*Rr.Path).join(n,Pr);yield*T.logDebug("[Configuration]: Attempting to resolve config file");let s=yield*di(a);yield*T.logDebug("[Configuration]: Attempting to resolve config");let e=yield*li({fromCLI:r,fromConfigFile:s});return yield*T.logDebug(`[Configuration]: Config resolved with: ${yield*o.encode(o.parseJson({replacer:null,space:2}))(e)}`),x.of(e)}),li=T.fnUntraced(function*(r){let t=pi(r),n=D.flatMap(r.fromConfigFile,e=>D.fromNullable(e.defaults)).pipe(D.map(e=>be(e)),D.getOrElse(()=>({}))),i=be({string:r.fromCLI.defaultString.pipe(D.getOrUndefined),number:r.fromCLI.defaultNumber.pipe(D.getOrUndefined),boolean:r.fromCLI.defaultBoolean.pipe(D.getOrUndefined)}),a={...n,...i};return{builderSuffix:yield*t("builderSuffix"),include:yield*t("include"),withNestedBuilders:yield*t("withNestedBuilders"),fileSuffix:yield*t("fileSuffix"),fileCase:yield*t("fileCase"),builderJsDocTagName:yield*t("builderJsDocTagName"),inlineDefaultJsDocTagName:yield*t("inlineDefaultJsDocTagName"),outputDir:yield*t("outputDir"),defaults:{...w.defaults,...a}}}),pi=r=>t=>r.fromCLI[t].pipe(T.orElse(()=>D.flatMap(r.fromConfigFile,n=>D.fromNullable(n[t]))),T.orElseSucceed(()=>w[t])),di=T.fnUntraced(function*(r){let t=yield*Dr.FileSystem;if(yield*T.logDebug(`[Configuration]: Checking if config file exists at ${r}`),yield*T.orDie(t.exists(r))){yield*T.logDebug("[Configuration]: Found config file - attempting to read it");let i=yield*ui(r),a=yield*o.decodeUnknown(Nr)(i);return D.some(a)}else return yield*T.logDebug("[Configuration]: No config file found"),D.none()}),ui=T.fnUntraced(function*(r){let t=yield*Dr.FileSystem,n=yield*T.orDie(t.readFileString(r));return yield*o.decodeUnknown(o.parseJson())(n)},T.orDie);import*as jr from"effect/Effect";import*as q from"effect/Match";import*as y from"effect/Schema";var Mr=y.transform(y.String,y.String,{decode:r=>r.replace(/^['"]|['"]$/g,""),encode:r=>r}),mi=y.transform(y.String,y.String.pipe(y.brand("KebabCase")),{decode:r=>r.replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([A-Z])([A-Z][a-z])/g,"$1-$2").replace(/_/g,"-").toLowerCase(),encode:r=>r}),xr=y.transform(y.String,y.String.pipe(y.brand("PascalCase")),{decode:r=>r.split(/[-_\s]+/).map(t=>t===t.toUpperCase()?t.charAt(0).toUpperCase()+t.slice(1).toLowerCase():t.split(/(?=[A-Z])/).filter(Boolean).map(n=>n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()).join("")).join(""),encode:r=>r}),yi=y.transform(y.String,y.String.pipe(y.brand("CamelCase")),{decode:r=>r.split(/[-_\s]+/).flatMap(t=>t.split(/(?=[A-Z])/)).filter(Boolean).map((t,n)=>{let i=t.toLowerCase();return n===0?i:i.charAt(0).toUpperCase()+i.slice(1)}).join(""),encode:r=>r}),Ve=jr.fnUntraced(function*(r){return q.value(r).pipe(q.when("kebab",()=>mi.pipe(y.decode)),q.when("pascal",()=>xr.pipe(y.decode)),q.when("camel",()=>yi.pipe(y.decode)),q.exhaustive)});import gi from"handlebars";import*as $r from"effect/Data";import*as Y from"effect/Effect";var z=class extends Y.Service()("@TSDataBuilders/TemplateCompiler",{effect:Y.gen(function*(){return{compile:Y.fnUntraced(function*(t,n){return yield*Y.try({try:()=>gi.compile(t)(n),catch:i=>new br({cause:i})})})}})}){},br=class extends $r.TaggedError("TemplateCompileError"){};var ce=class extends se.Service()("@TSDataBuilders/BaseBuilderGenerator",{effect:se.gen(function*(){let t=yield*Wr.Path,n=yield*N,i=yield*x,a=yield*_r.FileSystem,s=yield*z,e=yield*Ve(i.fileCase);return{generate:se.gen(function*(){let c=t.join(yield*n.cwd,i.outputDir),f=t.resolve(c,`${yield*e("dataBuilder")}.ts`),d=yield*a.readFileString(t.join(import.meta.dirname,"templates/base-builder.hbs"),"utf-8");yield*se.logDebug(`[Builders]: Creating base builder at ${f}`),yield*a.writeFileString(f,yield*s.compile(d))})}}),dependencies:[z.Default]}){};import*as Z from"effect/Effect";import{Chunk as Xe}from"effect";import*as xt from"@effect/platform/FileSystem";import*as bt from"@effect/platform/Path";import*as h from"effect/Effect";import*as Se from"effect/Ref";import*as wr from"effect/Schema";import*as H from"effect/Effect";import*as Te from"effect/Effect";import*as p from"effect/Effect";import*as S from"effect/Match";import*as Nt from"effect/Option";import{createPrinter as qr,createProgram as zr,createSourceFile as Yr,EmitHint as Hr,findConfigFile as Zr,getJSDocTags as Xr,isArrayTypeNode as et,isIndexedAccessTypeNode as rt,isIndexSignatureDeclaration as tt,isInterfaceDeclaration as it,isIntersectionTypeNode as ot,isMappedTypeNode as nt,isNamedTupleMember as Or,isOptionalTypeNode as at,isParenthesizedTypeNode as st,isPropertySignature as ct,isTemplateLiteralTypeNode as ft,isTupleTypeNode as lt,isTypeAliasDeclaration as pt,isTypeLiteralNode as We,isTypeOperatorNode as dt,isTypeQueryNode as ut,isTypeReferenceNode as mt,isUnionTypeNode as yt,NodeBuilderFlags as Oe,parseJsonConfigFileContent as gt,readConfigFile as Tt,ScriptTarget as St,SymbolFlags as Et,SyntaxKind as E,sys as Qe}from"typescript";import{SyntaxKind as Ti}from"typescript";var Qr=r=>r.kind===Ti.LiteralType,Si=["Date","Promise","Map","Set","WeakMap","WeakSet","RegExp","Error","BigInt","Array"],_e=r=>Si.includes(r);var qe=r=>{let t=Object.entries(r);return t.length===0?"{}":`{${t.map(([i,a])=>`'${i.replace(/^['"](.*)['"]$/,"$1")}':${a}`).join(",")}}`};import*as Ze from"effect/Data";var ze=class extends Ze.TaggedError("CannotGeneratorDefaultValueForNeverError"){},Ye=class extends Ze.TaggedError("UnionMembersIsEmptyError"){},He=class extends Ze.TaggedError("MissingBuiltinTypeDefaultError"){};import*as ht from"effect/Context";var fe=class extends ht.Tag("@TSDataBuilders/TypeReferenceSideEffect")(){};var hi={Date:"new Date()",Promise:"new Promise(() => {})",Map:"new Map()",Set:"new Set()",WeakMap:"new WeakMap()",WeakSet:"new WeakSet()",RegExp:'new RegExp("")',Error:"new Error()",BigInt:"BigInt(0)",Array:"[]"},we=class extends p.Service()("@TSDataBuilders/TypeNodeDefaultValueGenerator",{effect:p.gen(function*(){let{defaults:t,builderJsDocTagName:n}=yield*x,i=p.fnUntraced(function*(a,s){return yield*S.value(a).pipe(S.when({kind:"StringKeyword"},()=>p.succeed(`'${t.string}'`)),S.when({kind:"NumberKeyword"},()=>p.succeed(t.number.toString(10))),S.when({kind:"BooleanKeyword"},()=>p.succeed(String(t.boolean))),S.when({kind:"UndefinedKeyword"},()=>p.succeed("undefined")),S.when({kind:"LiteralType"},({literal:e})=>p.succeed(e)),S.when({kind:"BigIntKeyword"},()=>p.succeed("0n")),S.when({kind:"SymbolKeyword"},()=>p.succeed("Symbol('')")),S.when({kind:"AnyKeyword"},()=>p.succeed(String(Ci))),S.when({kind:"UnknownKeyword"},()=>p.succeed(String(Di))),S.when({kind:"NeverKeyword"},()=>new ze),S.when({kind:"TypeLiteral"},({propertySignatures:e})=>p.gen(function*(){let c=yield*p.all(e.map(d=>s.onPropertySignature(d)),{concurrency:"unbounded"}),f=Object.assign({},...c);return qe(f)})),S.when({kind:"ArrayType"},()=>p.succeed("[]")),S.when({kind:"TupleType"},({elements:e})=>p.all(e.map(c=>i(c,s)),{concurrency:"unbounded"}).pipe(p.map(c=>`[${c.join(", ")}]`))),S.when({kind:"UnionType"},({members:e})=>Pt(e).pipe(p.flatMap(c=>i(c,s)))),S.when({kind:"IntersectionType"},({members:e})=>p.gen(function*(){return e.some(u=>u.kind!=="TypeLiteral"&&u.kind!=="TypeReference")?`${yield*Pt(e).pipe(p.flatMap(P=>i(P,s)))} as any`:`{${(yield*p.all(e.map(u=>i(u,s)),{concurrency:"unbounded"})).map(u=>u.replace(/^\{|\}$/g,"").trim()).filter(u=>u.length>0).join(", ")}}`})),S.when({kind:"TypeReference"},e=>p.gen(function*(){let{onTypeReference:c}=yield*fe;return yield*c(e),e.jsDocTags.some(f=>f.name===n)?`new ${e.referenceName}Builder().build()`:yield*Nt.match(e.inlineType,{onNone:()=>_e(e.referenceName)?p.succeed(hi[e.referenceName]):p.fail(new He({referenceName:e.referenceName})),onSome:f=>i(f,s)})})),S.exhaustive)});return{generate:i}})}){},Dt={UndefinedKeyword:0,BooleanKeyword:1,NumberKeyword:2,StringKeyword:3,SymbolKeyword:4,BigIntKeyword:5,LiteralType:6,TypeLiteral:7,ArrayType:8,TupleType:9,UnionType:10,IntersectionType:11,UnknownKeyword:12,AnyKeyword:13,TypeReference:14,NeverKeyword:15},Ci=void 0,Di=void 0,Pt=p.fnUntraced(function*(r){let t=r.toSorted((n,i)=>Dt[n.kind]-Dt[i.kind])[0];return t||(yield*new Ye({memberKinds:r.map(n=>n.kind)}))});var Fe=class extends Te.Service()("@TSDataBuilders/PropertySignatureDefaultValueGenerator",{effect:Te.gen(function*(){let t=yield*we,{inlineDefaultJsDocTagName:n}=yield*x,i=Te.fnUntraced(function*(a){if(a.hasQuestionToken)return{};let s=a.jsDocTags.find(e=>e.name===n)?.comment??(yield*t.generate(a.typeNode,{onPropertySignature:i}));return{[a.name]:s}});return{generate:i}}),dependencies:[we.Default]}){};var ke=class extends H.Service()("@TSDataBuilders/DeclarationDefaultValueGenerator",{effect:H.gen(function*(){let t=yield*Fe;return{generate:H.fnUntraced(function*(n){let i=yield*H.all(n.propertySignatures.map(s=>t.generate(s))),a=Object.assign({},...i);return qe(a)})}}),dependencies:[Fe.Default]}){};var Le=class extends h.Service()("@TSDataBuilders/DeclarationBuilderGenerator",{effect:h.gen(function*(){let t=yield*ke,n=yield*N,i=yield*bt.Path,a=yield*xt.FileSystem,s=yield*z,e=yield*x,c=yield*Ve(e.fileCase);return{generate:h.fnUntraced(function*(f){let{declaration:d,fileAbsolutePath:u}=f,P=yield*Se.make(Xe.empty()),ye=yield*t.generate(d).pipe(h.provideService(fe,fe.of({onTypeReference:v=>h.if(v.jsDocTags.some(xe=>xe.name===e.builderJsDocTagName),{onTrue:()=>Se.update(P,Xe.append(v.referenceName)),onFalse:()=>h.void})}))),Tr=yield*Se.get(P).pipe(h.map(Xe.dedupe)),ge=yield*h.all(Tr.pipe(Xe.map(v=>c(v).pipe(h.map(xe=>({referenceName:v,path:`${xe}${e.fileSuffix}`}))))),{concurrency:"unbounded"}),$e=d.name,Ir=i.join(yield*n.cwd,e.outputDir),Pe=i.resolve(Ir,`${yield*c($e)}${e.fileSuffix}.ts`),Sr=i.resolve(u),Ne=i.relative(i.dirname(Pe),Sr).replace(/\.ts$/,""),Er=yield*h.all(d.propertySignatures.map(h.fnUntraced(function*(v){let xe=v.typeNode.kind==="TypeReference"&&v.typeNode.jsDocTags.some(si=>si.name===e.builderJsDocTagName),Br=yield*Mr.pipe(wr.decode)(v.name);return{name:{original:Br,pascal:yield*xr.pipe(wr.decode)(Br)},hasQuestionToken:v.hasQuestionToken,isBuilder:xe}})),{concurrency:"unbounded"}),hr=yield*a.readFileString(i.join(import.meta.dirname,"templates/builder.hbs"),"utf-8"),ai=yield*s.compile(hr,{baseDataBuilderFileName:yield*c("dataBuilder"),builderSuffix:e.builderSuffix,typeName:$e,originalFileImportPath:Ne,defaultValues:ye,properties:Er,subBuilders:ge});yield*a.writeFileString(Pe,ai)})}}),dependencies:[ke.Default,z.Default]}){};var le=class extends Z.Service()("@TSDataBuilders/FileBuilderGenerator",{effect:Z.gen(function*(){let t=yield*Le;return{generate:Z.fnUntraced(function*(n){yield*Z.all(n.declarations.map(i=>t.generate({fileAbsolutePath:n.fileAbsolutePath,declaration:i})),{concurrency:"unbounded"})})}}),dependencies:[Le.Default]}){};import*as Ee from"effect/Chunk";import*as C from"effect/Effect";import*as er from"effect/Option";import*as rr from"effect/Stream";import*as wt from"@effect/platform/FileSystem";import*as Ft from"effect/Chunk";import*as k from"effect/Effect";import*as L from"effect/Stream";var Ie=class extends k.Service()("@TSDataBuilders/FileContentChecker",{effect:k.gen(function*(){yield*k.logDebug("[FileContentChecker]: Instantiating");let t=yield*wt.FileSystem,n=new TextDecoder;return{check:k.fnUntraced(function*(i){let{content:a,filePath:s}=i;return yield*k.logDebug(`[FileContentChecker]: Checking file content of ${s}`),yield*L.orDie(t.stream(s,{chunkSize:16*1024})).pipe(L.map(f=>n.decode(f,{stream:!0})),L.mapAccum("",(f,d)=>{let u=f+d;return[u.slice(-a.length+1),u.includes(a)]}),L.find(f=>!!f),L.tap(()=>k.logDebug(`[FileContentChecker]: Found expected content in ${s}`)),L.runCollect,k.map(f=>f.pipe(Ft.get(0))))})}})}){};import*as It from"effect/Data";import*as $ from"effect/Effect";import*as Bt from"effect/Stream";import*as kt from"glob";import*as Lt from"effect/Data";import*as B from"effect/Effect";var Be=class extends B.Service()("@TSDataBuilders/Glob",{effect:B.gen(function*(){return yield*B.logDebug("[Glob]: Instantiating"),{iterate:B.fnUntraced(function*(t){return yield*B.logDebug(`[Glob]: Iterating ${t.path} in ${t.cwd}`),yield*B.try({try:()=>kt.glob.iterate(t.path,{cwd:t.cwd,nodir:!0}),catch:n=>new Fr({cause:n})})})}})}){},Fr=class extends Lt.TaggedError("GlobIterationError"){};var Ae=class extends $.Service()("@TSDataBuilders/FileTreeWalker",{effect:$.gen(function*(){yield*$.logDebug("[FileTreeWalker]: Instantiating");let t=yield*Be,n=yield*N;return{walk:$.fnUntraced(function*(i){let a=yield*n.cwd;return yield*$.logDebug(`[FileTreeWalker]: Walking path: ${a}/${i}`),Bt.fromAsyncIterable(yield*t.iterate({path:i,cwd:a}),s=>new kr({cause:s}))})}}),dependencies:[Be.Default]}){},kr=class extends It.TaggedError("FileTreeWalkError"){};var pe=class extends C.Service()("@TSDataBuilders/Finder",{effect:C.gen(function*(){yield*C.logDebug("[Finder]: Instantiating");let t=yield*Ie,n=yield*Ae;return{find:C.fnUntraced(function*(i){yield*C.logDebug(`[Finder]: Searching file paths in ${i.include}`);let a=yield*n.walk(i.include);yield*C.logDebug(`[Finder]: Checking which files include at least 1 occurance of ${i.pattern}`);let s=yield*a.pipe(rr.mapEffect(e=>t.check({filePath:e,content:i.pattern}).pipe(C.map(c=>c.pipe(er.map(()=>e)))),{concurrency:"unbounded"}),rr.runCollect,C.map(Ee.filter(e=>er.isSome(e))),C.map(Ee.map(e=>e.value)));return yield*C.logDebug(`[Finder]: Found files with expected pattern: ${s.pipe(Ee.toArray).join(", ")}`),s},C.catchTag("FileTreeWalkError",i=>C.die(i)))}}),dependencies:[Ae.Default,Ie.Default]}){};import*as Ut from"effect/Context";var V=class extends Ut.Tag("@TSDataBuilders/ParseDeclarationPredicate")(){};import*as _t from"effect/Chunk";import*as J from"effect/Effect";import*as Kt from"@effect/platform/Path";import*as A from"effect/Effect";import*as vt from"@effect/platform/Path";import*as _ from"effect/Effect";import*as X from"effect/Data";var tr=class extends X.TaggedError("TSConfigNotFoundError"){},he=class extends X.TaggedError("GetTSConfigError"){},ir=class extends X.TaggedError("CreateProgramError"){},or=class extends X.TaggedError("GetTypeCheckerError"){},nr=class extends X.TaggedError("GetSourceFileError"){},ar=class extends X.TaggedError("CreateSourceFileError"){},sr=class extends X.TaggedError("SourceFileNotFoundError"){};var Ue=class extends _.Service()("@TSDataBuilders/TSConfigResolver",{effect:_.gen(function*(){let t=yield*vt.Path,i=yield*(yield*N).cwd;return{resolve:_.gen(function*(){let a=yield*_.try({try:()=>Zr(i,Qe.fileExists,"tsconfig.json"),catch:e=>new he({cause:e})});if(!a)return yield*new tr;let s=yield*_.try({try:()=>{let{config:e,error:c}=Tt(a,Qe.readFile);if(c)throw c;return e},catch:e=>new he({cause:e})});return yield*_.try({try:()=>gt(s,Qe,t.dirname(a)),catch:e=>new he({cause:e})})})}})}){};var W=class extends A.Service()("@TSDataBuilders/TypescriptProgram",{effect:A.gen(function*(){let t=yield*Kt.Path,i=yield*(yield*Ue).resolve,a=yield*A.try({try:()=>zr(i.fileNames,i.options),catch:f=>new ir({cause:f})}),s=yield*A.try({try:()=>a.getTypeChecker(),catch:f=>new or({cause:f})}),e=A.fnUntraced(function*(f){let d=t.resolve(f),u=yield*A.try({try:()=>a.getSourceFile(d),catch:P=>new nr({cause:P})});return u||(yield*new sr)});return{program:a,typeChecker:s,getSourceFile:e,createSourceFile:f=>A.try({try:()=>Yr(f.fileName,f.sourceText,i.options.target??St.Latest),catch:d=>new ar({cause:d})})}}),dependencies:[Ue.Default]}){};import*as Vt from"@effect/platform/Path";import*as R from"effect/Effect";import*as U from"effect/Data";var Ce=class extends U.TaggedError("GetNodeChildrenError"){},cr=class extends U.TaggedError("SyntaxListNodeNotFoundError"){},fr=class extends U.TaggedError("UnsupportedTypeAliasDeclarationTypeNodeError"){},lr=class extends U.TaggedError("GetJsDocTagsNamesError"){},pr=class extends U.TaggedError("UnsupportedTypeLiteralNodeMemberError"){},dr=class extends U.TaggedError("MissingPropertySignatureTypeNodeError"){},ee=class extends U.TaggedError("GetTypeNodeNameTextError"){},de=class extends U.TaggedError("CannotGetNodeTextError"){},ur=class extends U.TaggedError("UnsupportedTypeNodeError"){},Ge=class extends U.TaggedError("CannotCreateSyntheticTypeNodeError"){};import*as G from"effect/Effect";import*as gr from"effect/Option";import*as te from"effect/Effect";import*as yr from"effect/Option";import*as Mt from"effect/Effect";var j=r=>Mt.try({try:()=>Xr(r).map(t=>({name:t.tagName.getText(),comment:typeof t.comment=="string"?t.comment:void 0})),catch:t=>new lr({cause:t})});import*as M from"effect/Effect";import*as g from"effect/Effect";import*as Re from"effect/Option";var ve=class extends g.Service()("@TSDataBuilders/TypeNodeParser",{effect:g.gen(function*(){yield*g.logDebug("[TypeNodeParser]: Instantiating");let t=yield*W,n=qr(),i=yield*t.createSourceFile({fileName:"temp.ts",sourceText:""}),a=g.fnUntraced(function*(e){let c=t.typeChecker.typeToTypeNode(e.type,e.typeNode,Oe.InTypeAlias|Oe.NoTruncation);return c?yield*s(c,{onTypeLiteral:e.onTypeLiteral}):yield*new Ge}),s=g.fnUntraced(function*(e,c){if(e.kind===E.StringKeyword)return{kind:"StringKeyword"};if(e.kind===E.NumberKeyword)return{kind:"NumberKeyword"};if(e.kind===E.BooleanKeyword)return{kind:"BooleanKeyword"};if(e.kind===E.UndefinedKeyword)return{kind:"UndefinedKeyword"};if(e.kind===E.BigIntKeyword)return{kind:"BigIntKeyword"};if(e.kind===E.SymbolKeyword)return{kind:"SymbolKeyword"};if(e.kind===E.AnyKeyword)return{kind:"AnyKeyword"};if(e.kind===E.UnknownKeyword)return{kind:"UnknownKeyword"};if(e.kind===E.NeverKeyword)return{kind:"NeverKeyword"};if(e.kind===E.ObjectKeyword)return{kind:"TypeLiteral",propertySignatures:[]};if(Qr(e))return{kind:"LiteralType",literal:yield*g.try({try:()=>e.pos===-1?n.printNode(Hr.Unspecified,e,i):e.getText(),catch:f=>new de({cause:f})})};if(We(e))return{kind:"TypeLiteral",propertySignatures:yield*c.onTypeLiteral(e)};if(et(e))return{kind:"ArrayType"};if(lt(e))return{kind:"TupleType",elements:yield*g.all(e.elements.filter(d=>!(Or(d)&&d.dotDotDotToken)).map(d=>s(d,c)),{concurrency:"unbounded"})};if(Or(e))return yield*s(e.type,c);if(yt(e))return{kind:"UnionType",members:yield*g.all(e.types.map(f=>s(f,c)),{concurrency:"unbounded"})};if(mt(e)){let f=yield*g.try({try:()=>"escapedText"in e.typeName?e.typeName.escapedText.toString():e.typeName.getText(),catch:ge=>new de({cause:ge})});if(_e(f))return{kind:"TypeReference",referenceName:f,inlineType:Re.none(),jsDocTags:[]};if(["Awaited","Exclude","Extract","ReturnType","Parameters","ConstructorParameters","InstanceType"].includes(f)){let ge=t.typeChecker.getTypeAtLocation(e);return yield*a({type:ge,typeNode:e,onTypeLiteral:c.onTypeLiteral})}let u=t.typeChecker.getTypeAtLocation(e),P=u.getProperties();if(P.length>0){let $e={kind:"TypeLiteral",propertySignatures:yield*g.all(P.map(g.fn(function*(Ne){let Er=t.typeChecker.getTypeOfSymbol(Ne),hr=yield*a({type:Er,typeNode:e,onTypeLiteral:c.onTypeLiteral});return{name:Ne.getName(),typeNode:hr,hasQuestionToken:!!(Ne.flags&Et.Optional),jsDocTags:[]}})),{concurrency:"unbounded"})},Pe=(u.aliasSymbol??u.getSymbol())?.declarations?.[0],Sr=Pe?yield*j(Pe):[];return{kind:"TypeReference",referenceName:f,inlineType:Re.some($e),jsDocTags:Sr}}let ye=t.typeChecker.typeToTypeNode(u,e,Oe.InTypeAlias|Oe.NoTruncation);if(!ye)return yield*new Ge;let Tr=yield*s(ye,c);return{kind:"TypeReference",referenceName:f,inlineType:Re.some(Tr),jsDocTags:[]}}if(dt(e)){if(e.operator===E.KeyOfKeyword){let f=t.typeChecker.getTypeAtLocation(e);return yield*a({type:f,typeNode:e,onTypeLiteral:c.onTypeLiteral})}if(e.operator===E.ReadonlyKeyword)return yield*s(e.type,c)}if(ut(e)){let f=t.typeChecker.getTypeAtLocation(e);return yield*a({type:f,typeNode:e,onTypeLiteral:c.onTypeLiteral})}if(rt(e)){let f=t.typeChecker.getTypeAtLocation(e);return yield*a({type:f,typeNode:e,onTypeLiteral:c.onTypeLiteral})}if(nt(e)){let f=t.typeChecker.getTypeAtLocation(e);return yield*a({type:f,typeNode:e,onTypeLiteral:c.onTypeLiteral})}if(ot(e))return{kind:"IntersectionType",members:yield*g.all(e.types.map(f=>s(f,c)),{concurrency:"unbounded"})};if(ft(e)){let f=yield*g.try({try:()=>e.head.text,catch:P=>new de({cause:P})}),d=yield*g.all(e.templateSpans.map(P=>g.try({try:()=>P.literal.text,catch:ye=>new de({cause:ye})})),{concurrency:"unbounded"});return{kind:"LiteralType",literal:`'${f+d.join("")}'`}}return at(e)?yield*s(e.type,c):st(e)?yield*s(e.type,c):yield*new ur({kind:E[e.kind]})});return{parse:s}}),dependencies:[W.Default]}){};var re=class extends M.Service()("@TSDataBuilders/TypeLiteralParser",{effect:M.gen(function*(){let t=yield*ve,n=(a,s)=>M.all(a.filter(e=>!tt(e)).map(M.fn(function*(e){if(!ct(e))return yield*new pr;if(!e.type)return yield*new dr;let c=yield*t.parse(e.type,{onTypeLiteral:s.onTypeLiteral});return{name:yield*M.try({try:()=>"escapedText"in e.name?e.name.escapedText.toString():e.name.getText(),catch:d=>new ee({cause:d})}),typeNode:c,hasQuestionToken:!!e.questionToken,jsDocTags:yield*j(e)}})),{concurrency:"unbounded"}),i=a=>n(a.members,{onTypeLiteral:i});return{parseMembers:n,parse:i}}),dependencies:[ve.Default]}){};var Ke=class extends te.Service()("@TSDataBuilders/InterfaceDeclarationParser",{effect:te.gen(function*(){let t=yield*V,n=yield*re;return{parse:te.fnUntraced(function*(i){let a=i.modifiers?.some(c=>c.kind===E.ExportKeyword)??!1,s=yield*j(i);if(!(yield*t({isExported:a,jsDocTags:s})))return yr.none();let e=yield*te.try({try:()=>i.name.getText(),catch:c=>new ee({cause:c})});return yr.some({name:e,propertySignatures:yield*n.parseMembers(i.members,{onTypeLiteral:n.parse}),jsDocTags:yield*j(i)})})}}),dependencies:[re.Default]}){};import{Option as $t}from"effect";import*as ie from"effect/Effect";var je=class extends ie.Service()("@TSDataBuilders/TypeAliasDeclarationParser",{effect:ie.gen(function*(){let t=yield*re,n=yield*V;return{parse:ie.fnUntraced(function*(i){let a=i.modifiers?.some(c=>c.kind===E.ExportKeyword)??!1,s=yield*j(i);if(!(yield*n({isExported:a,jsDocTags:s})))return $t.none();if(!We(i.type))return yield*new fr;let e=yield*ie.try({try:()=>i.name.getText(),catch:c=>new ee({cause:c})});return $t.some({name:e,propertySignatures:yield*t.parse(i.type),jsDocTags:yield*j(i)})})}}),dependencies:[re.Default]}){};var Me=class extends G.Service()("@TSDataBuilders/SyntaxListParser",{effect:G.gen(function*(){let t=yield*je,n=yield*Ke;return{parse:G.fnUntraced(function*(i){let a=yield*G.try({try:()=>i.getChildren(),catch:e=>new Ce({cause:e})});return(yield*G.all(a.map(G.fnUntraced(function*(e){return pt(e)?yield*t.parse(e):it(e)?yield*n.parse(e):gr.none()})),{concurrency:"unbounded"})).filter(e=>gr.isSome(e)).map(e=>e.value)})}}),dependencies:[Ke.Default,je.Default]}){};var Je=class extends R.Service()("@TSDataBuilders/SourceFileParser",{effect:R.gen(function*(){let t=yield*Me,n=yield*Vt.Path;return{parse:i=>R.gen(function*(){let s=(yield*R.try({try:()=>i.getChildren(),catch:e=>new Ce({cause:e})})).find(e=>e.kind===E.SyntaxList);return s?{fileAbsolutePath:i.fileName,declarations:yield*t.parse(s)}:yield*new cr}).pipe(R.catchTags({UnsupportedTypeNodeError:a=>R.dieMessage(`Unsupported type node of kind ${a.kind} found in file ${n.relative(process.cwd(),i.fileName)}`)}))}}),dependencies:[Me.Default]}){};var me=class extends J.Service()("@TSDataBuilders/ProjectParser",{effect:J.gen(function*(){let t=yield*W,n=yield*Je;return{parseFiles:J.fnUntraced(function*(i){return yield*J.all(i.pipe(_t.map(s=>t.getSourceFile(s).pipe(J.flatMap(e=>n.parse(e))))),{concurrency:"unbounded"})})}}),dependencies:[W.Default,Je.Default]}){};import*as Qt from"@effect/platform/FileSystem";import*as qt from"@effect/platform/Path";import*as zt from"effect/Effect";import*as O from"effect/Option";import*as De from"effect/Schema";var Yt=zt.fnUntraced(function*(r){let t=yield*N,n=yield*Qt.FileSystem,i=yield*t.cwd,s=(yield*qt.Path).join(i,Pr),e=be({string:r.defaultString.pipe(O.getOrUndefined),number:r.defaultNumber.pipe(O.getOrUndefined),boolean:r.defaultBoolean.pipe(O.getOrUndefined)}),c=yield*De.decode(Nr)({$schema:"https://raw.githubusercontent.com/nemmtor/ts-databuilders/refs/heads/main/schema.json",builderSuffix:r.builderSuffix.pipe(O.getOrElse(()=>w.builderSuffix)),fileSuffix:r.fileSuffix.pipe(O.getOrElse(()=>w.fileSuffix)),fileCase:r.fileCase.pipe(O.getOrElse(()=>w.fileCase)),include:r.include.pipe(O.getOrElse(()=>w.include)),builderJsDocTagName:r.builderJsDocTagName.pipe(O.getOrElse(()=>w.builderJsDocTagName)),inlineDefaultJsDocTagName:r.inlineDefaultJsDocTagName.pipe(O.getOrElse(()=>w.inlineDefaultJsDocTagName)),withNestedBuilders:r.withNestedBuilders.pipe(O.getOrElse(()=>w.withNestedBuilders)),outputDir:r.outputDir.pipe(O.getOrElse(()=>w.outputDir)),defaults:{...w.defaults,...e}});yield*n.writeFileString(s,`${yield*De.encode(De.parseJson({replacer:null,space:2}))(c)}
|
|
3
|
-
`)});import*as
|
|
2
|
+
import*as oi from"@effect/platform-node/NodeContext";import*as ni from"@effect/platform-node/NodeRuntime";import*as ai from"effect/Effect";import*as U from"@effect/cli/Command";import*as l from"@effect/cli/Options";import*as fe from"effect/Layer";import*as Yr from"@effect/platform/FileSystem";import*as Hr from"@effect/platform/Path";import*as pe from"effect/Effect";import*as xr from"@effect/platform/FileSystem";import*as Jr from"@effect/platform/Path";import*as $r from"effect/Context";import*as T from"effect/Effect";import*as P from"effect/Option";import*as o from"effect/Schema";import*as jr from"effect/Data";import*as Y from"effect/Effect";var x=class extends Y.Service()("@TSDataBuilders/Process",{effect:Y.gen(function*(){return yield*Y.logDebug("[Process]: Instantiating"),{cwd:Y.try({try:()=>process.cwd(),catch:t=>new Nr({cause:t})})}})}){},Nr=class extends jr.TaggedError("GetProcessCwdError"){};var fi=r=>r!==void 0,Le=r=>Object.fromEntries(Object.entries(r).filter(([t,a])=>fi(a)));var m={tsconfig:"Path to tsconfig file. Useful in repos with multiple tsconfig files.",builderJsDocTagName:"JSDoc tag used to mark types for data building generation.",inlineDefaultJsDocTagName:"JSDoc tag used to set default value of given field.",withNestedbuilders:"When set to true ts-databuilders will use nested builders approach.",outputDir:"Output directory for generated builders.",include:"Glob pattern for files included while searching for jsdoc tag.",fileSuffix:"File suffix for created builder files.",fileCase:"Naming convention for generated builder file",builderSuffix:"Suffix for generated classes.",defaults:"Default values to be used in data builder constructor.",defaultString:"Default string value to be used in data builder constructor.",defaultNumber:"Default number value to be used in data builder constructor.",defaultBoolean:"Default boolean value to be used in data builder constructor."};var br="ts-databuilders.json",li=o.Struct({tsconfig:o.NonEmptyTrimmedString,builderJsDocTagName:o.NonEmptyTrimmedString,inlineDefaultJsDocTagName:o.NonEmptyTrimmedString,withNestedBuilders:o.Boolean,outputDir:o.NonEmptyTrimmedString,include:o.NonEmptyTrimmedString,fileSuffix:o.NonEmptyTrimmedString,fileCase:o.Literal("kebab","camel","pascal"),builderSuffix:o.NonEmptyTrimmedString,defaults:o.Struct({string:o.String,number:o.Number,boolean:o.Boolean})}),w=li.make({tsconfig:"tsconfig.json",builderJsDocTagName:"DataBuilder",inlineDefaultJsDocTagName:"DataBuilderDefault",withNestedBuilders:!0,outputDir:"generated/builders",include:"src/**/*.ts{,x}",fileSuffix:".builder",fileCase:"kebab",builderSuffix:"Builder",defaults:{string:"",number:0,boolean:!1}}),Or=o.Struct({$schema:o.optional(o.String),tsconfig:o.String.pipe(o.annotations({description:m.tsconfig})),builderJsDocTagName:o.String.pipe(o.annotations({description:m.builderJsDocTagName})),inlineDefaultJsDocTagName:o.String.pipe(o.annotations({description:m.inlineDefaultJsDocTagName})),withNestedBuilders:o.Boolean.pipe(o.annotations({description:m.withNestedbuilders})),outputDir:o.String.pipe(o.annotations({description:m.outputDir})),include:o.String.pipe(o.annotations({description:m.include})),fileSuffix:o.String.pipe(o.annotations({description:m.fileSuffix})),fileCase:o.Literal("kebab","camel","pascal").pipe(o.annotations({description:m.fileCase})),builderSuffix:o.String.pipe(o.annotations({description:m.builderSuffix})),defaults:o.Struct({string:o.String.pipe(o.annotations({description:m.defaultString})),number:o.Number.pipe(o.annotations({description:m.defaultNumber})),boolean:o.Boolean.pipe(o.annotations({description:m.defaultBoolean}))}).pipe(o.partial,o.annotations({description:m.defaults}))}).pipe(o.partial),N=class extends $r.Tag("Configuration")(){},F=o.Struct({tsconfig:o.NonEmptyTrimmedString,builderJsDocTagName:o.NonEmptyTrimmedString,inlineDefaultJsDocTagName:o.NonEmptyTrimmedString,withNestedBuilders:o.BooleanFromString,outputDir:o.NonEmptyTrimmedString,include:o.NonEmptyTrimmedString,fileSuffix:o.NonEmptyTrimmedString,fileCase:o.Literal("kebab","camel","pascal"),builderSuffix:o.NonEmptyTrimmedString,defaultString:o.String,defaultNumber:o.NumberFromString,defaultBoolean:o.BooleanFromString}),Vr=T.fnUntraced(function*(r){yield*T.logDebug("[Configuration]: Loading configuration");let a=yield*(yield*x).cwd,c=(yield*Jr.Path).join(a,br);yield*T.logDebug("[Configuration]: Attempting to resolve config file");let n=yield*ui(c);yield*T.logDebug("[Configuration]: Attempting to resolve config");let e=yield*pi({fromCLI:r,fromConfigFile:n});return yield*T.logDebug(`[Configuration]: Config resolved with: ${yield*o.encode(o.parseJson({replacer:null,space:2}))(e)}`),N.of(e)}),pi=T.fnUntraced(function*(r){let t=di(r),a=P.flatMap(r.fromConfigFile,e=>P.fromNullable(e.defaults)).pipe(P.map(e=>Le(e)),P.getOrElse(()=>({}))),i=Le({string:r.fromCLI.defaultString.pipe(P.getOrUndefined),number:r.fromCLI.defaultNumber.pipe(P.getOrUndefined),boolean:r.fromCLI.defaultBoolean.pipe(P.getOrUndefined)}),c={...a,...i};return{tsconfig:yield*t("tsconfig"),builderSuffix:yield*t("builderSuffix"),include:yield*t("include"),withNestedBuilders:yield*t("withNestedBuilders"),fileSuffix:yield*t("fileSuffix"),fileCase:yield*t("fileCase"),builderJsDocTagName:yield*t("builderJsDocTagName"),inlineDefaultJsDocTagName:yield*t("inlineDefaultJsDocTagName"),outputDir:yield*t("outputDir"),defaults:{...w.defaults,...c}}}),di=r=>t=>r.fromCLI[t].pipe(T.orElse(()=>P.flatMap(r.fromConfigFile,a=>P.fromNullable(a[t]))),T.orElseSucceed(()=>w[t])),ui=T.fnUntraced(function*(r){let t=yield*xr.FileSystem;if(yield*T.logDebug(`[Configuration]: Checking if config file exists at ${r}`),yield*T.orDie(t.exists(r))){yield*T.logDebug("[Configuration]: Found config file - attempting to read it");let i=yield*mi(r),c=yield*o.decodeUnknown(Or)(i);return P.some(c)}else return yield*T.logDebug("[Configuration]: No config file found"),P.none()}),mi=T.fnUntraced(function*(r){let t=yield*xr.FileSystem,a=yield*T.orDie(t.readFileString(r));return yield*o.decodeUnknown(o.parseJson())(a)},T.orDie);import*as _r from"effect/Effect";import*as Z from"effect/Match";import*as y from"effect/Schema";var Wr=y.transform(y.String,y.String,{decode:r=>r.replace(/^['"]|['"]$/g,""),encode:r=>r}),yi=y.transform(y.String,y.String.pipe(y.brand("KebabCase")),{decode:r=>r.replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([A-Z])([A-Z][a-z])/g,"$1-$2").replace(/_/g,"-").toLowerCase(),encode:r=>r}),wr=y.transform(y.String,y.String.pipe(y.brand("PascalCase")),{decode:r=>r.split(/[-_\s]+/).map(t=>t===t.toUpperCase()?t.charAt(0).toUpperCase()+t.slice(1).toLowerCase():t.split(/(?=[A-Z])/).filter(Boolean).map(a=>a.charAt(0).toUpperCase()+a.slice(1).toLowerCase()).join("")).join(""),encode:r=>r}),gi=y.transform(y.String,y.String.pipe(y.brand("CamelCase")),{decode:r=>r.split(/[-_\s]+/).flatMap(t=>t.split(/(?=[A-Z])/)).filter(Boolean).map((t,a)=>{let i=t.toLowerCase();return a===0?i:i.charAt(0).toUpperCase()+i.slice(1)}).join(""),encode:r=>r}),_e=_r.fnUntraced(function*(r){return Z.value(r).pipe(Z.when("kebab",()=>yi.pipe(y.decode)),Z.when("pascal",()=>wr.pipe(y.decode)),Z.when("camel",()=>gi.pipe(y.decode)),Z.exhaustive)});import Ti from"handlebars";import*as qr from"effect/Data";import*as ee from"effect/Effect";var X=class extends ee.Service()("@TSDataBuilders/TemplateCompiler",{effect:ee.gen(function*(){return{compile:ee.fnUntraced(function*(t,a){return yield*ee.try({try:()=>Ti.compile(t)(a),catch:i=>new Fr({cause:i})})})}})}){},Fr=class extends qr.TaggedError("TemplateCompileError"){};var de=class extends pe.Service()("@TSDataBuilders/BaseBuilderGenerator",{effect:pe.gen(function*(){let t=yield*Hr.Path,a=yield*x,i=yield*N,c=yield*Yr.FileSystem,n=yield*X,e=yield*_e(i.fileCase);return{generate:pe.gen(function*(){let f=t.join(yield*a.cwd,i.outputDir),s=t.resolve(f,`${yield*e("dataBuilder")}.ts`),p=yield*c.readFileString(t.join(import.meta.dirname,"templates/base-builder.hbs"),"utf-8");yield*pe.logDebug(`[Builders]: Creating base builder at ${s}`),yield*c.writeFileString(s,yield*n.compile(p))})}}),dependencies:[X.Default]}){};import*as ie from"effect/Effect";import{Chunk as ir}from"effect";import*as Ot from"@effect/platform/FileSystem";import*as wt from"@effect/platform/Path";import*as C from"effect/Effect";import*as De from"effect/Ref";import*as Lr from"effect/Schema";import*as te from"effect/Effect";import*as Ce from"effect/Effect";import*as d from"effect/Effect";import*as S from"effect/Match";import*as bt from"effect/Option";import{createPrinter as Xr,createProgram as et,createSourceFile as rt,EmitHint as tt,findConfigFile as it,getJSDocTags as ot,isArrayTypeNode as nt,isIndexedAccessTypeNode as at,isIndexSignatureDeclaration as st,isInterfaceDeclaration as ct,isIntersectionTypeNode as Qe,isMappedTypeNode as ft,isNamedTupleMember as kr,isOptionalTypeNode as lt,isParenthesizedTypeNode as pt,isPropertySignature as dt,isTemplateLiteralTypeNode as ut,isTupleTypeNode as mt,isTypeAliasDeclaration as yt,isTypeLiteralNode as qe,isTypeOperatorNode as gt,isTypeQueryNode as Tt,isTypeReferenceNode as ze,isUnionTypeNode as St,NodeBuilderFlags as re,parseJsonConfigFileContent as Et,readConfigFile as ht,ScriptTarget as Ct,SymbolFlags as Ye,SyntaxKind as E,sys as He}from"typescript";import{SyntaxKind as Si}from"typescript";var Zr=r=>r.kind===Si.LiteralType,Ei=["Date","Promise","Map","Set","WeakMap","WeakSet","RegExp","Error","BigInt","Array"],We=r=>Ei.includes(r);var Ze=r=>{let t=Object.entries(r);return t.length===0?"{}":`{${t.map(([i,c])=>`'${i.replace(/^['"](.*)['"]$/,"$1")}':${c}`).join(",")}}`};import*as tr from"effect/Data";var Xe=class extends tr.TaggedError("CannotGeneratorDefaultValueForNeverError"){},er=class extends tr.TaggedError("UnionMembersIsEmptyError"){},rr=class extends tr.TaggedError("MissingBuiltinTypeDefaultError"){};import*as Dt from"effect/Context";var ue=class extends Dt.Tag("@TSDataBuilders/TypeReferenceSideEffect")(){};var Ci={Date:"new Date()",Promise:"new Promise(() => {})",Map:"new Map()",Set:"new Set()",WeakMap:"new WeakMap()",WeakSet:"new WeakSet()",RegExp:'new RegExp("")',Error:"new Error()",BigInt:"BigInt(0)",Array:"[]"},Ie=class extends d.Service()("@TSDataBuilders/TypeNodeDefaultValueGenerator",{effect:d.gen(function*(){let{defaults:t,builderJsDocTagName:a}=yield*N,i=d.fnUntraced(function*(c,n){return yield*S.value(c).pipe(S.when({kind:"StringKeyword"},()=>d.succeed(`'${t.string}'`)),S.when({kind:"NumberKeyword"},()=>d.succeed(t.number.toString(10))),S.when({kind:"BooleanKeyword"},()=>d.succeed(String(t.boolean))),S.when({kind:"UndefinedKeyword"},()=>d.succeed("undefined")),S.when({kind:"LiteralType"},({literal:e})=>d.succeed(e)),S.when({kind:"BigIntKeyword"},()=>d.succeed("0n")),S.when({kind:"SymbolKeyword"},()=>d.succeed("Symbol('')")),S.when({kind:"AnyKeyword"},()=>d.succeed(String(Di))),S.when({kind:"UnknownKeyword"},()=>d.succeed(String(Pi))),S.when({kind:"NeverKeyword"},()=>new Xe),S.when({kind:"TypeLiteral"},({propertySignatures:e})=>d.gen(function*(){let f=yield*d.all(e.map(p=>n.onPropertySignature(p)),{concurrency:"unbounded"}),s=Object.assign({},...f);return Ze(s)})),S.when({kind:"ArrayType"},()=>d.succeed("[]")),S.when({kind:"TupleType"},({elements:e})=>d.all(e.map(f=>i(f,n)),{concurrency:"unbounded"}).pipe(d.map(f=>`[${f.join(", ")}]`))),S.when({kind:"UnionType"},({members:e})=>xt(e).pipe(d.flatMap(f=>i(f,n)))),S.when({kind:"IntersectionType"},({members:e})=>d.gen(function*(){return e.some(u=>u.kind!=="TypeLiteral"&&u.kind!=="TypeReference")?`${yield*xt(e).pipe(d.flatMap(h=>i(h,n)))} as any`:`{${(yield*d.all(e.map(u=>i(u,n)),{concurrency:"unbounded"})).map(u=>u.replace(/^\{|\}$/g,"").trim()).filter(u=>u.length>0).join(", ")}}`})),S.when({kind:"TypeReference"},e=>d.gen(function*(){let{onTypeReference:f}=yield*ue;return yield*f(e),e.jsDocTags.some(s=>s.name===a)?`new ${e.referenceName}Builder().build()`:yield*bt.match(e.inlineType,{onNone:()=>We(e.referenceName)?d.succeed(Ci[e.referenceName]):d.fail(new rr({referenceName:e.referenceName})),onSome:s=>i(s,n)})})),S.exhaustive)});return{generate:i}})}){},Nt={LiteralType:0,UndefinedKeyword:1,BooleanKeyword:2,NumberKeyword:3,StringKeyword:4,SymbolKeyword:5,BigIntKeyword:6,TypeLiteral:7,ArrayType:8,TupleType:9,UnionType:10,IntersectionType:11,UnknownKeyword:12,AnyKeyword:13,TypeReference:14,NeverKeyword:15},Di=void 0,Pi=void 0,xt=d.fnUntraced(function*(r){let t=r.toSorted((a,i)=>Nt[a.kind]-Nt[i.kind])[0];return t||(yield*new er({memberKinds:r.map(a=>a.kind)}))});var Be=class extends Ce.Service()("@TSDataBuilders/PropertySignatureDefaultValueGenerator",{effect:Ce.gen(function*(){let t=yield*Ie,{inlineDefaultJsDocTagName:a}=yield*N,i=Ce.fnUntraced(function*(c){if(c.hasQuestionToken)return{};let n=c.jsDocTags.find(e=>e.name===a)?.comment??(yield*t.generate(c.typeNode,{onPropertySignature:i}));return{[c.name]:n}});return{generate:i}}),dependencies:[Ie.Default]}){};var Ue=class extends te.Service()("@TSDataBuilders/DeclarationDefaultValueGenerator",{effect:te.gen(function*(){let t=yield*Be;return{generate:te.fnUntraced(function*(a){let i=yield*te.all(a.propertySignatures.map(n=>t.generate(n))),c=Object.assign({},...i);return Ze(c)})}}),dependencies:[Be.Default]}){};var Ae=class extends C.Service()("@TSDataBuilders/DeclarationBuilderGenerator",{effect:C.gen(function*(){let t=yield*Ue,a=yield*x,i=yield*wt.Path,c=yield*Ot.FileSystem,n=yield*X,e=yield*N,f=yield*_e(e.fileCase);return{generate:C.fnUntraced(function*(s){let{declaration:p,fileAbsolutePath:u}=s,h=yield*De.make(ir.empty()),M=yield*t.generate(p).pipe(C.provideService(ue,ue.of({onTypeReference:J=>C.if(J.jsDocTags.some(ke=>ke.name===e.builderJsDocTagName),{onTrue:()=>De.update(h,ir.append(J.referenceName)),onFalse:()=>C.void})}))),Oe=yield*De.get(h).pipe(C.map(ir.dedupe)),W=yield*C.all(Oe.pipe(ir.map(J=>f(J).pipe(C.map(ke=>({referenceName:J,path:`${ke}${e.fileSuffix}`}))))),{concurrency:"unbounded"}),he=p.name,Rr=i.join(yield*a.cwd,e.outputDir),we=i.resolve(Rr,`${yield*f(he)}${e.fileSuffix}.ts`),Cr=i.resolve(u),Fe=i.relative(i.dirname(we),Cr).replace(/\.ts$/,""),Dr=yield*C.all(p.propertySignatures.map(C.fnUntraced(function*(J){let ke=J.typeNode.kind==="TypeReference"&&J.typeNode.jsDocTags.some(ci=>ci.name===e.builderJsDocTagName),vr=yield*Wr.pipe(Lr.decode)(J.name);return{name:{original:vr,pascal:yield*wr.pipe(Lr.decode)(vr)},hasQuestionToken:J.hasQuestionToken,isBuilder:ke}})),{concurrency:"unbounded"}),Pr=yield*c.readFileString(i.join(import.meta.dirname,"templates/builder.hbs"),"utf-8"),si=yield*n.compile(Pr,{baseDataBuilderFileName:yield*f("dataBuilder"),builderSuffix:e.builderSuffix,typeName:he,originalFileImportPath:Fe,defaultValues:M,properties:Dr,subBuilders:W});yield*c.writeFileString(we,si)})}}),dependencies:[Ue.Default,X.Default]}){};var me=class extends ie.Service()("@TSDataBuilders/FileBuilderGenerator",{effect:ie.gen(function*(){let t=yield*Ae;return{generate:ie.fnUntraced(function*(a){yield*ie.all(a.declarations.map(i=>t.generate({fileAbsolutePath:a.fileAbsolutePath,declaration:i})),{concurrency:"unbounded"})})}}),dependencies:[Ae.Default]}){};import*as Pe from"effect/Chunk";import*as D from"effect/Effect";import*as or from"effect/Option";import*as nr from"effect/Stream";import*as kt from"@effect/platform/FileSystem";import*as Lt from"effect/Chunk";import*as k from"effect/Effect";import*as L from"effect/Stream";var Ge=class extends k.Service()("@TSDataBuilders/FileContentChecker",{effect:k.gen(function*(){yield*k.logDebug("[FileContentChecker]: Instantiating");let t=yield*kt.FileSystem,a=new TextDecoder;return{check:k.fnUntraced(function*(i){let{content:c,filePath:n}=i;return yield*k.logDebug(`[FileContentChecker]: Checking file content of ${n}`),yield*L.orDie(t.stream(n,{chunkSize:16*1024})).pipe(L.map(s=>a.decode(s,{stream:!0})),L.mapAccum("",(s,p)=>{let u=s+p;return[u.slice(-c.length+1),u.includes(c)]}),L.find(s=>!!s),L.tap(()=>k.logDebug(`[FileContentChecker]: Found expected content in ${n}`)),L.runCollect,k.map(s=>s.pipe(Lt.get(0))))})}})}){};import*as Ut from"effect/Data";import*as Q from"effect/Effect";import*as At from"effect/Stream";import*as It from"glob";import*as Bt from"effect/Data";import*as A from"effect/Effect";var Re=class extends A.Service()("@TSDataBuilders/Glob",{effect:A.gen(function*(){return yield*A.logDebug("[Glob]: Instantiating"),{iterate:A.fnUntraced(function*(t){return yield*A.logDebug(`[Glob]: Iterating ${t.path} in ${t.cwd}`),yield*A.try({try:()=>It.glob.iterate(t.path,{cwd:t.cwd,nodir:!0}),catch:a=>new Ir({cause:a})})})}})}){},Ir=class extends Bt.TaggedError("GlobIterationError"){};var ve=class extends Q.Service()("@TSDataBuilders/FileTreeWalker",{effect:Q.gen(function*(){yield*Q.logDebug("[FileTreeWalker]: Instantiating");let t=yield*Re,a=yield*x;return{walk:Q.fnUntraced(function*(i){let c=yield*a.cwd;return yield*Q.logDebug(`[FileTreeWalker]: Walking path: ${c}/${i}`),At.fromAsyncIterable(yield*t.iterate({path:i,cwd:c}),n=>new Br({cause:n}))})}}),dependencies:[Re.Default]}){},Br=class extends Ut.TaggedError("FileTreeWalkError"){};var ye=class extends D.Service()("@TSDataBuilders/Finder",{effect:D.gen(function*(){yield*D.logDebug("[Finder]: Instantiating");let t=yield*Ge,a=yield*ve;return{find:D.fnUntraced(function*(i){yield*D.logDebug(`[Finder]: Searching file paths in ${i.include}`);let c=yield*a.walk(i.include);yield*D.logDebug(`[Finder]: Checking which files include at least 1 occurance of ${i.pattern}`);let n=yield*c.pipe(nr.mapEffect(e=>t.check({filePath:e,content:i.pattern}).pipe(D.map(f=>f.pipe(or.map(()=>e)))),{concurrency:"unbounded"}),nr.runCollect,D.map(Pe.filter(e=>or.isSome(e))),D.map(Pe.map(e=>e.value)));return yield*D.logDebug(`[Finder]: Found files with expected pattern: ${n.pipe(Pe.toArray).join(", ")}`),n},D.catchTag("FileTreeWalkError",i=>D.die(i)))}}),dependencies:[ve.Default,Ge.Default]}){};import*as Rt from"effect/Context";var q=class extends Rt.Tag("@TSDataBuilders/ParseDeclarationPredicate")(){};import*as Wt from"effect/Chunk";import*as _ from"effect/Effect";import*as Mt from"@effect/platform/Path";import*as G from"effect/Effect";import*as Kt from"@effect/platform/Path";import*as z from"effect/Effect";import*as oe from"effect/Data";var ar=class extends oe.TaggedError("TSConfigNotFoundError"){},Ne=class extends oe.TaggedError("GetTSConfigError"){},sr=class extends oe.TaggedError("CreateProgramError"){},cr=class extends oe.TaggedError("GetTypeCheckerError"){},fr=class extends oe.TaggedError("GetSourceFileError"){},lr=class extends oe.TaggedError("CreateSourceFileError"){},pr=class extends oe.TaggedError("SourceFileNotFoundError"){};var je=class extends z.Service()("@TSDataBuilders/TSConfigResolver",{effect:z.gen(function*(){let t=yield*Kt.Path,i=yield*(yield*x).cwd,{tsconfig:c}=yield*N;return{resolve:z.gen(function*(){let n=yield*z.try({try:()=>it(i,He.fileExists,c),catch:f=>new Ne({cause:f})});if(!n)return yield*new ar;let e=yield*z.try({try:()=>{let{config:f,error:s}=ht(n,He.readFile);if(s)throw s;return f},catch:f=>new Ne({cause:f})});return yield*z.try({try:()=>Et(e,He,t.dirname(n)),catch:f=>new Ne({cause:f})})})}})}){};var I=class extends G.Service()("@TSDataBuilders/TypescriptProgram",{effect:G.gen(function*(){let t=yield*Mt.Path,i=yield*(yield*je).resolve,c=yield*G.try({try:()=>et(i.fileNames,i.options),catch:s=>new sr({cause:s})}),n=yield*G.try({try:()=>c.getTypeChecker(),catch:s=>new cr({cause:s})}),e=G.fnUntraced(function*(s){let p=t.resolve(s),u=yield*G.try({try:()=>c.getSourceFile(p),catch:h=>new fr({cause:h})});return u||(yield*new pr)});return{program:c,typeChecker:n,getSourceFile:e,createSourceFile:s=>G.try({try:()=>rt(s.fileName,s.sourceText,i.options.target??Ct.Latest),catch:p=>new lr({cause:p})})}}),dependencies:[je.Default]}){};import*as _t from"@effect/platform/Path";import*as K from"effect/Effect";import*as R from"effect/Data";var xe=class extends R.TaggedError("GetNodeChildrenError"){},dr=class extends R.TaggedError("SyntaxListNodeNotFoundError"){},ur=class extends R.TaggedError("UnsupportedTypeAliasDeclarationTypeNodeError"){},mr=class extends R.TaggedError("GetJsDocTagsNamesError"){},yr=class extends R.TaggedError("UnsupportedTypeLiteralNodeMemberError"){},gr=class extends R.TaggedError("MissingPropertySignatureTypeNodeError"){},ne=class extends R.TaggedError("GetTypeNodeNameTextError"){},ge=class extends R.TaggedError("CannotGetNodeTextError"){},Tr=class extends R.TaggedError("UnsupportedTypeNodeError"){},Te=class extends R.TaggedError("CannotCreateSyntheticTypeNodeError"){};import*as j from"effect/Effect";import*as hr from"effect/Option";import*as ce from"effect/Effect";import*as Er from"effect/Option";import*as Jt from"effect/Effect";var v=r=>Jt.try({try:()=>ot(r).map(t=>({name:t.tagName.getText(),comment:typeof t.comment=="string"?t.comment:void 0})),catch:t=>new mr({cause:t})});import*as V from"effect/Effect";import*as g from"effect/Effect";import*as Ke from"effect/Option";var ae=class extends g.Service()("@TSDataBuilders/TypeNodeParser",{effect:g.gen(function*(){yield*g.logDebug("[TypeNodeParser]: Instantiating");let t=yield*I,a=Xr(),i=yield*t.createSourceFile({fileName:"temp.ts",sourceText:""}),c=g.fnUntraced(function*(e){let f=t.typeChecker.typeToTypeNode(e.type,e.typeNode,re.InTypeAlias|re.NoTruncation);return f?yield*n(f,{onTypeLiteral:e.onTypeLiteral}):yield*new Te}),n=g.fnUntraced(function*(e,f){if(e.kind===E.StringKeyword)return{kind:"StringKeyword"};if(e.kind===E.NumberKeyword)return{kind:"NumberKeyword"};if(e.kind===E.BooleanKeyword)return{kind:"BooleanKeyword"};if(e.kind===E.UndefinedKeyword)return{kind:"UndefinedKeyword"};if(e.kind===E.BigIntKeyword)return{kind:"BigIntKeyword"};if(e.kind===E.SymbolKeyword)return{kind:"SymbolKeyword"};if(e.kind===E.AnyKeyword)return{kind:"AnyKeyword"};if(e.kind===E.UnknownKeyword)return{kind:"UnknownKeyword"};if(e.kind===E.NeverKeyword)return{kind:"NeverKeyword"};if(e.kind===E.ObjectKeyword)return{kind:"TypeLiteral",propertySignatures:[]};if(Zr(e)){let s=e.pos===-1||e.getSourceFile()===void 0;return{kind:"LiteralType",literal:yield*g.try({try:()=>s?a.printNode(tt.Unspecified,e,i):e.getText(),catch:p=>new ge({cause:p})})}}if(qe(e))return{kind:"TypeLiteral",propertySignatures:yield*f.onTypeLiteral(e)};if(nt(e))return{kind:"ArrayType"};if(mt(e))return{kind:"TupleType",elements:yield*g.all(e.elements.filter(p=>!(kr(p)&&p.dotDotDotToken)).map(p=>n(p,f)),{concurrency:"unbounded"})};if(kr(e))return yield*n(e.type,f);if(St(e))return{kind:"UnionType",members:yield*g.all(e.types.map(s=>n(s,f)),{concurrency:"unbounded"})};if(ze(e)){let s=yield*g.try({try:()=>"escapedText"in e.typeName?e.typeName.escapedText.toString():e.typeName.getText(),catch:W=>new ge({cause:W})});if(We(s))return{kind:"TypeReference",referenceName:s,inlineType:Ke.none(),jsDocTags:[]};if(["Awaited","Exclude","Extract","ReturnType","Parameters","ConstructorParameters","InstanceType"].includes(s)){let W=t.typeChecker.getTypeAtLocation(e);return yield*c({type:W,typeNode:e,onTypeLiteral:f.onTypeLiteral})}let u=t.typeChecker.getTypeAtLocation(e),h=u.getProperties();if(h.length>0&&!u.isUnion()){let he={kind:"TypeLiteral",propertySignatures:yield*g.all(h.map(g.fn(function*(Fe){let Dr=t.typeChecker.getTypeOfSymbol(Fe),Pr=yield*c({type:Dr,typeNode:e,onTypeLiteral:f.onTypeLiteral});return{name:Fe.getName(),typeNode:Pr,hasQuestionToken:!!(Fe.flags&Ye.Optional),jsDocTags:[]}})),{concurrency:"unbounded"})},we=(u.aliasSymbol??u.getSymbol())?.declarations?.[0],Cr=we?yield*v(we):[];return{kind:"TypeReference",referenceName:s,inlineType:Ke.some(he),jsDocTags:Cr}}let M=t.typeChecker.typeToTypeNode(u,e,re.InTypeAlias|re.NoTruncation);if(!M)return yield*new Te;let Oe=yield*n(M,f);return{kind:"TypeReference",referenceName:s,inlineType:Ke.some(Oe),jsDocTags:[]}}if(gt(e)){if(e.operator===E.KeyOfKeyword){let s=t.typeChecker.getTypeAtLocation(e);return yield*c({type:s,typeNode:e,onTypeLiteral:f.onTypeLiteral})}if(e.operator===E.ReadonlyKeyword)return yield*n(e.type,f)}if(Tt(e)){let s=t.typeChecker.getTypeAtLocation(e);return yield*c({type:s,typeNode:e,onTypeLiteral:f.onTypeLiteral})}if(at(e)){let s=t.typeChecker.getTypeAtLocation(e);return yield*c({type:s,typeNode:e,onTypeLiteral:f.onTypeLiteral})}if(ft(e)){let s=t.typeChecker.getTypeAtLocation(e);return yield*c({type:s,typeNode:e,onTypeLiteral:f.onTypeLiteral})}if(Qe(e))return{kind:"IntersectionType",members:yield*g.all(e.types.map(s=>n(s,f)),{concurrency:"unbounded"})};if(ut(e)){let s=yield*g.try({try:()=>e.head.text,catch:h=>new ge({cause:h})}),p=yield*g.all(e.templateSpans.map(h=>g.try({try:()=>h.literal.text,catch:M=>new ge({cause:M})})),{concurrency:"unbounded"});return{kind:"LiteralType",literal:`'${s+p.join("")}'`}}return lt(e)?yield*n(e.type,f):pt(e)?yield*n(e.type,f):yield*new Tr({kind:E[e.kind]})});return{parse:n}}),dependencies:[I.Default]}){};var se=class extends V.Service()("@TSDataBuilders/TypeLiteralParser",{effect:V.gen(function*(){let t=yield*ae,a=(c,n)=>V.all(c.filter(e=>!st(e)).map(V.fn(function*(e){if(!dt(e))return yield*new yr;if(!e.type)return yield*new gr;let f=yield*t.parse(e.type,{onTypeLiteral:n.onTypeLiteral});return{name:yield*V.try({try:()=>"escapedText"in e.name?e.name.escapedText.toString():e.name.getText(),catch:p=>new ne({cause:p})}),typeNode:f,hasQuestionToken:!!e.questionToken,jsDocTags:yield*v(e)}})),{concurrency:"unbounded"}),i=c=>a(c.members,{onTypeLiteral:i});return{parseMembers:a,parse:i}}),dependencies:[ae.Default]}){};var Me=class extends ce.Service()("@TSDataBuilders/InterfaceDeclarationParser",{effect:ce.gen(function*(){let t=yield*q,a=yield*se;return{parse:ce.fnUntraced(function*(i){let c=i.modifiers?.some(f=>f.kind===E.ExportKeyword)??!1,n=yield*v(i);if(!(yield*t({isExported:c,jsDocTags:n})))return Er.none();let e=yield*ce.try({try:()=>i.name.getText(),catch:f=>new ne({cause:f})});return Er.some({name:e,propertySignatures:yield*a.parseMembers(i.members,{onTypeLiteral:a.parse}),jsDocTags:yield*v(i)})})}}),dependencies:[se.Default]}){};import{Option as Ar}from"effect";import*as B from"effect/Effect";var Je=class extends B.Service()("@TSDataBuilders/TypeAliasDeclarationParser",{effect:B.gen(function*(){let t=yield*se,a=yield*ae,i=yield*I,c=yield*q;return{parse:B.fnUntraced(function*(n){let e=n.modifiers?.some(p=>p.kind===E.ExportKeyword)??!1,f=yield*v(n);if(!(yield*c({isExported:e,jsDocTags:f})))return Ar.none();let s=yield*B.try({try:()=>n.name.getText(),catch:p=>new ne({cause:p})});if(qe(n.type))return Ar.some({name:s,propertySignatures:yield*t.parse(n.type),jsDocTags:yield*v(n)});if(Qe(n.type)||ze(n.type)){let u=i.typeChecker.getTypeAtLocation(n.type).getProperties(),h=yield*B.all(u.map(B.fn(function*(M){let Oe=i.typeChecker.getTypeOfSymbol(M),W=i.typeChecker.typeToTypeNode(Oe,n.type,re.InTypeAlias|re.NoTruncation);if(!W)return yield*new Te;let he=yield*a.parse(W,{onTypeLiteral:t.parse});return{name:M.getName(),typeNode:he,hasQuestionToken:!!(M.flags&Ye.Optional),jsDocTags:[]}})),{concurrency:"unbounded"});return Ar.some({name:s,propertySignatures:h,jsDocTags:yield*v(n)})}return yield*new ur})}}),dependencies:[se.Default,ae.Default,I.Default]}){};var $e=class extends j.Service()("@TSDataBuilders/SyntaxListParser",{effect:j.gen(function*(){let t=yield*Je,a=yield*Me;return{parse:j.fnUntraced(function*(i){let c=yield*j.try({try:()=>i.getChildren(),catch:e=>new xe({cause:e})});return(yield*j.all(c.map(j.fnUntraced(function*(e){return yt(e)?yield*t.parse(e):ct(e)?yield*a.parse(e):hr.none()})),{concurrency:"unbounded"})).filter(e=>hr.isSome(e)).map(e=>e.value)})}}),dependencies:[Me.Default,Je.Default]}){};var Ve=class extends K.Service()("@TSDataBuilders/SourceFileParser",{effect:K.gen(function*(){let t=yield*$e,a=yield*_t.Path;return{parse:i=>K.gen(function*(){let n=(yield*K.try({try:()=>i.getChildren(),catch:e=>new xe({cause:e})})).find(e=>e.kind===E.SyntaxList);return n?{fileAbsolutePath:i.fileName,declarations:yield*t.parse(n)}:yield*new dr}).pipe(K.catchTags({UnsupportedTypeNodeError:c=>K.dieMessage(`Unsupported type node of kind ${c.kind} found in file ${a.relative(process.cwd(),i.fileName)}`)}))}}),dependencies:[$e.Default]}){};var Ee=class extends _.Service()("@TSDataBuilders/ProjectParser",{effect:_.gen(function*(){let t=yield*I,a=yield*Ve;return{parseFiles:_.fnUntraced(function*(i){return yield*_.all(i.pipe(Wt.map(n=>t.getSourceFile(n).pipe(_.flatMap(e=>a.parse(e))))),{concurrency:"unbounded"})})}}),dependencies:[I.Default,Ve.Default]}){};import*as qt from"@effect/platform/FileSystem";import*as zt from"@effect/platform/Path";import*as Yt from"effect/Effect";import*as O from"effect/Option";import*as be from"effect/Schema";var Ht=Yt.fnUntraced(function*(r){let t=yield*x,a=yield*qt.FileSystem,i=yield*t.cwd,n=(yield*zt.Path).join(i,br),e=Le({string:r.defaultString.pipe(O.getOrUndefined),number:r.defaultNumber.pipe(O.getOrUndefined),boolean:r.defaultBoolean.pipe(O.getOrUndefined)}),f=yield*be.decode(Or)({$schema:"https://raw.githubusercontent.com/nemmtor/ts-databuilders/refs/heads/main/schema.json",builderSuffix:r.builderSuffix.pipe(O.getOrElse(()=>w.builderSuffix)),fileSuffix:r.fileSuffix.pipe(O.getOrElse(()=>w.fileSuffix)),fileCase:r.fileCase.pipe(O.getOrElse(()=>w.fileCase)),include:r.include.pipe(O.getOrElse(()=>w.include)),builderJsDocTagName:r.builderJsDocTagName.pipe(O.getOrElse(()=>w.builderJsDocTagName)),inlineDefaultJsDocTagName:r.inlineDefaultJsDocTagName.pipe(O.getOrElse(()=>w.inlineDefaultJsDocTagName)),withNestedBuilders:r.withNestedBuilders.pipe(O.getOrElse(()=>w.withNestedBuilders)),outputDir:r.outputDir.pipe(O.getOrElse(()=>w.outputDir)),tsconfig:r.tsconfig.pipe(O.getOrElse(()=>w.tsconfig)),defaults:{...w.defaults,...e}});yield*a.writeFileString(n,`${yield*be.encode(be.parseJson({replacer:null,space:2}))(f)}
|
|
3
|
+
`)});import*as Zt from"@effect/platform/FileSystem";import*as b from"effect/Effect";import*as Xt from"effect/Layer";var ei=b.gen(function*(){let r=yield*Zt.FileSystem,t=yield*ye,a=yield*Ee,i=yield*me,c=yield*de,{include:n,builderJsDocTagName:e,outputDir:f}=yield*N;yield*b.logInfo(`Scanning '${n}' for files including types annotated with '@${e}'.`);let s=yield*t.find({include:n,pattern:`@${e}`});if(s.length===0){yield*b.logInfo("Nothing to generate.");return}yield*b.logInfo(`Found ${s.length} file(s), parsing it to understand data shape.`);let p=yield*a.parseFiles(s);yield*b.logInfo("Generating builders."),yield*r.makeDirectory(f,{recursive:!0}),yield*c.generate,yield*b.all(p.flatMap(h=>i.generate(h)),{concurrency:"unbounded"});let u=p.flatMap(h=>h.declarations).length;yield*b.logInfo(`Created ${u} builder(s).`)}),ri=Xt.effect(q,b.gen(function*(){let r=yield*N;return t=>t.isExported?t.jsDocTags.some(a=>a.name===r.builderJsDocTagName)?b.succeed(!0):b.succeed(!1):b.succeed(!1)}));var ti="0.0.1-alpha.23";var ji=l.text("tsconfig").pipe(l.withAlias("t"),l.withDescription(m.tsconfig),l.withSchema(F.fields.tsconfig),l.optional),Ki=l.text("builder-jsdoc-tag-name").pipe(l.withDescription(m.builderJsDocTagName),l.withSchema(F.fields.builderJsDocTagName),l.optional),Mi=l.text("inline-default-jsdoc-tag-name").pipe(l.withDescription(m.inlineDefaultJsDocTagName),l.withSchema(F.fields.inlineDefaultJsDocTagName),l.optional),Ji=l.text("with-nested-builders").pipe(l.withDescription(m.withNestedbuilders),l.withSchema(F.fields.withNestedBuilders),l.optional),$i=l.text("output-dir").pipe(l.withAlias("o"),l.withDescription(m.outputDir),l.withSchema(F.fields.outputDir),l.optional),Vi=l.text("include").pipe(l.withAlias("i"),l.withDescription(m.include),l.withSchema(F.fields.include),l.optional),_i=l.text("file-case").pipe(l.withDescription(m.fileCase),l.withSchema(F.fields.fileCase),l.optional),Wi=l.text("file-suffix").pipe(l.withDescription(m.fileSuffix),l.withSchema(F.fields.fileSuffix),l.optional),Qi=l.text("builder-suffix").pipe(l.withDescription(m.builderSuffix),l.withSchema(F.fields.builderSuffix),l.optional),qi=l.text("default-string").pipe(l.withDescription(m.defaultString),l.withSchema(F.fields.defaultString),l.optional),zi=l.text("default-number").pipe(l.withDescription(m.defaultNumber),l.withSchema(F.fields.defaultNumber),l.optional),Yi=l.text("default-boolean").pipe(l.withDescription(m.defaultBoolean),l.withSchema(F.fields.defaultBoolean),l.optional),ii={tsconfig:ji,builderJsDocTagName:Ki,outputDir:$i,withNestedBuilders:Ji,include:Vi,fileSuffix:Wi,fileCase:_i,builderSuffix:Qi,defaultString:qi,defaultNumber:zi,defaultBoolean:Yi,inlineDefaultJsDocTagName:Mi},Hi=U.make("init",ii).pipe(U.withHandler(Ht)),Zi=U.make("ts-databuilders",ii),Gr=Zi.pipe(U.withHandler(()=>ei),U.withSubcommands([Hi]),U.provide(r=>fe.mergeAll(ye.Default,Ee.Default,me.Default,de.Default).pipe(fe.provideMerge(ri),fe.provideMerge(fe.effect(N,Vr(r))),fe.provideMerge(x.Default))),U.run({name:"Typescript Databuilders generator",version:ti}));Gr(process.argv).pipe(ai.provide(oi.layer),ni.runMain);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@nemmtor/ts-databuilders",
|
|
4
|
-
"version": "0.0.1-alpha.
|
|
4
|
+
"version": "0.0.1-alpha.23",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
7
7
|
"description": "CLI tool that automatically generates builder classes from annotated TypeScript types.",
|