@kronor/dtv 4.1.0 → 5.0.0
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 +6 -0
- package/bin/dtv.js +24 -0
- package/dist/assets/{index-fwXiEkID.js → index-BCuRRUo9.js} +1 -1
- package/dist/cli/dtv.js +512 -0
- package/dist/cli/dtv.js.map +1 -0
- package/dist/cli/typegen/schemaToTs.js +163 -0
- package/dist/cli/typegen/schemaToTs.js.map +1 -0
- package/dist/index.es.js +39 -34
- package/dist/index.html +1 -1
- package/dist/types/cli/dtv.d.ts +2 -0
- package/dist/types/cli/dtv.d.ts.map +1 -0
- package/dist/types/cli/typegen/schemaToTs.d.ts +13 -0
- package/dist/types/cli/typegen/schemaToTs.d.ts.map +1 -0
- package/dist/types/dsl/columns.d.ts +50 -23
- package/dist/types/dsl/columns.d.ts.map +1 -1
- package/dist/types/dsl/internal/queryForRow.d.ts +42 -0
- package/dist/types/dsl/internal/queryForRow.d.ts.map +1 -0
- package/dist/types/framework/column-definition.d.ts +205 -24
- package/dist/types/framework/column-definition.d.ts.map +1 -1
- package/dist/types/framework/hasura.d.ts +2 -2
- package/dist/types/framework/hasura.d.ts.map +1 -1
- package/dist/types/framework/native-runtime/index.d.ts +2 -2
- package/dist/types/framework/typelevel.d.ts +6 -0
- package/dist/types/framework/typelevel.d.ts.map +1 -0
- package/dist/types/lib/index.d.ts +2 -0
- package/dist/types/lib/index.d.ts.map +1 -1
- package/dist/types/typegen/index.d.ts +27 -0
- package/dist/types/typegen/index.d.ts.map +1 -0
- package/docs/typegen.md +86 -0
- package/package.json +18 -5
package/README.md
CHANGED
|
@@ -122,6 +122,12 @@ npm test
|
|
|
122
122
|
npm run test
|
|
123
123
|
```
|
|
124
124
|
|
|
125
|
+
## Type Generation (CLI)
|
|
126
|
+
|
|
127
|
+
DTV ships a CLI command for generating TypeScript types from a Hasura GraphQL schema:
|
|
128
|
+
|
|
129
|
+
- See `docs/typegen.md`
|
|
130
|
+
|
|
125
131
|
## Release Process
|
|
126
132
|
|
|
127
133
|
Automated release script performs validation (lint, build, unit + e2e tests), builds the library bundle, bumps the version, pushes git tags, and publishes to npm.
|
package/bin/dtv.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Wrapper entrypoint for the published DTV CLI.
|
|
4
|
+
// The implementation lives in dist/cli so it can be compiled from TypeScript.
|
|
5
|
+
|
|
6
|
+
try {
|
|
7
|
+
await import('../dist/cli/dtv.js');
|
|
8
|
+
} catch (e) {
|
|
9
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
10
|
+
console.error(
|
|
11
|
+
[
|
|
12
|
+
'Failed to start DTV CLI: missing compiled output at dist/cli/dtv.js.',
|
|
13
|
+
'',
|
|
14
|
+
'This usually means @kronor/dtv was installed from an incomplete package (missing dist/).',
|
|
15
|
+
'',
|
|
16
|
+
'Fix:',
|
|
17
|
+
'- Upgrade to a version of @kronor/dtv that includes the CLI build artifacts, or',
|
|
18
|
+
'- If using a local checkout, run: npm run build:lib',
|
|
19
|
+
'',
|
|
20
|
+
`Original error: ${msg}`
|
|
21
|
+
].join('\n')
|
|
22
|
+
);
|
|
23
|
+
process.exitCode = 1;
|
|
24
|
+
}
|
|
@@ -6,7 +6,7 @@ var NE=Object.defineProperty;var PE=(e,r,t)=>r in e?NE(e,r,{enumerable:!0,config
|
|
|
6
6
|
*
|
|
7
7
|
* This source code is licensed under the MIT license found in the
|
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
|
9
|
-
*/var Rb;function ME(){if(Rb)return Un;Rb=1;var e=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),t=Symbol.for("react.fragment"),l=Symbol.for("react.strict_mode"),n=Symbol.for("react.profiler"),c=Symbol.for("react.consumer"),p=Symbol.for("react.context"),d=Symbol.for("react.forward_ref"),m=Symbol.for("react.suspense"),g=Symbol.for("react.memo"),h=Symbol.for("react.lazy"),b=Symbol.iterator;function O(j){return j===null||typeof j!="object"?null:(j=b&&j[b]||j["@@iterator"],typeof j=="function"?j:null)}var T={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},I=Object.assign,R={};function U(j,ae,ie){this.props=j,this.context=ae,this.refs=R,this.updater=ie||T}U.prototype.isReactComponent={},U.prototype.setState=function(j,ae){if(typeof j!="object"&&typeof j!="function"&&j!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,j,ae,"setState")},U.prototype.forceUpdate=function(j){this.updater.enqueueForceUpdate(this,j,"forceUpdate")};function $(){}$.prototype=U.prototype;function H(j,ae,ie){this.props=j,this.context=ae,this.refs=R,this.updater=ie||T}var E=H.prototype=new $;E.constructor=H,I(E,U.prototype),E.isPureReactComponent=!0;var M=Array.isArray,D={H:null,A:null,T:null,S:null,V:null},re=Object.prototype.hasOwnProperty;function G(j,ae,ie,K,le,ce){return ie=ce.ref,{$$typeof:e,type:j,key:ae,ref:ie!==void 0?ie:null,props:ce}}function V(j,ae){return G(j.type,ae,void 0,void 0,void 0,j.props)}function A(j){return typeof j=="object"&&j!==null&&j.$$typeof===e}function k(j){var ae={"=":"=0",":":"=2"};return"$"+j.replace(/[=:]/g,function(ie){return ae[ie]})}var L=/\/+/g;function q(j,ae){return typeof j=="object"&&j!==null&&j.key!=null?k(""+j.key):ae.toString(36)}function B(){}function W(j){switch(j.status){case"fulfilled":return j.value;case"rejected":throw j.reason;default:switch(typeof j.status=="string"?j.then(B,B):(j.status="pending",j.then(function(ae){j.status==="pending"&&(j.status="fulfilled",j.value=ae)},function(ae){j.status==="pending"&&(j.status="rejected",j.reason=ae)})),j.status){case"fulfilled":return j.value;case"rejected":throw j.reason}}throw j}function Q(j,ae,ie,K,le){var ce=typeof j;(ce==="undefined"||ce==="boolean")&&(j=null);var Oe=!1;if(j===null)Oe=!0;else switch(ce){case"bigint":case"string":case"number":Oe=!0;break;case"object":switch(j.$$typeof){case e:case r:Oe=!0;break;case h:return Oe=j._init,Q(Oe(j._payload),ae,ie,K,le)}}if(Oe)return le=le(j),Oe=K===""?"."+q(j,0):K,M(le)?(ie="",Oe!=null&&(ie=Oe.replace(L,"$&/")+"/"),Q(le,ae,ie,"",function(jt){return jt})):le!=null&&(A(le)&&(le=V(le,ie+(le.key==null||j&&j.key===le.key?"":(""+le.key).replace(L,"$&/")+"/")+Oe)),ae.push(le)),1;Oe=0;var it=K===""?".":K+":";if(M(j))for(var ut=0;ut<j.length;ut++)K=j[ut],ce=it+q(K,ut),Oe+=Q(K,ae,ie,ce,le);else if(ut=O(j),typeof ut=="function")for(j=ut.call(j),ut=0;!(K=j.next()).done;)K=K.value,ce=it+q(K,ut++),Oe+=Q(K,ae,ie,ce,le);else if(ce==="object"){if(typeof j.then=="function")return Q(W(j),ae,ie,K,le);throw ae=String(j),Error("Objects are not valid as a React child (found: "+(ae==="[object Object]"?"object with keys {"+Object.keys(j).join(", ")+"}":ae)+"). If you meant to render a collection of children, use an array instead.")}return Oe}function J(j,ae,ie){if(j==null)return j;var K=[],le=0;return Q(j,K,"","",function(ce){return ae.call(ie,ce,le++)}),K}function ge(j){if(j._status===-1){var ae=j._result;ae=ae(),ae.then(function(ie){(j._status===0||j._status===-1)&&(j._status=1,j._result=ie)},function(ie){(j._status===0||j._status===-1)&&(j._status=2,j._result=ie)}),j._status===-1&&(j._status=0,j._result=ae)}if(j._status===1)return j._result.default;throw j._result}var de=typeof reportError=="function"?reportError:function(j){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var ae=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof j=="object"&&j!==null&&typeof j.message=="string"?String(j.message):String(j),error:j});if(!window.dispatchEvent(ae))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",j);return}console.error(j)};function ye(){}return Un.Children={map:J,forEach:function(j,ae,ie){J(j,function(){ae.apply(this,arguments)},ie)},count:function(j){var ae=0;return J(j,function(){ae++}),ae},toArray:function(j){return J(j,function(ae){return ae})||[]},only:function(j){if(!A(j))throw Error("React.Children.only expected to receive a single React element child.");return j}},Un.Component=U,Un.Fragment=t,Un.Profiler=n,Un.PureComponent=H,Un.StrictMode=l,Un.Suspense=m,Un.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=D,Un.__COMPILER_RUNTIME={__proto__:null,c:function(j){return D.H.useMemoCache(j)}},Un.cache=function(j){return function(){return j.apply(null,arguments)}},Un.cloneElement=function(j,ae,ie){if(j==null)throw Error("The argument must be a React element, but you passed "+j+".");var K=I({},j.props),le=j.key,ce=void 0;if(ae!=null)for(Oe in ae.ref!==void 0&&(ce=void 0),ae.key!==void 0&&(le=""+ae.key),ae)!re.call(ae,Oe)||Oe==="key"||Oe==="__self"||Oe==="__source"||Oe==="ref"&&ae.ref===void 0||(K[Oe]=ae[Oe]);var Oe=arguments.length-2;if(Oe===1)K.children=ie;else if(1<Oe){for(var it=Array(Oe),ut=0;ut<Oe;ut++)it[ut]=arguments[ut+2];K.children=it}return G(j.type,le,void 0,void 0,ce,K)},Un.createContext=function(j){return j={$$typeof:p,_currentValue:j,_currentValue2:j,_threadCount:0,Provider:null,Consumer:null},j.Provider=j,j.Consumer={$$typeof:c,_context:j},j},Un.createElement=function(j,ae,ie){var K,le={},ce=null;if(ae!=null)for(K in ae.key!==void 0&&(ce=""+ae.key),ae)re.call(ae,K)&&K!=="key"&&K!=="__self"&&K!=="__source"&&(le[K]=ae[K]);var Oe=arguments.length-2;if(Oe===1)le.children=ie;else if(1<Oe){for(var it=Array(Oe),ut=0;ut<Oe;ut++)it[ut]=arguments[ut+2];le.children=it}if(j&&j.defaultProps)for(K in Oe=j.defaultProps,Oe)le[K]===void 0&&(le[K]=Oe[K]);return G(j,ce,void 0,void 0,null,le)},Un.createRef=function(){return{current:null}},Un.forwardRef=function(j){return{$$typeof:d,render:j}},Un.isValidElement=A,Un.lazy=function(j){return{$$typeof:h,_payload:{_status:-1,_result:j},_init:ge}},Un.memo=function(j,ae){return{$$typeof:g,type:j,compare:ae===void 0?null:ae}},Un.startTransition=function(j){var ae=D.T,ie={};D.T=ie;try{var K=j(),le=D.S;le!==null&&le(ie,K),typeof K=="object"&&K!==null&&typeof K.then=="function"&&K.then(ye,de)}catch(ce){de(ce)}finally{D.T=ae}},Un.unstable_useCacheRefresh=function(){return D.H.useCacheRefresh()},Un.use=function(j){return D.H.use(j)},Un.useActionState=function(j,ae,ie){return D.H.useActionState(j,ae,ie)},Un.useCallback=function(j,ae){return D.H.useCallback(j,ae)},Un.useContext=function(j){return D.H.useContext(j)},Un.useDebugValue=function(){},Un.useDeferredValue=function(j,ae){return D.H.useDeferredValue(j,ae)},Un.useEffect=function(j,ae,ie){var K=D.H;if(typeof ie=="function")throw Error("useEffect CRUD overload is not enabled in this build of React.");return K.useEffect(j,ae)},Un.useId=function(){return D.H.useId()},Un.useImperativeHandle=function(j,ae,ie){return D.H.useImperativeHandle(j,ae,ie)},Un.useInsertionEffect=function(j,ae){return D.H.useInsertionEffect(j,ae)},Un.useLayoutEffect=function(j,ae){return D.H.useLayoutEffect(j,ae)},Un.useMemo=function(j,ae){return D.H.useMemo(j,ae)},Un.useOptimistic=function(j,ae){return D.H.useOptimistic(j,ae)},Un.useReducer=function(j,ae,ie){return D.H.useReducer(j,ae,ie)},Un.useRef=function(j){return D.H.useRef(j)},Un.useState=function(j){return D.H.useState(j)},Un.useSyncExternalStore=function(j,ae,ie){return D.H.useSyncExternalStore(j,ae,ie)},Un.useTransition=function(){return D.H.useTransition()},Un.version="19.1.0",Un}var Ib;function og(){return Ib||(Ib=1,mm.exports=ME()),mm.exports}var s=og();const zn=W0(s),AE="4.
|
|
9
|
+
*/var Rb;function ME(){if(Rb)return Un;Rb=1;var e=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),t=Symbol.for("react.fragment"),l=Symbol.for("react.strict_mode"),n=Symbol.for("react.profiler"),c=Symbol.for("react.consumer"),p=Symbol.for("react.context"),d=Symbol.for("react.forward_ref"),m=Symbol.for("react.suspense"),g=Symbol.for("react.memo"),h=Symbol.for("react.lazy"),b=Symbol.iterator;function O(j){return j===null||typeof j!="object"?null:(j=b&&j[b]||j["@@iterator"],typeof j=="function"?j:null)}var T={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},I=Object.assign,R={};function U(j,ae,ie){this.props=j,this.context=ae,this.refs=R,this.updater=ie||T}U.prototype.isReactComponent={},U.prototype.setState=function(j,ae){if(typeof j!="object"&&typeof j!="function"&&j!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,j,ae,"setState")},U.prototype.forceUpdate=function(j){this.updater.enqueueForceUpdate(this,j,"forceUpdate")};function $(){}$.prototype=U.prototype;function H(j,ae,ie){this.props=j,this.context=ae,this.refs=R,this.updater=ie||T}var E=H.prototype=new $;E.constructor=H,I(E,U.prototype),E.isPureReactComponent=!0;var M=Array.isArray,D={H:null,A:null,T:null,S:null,V:null},re=Object.prototype.hasOwnProperty;function G(j,ae,ie,K,le,ce){return ie=ce.ref,{$$typeof:e,type:j,key:ae,ref:ie!==void 0?ie:null,props:ce}}function V(j,ae){return G(j.type,ae,void 0,void 0,void 0,j.props)}function A(j){return typeof j=="object"&&j!==null&&j.$$typeof===e}function k(j){var ae={"=":"=0",":":"=2"};return"$"+j.replace(/[=:]/g,function(ie){return ae[ie]})}var L=/\/+/g;function q(j,ae){return typeof j=="object"&&j!==null&&j.key!=null?k(""+j.key):ae.toString(36)}function B(){}function W(j){switch(j.status){case"fulfilled":return j.value;case"rejected":throw j.reason;default:switch(typeof j.status=="string"?j.then(B,B):(j.status="pending",j.then(function(ae){j.status==="pending"&&(j.status="fulfilled",j.value=ae)},function(ae){j.status==="pending"&&(j.status="rejected",j.reason=ae)})),j.status){case"fulfilled":return j.value;case"rejected":throw j.reason}}throw j}function Q(j,ae,ie,K,le){var ce=typeof j;(ce==="undefined"||ce==="boolean")&&(j=null);var Oe=!1;if(j===null)Oe=!0;else switch(ce){case"bigint":case"string":case"number":Oe=!0;break;case"object":switch(j.$$typeof){case e:case r:Oe=!0;break;case h:return Oe=j._init,Q(Oe(j._payload),ae,ie,K,le)}}if(Oe)return le=le(j),Oe=K===""?"."+q(j,0):K,M(le)?(ie="",Oe!=null&&(ie=Oe.replace(L,"$&/")+"/"),Q(le,ae,ie,"",function(jt){return jt})):le!=null&&(A(le)&&(le=V(le,ie+(le.key==null||j&&j.key===le.key?"":(""+le.key).replace(L,"$&/")+"/")+Oe)),ae.push(le)),1;Oe=0;var it=K===""?".":K+":";if(M(j))for(var ut=0;ut<j.length;ut++)K=j[ut],ce=it+q(K,ut),Oe+=Q(K,ae,ie,ce,le);else if(ut=O(j),typeof ut=="function")for(j=ut.call(j),ut=0;!(K=j.next()).done;)K=K.value,ce=it+q(K,ut++),Oe+=Q(K,ae,ie,ce,le);else if(ce==="object"){if(typeof j.then=="function")return Q(W(j),ae,ie,K,le);throw ae=String(j),Error("Objects are not valid as a React child (found: "+(ae==="[object Object]"?"object with keys {"+Object.keys(j).join(", ")+"}":ae)+"). If you meant to render a collection of children, use an array instead.")}return Oe}function J(j,ae,ie){if(j==null)return j;var K=[],le=0;return Q(j,K,"","",function(ce){return ae.call(ie,ce,le++)}),K}function ge(j){if(j._status===-1){var ae=j._result;ae=ae(),ae.then(function(ie){(j._status===0||j._status===-1)&&(j._status=1,j._result=ie)},function(ie){(j._status===0||j._status===-1)&&(j._status=2,j._result=ie)}),j._status===-1&&(j._status=0,j._result=ae)}if(j._status===1)return j._result.default;throw j._result}var de=typeof reportError=="function"?reportError:function(j){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var ae=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof j=="object"&&j!==null&&typeof j.message=="string"?String(j.message):String(j),error:j});if(!window.dispatchEvent(ae))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",j);return}console.error(j)};function ye(){}return Un.Children={map:J,forEach:function(j,ae,ie){J(j,function(){ae.apply(this,arguments)},ie)},count:function(j){var ae=0;return J(j,function(){ae++}),ae},toArray:function(j){return J(j,function(ae){return ae})||[]},only:function(j){if(!A(j))throw Error("React.Children.only expected to receive a single React element child.");return j}},Un.Component=U,Un.Fragment=t,Un.Profiler=n,Un.PureComponent=H,Un.StrictMode=l,Un.Suspense=m,Un.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=D,Un.__COMPILER_RUNTIME={__proto__:null,c:function(j){return D.H.useMemoCache(j)}},Un.cache=function(j){return function(){return j.apply(null,arguments)}},Un.cloneElement=function(j,ae,ie){if(j==null)throw Error("The argument must be a React element, but you passed "+j+".");var K=I({},j.props),le=j.key,ce=void 0;if(ae!=null)for(Oe in ae.ref!==void 0&&(ce=void 0),ae.key!==void 0&&(le=""+ae.key),ae)!re.call(ae,Oe)||Oe==="key"||Oe==="__self"||Oe==="__source"||Oe==="ref"&&ae.ref===void 0||(K[Oe]=ae[Oe]);var Oe=arguments.length-2;if(Oe===1)K.children=ie;else if(1<Oe){for(var it=Array(Oe),ut=0;ut<Oe;ut++)it[ut]=arguments[ut+2];K.children=it}return G(j.type,le,void 0,void 0,ce,K)},Un.createContext=function(j){return j={$$typeof:p,_currentValue:j,_currentValue2:j,_threadCount:0,Provider:null,Consumer:null},j.Provider=j,j.Consumer={$$typeof:c,_context:j},j},Un.createElement=function(j,ae,ie){var K,le={},ce=null;if(ae!=null)for(K in ae.key!==void 0&&(ce=""+ae.key),ae)re.call(ae,K)&&K!=="key"&&K!=="__self"&&K!=="__source"&&(le[K]=ae[K]);var Oe=arguments.length-2;if(Oe===1)le.children=ie;else if(1<Oe){for(var it=Array(Oe),ut=0;ut<Oe;ut++)it[ut]=arguments[ut+2];le.children=it}if(j&&j.defaultProps)for(K in Oe=j.defaultProps,Oe)le[K]===void 0&&(le[K]=Oe[K]);return G(j,ce,void 0,void 0,null,le)},Un.createRef=function(){return{current:null}},Un.forwardRef=function(j){return{$$typeof:d,render:j}},Un.isValidElement=A,Un.lazy=function(j){return{$$typeof:h,_payload:{_status:-1,_result:j},_init:ge}},Un.memo=function(j,ae){return{$$typeof:g,type:j,compare:ae===void 0?null:ae}},Un.startTransition=function(j){var ae=D.T,ie={};D.T=ie;try{var K=j(),le=D.S;le!==null&&le(ie,K),typeof K=="object"&&K!==null&&typeof K.then=="function"&&K.then(ye,de)}catch(ce){de(ce)}finally{D.T=ae}},Un.unstable_useCacheRefresh=function(){return D.H.useCacheRefresh()},Un.use=function(j){return D.H.use(j)},Un.useActionState=function(j,ae,ie){return D.H.useActionState(j,ae,ie)},Un.useCallback=function(j,ae){return D.H.useCallback(j,ae)},Un.useContext=function(j){return D.H.useContext(j)},Un.useDebugValue=function(){},Un.useDeferredValue=function(j,ae){return D.H.useDeferredValue(j,ae)},Un.useEffect=function(j,ae,ie){var K=D.H;if(typeof ie=="function")throw Error("useEffect CRUD overload is not enabled in this build of React.");return K.useEffect(j,ae)},Un.useId=function(){return D.H.useId()},Un.useImperativeHandle=function(j,ae,ie){return D.H.useImperativeHandle(j,ae,ie)},Un.useInsertionEffect=function(j,ae){return D.H.useInsertionEffect(j,ae)},Un.useLayoutEffect=function(j,ae){return D.H.useLayoutEffect(j,ae)},Un.useMemo=function(j,ae){return D.H.useMemo(j,ae)},Un.useOptimistic=function(j,ae){return D.H.useOptimistic(j,ae)},Un.useReducer=function(j,ae,ie){return D.H.useReducer(j,ae,ie)},Un.useRef=function(j){return D.H.useRef(j)},Un.useState=function(j){return D.H.useState(j)},Un.useSyncExternalStore=function(j,ae,ie){return D.H.useSyncExternalStore(j,ae,ie)},Un.useTransition=function(){return D.H.useTransition()},Un.version="19.1.0",Un}var Ib;function og(){return Ib||(Ib=1,mm.exports=ME()),mm.exports}var s=og();const zn=W0(s),AE="4.1.0",kE={version:AE};var vm={exports:{}},Fs={};/**
|
|
10
10
|
* @license React
|
|
11
11
|
* react-jsx-runtime.production.js
|
|
12
12
|
*
|
package/dist/cli/dtv.js
ADDED
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import * as fs from 'node:fs/promises';
|
|
5
|
+
import fg from 'fast-glob';
|
|
6
|
+
import ts from 'typescript';
|
|
7
|
+
import { getIntrospectionQuery, buildClientSchema } from 'graphql';
|
|
8
|
+
import { collectReachableTypes, renderTsFromSchema, unwrapCollectionElementType } from './typegen/schemaToTs.js';
|
|
9
|
+
function isRecord(value) {
|
|
10
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
11
|
+
}
|
|
12
|
+
function assertString(value, context) {
|
|
13
|
+
if (typeof value !== 'string' || value.length === 0) {
|
|
14
|
+
throw new Error(`${context} must be a non-empty string`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function toPascalCase(input) {
|
|
18
|
+
return input
|
|
19
|
+
.replace(/[^a-zA-Z0-9]+/g, ' ')
|
|
20
|
+
.trim()
|
|
21
|
+
.split(' ')
|
|
22
|
+
.filter(Boolean)
|
|
23
|
+
.map(part => part.charAt(0).toUpperCase() + part.slice(1))
|
|
24
|
+
.join('');
|
|
25
|
+
}
|
|
26
|
+
async function loadConfig(configPath) {
|
|
27
|
+
const abs = path.isAbsolute(configPath) ? configPath : path.resolve(process.cwd(), configPath);
|
|
28
|
+
const cfg = await (async () => {
|
|
29
|
+
const ext = path.extname(abs).toLowerCase();
|
|
30
|
+
const url = pathToFileURL(abs).href;
|
|
31
|
+
if (ext === '.ts' || ext === '.tsx') {
|
|
32
|
+
// Load TS config in a way that works in both CJS and ESM projects.
|
|
33
|
+
// We transpile the config file to ESM and import the emitted JS.
|
|
34
|
+
// This avoids requiring the consuming repo to be `type: module`.
|
|
35
|
+
const sourceText = await fs.readFile(abs, 'utf8');
|
|
36
|
+
// Under `module: NodeNext`, TS decides ESM vs CJS based on file extension
|
|
37
|
+
// and nearest package.json `type`. We want the config to always be treated
|
|
38
|
+
// as ESM so it can be imported reliably from any project.
|
|
39
|
+
const transpileFileName = abs.replace(/\.(tsx?)$/i, '.mts');
|
|
40
|
+
const transpiled = ts.transpileModule(sourceText, {
|
|
41
|
+
compilerOptions: {
|
|
42
|
+
target: ts.ScriptTarget.ES2022,
|
|
43
|
+
module: ts.ModuleKind.NodeNext,
|
|
44
|
+
moduleResolution: ts.ModuleResolutionKind.NodeNext,
|
|
45
|
+
jsx: ts.JsxEmit.Preserve,
|
|
46
|
+
esModuleInterop: true,
|
|
47
|
+
sourceMap: false
|
|
48
|
+
},
|
|
49
|
+
fileName: transpileFileName,
|
|
50
|
+
reportDiagnostics: true
|
|
51
|
+
});
|
|
52
|
+
if (transpiled.diagnostics?.length) {
|
|
53
|
+
const errors = transpiled.diagnostics.filter(d => d.category === ts.DiagnosticCategory.Error);
|
|
54
|
+
if (errors.length) {
|
|
55
|
+
const msg = errors
|
|
56
|
+
.map(d => ts.flattenDiagnosticMessageText(d.messageText, '\n'))
|
|
57
|
+
.join('\n');
|
|
58
|
+
throw new Error(`Failed to transpile ${abs}:\n${msg}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const tmpFile = path.join(path.dirname(abs), `.${path.basename(abs)}.dtv-tmp.${Date.now()}.mjs`);
|
|
62
|
+
await fs.writeFile(tmpFile, transpiled.outputText, 'utf8');
|
|
63
|
+
try {
|
|
64
|
+
const tmpUrl = pathToFileURL(tmpFile).href;
|
|
65
|
+
const mod = await import(`${tmpUrl}?t=${Date.now()}`);
|
|
66
|
+
return (mod.default ?? mod.config ?? mod);
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
await fs.unlink(tmpFile).catch(() => undefined);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// JS/MJS/CJS (or any Node-supported module) can be imported directly.
|
|
73
|
+
// Cache-bust import to allow repeated runs.
|
|
74
|
+
const mod = await import(`${url}?t=${Date.now()}`);
|
|
75
|
+
return (mod.default ?? mod.config ?? mod);
|
|
76
|
+
})();
|
|
77
|
+
if (!isRecord(cfg)) {
|
|
78
|
+
throw new Error('Config must export a plain object (default export recommended)');
|
|
79
|
+
}
|
|
80
|
+
if (!isRecord(cfg.schema))
|
|
81
|
+
throw new Error('Config.schema is required');
|
|
82
|
+
assertString(cfg.schema.endpoint, 'Config.schema.endpoint');
|
|
83
|
+
if (cfg.schema.headers !== undefined && !isRecord(cfg.schema.headers)) {
|
|
84
|
+
throw new Error('Config.schema.headers must be an object when provided');
|
|
85
|
+
}
|
|
86
|
+
if (!isRecord(cfg.scan))
|
|
87
|
+
throw new Error('Config.scan is required');
|
|
88
|
+
if (!Array.isArray(cfg.scan.include) || cfg.scan.include.length === 0) {
|
|
89
|
+
throw new Error('Config.scan.include must be a non-empty array of glob patterns');
|
|
90
|
+
}
|
|
91
|
+
if (cfg.scan.exclude !== undefined && !Array.isArray(cfg.scan.exclude)) {
|
|
92
|
+
throw new Error('Config.scan.exclude must be an array when provided');
|
|
93
|
+
}
|
|
94
|
+
if (cfg.scan.dtvImport !== undefined)
|
|
95
|
+
assertString(cfg.scan.dtvImport, 'Config.scan.dtvImport');
|
|
96
|
+
if (!isRecord(cfg.output))
|
|
97
|
+
throw new Error('Config.output is required');
|
|
98
|
+
assertString(cfg.output.fileNamePattern, 'Config.output.fileNamePattern');
|
|
99
|
+
if (cfg.output.fileNamePattern.includes('/') || cfg.output.fileNamePattern.includes('\\')) {
|
|
100
|
+
throw new Error('Config.output.fileNamePattern must be a file name (no path separators)');
|
|
101
|
+
}
|
|
102
|
+
if (cfg.scalars !== undefined && !isRecord(cfg.scalars)) {
|
|
103
|
+
throw new Error('Config.scalars must be an object when provided');
|
|
104
|
+
}
|
|
105
|
+
if (cfg.debug !== undefined) {
|
|
106
|
+
if (!isRecord(cfg.debug))
|
|
107
|
+
throw new Error('Config.debug must be an object when provided');
|
|
108
|
+
if (cfg.debug.includeGraphqlTypeComments !== undefined && typeof cfg.debug.includeGraphqlTypeComments !== 'boolean') {
|
|
109
|
+
throw new Error('Config.debug.includeGraphqlTypeComments must be a boolean when provided');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return cfg;
|
|
113
|
+
}
|
|
114
|
+
async function fetchSchema(endpoint, headers) {
|
|
115
|
+
const query = getIntrospectionQuery({
|
|
116
|
+
descriptions: true
|
|
117
|
+
});
|
|
118
|
+
const res = await fetch(endpoint, {
|
|
119
|
+
method: 'POST',
|
|
120
|
+
headers: {
|
|
121
|
+
'content-type': 'application/json',
|
|
122
|
+
...headers
|
|
123
|
+
},
|
|
124
|
+
body: JSON.stringify({ query })
|
|
125
|
+
});
|
|
126
|
+
if (!res.ok) {
|
|
127
|
+
const text = await res.text().catch(() => '');
|
|
128
|
+
throw new Error(`Introspection request failed (${res.status} ${res.statusText}): ${text}`);
|
|
129
|
+
}
|
|
130
|
+
const json = await res.json();
|
|
131
|
+
if (json.errors && Array.isArray(json.errors) && json.errors.length) {
|
|
132
|
+
throw new Error(`Introspection returned errors: ${JSON.stringify(json.errors, null, 2)}`);
|
|
133
|
+
}
|
|
134
|
+
if (!json.data) {
|
|
135
|
+
throw new Error('Introspection response missing data');
|
|
136
|
+
}
|
|
137
|
+
return buildClientSchema(json.data);
|
|
138
|
+
}
|
|
139
|
+
function findViewsInFile(sourceText, fileName, dtvImport) {
|
|
140
|
+
const sourceFile = ts.createSourceFile(fileName, sourceText, ts.ScriptTarget.Latest, true);
|
|
141
|
+
const unwrapParens = (expr) => {
|
|
142
|
+
let cur = expr;
|
|
143
|
+
while (ts.isParenthesizedExpression(cur)) {
|
|
144
|
+
cur = cur.expression;
|
|
145
|
+
}
|
|
146
|
+
return cur;
|
|
147
|
+
};
|
|
148
|
+
const getDslReceivers = () => {
|
|
149
|
+
const dslIdentifiers = new Set();
|
|
150
|
+
const dtvNamespaces = new Set();
|
|
151
|
+
for (const stmt of sourceFile.statements) {
|
|
152
|
+
if (ts.isImportDeclaration(stmt)) {
|
|
153
|
+
if (!ts.isStringLiteral(stmt.moduleSpecifier))
|
|
154
|
+
continue;
|
|
155
|
+
if (stmt.moduleSpecifier.text !== dtvImport)
|
|
156
|
+
continue;
|
|
157
|
+
const clause = stmt.importClause;
|
|
158
|
+
if (!clause)
|
|
159
|
+
continue;
|
|
160
|
+
// `import dtv from '...'`
|
|
161
|
+
if (clause.name) {
|
|
162
|
+
dtvNamespaces.add(clause.name.text);
|
|
163
|
+
}
|
|
164
|
+
const nb = clause.namedBindings;
|
|
165
|
+
if (!nb)
|
|
166
|
+
continue;
|
|
167
|
+
// `import * as dtv from '...'`
|
|
168
|
+
if (ts.isNamespaceImport(nb)) {
|
|
169
|
+
dtvNamespaces.add(nb.name.text);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
// `import { DSL as X } from '...'`
|
|
173
|
+
if (ts.isNamedImports(nb)) {
|
|
174
|
+
for (const el of nb.elements) {
|
|
175
|
+
const imported = (el.propertyName ?? el.name).text;
|
|
176
|
+
const local = el.name.text;
|
|
177
|
+
if (imported === 'DSL') {
|
|
178
|
+
dslIdentifiers.add(local);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (ts.isImportEqualsDeclaration(stmt)) {
|
|
185
|
+
const mr = stmt.moduleReference;
|
|
186
|
+
if (!ts.isExternalModuleReference(mr))
|
|
187
|
+
continue;
|
|
188
|
+
const expr = mr.expression;
|
|
189
|
+
if (!expr || !ts.isStringLiteral(expr))
|
|
190
|
+
continue;
|
|
191
|
+
if (expr.text !== dtvImport)
|
|
192
|
+
continue;
|
|
193
|
+
dtvNamespaces.add(stmt.name.text);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (ts.isVariableStatement(stmt)) {
|
|
197
|
+
for (const decl of stmt.declarationList.declarations) {
|
|
198
|
+
if (!decl.initializer)
|
|
199
|
+
continue;
|
|
200
|
+
const init = unwrapParens(decl.initializer);
|
|
201
|
+
if (!ts.isCallExpression(init))
|
|
202
|
+
continue;
|
|
203
|
+
if (!ts.isIdentifier(init.expression) || init.expression.text !== 'require')
|
|
204
|
+
continue;
|
|
205
|
+
const arg0 = init.arguments[0];
|
|
206
|
+
if (!arg0 || !ts.isStringLiteral(arg0) || arg0.text !== dtvImport)
|
|
207
|
+
continue;
|
|
208
|
+
if (ts.isIdentifier(decl.name)) {
|
|
209
|
+
dtvNamespaces.add(decl.name.text);
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
if (ts.isObjectBindingPattern(decl.name)) {
|
|
213
|
+
for (const el of decl.name.elements) {
|
|
214
|
+
const imported = (el.propertyName ?? el.name);
|
|
215
|
+
if (ts.isIdentifier(imported) && imported.text === 'DSL') {
|
|
216
|
+
if (ts.isIdentifier(el.name)) {
|
|
217
|
+
dslIdentifiers.add(el.name.text);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return { dslIdentifiers, dtvNamespaces };
|
|
226
|
+
};
|
|
227
|
+
const receivers = getDslReceivers();
|
|
228
|
+
if (receivers.dslIdentifiers.size === 0 && receivers.dtvNamespaces.size === 0)
|
|
229
|
+
return [];
|
|
230
|
+
const views = [];
|
|
231
|
+
const tryGetStringProp = (obj, propName) => {
|
|
232
|
+
for (const p of obj.properties) {
|
|
233
|
+
if (!ts.isPropertyAssignment(p))
|
|
234
|
+
continue;
|
|
235
|
+
const name = p.name;
|
|
236
|
+
const key = ts.isIdentifier(name)
|
|
237
|
+
? name.text
|
|
238
|
+
: ts.isStringLiteral(name)
|
|
239
|
+
? name.text
|
|
240
|
+
: null;
|
|
241
|
+
if (key !== propName)
|
|
242
|
+
continue;
|
|
243
|
+
if (ts.isStringLiteral(p.initializer))
|
|
244
|
+
return p.initializer.text;
|
|
245
|
+
if (ts.isNoSubstitutionTemplateLiteral(p.initializer))
|
|
246
|
+
return p.initializer.text;
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
return null;
|
|
250
|
+
};
|
|
251
|
+
const visit = (node) => {
|
|
252
|
+
if (ts.isCallExpression(node)) {
|
|
253
|
+
const expr = node.expression;
|
|
254
|
+
if (ts.isPropertyAccessExpression(expr)) {
|
|
255
|
+
const receiver = unwrapParens(expr.expression);
|
|
256
|
+
const method = expr.name.text;
|
|
257
|
+
const isDslReceiver = (() => {
|
|
258
|
+
if (ts.isIdentifier(receiver) && receivers.dslIdentifiers.has(receiver.text))
|
|
259
|
+
return true;
|
|
260
|
+
if (ts.isPropertyAccessExpression(receiver)) {
|
|
261
|
+
const maybeNs = unwrapParens(receiver.expression);
|
|
262
|
+
if (receiver.name.text !== 'DSL')
|
|
263
|
+
return false;
|
|
264
|
+
return ts.isIdentifier(maybeNs) && receivers.dtvNamespaces.has(maybeNs.text);
|
|
265
|
+
}
|
|
266
|
+
return false;
|
|
267
|
+
})();
|
|
268
|
+
if (method === 'view' && isDslReceiver) {
|
|
269
|
+
const firstArg = node.arguments[0];
|
|
270
|
+
if (firstArg && ts.isObjectLiteralExpression(firstArg)) {
|
|
271
|
+
const viewId = tryGetStringProp(firstArg, 'id');
|
|
272
|
+
const collectionName = tryGetStringProp(firstArg, 'collectionName');
|
|
273
|
+
if (viewId && collectionName) {
|
|
274
|
+
views.push({
|
|
275
|
+
viewId,
|
|
276
|
+
collectionName,
|
|
277
|
+
sourceFile: fileName
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
ts.forEachChild(node, visit);
|
|
285
|
+
};
|
|
286
|
+
visit(sourceFile);
|
|
287
|
+
return views;
|
|
288
|
+
}
|
|
289
|
+
async function scanViews(config) {
|
|
290
|
+
const dtvImport = config.scan.dtvImport ?? '@kronor/dtv';
|
|
291
|
+
const files = await fg(config.scan.include, {
|
|
292
|
+
ignore: config.scan.exclude ?? [],
|
|
293
|
+
absolute: true,
|
|
294
|
+
onlyFiles: true
|
|
295
|
+
});
|
|
296
|
+
const results = [];
|
|
297
|
+
for (const f of files) {
|
|
298
|
+
if (!f.endsWith('.ts') && !f.endsWith('.tsx'))
|
|
299
|
+
continue;
|
|
300
|
+
const text = await fs.readFile(f, 'utf8');
|
|
301
|
+
results.push(...findViewsInFile(text, f, dtvImport));
|
|
302
|
+
}
|
|
303
|
+
// Validate that each view id is unique across the scanned project.
|
|
304
|
+
const byId = new Map();
|
|
305
|
+
for (const v of results) {
|
|
306
|
+
const list = byId.get(v.viewId);
|
|
307
|
+
if (list)
|
|
308
|
+
list.push(v);
|
|
309
|
+
else
|
|
310
|
+
byId.set(v.viewId, [v]);
|
|
311
|
+
}
|
|
312
|
+
const duplicates = [];
|
|
313
|
+
for (const [viewId, views] of byId.entries()) {
|
|
314
|
+
if (views.length > 1)
|
|
315
|
+
duplicates.push({ viewId, views });
|
|
316
|
+
}
|
|
317
|
+
if (duplicates.length) {
|
|
318
|
+
const lines = [];
|
|
319
|
+
lines.push('Duplicate DTV view ids found (each view `id` must be unique):');
|
|
320
|
+
for (const d of duplicates.sort((a, b) => a.viewId.localeCompare(b.viewId))) {
|
|
321
|
+
lines.push(`- ${d.viewId}`);
|
|
322
|
+
for (const v of d.views) {
|
|
323
|
+
lines.push(` - ${path.resolve(v.sourceFile)}`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
throw new Error(lines.join('\n'));
|
|
327
|
+
}
|
|
328
|
+
return results;
|
|
329
|
+
}
|
|
330
|
+
async function writeFileEnsuringDir(filePath, content) {
|
|
331
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
332
|
+
await fs.writeFile(filePath, content, 'utf8');
|
|
333
|
+
}
|
|
334
|
+
async function fileExists(filePath) {
|
|
335
|
+
try {
|
|
336
|
+
await fs.stat(filePath);
|
|
337
|
+
return true;
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
function renderDefaultConfigTs(options) {
|
|
344
|
+
const stringifyArray = (items) => {
|
|
345
|
+
const outerIndent = ' ';
|
|
346
|
+
const innerIndent = ' ';
|
|
347
|
+
return `[
|
|
348
|
+
${items.map(v => `${innerIndent}${JSON.stringify(v)}`).join(',\n')}
|
|
349
|
+
${outerIndent}]`;
|
|
350
|
+
};
|
|
351
|
+
return [
|
|
352
|
+
"import type { DtvTypegenConfig } from '@kronor/dtv/typegen';",
|
|
353
|
+
'',
|
|
354
|
+
'const config: DtvTypegenConfig = {',
|
|
355
|
+
' schema: {',
|
|
356
|
+
` endpoint: ${JSON.stringify(options.endpoint)},`,
|
|
357
|
+
' headers: {',
|
|
358
|
+
' // Example header-based auth:',
|
|
359
|
+
' // Authorization: `Bearer ${process.env.HASURA_TOKEN}`,',
|
|
360
|
+
'',
|
|
361
|
+
' // Hasura admin secret:',
|
|
362
|
+
" // 'x-hasura-admin-secret': process.env.HASURA_ADMIN_SECRET ?? '',",
|
|
363
|
+
' }',
|
|
364
|
+
' },',
|
|
365
|
+
'',
|
|
366
|
+
' scan: {',
|
|
367
|
+
' // Scan TS/TSX files for `DSL.view({ ... })` calls (supports aliased/namespaced imports too)',
|
|
368
|
+
` include: ${stringifyArray(options.include)},`,
|
|
369
|
+
` exclude: ${stringifyArray(options.exclude)},`,
|
|
370
|
+
'',
|
|
371
|
+
' // Override if you re-export DTV under a different specifier.',
|
|
372
|
+
` dtvImport: ${JSON.stringify(options.dtvImport)}`,
|
|
373
|
+
' },',
|
|
374
|
+
'',
|
|
375
|
+
' output: {',
|
|
376
|
+
' // File name written next to each view module that calls DSL.view(...)',
|
|
377
|
+
` fileNamePattern: ${JSON.stringify(options.fileNamePattern)}`,
|
|
378
|
+
' },',
|
|
379
|
+
'',
|
|
380
|
+
' scalars: {',
|
|
381
|
+
" // DateTime: 'string'",
|
|
382
|
+
' }',
|
|
383
|
+
'',
|
|
384
|
+
' debug: {',
|
|
385
|
+
' // When true, include original GraphQL type refs as comments',
|
|
386
|
+
' includeGraphqlTypeComments: false',
|
|
387
|
+
' }',
|
|
388
|
+
'};',
|
|
389
|
+
'',
|
|
390
|
+
'export default config;',
|
|
391
|
+
''
|
|
392
|
+
].join('\n');
|
|
393
|
+
}
|
|
394
|
+
async function runInitConfig(outPath, force, overrides) {
|
|
395
|
+
const absOut = path.isAbsolute(outPath) ? outPath : path.resolve(process.cwd(), outPath);
|
|
396
|
+
if (!force && await fileExists(absOut)) {
|
|
397
|
+
throw new Error(`Refusing to overwrite existing file: ${absOut} (use --force to overwrite)`);
|
|
398
|
+
}
|
|
399
|
+
const content = renderDefaultConfigTs({
|
|
400
|
+
endpoint: overrides?.endpoint ?? 'https://my-hasura.example.com/v1/graphql',
|
|
401
|
+
fileNamePattern: overrides?.fileNamePattern ?? 'dtv.generated.{viewId}.ts',
|
|
402
|
+
include: ['src/**/*.{ts,tsx}'],
|
|
403
|
+
exclude: ['**/*.test.*', '**/node_modules/**'],
|
|
404
|
+
dtvImport: overrides?.dtvImport ?? '@kronor/dtv'
|
|
405
|
+
});
|
|
406
|
+
await writeFileEnsuringDir(absOut, content);
|
|
407
|
+
console.log(`Wrote ${absOut}`);
|
|
408
|
+
}
|
|
409
|
+
function applyFileNamePattern(pattern, view) {
|
|
410
|
+
return pattern
|
|
411
|
+
.replace(/\{viewId\}/g, view.viewId)
|
|
412
|
+
.replace(/\{collectionName\}/g, view.collectionName);
|
|
413
|
+
}
|
|
414
|
+
async function runTypegen(configPath) {
|
|
415
|
+
const config = await loadConfig(configPath);
|
|
416
|
+
const views = await scanViews(config);
|
|
417
|
+
if (views.length === 0) {
|
|
418
|
+
throw new Error('No views found. Ensure Config.scan.include matches files that import DSL from your configured DTV specifier and call DSL.view({ ... }).');
|
|
419
|
+
}
|
|
420
|
+
const schema = await fetchSchema(config.schema.endpoint, config.schema.headers ?? {});
|
|
421
|
+
const queryType = schema.getQueryType();
|
|
422
|
+
if (!queryType)
|
|
423
|
+
throw new Error('Schema has no Query type');
|
|
424
|
+
const queryFields = queryType.getFields();
|
|
425
|
+
// Resolve view -> row type
|
|
426
|
+
const viewRows = views.map(v => {
|
|
427
|
+
const f = queryFields[v.collectionName];
|
|
428
|
+
if (!f) {
|
|
429
|
+
const sample = Object.keys(queryFields).slice(0, 25);
|
|
430
|
+
throw new Error(`View "${v.viewId}" references collectionName "${v.collectionName}" but it was not found on Query. `
|
|
431
|
+
+ `Sample Query fields: ${sample.join(', ')}${sample.length === 25 ? ', ...' : ''}`);
|
|
432
|
+
}
|
|
433
|
+
const rowNamed = unwrapCollectionElementType(f.type);
|
|
434
|
+
return {
|
|
435
|
+
...v,
|
|
436
|
+
rowTypeName: rowNamed.name
|
|
437
|
+
};
|
|
438
|
+
});
|
|
439
|
+
const outputFiles = new Set();
|
|
440
|
+
for (const v of viewRows) {
|
|
441
|
+
const root = schema.getType(v.rowTypeName);
|
|
442
|
+
if (!root || Array.isArray(root)) {
|
|
443
|
+
throw new Error(`Could not resolve row type "${v.rowTypeName}" in schema for view "${v.viewId}"`);
|
|
444
|
+
}
|
|
445
|
+
const reachable = collectReachableTypes(schema, [root]);
|
|
446
|
+
const viewTypeName = `${toPascalCase(v.viewId)}Row`;
|
|
447
|
+
const fileName = applyFileNamePattern(config.output.fileNamePattern, v);
|
|
448
|
+
if (!fileName.endsWith('.ts')) {
|
|
449
|
+
throw new Error(`Config.output.fileNamePattern must produce a .ts file name. Got: ${fileName}`);
|
|
450
|
+
}
|
|
451
|
+
const outFile = path.join(path.dirname(v.sourceFile), fileName);
|
|
452
|
+
if (outputFiles.has(outFile)) {
|
|
453
|
+
throw new Error(`Multiple views would write the same output file: ${outFile}`);
|
|
454
|
+
}
|
|
455
|
+
outputFiles.add(outFile);
|
|
456
|
+
const content = [
|
|
457
|
+
renderTsFromSchema(reachable, {
|
|
458
|
+
scalars: config.scalars,
|
|
459
|
+
includeGraphqlTypeComments: config.debug?.includeGraphqlTypeComments === true,
|
|
460
|
+
exportTypes: false
|
|
461
|
+
}).trimEnd(),
|
|
462
|
+
'',
|
|
463
|
+
`export type ${viewTypeName} = ${v.rowTypeName};`,
|
|
464
|
+
''
|
|
465
|
+
].join('\n');
|
|
466
|
+
await writeFileEnsuringDir(outFile, content);
|
|
467
|
+
}
|
|
468
|
+
console.log(`Generated types for ${viewRows.length} view(s).`);
|
|
469
|
+
}
|
|
470
|
+
const program = new Command();
|
|
471
|
+
program
|
|
472
|
+
.name('dtv')
|
|
473
|
+
.description('DTV CLI')
|
|
474
|
+
.version('0.0.0');
|
|
475
|
+
program
|
|
476
|
+
.command('typegen')
|
|
477
|
+
.description('Generate TypeScript types from a Hasura GraphQL schema')
|
|
478
|
+
.option('-c, --config <path>', 'Path to dtv.config.ts', 'dtv.config.ts')
|
|
479
|
+
.action(async (opts) => {
|
|
480
|
+
try {
|
|
481
|
+
await runTypegen(opts.config);
|
|
482
|
+
}
|
|
483
|
+
catch (e) {
|
|
484
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
485
|
+
console.error(msg);
|
|
486
|
+
process.exitCode = 1;
|
|
487
|
+
}
|
|
488
|
+
});
|
|
489
|
+
program
|
|
490
|
+
.command('init')
|
|
491
|
+
.description('Generate a dtv.config.ts template in the current project')
|
|
492
|
+
.option('-o, --out <path>', 'Output config file path', 'dtv.config.ts')
|
|
493
|
+
.option('--force', 'Overwrite if the file already exists', false)
|
|
494
|
+
.option('--endpoint <url>', 'Hasura GraphQL endpoint to prefill', 'https://my-hasura.example.com/v1/graphql')
|
|
495
|
+
.option('--file-pattern <pattern>', 'Output file name pattern written next to each view module', 'dtv.generated.{viewId}.ts')
|
|
496
|
+
.option('--dtv-import <specifier>', 'Module specifier used by views to import DSL', '@kronor/dtv')
|
|
497
|
+
.action(async (opts) => {
|
|
498
|
+
try {
|
|
499
|
+
await runInitConfig(opts.out, opts.force, {
|
|
500
|
+
endpoint: opts.endpoint,
|
|
501
|
+
fileNamePattern: opts.filePattern,
|
|
502
|
+
dtvImport: opts.dtvImport
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
catch (e) {
|
|
506
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
507
|
+
console.error(msg);
|
|
508
|
+
process.exitCode = 1;
|
|
509
|
+
}
|
|
510
|
+
});
|
|
511
|
+
program.parse(process.argv);
|
|
512
|
+
//# sourceMappingURL=dtv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dtv.js","sourceRoot":"","sources":["../../src/cli/dtv.ts"],"names":[],"mappings":"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"}
|