@junobuild/did-tools 0.3.9 → 0.3.10-next-2026-03-05
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/dist/node/index.mjs +26 -6
- package/dist/node/index.mjs.map +4 -4
- package/dist/types/api/index.d.ts +7 -0
- package/dist/types/index.d.ts +2 -7
- package/dist/types/zod/_converters.d.ts +12 -0
- package/dist/types/zod/_types.d.ts +40 -0
- package/dist/types/zod/index.d.ts +2 -0
- package/dist/types/zod/zod-to-candid.d.ts +2 -0
- package/dist/types/zod/zod-to-rust.d.ts +2 -0
- package/package.json +11 -9
- /package/dist/types/{services → api/services}/inspector.services.d.ts +0 -0
- /package/dist/types/{services → api/services}/parser.services.d.ts +0 -0
- /package/dist/types/{types → api/types}/method-signature.d.ts +0 -0
- /package/dist/types/{types → api/types}/transformer-options.d.ts +0 -0
package/dist/node/index.mjs
CHANGED
|
@@ -1,27 +1,47 @@
|
|
|
1
1
|
import { createRequire as topLevelCreateRequire } from 'module';
|
|
2
2
|
const require = topLevelCreateRequire(import.meta.url);
|
|
3
|
-
var
|
|
3
|
+
var R=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(r,t)=>(typeof require<"u"?require:r)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});import{writeFile as X}from"node:fs/promises";import*as j from"@babel/parser";import{isTSAnyKeyword as N,isTSArrayType as A,isTSBigIntKeyword as _,isTSBooleanKeyword as P,isTSNeverKeyword as D,isTSNullKeyword as x,isTSNumberKeyword as I,isTSObjectKeyword as z,isTSStringKeyword as L,isTSSymbolKeyword as C,isTSTupleType as h,isTSTypeReference as w,isTSUndefinedKeyword as H,isTSUnknownKeyword as J,isTSVoidKeyword as K}from"@babel/types";import{isNullish as g,nonNullish as $}from"@dfinity/utils";import{readFile as B}from"node:fs/promises";var{parse:U}=j,F={sourceType:"module",plugins:["typescript"]},E=async({inputFile:e})=>{let r=await B(e,"utf-8"),t=U(r,F),n=[],o=[],i=[],{default:s}=R("@babel/traverse");return s(t,{TSInterfaceDeclaration(a){if(a.node.id.name==="_SERVICE"){let p=a.node.body.body;for(let d of p)if(d.type==="TSMethodSignature"||d.type==="TSPropertySignature"){let c=V(d);$(c)&&n.push(c)}}else o.push(a.node.id.name)},TSTypeAliasDeclaration(a){i.push(a.node.id.name)}}),{methods:n,imports:[...o,...i]}},S=e=>{if(g(e))return"unknown";if(w(e)){let r=e.typeName?.name;if(g(r))return"unknown";if($(e.typeParameters?.params?.length)){let t=e.typeParameters.params.map(S);return`${r}<${t.join(", ")}>`}return r??"unknown"}return L(e)?"string":I(e)?"number":P(e)?"boolean":_(e)?"bigint":C(e)?"symbol":x(e)?"null":H(e)?"undefined":K(e)?"void":D(e)?"never":J(e)?"unknown":N(e)?"any":z(e)?"object":h(e)?`[${e.elementTypes.map(S).join(", ")}]`:A(e)?`${S(e.elementType)}[]`:"unknown"},V=e=>{let{type:r,key:t}=e,o=(()=>{if(t.type==="Identifier")return t.name;if(t.type==="StringLiteral")return t.value})();if(g(o)||r!=="TSPropertySignature")return;let i=e.typeAnnotation?.typeAnnotation;if(!w(i)||i.typeName?.name!=="ActorMethod"||g(i.typeParameters))return;let[a,p]=i.typeParameters.params,d=h(a)?a.elementTypes.map(S):[S(a)];return{name:o,paramsType:d,returnType:S(p)}};var q=`// This file was automatically generated by the Juno CLI.
|
|
4
4
|
// Any modifications may be overwritten.
|
|
5
5
|
%IMPORT%
|
|
6
6
|
import {idlFactory} from './satellite.factory.did.js';
|
|
7
7
|
import {getSatelliteExtendedActor} from '@junobuild/%CORE_LIB%';
|
|
8
8
|
|
|
9
9
|
%METHODS%
|
|
10
|
-
`,
|
|
10
|
+
`,Z=`export const %METHOD_NAME% = async (%PARAMS%): Promise<%METHOD_RESULT%> => {
|
|
11
11
|
const {%DID_METHOD_NAME%} = await getSatelliteExtendedActor<SatelliteActor>({
|
|
12
12
|
idlFactory
|
|
13
13
|
});
|
|
14
14
|
|
|
15
15
|
return await %DID_METHOD_NAME%(%CALL_PARAMS%);
|
|
16
|
-
}`,
|
|
16
|
+
}`,G=`export const %METHOD_NAME% = async (%CALL_PARAMS%) => {
|
|
17
17
|
const {%DID_METHOD_NAME%} = await getSatelliteExtendedActor({
|
|
18
18
|
idlFactory
|
|
19
19
|
});
|
|
20
20
|
|
|
21
21
|
return await %DID_METHOD_NAME%(%CALL_PARAMS%);
|
|
22
|
-
}`,
|
|
22
|
+
}`,Q=`
|
|
23
23
|
import type {_SERVICE as SatelliteActor%IMPORTS%} from './satellite.did';
|
|
24
|
-
import type { Principal } from '@icp-sdk/core/principal';`,
|
|
24
|
+
import type { Principal } from '@icp-sdk/core/principal';`,M=({methods:e,imports:r,transformerOptions:{coreLib:t,outputLanguage:n}})=>{let o=n==="js"?G:Z,i=e.map(s=>{let a=W(s),p=o;return Object.entries(a).map(([d,c])=>{p=p.replaceAll(`%${d}%`,c)}),p}).join(`
|
|
25
25
|
|
|
26
|
-
`);return
|
|
26
|
+
`);return q.replace("%CORE_LIB%",t??"core").replace("%METHODS%",i).replace("%IMPORT%",n==="js"?"":Q.replace("%IMPORTS%",r.length===0?"":`, ${r.join(", ")}`)).trim()},W=({name:e,returnType:r,paramsType:t})=>{let o=(p=>p.replace(/_./g,d=>d[1].toUpperCase()))(e),i=t.map((p,d)=>({param:`value${d}`,type:p})),s=`${i.map(({param:p})=>p).join(", ")}`,a=i.map(({param:p,type:d})=>`${p}: ${d}`).join(", ");return{METHOD_NAME:o,DID_METHOD_NAME:e,METHOD_RESULT:r,PARAMS:a,CALL_PARAMS:s}};var ce=async({inputFile:e,outputFile:r,transformerOptions:t})=>{let n=await E({inputFile:e}),o=M({...n,transformerOptions:t});await X(r,o,"utf-8")};import{ZodSchemaId as Y}from"@dfinity/zod-schemas";import{ZodNullable as ee}from"zod";var b=({inputs:e})=>Object.entries(e).map(([r,t])=>{let n=t.toJSONSchema({unrepresentable:"any",override:s=>{s.zodSchema._zod.def.type==="bigint"&&(s.jsonSchema.type="integer",s.jsonSchema.format="bigint"),s.jsonSchema.id===Y.Principal&&(s.jsonSchema.format="principal")}}),o=u(n),i=t._zod.def.type==="optional"&&!("innerType"in t._zod.def&&t._zod.def.innerType instanceof ee);return{id:r,schema:o,isTopLevelOptional:i}}),u=e=>{if(e.format==="principal")return{kind:"principal"};switch(e.type){case"string":if(e.const!==void 0)return{kind:"variant",tags:[String(e.const)]};if(e.enum!==void 0){if(e.enum.some(r=>typeof r!="string"))throw new Error("Non-string enum values are not supported");return{kind:"variant",tags:e.enum}}return{kind:"text"};case"boolean":return{kind:"bool"};case"number":return{kind:"float64"};case"integer":return e.format==="bigint"?{kind:"nat"}:{kind:"int32"};case"null":throw new Error("null type is not supported");case"array":{if(e.prefixItems!==void 0){if(e.prefixItems.some(r=>typeof r=="boolean"))throw new Error("Boolean schema not supported.");return{kind:"indexedTuple",members:e.prefixItems.map(r=>u(r))}}if(e.items===void 0)throw new Error("Array schema must have items defined");if(Array.isArray(e.items))throw new Error("Tuple-style array items not supported");if(typeof e.items=="boolean")throw new Error("Boolean schema not supported for array items");return{kind:"vec",inner:u(e.items)}}case"object":{if(e.properties===void 0&&e.additionalProperties!==void 0){if(typeof e.additionalProperties=="boolean")throw new Error("Boolean additionalProperties not supported");return{kind:"vec",inner:{kind:"tuple",members:[{kind:"text"},u(e.additionalProperties)]}}}if(e.properties===void 0)return{kind:"record",fields:[]};if(Object.keys(e.properties).length===0)return{kind:"record",fields:[]};let r=new Set(e.required??[]),t=Object.entries(e.properties);if(t.some(([n,o])=>typeof o=="boolean"))throw new Error("Boolean schema not supported.");return{kind:"record",fields:t.map(([n,o])=>{let i=u(o);return{name:n,type:r.has(n)?i:{kind:"opt",inner:i}}})}}}if(e.oneOf!==void 0){let r=e.oneOf.filter(({type:t})=>t!=="null");return r.length===1?{kind:"opt",inner:u(r[0])}:{kind:"variantRecords",members:r.map(u)}}if(e.anyOf!==void 0){let r=e.anyOf.filter(o=>typeof o!="boolean");if(r.filter(o=>Object.keys(o).length===0).length>0)throw new Error("Unrepresentable type in union");if(r.every(o=>o.const!==void 0))return{kind:"variant",tags:r.map(o=>String(o.const))};let n=r.filter(o=>o.type!=="null");return n.length===1?{kind:"opt",inner:u(n[0])}:{kind:"variantRecords",members:n.map(u)}}if(e.allOf!==void 0){if(e.allOf.some(t=>typeof t=="boolean"))throw new Error("Boolean schema not supported in allOf");if(e.allOf.some(t=>typeof t!="boolean"&&(t.type!=="object"||t.properties===void 0)))throw new Error("allOf only supported for object types");return{kind:"record",fields:e.allOf.flatMap(t=>{let n=new Set(t.required??[]);return Object.entries(t.properties??{}).map(([o,i])=>{let s=u(i);return{name:o,type:n.has(o)?s:{kind:"opt",inner:s}}})})}}throw Object.keys(e).length===0?new Error("Unsupported type: unrepresentable schema (z.symbol, z.undefined, z.void, z.map, z.set, z.nan, z.custom are not supported)"):new Error(`Unsupported JSON Schema: ${JSON.stringify(e)}`)};var l=e=>{switch(e.kind){case"text":return"text";case"bool":return"bool";case"float64":return"float64";case"int32":return"int32";case"nat":return"nat";case"opt":return`opt ${l(e.inner)}`;case"vec":return`vec ${l(e.inner)}`;case"record":return e.fields.length===0?"record {}":`record { ${e.fields.map(r=>`${r.name} : ${l(r.type)}`).join("; ")} }`;case"tuple":return`record { ${e.members.map(l).join("; ")} }`;case"indexedTuple":return`record { ${e.members.map((r,t)=>`${t} : ${l(r)}`).join("; ")} }`;case"variant":return`variant { ${e.tags.join("; ")} }`;case"variantRecords":return`variant { ${e.members.map(l).join("; ")} }`;case"principal":return"principal"}},Te=e=>b({inputs:e}).map(({schema:r,id:t,isTopLevelOptional:n})=>`type ${t} = ${n?`opt ${l(r)}`:l(r)};`).join(`
|
|
27
|
+
`);var f=e=>e.charAt(0).toUpperCase()+e.slice(1),k="#[derive(CandidType, Serialize, Deserialize, Clone, JsonData)]",m=e=>({kind:"primitive",...e}),T=e=>({kind:"composite",...e}),O=e=>e.flatMap(r=>r.kind==="composite"?r.structs:[]),y=({schema:e,structName:r})=>{switch(e.kind){case"text":return m({fieldType:"String"});case"bool":return m({fieldType:"bool"});case"float64":return m({fieldType:"f64"});case"int32":return m({fieldType:"i32"});case"nat":return m({fieldType:"u64"});case"principal":return m({fieldType:"candid::Principal"});case"opt":{let t=y({schema:e.inner,structName:r}),n=`Option<${t.fieldType}>`;return t.kind==="composite"?T({fieldType:n,structs:t.structs}):m({fieldType:n})}case"vec":{let t=y({schema:e.inner,structName:r}),n=`Vec<${t.fieldType}>`;return t.kind==="composite"?T({fieldType:n,structs:t.structs}):m({fieldType:n})}case"tuple":case"indexedTuple":{let t=e.members.map((i,s)=>y({schema:i,structName:`${r}${s}`})),n=`(${t.map(i=>i.fieldType).join(", ")})`,o=O(t);return o.length>0?T({fieldType:n,structs:o}):m({fieldType:n})}case"variant":{let t=f(r),n=e.tags.map(o=>` ${f(o)},`).join(`
|
|
28
|
+
`);return T({fieldType:t,structs:[`${k}
|
|
29
|
+
pub enum ${t} {
|
|
30
|
+
${n}
|
|
31
|
+
}`]})}case"variantRecords":{let t=f(r),n=e.members.map((i,s)=>{if(i.kind==="record"){let p=i.fields.map(c=>y({schema:c.type,structName:`${r}${f(c.name)}`})),d=i.fields.map((c,v)=>` ${c.name}: ${p[v].fieldType},`).join(`
|
|
32
|
+
`);return{variantLine:` Variant${s} {
|
|
33
|
+
${d}
|
|
34
|
+
}`,structs:O(p)}}let a=y({schema:i,structName:`${r}Variant${s}`});return{variantLine:` Variant${s}(${a.fieldType})`,structs:a.kind==="composite"?a.structs:[]}}),o=n.map(i=>i.variantLine).join(`,
|
|
35
|
+
`);return T({fieldType:t,structs:[...n.flatMap(i=>i.structs),`${k}
|
|
36
|
+
pub enum ${t} {
|
|
37
|
+
${o}
|
|
38
|
+
}`]})}case"record":{let t=f(r),n=e.fields.map(i=>y({schema:i.type,structName:`${r}${f(i.name)}`})),o=e.fields.map((i,s)=>` pub ${i.name}: ${n[s].fieldType},`).join(`
|
|
39
|
+
`);return T({fieldType:t,structs:[...O(n),`${k}
|
|
40
|
+
pub struct ${t} {
|
|
41
|
+
${o}
|
|
42
|
+
}`]})}}},te=({id:e,schema:r,isTopLevelOptional:t})=>{let n=`${f(e)}Args`,i=y({schema:t?{kind:"opt",inner:r}:r,structName:n});return i.kind==="composite"?i.structs.join(`
|
|
43
|
+
|
|
44
|
+
`):`pub type ${n} = ${i.fieldType};`},ke=e=>b({inputs:e}).map(te).join(`
|
|
45
|
+
|
|
46
|
+
`);export{ce as generateApi,Te as zodToCandid,ke as zodToRust};
|
|
27
47
|
//# sourceMappingURL=index.mjs.map
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/index.ts", "../../src/services/inspector.services.ts", "../../src/services/parser.services.ts"],
|
|
4
|
-
"sourcesContent": ["import {writeFile} from 'node:fs/promises';\nimport {collectApi} from './services/inspector.services';\nimport {parseApi} from './services/parser.services';\nimport type {TransformerOptions} from './types/transformer-options';\n\nexport type * from './types/transformer-options';\n\nexport const generateApi = async ({\n inputFile,\n outputFile,\n transformerOptions\n}: {\n inputFile: string;\n outputFile: string;\n transformerOptions: TransformerOptions;\n}) => {\n const definition = await collectApi({\n inputFile\n });\n\n const api = parseApi({\n ...definition,\n transformerOptions\n });\n\n await writeFile(outputFile, api, 'utf-8');\n};\n", "import type {ParserOptions} from '@babel/parser';\nimport * as babelParser from '@babel/parser';\nimport {\n isTSAnyKeyword,\n isTSArrayType,\n isTSBigIntKeyword,\n isTSBooleanKeyword,\n isTSNeverKeyword,\n isTSNullKeyword,\n isTSNumberKeyword,\n isTSObjectKeyword,\n isTSStringKeyword,\n isTSSymbolKeyword,\n isTSTupleType,\n isTSTypeReference,\n isTSUndefinedKeyword,\n isTSUnknownKeyword,\n isTSVoidKeyword,\n type Identifier,\n type TSMethodSignature,\n type TSNamedTupleMember,\n type TSPropertySignature,\n type TSType\n} from '@babel/types';\nimport {isNullish, nonNullish} from '@dfinity/utils';\nimport {readFile} from 'node:fs/promises';\nimport type {MethodSignature} from '../types/method-signature';\n\nconst {parse} = babelParser;\n\nconst BABEL_PARSER_OPTIONS: ParserOptions = {\n sourceType: 'module',\n plugins: ['typescript']\n};\n\nexport const collectApi = async ({\n inputFile\n}: {\n inputFile: string;\n}): Promise<{methods: MethodSignature[]; imports: string[]}> => {\n const fileContent = await readFile(inputFile, 'utf-8');\n\n const ast = parse(fileContent, BABEL_PARSER_OPTIONS);\n\n const result: MethodSignature[] = [];\n const interfaces: string[] = [];\n const types: string[] = [];\n\n // I tried hard to use an import but, no success. When build and pack and imported in the CLI ultimately it does not work when used.\n // Example of error: TypeError: (0 , aSe.default) is not a function\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const {default: traverse} = require('@babel/traverse');\n\n traverse(ast, {\n TSInterfaceDeclaration(path) {\n if (path.node.id.name === '_SERVICE') {\n const members = path.node.body.body;\n\n for (const member of members) {\n if (member.type === 'TSMethodSignature' || member.type === 'TSPropertySignature') {\n const methodSignature = membersToMethodSignatures(member);\n\n if (nonNullish(methodSignature)) {\n result.push(methodSignature);\n }\n }\n }\n } else {\n interfaces.push(path.node.id.name);\n }\n },\n\n TSTypeAliasDeclaration(path) {\n types.push(path.node.id.name);\n }\n });\n\n return {\n methods: result,\n imports: [...interfaces, ...types]\n };\n};\n\nconst getTypeName = (\n typeAnnotation: TSType | TSNamedTupleMember | undefined\n): string | 'unknown' => {\n if (isNullish(typeAnnotation)) {\n return 'unknown';\n }\n\n if (isTSTypeReference(typeAnnotation)) {\n const typeName = (typeAnnotation.typeName as Identifier)?.name;\n return typeName ?? 'unknown';\n }\n\n if (isTSStringKeyword(typeAnnotation)) {\n return 'string';\n }\n\n if (isTSNumberKeyword(typeAnnotation)) {\n return 'number';\n }\n\n if (isTSBooleanKeyword(typeAnnotation)) {\n return 'boolean';\n }\n\n if (isTSBigIntKeyword(typeAnnotation)) {\n return 'bigint';\n }\n\n if (isTSSymbolKeyword(typeAnnotation)) {\n return 'symbol';\n }\n\n if (isTSNullKeyword(typeAnnotation)) {\n return 'null';\n }\n\n if (isTSUndefinedKeyword(typeAnnotation)) {\n return 'undefined';\n }\n\n if (isTSVoidKeyword(typeAnnotation)) {\n return 'void';\n }\n\n if (isTSNeverKeyword(typeAnnotation)) {\n return 'never';\n }\n\n if (isTSUnknownKeyword(typeAnnotation)) {\n return 'unknown';\n }\n\n if (isTSAnyKeyword(typeAnnotation)) {\n return 'any';\n }\n\n if (isTSObjectKeyword(typeAnnotation)) {\n return 'object';\n }\n\n if (isTSTupleType(typeAnnotation)) {\n const tupleTypes = typeAnnotation.elementTypes.map(getTypeName);\n return `[${tupleTypes.join(', ')}]`;\n }\n\n if (isTSArrayType(typeAnnotation)) {\n return `${getTypeName(typeAnnotation.elementType)}[]`;\n }\n\n return 'unknown';\n};\n\nconst membersToMethodSignatures = (\n member: TSMethodSignature | TSPropertySignature\n): MethodSignature | undefined => {\n const {type, key} = member;\n\n const findName = (): string | undefined => {\n if (key.type === 'Identifier') {\n return key.name;\n }\n\n // didc generate function name with quotes, congrats.\n if (key.type === 'StringLiteral') {\n return key.value;\n }\n\n return undefined;\n };\n\n const name = findName();\n\n if (isNullish(name)) {\n return undefined;\n }\n\n if (type !== 'TSPropertySignature') {\n return undefined;\n }\n\n const typeAnnotation = member.typeAnnotation?.typeAnnotation;\n\n if (!isTSTypeReference(typeAnnotation)) {\n return undefined;\n }\n\n const typeName = (typeAnnotation.typeName as Identifier)?.name;\n\n if (typeName !== 'ActorMethod' || isNullish(typeAnnotation.typeParameters)) {\n return undefined;\n }\n\n const [paramType, returnType] = typeAnnotation.typeParameters.params;\n\n const paramsType = isTSTupleType(paramType)\n ? paramType.elementTypes.map(getTypeName)\n : [getTypeName(paramType)];\n\n return {\n name,\n paramsType,\n returnType: getTypeName(returnType)\n };\n};\n", "import type {MethodSignature} from '../types/method-signature';\nimport type {TransformerOptions} from '../types/transformer-options';\n\nconst template = `// This file was automatically generated by the Juno CLI.\n// Any modifications may be overwritten.\n%IMPORT%\nimport {idlFactory} from './satellite.factory.did.js';\nimport {getSatelliteExtendedActor} from '@junobuild/%CORE_LIB%';\n\n%METHODS%\n`;\n\nconst methodTemplateTypeScript = `export const %METHOD_NAME% = async (%PARAMS%): Promise<%METHOD_RESULT%> => {\n\\tconst {%DID_METHOD_NAME%} = await getSatelliteExtendedActor<SatelliteActor>({\n\\t\\tidlFactory\n\\t});\n\n\\treturn await %DID_METHOD_NAME%(%CALL_PARAMS%);\n}`;\n\nconst methodTemplateJavaScript = `export const %METHOD_NAME% = async (%CALL_PARAMS%) => {\n\\tconst {%DID_METHOD_NAME%} = await getSatelliteExtendedActor({\n\\t\\tidlFactory\n\\t});\n\n\\treturn await %DID_METHOD_NAME%(%CALL_PARAMS%);\n}`;\n\nconst importTemplateTypeScript = `\nimport type {_SERVICE as SatelliteActor%IMPORTS%} from './satellite.did';\nimport type { Principal } from '@icp-sdk/core/principal';`;\n\nexport const parseApi = ({\n methods: signatures,\n imports,\n transformerOptions: {coreLib, outputLanguage}\n}: {\n methods: MethodSignature[];\n imports: string[];\n transformerOptions: TransformerOptions;\n}): string => {\n const langTemplate =\n outputLanguage === 'js' ? methodTemplateJavaScript : methodTemplateTypeScript;\n\n const methods = signatures\n .map((signature) => {\n const replacers = mapSignature(signature);\n\n let result = langTemplate;\n Object.entries(replacers).map(([key, value]) => {\n result = result.replaceAll(`%${key}%`, value);\n });\n\n return result;\n })\n .join('\\n\\n');\n\n return template\n .replace('%CORE_LIB%', coreLib ?? 'core')\n .replace('%METHODS%', methods)\n .replace(\n '%IMPORT%',\n outputLanguage === 'js'\n ? ''\n : importTemplateTypeScript.replace(\n '%IMPORTS%',\n imports.length === 0 ? '' : `, ${imports.join(', ')}`\n )\n )\n .trim();\n};\n\nconst mapSignature = ({\n name,\n returnType,\n paramsType\n}: MethodSignature): {\n METHOD_NAME: string;\n DID_METHOD_NAME: string;\n METHOD_RESULT: string;\n PARAMS: string;\n CALL_PARAMS: string;\n} => {\n const camelize = (s: string): string => s.replace(/_./g, (x) => x[1].toUpperCase());\n\n const methodName = camelize(name);\n\n const params = paramsType.map((paramType, i) => ({\n param: `value${i}`,\n type: paramType\n }));\n\n const paramKeysText = `${params.map(({param}) => param).join(', ')}`;\n\n const paramsText = params.map(({param, type}) => `${param}: ${type}`).join(', ');\n\n return {\n METHOD_NAME: methodName,\n DID_METHOD_NAME: name,\n METHOD_RESULT: returnType,\n PARAMS: paramsText,\n CALL_PARAMS: paramKeysText\n };\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["writeFile", "babelParser", "isTSAnyKeyword", "isTSArrayType", "isTSBigIntKeyword", "isTSBooleanKeyword", "isTSNeverKeyword", "isTSNullKeyword", "isTSNumberKeyword", "isTSObjectKeyword", "isTSStringKeyword", "isTSSymbolKeyword", "isTSTupleType", "isTSTypeReference", "isTSUndefinedKeyword", "isTSUnknownKeyword", "isTSVoidKeyword", "isNullish", "nonNullish", "readFile", "parse", "BABEL_PARSER_OPTIONS", "collectApi", "inputFile", "fileContent", "ast", "result", "interfaces", "types", "traverse", "path", "members", "member", "methodSignature", "membersToMethodSignatures", "getTypeName", "typeAnnotation", "type", "key", "name", "paramType", "returnType", "paramsType", "template", "methodTemplateTypeScript", "methodTemplateJavaScript", "importTemplateTypeScript", "parseApi", "signatures", "imports", "coreLib", "outputLanguage", "langTemplate", "methods", "signature", "replacers", "mapSignature", "result", "key", "value", "name", "returnType", "paramsType", "methodName", "s", "x", "params", "paramType", "i", "paramKeysText", "param", "paramsText", "type", "generateApi", "inputFile", "outputFile", "transformerOptions", "definition", "collectApi", "api", "parseApi", "writeFile"]
|
|
3
|
+
"sources": ["../../src/api/index.ts", "../../src/api/services/inspector.services.ts", "../../src/api/services/parser.services.ts", "../../src/zod/_converters.ts", "../../src/zod/zod-to-candid.ts", "../../src/zod/zod-to-rust.ts"],
|
|
4
|
+
"sourcesContent": ["import {writeFile} from 'node:fs/promises';\nimport {collectApi} from './services/inspector.services';\nimport {parseApi} from './services/parser.services';\nimport type {TransformerOptions} from './types/transformer-options';\n\nexport type * from './types/transformer-options';\n\nexport const generateApi = async ({\n inputFile,\n outputFile,\n transformerOptions\n}: {\n inputFile: string;\n outputFile: string;\n transformerOptions: TransformerOptions;\n}) => {\n const definition = await collectApi({\n inputFile\n });\n\n const api = parseApi({\n ...definition,\n transformerOptions\n });\n\n await writeFile(outputFile, api, 'utf-8');\n};\n", "import type {ParserOptions} from '@babel/parser';\nimport * as babelParser from '@babel/parser';\nimport {\n isTSAnyKeyword,\n isTSArrayType,\n isTSBigIntKeyword,\n isTSBooleanKeyword,\n isTSNeverKeyword,\n isTSNullKeyword,\n isTSNumberKeyword,\n isTSObjectKeyword,\n isTSStringKeyword,\n isTSSymbolKeyword,\n isTSTupleType,\n isTSTypeReference,\n isTSUndefinedKeyword,\n isTSUnknownKeyword,\n isTSVoidKeyword,\n type Identifier,\n type TSMethodSignature,\n type TSNamedTupleMember,\n type TSPropertySignature,\n type TSType\n} from '@babel/types';\nimport {isNullish, nonNullish} from '@dfinity/utils';\nimport {readFile} from 'node:fs/promises';\nimport type {MethodSignature} from '../types/method-signature';\n\nconst {parse} = babelParser;\n\nconst BABEL_PARSER_OPTIONS: ParserOptions = {\n sourceType: 'module',\n plugins: ['typescript']\n};\n\nexport const collectApi = async ({\n inputFile\n}: {\n inputFile: string;\n}): Promise<{methods: MethodSignature[]; imports: string[]}> => {\n const fileContent = await readFile(inputFile, 'utf-8');\n\n const ast = parse(fileContent, BABEL_PARSER_OPTIONS);\n\n const result: MethodSignature[] = [];\n const interfaces: string[] = [];\n const types: string[] = [];\n\n // I tried hard to use an import but, no success. When build and pack and imported in the CLI ultimately it does not work when used.\n // Example of error: TypeError: (0 , aSe.default) is not a function\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const {default: traverse} = require('@babel/traverse');\n\n traverse(ast, {\n TSInterfaceDeclaration(path) {\n if (path.node.id.name === '_SERVICE') {\n const members = path.node.body.body;\n\n for (const member of members) {\n if (member.type === 'TSMethodSignature' || member.type === 'TSPropertySignature') {\n const methodSignature = membersToMethodSignatures(member);\n\n if (nonNullish(methodSignature)) {\n result.push(methodSignature);\n }\n }\n }\n } else {\n interfaces.push(path.node.id.name);\n }\n },\n\n TSTypeAliasDeclaration(path) {\n types.push(path.node.id.name);\n }\n });\n\n return {\n methods: result,\n imports: [...interfaces, ...types]\n };\n};\n\nconst getTypeName = (\n typeAnnotation: TSType | TSNamedTupleMember | undefined\n): string | 'unknown' => {\n if (isNullish(typeAnnotation)) {\n return 'unknown';\n }\n\n if (isTSTypeReference(typeAnnotation)) {\n const typeName = (typeAnnotation.typeName as Identifier)?.name;\n\n if (isNullish(typeName)) {\n return 'unknown';\n }\n\n if (nonNullish(typeAnnotation.typeParameters?.params?.length)) {\n const typeParams = typeAnnotation.typeParameters.params.map(getTypeName);\n return `${typeName}<${typeParams.join(', ')}>`;\n }\n\n return typeName ?? 'unknown';\n }\n\n if (isTSStringKeyword(typeAnnotation)) {\n return 'string';\n }\n\n if (isTSNumberKeyword(typeAnnotation)) {\n return 'number';\n }\n\n if (isTSBooleanKeyword(typeAnnotation)) {\n return 'boolean';\n }\n\n if (isTSBigIntKeyword(typeAnnotation)) {\n return 'bigint';\n }\n\n if (isTSSymbolKeyword(typeAnnotation)) {\n return 'symbol';\n }\n\n if (isTSNullKeyword(typeAnnotation)) {\n return 'null';\n }\n\n if (isTSUndefinedKeyword(typeAnnotation)) {\n return 'undefined';\n }\n\n if (isTSVoidKeyword(typeAnnotation)) {\n return 'void';\n }\n\n if (isTSNeverKeyword(typeAnnotation)) {\n return 'never';\n }\n\n if (isTSUnknownKeyword(typeAnnotation)) {\n return 'unknown';\n }\n\n if (isTSAnyKeyword(typeAnnotation)) {\n return 'any';\n }\n\n if (isTSObjectKeyword(typeAnnotation)) {\n return 'object';\n }\n\n if (isTSTupleType(typeAnnotation)) {\n const tupleTypes = typeAnnotation.elementTypes.map(getTypeName);\n return `[${tupleTypes.join(', ')}]`;\n }\n\n if (isTSArrayType(typeAnnotation)) {\n return `${getTypeName(typeAnnotation.elementType)}[]`;\n }\n\n return 'unknown';\n};\n\nconst membersToMethodSignatures = (\n member: TSMethodSignature | TSPropertySignature\n): MethodSignature | undefined => {\n const {type, key} = member;\n\n const findName = (): string | undefined => {\n if (key.type === 'Identifier') {\n return key.name;\n }\n\n // didc generate function name with quotes, congrats.\n if (key.type === 'StringLiteral') {\n return key.value;\n }\n\n return undefined;\n };\n\n const name = findName();\n\n if (isNullish(name)) {\n return undefined;\n }\n\n if (type !== 'TSPropertySignature') {\n return undefined;\n }\n\n const typeAnnotation = member.typeAnnotation?.typeAnnotation;\n\n if (!isTSTypeReference(typeAnnotation)) {\n return undefined;\n }\n\n const typeName = (typeAnnotation.typeName as Identifier)?.name;\n\n if (typeName !== 'ActorMethod' || isNullish(typeAnnotation.typeParameters)) {\n return undefined;\n }\n\n const [paramType, returnType] = typeAnnotation.typeParameters.params;\n\n const paramsType = isTSTupleType(paramType)\n ? paramType.elementTypes.map(getTypeName)\n : [getTypeName(paramType)];\n\n return {\n name,\n paramsType,\n returnType: getTypeName(returnType)\n };\n};\n", "import type {MethodSignature} from '../types/method-signature';\nimport type {TransformerOptions} from '../types/transformer-options';\n\nconst template = `// This file was automatically generated by the Juno CLI.\n// Any modifications may be overwritten.\n%IMPORT%\nimport {idlFactory} from './satellite.factory.did.js';\nimport {getSatelliteExtendedActor} from '@junobuild/%CORE_LIB%';\n\n%METHODS%\n`;\n\nconst methodTemplateTypeScript = `export const %METHOD_NAME% = async (%PARAMS%): Promise<%METHOD_RESULT%> => {\n\\tconst {%DID_METHOD_NAME%} = await getSatelliteExtendedActor<SatelliteActor>({\n\\t\\tidlFactory\n\\t});\n\n\\treturn await %DID_METHOD_NAME%(%CALL_PARAMS%);\n}`;\n\nconst methodTemplateJavaScript = `export const %METHOD_NAME% = async (%CALL_PARAMS%) => {\n\\tconst {%DID_METHOD_NAME%} = await getSatelliteExtendedActor({\n\\t\\tidlFactory\n\\t});\n\n\\treturn await %DID_METHOD_NAME%(%CALL_PARAMS%);\n}`;\n\nconst importTemplateTypeScript = `\nimport type {_SERVICE as SatelliteActor%IMPORTS%} from './satellite.did';\nimport type { Principal } from '@icp-sdk/core/principal';`;\n\nexport const parseApi = ({\n methods: signatures,\n imports,\n transformerOptions: {coreLib, outputLanguage}\n}: {\n methods: MethodSignature[];\n imports: string[];\n transformerOptions: TransformerOptions;\n}): string => {\n const langTemplate =\n outputLanguage === 'js' ? methodTemplateJavaScript : methodTemplateTypeScript;\n\n const methods = signatures\n .map((signature) => {\n const replacers = mapSignature(signature);\n\n let result = langTemplate;\n Object.entries(replacers).map(([key, value]) => {\n result = result.replaceAll(`%${key}%`, value);\n });\n\n return result;\n })\n .join('\\n\\n');\n\n return template\n .replace('%CORE_LIB%', coreLib ?? 'core')\n .replace('%METHODS%', methods)\n .replace(\n '%IMPORT%',\n outputLanguage === 'js'\n ? ''\n : importTemplateTypeScript.replace(\n '%IMPORTS%',\n imports.length === 0 ? '' : `, ${imports.join(', ')}`\n )\n )\n .trim();\n};\n\nconst mapSignature = ({\n name,\n returnType,\n paramsType\n}: MethodSignature): {\n METHOD_NAME: string;\n DID_METHOD_NAME: string;\n METHOD_RESULT: string;\n PARAMS: string;\n CALL_PARAMS: string;\n} => {\n const camelize = (s: string): string => s.replace(/_./g, (x) => x[1].toUpperCase());\n\n const methodName = camelize(name);\n\n const params = paramsType.map((paramType, i) => ({\n param: `value${i}`,\n type: paramType\n }));\n\n const paramKeysText = `${params.map(({param}) => param).join(', ')}`;\n\n const paramsText = params.map(({param, type}) => `${param}: ${type}`).join(', ');\n\n return {\n METHOD_NAME: methodName,\n DID_METHOD_NAME: name,\n METHOD_RESULT: returnType,\n PARAMS: paramsText,\n CALL_PARAMS: paramKeysText\n };\n};\n", "import {ZodSchemaId} from '@dfinity/zod-schemas';\nimport {type z, ZodNullable} from 'zod';\nimport type {JSONSchema, JSONSchemaOutput, SputnikSchema} from './_types';\n\nexport interface ConvertedSputnikSchema {\n id: string;\n schema: SputnikSchema;\n isTopLevelOptional: boolean;\n}\n\nexport type SputnikSchemaResult = ConvertedSputnikSchema[];\n\nexport interface SputnikSchemaArgs {\n inputs: Record<string, z.ZodType>;\n}\n\nexport const jsonToSputnikSchema = ({inputs}: SputnikSchemaArgs): SputnikSchemaResult =>\n Object.entries(inputs).map(([id, zodSchema]) => {\n const json = zodSchema.toJSONSchema({\n unrepresentable: 'any',\n override: (ctx) => {\n if (ctx.zodSchema._zod.def.type === 'bigint') {\n ctx.jsonSchema.type = 'integer';\n // https://json-schema.org/understanding-json-schema/reference/type#format\n ctx.jsonSchema.format = 'bigint';\n }\n\n if (ctx.jsonSchema.id === ZodSchemaId.Principal) {\n ctx.jsonSchema.format = 'principal';\n }\n }\n });\n\n const sputnikSchema = jsonToSchema(json);\n\n // Zod strips optional from JSON Schema output, so we need to re-add the opt wrapper.\n // However, nullish (optional + nullable) is already handled by the anyOf handler, so we skip it.\n // e.g. z.string().nullish())\n const isTopLevelOptional =\n zodSchema._zod.def.type === 'optional' &&\n !('innerType' in zodSchema._zod.def && zodSchema._zod.def.innerType instanceof ZodNullable);\n\n return {\n id,\n schema: sputnikSchema,\n isTopLevelOptional\n };\n });\n\nconst jsonToSchema = (schema: JSONSchemaOutput | JSONSchema): SputnikSchema => {\n if (schema.format === 'principal') {\n return {kind: 'principal'};\n }\n\n switch (schema.type) {\n case 'string':\n if (schema.const !== undefined) {\n return {kind: 'variant', tags: [String(schema.const)]};\n }\n\n if (schema.enum !== undefined) {\n if (schema.enum.some((v) => typeof v !== 'string')) {\n throw new Error('Non-string enum values are not supported');\n }\n\n return {kind: 'variant', tags: schema.enum as string[]};\n }\n\n return {kind: 'text'};\n\n case 'boolean':\n return {kind: 'bool'};\n\n case 'number':\n return {kind: 'float64'};\n\n case 'integer':\n return schema.format === 'bigint' ? {kind: 'nat'} : {kind: 'int32'};\n\n case 'null':\n throw new Error('null type is not supported');\n\n case 'array': {\n if (schema.prefixItems !== undefined) {\n if (schema.prefixItems.some((item) => typeof item === 'boolean')) {\n throw new Error(`Boolean schema not supported.`);\n }\n\n return {\n kind: 'indexedTuple',\n members: schema.prefixItems.map((item) => jsonToSchema(item as JSONSchema))\n };\n }\n\n if (schema.items === undefined) {\n throw new Error('Array schema must have items defined');\n }\n\n if (Array.isArray(schema.items)) {\n throw new Error('Tuple-style array items not supported');\n }\n\n if (typeof schema.items === 'boolean') {\n throw new Error('Boolean schema not supported for array items');\n }\n\n return {kind: 'vec', inner: jsonToSchema(schema.items)};\n }\n\n case 'object': {\n // z.record() \u2014 no properties, has additionalProperties\n if (schema.properties === undefined && schema.additionalProperties !== undefined) {\n if (typeof schema.additionalProperties === 'boolean') {\n throw new Error('Boolean additionalProperties not supported');\n }\n\n return {\n kind: 'vec',\n inner: {\n kind: 'tuple',\n members: [{kind: 'text'}, jsonToSchema(schema.additionalProperties)]\n }\n };\n }\n\n if (schema.properties === undefined) {\n return {kind: 'record', fields: []};\n }\n\n if (Object.keys(schema.properties).length === 0) {\n return {kind: 'record', fields: []};\n }\n\n const required = new Set(schema.required ?? []);\n const entries = Object.entries(schema.properties);\n\n if (entries.some(([_, v]) => typeof v === 'boolean')) {\n throw new Error(`Boolean schema not supported.`);\n }\n\n return {\n kind: 'record',\n fields: entries.map(([k, v]) => {\n const type = jsonToSchema(v as JSONSchema);\n return {name: k, type: required.has(k) ? type : {kind: 'opt', inner: type}};\n })\n };\n }\n }\n\n if (schema.oneOf !== undefined) {\n const variants = schema.oneOf.filter(({type}) => type !== 'null');\n\n if (variants.length === 1) {\n return {kind: 'opt', inner: jsonToSchema(variants[0])};\n }\n\n return {kind: 'variantRecords', members: variants.map(jsonToSchema)};\n }\n\n if (schema.anyOf !== undefined) {\n const nonBoolean = schema.anyOf.filter((s) => typeof s !== 'boolean');\n\n const empty = nonBoolean.filter((s) => Object.keys(s).length === 0);\n if (empty.length > 0) {\n throw new Error('Unrepresentable type in union');\n }\n\n if (nonBoolean.every((s) => s.const !== undefined)) {\n return {kind: 'variant', tags: nonBoolean.map((s) => String(s.const))};\n }\n\n const nonNull = nonBoolean.filter((s) => s.type !== 'null');\n\n if (nonNull.length === 1) {\n return {kind: 'opt', inner: jsonToSchema(nonNull[0])};\n }\n\n return {kind: 'variantRecords', members: nonNull.map(jsonToSchema)};\n }\n\n if (schema.allOf !== undefined) {\n if (schema.allOf.some((s) => typeof s === 'boolean')) {\n throw new Error('Boolean schema not supported in allOf');\n }\n\n if (\n schema.allOf.some(\n (s) => typeof s !== 'boolean' && (s.type !== 'object' || s.properties === undefined)\n )\n ) {\n throw new Error('allOf only supported for object types');\n }\n\n const fields = schema.allOf.flatMap((s) => {\n const required = new Set(s.required ?? []);\n return Object.entries(s.properties ?? {}).map(([k, v]) => {\n const type = jsonToSchema(v as JSONSchema);\n return {name: k, type: required.has(k) ? type : {kind: 'opt' as const, inner: type}};\n });\n });\n\n return {kind: 'record', fields};\n }\n\n if (Object.keys(schema).length === 0) {\n throw new Error(\n 'Unsupported type: unrepresentable schema (z.symbol, z.undefined, z.void, z.map, z.set, z.nan, z.custom are not supported)'\n );\n }\n\n throw new Error(`Unsupported JSON Schema: ${JSON.stringify(schema)}`);\n};\n", "import type {z} from 'zod';\nimport {jsonToSputnikSchema} from './_converters';\nimport type {SputnikSchema} from './_types';\n\nconst sputnikSchemaToDid = (schema: SputnikSchema): string => {\n switch (schema.kind) {\n case 'text':\n return 'text';\n case 'bool':\n return 'bool';\n case 'float64':\n return 'float64';\n case 'int32':\n return 'int32';\n case 'nat':\n return 'nat';\n case 'opt':\n return `opt ${sputnikSchemaToDid(schema.inner)}`;\n case 'vec':\n return `vec ${sputnikSchemaToDid(schema.inner)}`;\n case 'record':\n if (schema.fields.length === 0) {\n return 'record {}';\n }\n return `record { ${schema.fields.map((f) => `${f.name} : ${sputnikSchemaToDid(f.type)}`).join('; ')} }`;\n case 'tuple':\n return `record { ${schema.members.map(sputnikSchemaToDid).join('; ')} }`;\n case 'indexedTuple':\n return `record { ${schema.members.map((m, i) => `${i} : ${sputnikSchemaToDid(m)}`).join('; ')} }`;\n case 'variant':\n return `variant { ${schema.tags.join('; ')} }`;\n case 'variantRecords':\n return `variant { ${schema.members.map(sputnikSchemaToDid).join('; ')} }`;\n case 'principal':\n return 'principal';\n }\n};\n\nexport const zodToCandid = (inputs: Record<string, z.ZodType>): string =>\n jsonToSputnikSchema({inputs})\n .map(\n ({schema, id, isTopLevelOptional}) =>\n `type ${id} = ${isTopLevelOptional ? `opt ${sputnikSchemaToDid(schema)}` : sputnikSchemaToDid(schema)};`\n )\n .join('\\n');\n", "import type {z} from 'zod';\nimport {type ConvertedSputnikSchema, jsonToSputnikSchema} from './_converters';\nimport type {SputnikSchema} from './_types';\n\nconst capitalize = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1);\n\nconst DERIVES = '#[derive(CandidType, Serialize, Deserialize, Clone, JsonData)]';\n\ntype RustTypeResult =\n | {kind: 'primitive'; fieldType: string}\n | {kind: 'composite'; fieldType: string; structs: string[]};\n\nconst primitive = (result: {fieldType: string}): RustTypeResult => ({\n kind: 'primitive',\n ...result\n});\n\nconst composite = (result: {fieldType: string; structs: string[]}): RustTypeResult => ({\n kind: 'composite',\n ...result\n});\n\nconst collectStructs = (results: RustTypeResult[]): string[] =>\n results.flatMap((r) => (r.kind === 'composite' ? r.structs : []));\n\nconst schemaToRustType = ({\n schema,\n structName\n}: {\n schema: SputnikSchema;\n structName: string;\n}): RustTypeResult => {\n switch (schema.kind) {\n case 'text':\n return primitive({fieldType: 'String'});\n\n case 'bool':\n return primitive({fieldType: 'bool'});\n\n case 'float64':\n return primitive({fieldType: 'f64'});\n\n case 'int32':\n return primitive({fieldType: 'i32'});\n\n case 'nat':\n return primitive({fieldType: 'u64'});\n\n case 'principal':\n return primitive({fieldType: 'candid::Principal'});\n\n case 'opt': {\n const inner = schemaToRustType({schema: schema.inner, structName});\n const fieldType = `Option<${inner.fieldType}>`;\n return inner.kind === 'composite'\n ? composite({fieldType, structs: inner.structs})\n : primitive({fieldType});\n }\n\n case 'vec': {\n const inner = schemaToRustType({schema: schema.inner, structName});\n const fieldType = `Vec<${inner.fieldType}>`;\n return inner.kind === 'composite'\n ? composite({fieldType, structs: inner.structs})\n : primitive({fieldType});\n }\n\n case 'tuple':\n case 'indexedTuple': {\n const results = schema.members.map((m, i) =>\n schemaToRustType({schema: m, structName: `${structName}${i}`})\n );\n const fieldType = `(${results.map((r) => r.fieldType).join(', ')})`;\n const structs = collectStructs(results);\n return structs.length > 0 ? composite({fieldType, structs}) : primitive({fieldType});\n }\n\n case 'variant': {\n const enumName = capitalize(structName);\n const variants = schema.tags.map((tag) => ` ${capitalize(tag)},`).join('\\n');\n return composite({\n fieldType: enumName,\n structs: [`${DERIVES}\\npub enum ${enumName} {\\n${variants}\\n}`]\n });\n }\n\n case 'variantRecords': {\n const enumName = capitalize(structName);\n const results = schema.members.map((m, i) => {\n if (m.kind === 'record') {\n const fieldResults = m.fields.map((f) =>\n schemaToRustType({schema: f.type, structName: `${structName}${capitalize(f.name)}`})\n );\n const fields = m.fields\n .map((f, fi) => ` ${f.name}: ${fieldResults[fi].fieldType},`)\n .join('\\n');\n return {\n variantLine: ` Variant${i} {\\n${fields}\\n }`,\n structs: collectStructs(fieldResults)\n };\n }\n const inner = schemaToRustType({schema: m, structName: `${structName}Variant${i}`});\n return {\n variantLine: ` Variant${i}(${inner.fieldType})`,\n structs: inner.kind === 'composite' ? inner.structs : []\n };\n });\n const variants = results.map((r) => r.variantLine).join(',\\n');\n return composite({\n fieldType: enumName,\n structs: [\n ...results.flatMap((r) => r.structs),\n `${DERIVES}\\npub enum ${enumName} {\\n${variants}\\n}`\n ]\n });\n }\n\n case 'record': {\n const recordName = capitalize(structName);\n const fieldResults = schema.fields.map((f) =>\n schemaToRustType({schema: f.type, structName: `${structName}${capitalize(f.name)}`})\n );\n const fields = schema.fields\n .map((f, i) => ` pub ${f.name}: ${fieldResults[i].fieldType},`)\n .join('\\n');\n return composite({\n fieldType: recordName,\n structs: [\n ...collectStructs(fieldResults),\n `${DERIVES}\\npub struct ${recordName} {\\n${fields}\\n}`\n ]\n });\n }\n }\n};\n\nconst sputnikSchemaToRust = ({id, schema, isTopLevelOptional}: ConvertedSputnikSchema): string => {\n const baseName = `${capitalize(id)}Args`;\n const resolvedSchema: SputnikSchema = isTopLevelOptional ? {kind: 'opt', inner: schema} : schema;\n const result = schemaToRustType({schema: resolvedSchema, structName: baseName});\n\n if (result.kind === 'composite') {\n return result.structs.join('\\n\\n');\n }\n\n return `pub type ${baseName} = ${result.fieldType};`;\n};\n\nexport const zodToRust = (inputs: Record<string, z.ZodType>): string =>\n jsonToSputnikSchema({inputs}).map(sputnikSchemaToRust).join('\\n\\n');\n"],
|
|
5
|
+
"mappings": ";;yPAAA,OAAQ,aAAAA,MAAgB,mBCCxB,UAAYC,MAAiB,gBAC7B,OACE,kBAAAC,EACA,iBAAAC,EACA,qBAAAC,EACA,sBAAAC,EACA,oBAAAC,EACA,mBAAAC,EACA,qBAAAC,EACA,qBAAAC,EACA,qBAAAC,EACA,qBAAAC,EACA,iBAAAC,EACA,qBAAAC,EACA,wBAAAC,EACA,sBAAAC,EACA,mBAAAC,MAMK,eACP,OAAQ,aAAAC,EAAW,cAAAC,MAAiB,iBACpC,OAAQ,YAAAC,MAAe,mBAGvB,GAAM,CAAC,MAAAC,CAAK,EAAInB,EAEVoB,EAAsC,CAC1C,WAAY,SACZ,QAAS,CAAC,YAAY,CACxB,EAEaC,EAAa,MAAO,CAC/B,UAAAC,CACF,IAEgE,CAC9D,IAAMC,EAAc,MAAML,EAASI,EAAW,OAAO,EAE/CE,EAAML,EAAMI,EAAaH,CAAoB,EAE7CK,EAA4B,CAAC,EAC7BC,EAAuB,CAAC,EACxBC,EAAkB,CAAC,EAKnB,CAAC,QAASC,CAAQ,EAAI,EAAQ,iBAAiB,EAErD,OAAAA,EAASJ,EAAK,CACZ,uBAAuBK,EAAM,CAC3B,GAAIA,EAAK,KAAK,GAAG,OAAS,WAAY,CACpC,IAAMC,EAAUD,EAAK,KAAK,KAAK,KAE/B,QAAWE,KAAUD,EACnB,GAAIC,EAAO,OAAS,qBAAuBA,EAAO,OAAS,sBAAuB,CAChF,IAAMC,EAAkBC,EAA0BF,CAAM,EAEpDd,EAAWe,CAAe,GAC5BP,EAAO,KAAKO,CAAe,CAE/B,CAEJ,MACEN,EAAW,KAAKG,EAAK,KAAK,GAAG,IAAI,CAErC,EAEA,uBAAuBA,EAAM,CAC3BF,EAAM,KAAKE,EAAK,KAAK,GAAG,IAAI,CAC9B,CACF,CAAC,EAEM,CACL,QAASJ,EACT,QAAS,CAAC,GAAGC,EAAY,GAAGC,CAAK,CACnC,CACF,EAEMO,EACJC,GACuB,CACvB,GAAInB,EAAUmB,CAAc,EAC1B,MAAO,UAGT,GAAIvB,EAAkBuB,CAAc,EAAG,CACrC,IAAMC,EAAYD,EAAe,UAAyB,KAE1D,GAAInB,EAAUoB,CAAQ,EACpB,MAAO,UAGT,GAAInB,EAAWkB,EAAe,gBAAgB,QAAQ,MAAM,EAAG,CAC7D,IAAME,EAAaF,EAAe,eAAe,OAAO,IAAID,CAAW,EACvE,MAAO,GAAGE,CAAQ,IAAIC,EAAW,KAAK,IAAI,CAAC,GAC7C,CAEA,OAAOD,GAAY,SACrB,CAEA,OAAI3B,EAAkB0B,CAAc,EAC3B,SAGL5B,EAAkB4B,CAAc,EAC3B,SAGL/B,EAAmB+B,CAAc,EAC5B,UAGLhC,EAAkBgC,CAAc,EAC3B,SAGLzB,EAAkByB,CAAc,EAC3B,SAGL7B,EAAgB6B,CAAc,EACzB,OAGLtB,EAAqBsB,CAAc,EAC9B,YAGLpB,EAAgBoB,CAAc,EACzB,OAGL9B,EAAiB8B,CAAc,EAC1B,QAGLrB,EAAmBqB,CAAc,EAC5B,UAGLlC,EAAekC,CAAc,EACxB,MAGL3B,EAAkB2B,CAAc,EAC3B,SAGLxB,EAAcwB,CAAc,EAEvB,IADYA,EAAe,aAAa,IAAID,CAAW,EACxC,KAAK,IAAI,CAAC,IAG9BhC,EAAciC,CAAc,EACvB,GAAGD,EAAYC,EAAe,WAAW,CAAC,KAG5C,SACT,EAEMF,EACJF,GACgC,CAChC,GAAM,CAAC,KAAAO,EAAM,IAAAC,CAAG,EAAIR,EAedS,GAbW,IAA0B,CACzC,GAAID,EAAI,OAAS,aACf,OAAOA,EAAI,KAIb,GAAIA,EAAI,OAAS,gBACf,OAAOA,EAAI,KAIf,GAEsB,EAMtB,GAJIvB,EAAUwB,CAAI,GAIdF,IAAS,sBACX,OAGF,IAAMH,EAAiBJ,EAAO,gBAAgB,eAQ9C,GANI,CAACnB,EAAkBuB,CAAc,GAInBA,EAAe,UAAyB,OAEzC,eAAiBnB,EAAUmB,EAAe,cAAc,EACvE,OAGF,GAAM,CAACM,EAAWC,CAAU,EAAIP,EAAe,eAAe,OAExDQ,EAAahC,EAAc8B,CAAS,EACtCA,EAAU,aAAa,IAAIP,CAAW,EACtC,CAACA,EAAYO,CAAS,CAAC,EAE3B,MAAO,CACL,KAAAD,EACA,WAAAG,EACA,WAAYT,EAAYQ,CAAU,CACpC,CACF,ECrNA,IAAME,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASXC,EAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQ3BC,EAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQ3BC,EAA2B;AAAA;AAAA,2DAIpBC,EAAW,CAAC,CACvB,QAASC,EACT,QAAAC,EACA,mBAAoB,CAAC,QAAAC,EAAS,eAAAC,CAAc,CAC9C,IAIc,CACZ,IAAMC,EACJD,IAAmB,KAAON,EAA2BD,EAEjDS,EAAUL,EACb,IAAKM,GAAc,CAClB,IAAMC,EAAYC,EAAaF,CAAS,EAEpCG,EAASL,EACb,cAAO,QAAQG,CAAS,EAAE,IAAI,CAAC,CAACG,EAAKC,CAAK,IAAM,CAC9CF,EAASA,EAAO,WAAW,IAAIC,CAAG,IAAKC,CAAK,CAC9C,CAAC,EAEMF,CACT,CAAC,EACA,KAAK;AAAA;AAAA,CAAM,EAEd,OAAOd,EACJ,QAAQ,aAAcO,GAAW,MAAM,EACvC,QAAQ,YAAaG,CAAO,EAC5B,QACC,WACAF,IAAmB,KACf,GACAL,EAAyB,QACvB,YACAG,EAAQ,SAAW,EAAI,GAAK,KAAKA,EAAQ,KAAK,IAAI,CAAC,EACrD,CACN,EACC,KAAK,CACV,EAEMO,EAAe,CAAC,CACpB,KAAAI,EACA,WAAAC,EACA,WAAAC,CACF,IAMK,CAGH,IAAMC,GAFYC,GAAsBA,EAAE,QAAQ,MAAQC,GAAMA,EAAE,CAAC,EAAE,YAAY,CAAC,GAEtDL,CAAI,EAE1BM,EAASJ,EAAW,IAAI,CAACK,EAAWC,KAAO,CAC/C,MAAO,QAAQA,CAAC,GAChB,KAAMD,CACR,EAAE,EAEIE,EAAgB,GAAGH,EAAO,IAAI,CAAC,CAAC,MAAAI,CAAK,IAAMA,CAAK,EAAE,KAAK,IAAI,CAAC,GAE5DC,EAAaL,EAAO,IAAI,CAAC,CAAC,MAAAI,EAAO,KAAAE,CAAI,IAAM,GAAGF,CAAK,KAAKE,CAAI,EAAE,EAAE,KAAK,IAAI,EAE/E,MAAO,CACL,YAAaT,EACb,gBAAiBH,EACjB,cAAeC,EACf,OAAQU,EACR,YAAaF,CACf,CACF,EFhGO,IAAMI,GAAc,MAAO,CAChC,UAAAC,EACA,WAAAC,EACA,mBAAAC,CACF,IAIM,CACJ,IAAMC,EAAa,MAAMC,EAAW,CAClC,UAAAJ,CACF,CAAC,EAEKK,EAAMC,EAAS,CACnB,GAAGH,EACH,mBAAAD,CACF,CAAC,EAED,MAAMK,EAAUN,EAAYI,EAAK,OAAO,CAC1C,EG1BA,OAAQ,eAAAG,MAAkB,uBAC1B,OAAgB,eAAAC,OAAkB,MAe3B,IAAMC,EAAsB,CAAC,CAAC,OAAAC,CAAM,IACzC,OAAO,QAAQA,CAAM,EAAE,IAAI,CAAC,CAACC,EAAIC,CAAS,IAAM,CAC9C,IAAMC,EAAOD,EAAU,aAAa,CAClC,gBAAiB,MACjB,SAAWE,GAAQ,CACbA,EAAI,UAAU,KAAK,IAAI,OAAS,WAClCA,EAAI,WAAW,KAAO,UAEtBA,EAAI,WAAW,OAAS,UAGtBA,EAAI,WAAW,KAAOP,EAAY,YACpCO,EAAI,WAAW,OAAS,YAE5B,CACF,CAAC,EAEKC,EAAgBC,EAAaH,CAAI,EAKjCI,EACJL,EAAU,KAAK,IAAI,OAAS,YAC5B,EAAE,cAAeA,EAAU,KAAK,KAAOA,EAAU,KAAK,IAAI,qBAAqBJ,IAEjF,MAAO,CACL,GAAAG,EACA,OAAQI,EACR,mBAAAE,CACF,CACF,CAAC,EAEGD,EAAgBE,GAAyD,CAC7E,GAAIA,EAAO,SAAW,YACpB,MAAO,CAAC,KAAM,WAAW,EAG3B,OAAQA,EAAO,KAAM,CACnB,IAAK,SACH,GAAIA,EAAO,QAAU,OACnB,MAAO,CAAC,KAAM,UAAW,KAAM,CAAC,OAAOA,EAAO,KAAK,CAAC,CAAC,EAGvD,GAAIA,EAAO,OAAS,OAAW,CAC7B,GAAIA,EAAO,KAAK,KAAMC,GAAM,OAAOA,GAAM,QAAQ,EAC/C,MAAM,IAAI,MAAM,0CAA0C,EAG5D,MAAO,CAAC,KAAM,UAAW,KAAMD,EAAO,IAAgB,CACxD,CAEA,MAAO,CAAC,KAAM,MAAM,EAEtB,IAAK,UACH,MAAO,CAAC,KAAM,MAAM,EAEtB,IAAK,SACH,MAAO,CAAC,KAAM,SAAS,EAEzB,IAAK,UACH,OAAOA,EAAO,SAAW,SAAW,CAAC,KAAM,KAAK,EAAI,CAAC,KAAM,OAAO,EAEpE,IAAK,OACH,MAAM,IAAI,MAAM,4BAA4B,EAE9C,IAAK,QAAS,CACZ,GAAIA,EAAO,cAAgB,OAAW,CACpC,GAAIA,EAAO,YAAY,KAAME,GAAS,OAAOA,GAAS,SAAS,EAC7D,MAAM,IAAI,MAAM,+BAA+B,EAGjD,MAAO,CACL,KAAM,eACN,QAASF,EAAO,YAAY,IAAKE,GAASJ,EAAaI,CAAkB,CAAC,CAC5E,CACF,CAEA,GAAIF,EAAO,QAAU,OACnB,MAAM,IAAI,MAAM,sCAAsC,EAGxD,GAAI,MAAM,QAAQA,EAAO,KAAK,EAC5B,MAAM,IAAI,MAAM,uCAAuC,EAGzD,GAAI,OAAOA,EAAO,OAAU,UAC1B,MAAM,IAAI,MAAM,8CAA8C,EAGhE,MAAO,CAAC,KAAM,MAAO,MAAOF,EAAaE,EAAO,KAAK,CAAC,CACxD,CAEA,IAAK,SAAU,CAEb,GAAIA,EAAO,aAAe,QAAaA,EAAO,uBAAyB,OAAW,CAChF,GAAI,OAAOA,EAAO,sBAAyB,UACzC,MAAM,IAAI,MAAM,4CAA4C,EAG9D,MAAO,CACL,KAAM,MACN,MAAO,CACL,KAAM,QACN,QAAS,CAAC,CAAC,KAAM,MAAM,EAAGF,EAAaE,EAAO,oBAAoB,CAAC,CACrE,CACF,CACF,CAEA,GAAIA,EAAO,aAAe,OACxB,MAAO,CAAC,KAAM,SAAU,OAAQ,CAAC,CAAC,EAGpC,GAAI,OAAO,KAAKA,EAAO,UAAU,EAAE,SAAW,EAC5C,MAAO,CAAC,KAAM,SAAU,OAAQ,CAAC,CAAC,EAGpC,IAAMG,EAAW,IAAI,IAAIH,EAAO,UAAY,CAAC,CAAC,EACxCI,EAAU,OAAO,QAAQJ,EAAO,UAAU,EAEhD,GAAII,EAAQ,KAAK,CAAC,CAACC,EAAGJ,CAAC,IAAM,OAAOA,GAAM,SAAS,EACjD,MAAM,IAAI,MAAM,+BAA+B,EAGjD,MAAO,CACL,KAAM,SACN,OAAQG,EAAQ,IAAI,CAAC,CAACE,EAAGL,CAAC,IAAM,CAC9B,IAAMM,EAAOT,EAAaG,CAAe,EACzC,MAAO,CAAC,KAAMK,EAAG,KAAMH,EAAS,IAAIG,CAAC,EAAIC,EAAO,CAAC,KAAM,MAAO,MAAOA,CAAI,CAAC,CAC5E,CAAC,CACH,CACF,CACF,CAEA,GAAIP,EAAO,QAAU,OAAW,CAC9B,IAAMQ,EAAWR,EAAO,MAAM,OAAO,CAAC,CAAC,KAAAO,CAAI,IAAMA,IAAS,MAAM,EAEhE,OAAIC,EAAS,SAAW,EACf,CAAC,KAAM,MAAO,MAAOV,EAAaU,EAAS,CAAC,CAAC,CAAC,EAGhD,CAAC,KAAM,iBAAkB,QAASA,EAAS,IAAIV,CAAY,CAAC,CACrE,CAEA,GAAIE,EAAO,QAAU,OAAW,CAC9B,IAAMS,EAAaT,EAAO,MAAM,OAAQU,GAAM,OAAOA,GAAM,SAAS,EAGpE,GADcD,EAAW,OAAQC,GAAM,OAAO,KAAKA,CAAC,EAAE,SAAW,CAAC,EACxD,OAAS,EACjB,MAAM,IAAI,MAAM,+BAA+B,EAGjD,GAAID,EAAW,MAAOC,GAAMA,EAAE,QAAU,MAAS,EAC/C,MAAO,CAAC,KAAM,UAAW,KAAMD,EAAW,IAAKC,GAAM,OAAOA,EAAE,KAAK,CAAC,CAAC,EAGvE,IAAMC,EAAUF,EAAW,OAAQC,GAAMA,EAAE,OAAS,MAAM,EAE1D,OAAIC,EAAQ,SAAW,EACd,CAAC,KAAM,MAAO,MAAOb,EAAaa,EAAQ,CAAC,CAAC,CAAC,EAG/C,CAAC,KAAM,iBAAkB,QAASA,EAAQ,IAAIb,CAAY,CAAC,CACpE,CAEA,GAAIE,EAAO,QAAU,OAAW,CAC9B,GAAIA,EAAO,MAAM,KAAMU,GAAM,OAAOA,GAAM,SAAS,EACjD,MAAM,IAAI,MAAM,uCAAuC,EAGzD,GACEV,EAAO,MAAM,KACVU,GAAM,OAAOA,GAAM,YAAcA,EAAE,OAAS,UAAYA,EAAE,aAAe,OAC5E,EAEA,MAAM,IAAI,MAAM,uCAAuC,EAWzD,MAAO,CAAC,KAAM,SAAU,OARTV,EAAO,MAAM,QAASU,GAAM,CACzC,IAAMP,EAAW,IAAI,IAAIO,EAAE,UAAY,CAAC,CAAC,EACzC,OAAO,OAAO,QAAQA,EAAE,YAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAACJ,EAAGL,CAAC,IAAM,CACxD,IAAMM,EAAOT,EAAaG,CAAe,EACzC,MAAO,CAAC,KAAMK,EAAG,KAAMH,EAAS,IAAIG,CAAC,EAAIC,EAAO,CAAC,KAAM,MAAgB,MAAOA,CAAI,CAAC,CACrF,CAAC,CACH,CAAC,CAE6B,CAChC,CAEA,MAAI,OAAO,KAAKP,CAAM,EAAE,SAAW,EAC3B,IAAI,MACR,2HACF,EAGI,IAAI,MAAM,4BAA4B,KAAK,UAAUA,CAAM,CAAC,EAAE,CACtE,EChNA,IAAMY,EAAsBC,GAAkC,CAC5D,OAAQA,EAAO,KAAM,CACnB,IAAK,OACH,MAAO,OACT,IAAK,OACH,MAAO,OACT,IAAK,UACH,MAAO,UACT,IAAK,QACH,MAAO,QACT,IAAK,MACH,MAAO,MACT,IAAK,MACH,MAAO,OAAOD,EAAmBC,EAAO,KAAK,CAAC,GAChD,IAAK,MACH,MAAO,OAAOD,EAAmBC,EAAO,KAAK,CAAC,GAChD,IAAK,SACH,OAAIA,EAAO,OAAO,SAAW,EACpB,YAEF,YAAYA,EAAO,OAAO,IAAKC,GAAM,GAAGA,EAAE,IAAI,MAAMF,EAAmBE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,KACrG,IAAK,QACH,MAAO,YAAYD,EAAO,QAAQ,IAAID,CAAkB,EAAE,KAAK,IAAI,CAAC,KACtE,IAAK,eACH,MAAO,YAAYC,EAAO,QAAQ,IAAI,CAACE,EAAGC,IAAM,GAAGA,CAAC,MAAMJ,EAAmBG,CAAC,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,KAC/F,IAAK,UACH,MAAO,aAAaF,EAAO,KAAK,KAAK,IAAI,CAAC,KAC5C,IAAK,iBACH,MAAO,aAAaA,EAAO,QAAQ,IAAID,CAAkB,EAAE,KAAK,IAAI,CAAC,KACvE,IAAK,YACH,MAAO,WACX,CACF,EAEaK,GAAeC,GAC1BC,EAAoB,CAAC,OAAAD,CAAM,CAAC,EACzB,IACC,CAAC,CAAC,OAAAL,EAAQ,GAAAO,EAAI,mBAAAC,CAAkB,IAC9B,QAAQD,CAAE,MAAMC,EAAqB,OAAOT,EAAmBC,CAAM,CAAC,GAAKD,EAAmBC,CAAM,CAAC,GACzG,EACC,KAAK;AAAA,CAAI,ECxCd,IAAMS,EAAcC,GAAwBA,EAAI,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAI,MAAM,CAAC,EAE/EC,EAAU,iEAMVC,EAAaC,IAAiD,CAClE,KAAM,YACN,GAAGA,CACL,GAEMC,EAAaD,IAAoE,CACrF,KAAM,YACN,GAAGA,CACL,GAEME,EAAkBC,GACtBA,EAAQ,QAAS,GAAO,EAAE,OAAS,YAAc,EAAE,QAAU,CAAC,CAAE,EAE5DC,EAAmB,CAAC,CACxB,OAAAC,EACA,WAAAC,CACF,IAGsB,CACpB,OAAQD,EAAO,KAAM,CACnB,IAAK,OACH,OAAON,EAAU,CAAC,UAAW,QAAQ,CAAC,EAExC,IAAK,OACH,OAAOA,EAAU,CAAC,UAAW,MAAM,CAAC,EAEtC,IAAK,UACH,OAAOA,EAAU,CAAC,UAAW,KAAK,CAAC,EAErC,IAAK,QACH,OAAOA,EAAU,CAAC,UAAW,KAAK,CAAC,EAErC,IAAK,MACH,OAAOA,EAAU,CAAC,UAAW,KAAK,CAAC,EAErC,IAAK,YACH,OAAOA,EAAU,CAAC,UAAW,mBAAmB,CAAC,EAEnD,IAAK,MAAO,CACV,IAAMQ,EAAQH,EAAiB,CAAC,OAAQC,EAAO,MAAO,WAAAC,CAAU,CAAC,EAC3DE,EAAY,UAAUD,EAAM,SAAS,IAC3C,OAAOA,EAAM,OAAS,YAClBN,EAAU,CAAC,UAAAO,EAAW,QAASD,EAAM,OAAO,CAAC,EAC7CR,EAAU,CAAC,UAAAS,CAAS,CAAC,CAC3B,CAEA,IAAK,MAAO,CACV,IAAMD,EAAQH,EAAiB,CAAC,OAAQC,EAAO,MAAO,WAAAC,CAAU,CAAC,EAC3DE,EAAY,OAAOD,EAAM,SAAS,IACxC,OAAOA,EAAM,OAAS,YAClBN,EAAU,CAAC,UAAAO,EAAW,QAASD,EAAM,OAAO,CAAC,EAC7CR,EAAU,CAAC,UAAAS,CAAS,CAAC,CAC3B,CAEA,IAAK,QACL,IAAK,eAAgB,CACnB,IAAML,EAAUE,EAAO,QAAQ,IAAI,CAACI,EAAGC,IACrCN,EAAiB,CAAC,OAAQK,EAAG,WAAY,GAAGH,CAAU,GAAGI,CAAC,EAAE,CAAC,CAC/D,EACMF,EAAY,IAAIL,EAAQ,IAAKQ,GAAMA,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC,IAC1DC,EAAUV,EAAeC,CAAO,EACtC,OAAOS,EAAQ,OAAS,EAAIX,EAAU,CAAC,UAAAO,EAAW,QAAAI,CAAO,CAAC,EAAIb,EAAU,CAAC,UAAAS,CAAS,CAAC,CACrF,CAEA,IAAK,UAAW,CACd,IAAMK,EAAWjB,EAAWU,CAAU,EAChCQ,EAAWT,EAAO,KAAK,IAAKU,GAAQ,OAAOnB,EAAWmB,CAAG,CAAC,GAAG,EAAE,KAAK;AAAA,CAAI,EAC9E,OAAOd,EAAU,CACf,UAAWY,EACX,QAAS,CAAC,GAAGf,CAAO;AAAA,WAAce,CAAQ;AAAA,EAAOC,CAAQ;AAAA,EAAK,CAChE,CAAC,CACH,CAEA,IAAK,iBAAkB,CACrB,IAAMD,EAAWjB,EAAWU,CAAU,EAChCH,EAAUE,EAAO,QAAQ,IAAI,CAACI,EAAGC,IAAM,CAC3C,GAAID,EAAE,OAAS,SAAU,CACvB,IAAMO,EAAeP,EAAE,OAAO,IAAKQ,GACjCb,EAAiB,CAAC,OAAQa,EAAE,KAAM,WAAY,GAAGX,CAAU,GAAGV,EAAWqB,EAAE,IAAI,CAAC,EAAE,CAAC,CACrF,EACMC,EAAST,EAAE,OACd,IAAI,CAACQ,EAAGE,IAAO,WAAWF,EAAE,IAAI,KAAKD,EAAaG,CAAE,EAAE,SAAS,GAAG,EAClE,KAAK;AAAA,CAAI,EACZ,MAAO,CACL,YAAa,cAAcT,CAAC;AAAA,EAAOQ,CAAM;AAAA,OACzC,QAAShB,EAAec,CAAY,CACtC,CACF,CACA,IAAMT,EAAQH,EAAiB,CAAC,OAAQK,EAAG,WAAY,GAAGH,CAAU,UAAUI,CAAC,EAAE,CAAC,EAClF,MAAO,CACL,YAAa,cAAcA,CAAC,IAAIH,EAAM,SAAS,IAC/C,QAASA,EAAM,OAAS,YAAcA,EAAM,QAAU,CAAC,CACzD,CACF,CAAC,EACKO,EAAWX,EAAQ,IAAKQ,GAAMA,EAAE,WAAW,EAAE,KAAK;AAAA,CAAK,EAC7D,OAAOV,EAAU,CACf,UAAWY,EACX,QAAS,CACP,GAAGV,EAAQ,QAASQ,GAAMA,EAAE,OAAO,EACnC,GAAGb,CAAO;AAAA,WAAce,CAAQ;AAAA,EAAOC,CAAQ;AAAA,EACjD,CACF,CAAC,CACH,CAEA,IAAK,SAAU,CACb,IAAMM,EAAaxB,EAAWU,CAAU,EAClCU,EAAeX,EAAO,OAAO,IAAKY,GACtCb,EAAiB,CAAC,OAAQa,EAAE,KAAM,WAAY,GAAGX,CAAU,GAAGV,EAAWqB,EAAE,IAAI,CAAC,EAAE,CAAC,CACrF,EACMC,EAASb,EAAO,OACnB,IAAI,CAACY,EAAGP,IAAM,WAAWO,EAAE,IAAI,KAAKD,EAAaN,CAAC,EAAE,SAAS,GAAG,EAChE,KAAK;AAAA,CAAI,EACZ,OAAOT,EAAU,CACf,UAAWmB,EACX,QAAS,CACP,GAAGlB,EAAec,CAAY,EAC9B,GAAGlB,CAAO;AAAA,aAAgBsB,CAAU;AAAA,EAAOF,CAAM;AAAA,EACnD,CACF,CAAC,CACH,CACF,CACF,EAEMG,GAAsB,CAAC,CAAC,GAAAC,EAAI,OAAAjB,EAAQ,mBAAAkB,CAAkB,IAAsC,CAChG,IAAMC,EAAW,GAAG5B,EAAW0B,CAAE,CAAC,OAE5BtB,EAASI,EAAiB,CAAC,OADKmB,EAAqB,CAAC,KAAM,MAAO,MAAOlB,CAAM,EAAIA,EACjC,WAAYmB,CAAQ,CAAC,EAE9E,OAAIxB,EAAO,OAAS,YACXA,EAAO,QAAQ,KAAK;AAAA;AAAA,CAAM,EAG5B,YAAYwB,CAAQ,MAAMxB,EAAO,SAAS,GACnD,EAEayB,GAAaC,GACxBC,EAAoB,CAAC,OAAAD,CAAM,CAAC,EAAE,IAAIL,EAAmB,EAAE,KAAK;AAAA;AAAA,CAAM",
|
|
6
|
+
"names": ["writeFile", "babelParser", "isTSAnyKeyword", "isTSArrayType", "isTSBigIntKeyword", "isTSBooleanKeyword", "isTSNeverKeyword", "isTSNullKeyword", "isTSNumberKeyword", "isTSObjectKeyword", "isTSStringKeyword", "isTSSymbolKeyword", "isTSTupleType", "isTSTypeReference", "isTSUndefinedKeyword", "isTSUnknownKeyword", "isTSVoidKeyword", "isNullish", "nonNullish", "readFile", "parse", "BABEL_PARSER_OPTIONS", "collectApi", "inputFile", "fileContent", "ast", "result", "interfaces", "types", "traverse", "path", "members", "member", "methodSignature", "membersToMethodSignatures", "getTypeName", "typeAnnotation", "typeName", "typeParams", "type", "key", "name", "paramType", "returnType", "paramsType", "template", "methodTemplateTypeScript", "methodTemplateJavaScript", "importTemplateTypeScript", "parseApi", "signatures", "imports", "coreLib", "outputLanguage", "langTemplate", "methods", "signature", "replacers", "mapSignature", "result", "key", "value", "name", "returnType", "paramsType", "methodName", "s", "x", "params", "paramType", "i", "paramKeysText", "param", "paramsText", "type", "generateApi", "inputFile", "outputFile", "transformerOptions", "definition", "collectApi", "api", "parseApi", "writeFile", "ZodSchemaId", "ZodNullable", "jsonToSputnikSchema", "inputs", "id", "zodSchema", "json", "ctx", "sputnikSchema", "jsonToSchema", "isTopLevelOptional", "schema", "v", "item", "required", "entries", "_", "k", "type", "variants", "nonBoolean", "s", "nonNull", "sputnikSchemaToDid", "schema", "f", "m", "i", "zodToCandid", "inputs", "jsonToSputnikSchema", "id", "isTopLevelOptional", "capitalize", "str", "DERIVES", "primitive", "result", "composite", "collectStructs", "results", "schemaToRustType", "schema", "structName", "inner", "fieldType", "m", "i", "r", "structs", "enumName", "variants", "tag", "fieldResults", "f", "fields", "fi", "recordName", "sputnikSchemaToRust", "id", "isTopLevelOptional", "baseName", "zodToRust", "inputs", "jsonToSputnikSchema"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TransformerOptions } from './types/transformer-options';
|
|
2
|
+
export type * from './types/transformer-options';
|
|
3
|
+
export declare const generateApi: ({ inputFile, outputFile, transformerOptions }: {
|
|
4
|
+
inputFile: string;
|
|
5
|
+
outputFile: string;
|
|
6
|
+
transformerOptions: TransformerOptions;
|
|
7
|
+
}) => Promise<void>;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
export declare const generateApi: ({ inputFile, outputFile, transformerOptions }: {
|
|
4
|
-
inputFile: string;
|
|
5
|
-
outputFile: string;
|
|
6
|
-
transformerOptions: TransformerOptions;
|
|
7
|
-
}) => Promise<void>;
|
|
1
|
+
export * from './api/index';
|
|
2
|
+
export * from './zod/index';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type z } from 'zod';
|
|
2
|
+
import type { SputnikSchema } from './_types';
|
|
3
|
+
export interface ConvertedSputnikSchema {
|
|
4
|
+
id: string;
|
|
5
|
+
schema: SputnikSchema;
|
|
6
|
+
isTopLevelOptional: boolean;
|
|
7
|
+
}
|
|
8
|
+
export type SputnikSchemaResult = ConvertedSputnikSchema[];
|
|
9
|
+
export interface SputnikSchemaArgs {
|
|
10
|
+
inputs: Record<string, z.ZodType>;
|
|
11
|
+
}
|
|
12
|
+
export declare const jsonToSputnikSchema: ({ inputs }: SputnikSchemaArgs) => SputnikSchemaResult;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { core } from 'zod';
|
|
2
|
+
export type JSONSchemaOutput = core.ZodStandardJSONSchemaPayload<any>;
|
|
3
|
+
export type JSONSchema = core.JSONSchema.BaseSchema;
|
|
4
|
+
export type SputnikSchema = {
|
|
5
|
+
kind: 'text';
|
|
6
|
+
} | {
|
|
7
|
+
kind: 'bool';
|
|
8
|
+
} | {
|
|
9
|
+
kind: 'float64';
|
|
10
|
+
} | {
|
|
11
|
+
kind: 'int32';
|
|
12
|
+
} | {
|
|
13
|
+
kind: 'nat';
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'opt';
|
|
16
|
+
inner: SputnikSchema;
|
|
17
|
+
} | {
|
|
18
|
+
kind: 'vec';
|
|
19
|
+
inner: SputnikSchema;
|
|
20
|
+
} | {
|
|
21
|
+
kind: 'record';
|
|
22
|
+
fields: {
|
|
23
|
+
name: string;
|
|
24
|
+
type: SputnikSchema;
|
|
25
|
+
}[];
|
|
26
|
+
} | {
|
|
27
|
+
kind: 'tuple';
|
|
28
|
+
members: SputnikSchema[];
|
|
29
|
+
} | {
|
|
30
|
+
kind: 'indexedTuple';
|
|
31
|
+
members: SputnikSchema[];
|
|
32
|
+
} | {
|
|
33
|
+
kind: 'variant';
|
|
34
|
+
tags: string[];
|
|
35
|
+
} | {
|
|
36
|
+
kind: 'variantRecords';
|
|
37
|
+
members: SputnikSchema[];
|
|
38
|
+
} | {
|
|
39
|
+
kind: 'principal';
|
|
40
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@junobuild/did-tools",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.10-next-2026-03-05",
|
|
4
4
|
"description": "Tools for generating APIs from DID files.",
|
|
5
5
|
"author": "David Dal Busco (https://daviddalbusco.com)",
|
|
6
6
|
"license": "MIT",
|
|
@@ -46,12 +46,14 @@
|
|
|
46
46
|
],
|
|
47
47
|
"homepage": "https://juno.build",
|
|
48
48
|
"peerDependencies": {
|
|
49
|
-
"@babel/core": "
|
|
50
|
-
"@babel/parser": "
|
|
51
|
-
"@babel/plugin-transform-modules-commonjs": "
|
|
52
|
-
"@babel/preset-typescript": "
|
|
53
|
-
"@babel/traverse": "
|
|
54
|
-
"@babel/types": "
|
|
55
|
-
"@dfinity/utils": "
|
|
49
|
+
"@babel/core": "*",
|
|
50
|
+
"@babel/parser": "*",
|
|
51
|
+
"@babel/plugin-transform-modules-commonjs": "*",
|
|
52
|
+
"@babel/preset-typescript": "*",
|
|
53
|
+
"@babel/traverse": "*",
|
|
54
|
+
"@babel/types": "*",
|
|
55
|
+
"@dfinity/utils": "*",
|
|
56
|
+
"@dfinity/zod-schemas": "*",
|
|
57
|
+
"zod": "*"
|
|
56
58
|
}
|
|
57
|
-
}
|
|
59
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|