@snowplow/snowtype 0.16.0 → 0.17.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.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use strict";var di=Object.create;var he=Object.defineProperty;var li=Object.getOwnPropertyDescriptor;var gi=Object.getOwnPropertyNames;var mi=Object.getPrototypeOf,fi=Object.prototype.hasOwnProperty;var hi=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of gi(e))!fi.call(t,o)&&o!==n&&he(t,o,{get:()=>e[o],enumerable:!(i=li(e,o))||i.enumerable});return t};var h=(t,e,n)=>(n=t!=null?di(mi(t)):{},hi(e||!t||!t.__esModule?he(n,"default",{value:t,enumerable:!0}):n,t));var qn=h(require("process")),$=require("@commander-js/extra-typings");var Si={AuthError:"Authentication failed. Check if your API key and organization ID are correct.",ConfigAlreadyExists:"Snowtype config file already exists.",ConfigNotExists:"Snowtype config file does not exist in current directory. Start with running 'init'.",ConfigInvalid:"Snowtype config exists but it is invalid.",InternalError:"An internal error occured.",InvalidOption:"Invalid option provided.",MissingOptions:"Action called with no options.",WriteLockFile:"Failed writing lock file.",ReadLockFile:"Lock file is invalid or corrupted. Please recover it or delete it, and run `snowtype generate` so a new one will be created.",GenerationFailed:"Something went wrong with code generation.",PatchingNotSupported:"Patching is only supported using a Snowtype config file in JSON format.",DevNotAllowed:"Code generation using schemas in DEV environment not allowed. Publish the schemas and retry.",AuthCredentialsMissing:"Required API key credentials not detected. Please refer to https://docs.snowplow.io/docs/collecting-data/code-generation/using-the-cli/#authenticating-with-the-console"},vi="Please report a bug.",y=class extends Error{code;constructor(e,n=""){let i=Si[e].concat(n);super(i),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=e}},ut=class extends y{constructor(){super("GenerationFailed")}},tt=class extends y{constructor(){super("ConfigAlreadyExists")}},dt=class extends y{constructor(){super("ConfigNotExists")}},lt=class extends y{constructor(e){super("ConfigInvalid",e)}},gt=class extends y{constructor(e){super("InternalError",e.concat(vi))}},B=class extends y{constructor(e,n){let i=`Value ${n} is an invalid ${e}.`;super("InvalidOption",i)}},mt=class extends y{constructor(){super("MissingOptions")}},O=class extends y{constructor(){super("AuthError")}},H=class extends y{constructor(){super("WriteLockFile")}},ft=class extends y{constructor(e){super("ReadLockFile",` ${e}`)}},ht=class extends y{constructor(){super("PatchingNotSupported")}},St=class extends y{constructor(){super("DevNotAllowed")}},vt=class extends y{constructor(){super("AuthCredentialsMissing")}};var Se=h(require("got"));async function ve({schema:t}){return(await(0,Se.default)(`https://raw.githubusercontent.com/snowplow/iglu-central/master/schemas/${t.replace("iglu:","")}`)).body}var rt=h(require("got"));var xe=require("js-sha256"),Gt=h(require("node:assert"));var u=h(require("joi")),Et=require("@snowplow/snowtype-core");var Ut=h(require("node:assert"));var et="snowtype.config",yt=".js",wt=".ts",It=".json",ye=Object.freeze([yt,wt,It]),J=".snowtype-lock.json",_t="snowplow";var nt={"google-tag-manager":[{value:"javascript-gtm",name:"JavaScript"}],"@snowplow/javascript-tracker":[{value:"javascript",name:"JavaScript"}],"@snowplow/browser-tracker":[{value:"javascript",name:"JavaScript"},{value:"typescript",name:"TypeScript"}],"@snowplow/node-tracker":[{value:"javascript",name:"JavaScript"},{value:"typescript",name:"TypeScript"}],"snowplow-android-tracker":[{value:"kotlin",name:"Kotlin"}],"snowplow-ios-tracker":[{value:"swift",name:"Swift"}],"snowplow-golang-tracker":[{value:"go",name:"Go"}],"@snowplow/react-native-tracker":[{value:"typescript",name:"TypeScript"}],"snowplow-flutter-tracker":[{value:"dart",name:"Dart"}],"snowplow-java-tracker":[{value:"java",name:"Java"}]},we={commands:{generate:{instructions:!1,validations:!1,disallowDevSchemas:!1,deprecateOnlyOnProdAvailableUpdates:!1},update:{maximumBump:"major",showOnlyProdUpdates:!1,regenerateOnUpdate:!1},patch:{regenerateOnPatch:!1}}},Ie=["iglu:com.snowplowanalytics.snowplow/page_ping/jsonschema/1-0-0","iglu:com.snowplowanalytics.snowplow/link_click/jsonschema/1-0-1","iglu:com.snowplowanalytics.snowplow/page_view/jsonschema/1-0-0","iglu:com.snowplowanalytics.mobile/screen_view/jsonschema/1-0-0","iglu:com.snowplowanalytics.snowplow/button_click/jsonschema/1-0-0","iglu:com.snowplowanalytics.snowplow/application_background/jsonschema/1-0-0","iglu:com.snowplowanalytics.snowplow/application_foreground/jsonschema/1-0-0","iglu:com.snowplowanalytics.mobile/application_install/jsonschema/1-0-0","iglu:com.snowplowanalytics.mobile/screen_end/jsonschema/1-0-0","iglu:com.snowplowanalytics.snowplow/custom_event/jsonschema/1-0-0","iglu:com.snowplowanalytics.snowplow/expose_element/jsonschema/1-0-0","iglu:com.snowplowanalytics.snowplow/create_element/jsonschema/1-0-0"],Ee="iglu:com.snowplowanalytics.snowplow.ecommerce";var Pt=require("lodash");function Ce(t){let e=t.split("-");(0,Ut.default)(e.length===3,"invalid SchemaVer"),(0,Ut.default)(e.filter(n=>isNaN(parseInt(n))).length===0,"invalid SchemaVer")}function k(t){t.options=(0,Pt.merge)((0,Pt.cloneDeep)(we),t.options||{})}var Pe=new RegExp("^iglu:[a-zA-Z0-9-_.]+/[a-zA-Z0-9-_]+/[a-zA-Z0-9-_]+/[0-9]+-[0-9]+-[0-9]+$"),yi=new RegExp("^[A-Z][a-zA-Z0-9]*$"),wi=u.default.object().required().keys({tracker:u.default.string().required().valid(...Et.trackerTemplates),language:u.default.string().required().valid(...Et.languageIds),outpath:u.default.string().required(),namespace:u.default.when("language",{is:"swift",then:u.default.string().regex(yi).optional(),otherwise:u.default.forbidden().messages({"any.unknown":"namespace is only supported for 'swift' language"})}),organizationId:u.default.string().when("dataStructures",{is:u.default.array().min(1),then:u.default.required(),otherwise:u.default.optional()}).when("eventSpecificationIds",{is:u.default.array().min(1),then:u.default.required(),otherwise:u.default.optional()}).when("dataProductIds",{is:u.default.array().min(1),then:u.default.required(),otherwise:u.default.optional()}),igluCentralSchemas:u.default.array().optional().items(u.default.string().regex(Pe)),repositories:u.default.array().optional().items(u.default.string()),dataStructures:u.default.array().optional().items(u.default.string().regex(Pe)),eventSpecificationIds:u.default.array().optional().items(u.default.string()),dataProductIds:u.default.array().optional().items(u.default.string()),options:u.default.object().optional().keys({commands:u.default.object().optional().keys({generate:u.default.object().optional().keys({instructions:u.default.boolean().optional(),validations:u.default.boolean().optional(),disallowDevSchemas:u.default.boolean().optional(),deprecateOnlyOnProdAvailableUpdates:u.default.boolean().optional()}),patch:u.default.object().optional().keys({regenerateOnPatch:u.default.boolean().optional()}),update:u.default.object().optional().keys({maximumBump:u.default.string().valid("major","minor","patch").optional(),regenerateOnUpdate:u.default.boolean().optional(),showOnlyProdUpdates:u.default.boolean().optional()})})})}),K=t=>{let e=wi.validate(t,{abortEarly:!1,convert:!1});if(e.error)throw new lt(e.error.annotate());return t};function Ii(t){let e=xe.sha256.create();return e.update(t),e.hex()}function Ae(t,e){let{vendor:n,name:i,format:o}=T(t);return Ii(`${e}-${n}-${i}-${o}`)}function T(t){let e=t.replace("iglu:",""),[n,i,o,r]=e.split("/");return(0,Gt.default)(typeof n=="string"&&typeof i=="string"&&typeof o=="string"&&typeof r=="string",`invalid iglu uri ${t}`),Ce(r),{vendor:n,name:i,format:o,version:r}}function De(t,{vendor:e,name:n,format:i,version:o}){let r=t.replace("iglu:",""),[a,s,c,p]=r.split("/");return`iglu:${e||a}/${n||s}/${i||c}/${o||p}`}function be(t){return t.some(e=>e.eventSchema.isEcomTemplateSchema)}function it(t){let[e,n,i]=t.split("-").map(o=>parseInt(o));return{model:e,revision:n,addition:i}}function Oe(t,e,n=0){if(t===e&&n!==0)return"patch";let{model:i,revision:o,addition:r}=it(t),{model:a,revision:s,addition:c}=it(e);if(i!==a)return"major";if(o!==s)return"minor";if(r!==c)return"patch";(0,Gt.default)(!1,"SchemaVer checking went wrong")}var ot=class extends Error{response;constructor(e){let n=e.response?.statusCode||0,{method:i,url:o}=e.options,r=e.response?.body||e.message,a=[[n,i,o].filter(Boolean).join(" "),r].filter(Boolean).join(`
2
- `);super(a),this.response={statusCode:n,body:r}}};function zt(t){return!!Object.hasOwn(t||{},"response")}var j="0.16.0";var ke=h(require("p-limit")),A=class t{apiKeyId;apiKey;organizationId;accessToken;pLimit;dataProductsCache=new Map;eventSpecsCache=new Map;schemaVersionsDraftsCache=new Map;schemaVersionsDevCache=new Map;schemaVersionsProdCache=new Map;sourceApplicationsCache=new Map;apiUrl=process.env.SNOWPLOW_CONSOLE_API_URL||"https://console.snowplowanalytics.com/api/msc";constructor({apiKeyId:e,apiKey:n,organizationId:i,requestLimit:o=20}){this.apiKeyId=e,this.apiKey=n,this.organizationId=i,this.pLimit=(0,ke.default)(o)}static async create(e){let n=new t(e);return await n.initialize(e),n}static createLazy(e){return new t(e)}async initialize(e){await this.fetchAccessToken(),e.enableSupportForNonDataProductsTier?await Promise.all([this.bulkFetchAllSchemaDraftsVersions(),this.bulkFetchAllSchemaVersions("DEV"),this.bulkFetchAllSchemaVersions("PROD")]):await Promise.all([this.bulkFetchAllDataProducts(),this.bulkFetchAllEventSpecifications(),this.bulkFetchAllSchemaDraftsVersions(),this.bulkFetchAllSchemaVersions("DEV"),this.bulkFetchAllSchemaVersions("PROD")])}async bulkFetchAllDataProducts(){let e=`${this.apiUrl}/v1/organizations/${this.organizationId}/data-products/v2`,n=await this.fetchResource(e);n.data.forEach(i=>this.dataProductsCache.set(i.id,i)),n.includes.sourceApplications?.forEach(i=>{this.sourceApplicationsCache.set(i.id,i)})}async bulkFetchAllEventSpecifications(){let e=`${this.apiUrl}/v1/organizations/${this.organizationId}/event-specs/v1`,n=await this.fetchResource(e);n.data.forEach(i=>{let o={...n.metadata,outdatedDsWarnings:n.metadata?.outdatedDsWarnings.filter(a=>a.id===i.id)||[],hiddenDsWarnings:n.metadata?.hiddenDsWarnings.filter(a=>a.id===i.id)||[],metrics:n.metadata?.metrics.filter(a=>a.id===i.id)||[]},r={data:i,metadata:o};this.eventSpecsCache.set(i.id,r)})}async bulkFetchAllSchemaVersions(e){let n=`${this.apiUrl}/v1/organizations/${this.organizationId}/data-structures/v1/schemas/versions?env=${e}`,i=await this.fetchResource(n),o=e==="DEV"?this.schemaVersionsDevCache:this.schemaVersionsProdCache;i.forEach(r=>{let a=`iglu:${r.self.vendor}/${r.self.name}/${r.self.format}/${r.self.version}`;o.set(a,r)})}async bulkFetchAllSchemaDraftsVersions(){let e=`${this.apiUrl}/v1/organizations/${this.organizationId}/data-structure-drafts/v1/schemas`,n=await this.fetchResource(e),i=this.schemaVersionsDraftsCache;n.forEach(o=>{let r=`iglu:${o.self.vendor}/${o.self.name}/${o.self.format}/${o.self.version}`;i.set(r,o)})}async fetchAccessToken(){if(this.accessToken)return this.accessToken;let e=`${this.apiUrl}/v1/organizations/${this.organizationId}/credentials/v3/token`,{accessToken:n}=await(0,rt.default)(e,{headers:{"X-API-Key-Id":this.apiKeyId,"X-API-Key":this.apiKey,"X-Snowtype":j}}).json();return this.accessToken=n,n}fetchResource(e){return this.pLimit(async()=>{try{let n=await this.fetchAccessToken();return await(0,rt.default)(e,{headers:{Authorization:"Bearer "+n,"X-Snowtype":j}}).json()}catch(n){throw zt(n)?new ot(n):n}})}postResource(e,n){return this.pLimit(async()=>{try{let i=await this.fetchAccessToken();return await rt.default.post(e,{headers:{Authorization:"Bearer "+i,"X-Snowtype":j},json:n}).json()}catch(i){throw zt(i)?new ot(i):i}})}getSchemaVersion({schema:e,env:n="DEV"}){return(n==="DEV"?this.schemaVersionsDevCache:this.schemaVersionsProdCache).get(e)??(()=>{throw new Error(`Schema ${e} not found in ${n} environment`)})()}getAllSchemaDraftVersion(){return this.schemaVersionsDraftsCache}async fetchDeployments({schema:e,deploymentEnv:n}){let i=Ae(e,this.organizationId),o=25,r=[],a=!0,s=0,c=p=>`${this.apiUrl}/v1/organizations/${this.organizationId}/data-structures/v1/${i}/deployments?size=${o}&from=${p}${n?`&env=${n}`:""}`;for(;a;){let p=await this.fetchResource(c(s));s+=o,r=r.concat(p),p.length===0&&(a=!1)}return r}getEventSpecificationById(e){let n=this.eventSpecsCache.get(e)??(()=>{throw new Error(`Event specification ${e} not found`)})();return{data:n.data,metadata:n.metadata}}async fetchImageVariant({imageId:e,imageVariant:n}){let i=`${this.apiUrl}/v1/organizations/${this.organizationId}/images/v1/${e}/${n}`,o=await this.fetchAccessToken();return(0,rt.default)(i,{headers:{Authorization:"Bearer "+o,"X-Snowtype":j}})}getDataProductById(e){let n=this.dataProductsCache.get(e)??(()=>{throw new Error(`Data product ${e} not found`)})(),i=(n.sourceApplications||[]).map(o=>this.sourceApplicationsCache.get(o)).filter(Boolean);return{data:[n],includes:{sourceApplications:i}}}async batchFetchEventSpecifications(e){if(e.length===0)return;let n=`${this.apiUrl}/v1/organizations/${this.organizationId}/event-specs/v1/versions`;(await this.postResource(n,{eventSpecifications:e})).data.forEach(o=>{let r=this.eventSpecsCache.get(o.id);this.eventSpecsCache.set(o.id,{data:o,metadata:r?.metadata??{outdatedDsWarnings:[],hiddenDsWarnings:[],metrics:[]}})})}async authenticate(){try{return await this.fetchAccessToken(),!0}catch{return!1}}};var F=require("path"),I=require("fs");var Xt=h(require("util")),Yt=require("tsx/cjs/api");var W=(()=>{let t="json";return{setFormat:i=>t=i,getFormat:()=>t}})();var bt=require("@snowplow/snowtype-core");var xt=require("fs");var Ct=h(require("node:assert"));var Te=require("semver");function Fe(t,e,n){try{let i=(0,xt.readFileSync)(n,{encoding:"utf-8"}),o=JSON.parse(i);return o[t].some(a=>a===e)||o[t].push(e),(0,xt.writeFileSync)(n,Jt(o)),!0}catch(i){return console.error(i),!1}}var Ei=(t,e)=>{let{model:n,revision:i,addition:o}=it(t.version),{model:r,revision:a,addition:s}=it(e.version);return(0,Ct.default)(n!==void 0&&i!==void 0&&o!==void 0&&r!==void 0&&a!==void 0&&s!==void 0,`Invalid version number comparing (${t}, ${e})`),n>r?1:n<r?-1:i>a?1:i<a?-1:o>s?1:o<s?-1:t.patchLevel>e.patchLevel&&t.contentHash!==e.contentHash?1:e.patchLevel>t.patchLevel&&t.contentHash!==e.contentHash||t.env==="DEV"&&e.env==="PROD"?-1:t.env==="PROD"&&e.env==="DEV"?1:0};async function Le(t,e,n,i){return(await Promise.all(e.map(async r=>{let{version:a}=T(r),s=await t.fetchDeployments({schema:r,...i&&{deploymentEnv:"PROD"}}),c=Pi(s,a,n);c.sort(Ei);let p=c.pop();if(!p)return null;let d={previous:r,next:De(r,{version:p.version}),nextEnv:p.env};return p.version!==a?{...d,nextReason:"version"}:p.patchLevel>0&&p.env==="DEV"?{...d,nextReason:"patch"}:null}))).flatMap(r=>r===null?[]:[r])}async function Bt(t,e){return Promise.all(e.map(async n=>{try{t.getSchemaVersion({schema:n,env:"PROD"})}catch(i){if(i.response?.statusCode===404||i.message?.includes("not found in PROD environment"))try{return t.getSchemaVersion({schema:n,env:"DEV"}),n}catch(r){if(!(r.response?.statusCode===404||r.message?.includes("not found in DEV environment")))throw r}}return null})).then(n=>n.flatMap(i=>i!==null?[i]:[]))}async function Re(t,e,n){let{eventSpecifications:i}=n,o={};return await Promise.all(e.map(async r=>{let a=!(r in i),s=i[r]??0,c=t.getEventSpecificationById(r).data;if((0,Ct.default)(!!c,`failed to fetch event spec ${r}`),(0,Ct.default)(c.version!=null,`event spec with no version ${r}`),!c.event?.source)return r;let p=[c.event?.source,...c.entities?.tracked?.map(l=>l.source)||[]].flatMap(l=>typeof l=="string"?[l]:[]),d=await Bt(t,p);return(a||(c.version??0)>s)&&(o[r]={previous:s,next:c.version??0,isNew:a,devOnlySchema:d}),r})),o}function Pi(t,e,n){return t.filter(i=>Ht(e,i.version)!==1).filter(i=>i.version!==e||i.patchLevel).map(i=>({...i,updateType:Oe(i.version,e,i.patchLevel)})).filter(Ci(n))}function Ci(t){return({updateType:e})=>{switch(t){case"major":return!0;case"minor":return e==="patch"||e==="minor";case"patch":return e==="patch"}}}function Ht(t,e){let n=t.replaceAll("-","."),i=e.replaceAll("-",".");return(0,Te.compare)(n,i)}var Ne=require("cli-spinner"),w=h(require("chalk"));function Ve(){let t=new Ne.Spinner;return t.setSpinnerString(18),t}var xi="https://snowplow.io",Ai="https://docs.snowplow.io/docs/collecting-data/code-generation/",at={SUCCESS:"\u2714",LOG:"\u2139",DEBUG:"\u27A4",ERROR:"\u2717",WARN:"\u26A0"},je={LINK:"#9911BB",OPTION:"#9911DD"};function $e(t){return w.default.hex(je.LINK).bold(t)}function M(t){return w.default.hex(je.OPTION).italic(t)}function At(t,e){return t==="h1"?w.default.bold.underline(e):w.default.bold(e)}function We(){return`
2
+ `);super(a),this.response={statusCode:n,body:r}}};function zt(t){return!!Object.hasOwn(t||{},"response")}var j="0.17.0";var ke=h(require("p-limit")),A=class t{apiKeyId;apiKey;organizationId;accessToken;pLimit;dataProductsCache=new Map;eventSpecsCache=new Map;schemaVersionsDraftsCache=new Map;schemaVersionsDevCache=new Map;schemaVersionsProdCache=new Map;sourceApplicationsCache=new Map;apiUrl=process.env.SNOWPLOW_CONSOLE_API_URL||"https://console.snowplowanalytics.com/api/msc";constructor({apiKeyId:e,apiKey:n,organizationId:i,requestLimit:o=20}){this.apiKeyId=e,this.apiKey=n,this.organizationId=i,this.pLimit=(0,ke.default)(o)}static async create(e){let n=new t(e);return await n.initialize(e),n}static createLazy(e){return new t(e)}async initialize(e){await this.fetchAccessToken(),e.enableSupportForNonDataProductsTier?await Promise.all([this.bulkFetchAllSchemaDraftsVersions(),this.bulkFetchAllSchemaVersions("DEV"),this.bulkFetchAllSchemaVersions("PROD")]):await Promise.all([this.bulkFetchAllDataProducts(),this.bulkFetchAllEventSpecifications(),this.bulkFetchAllSchemaDraftsVersions(),this.bulkFetchAllSchemaVersions("DEV"),this.bulkFetchAllSchemaVersions("PROD")])}async bulkFetchAllDataProducts(){let e=`${this.apiUrl}/v1/organizations/${this.organizationId}/data-products/v2`,n=await this.fetchResource(e);n.data.forEach(i=>this.dataProductsCache.set(i.id,i)),n.includes.sourceApplications?.forEach(i=>{this.sourceApplicationsCache.set(i.id,i)})}async bulkFetchAllEventSpecifications(){let e=`${this.apiUrl}/v1/organizations/${this.organizationId}/event-specs/v1`,n=await this.fetchResource(e);n.data.forEach(i=>{let o={...n.metadata,outdatedDsWarnings:n.metadata?.outdatedDsWarnings.filter(a=>a.id===i.id)||[],hiddenDsWarnings:n.metadata?.hiddenDsWarnings.filter(a=>a.id===i.id)||[],metrics:n.metadata?.metrics.filter(a=>a.id===i.id)||[]},r={data:i,metadata:o};this.eventSpecsCache.set(i.id,r)})}async bulkFetchAllSchemaVersions(e){let n=`${this.apiUrl}/v1/organizations/${this.organizationId}/data-structures/v1/schemas/versions?env=${e}`,i=await this.fetchResource(n),o=e==="DEV"?this.schemaVersionsDevCache:this.schemaVersionsProdCache;i.forEach(r=>{let a=`iglu:${r.self.vendor}/${r.self.name}/${r.self.format}/${r.self.version}`;o.set(a,r)})}async bulkFetchAllSchemaDraftsVersions(){let e=`${this.apiUrl}/v1/organizations/${this.organizationId}/data-structure-drafts/v1/schemas`,n=await this.fetchResource(e),i=this.schemaVersionsDraftsCache;n.forEach(o=>{let r=`iglu:${o.self.vendor}/${o.self.name}/${o.self.format}/${o.self.version}`;i.set(r,o)})}async fetchAccessToken(){if(this.accessToken)return this.accessToken;let e=`${this.apiUrl}/v1/organizations/${this.organizationId}/credentials/v3/token`,{accessToken:n}=await(0,rt.default)(e,{headers:{"X-API-Key-Id":this.apiKeyId,"X-API-Key":this.apiKey,"X-Snowtype":j}}).json();return this.accessToken=n,n}fetchResource(e){return this.pLimit(async()=>{try{let n=await this.fetchAccessToken();return await(0,rt.default)(e,{headers:{Authorization:"Bearer "+n,"X-Snowtype":j}}).json()}catch(n){throw zt(n)?new ot(n):n}})}postResource(e,n){return this.pLimit(async()=>{try{let i=await this.fetchAccessToken();return await rt.default.post(e,{headers:{Authorization:"Bearer "+i,"X-Snowtype":j},json:n}).json()}catch(i){throw zt(i)?new ot(i):i}})}getSchemaVersion({schema:e,env:n="DEV"}){return(n==="DEV"?this.schemaVersionsDevCache:this.schemaVersionsProdCache).get(e)??(()=>{throw new Error(`Schema ${e} not found in ${n} environment`)})()}getAllSchemaDraftVersion(){return this.schemaVersionsDraftsCache}async fetchDeployments({schema:e,deploymentEnv:n}){let i=Ae(e,this.organizationId),o=25,r=[],a=!0,s=0,c=p=>`${this.apiUrl}/v1/organizations/${this.organizationId}/data-structures/v1/${i}/deployments?size=${o}&from=${p}${n?`&env=${n}`:""}`;for(;a;){let p=await this.fetchResource(c(s));s+=o,r=r.concat(p),p.length===0&&(a=!1)}return r}getEventSpecificationById(e){let n=this.eventSpecsCache.get(e)??(()=>{throw new Error(`Event specification ${e} not found`)})();return{data:n.data,metadata:n.metadata}}async fetchImageVariant({imageId:e,imageVariant:n}){let i=`${this.apiUrl}/v1/organizations/${this.organizationId}/images/v1/${e}/${n}`,o=await this.fetchAccessToken();return(0,rt.default)(i,{headers:{Authorization:"Bearer "+o,"X-Snowtype":j}})}getDataProductById(e){let n=this.dataProductsCache.get(e)??(()=>{throw new Error(`Data product ${e} not found`)})(),i=(n.sourceApplications||[]).map(o=>this.sourceApplicationsCache.get(o)).filter(Boolean);return{data:[n],includes:{sourceApplications:i}}}async batchFetchEventSpecifications(e){if(e.length===0)return;let n=`${this.apiUrl}/v1/organizations/${this.organizationId}/event-specs/v1/versions`;(await this.postResource(n,{eventSpecifications:e})).data.forEach(o=>{let r=this.eventSpecsCache.get(o.id);this.eventSpecsCache.set(o.id,{data:o,metadata:r?.metadata??{outdatedDsWarnings:[],hiddenDsWarnings:[],metrics:[]}})})}async authenticate(){try{return await this.fetchAccessToken(),!0}catch{return!1}}};var F=require("path"),I=require("fs");var Xt=h(require("util")),Yt=require("tsx/cjs/api");var W=(()=>{let t="json";return{setFormat:i=>t=i,getFormat:()=>t}})();var bt=require("@snowplow/snowtype-core");var xt=require("fs");var Ct=h(require("node:assert"));var Te=require("semver");function Fe(t,e,n){try{let i=(0,xt.readFileSync)(n,{encoding:"utf-8"}),o=JSON.parse(i);return o[t].some(a=>a===e)||o[t].push(e),(0,xt.writeFileSync)(n,Jt(o)),!0}catch(i){return console.error(i),!1}}var Ei=(t,e)=>{let{model:n,revision:i,addition:o}=it(t.version),{model:r,revision:a,addition:s}=it(e.version);return(0,Ct.default)(n!==void 0&&i!==void 0&&o!==void 0&&r!==void 0&&a!==void 0&&s!==void 0,`Invalid version number comparing (${t}, ${e})`),n>r?1:n<r?-1:i>a?1:i<a?-1:o>s?1:o<s?-1:t.patchLevel>e.patchLevel&&t.contentHash!==e.contentHash?1:e.patchLevel>t.patchLevel&&t.contentHash!==e.contentHash||t.env==="DEV"&&e.env==="PROD"?-1:t.env==="PROD"&&e.env==="DEV"?1:0};async function Le(t,e,n,i){return(await Promise.all(e.map(async r=>{let{version:a}=T(r),s=await t.fetchDeployments({schema:r,...i&&{deploymentEnv:"PROD"}}),c=Pi(s,a,n);c.sort(Ei);let p=c.pop();if(!p)return null;let d={previous:r,next:De(r,{version:p.version}),nextEnv:p.env};return p.version!==a?{...d,nextReason:"version"}:p.patchLevel>0&&p.env==="DEV"?{...d,nextReason:"patch"}:null}))).flatMap(r=>r===null?[]:[r])}async function Bt(t,e){return Promise.all(e.map(async n=>{try{t.getSchemaVersion({schema:n,env:"PROD"})}catch(i){if(i.response?.statusCode===404||i.message?.includes("not found in PROD environment"))try{return t.getSchemaVersion({schema:n,env:"DEV"}),n}catch(r){if(!(r.response?.statusCode===404||r.message?.includes("not found in DEV environment")))throw r}}return null})).then(n=>n.flatMap(i=>i!==null?[i]:[]))}async function Re(t,e,n){let{eventSpecifications:i}=n,o={};return await Promise.all(e.map(async r=>{let a=!(r in i),s=i[r]??0,c=t.getEventSpecificationById(r).data;if((0,Ct.default)(!!c,`failed to fetch event spec ${r}`),(0,Ct.default)(c.version!=null,`event spec with no version ${r}`),!c.event?.source)return r;let p=[c.event?.source,...c.entities?.tracked?.map(l=>l.source)||[]].flatMap(l=>typeof l=="string"?[l]:[]),d=await Bt(t,p);return(a||(c.version??0)>s)&&(o[r]={previous:s,next:c.version??0,isNew:a,devOnlySchema:d}),r})),o}function Pi(t,e,n){return t.filter(i=>Ht(e,i.version)!==1).filter(i=>i.version!==e||i.patchLevel).map(i=>({...i,updateType:Oe(i.version,e,i.patchLevel)})).filter(Ci(n))}function Ci(t){return({updateType:e})=>{switch(t){case"major":return!0;case"minor":return e==="patch"||e==="minor";case"patch":return e==="patch"}}}function Ht(t,e){let n=t.replaceAll("-","."),i=e.replaceAll("-",".");return(0,Te.compare)(n,i)}var Ne=require("cli-spinner"),w=h(require("chalk"));function Ve(){let t=new Ne.Spinner;return t.setSpinnerString(18),t}var xi="https://snowplow.io",Ai="https://docs.snowplow.io/docs/collecting-data/code-generation/",at={SUCCESS:"\u2714",LOG:"\u2139",DEBUG:"\u27A4",ERROR:"\u2717",WARN:"\u26A0"},je={LINK:"#9911BB",OPTION:"#9911DD"};function $e(t){return w.default.hex(je.LINK).bold(t)}function M(t){return w.default.hex(je.OPTION).italic(t)}function At(t,e){return t==="h1"?w.default.bold.underline(e):w.default.bold(e)}function We(){return`
3
3
  ${At("h1","CLI Help")}
4
4
 
5
5
  For more information visit the Snowplow website ${$e(xi)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@snowplow/snowtype",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "description": "A code generator CLI for faster and type-safe Snowplow tracking code",
5
5
  "author": "Peter Perlepes <peter@snowplowanalytics.com>",
6
6
  "homepage": "https://snowplow.io/",
@@ -14,7 +14,7 @@
14
14
  "dependencies": {
15
15
  "@commander-js/extra-typings": "^11.1.0",
16
16
  "@inquirer/prompts": "^8.2.0",
17
- "@snowplow/snowtype-core": "^0.16.0",
17
+ "@snowplow/snowtype-core": "^0.17.0",
18
18
  "chalk": "^4.1.2",
19
19
  "cli-spinner": "^0.2.10",
20
20
  "dotenv": "^16.3.1",