@transcend-io/cli 8.34.0 → 8.34.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/{api-keys-CDp8NUhN.cjs → api-keys-CQHYfnKg.cjs} +2 -2
- package/dist/{api-keys-CDp8NUhN.cjs.map → api-keys-CQHYfnKg.cjs.map} +1 -1
- package/dist/{app-rVGy2Ks-.cjs → app-DMYdPEeE.cjs} +18 -18
- package/dist/{app-rVGy2Ks-.cjs.map → app-DMYdPEeE.cjs.map} +1 -1
- package/dist/bin/bash-complete.cjs +1 -1
- package/dist/bin/cli.cjs +1 -1
- package/dist/bin/deprecated-command.cjs +1 -1
- package/dist/{code-scanning-BwfVNIHr.cjs → code-scanning-DjzRqe2Q.cjs} +2 -2
- package/dist/{code-scanning-BwfVNIHr.cjs.map → code-scanning-DjzRqe2Q.cjs.map} +1 -1
- package/dist/{command-3fhEz5PC.cjs → command-CQS4sg_3.cjs} +2 -2
- package/dist/{command-3fhEz5PC.cjs.map → command-CQS4sg_3.cjs.map} +1 -1
- package/dist/{consent-manager-DXWjvCtI.cjs → consent-manager-BplE7hDG.cjs} +2 -2
- package/dist/{consent-manager-DXWjvCtI.cjs.map → consent-manager-BplE7hDG.cjs.map} +1 -1
- package/dist/{constants-B-TmLA0w.cjs → constants-C2Ve1XaG.cjs} +2 -2
- package/dist/{constants-B-TmLA0w.cjs.map → constants-C2Ve1XaG.cjs.map} +1 -1
- package/dist/{cron-DQHN57v7.cjs → cron-BU5K5zwR.cjs} +2 -2
- package/dist/{cron-DQHN57v7.cjs.map → cron-BU5K5zwR.cjs.map} +1 -1
- package/dist/{data-inventory-flXV6qPl.cjs → data-inventory-CoAdyyxS.cjs} +2 -2
- package/dist/{data-inventory-flXV6qPl.cjs.map → data-inventory-CoAdyyxS.cjs.map} +1 -1
- package/dist/{dataFlowsToDataSilos-Lk7WQ39V.cjs → dataFlowsToDataSilos-DNzVrcGl.cjs} +2 -2
- package/dist/{dataFlowsToDataSilos-Lk7WQ39V.cjs.map → dataFlowsToDataSilos-DNzVrcGl.cjs.map} +1 -1
- package/dist/{impl-80GXtjmz.cjs → impl-7ZiJ8tQR.cjs} +2 -2
- package/dist/{impl-80GXtjmz.cjs.map → impl-7ZiJ8tQR.cjs.map} +1 -1
- package/dist/{impl-E1vzeNmp.cjs → impl-B36KTjnJ.cjs} +2 -2
- package/dist/{impl-E1vzeNmp.cjs.map → impl-B36KTjnJ.cjs.map} +1 -1
- package/dist/{impl-DoP4FUJI.cjs → impl-B4z6A2Aa.cjs} +2 -2
- package/dist/{impl-DoP4FUJI.cjs.map → impl-B4z6A2Aa.cjs.map} +1 -1
- package/dist/{impl-t_fZSUcj.cjs → impl-BBntVWRD.cjs} +2 -2
- package/dist/{impl-t_fZSUcj.cjs.map → impl-BBntVWRD.cjs.map} +1 -1
- package/dist/{impl-BjsBvvGF.cjs → impl-BIlbiOgY.cjs} +2 -2
- package/dist/{impl-BjsBvvGF.cjs.map → impl-BIlbiOgY.cjs.map} +1 -1
- package/dist/{impl-Cw7Jxx0V.cjs → impl-BKkiE384.cjs} +2 -2
- package/dist/{impl-Cw7Jxx0V.cjs.map → impl-BKkiE384.cjs.map} +1 -1
- package/dist/{impl-CZmlwib3.cjs → impl-BOaq2MA8.cjs} +2 -2
- package/dist/{impl-CZmlwib3.cjs.map → impl-BOaq2MA8.cjs.map} +1 -1
- package/dist/{impl-8PlQ3Cvy.cjs → impl-BWunvHHR.cjs} +2 -2
- package/dist/{impl-8PlQ3Cvy.cjs.map → impl-BWunvHHR.cjs.map} +1 -1
- package/dist/{impl-CCeEUy6z.cjs → impl-BYr3VngT.cjs} +2 -2
- package/dist/{impl-CCeEUy6z.cjs.map → impl-BYr3VngT.cjs.map} +1 -1
- package/dist/{impl-CaSO2LPb.cjs → impl-Bbzjk8q9.cjs} +2 -2
- package/dist/{impl-CaSO2LPb.cjs.map → impl-Bbzjk8q9.cjs.map} +1 -1
- package/dist/{impl-B4iI3rcF.cjs → impl-BcviCK8B.cjs} +2 -2
- package/dist/{impl-B4iI3rcF.cjs.map → impl-BcviCK8B.cjs.map} +1 -1
- package/dist/{impl-TQVXJemY.cjs → impl-BiiO-h6Y.cjs} +2 -2
- package/dist/{impl-TQVXJemY.cjs.map → impl-BiiO-h6Y.cjs.map} +1 -1
- package/dist/{impl-DX7gLoTo.cjs → impl-BosASPXe.cjs} +2 -2
- package/dist/{impl-DX7gLoTo.cjs.map → impl-BosASPXe.cjs.map} +1 -1
- package/dist/{impl-B6qG10UZ.cjs → impl-C4ss2ucp.cjs} +2 -2
- package/dist/{impl-B6qG10UZ.cjs.map → impl-C4ss2ucp.cjs.map} +1 -1
- package/dist/{impl-EEKe6HmF.cjs → impl-C9s0TQEw.cjs} +2 -2
- package/dist/{impl-EEKe6HmF.cjs.map → impl-C9s0TQEw.cjs.map} +1 -1
- package/dist/{impl-CtMVi5m1.cjs → impl-CA0qacrn.cjs} +2 -2
- package/dist/{impl-CtMVi5m1.cjs.map → impl-CA0qacrn.cjs.map} +1 -1
- package/dist/{impl-DrNWIvMG.cjs → impl-CCk0wXqs.cjs} +2 -2
- package/dist/{impl-DrNWIvMG.cjs.map → impl-CCk0wXqs.cjs.map} +1 -1
- package/dist/{impl-CrsHy3BZ.cjs → impl-CH3uHqRx.cjs} +2 -2
- package/dist/{impl-CrsHy3BZ.cjs.map → impl-CH3uHqRx.cjs.map} +1 -1
- package/dist/{impl-CaUSDPuW.cjs → impl-CIlOM3O6.cjs} +2 -2
- package/dist/{impl-CaUSDPuW.cjs.map → impl-CIlOM3O6.cjs.map} +1 -1
- package/dist/{impl-2u3q0rji.cjs → impl-CSMb-dkf.cjs} +2 -2
- package/dist/{impl-2u3q0rji.cjs.map → impl-CSMb-dkf.cjs.map} +1 -1
- package/dist/{impl-D0r4dSxM.cjs → impl-CXeNJIcH.cjs} +2 -2
- package/dist/{impl-D0r4dSxM.cjs.map → impl-CXeNJIcH.cjs.map} +1 -1
- package/dist/{impl-BJ8i_gqQ.cjs → impl-CXuqOTan.cjs} +2 -2
- package/dist/{impl-BJ8i_gqQ.cjs.map → impl-CXuqOTan.cjs.map} +1 -1
- package/dist/impl-CYLFESAX.cjs +2 -0
- package/dist/impl-CYLFESAX.cjs.map +1 -0
- package/dist/{impl-CzO7dqsL.cjs → impl-Cb8Eeujp.cjs} +2 -2
- package/dist/{impl-CzO7dqsL.cjs.map → impl-Cb8Eeujp.cjs.map} +1 -1
- package/dist/{impl-3ih-x09b.cjs → impl-CeV8WYuh.cjs} +2 -2
- package/dist/{impl-3ih-x09b.cjs.map → impl-CeV8WYuh.cjs.map} +1 -1
- package/dist/{impl-DjTjLgew.cjs → impl-CkmSG5-u.cjs} +2 -2
- package/dist/{impl-DjTjLgew.cjs.map → impl-CkmSG5-u.cjs.map} +1 -1
- package/dist/{impl-CwPRkBc0.cjs → impl-CpL-FXaD.cjs} +2 -2
- package/dist/{impl-CwPRkBc0.cjs.map → impl-CpL-FXaD.cjs.map} +1 -1
- package/dist/{impl-CpoSlP1o.cjs → impl-CuXmpSTK.cjs} +2 -2
- package/dist/{impl-CpoSlP1o.cjs.map → impl-CuXmpSTK.cjs.map} +1 -1
- package/dist/{impl-BZc5cmdE.cjs → impl-CudBe_Op.cjs} +2 -2
- package/dist/{impl-BZc5cmdE.cjs.map → impl-CudBe_Op.cjs.map} +1 -1
- package/dist/{impl-BqyO4vYa.cjs → impl-Cvpx0VQw.cjs} +2 -2
- package/dist/{impl-BqyO4vYa.cjs.map → impl-Cvpx0VQw.cjs.map} +1 -1
- package/dist/{impl-C2_oQebA.cjs → impl-D28UvIJR.cjs} +2 -2
- package/dist/{impl-C2_oQebA.cjs.map → impl-D28UvIJR.cjs.map} +1 -1
- package/dist/{impl-BuJNWbOW.cjs → impl-D3PocYdg.cjs} +2 -2
- package/dist/{impl-BuJNWbOW.cjs.map → impl-D3PocYdg.cjs.map} +1 -1
- package/dist/{impl-B1p9GNrM.cjs → impl-DHHbDwM6.cjs} +2 -2
- package/dist/{impl-B1p9GNrM.cjs.map → impl-DHHbDwM6.cjs.map} +1 -1
- package/dist/{impl-Bc9DMV-V.cjs → impl-DLUb2c_k.cjs} +2 -2
- package/dist/{impl-Bc9DMV-V.cjs.map → impl-DLUb2c_k.cjs.map} +1 -1
- package/dist/{impl-DcQ_HfDZ.cjs → impl-DZPUKAOh.cjs} +2 -2
- package/dist/{impl-DcQ_HfDZ.cjs.map → impl-DZPUKAOh.cjs.map} +1 -1
- package/dist/{impl-DOmKR8yz.cjs → impl-Dbvahnag.cjs} +2 -2
- package/dist/{impl-DOmKR8yz.cjs.map → impl-Dbvahnag.cjs.map} +1 -1
- package/dist/{impl-CUkxcZrf.cjs → impl-DyUn0CY0.cjs} +2 -2
- package/dist/{impl-CUkxcZrf.cjs.map → impl-DyUn0CY0.cjs.map} +1 -1
- package/dist/{impl-DvlAq8xf.cjs → impl-HxQkbH-v.cjs} +2 -2
- package/dist/{impl-DvlAq8xf.cjs.map → impl-HxQkbH-v.cjs.map} +1 -1
- package/dist/{impl-Bsqlw8_g.cjs → impl-XGErHk8S.cjs} +2 -2
- package/dist/{impl-Bsqlw8_g.cjs.map → impl-XGErHk8S.cjs.map} +1 -1
- package/dist/{impl-DBnRvkUi.cjs → impl-gZA9IzRe.cjs} +2 -2
- package/dist/{impl-DBnRvkUi.cjs.map → impl-gZA9IzRe.cjs.map} +1 -1
- package/dist/{impl-b6KwZ74o.cjs → impl-l4-zrJDk.cjs} +2 -2
- package/dist/{impl-b6KwZ74o.cjs.map → impl-l4-zrJDk.cjs.map} +1 -1
- package/dist/{impl-Cc-Lfiig.cjs → impl-mn91PHXE.cjs} +2 -2
- package/dist/{impl-Cc-Lfiig.cjs.map → impl-mn91PHXE.cjs.map} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +12 -10
- package/dist/{manual-enrichment-Y_BQaSZQ.cjs → manual-enrichment-NFVrfdss.cjs} +2 -2
- package/dist/{manual-enrichment-Y_BQaSZQ.cjs.map → manual-enrichment-NFVrfdss.cjs.map} +1 -1
- package/dist/{pooling-Ct83vfEh.cjs → pooling-EYc9IiSf.cjs} +2 -2
- package/dist/{pooling-Ct83vfEh.cjs.map → pooling-EYc9IiSf.cjs.map} +1 -1
- package/dist/{preference-management-5uJDKuMK.cjs → preference-management-BvvoySGZ.cjs} +2 -2
- package/dist/{preference-management-5uJDKuMK.cjs.map → preference-management-BvvoySGZ.cjs.map} +1 -1
- package/dist/{syncConfigurationToTranscend-Bpge5AcC.cjs → syncConfigurationToTranscend-CpoC4raI.cjs} +176 -176
- package/dist/syncConfigurationToTranscend-CpoC4raI.cjs.map +1 -0
- package/dist/{uploadConsents-CJc_6Qwd.cjs → uploadConsents-BVjLnCTQ.cjs} +2 -2
- package/dist/{uploadConsents-CJc_6Qwd.cjs.map → uploadConsents-BVjLnCTQ.cjs.map} +1 -1
- package/package.json +1 -1
- package/dist/impl-NdV_MRsm.cjs +0 -2
- package/dist/impl-NdV_MRsm.cjs.map +0 -1
- package/dist/syncConfigurationToTranscend-Bpge5AcC.cjs.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`./enums-CBXlBJii.cjs`),t=require(`./constants-
|
|
2
|
-
//# sourceMappingURL=uploadConsents-
|
|
1
|
+
const e=require(`./enums-CBXlBJii.cjs`),t=require(`./constants-C2Ve1XaG.cjs`),n=require(`./syncConfigurationToTranscend-CpoC4raI.cjs`),r=require(`./logger-BaHHbWVd.cjs`);let i=require(`@transcend-io/type-utils`),a=require(`colors`);a=e.s(a);let o=require(`io-ts`);o=e.s(o);let s=require(`cli-progress`);s=e.s(s);let c=require(`crypto`);c=e.s(c);let l=require(`jsonwebtoken`);l=e.s(l);function u(e,t,n){let r=Buffer.from(n,`base64`),i=Buffer.from(t,`base64`),a=Buffer.from(`A65959A6`,`hex`),o=c.createCipheriv(`id-aes256-wrap-pad`,i,a),s={encryptedIdentifier:Buffer.concat([o.update(e),o.final()]).toString(`base64`)};return l.sign(s,r,{algorithm:`HS384`})}const d=/^[0-9][Y|N]([Y|N])[Y|N]$/,f=o.record(o.string,o.union([o.boolean,o.literal(`Auto`)]));async function p({base64EncryptionKey:e,base64SigningKey:o,preferences:c,partition:l,concurrency:p=100,transcendUrl:m=t.o}){let h=n.$r(m),g=c.filter(e=>e.usp&&!d.test(e.usp));if(g.length>0)throw Error(`Received invalid usp strings: ${JSON.stringify(g,null,2)}`);let _=c.map((e,t)=>[e,t]).filter(([e])=>{if(!e.purposes)return!1;try{return(0,i.decodeCodec)(f,e.purposes),!1}catch{return!0}});if(_.length>0)throw Error(`Received invalid purpose maps: ${JSON.stringify(_,null,2)}`);let v=c.filter(e=>!e.usp&&!e.purposes);if(v.length>0)throw Error(`Received invalid inputs, expected either purposes or usp to be defined: ${JSON.stringify(v,null,2)}`);r.t.info(a.default.magenta(`Uploading ${c.length} user preferences to partition ${l}`));let y=new Date().getTime(),b=new s.default.SingleBar({},s.default.Presets.shades_classic),x=0;b.start(c.length,0),await n.Ts(c,async({userId:t,confirmed:n=`true`,updated:s,prompted:c,purposes:p,...m})=>{let g=u(t,e,o),[,_]=m.usp&&d.exec(m.usp)||[],v={token:g,partition:l,consent:{confirmed:n===`true`,purposes:p?(0,i.decodeCodec)(f,p):m.usp?{SaleOfInfo:_===`Y`}:{},...s?{updated:s===`true`}:{},...c?{prompted:c===`true`}:{},...m}};try{await h.post(`sync`,{json:v}).json()}catch(e){try{let t=JSON.parse(e?.response?.body||`{}`);t.error&&r.t.error(a.default.red(`Error: ${t.error}`))}catch{}throw Error(`Received an error from server: ${e?.response?.body||e?.message}`)}x+=1,b.update(x)},{concurrency:p}),b.stop();let S=new Date().getTime()-y;r.t.info(a.default.green(`Successfully uploaded ${c.length} user preferences to partition ${l} in "${S/1e3}" seconds!`))}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return f}});
|
|
2
|
+
//# sourceMappingURL=uploadConsents-BVjLnCTQ.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadConsents-
|
|
1
|
+
{"version":3,"file":"uploadConsents-BVjLnCTQ.cjs","names":["jwt","t","DEFAULT_TRANSCEND_CONSENT_API","createTranscendConsentGotInstance","cliProgress","map"],"sources":["../src/lib/consent-manager/createConsentToken.ts","../src/lib/consent-manager/uploadConsents.ts"],"sourcesContent":["import * as crypto from 'crypto';\nimport * as jwt from 'jsonwebtoken';\n\n/**\n * Function to create a consent manager token\n *\n * @see https://docs.transcend.io/docs/consent/reference/managed-consent-database\n * @param userId - User ID\n * @param base64EncryptionKey - Encryption key\n * @param base64SigningKey - Signing key\n * @returns Token\n */\nexport function createConsentToken(\n userId: string,\n base64EncryptionKey: string,\n base64SigningKey: string,\n): string {\n // Read on for where to find these keys\n const signingKey = Buffer.from(base64SigningKey, 'base64');\n const encryptionKey = Buffer.from(base64EncryptionKey, 'base64');\n\n // NIST's AES-KWP implementation { aes 48 } - see https://tools.ietf.org/html/rfc5649\n const encryptionAlgorithm = 'id-aes256-wrap-pad';\n // Initial Value for AES-KWP integrity check - see https://tools.ietf.org/html/rfc5649#section-3\n const iv = Buffer.from('A65959A6', 'hex');\n // Set up encryption algorithm\n const cipher = crypto.createCipheriv(encryptionAlgorithm, encryptionKey, iv);\n\n // Encrypt the userId and base64-encode the result\n const encryptedIdentifier = Buffer.concat([\n cipher.update(userId),\n cipher.final(),\n ]).toString('base64');\n\n // Create the JWT content - jwt.sign will add a 'iat' (issued at) field to the payload\n // If you wanted to add something manually, consider\n // const issued: Date = new Date();\n // const isoDate = issued.toISOString();\n const jwtPayload = {\n encryptedIdentifier,\n };\n\n // Create a JSON web token and HMAC it with SHA-384\n const consentToken = jwt.sign(jwtPayload, signingKey, {\n algorithm: 'HS384',\n });\n\n return consentToken;\n}\n","import { createTranscendConsentGotInstance } from '../graphql';\nimport colors from 'colors';\nimport * as t from 'io-ts';\nimport { DEFAULT_TRANSCEND_CONSENT_API } from '../../constants';\nimport { map } from '../bluebird';\nimport { createConsentToken } from './createConsentToken';\nimport { logger } from '../../logger';\nimport cliProgress from 'cli-progress';\nimport { decodeCodec } from '@transcend-io/type-utils';\nimport type { ConsentPreferenceUpload } from './types';\nimport { ConsentPreferencesBody } from '@transcend-io/airgap.js-types';\n\nexport const USP_STRING_REGEX = /^[0-9][Y|N]([Y|N])[Y|N]$/;\n\nexport const PurposeMap = t.record(\n t.string,\n t.union([t.boolean, t.literal('Auto')]),\n);\n\n/**\n * Upload a set of consent preferences\n *\n * @param options - Options\n */\nexport async function uploadConsents({\n base64EncryptionKey,\n base64SigningKey,\n preferences,\n partition,\n concurrency = 100,\n transcendUrl = DEFAULT_TRANSCEND_CONSENT_API,\n}: {\n /** base64 encryption key */\n base64EncryptionKey: string;\n /** base64 signing key */\n base64SigningKey: string;\n /** Partition key */\n partition: string;\n /** Sombra API key authentication */\n preferences: ConsentPreferenceUpload[];\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Concurrency limit for approving */\n concurrency?: number;\n}): Promise<void> {\n // Create connection to API\n const transcendConsentApi = createTranscendConsentGotInstance(transcendUrl);\n\n // Ensure usp strings are valid\n const invalidUspStrings = preferences.filter(\n (pref) => pref.usp && !USP_STRING_REGEX.test(pref.usp),\n );\n if (invalidUspStrings.length > 0) {\n throw new Error(\n `Received invalid usp strings: ${JSON.stringify(\n invalidUspStrings,\n null,\n 2,\n )}`,\n );\n }\n\n // Ensure purpose maps are valid\n const invalidPurposeMaps = preferences\n .map((pref, ind) => [pref, ind] as [ConsentPreferenceUpload, number])\n .filter(([pref]) => {\n if (!pref.purposes) {\n return false;\n }\n try {\n decodeCodec(PurposeMap, pref.purposes);\n return false;\n } catch {\n return true;\n }\n });\n if (invalidPurposeMaps.length > 0) {\n throw new Error(\n `Received invalid purpose maps: ${JSON.stringify(\n invalidPurposeMaps,\n null,\n 2,\n )}`,\n );\n }\n\n // Ensure usp or preferences are provided\n const invalidInputs = preferences.filter(\n (pref) => !pref.usp && !pref.purposes,\n );\n if (invalidInputs.length > 0) {\n throw new Error(\n `Received invalid inputs, expected either purposes or usp to be defined: ${JSON.stringify(\n invalidInputs,\n null,\n 2,\n )}`,\n );\n }\n\n logger.info(\n colors.magenta(\n `Uploading ${preferences.length} user preferences to partition ${partition}`,\n ),\n );\n\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar(\n {},\n cliProgress.Presets.shades_classic,\n );\n\n // Build a GraphQL client\n let total = 0;\n progressBar.start(preferences.length, 0);\n await map(\n preferences,\n async ({\n userId,\n confirmed = 'true',\n updated,\n prompted,\n purposes,\n ...consent\n }) => {\n const token = createConsentToken(\n userId,\n base64EncryptionKey,\n base64SigningKey,\n );\n\n // parse usp string\n const [, saleStatus] = consent.usp\n ? USP_STRING_REGEX.exec(consent.usp) || []\n : [];\n\n const input = {\n token,\n partition,\n consent: {\n confirmed: confirmed === 'true',\n purposes: purposes\n ? decodeCodec(PurposeMap, purposes)\n : consent.usp\n ? { SaleOfInfo: saleStatus === 'Y' }\n : {},\n ...(updated ? { updated: updated === 'true' } : {}),\n ...(prompted ? { prompted: prompted === 'true' } : {}),\n ...consent,\n },\n } as ConsentPreferencesBody;\n\n // Make the request\n try {\n await transcendConsentApi\n .post('sync', {\n json: input,\n })\n .json();\n } catch (err) {\n try {\n const parsed = JSON.parse(err?.response?.body || '{}');\n if (parsed.error) {\n logger.error(colors.red(`Error: ${parsed.error}`));\n }\n } catch (e) {\n // continue\n }\n throw new Error(\n `Received an error from server: ${\n err?.response?.body || err?.message\n }`,\n );\n }\n\n total += 1;\n progressBar.update(total);\n },\n { concurrency },\n );\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n logger.info(\n colors.green(\n `Successfully uploaded ${\n preferences.length\n } user preferences to partition ${partition} in \"${\n totalTime / 1000\n }\" seconds!`,\n ),\n );\n}\n"],"mappings":"gYAYA,SAAgB,EACd,EACA,EACA,EACQ,CAER,IAAM,EAAa,OAAO,KAAK,EAAkB,SAAS,CACpD,EAAgB,OAAO,KAAK,EAAqB,SAAS,CAK1D,EAAK,OAAO,KAAK,WAAY,MAAM,CAEnC,EAAS,EAAO,eAAe,qBAAqB,EAAe,EAAG,CAYtE,EAAa,CACjB,oBAV0B,OAAO,OAAO,CACxC,EAAO,OAAO,EAAO,CACrB,EAAO,OAAO,CACf,CAAC,CAAC,SAAS,SAAS,CAQpB,CAOD,OAJqBA,EAAI,KAAK,EAAY,EAAY,CACpD,UAAW,QACZ,CAAC,CCjCJ,MAAa,EAAmB,2BAEnB,EAAaC,EAAE,OAC1BA,EAAE,OACFA,EAAE,MAAM,CAACA,EAAE,QAASA,EAAE,QAAQ,OAAO,CAAC,CAAC,CACxC,CAOD,eAAsB,EAAe,CACnC,sBACA,mBACA,cACA,YACA,cAAc,IACd,eAAeC,EAAAA,GAcC,CAEhB,IAAM,EAAsBC,EAAAA,GAAkC,EAAa,CAGrE,EAAoB,EAAY,OACnC,GAAS,EAAK,KAAO,CAAC,EAAiB,KAAK,EAAK,IAAI,CACvD,CACD,GAAI,EAAkB,OAAS,EAC7B,MAAU,MACR,iCAAiC,KAAK,UACpC,EACA,KACA,EACD,GACF,CAIH,IAAM,EAAqB,EACxB,KAAK,EAAM,IAAQ,CAAC,EAAM,EAAI,CAAsC,CACpE,QAAQ,CAAC,KAAU,CAClB,GAAI,CAAC,EAAK,SACR,MAAO,GAET,GAAI,CAEF,OADA,EAAA,EAAA,aAAY,EAAY,EAAK,SAAS,CAC/B,QACD,CACN,MAAO,KAET,CACJ,GAAI,EAAmB,OAAS,EAC9B,MAAU,MACR,kCAAkC,KAAK,UACrC,EACA,KACA,EACD,GACF,CAIH,IAAM,EAAgB,EAAY,OAC/B,GAAS,CAAC,EAAK,KAAO,CAAC,EAAK,SAC9B,CACD,GAAI,EAAc,OAAS,EACzB,MAAU,MACR,2EAA2E,KAAK,UAC9E,EACA,KACA,EACD,GACF,CAGH,EAAA,EAAO,KACL,EAAA,QAAO,QACL,aAAa,EAAY,OAAO,iCAAiC,IAClE,CACF,CAGD,IAAM,EAAK,IAAI,MAAM,CAAC,SAAS,CAEzB,EAAc,IAAIC,EAAAA,QAAY,UAClC,EAAE,CACFA,EAAAA,QAAY,QAAQ,eACrB,CAGG,EAAQ,EACZ,EAAY,MAAM,EAAY,OAAQ,EAAE,CACxC,MAAMC,EAAAA,GACJ,EACA,MAAO,CACL,SACA,YAAY,OACZ,UACA,WACA,WACA,GAAG,KACC,CACJ,IAAM,EAAQ,EACZ,EACA,EACA,EACD,CAGK,EAAG,GAAc,EAAQ,KAC3B,EAAiB,KAAK,EAAQ,IAAI,EAClC,EAAE,CAEA,EAAQ,CACZ,QACA,YACA,QAAS,CACP,UAAW,IAAc,OACzB,SAAU,GAAA,EAAA,EAAA,aACM,EAAY,EAAS,CACjC,EAAQ,IACR,CAAE,WAAY,IAAe,IAAK,CAClC,EAAE,CACN,GAAI,EAAU,CAAE,QAAS,IAAY,OAAQ,CAAG,EAAE,CAClD,GAAI,EAAW,CAAE,SAAU,IAAa,OAAQ,CAAG,EAAE,CACrD,GAAG,EACJ,CACF,CAGD,GAAI,CACF,MAAM,EACH,KAAK,OAAQ,CACZ,KAAM,EACP,CAAC,CACD,MAAM,OACF,EAAK,CACZ,GAAI,CACF,IAAM,EAAS,KAAK,MAAM,GAAK,UAAU,MAAQ,KAAK,CAClD,EAAO,OACT,EAAA,EAAO,MAAM,EAAA,QAAO,IAAI,UAAU,EAAO,QAAQ,CAAC,MAE1C,EAGZ,MAAU,MACR,kCACE,GAAK,UAAU,MAAQ,GAAK,UAE/B,CAGH,GAAS,EACT,EAAY,OAAO,EAAM,EAE3B,CAAE,cAAa,CAChB,CAED,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SAAS,CACR,EAEvB,EAAA,EAAO,KACL,EAAA,QAAO,MACL,yBACE,EAAY,OACb,iCAAiC,EAAU,OAC1C,EAAY,IACb,YACF,CACF"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"author": "Transcend Inc.",
|
|
3
3
|
"name": "@transcend-io/cli",
|
|
4
4
|
"description": "A command line interface for programmatic operations across Transcend.",
|
|
5
|
-
"version": "8.34.
|
|
5
|
+
"version": "8.34.1",
|
|
6
6
|
"homepage": "https://github.com/transcend-io/cli",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
package/dist/impl-NdV_MRsm.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./enums-CBXlBJii.cjs`);require(`./constants-B-TmLA0w.cjs`);const t=require(`./syncConfigurationToTranscend-Bpge5AcC.cjs`),n=require(`./logger-BaHHbWVd.cjs`);require(`./buildAIIntegrationType-n_Qlv8wG.cjs`);const r=require(`./pooling-Ct83vfEh.cjs`),i=require(`./done-input-validation-Cgk5kNBs.cjs`);let a=require(`colors`);a=e.s(a);async function o(){let e=Number(process.env.WORKER_ID||`0`);n.t.info(`[w${e}] ready pid=${process.pid}`),process.send?.({type:`ready`}),process.on(`message`,async r=>{if(!r||typeof r!=`object`||(r.type===`shutdown`&&process.exit(0),r.type!==`task`))return;let{filePath:i,options:a}=r.payload,{outputDir:o,clearOutputDir:s}=a;try{n.t.info(`[w${e}] processing ${i}`),await t.b({filePath:i,outputDir:o,clearOutputDir:s,onProgress:(e,t)=>process.send?.({type:`progress`,payload:{filePath:i,processed:e,total:t}})}),process.send?.({type:`result`,payload:{ok:!0,filePath:i}})}catch(r){let a=t.O(r);n.t.error(`[w${e}] ERROR ${i}: ${r.stack||a}`),process.send?.({type:`result`,payload:{ok:!1,filePath:i,error:a}})}}),await new Promise(()=>{})}function s(e){return r.r(e)}function c(e){return r.i(e)}const l={renderHeader:s,renderWorkers:c};function u(){return typeof __filename<`u`?__filename:process.argv[1]}async function d(e){i.t(this.process.exit);let{directory:o,outputDir:s,clearOutputDir:c,concurrency:d,viewerMode:f}=e,p=t.x(o,this),{poolSize:m,cpuCount:h}=r.s(d,p.length);n.t.info(a.default.green(`Converting ${p.length} Parquet file(s) → CSV with pool size ${m} (CPU=${h})`));let g=p.map(e=>({filePath:e,options:{outputDir:s,clearOutputDir:c}}));await r.n({title:`Parquet → CSV - ${o}`,baseDir:o||s||process.cwd(),childFlag:r.o,childModulePath:u(),poolSize:m,cpuCount:h,filesTotal:p.length,hooks:{nextTask:()=>g.shift(),taskLabel:e=>e.filePath,initTotals:()=>({}),initSlotProgress:()=>void 0,onProgress:e=>e,onResult:(e,t)=>({totals:e,ok:!!t.ok}),postProcess:async()=>{}},viewerMode:f,render:e=>r.a(e,l,f),extraKeyHandler:({logsBySlot:e,repaint:t,setPaused:n})=>r.t({logsBySlot:e,repaint:t,setPaused:n})})}process.argv.includes(r.o)&&o().catch(e=>{n.t.error(e),process.exit(1)}),exports.parquetToCsv=d;
|
|
2
|
-
//# sourceMappingURL=impl-NdV_MRsm.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"impl-NdV_MRsm.cjs","names":["parquetToCsvOneFile","extractErrorMessage","makeHeader","makeWorkerRows","collectParquetFilesOrExit","computePoolSize","runPool","CHILD_FLAG","dashboardPlugin","createExtraKeyHandler"],"sources":["../src/commands/admin/parquet-to-csv/worker.ts","../src/commands/admin/parquet-to-csv/ui/plugin.ts","../src/commands/admin/parquet-to-csv/impl.ts"],"sourcesContent":["import { parquetToCsvOneFile, extractErrorMessage } from '../../../lib/helpers';\nimport type { ToWorker } from '../../../lib/pooling';\nimport { logger } from '../../../logger';\n\nexport type ParquetTask = {\n /** Absolute path of the Parquet file to convert. */\n filePath: string;\n options: {\n /** Optional directory where CSV output files should be written. */\n outputDir?: string;\n /** Whether to clear any pre-existing output before writing new ones. */\n clearOutputDir: boolean;\n };\n};\n\nexport type ParquetProgress = {\n /** File being processed by the worker. */\n filePath: string;\n /** Rows processed so far. */\n processed: number;\n /** Optional known total rows (not always available). */\n total?: number;\n};\n\nexport type ParquetResult = {\n ok: boolean;\n filePath: string;\n error?: string;\n};\n\n/**\n * Worker loop: convert a single Parquet file to one or more CSV files.\n */\nexport async function runChild(): Promise<void> {\n const workerId = Number(process.env.WORKER_ID || '0');\n logger.info(`[w${workerId}] ready pid=${process.pid}`);\n process.send?.({ type: 'ready' });\n\n process.on('message', async (msg: ToWorker<ParquetTask>) => {\n if (!msg || typeof msg !== 'object') return;\n\n if (msg.type === 'shutdown') {\n process.exit(0);\n }\n if (msg.type !== 'task') return;\n\n const { filePath, options } = msg.payload;\n const { outputDir, clearOutputDir } = options;\n\n try {\n logger.info(`[w${workerId}] processing ${filePath}`);\n await parquetToCsvOneFile({\n filePath,\n outputDir,\n clearOutputDir,\n onProgress: (processed, total) =>\n process.send?.({\n type: 'progress',\n payload: { filePath, processed, total },\n }),\n });\n\n process.send?.({\n type: 'result',\n payload: { ok: true, filePath },\n });\n } catch (err) {\n const message = extractErrorMessage(err);\n logger.error(`[w${workerId}] ERROR ${filePath}: ${err.stack || message}`);\n process.send?.({\n type: 'result',\n payload: { ok: false, filePath, error: message },\n });\n }\n });\n\n // keep alive until shutdown\n await new Promise<never>(() => {\n // Do nothing\n });\n}\n","import {\n makeHeader,\n makeWorkerRows,\n type ChunkSlotProgress,\n type CommonCtx,\n type DashboardPlugin,\n} from '../../../../lib/pooling';\n\n/**\n * Header for parquet-to-csv (no extra totals block).\n *\n * @param ctx - Dashboard context.\n * @returns Header lines.\n */\nfunction renderHeader<TTotals>(\n ctx: CommonCtx<TTotals, ChunkSlotProgress>,\n): string[] {\n // no extra lines — reuse the shared header as-is\n return makeHeader(ctx);\n}\n\n/**\n * Worker rows for parquet-to-csv — share the generic row renderer.\n *\n * @param ctx - Dashboard context.\n * @returns Array of strings, each representing one worker row.\n */\nfunction renderWorkers<TTotals>(\n ctx: CommonCtx<TTotals, ChunkSlotProgress>,\n): string[] {\n return makeWorkerRows(ctx);\n}\n\nexport const parquetToCsvPlugin: DashboardPlugin<unknown, ChunkSlotProgress> = {\n renderHeader,\n renderWorkers,\n // no extras\n};\n","import type { LocalContext } from '../../../context';\nimport colors from 'colors';\nimport { logger } from '../../../logger';\nimport { collectParquetFilesOrExit } from '../../../lib/helpers';\nimport {\n computePoolSize,\n createExtraKeyHandler,\n CHILD_FLAG,\n type PoolHooks,\n runPool,\n dashboardPlugin,\n} from '../../../lib/pooling';\nimport {\n runChild,\n type ParquetProgress,\n type ParquetResult,\n type ParquetTask,\n} from './worker';\nimport { parquetToCsvPlugin } from './ui';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation';\n\n/**\n * Returns the current module's path so the worker pool knows what file to re-exec.\n * In Node ESM, __filename is undefined, so we fall back to argv[1].\n *\n * @returns The current module's path.\n */\nfunction getCurrentModulePath(): string {\n if (typeof __filename !== 'undefined') {\n return __filename as unknown as string;\n }\n return process.argv[1];\n}\n\n/** No custom totals for the header; the runner’s built-ins suffice. */\ntype Totals = Record<string, never>;\n\nexport type ParquetToCsvCommandFlags = {\n directory: string;\n outputDir?: string;\n clearOutputDir: boolean;\n concurrency?: number;\n viewerMode: boolean;\n};\n\n/**\n * Convert all Parquet files in a directory to CSV, in parallel.\n *\n * @param flags - The command flags.\n */\nexport async function parquetToCsv(\n this: LocalContext,\n flags: ParquetToCsvCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process.exit);\n\n const { directory, outputDir, clearOutputDir, concurrency, viewerMode } =\n flags;\n\n /* 1) Discover .parquet inputs */\n const files = collectParquetFilesOrExit(directory, this);\n\n /* 2) Size the pool */\n const { poolSize, cpuCount } = computePoolSize(concurrency, files.length);\n\n logger.info(\n colors.green(\n `Converting ${files.length} Parquet file(s) → CSV with pool size ${poolSize} (CPU=${cpuCount})`,\n ),\n );\n\n /* 3) Build FIFO queue of tasks (one per file) */\n const queue = files.map<ParquetTask>((filePath) => ({\n filePath,\n options: { outputDir, clearOutputDir },\n }));\n\n /* 4) Pool hooks */\n const hooks: PoolHooks<ParquetTask, ParquetProgress, ParquetResult, Totals> =\n {\n nextTask: () => queue.shift(),\n taskLabel: (t) => t.filePath,\n initTotals: () => ({} as Totals),\n initSlotProgress: () => undefined,\n onProgress: (totals) => totals,\n onResult: (totals, res) => ({ totals, ok: !!res.ok }),\n postProcess: async () => {\n // nothing special post-run\n },\n };\n\n /* 5) Launch the pool runner with custom dashboard plugin */\n await runPool({\n title: `Parquet → CSV - ${directory}`,\n baseDir: directory || outputDir || process.cwd(),\n childFlag: CHILD_FLAG,\n childModulePath: getCurrentModulePath(),\n poolSize,\n cpuCount,\n filesTotal: files.length,\n hooks,\n viewerMode,\n render: (input) => dashboardPlugin(input, parquetToCsvPlugin, viewerMode),\n extraKeyHandler: ({ logsBySlot, repaint, setPaused }) =>\n createExtraKeyHandler({ logsBySlot, repaint, setPaused }),\n });\n}\n\n/* -------------------------------------------------------------------------------------------------\n * If invoked directly as a child process, enter worker loop\n * ------------------------------------------------------------------------------------------------- */\nif (process.argv.includes(CHILD_FLAG)) {\n runChild().catch((err) => {\n logger.error(err);\n process.exit(1);\n });\n}\n"],"mappings":"4VAiCA,eAAsB,GAA0B,CAC9C,IAAM,EAAW,OAAO,QAAQ,IAAI,WAAa,IAAI,CACrD,EAAA,EAAO,KAAK,KAAK,EAAS,cAAc,QAAQ,MAAM,CACtD,QAAQ,OAAO,CAAE,KAAM,QAAS,CAAC,CAEjC,QAAQ,GAAG,UAAW,KAAO,IAA+B,CAM1D,GALI,CAAC,GAAO,OAAO,GAAQ,WAEvB,EAAI,OAAS,YACf,QAAQ,KAAK,EAAE,CAEb,EAAI,OAAS,QAAQ,OAEzB,GAAM,CAAE,WAAU,WAAY,EAAI,QAC5B,CAAE,YAAW,kBAAmB,EAEtC,GAAI,CACF,EAAA,EAAO,KAAK,KAAK,EAAS,eAAe,IAAW,CACpD,MAAMA,EAAAA,EAAoB,CACxB,WACA,YACA,iBACA,YAAa,EAAW,IACtB,QAAQ,OAAO,CACb,KAAM,WACN,QAAS,CAAE,WAAU,YAAW,QAAO,CACxC,CAAC,CACL,CAAC,CAEF,QAAQ,OAAO,CACb,KAAM,SACN,QAAS,CAAE,GAAI,GAAM,WAAU,CAChC,CAAC,OACK,EAAK,CACZ,IAAM,EAAUC,EAAAA,EAAoB,EAAI,CACxC,EAAA,EAAO,MAAM,KAAK,EAAS,UAAU,EAAS,IAAI,EAAI,OAAS,IAAU,CACzE,QAAQ,OAAO,CACb,KAAM,SACN,QAAS,CAAE,GAAI,GAAO,WAAU,MAAO,EAAS,CACjD,CAAC,GAEJ,CAGF,MAAM,IAAI,YAAqB,GAE7B,CCjEJ,SAAS,EACP,EACU,CAEV,OAAOC,EAAAA,EAAW,EAAI,CASxB,SAAS,EACP,EACU,CACV,OAAOC,EAAAA,EAAe,EAAI,CAG5B,MAAa,EAAkE,CAC7E,eACA,gBAED,CCVD,SAAS,GAA+B,CAItC,OAHI,OAAO,WAAe,IACjB,WAEF,QAAQ,KAAK,GAmBtB,eAAsB,EAEpB,EACe,CACf,EAAA,EAAoB,KAAK,QAAQ,KAAK,CAEtC,GAAM,CAAE,YAAW,YAAW,iBAAgB,cAAa,cACzD,EAGI,EAAQC,EAAAA,EAA0B,EAAW,KAAK,CAGlD,CAAE,WAAU,YAAaC,EAAAA,EAAgB,EAAa,EAAM,OAAO,CAEzE,EAAA,EAAO,KACL,EAAA,QAAO,MACL,cAAc,EAAM,OAAO,wCAAwC,EAAS,QAAQ,EAAS,GAC9F,CACF,CAGD,IAAM,EAAQ,EAAM,IAAkB,IAAc,CAClD,WACA,QAAS,CAAE,YAAW,iBAAgB,CACvC,EAAE,CAiBH,MAAMC,EAAAA,EAAQ,CACZ,MAAO,mBAAmB,IAC1B,QAAS,GAAa,GAAa,QAAQ,KAAK,CAChD,UAAWC,EAAAA,EACX,gBAAiB,GAAsB,CACvC,WACA,WACA,WAAY,EAAM,OAClB,MArBA,CACE,aAAgB,EAAM,OAAO,CAC7B,UAAY,GAAM,EAAE,SACpB,gBAAmB,EAAE,EACrB,qBAAwB,IAAA,GACxB,WAAa,GAAW,EACxB,UAAW,EAAQ,KAAS,CAAE,SAAQ,GAAI,CAAC,CAAC,EAAI,GAAI,EACpD,YAAa,SAAY,GAG1B,CAYD,aACA,OAAS,GAAUC,EAAAA,EAAgB,EAAO,EAAoB,EAAW,CACzE,iBAAkB,CAAE,aAAY,UAAS,eACvCC,EAAAA,EAAsB,CAAE,aAAY,UAAS,YAAW,CAAC,CAC5D,CAAC,CAMA,QAAQ,KAAK,SAASF,EAAAA,EAAW,EACnC,GAAU,CAAC,MAAO,GAAQ,CACxB,EAAA,EAAO,MAAM,EAAI,CACjB,QAAQ,KAAK,EAAE,EACf"}
|