@lakeql/cli 0.5.0 → 0.5.1
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/cli.mjs +5 -5
- package/package.json +5 -5
package/dist/cli.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c}from"./pull-metadata-D8Z0WHKQ.mjs";import{Command as l}from"@commander-js/extra-typings";import u from"node:path";import{readPackage as d}from"read-pkg";import{existsSync as f}from"node:fs";import{mkdir as p,readFile as m,rm as h,writeFile as g}from"node:fs/promises";import{confirm as _,multiselect as v,question as y,select as b,validators as
|
|
2
|
+
import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c}from"./pull-metadata-D8Z0WHKQ.mjs";import{Command as l}from"@commander-js/extra-typings";import u from"node:path";import{readPackage as d}from"read-pkg";import{existsSync as f}from"node:fs";import{mkdir as p,readFile as m,rm as h,writeFile as g}from"node:fs/promises";import{confirm as _,multiselect as v,question as y,select as b,validators as x}from"@topcli/prompts";import{loadConfig as S}from"c12";import{generateCode as C}from"@lakeql/file-generator";import{generateConfig as ee}from"@lakeql/file-generator/config";import{generateInterface as te}from"@lakeql/file-generator/interface";import{generateQuerySchema as ne}from"@lakeql/file-generator/query-schema";import{generateModel as re}from"@lakeql/schema-generator/graphql-schema";import{generateJsonSchemaFromFields as ie}from"@lakeql/schema-generator/json-schema";import{generateConfigReqistry as ae}from"@lakeql/file-generator/config-registry";import{globby as w}from"globby";import{camelCase as T,upperFirst as E}from"lodash-es";import D from"typescript";import{endpointDefinitionSchema as O,findDuplicateFieldNames as k}from"@lakeql/schema-generator/endpoint-schema";import{TrinoClient as A}from"@lakeql/trino-client";import{ClimtTable as j}from"climt";import{createEnv as M}from"@t3-oss/env-core";import oe from"dotenv";import{enum as se,number as ce,string as N}from"zod/v4";import{error as le}from"@lakeql/logger/console";import{Listr as ue}from"listr2";import{parseColumns as de}from"@lakeql/column-parser";import{convertTrinoResponse as fe}from"@lakeql/response-transformer";import P from"kleur";const F={sourcePath:`.`},I=`lakeql.config.json`;function pe(e){if(typeof e!=`object`||!e)return!1;let t=e,n=`${t.message??``} ${t.cause?.message??``}`;return t.code===`ERR_IMPORT_ATTRIBUTE_MISSING`||t.cause?.code===`ERR_IMPORT_ATTRIBUTE_MISSING`||n.includes(`needs an import attribute of "type: json"`)}function L(e){return{...F,...e}}async function me(e){let t=await m(u.join(e,I),`utf-8`);return L(JSON.parse(t))}async function he(){let e=t();try{let{config:t}=await S({name:`lakeql`,cwd:e,defaults:F,packageJson:!1,globalRc:!1,rcFile:!1,dotenv:!1});return L(t)}catch(t){let n=u.join(e,I);if(pe(t)&&f(n))return me(e);throw t}}async function R(e){let n=await he(),r=t(),i=e??n.sourcePath;return u.isAbsolute(i)?i:u.resolve(r,i)}function ge(){return a().action(async({sourcePath:e})=>{await z(e!==process.env.INIT_CWD&&e!==process.cwd()?e:void 0)})}async function z(e){let t=await R(e),n=await C({fileName:`config-registry.ts`,nodes:ae({configPaths:(await w(`schemas/**/config.ts`,{cwd:t,onlyFiles:!0})).map(e=>{let t=u.parse(e);return u.join(t.dir,t.name)})})});f(u.join(t,`config-registry.ts`))&&await h(u.join(t,`config-registry.ts`),{force:!0,recursive:!0}),await g(u.join(t,`config-registry.ts`),n.text)}function _e(e,t){return{baseClassName:`${E(T(e))}_${E(T(t))}`,queryName:`${T(e)}${E(T(t))}`,mutationName:`create${T(e)}${E(T(t))}`}}const{factory:B}=D;function V(e){return B.createIdentifier(e)}function H(e){return V(e)}function U(e){return B.createStringLiteral(e)}function W(e,t){return B.createPropertyAssignment(V(e),t)}function G(e,t=!0){return B.createObjectLiteralExpression(e,t)}function ve(e){return e?B.createTrue():B.createFalse()}function ye(e){return B.createParameterDeclaration(void 0,void 0,V(e))}function be(e,t,n){return B.createArrowFunction(n?.async?[B.createToken(D.SyntaxKind.AsyncKeyword)]:void 0,void 0,e.map(e=>typeof e==`string`?ye(e):e),void 0,B.createToken(D.SyntaxKind.EqualsGreaterThanToken),t)}function xe(e){return B.createParenthesizedExpression(e)}function Se(e,t=!0){return be([`t`],xe(G(e,t)))}function K(e,t){return B.createPropertyAccessExpression(typeof e==`string`?V(e):e,V(t))}function Ce(e,t=[],n){return B.createCallExpression(e,n,t)}function q(e,t,n=[],r){return Ce(K(e,t),n,r)}function we(e,t=[],n){return q(`builder`,e,t,n)}function Te(e,t){return B.createVariableStatement(void 0,B.createVariableDeclarationList([B.createVariableDeclaration(V(e),void 0,void 0,t)],D.NodeFlags.Const))}function J(e,t,n){return B.createImportDeclaration(void 0,B.createImportClause(n?.typeOnly??!1,void 0,B.createNamedImports(t.map(e=>B.createImportSpecifier(!1,void 0,V(e))))),U(e))}function Ee(e,t,n){return B.createImportDeclaration(void 0,B.createImportClause(n?.typeOnly??!1,V(t),void 0),U(e))}function De({models:e,mutationName:t,mutationConfig:n,hasValidations:r,fieldDefinitions:i}){if(!n)return[];let a=Object.values(e).find(e=>e.root);if(!a)return[];let o=Oe(i),s=ke(i),c=Object.values(e).filter(e=>!e.root);return[...Ae(r),...c.map(t=>je(t,e,o,s)),je(a,e,o,s),Fe(t,a,r)]}function Oe(e){let t=new Map;if(!e)return t;for(let n of e){let e=n.options?.required===!0;t.set(n.name,e)}return t}function ke(e){let t=new Set;if(!e)return t;for(let n of e)n.options?.readOnly===!0&&t.add(n.name);return t}function Ae(e){let t=[J(`@lakeql/adapters`,[`executeWritePipeline`]),J(`@lakeql/trino-client`,[`TrinoClient`]),J(`@lakeql/api/builder`,[`builder`]),J(`~/env`,[`env`]),J(`./config`,[`hiveConfig`,`storageConfig`]),Ee(`./json-schema.json`,`jsonSchema`)];return e&&t.push(J(`./validations`,[`validationSchema`])),t}function je(e,t,n,r){let i=`${e.modelName}Input`,a=Object.values(e.fields).filter(e=>!r.has(e.name)).map(e=>Me(e,t,n));return Te(i,we(`inputType`,[U(i),G([W(`fields`,Se(a))])]))}function Me(e,t,n){let r=W(`required`,ve(n.get(e.name)??!0));if(e.isArray){let t=e.graphqlType.replace(/^\[/u,``).replace(/\]$/u,``),n=Pe(t);if(n)return W(e.name,q(`t`,n,[G([r],!1)]));let i=`${t}Input`;return W(e.name,q(`t`,`field`,[G([W(`type`,D.factory.createArrayLiteralExpression([H(i)])),r],!1)]))}let i=Ne(e.graphqlType);if(i)return W(e.name,q(`t`,i,[G([r],!1)]));if(Object.keys(t).includes(e.graphqlType)){let t=`${e.graphqlType}Input`;return W(e.name,q(`t`,`field`,[G([W(`type`,H(t)),r],!1)]))}return W(e.name,q(`t`,`string`,[G([r],!1)]))}function Ne(e){switch(e){case`String`:return`string`;case`Int`:return`int`;case`Float`:return`float`;case`Boolean`:return`boolean`;default:return}}function Pe(e){switch(e){case`String`:return`stringList`;case`Int`:return`intList`;case`Float`:return`floatList`;case`Boolean`:return`booleanList`;default:return}}function Fe(e,t,n){let r=`${t.modelName}Input`,i=[];n&&i.push(D.factory.createExpressionStatement(q(`validationSchema`,`parse`,[H(`input`)]))),i.push(D.factory.createVariableStatement(void 0,D.factory.createVariableDeclarationList([D.factory.createVariableDeclaration(H(`trinoClient`),void 0,void 0,D.factory.createNewExpression(H(`TrinoClient`),void 0,[G([W(`host`,K(`env`,`HIVE_HOST`)),W(`port`,K(`env`,`HIVE_PORT`)),W(`auth`,G([W(`type`,U(`basic`)),W(`username`,K(`env`,`HIVE_USERNAME`)),W(`password`,K(`env`,`HIVE_PASSWORD`))],!1)),W(`catalog`,K(`env`,`HIVE_CATALOG`)),W(`source`,K(`env`,`HIVE_SOURCE`))])]))],D.NodeFlags.Const)));let a=D.factory.createAwaitExpression(Ce(H(`executeWritePipeline`),[G([W(`records`,H(`input`)),W(`jsonSchema`,D.factory.createAsExpression(H(`jsonSchema`),D.factory.createKeywordTypeNode(D.SyntaxKind.AnyKeyword))),W(`config`,G([W(`loadStrategy`,K(`storageConfig`,`loadStrategy`)),W(`bucket`,K(`storageConfig`,`bucket`)),W(`basePath`,K(`storageConfig`,`basePath`)),W(`table`,G([W(`catalog`,K(`hiveConfig`,`catalog`)),W(`schema`,K(`hiveConfig`,`schema`)),W(`tableName`,K(`hiveConfig`,`tableName`))],!1)),W(`trinoClient`,H(`trinoClient`))]))])]));i.push(D.factory.createExpressionStatement(a)),i.push(D.factory.createReturnStatement(D.factory.createTrue()));let o=D.factory.createBlock(i,!0),s=be([ye(`_root`),D.factory.createParameterDeclaration(void 0,void 0,D.factory.createObjectBindingPattern([D.factory.createBindingElement(void 0,void 0,D.factory.createIdentifier(`input`))]))],o,{async:!0}),c=W(e,q(`t`,`boolean`,[G([W(`args`,G([W(`input`,q(`t`,`arg`,[G([W(`type`,H(r)),W(`required`,ve(!0))],!1)]))],!1)),W(`resolve`,s)])]));return D.factory.createExpressionStatement(we(`mutationFields`,[Se([c])]))}function Y(e){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return e.map(Y);let t={},n=Object.keys(e).toSorted();for(let r of n)t[r]=Y(e[r]);return t}function Ie(e){let t=Y(e);return`${JSON.stringify(t,null,2).replaceAll(`\r
|
|
3
3
|
`,`
|
|
4
|
-
`)}\n`}async function
|
|
5
|
-
`)}function
|
|
4
|
+
`)}\n`}async function Le(e){let{definition:t,outputDir:n,skipRegistry:r,sourcePathOverride:i}=e,{catalog:a,schema:o,tableName:s,fields:c}=t,{baseClassName:l,queryName:d,mutationName:m}=_e(o,s),_=ie(c),v=re({isRoot:!0,models:{},name:l,source:_}),y=Object.values(v).find(e=>e.root===!0),b=y?.fields?Object.values(y.fields).filter(e=>e.filter===!0).map(e=>({name:e.name,type:e.graphqlType})):[],x=[...new Set(b.map(e=>e.type))],S=[...new Set(Object.values(v).filter(e=>e.transformFields.length>0).flatMap(e=>e.transformFields))],ae=[...new Set(Object.values(v).filter(e=>e.dateTimeFields.length>0).flatMap(e=>e.dateTimeFields))],w=await C({fileName:`config.ts`,nodes:ee({catalog:a,queryName:d,schema:o,tableName:s,mutationName:[m],storageConfig:t.mutation?{loadStrategy:t.mutation.loadStrategy,type:t.mutation.type,bucket:t.mutation.bucket,basePath:t.mutation.basePath,region:t.mutation.region,endpoint:t.mutation.endpoint,partitioning:t.mutation.loadStrategy===`full_load`?void 0:t.mutation.partitioning,partitioningFormat:t.mutation.loadStrategy===`full_load`?void 0:t.mutation.partitioningFormat}:void 0})}),T=await C({fileName:`interface.ts`,nodes:te(v)}),E=await C({fileName:`query-schema.ts`,nodes:ne({dateTimeFields:ae,filterFields:b,filterTypes:x,models:v,queryName:d,transformFields:S})}),D=c.some(e=>e.options?.validations&&e.options.validations.length>0),O=De({models:v,mutationName:m,mutationConfig:t.mutation,hasValidations:D,fieldDefinitions:c}),k=``;O.length>0&&(k=(await C({fileName:`mutation-schema.ts`,nodes:O})).text);let A=Ie(_),j=Ie(t),M=[{fileName:`config.ts`,content:w.text},{fileName:`interface.ts`,content:T.text},{fileName:`query-schema.ts`,content:E.text},{fileName:`json-schema.json`,content:A},{fileName:`endpoint.json`,content:j}];k&&M.push({fileName:`mutation-schema.ts`,content:k}),f(n)&&await h(n,{force:!0,recursive:!0}),await p(n,{recursive:!0});for(let e of M)await g(u.join(n,e.fileName),e.content);return r||await z(i),{files:M,outputDir:n}}function X(e,t=0){let n=[],r=` `.repeat(t+1);for(let i of e)if(i.type===`Object`)n.push(`${r}${i.name}: Object`),i.fields&&n.push(X(i.fields,t+1));else if(i.type===`Array`){let e=i.items?.type??`Unknown`;n.push(`${r}${i.name}: Array<${e}>`),i.items?.type===`Object`&&i.items.fields&&n.push(X(i.items.fields,t+1))}else n.push(`${r}${i.name}: ${i.type}`);return n.filter(e=>e.length>0).join(`
|
|
5
|
+
`)}function Re(){return s().action(async e=>{let{fromFile:t,sourcePath:n,skipRegistry:r,force:i}=e,a=u.isAbsolute(t)?t:u.resolve(process.cwd(),t);f(a)||(console.error(`Error: File not found: ${a}`),process.exit(1));let o;try{o=await m(a,`utf-8`)}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`Error: Cannot read file: ${a}: ${t}`),process.exit(1)}let s;try{s=JSON.parse(o)}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`Error: Invalid JSON in ${a}: ${t}`),process.exit(1)}let c=O.safeParse(s);if(!c.success){let e=c.error.issues.map(e=>` - ${e.path.length>0?e.path.join(`.`):`root`}: ${e.message}`).join(`
|
|
6
6
|
`);console.error(`Error: Validation failed for ${a}:\n${e}`),process.exit(1)}let l=c.data,d=k(l.fields);if(d.length>0){let e=d.map(e=>{let t=e.path.length>0?e.path.join(`.`):`root`;return` - Duplicate field "${e.name}" at level: ${t}`}).join(`
|
|
7
7
|
`);console.error(`Error: Validation failed for ${a}:\n${e}`),process.exit(1)}console.log(`
|
|
8
8
|
Loaded definition summary:`),console.log(` tableName: ${l.tableName}`),console.log(` catalog: ${l.catalog}`),console.log(` schema: ${l.schema}`);let p=l.mutation?l.mutation.loadStrategy:`disabled`;console.log(` mutation: ${p}`),console.log(`
|
|
9
|
-
Fields:`),console.log(
|
|
10
|
-
`)}\n}\n`}function
|
|
9
|
+
Fields:`),console.log(X(l.fields)),console.log(``);let h=await R(n===process.cwd()?void 0:n),g=u.join(h,`schemas/custom`,l.catalog,l.schema,l.tableName);f(g)&&!i&&(await _(`Directory "${g}" already exists. Overwrite?`)||(console.log(`Aborted.`),process.exit(0))),await Le({definition:l,outputDir:g,skipRegistry:r,sourcePathOverride:n===process.cwd()?void 0:n}),console.log(`Endpoint generated successfully at: ${g}`)})}let ze;function Be(){return oe.config({path:`../../.env`}),M({runtimeEnv:process.env,server:{HIVE_CATALOG:N().min(1),HIVE_HOST:N(),HIVE_PASSWORD:N().min(1),HIVE_PORT:N().transform(e=>Number.parseInt(e,10)).pipe(ce()),HIVE_SOURCE:N().optional(),HIVE_USERNAME:N().min(1),LOG_LEVEL:se([`info`,`warn`,`error`,`debug`]).default(`warn`)}})}function Z(){return ze||=Be(),ze}function Ve(){let t=e();return t.action(async({catalog:e,schema:t,table:n})=>{let r=Z(),i=e??r.HIVE_CATALOG,a=new A({auth:{password:r.HIVE_PASSWORD,type:`basic`,username:r.HIVE_USERNAME},catalog:i,host:r.HIVE_HOST,port:r.HIVE_PORT}),o=t;if(o===void 0){let e=await a.schemas({catalog:i});o=await b(`Choose a schema from the ${i} catalog`,{autocomplete:!0,choices:e})}let s=n;if(s===void 0){let e=await a.tables({catalog:i,schema:o});s=await b(`Choose a table from "${i}.${o}"`,{autocomplete:!0,choices:e})}let c=(await a.columns({catalog:i,schema:o,table:s})).map(([e,t,n,r])=>({description:r,extra:n,name:e,type:t})),l=new j;l.column(`Column Name`,`name`),l.column(`Type`,`type`),l.column(`Extra`,`extra`),l.column(`Description`,`description`),l.render(c)}),t}function He(){let e=n();return e.action(async({catalog:e})=>{let t=Z(),n=e??t.HIVE_CATALOG,r=await new A({auth:{password:t.HIVE_PASSWORD,type:`basic`,username:t.HIVE_USERNAME},catalog:n,host:t.HIVE_HOST,port:t.HIVE_PORT}).schemas({catalog:n}),i=new j;i.column(`Schema Name`,`s`),i.render(r.map(e=>({s:e})))}),e}function Ue(){let e=o();return e.action(async({catalog:e,schema:t})=>{let n=Z(),r=e??n.HIVE_CATALOG,i=new A({auth:{password:n.HIVE_PASSWORD,type:`basic`,username:n.HIVE_USERNAME},catalog:r,host:n.HIVE_HOST,port:n.HIVE_PORT}),a=t;if(a===void 0){let e=await i.schemas({catalog:r});a=await b(`Choose a schema from the ${r} catalog`,{autocomplete:!0,choices:e})}let o=await i.tables({catalog:r,schema:a}),s=new j;s.column(`Table Name`,`t`),s.render(o.map(e=>({t:e})))}),e}function We(){let e=i();return e.action(async({catalog:e,schema:t})=>{let n=Z(),r=e??n.HIVE_CATALOG,i=new A({auth:{password:n.HIVE_PASSWORD,type:`basic`,username:n.HIVE_USERNAME},catalog:r,host:n.HIVE_HOST,port:n.HIVE_PORT}),a=t;if(a===void 0){let e=await i.schemas({catalog:r});a=await b(`Choose a schema from the ${r} catalog`,{choices:e})}let o=await i.views({catalog:r,schema:a}),s=new j;s.column(`View Name`,`v`),s.render(o.map(e=>({v:e})))}),e}function Ge(e){switch(e.replaceAll(/[^a-zA-Z]/gu,``)){case`varchar`:return`String`;case`decimal`:case`double`:case`float`:return`Float`;case`integer`:case`bigint`:return`Integer`;case`boolean`:return`Boolean`;case`timestamp`:return`DateTime`;case`date`:return`Date`;default:return`String`}}function Ke(e,t){return typeof t==`string`?{name:e,type:Ge(t)}:Array.isArray(t)?{name:e,type:`Array`,items:qe(t)}:typeof t==`object`&&t?{name:e,type:`Object`,fields:Q(t)}:{name:e,type:`String`}}function qe(e){if(e.length===0)return{type:`String`};let[t]=e;return typeof t==`string`?{type:Ge(t)}:typeof t==`object`&&t&&!Array.isArray(t)?{type:`Object`,fields:Q(t)}:{type:`String`}}function Q(e){let t=[];for(let[n,r]of Object.entries(e))t.push(Ke(n,r));return t}function Je(e){let{tableName:t,catalog:n,schema:r,parsedColumns:i}=e;return{version:`1.0`,tableName:t,catalog:n,schema:r,fields:Q(i),mutation:!1}}async function $(e){let{trinoClient:t,catalog:n,schema:r,tables:i,resolvedTargetPath:a,skipRegistry:o,sourcePathOverride:s}=e;for(let e of i)await Le({definition:Je({tableName:e,catalog:n,schema:r,parsedColumns:de((await t.columns({catalog:n,schema:r,table:e})).map(e=>fe({keys:[`name`,`type`,`extra`,`description`],values:e})))}),outputDir:u.join(a,`schemas/generated`,n,r,e),skipRegistry:o,sourcePathOverride:s})}async function Ye(e){let n=t(),r;if(e){let t=u.isAbsolute(e)?e:u.resolve(n,e),i=u.parse(t);r=u.join(i.dir,i.name)}let{config:i}=await S({name:`import`,cwd:n,configFile:r,defaults:{default:[]},packageJson:!1,globalRc:!1,rcFile:!1,dotenv:!1}),a=i;return Array.isArray(a)?a:a&&typeof a==`object`&&`default`in a&&Array.isArray(a.default)?a.default:[]}async function Xe(e){let{configPath:t,catalog:n,sourcePathOverride:r,skipRegistry:i}=e,a=Z(),o=await R(r),s=await Ye(t);if(s.length===0){console.log(`No entries found in bulk config.`);return}await new ue([{title:`Pull data`,task:(e,t)=>t.newListr(s.map(e=>{let t=n??e.catalog??a.HIVE_CATALOG,i=(e.tables?.length??0)+(e.views?.length??0);return{title:`${t}/${e.schema} — ${i} item(s)`,task:async(n,s)=>{let c=new A({auth:{password:a.HIVE_PASSWORD,type:`basic`,username:a.HIVE_USERNAME},catalog:t,host:a.HIVE_HOST,port:a.HIVE_PORT});e.tables&&e.tables.length>0&&(s.output=`Pulling ${e.tables.length} table(s)...`,await $({trinoClient:c,catalog:t,schema:e.schema,tables:e.tables,resolvedTargetPath:o,skipRegistry:!0,sourcePathOverride:r})),e.views&&e.views.length>0&&(s.output=`Pulling ${e.views.length} view(s)...`,await $({trinoClient:c,catalog:t,schema:e.schema,tables:e.views,resolvedTargetPath:o,skipRegistry:!0,sourcePathOverride:r})),s.title=`${t}/${e.schema} — ${i} item(s) pulled`}}}),{concurrent:!0,exitOnError:!1})},{title:`Create registry`,enabled:!i,task:async()=>{await z(r)}}],{concurrent:!1,exitOnError:!0}).run()}function Ze(){let e=c();return e.action(async t=>{let{skipRegistry:n,sourcePath:r,bulk:i,bulkConfig:a}=t,o=r===(process.env.INIT_CWD??process.cwd())?void 0:r;if(i){await Xe({configPath:a,catalog:t.catalog,sourcePathOverride:o,skipRegistry:n});return}let s=Z(),c=t.catalog??s.HIVE_CATALOG,{schema:l,table:u,type:d}=t,f=await R(o),p=new A({auth:{password:s.HIVE_PASSWORD,type:`basic`,username:s.HIVE_USERNAME},catalog:c,host:s.HIVE_HOST,port:s.HIVE_PORT});if(!l){let e=await p.schemas({catalog:c});l=await b(`Choose a schema from the ${c} catalog`,{autocomplete:!0,choices:e})}if(u.length===0&&(d??=await b(`What do you want to see from ${c}/${l}`,{choices:[{label:`Show tables`,value:`tables`},{label:`Show views`,value:`views`}]})),u.length===0){d??=`tables`;let t=[];t=d===`views`?await p.views({catalog:c,schema:l}):await p.tables({catalog:c,schema:l}),t.length===0&&e.error(le(`There are no ${d} in schema '${c}.${l}'.`),{exitCode:0}),u=await v(`Choose the ${d} to pull`,{autocomplete:!0,choices:t,validators:[x.required()]})}await $({trinoClient:p,catalog:c,schema:l,tables:[...u],resolvedTargetPath:f,skipRegistry:n,sourcePathOverride:o})}),e}const Qe=[`lakeql.config.mjs`,`lakeql.config.ts`,`lakeql.config.json`];function $e(e){return`/** @type {import('@lakeql/cli').LakeQLConfig} */\nexport default {\n${Object.entries(e).map(([e,t])=>` ${e}: ${JSON.stringify(t)},`).join(`
|
|
10
|
+
`)}\n}\n`}function et(e){for(let t of Qe)if(f(u.join(e,t)))return t;return null}function tt(){return r().action(async()=>{let e=t(),n=et(e);if(n&&await b(`${n} already exists. Overwrite?`,{choices:[{label:`Yes`,value:`yes`},{label:`No`,value:`no`}]})===`no`){console.log(P.yellow(`Aborted.`));return}let r=await b(`Config format:`,{choices:[{label:`lakeql.config.mjs (recommended)`,value:`mjs`},{label:`lakeql.config.json`,value:`json`}]}),i=f(u.join(e,`src`)),a;if(i)a=`src`,console.log(P.cyan(`Detected src/ directory — generated code will be placed in src/`));else{let e=await b(`Where should generated code be placed?`,{choices:[{label:`./ (project root)`,value:`.`},{label:`Custom path`,value:`__custom__`}]});a=e,e===`__custom__`&&(a=await y(`Enter the source path (relative to project root):`,{defaultValue:`.`}))}let o={sourcePath:a},s=r===`mjs`?`lakeql.config.mjs`:`lakeql.config.json`,c=u.join(e,s);await g(c,r===`mjs`?$e(o):`${JSON.stringify(o,null,2)}\n`),console.log(P.green(`Created ${s} at ${c}`))})}function nt(e){let t=new l;return t.configureHelp({sortSubcommands:!0}),t.name(`lakeql-cli`).description(`LakeQL CLI`).version(e.version).addCommand(He()).addCommand(Ue()).addCommand(We()).addCommand(Ve()).addCommand(Ze()).addCommand(Re()).addCommand(ge()).addCommand(tt()),t}async function rt(e=process.argv.slice(2),t){let n=nt(t??await d());return e.length===0?(n.outputHelp(),0):(await n.parseAsync(e),0)}rt().catch(()=>{process.exit(1)});export{};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lakeql/cli",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "CLI for introspecting Trino schemas and generating type-safe GraphQL endpoints",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -64,13 +64,13 @@
|
|
|
64
64
|
"lodash-es": "4.18.1",
|
|
65
65
|
"read-pkg": "10.1.0",
|
|
66
66
|
"zod": "4.4.3",
|
|
67
|
-
"@lakeql/file-generator": "0.1.8",
|
|
68
67
|
"@lakeql/column-parser": "0.1.4",
|
|
68
|
+
"@lakeql/file-generator": "0.1.8",
|
|
69
69
|
"@lakeql/logger": "0.1.3",
|
|
70
|
-
"@lakeql/response-transformer": "0.1.4",
|
|
71
|
-
"@lakeql/schema-generator": "0.4.2",
|
|
72
70
|
"@lakeql/helpers": "0.1.4",
|
|
73
|
-
"@lakeql/
|
|
71
|
+
"@lakeql/response-transformer": "0.1.4",
|
|
72
|
+
"@lakeql/trino-client": "0.4.0",
|
|
73
|
+
"@lakeql/schema-generator": "0.4.2"
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
76
|
"@types/lodash-es": "4.17.12",
|