@transcend-io/cli 8.38.2 → 9.0.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-CxvKdj2v.mjs +2 -0
- package/dist/api-keys-CxvKdj2v.mjs.map +1 -0
- package/dist/app-BKMxG7RO.mjs +131 -0
- package/dist/app-BKMxG7RO.mjs.map +1 -0
- package/dist/bin/bash-complete.mjs +3 -0
- package/dist/bin/bash-complete.mjs.map +1 -0
- package/dist/bin/cli.mjs +3 -0
- package/dist/bin/cli.mjs.map +1 -0
- package/dist/bin/deprecated-command.mjs +5 -0
- package/dist/bin/deprecated-command.mjs.map +1 -0
- package/dist/buildAIIntegrationType-Bk0EbFKV.mjs +2 -0
- package/dist/buildAIIntegrationType-Bk0EbFKV.mjs.map +1 -0
- package/dist/code-scanning-Cx1kpssH.mjs +4 -0
- package/dist/code-scanning-Cx1kpssH.mjs.map +1 -0
- package/dist/codecs-TR6p48v3.mjs +2 -0
- package/dist/codecs-TR6p48v3.mjs.map +1 -0
- package/dist/command-Bzyj3M2G.mjs +9 -0
- package/dist/command-Bzyj3M2G.mjs.map +1 -0
- package/dist/consent-manager-c4bgQF1N.mjs +12 -0
- package/dist/consent-manager-c4bgQF1N.mjs.map +1 -0
- package/dist/constants-CnLQtIBn.mjs +2 -0
- package/dist/constants-CnLQtIBn.mjs.map +1 -0
- package/dist/context-bkKpii_t.mjs +2 -0
- package/dist/{context-_8xfl0dt.cjs.map → context-bkKpii_t.mjs.map} +1 -1
- package/dist/cron-BvxWyvDu.mjs +2 -0
- package/dist/cron-BvxWyvDu.mjs.map +1 -0
- package/dist/data-inventory-CkS_kmus.mjs +75 -0
- package/dist/data-inventory-CkS_kmus.mjs.map +1 -0
- package/dist/dataFlowsToDataSilos-RAhfPV0l.mjs +2 -0
- package/dist/dataFlowsToDataSilos-RAhfPV0l.mjs.map +1 -0
- package/dist/done-input-validation-CcZtaz03.mjs +2 -0
- package/dist/{done-input-validation-DGckEJ5a.cjs.map → done-input-validation-CcZtaz03.mjs.map} +1 -1
- package/dist/enums-CyFTrzXY.mjs +2 -0
- package/dist/{enums-BZulhPFa.cjs.map → enums-CyFTrzXY.mjs.map} +1 -1
- package/dist/impl-8dOatHnF.mjs +2 -0
- package/dist/{impl-BN8N7BHo.cjs.map → impl-8dOatHnF.mjs.map} +1 -1
- package/dist/impl-Ah-1lwzr.mjs +2 -0
- package/dist/impl-Ah-1lwzr.mjs.map +1 -0
- package/dist/impl-B5lTeRbn.mjs +2 -0
- package/dist/impl-B5lTeRbn.mjs.map +1 -0
- package/dist/impl-B6UhzQcY2.mjs +2 -0
- package/dist/impl-B6UhzQcY2.mjs.map +1 -0
- package/dist/impl-BFf_CotE2.mjs +2 -0
- package/dist/impl-BFf_CotE2.mjs.map +1 -0
- package/dist/impl-BGQ0EGS0.mjs +2 -0
- package/dist/impl-BGQ0EGS0.mjs.map +1 -0
- package/dist/impl-BYBNi68b.mjs +5 -0
- package/dist/impl-BYBNi68b.mjs.map +1 -0
- package/dist/impl-B__p3_wC.mjs +2 -0
- package/dist/impl-B__p3_wC.mjs.map +1 -0
- package/dist/impl-BcayRe6a.mjs +2 -0
- package/dist/{impl-CA7X_TDD.cjs.map → impl-BcayRe6a.mjs.map} +1 -1
- package/dist/impl-BkYKsEVG2.mjs +2 -0
- package/dist/impl-BkYKsEVG2.mjs.map +1 -0
- package/dist/impl-Bl2yVgh0.mjs +4 -0
- package/dist/impl-Bl2yVgh0.mjs.map +1 -0
- package/dist/impl-BmAMgEEM.mjs +12 -0
- package/dist/impl-BmAMgEEM.mjs.map +1 -0
- package/dist/impl-BsttzxTN2.mjs +2 -0
- package/dist/impl-BsttzxTN2.mjs.map +1 -0
- package/dist/impl-BtnySmbi.mjs +2 -0
- package/dist/impl-BtnySmbi.mjs.map +1 -0
- package/dist/impl-BwX-evfW2.mjs +4 -0
- package/dist/impl-BwX-evfW2.mjs.map +1 -0
- package/dist/impl-C-wzeAib2.mjs +2 -0
- package/dist/impl-C-wzeAib2.mjs.map +1 -0
- package/dist/impl-C61PYfk12.mjs +2 -0
- package/dist/impl-C61PYfk12.mjs.map +1 -0
- package/dist/impl-CAuNpuF2.mjs +2 -0
- package/dist/impl-CAuNpuF2.mjs.map +1 -0
- package/dist/impl-CSKrBIuV.mjs +2 -0
- package/dist/impl-CSKrBIuV.mjs.map +1 -0
- package/dist/impl-CZP2l3Ds.mjs +3 -0
- package/dist/impl-CZP2l3Ds.mjs.map +1 -0
- package/dist/impl-CiJ8hE5W2.mjs +2 -0
- package/dist/impl-CiJ8hE5W2.mjs.map +1 -0
- package/dist/impl-Cj3H-m2Z.mjs +2 -0
- package/dist/impl-Cj3H-m2Z.mjs.map +1 -0
- package/dist/impl-CkY0wfCz.mjs +2 -0
- package/dist/impl-CkY0wfCz.mjs.map +1 -0
- package/dist/impl-Cm8pUfBU2.mjs +2 -0
- package/dist/impl-Cm8pUfBU2.mjs.map +1 -0
- package/dist/impl-CpzS9LVu2.mjs +2 -0
- package/dist/impl-CpzS9LVu2.mjs.map +1 -0
- package/dist/impl-CwfamZ1c.mjs +2 -0
- package/dist/{impl-BO1fP5DL.cjs.map → impl-CwfamZ1c.mjs.map} +1 -1
- package/dist/impl-D81et1Yb2.mjs +2 -0
- package/dist/impl-D81et1Yb2.mjs.map +1 -0
- package/dist/impl-D92PTNk3.mjs +2 -0
- package/dist/impl-D92PTNk3.mjs.map +1 -0
- package/dist/impl-DTXDVeo6.mjs +2 -0
- package/dist/impl-DTXDVeo6.mjs.map +1 -0
- package/dist/impl-DWoysXup.mjs +2 -0
- package/dist/impl-DWoysXup.mjs.map +1 -0
- package/dist/impl-DX3JHZ4v2.mjs +2 -0
- package/dist/impl-DX3JHZ4v2.mjs.map +1 -0
- package/dist/impl-DhuUrzxQ.mjs +2 -0
- package/dist/impl-DhuUrzxQ.mjs.map +1 -0
- package/dist/impl-DqMYLKjU.mjs +2 -0
- package/dist/impl-DqMYLKjU.mjs.map +1 -0
- package/dist/impl-DqQ6CIj0.mjs +2 -0
- package/dist/impl-DqQ6CIj0.mjs.map +1 -0
- package/dist/impl-Duaq6iWI2.mjs +2 -0
- package/dist/impl-Duaq6iWI2.mjs.map +1 -0
- package/dist/impl-O5gz8qcm.mjs +2 -0
- package/dist/impl-O5gz8qcm.mjs.map +1 -0
- package/dist/impl-PH0AoC7i.mjs +2 -0
- package/dist/impl-PH0AoC7i.mjs.map +1 -0
- package/dist/impl-S8p6toVb2.mjs +2 -0
- package/dist/impl-S8p6toVb2.mjs.map +1 -0
- package/dist/impl-X2MSb8Ij.mjs +2 -0
- package/dist/impl-X2MSb8Ij.mjs.map +1 -0
- package/dist/impl-bo95wZIU2.mjs +2 -0
- package/dist/impl-bo95wZIU2.mjs.map +1 -0
- package/dist/impl-cfdCesro.mjs +2 -0
- package/dist/impl-cfdCesro.mjs.map +1 -0
- package/dist/impl-iZoXu4nV.mjs +2 -0
- package/dist/{impl-DZMWJNLE.cjs.map → impl-iZoXu4nV.mjs.map} +1 -1
- package/dist/impl-lebl6Zek2.mjs +2 -0
- package/dist/impl-lebl6Zek2.mjs.map +1 -0
- package/dist/impl-p0YN9e2e.mjs +2 -0
- package/dist/impl-p0YN9e2e.mjs.map +1 -0
- package/dist/{index.d.cts → index.d.mts} +1704 -3463
- package/dist/index.mjs +5 -0
- package/dist/index.mjs.map +1 -0
- package/dist/logger-Bj782ZYD.mjs +2 -0
- package/dist/logger-Bj782ZYD.mjs.map +1 -0
- package/dist/manual-enrichment-B6lW5kAX.mjs +2 -0
- package/dist/manual-enrichment-B6lW5kAX.mjs.map +1 -0
- package/dist/mergeTranscendInputs-Coj_e2N3.mjs +2 -0
- package/dist/{mergeTranscendInputs-BIBCYbug.cjs.map → mergeTranscendInputs-Coj_e2N3.mjs.map} +1 -1
- package/dist/pooling-CazydwlD.mjs +23 -0
- package/dist/pooling-CazydwlD.mjs.map +1 -0
- package/dist/preference-management-8gj7aSJB.mjs +7 -0
- package/dist/preference-management-8gj7aSJB.mjs.map +1 -0
- package/dist/readTranscendYaml-DhKG1ViI.mjs +4 -0
- package/dist/readTranscendYaml-DhKG1ViI.mjs.map +1 -0
- package/dist/syncConfigurationToTranscend-VJd0PnaZ.mjs +3010 -0
- package/dist/syncConfigurationToTranscend-VJd0PnaZ.mjs.map +1 -0
- package/dist/uploadConsents-C1S-BNzw.mjs +2 -0
- package/dist/uploadConsents-C1S-BNzw.mjs.map +1 -0
- package/package.json +46 -49
- package/dist/api-keys-DMPYZTne.cjs +0 -2
- package/dist/api-keys-DMPYZTne.cjs.map +0 -1
- package/dist/app-bPlpZQj_.cjs +0 -131
- package/dist/app-bPlpZQj_.cjs.map +0 -1
- package/dist/bin/bash-complete.cjs +0 -3
- package/dist/bin/bash-complete.cjs.map +0 -1
- package/dist/bin/cli.cjs +0 -3
- package/dist/bin/cli.cjs.map +0 -1
- package/dist/bin/deprecated-command.cjs +0 -5
- package/dist/bin/deprecated-command.cjs.map +0 -1
- package/dist/buildAIIntegrationType-BwuCYR-o.cjs +0 -2
- package/dist/buildAIIntegrationType-BwuCYR-o.cjs.map +0 -1
- package/dist/chunk-Bmb41Sf3.cjs +0 -1
- package/dist/code-scanning-D6YstOWo.cjs +0 -4
- package/dist/code-scanning-D6YstOWo.cjs.map +0 -1
- package/dist/codecs-Bvmb8o9R.cjs +0 -2
- package/dist/codecs-Bvmb8o9R.cjs.map +0 -1
- package/dist/command-C39HGpGR.cjs +0 -9
- package/dist/command-C39HGpGR.cjs.map +0 -1
- package/dist/consent-manager-C3UVAKd_.cjs +0 -12
- package/dist/consent-manager-C3UVAKd_.cjs.map +0 -1
- package/dist/constants-gJm1eQH0.cjs +0 -2
- package/dist/constants-gJm1eQH0.cjs.map +0 -1
- package/dist/context-_8xfl0dt.cjs +0 -2
- package/dist/cron-NLlyCiml.cjs +0 -2
- package/dist/cron-NLlyCiml.cjs.map +0 -1
- package/dist/data-inventory-a9Nz9lUO.cjs +0 -75
- package/dist/data-inventory-a9Nz9lUO.cjs.map +0 -1
- package/dist/dataFlowsToDataSilos-BJh0hzJI.cjs +0 -2
- package/dist/dataFlowsToDataSilos-BJh0hzJI.cjs.map +0 -1
- package/dist/done-input-validation-DGckEJ5a.cjs +0 -2
- package/dist/enums-BZulhPFa.cjs +0 -2
- package/dist/impl--RUTvJko.cjs +0 -2
- package/dist/impl--RUTvJko.cjs.map +0 -1
- package/dist/impl-6vrF2_M3.cjs +0 -2
- package/dist/impl-6vrF2_M3.cjs.map +0 -1
- package/dist/impl-73q3K0b_.cjs +0 -2
- package/dist/impl-73q3K0b_.cjs.map +0 -1
- package/dist/impl-BAZ34gSp.cjs +0 -2
- package/dist/impl-BAZ34gSp.cjs.map +0 -1
- package/dist/impl-BAs-7neS.cjs +0 -12
- package/dist/impl-BAs-7neS.cjs.map +0 -1
- package/dist/impl-BF44h4oH.cjs +0 -2
- package/dist/impl-BF44h4oH.cjs.map +0 -1
- package/dist/impl-BKXkRTVx.cjs +0 -2
- package/dist/impl-BKXkRTVx.cjs.map +0 -1
- package/dist/impl-BN8N7BHo.cjs +0 -2
- package/dist/impl-BO1fP5DL.cjs +0 -2
- package/dist/impl-BRAiiMt3.cjs +0 -2
- package/dist/impl-BRAiiMt3.cjs.map +0 -1
- package/dist/impl-BRNha4nQ.cjs +0 -2
- package/dist/impl-BRNha4nQ.cjs.map +0 -1
- package/dist/impl-Ba1d91O1.cjs +0 -2
- package/dist/impl-Ba1d91O1.cjs.map +0 -1
- package/dist/impl-Bgp_TuxN.cjs +0 -2
- package/dist/impl-Bgp_TuxN.cjs.map +0 -1
- package/dist/impl-BreaZGaV.cjs +0 -2
- package/dist/impl-BreaZGaV.cjs.map +0 -1
- package/dist/impl-BzAwMfNS.cjs +0 -2
- package/dist/impl-BzAwMfNS.cjs.map +0 -1
- package/dist/impl-C0eKnbO8.cjs +0 -4
- package/dist/impl-C0eKnbO8.cjs.map +0 -1
- package/dist/impl-C2kTLgRr.cjs +0 -2
- package/dist/impl-C2kTLgRr.cjs.map +0 -1
- package/dist/impl-CA7X_TDD.cjs +0 -2
- package/dist/impl-CC0T0jNd.cjs +0 -2
- package/dist/impl-CC0T0jNd.cjs.map +0 -1
- package/dist/impl-CJT35FpG.cjs +0 -2
- package/dist/impl-CJT35FpG.cjs.map +0 -1
- package/dist/impl-CTXPMoXc.cjs +0 -3
- package/dist/impl-CTXPMoXc.cjs.map +0 -1
- package/dist/impl-CUScCLAS.cjs +0 -2
- package/dist/impl-CUScCLAS.cjs.map +0 -1
- package/dist/impl-CYmPZogW.cjs +0 -2
- package/dist/impl-CYmPZogW.cjs.map +0 -1
- package/dist/impl-Ccd0FaOU.cjs +0 -2
- package/dist/impl-Ccd0FaOU.cjs.map +0 -1
- package/dist/impl-CmKWcYiV.cjs +0 -2
- package/dist/impl-CmKWcYiV.cjs.map +0 -1
- package/dist/impl-CqshC7my.cjs +0 -2
- package/dist/impl-CqshC7my.cjs.map +0 -1
- package/dist/impl-Cru4riTc.cjs +0 -5
- package/dist/impl-Cru4riTc.cjs.map +0 -1
- package/dist/impl-Cypfgm4t.cjs +0 -2
- package/dist/impl-Cypfgm4t.cjs.map +0 -1
- package/dist/impl-D2SWeIGe.cjs +0 -2
- package/dist/impl-D2SWeIGe.cjs.map +0 -1
- package/dist/impl-DLwIQVA6.cjs +0 -2
- package/dist/impl-DLwIQVA6.cjs.map +0 -1
- package/dist/impl-DMm4lt-A.cjs +0 -2
- package/dist/impl-DMm4lt-A.cjs.map +0 -1
- package/dist/impl-DRsuGuRx.cjs +0 -2
- package/dist/impl-DRsuGuRx.cjs.map +0 -1
- package/dist/impl-DSrvfkVp.cjs +0 -2
- package/dist/impl-DSrvfkVp.cjs.map +0 -1
- package/dist/impl-DZMWJNLE.cjs +0 -2
- package/dist/impl-DbqAvW7X.cjs +0 -2
- package/dist/impl-DbqAvW7X.cjs.map +0 -1
- package/dist/impl-Dl78xJu6.cjs +0 -2
- package/dist/impl-Dl78xJu6.cjs.map +0 -1
- package/dist/impl-Dvpc-Qa5.cjs +0 -2
- package/dist/impl-Dvpc-Qa5.cjs.map +0 -1
- package/dist/impl-DySeNL1m.cjs +0 -2
- package/dist/impl-DySeNL1m.cjs.map +0 -1
- package/dist/impl-Fj-Esff-.cjs +0 -2
- package/dist/impl-Fj-Esff-.cjs.map +0 -1
- package/dist/impl-W6tVmm8N.cjs +0 -2
- package/dist/impl-W6tVmm8N.cjs.map +0 -1
- package/dist/impl-WphnR0cX.cjs +0 -2
- package/dist/impl-WphnR0cX.cjs.map +0 -1
- package/dist/impl-YNAicr-z.cjs +0 -2
- package/dist/impl-YNAicr-z.cjs.map +0 -1
- package/dist/impl-jEpWgC2N.cjs +0 -2
- package/dist/impl-jEpWgC2N.cjs.map +0 -1
- package/dist/impl-x2P-_Pk2.cjs +0 -4
- package/dist/impl-x2P-_Pk2.cjs.map +0 -1
- package/dist/index.cjs +0 -5
- package/dist/index.cjs.map +0 -1
- package/dist/logger-DQwEYtSS.cjs +0 -2
- package/dist/logger-DQwEYtSS.cjs.map +0 -1
- package/dist/manual-enrichment-DTVJo7hP.cjs +0 -2
- package/dist/manual-enrichment-DTVJo7hP.cjs.map +0 -1
- package/dist/mergeTranscendInputs-BIBCYbug.cjs +0 -2
- package/dist/pooling-C-TYBnHI.cjs +0 -23
- package/dist/pooling-C-TYBnHI.cjs.map +0 -1
- package/dist/preference-management-Ch77Yxod.cjs +0 -7
- package/dist/preference-management-Ch77Yxod.cjs.map +0 -1
- package/dist/readTranscendYaml-Cycz6RxW.cjs +0 -4
- package/dist/readTranscendYaml-Cycz6RxW.cjs.map +0 -1
- package/dist/syncConfigurationToTranscend-s-cjtUI3.cjs +0 -3010
- package/dist/syncConfigurationToTranscend-s-cjtUI3.cjs.map +0 -1
- package/dist/uploadConsents-CDkk_sWY.cjs +0 -2
- package/dist/uploadConsents-CDkk_sWY.cjs.map +0 -1
- /package/dist/bin/{bash-complete.d.cts → bash-complete.d.mts} +0 -0
- /package/dist/bin/{cli.d.cts → cli.d.mts} +0 -0
- /package/dist/bin/{deprecated-command.d.cts → deprecated-command.d.mts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impl-O5gz8qcm.mjs","names":[],"sources":["../src/commands/consent/upload-preferences/impl.ts"],"sourcesContent":["import type { LocalContext } from '../../../context';\nimport colors from 'colors';\n\nimport { logger } from '../../../logger';\nimport { uploadPreferenceManagementPreferencesInteractive } from '../../../lib/preference-management';\nimport { splitCsvToList } from '../../../lib/requests';\nimport { readdirSync } from 'node:fs';\nimport { map } from '../../../lib/bluebird';\nimport { basename, join } from 'node:path';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation';\n\nexport interface UploadPreferencesCommandFlags {\n auth: string;\n partition: string;\n sombraAuth?: string;\n transcendUrl: string;\n file?: string;\n directory?: string;\n dryRun: boolean;\n skipExistingRecordCheck: boolean;\n receiptFileDir: string;\n skipWorkflowTriggers: boolean;\n forceTriggerWorkflows: boolean;\n skipConflictUpdates: boolean;\n isSilent: boolean;\n attributes: string;\n receiptFilepath: string;\n concurrency: number;\n}\n\nexport async function uploadPreferences(\n this: LocalContext,\n {\n auth,\n partition,\n sombraAuth,\n transcendUrl,\n file = '',\n directory,\n dryRun,\n skipExistingRecordCheck,\n receiptFileDir,\n skipWorkflowTriggers,\n forceTriggerWorkflows,\n skipConflictUpdates,\n isSilent,\n attributes,\n concurrency,\n }: UploadPreferencesCommandFlags,\n): Promise<void> {\n if (!!directory && !!file) {\n logger.error(\n colors.red(\n 'Cannot provide both a directory and a file. Please provide only one.',\n ),\n );\n this.process.exit(1);\n }\n\n if (!file && !directory) {\n logger.error(\n colors.red(\n 'A file or directory must be provided. Please provide one using --file=./preferences.csv or --directory=./preferences',\n ),\n );\n this.process.exit(1);\n }\n\n doneInputValidation(this.process.exit);\n\n const files: string[] = [];\n\n if (directory) {\n try {\n const filesInDirectory = readdirSync(directory);\n const csvFiles = filesInDirectory.filter((file) => file.endsWith('.csv'));\n\n if (csvFiles.length === 0) {\n logger.error(\n colors.red(`No CSV files found in directory: ${directory}`),\n );\n this.process.exit(1);\n }\n\n // Add full paths for each CSV file\n files.push(...csvFiles.map((file) => join(directory, file)));\n } catch (err) {\n logger.error(colors.red(`Failed to read directory: ${directory}`));\n logger.error(colors.red((err as Error).message));\n this.process.exit(1);\n }\n } else {\n try {\n // Verify file exists and is a CSV\n if (!file.endsWith('.csv')) {\n logger.error(colors.red('File must be a CSV file'));\n this.process.exit(1);\n }\n files.push(file);\n } catch (err) {\n logger.error(colors.red(`Failed to access file: ${file}`));\n logger.error(colors.red((err as Error).message));\n this.process.exit(1);\n }\n }\n\n logger.info(\n colors.green(\n `Processing ${files.length} consent preferences files for partition: ${partition}`,\n ),\n );\n logger.debug(`Files to process: ${files.join(', ')}`);\n\n if (skipExistingRecordCheck) {\n logger.info(\n colors.bgYellow(\n `Skipping existing record check: ${skipExistingRecordCheck}`,\n ),\n );\n }\n\n await map(\n files,\n async (filePath) => {\n const fileName = basename(filePath).replace('.csv', '');\n await uploadPreferenceManagementPreferencesInteractive({\n receiptFilepath: join(receiptFileDir, `${fileName}-receipts.json`),\n auth,\n sombraAuth,\n file: filePath,\n partition,\n transcendUrl,\n skipConflictUpdates,\n skipWorkflowTriggers,\n skipExistingRecordCheck,\n isSilent,\n dryRun,\n attributes: splitCsvToList(attributes),\n forceTriggerWorkflows,\n });\n },\n { concurrency },\n );\n}\n"],"mappings":"4bA8BA,eAAsB,EAEpB,CACE,OACA,YACA,aACA,eACA,OAAO,GACP,YACA,SACA,0BACA,iBACA,uBACA,wBACA,sBACA,WACA,aACA,eAEa,CACT,GAAe,IACnB,EAAO,MACL,EAAO,IACL,uEACD,CACF,CACD,KAAK,QAAQ,KAAK,EAAE,EAGlB,CAAC,GAAQ,CAAC,IACZ,EAAO,MACL,EAAO,IACL,uHACD,CACF,CACD,KAAK,QAAQ,KAAK,EAAE,EAGtB,EAAoB,KAAK,QAAQ,KAAK,CAEtC,IAAM,EAAkB,EAAE,CAE1B,GAAI,EACF,GAAI,CAEF,IAAM,EADmB,EAAY,EAAU,CACb,OAAQ,GAAS,EAAK,SAAS,OAAO,CAAC,CAErE,EAAS,SAAW,IACtB,EAAO,MACL,EAAO,IAAI,oCAAoC,IAAY,CAC5D,CACD,KAAK,QAAQ,KAAK,EAAE,EAItB,EAAM,KAAK,GAAG,EAAS,IAAK,GAAS,EAAK,EAAW,EAAK,CAAC,CAAC,OACrD,EAAK,CACZ,EAAO,MAAM,EAAO,IAAI,6BAA6B,IAAY,CAAC,CAClE,EAAO,MAAM,EAAO,IAAK,EAAc,QAAQ,CAAC,CAChD,KAAK,QAAQ,KAAK,EAAE,MAGtB,GAAI,CAEG,EAAK,SAAS,OAAO,GACxB,EAAO,MAAM,EAAO,IAAI,0BAA0B,CAAC,CACnD,KAAK,QAAQ,KAAK,EAAE,EAEtB,EAAM,KAAK,EAAK,OACT,EAAK,CACZ,EAAO,MAAM,EAAO,IAAI,0BAA0B,IAAO,CAAC,CAC1D,EAAO,MAAM,EAAO,IAAK,EAAc,QAAQ,CAAC,CAChD,KAAK,QAAQ,KAAK,EAAE,CAIxB,EAAO,KACL,EAAO,MACL,cAAc,EAAM,OAAO,4CAA4C,IACxE,CACF,CACD,EAAO,MAAM,qBAAqB,EAAM,KAAK,KAAK,GAAG,CAEjD,GACF,EAAO,KACL,EAAO,SACL,mCAAmC,IACpC,CACF,CAGH,MAAM,EACJ,EACA,KAAO,IAAa,CAElB,MAAM,EAAiD,CACrD,gBAAiB,EAAK,EAAgB,GAFvB,EAAS,EAAS,CAAC,QAAQ,OAAQ,GAAG,CAEH,gBAAgB,CAClE,OACA,aACA,KAAM,EACN,YACA,eACA,sBACA,uBACA,0BACA,WACA,SACA,WAAY,EAAe,EAAW,CACtC,wBACD,CAAC,EAEJ,CAAE,cAAa,CAChB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./enums-CyFTrzXY.mjs";import"./constants-CnLQtIBn.mjs";import{t as e}from"./logger-Bj782ZYD.mjs";import"./buildAIIntegrationType-Bk0EbFKV.mjs";import"./codecs-TR6p48v3.mjs";import"./syncConfigurationToTranscend-VJd0PnaZ.mjs";import{r as t}from"./consent-manager-c4bgQF1N.mjs";import"./uploadConsents-C1S-BNzw.mjs";import{r as n}from"./api-keys-CxvKdj2v.mjs";import{t as r}from"./done-input-validation-CcZtaz03.mjs";import{writeFileSync as i}from"node:fs";import a from"colors";async function o({auth:o,xdiLocation:s,file:c,removeIpAddresses:l,domainBlockList:u,xdiAllowedCommands:d,transcendUrl:f}){r(this.process.exit);let{syncGroups:p,html:m}=await t(await n(o),{xdiLocation:s,transcendUrl:f,removeIpAddresses:l,domainBlockList:u.length>0?u:void 0,xdiAllowedCommands:d});e.info(a.green(`Successfully constructed sync endpoint for sync groups: ${JSON.stringify(p,null,2)}`)),i(c,m),e.info(a.green(`Wrote configuration to file "${c}"!`))}export{o as buildXdiSyncEndpoint};
|
|
2
|
+
//# sourceMappingURL=impl-PH0AoC7i.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impl-PH0AoC7i.mjs","names":["buildXdiSyncEndpointHelper"],"sources":["../src/commands/consent/build-xdi-sync-endpoint/impl.ts"],"sourcesContent":["import type { LocalContext } from '../../../context';\nimport { logger } from '../../../logger';\nimport colors from 'colors';\nimport { writeFileSync } from 'node:fs';\nimport { validateTranscendAuth } from '../../../lib/api-keys';\nimport { buildXdiSyncEndpoint as buildXdiSyncEndpointHelper } from '../../../lib/consent-manager';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation';\n\nexport interface BuildXdiSyncEndpointCommandFlags {\n auth: string;\n xdiLocation: string;\n file: string;\n removeIpAddresses: boolean;\n domainBlockList: string[];\n xdiAllowedCommands: string;\n transcendUrl: string;\n}\n\nexport async function buildXdiSyncEndpoint(\n this: LocalContext,\n {\n auth,\n xdiLocation,\n file,\n removeIpAddresses,\n domainBlockList,\n xdiAllowedCommands,\n transcendUrl,\n }: BuildXdiSyncEndpointCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process.exit);\n\n // Parse authentication as API key or path to list of API keys\n const apiKeyOrList = await validateTranscendAuth(auth);\n\n // Build the sync endpoint\n const { syncGroups, html } = await buildXdiSyncEndpointHelper(apiKeyOrList, {\n xdiLocation,\n transcendUrl,\n removeIpAddresses,\n domainBlockList: domainBlockList.length > 0 ? domainBlockList : undefined,\n xdiAllowedCommands,\n });\n\n // Log success\n logger.info(\n colors.green(\n `Successfully constructed sync endpoint for sync groups: ${JSON.stringify(\n syncGroups,\n null,\n 2,\n )}`,\n ),\n );\n\n // Write to disk\n writeFileSync(file, html);\n logger.info(colors.green(`Wrote configuration to file \"${file}\"!`));\n}\n"],"mappings":"oeAkBA,eAAsB,EAEpB,CACE,OACA,cACA,OACA,oBACA,kBACA,qBACA,gBAEa,CACf,EAAoB,KAAK,QAAQ,KAAK,CAMtC,GAAM,CAAE,aAAY,QAAS,MAAMA,EAHd,MAAM,EAAsB,EAAK,CAGsB,CAC1E,cACA,eACA,oBACA,gBAAiB,EAAgB,OAAS,EAAI,EAAkB,IAAA,GAChE,qBACD,CAAC,CAGF,EAAO,KACL,EAAO,MACL,2DAA2D,KAAK,UAC9D,EACA,KACA,EACD,GACF,CACF,CAGD,EAAc,EAAM,EAAK,CACzB,EAAO,KAAK,EAAO,MAAM,gCAAgC,EAAK,IAAI,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./enums-CyFTrzXY.mjs";import"./constants-CnLQtIBn.mjs";import"./logger-Bj782ZYD.mjs";import"./buildAIIntegrationType-Bk0EbFKV.mjs";import{X as e}from"./syncConfigurationToTranscend-VJd0PnaZ.mjs";import{t}from"./done-input-validation-CcZtaz03.mjs";async function n({auth:n,actions:r,origins:i,silentModeBefore:a,createdAtBefore:o,createdAtAfter:s,updatedAtBefore:c,updatedAtAfter:l,transcendUrl:u,concurrency:d}){t(this.process.exit),await e({transcendUrl:u,requestActions:r,auth:n,requestOrigins:i,concurrency:d,silentModeBefore:a,createdAtBefore:o,createdAtAfter:s,updatedAtBefore:c,updatedAtAfter:l})}export{n as approve};
|
|
2
|
+
//# sourceMappingURL=impl-S8p6toVb2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impl-S8p6toVb2.mjs","names":[],"sources":["../src/commands/request/approve/impl.ts"],"sourcesContent":["import type { LocalContext } from '../../../context';\n\nimport { RequestAction, RequestOrigin } from '@transcend-io/privacy-types';\nimport { approvePrivacyRequests } from '../../../lib/requests';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation';\n\nexport interface ApproveCommandFlags {\n auth: string;\n actions: RequestAction[];\n origins?: RequestOrigin[];\n silentModeBefore?: Date;\n createdAtBefore?: Date;\n createdAtAfter?: Date;\n updatedAtBefore?: Date;\n updatedAtAfter?: Date;\n transcendUrl: string;\n concurrency: number;\n}\n\nexport async function approve(\n this: LocalContext,\n {\n auth,\n actions,\n origins,\n silentModeBefore,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n transcendUrl,\n concurrency,\n }: ApproveCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process.exit);\n\n await approvePrivacyRequests({\n transcendUrl,\n requestActions: actions,\n auth,\n requestOrigins: origins,\n concurrency,\n silentModeBefore,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n });\n}\n"],"mappings":"8PAmBA,eAAsB,EAEpB,CACE,OACA,UACA,UACA,mBACA,kBACA,iBACA,kBACA,iBACA,eACA,eAEa,CACf,EAAoB,KAAK,QAAQ,KAAK,CAEtC,MAAM,EAAuB,CAC3B,eACA,eAAgB,EAChB,OACA,eAAgB,EAChB,cACA,mBACA,kBACA,iBACA,kBACA,iBACD,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./enums-CyFTrzXY.mjs";import{c as e}from"./constants-CnLQtIBn.mjs";import"./logger-Bj782ZYD.mjs";import"./buildAIIntegrationType-Bk0EbFKV.mjs";import"./codecs-TR6p48v3.mjs";import"./syncConfigurationToTranscend-VJd0PnaZ.mjs";import{i as t}from"./api-keys-CxvKdj2v.mjs";import{t as n}from"./done-input-validation-CcZtaz03.mjs";import{writeFileSync as r}from"node:fs";async function i({email:i,password:a,apiKeyTitle:o,file:s,scopes:c,deleteExistingApiKey:l,createNewApiKey:u,parentOrganizationId:d,transcendUrl:f}){n(this.process.exit);let{errors:p,apiKeys:m}=await t({transcendUrl:f,password:a,email:i,parentOrganizationId:d,deleteExistingApiKey:l,createNewApiKey:u,apiKeyTitle:o,scopes:c.map(t=>e[t].name)});r(s,`${JSON.stringify(m,null,2)}\n`),p.length>0&&this.process.exit(1)}export{i as generateApiKeys};
|
|
2
|
+
//# sourceMappingURL=impl-X2MSb8Ij.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impl-X2MSb8Ij.mjs","names":[],"sources":["../src/commands/admin/generate-api-keys/impl.ts"],"sourcesContent":["import type { LocalContext } from '../../../context';\nimport { writeFileSync } from 'node:fs';\n\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nimport { generateCrossAccountApiKeys } from '../../../lib/api-keys';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation';\nimport { SCOPES_BY_TITLE } from '../../../constants';\n\n// Command flag interface\nexport interface GenerateApiKeysCommandFlags {\n email: string;\n password: string;\n apiKeyTitle: string;\n file: string;\n scopes: string[];\n deleteExistingApiKey: boolean;\n createNewApiKey: boolean;\n parentOrganizationId?: string;\n transcendUrl: string;\n}\n\n// Command implementation\nexport async function generateApiKeys(\n this: LocalContext,\n {\n email,\n password,\n apiKeyTitle,\n file,\n scopes,\n deleteExistingApiKey,\n createNewApiKey,\n parentOrganizationId,\n transcendUrl,\n }: GenerateApiKeysCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process.exit);\n\n const scopeNames = scopes.map(\n (scopeTitle) => SCOPES_BY_TITLE[scopeTitle].name as ScopeName,\n );\n\n // Upload privacy requests\n const { errors, apiKeys } = await generateCrossAccountApiKeys({\n transcendUrl,\n password,\n email,\n parentOrganizationId,\n deleteExistingApiKey,\n createNewApiKey,\n apiKeyTitle,\n scopes: scopeNames,\n });\n\n // Write to disk\n writeFileSync(file, `${JSON.stringify(apiKeys, null, 2)}\\n`);\n if (errors.length > 0) {\n this.process.exit(1);\n }\n}\n"],"mappings":"qXAuBA,eAAsB,EAEpB,CACE,QACA,WACA,cACA,OACA,SACA,uBACA,kBACA,uBACA,gBAEa,CACf,EAAoB,KAAK,QAAQ,KAAK,CAOtC,GAAM,CAAE,SAAQ,WAAY,MAAM,EAA4B,CAC5D,eACA,WACA,QACA,uBACA,uBACA,kBACA,cACA,OAbiB,EAAO,IACvB,GAAe,EAAgB,GAAY,KAC7C,CAYA,CAAC,CAGF,EAAc,EAAM,GAAG,KAAK,UAAU,EAAS,KAAM,EAAE,CAAC,IAAI,CACxD,EAAO,OAAS,GAClB,KAAK,QAAQ,KAAK,EAAE"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./enums-CyFTrzXY.mjs";import"./constants-CnLQtIBn.mjs";import"./logger-Bj782ZYD.mjs";import"./buildAIIntegrationType-Bk0EbFKV.mjs";import"./syncConfigurationToTranscend-VJd0PnaZ.mjs";import{i as e}from"./manual-enrichment-B6lW5kAX.mjs";import{t}from"./done-input-validation-CcZtaz03.mjs";async function n({auth:n,transcendUrl:r,file:i,concurrency:a,actions:o,sombraAuth:s}){t(this.process.exit),await e({file:i,transcendUrl:r,concurrency:a,requestActions:o,auth:n,sombraAuth:s})}export{n as pullIdentifiers};
|
|
2
|
+
//# sourceMappingURL=impl-bo95wZIU2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impl-bo95wZIU2.mjs","names":[],"sources":["../src/commands/request/preflight/pull-identifiers/impl.ts"],"sourcesContent":["import type { LocalContext } from '../../../../context';\nimport { pullManualEnrichmentIdentifiersToCsv } from '../../../../lib/manual-enrichment';\nimport type { RequestAction } from '@transcend-io/privacy-types';\nimport { doneInputValidation } from '../../../../lib/cli/done-input-validation';\n\nexport interface PullIdentifiersCommandFlags {\n auth: string;\n sombraAuth?: string;\n transcendUrl: string;\n file: string;\n actions?: RequestAction[];\n concurrency: number;\n}\n\nexport async function pullIdentifiers(\n this: LocalContext,\n {\n auth,\n transcendUrl,\n file,\n concurrency,\n actions,\n sombraAuth,\n }: PullIdentifiersCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process.exit);\n\n await pullManualEnrichmentIdentifiersToCsv({\n file,\n transcendUrl,\n concurrency,\n requestActions: actions,\n auth,\n sombraAuth,\n });\n}\n"],"mappings":"uSAcA,eAAsB,EAEpB,CACE,OACA,eACA,OACA,cACA,UACA,cAEa,CACf,EAAoB,KAAK,QAAQ,KAAK,CAEtC,MAAM,EAAqC,CACzC,OACA,eACA,cACA,eAAgB,EAChB,OACA,aACD,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./enums-CyFTrzXY.mjs";import"./constants-CnLQtIBn.mjs";import{t as e}from"./logger-Bj782ZYD.mjs";import"./buildAIIntegrationType-Bk0EbFKV.mjs";import{a as t,ai as n,ii as r,n as i,s as a,xr as o}from"./syncConfigurationToTranscend-VJd0PnaZ.mjs";import{t as s}from"./done-input-validation-CcZtaz03.mjs";import{i as c,n as l,r as u}from"./preference-management-8gj7aSJB.mjs";import d from"colors";const f=[`userId`,`timestamp`,`partition`,`decryptionStatus`,`updatedAt`,`usp`,`gpp`,`tcf`,`airgapVersion`,`metadata`,`metadataTimestamp`];async function p({auth:p,partition:m,sombraAuth:h,file:g,transcendUrl:_,timestampBefore:v,timestampAfter:y,updatedBefore:b,updatedAfter:x,identifiers:S=[],concurrency:C,shouldChunk:w,windowConcurrency:T,maxChunks:E,exportIdentifiersWithDelimiter:D,maxLookbackDays:O}){s(this.process.exit);let k=await r(_,p,h),A=n(_,p),j=S.map(e=>{if(!e.includes(`:`))return{name:`email`,value:e};let[t,n]=e.split(`:`);return{name:t,value:n}}),M={...v?{timestampBefore:v.toISOString()}:{},...y?{timestampAfter:y.toISOString()}:{},...x||b?{system:{...b?{updatedBefore:b.toISOString()}:{},...x?{updatedAfter:x.toISOString()}:{}}}:{},...j.length>0?{identifiers:j}:{}};e.info(`Fetching consent preferences from partition ${m}, using mode=${w?`chunked-stream`:`paged-stream`}...`),e.info(d.magenta(`Preparing CSV at: ${g}`));let[N,P]=await Promise.all([o(A),i(A)]),F=P.map(e=>e.name),I=Array.from(new Set(N.flatMap(e=>e.topics?.map(t=>`${e.trackingType}_${t.slug}`)??[]))).sort((e,t)=>e.localeCompare(t)),L=Array.from(new Set(N.map(e=>e.trackingType))).sort((e,t)=>e.localeCompare(t)),R=[...f,...F,...L,...I],z=null,B=!1,V=e=>{if(!e||e.length===0)return;let n=e.map(e=>c(e,D));if(!B){let e=Object.keys(n[0]??{}),t=new Set;z=[...R,...e].filter(e=>e===void 0||t.has(e)?!1:(t.add(e),!0)),a(g,z),B=!0}t(g,n,z)};if(w){await u(k,{partition:m,filterBy:M,limit:C,windowConcurrency:T,maxChunks:E,maxLookbackDays:O,onItems:e=>V(e)}),e.info(d.green(`Finished writing CSV to ${g}`));return}await l(k,{partition:m,filterBy:M,limit:C,onItems:e=>V(e)}),e.info(d.green(`Finished writing CSV to ${g}`))}export{p as pullConsentPreferences};
|
|
2
|
+
//# sourceMappingURL=impl-cfdCesro.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impl-cfdCesro.mjs","names":[],"sources":["../src/commands/consent/pull-consent-preferences/impl.ts"],"sourcesContent":["import type { LocalContext } from '../../../context';\nimport colors from 'colors';\n\nimport {\n fetchConsentPreferences,\n fetchConsentPreferencesChunked,\n transformPreferenceRecordToCsv,\n type PreferenceIdentifier,\n} from '../../../lib/preference-management';\nimport {\n buildTranscendGraphQLClient,\n createSombraGotInstance,\n fetchAllIdentifiers,\n fetchAllPurposesAndPreferences,\n} from '../../../lib/graphql';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation';\nimport { logger } from '../../../logger';\nimport { initCsvFile, appendCsvRowsOrdered } from '../../../lib/helpers';\nimport type { PreferenceQueryResponseItem } from '@transcend-io/privacy-types';\n\n// Known “core” columns your transformer usually produces up front.\n// Leave this list conservative; we’ll still union with transformer keys.\nconst CORE_COLS = [\n 'userId',\n 'timestamp',\n 'partition',\n 'decryptionStatus',\n 'updatedAt',\n 'usp',\n 'gpp',\n 'tcf',\n 'airgapVersion',\n 'metadata',\n 'metadataTimestamp',\n];\n\nexport interface PullConsentPreferencesCommandFlags {\n auth: string;\n partition: string;\n sombraAuth?: string;\n file: string;\n transcendUrl: string;\n timestampBefore?: Date;\n exportIdentifiersWithDelimiter: string;\n timestampAfter?: Date;\n updatedBefore?: Date;\n updatedAfter?: Date;\n identifiers?: string[];\n concurrency: number;\n shouldChunk: boolean;\n windowConcurrency: number;\n maxChunks: number;\n maxLookbackDays: number;\n}\n\nexport async function pullConsentPreferences(\n this: LocalContext,\n {\n auth,\n partition,\n sombraAuth,\n file,\n transcendUrl,\n timestampBefore,\n timestampAfter,\n updatedBefore,\n updatedAfter,\n identifiers = [],\n concurrency,\n shouldChunk,\n windowConcurrency,\n maxChunks,\n exportIdentifiersWithDelimiter,\n maxLookbackDays,\n }: PullConsentPreferencesCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process.exit);\n\n // Create sombra instance to communicate with\n const sombra = await createSombraGotInstance(transcendUrl, auth, sombraAuth);\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Identifiers are key:value, parse to PreferenceIdentifier[]\n const parsedIdentifiers = identifiers.map(\n (identifier): PreferenceIdentifier => {\n if (!identifier.includes(':')) {\n return {\n name: 'email',\n value: identifier,\n };\n }\n const [name, value] = identifier.split(':');\n return { name, value };\n },\n );\n\n // Build filter\n const filterBy = {\n ...(timestampBefore\n ? { timestampBefore: timestampBefore.toISOString() }\n : {}),\n ...(timestampAfter ? { timestampAfter: timestampAfter.toISOString() } : {}),\n ...(updatedAfter || updatedBefore\n ? {\n system: {\n ...(updatedBefore\n ? { updatedBefore: updatedBefore.toISOString() }\n : {}),\n ...(updatedAfter\n ? { updatedAfter: updatedAfter.toISOString() }\n : {}),\n },\n }\n : {}),\n ...(parsedIdentifiers.length > 0 ? { identifiers: parsedIdentifiers } : {}),\n };\n\n logger.info(\n `Fetching consent preferences from partition ${partition}, using mode=${\n shouldChunk ? 'chunked-stream' : 'paged-stream'\n }...`,\n );\n\n logger.info(colors.magenta(`Preparing CSV at: ${file}`));\n\n // Fetch full sets (purposes+topics, identifiers) to ensure header completeness\n const [purposesWithTopics, allIdentifiers] = await Promise.all([\n fetchAllPurposesAndPreferences(client),\n fetchAllIdentifiers(client),\n ]);\n\n // Identifier columns: exactly the identifier names\n const identifierCols = allIdentifiers.map((i) => i.name);\n\n // Preference topic columns: topic names (de-duped)\n const topicCols = Array.from(\n new Set(\n purposesWithTopics.flatMap(\n (p) => p.topics?.map((t) => `${p.trackingType}_${t.slug}`) ?? [],\n ),\n ),\n ).sort((a, b) => a.localeCompare(b));\n\n // Some setups also want a per-purpose boolean column (e.g., “Email”, “Sms”).\n // If your transformer includes those, list them here, derived from purposes:\n const purposeCols = Array.from(\n new Set(purposesWithTopics.map((p) => p.trackingType)),\n ).sort((a, b) => a.localeCompare(b));\n\n // Build the complete header skeleton.\n // We’ll still union with the first transformed row’s keys to be safe.\n const completeHeadersList = [\n ...CORE_COLS,\n ...identifierCols,\n ...purposeCols,\n ...topicCols,\n ];\n\n // Lazily initialize CSV header order from the first transformed row.\n let headerOrder: string[] | null = null;\n let wroteHeader = false;\n const writeRows = (items: PreferenceQueryResponseItem[]): void => {\n if (!items || items.length === 0) return;\n const rows = items.map((row) =>\n transformPreferenceRecordToCsv(row, exportIdentifiersWithDelimiter),\n );\n if (!wroteHeader) {\n const firstKeys = Object.keys(rows[0] ?? {});\n const seen = new Set<string>();\n headerOrder = [...completeHeadersList, ...firstKeys].filter((k) => {\n if (k === undefined) return false;\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n initCsvFile(file, headerOrder);\n wroteHeader = true;\n }\n appendCsvRowsOrdered(file, rows, headerOrder!);\n };\n\n if (shouldChunk) {\n // Stream via chunked fetcher with page callback\n await fetchConsentPreferencesChunked(sombra, {\n partition,\n filterBy,\n limit: concurrency,\n windowConcurrency,\n maxChunks,\n maxLookbackDays,\n onItems: (items) => writeRows(items),\n });\n\n logger.info(colors.green(`Finished writing CSV to ${file}`));\n return;\n }\n\n // Non-chunked path: still stream page-by-page via onItems (no in-memory accumulation)\n await fetchConsentPreferences(sombra, {\n partition,\n filterBy,\n limit: concurrency, // page size (API max 50 enforced internally)\n onItems: (items) => writeRows(items),\n });\n\n logger.info(colors.green(`Finished writing CSV to ${file}`));\n}\n"],"mappings":"kZAsBA,MAAM,EAAY,CAChB,SACA,YACA,YACA,mBACA,YACA,MACA,MACA,MACA,gBACA,WACA,oBACD,CAqBD,eAAsB,EAEpB,CACE,OACA,YACA,aACA,OACA,eACA,kBACA,iBACA,gBACA,eACA,cAAc,EAAE,CAChB,cACA,cACA,oBACA,YACA,iCACA,mBAEa,CACf,EAAoB,KAAK,QAAQ,KAAK,CAGtC,IAAM,EAAS,MAAM,EAAwB,EAAc,EAAM,EAAW,CACtE,EAAS,EAA4B,EAAc,EAAK,CAGxD,EAAoB,EAAY,IACnC,GAAqC,CACpC,GAAI,CAAC,EAAW,SAAS,IAAI,CAC3B,MAAO,CACL,KAAM,QACN,MAAO,EACR,CAEH,GAAM,CAAC,EAAM,GAAS,EAAW,MAAM,IAAI,CAC3C,MAAO,CAAE,OAAM,QAAO,EAEzB,CAGK,EAAW,CACf,GAAI,EACA,CAAE,gBAAiB,EAAgB,aAAa,CAAE,CAClD,EAAE,CACN,GAAI,EAAiB,CAAE,eAAgB,EAAe,aAAa,CAAE,CAAG,EAAE,CAC1E,GAAI,GAAgB,EAChB,CACE,OAAQ,CACN,GAAI,EACA,CAAE,cAAe,EAAc,aAAa,CAAE,CAC9C,EAAE,CACN,GAAI,EACA,CAAE,aAAc,EAAa,aAAa,CAAE,CAC5C,EAAE,CACP,CACF,CACD,EAAE,CACN,GAAI,EAAkB,OAAS,EAAI,CAAE,YAAa,EAAmB,CAAG,EAAE,CAC3E,CAED,EAAO,KACL,+CAA+C,EAAU,eACvD,EAAc,iBAAmB,eAClC,KACF,CAED,EAAO,KAAK,EAAO,QAAQ,qBAAqB,IAAO,CAAC,CAGxD,GAAM,CAAC,EAAoB,GAAkB,MAAM,QAAQ,IAAI,CAC7D,EAA+B,EAAO,CACtC,EAAoB,EAAO,CAC5B,CAAC,CAGI,EAAiB,EAAe,IAAK,GAAM,EAAE,KAAK,CAGlD,EAAY,MAAM,KACtB,IAAI,IACF,EAAmB,QAChB,GAAM,EAAE,QAAQ,IAAK,GAAM,GAAG,EAAE,aAAa,GAAG,EAAE,OAAO,EAAI,EAAE,CACjE,CACF,CACF,CAAC,MAAM,EAAG,IAAM,EAAE,cAAc,EAAE,CAAC,CAI9B,EAAc,MAAM,KACxB,IAAI,IAAI,EAAmB,IAAK,GAAM,EAAE,aAAa,CAAC,CACvD,CAAC,MAAM,EAAG,IAAM,EAAE,cAAc,EAAE,CAAC,CAI9B,EAAsB,CAC1B,GAAG,EACH,GAAG,EACH,GAAG,EACH,GAAG,EACJ,CAGG,EAA+B,KAC/B,EAAc,GACZ,EAAa,GAA+C,CAChE,GAAI,CAAC,GAAS,EAAM,SAAW,EAAG,OAClC,IAAM,EAAO,EAAM,IAAK,GACtB,EAA+B,EAAK,EAA+B,CACpE,CACD,GAAI,CAAC,EAAa,CAChB,IAAM,EAAY,OAAO,KAAK,EAAK,IAAM,EAAE,CAAC,CACtC,EAAO,IAAI,IACjB,EAAc,CAAC,GAAG,EAAqB,GAAG,EAAU,CAAC,OAAQ,GACvD,IAAM,IAAA,IACN,EAAK,IAAI,EAAE,CAAS,IACxB,EAAK,IAAI,EAAE,CACJ,IACP,CACF,EAAY,EAAM,EAAY,CAC9B,EAAc,GAEhB,EAAqB,EAAM,EAAM,EAAa,EAGhD,GAAI,EAAa,CAEf,MAAM,EAA+B,EAAQ,CAC3C,YACA,WACA,MAAO,EACP,oBACA,YACA,kBACA,QAAU,GAAU,EAAU,EAAM,CACrC,CAAC,CAEF,EAAO,KAAK,EAAO,MAAM,2BAA2B,IAAO,CAAC,CAC5D,OAIF,MAAM,EAAwB,EAAQ,CACpC,YACA,WACA,MAAO,EACP,QAAU,GAAU,EAAU,EAAM,CACrC,CAAC,CAEF,EAAO,KAAK,EAAO,MAAM,2BAA2B,IAAO,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./enums-CyFTrzXY.mjs";import"./constants-CnLQtIBn.mjs";import"./logger-Bj782ZYD.mjs";import"./buildAIIntegrationType-Bk0EbFKV.mjs";import{z as e}from"./syncConfigurationToTranscend-VJd0PnaZ.mjs";import{t}from"./done-input-validation-CcZtaz03.mjs";async function n({auth:n,dataSiloId:r,actions:i,transcendUrl:a}){t(this.process.exit),await e({requestActions:i,transcendUrl:a,auth:n,dataSiloId:r})}export{n as retryRequestDataSilos};
|
|
2
|
+
//# sourceMappingURL=impl-iZoXu4nV.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"impl-
|
|
1
|
+
{"version":3,"file":"impl-iZoXu4nV.mjs","names":["retryRequestDataSilosHelper"],"sources":["../src/commands/request/system/retry-request-data-silos/impl.ts"],"sourcesContent":["import type { LocalContext } from '../../../../context';\nimport type { RequestAction } from '@transcend-io/privacy-types';\nimport { retryRequestDataSilos as retryRequestDataSilosHelper } from '../../../../lib/requests';\nimport { doneInputValidation } from '../../../../lib/cli/done-input-validation';\n\nexport interface RetryRequestDataSilosCommandFlags {\n auth: string;\n dataSiloId: string;\n actions: RequestAction[];\n transcendUrl: string;\n}\n\nexport async function retryRequestDataSilos(\n this: LocalContext,\n {\n auth,\n dataSiloId,\n actions,\n transcendUrl,\n }: RetryRequestDataSilosCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process.exit);\n\n await retryRequestDataSilosHelper({\n requestActions: actions,\n transcendUrl,\n auth,\n dataSiloId,\n });\n}\n"],"mappings":"8PAYA,eAAsB,EAEpB,CACE,OACA,aACA,UACA,gBAEa,CACf,EAAoB,KAAK,QAAQ,KAAK,CAEtC,MAAMA,EAA4B,CAChC,eAAgB,EAChB,eACA,OACA,aACD,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./enums-CyFTrzXY.mjs";import"./constants-CnLQtIBn.mjs";import"./logger-Bj782ZYD.mjs";import"./buildAIIntegrationType-Bk0EbFKV.mjs";import{dt as e}from"./syncConfigurationToTranscend-VJd0PnaZ.mjs";import{t}from"./done-input-validation-CcZtaz03.mjs";async function n({auth:n,transcendUrl:r,actions:i,statuses:a,requestIds:o,createdAtBefore:s,createdAtAfter:c,updatedAtBefore:l,updatedAtAfter:u,concurrency:d}){t(this.process.exit),await e({transcendUrl:r,requestActions:i,auth:n,requestIds:o,statuses:a,concurrency:d,createdAtBefore:s,createdAtAfter:c,updatedAtBefore:l,updatedAtAfter:u})}export{n as markSilent};
|
|
2
|
+
//# sourceMappingURL=impl-lebl6Zek2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impl-lebl6Zek2.mjs","names":[],"sources":["../src/commands/request/mark-silent/impl.ts"],"sourcesContent":["import type { LocalContext } from '../../../context';\nimport { markSilentPrivacyRequests } from '../../../lib/requests';\nimport type { RequestAction, RequestStatus } from '@transcend-io/privacy-types';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation';\n\nexport interface MarkSilentCommandFlags {\n auth: string;\n actions: RequestAction[];\n statuses?: RequestStatus[];\n requestIds?: string[];\n createdAtBefore?: Date;\n createdAtAfter?: Date;\n updatedAtBefore?: Date;\n updatedAtAfter?: Date;\n transcendUrl: string;\n concurrency: number;\n}\n\nexport async function markSilent(\n this: LocalContext,\n {\n auth,\n transcendUrl,\n actions,\n statuses,\n requestIds,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n concurrency,\n }: MarkSilentCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process.exit);\n\n await markSilentPrivacyRequests({\n transcendUrl,\n requestActions: actions,\n auth,\n requestIds,\n statuses,\n concurrency,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n });\n}\n"],"mappings":"+PAkBA,eAAsB,EAEpB,CACE,OACA,eACA,UACA,WACA,aACA,kBACA,iBACA,kBACA,iBACA,eAEa,CACf,EAAoB,KAAK,QAAQ,KAAK,CAEtC,MAAM,EAA0B,CAC9B,eACA,eAAgB,EAChB,OACA,aACA,WACA,cACA,kBACA,iBACA,kBACA,iBACD,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./enums-CyFTrzXY.mjs";import"./constants-CnLQtIBn.mjs";import{t as e}from"./logger-Bj782ZYD.mjs";import"./buildAIIntegrationType-Bk0EbFKV.mjs";import{O as t,b as n,x as r}from"./syncConfigurationToTranscend-VJd0PnaZ.mjs";import{a as i,i as a,n as o,o as s,r as c,s as l,t as u}from"./pooling-CazydwlD.mjs";import{t as d}from"./done-input-validation-CcZtaz03.mjs";import f from"colors";async function p(){let r=Number(process.env.WORKER_ID||`0`);e.info(`[w${r}] ready pid=${process.pid}`),process.send?.({type:`ready`}),process.on(`message`,async i=>{if(!i||typeof i!=`object`||(i.type===`shutdown`&&process.exit(0),i.type!==`task`))return;let{filePath:a,options:o}=i.payload,{outputDir:s,clearOutputDir:c}=o;try{e.info(`[w${r}] processing ${a}`);let{DuckDBInstance:t}=await import(`@duckdb/node-api`);await n({filePath:a,outputDir:s,clearOutputDir:c,onProgress:(e,t)=>process.send?.({type:`progress`,payload:{filePath:a,processed:e,total:t}})},t),process.send?.({type:`result`,payload:{ok:!0,filePath:a}})}catch(n){let i=t(n);e.error(`[w${r}] ERROR ${a}: ${n.stack||i}`),process.send?.({type:`result`,payload:{ok:!1,filePath:a,error:i}})}}),await new Promise(()=>{})}function m(e){return c(e)}function h(e){return a(e)}const g={renderHeader:m,renderWorkers:h};function _(){return typeof __filename<`u`?__filename:process.argv[1]}async function v(t){d(this.process.exit);let{directory:n,outputDir:a,clearOutputDir:c,concurrency:p,viewerMode:m}=t,h=r(n,this),{poolSize:v,cpuCount:y}=l(p,h.length);e.info(f.green(`Converting ${h.length} Parquet file(s) → CSV with pool size ${v} (CPU=${y})`));let b=h.map(e=>({filePath:e,options:{outputDir:a,clearOutputDir:c}}));await o({title:`Parquet → CSV - ${n}`,baseDir:n||a||process.cwd(),childFlag:s,childModulePath:_(),poolSize:v,cpuCount:y,filesTotal:h.length,hooks:{nextTask:()=>b.shift(),taskLabel:e=>e.filePath,initTotals:()=>({}),initSlotProgress:()=>void 0,onProgress:e=>e,onResult:(e,t)=>({totals:e,ok:!!t.ok}),postProcess:async()=>{}},viewerMode:m,render:e=>i(e,g,m),extraKeyHandler:({logsBySlot:e,repaint:t,setPaused:n})=>u({logsBySlot:e,repaint:t,setPaused:n})})}process.argv.includes(`--as-child`)&&p().catch(t=>{e.error(t),process.exit(1)});export{v as parquetToCsv};
|
|
2
|
+
//# sourceMappingURL=impl-p0YN9e2e.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impl-p0YN9e2e.mjs","names":[],"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 const { DuckDBInstance } = await import('@duckdb/node-api');\n await parquetToCsvOneFile(\n {\n filePath,\n outputDir,\n clearOutputDir,\n onProgress: (processed, total) =>\n process.send?.({\n type: 'progress',\n payload: { filePath, processed, total },\n }),\n },\n DuckDBInstance,\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":"wYAiCA,eAAsB,GAA0B,CAC9C,IAAM,EAAW,OAAO,QAAQ,IAAI,WAAa,IAAI,CACrD,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,EAAO,KAAK,KAAK,EAAS,eAAe,IAAW,CACpD,GAAM,CAAE,kBAAmB,MAAM,OAAO,oBACxC,MAAM,EACJ,CACE,WACA,YACA,iBACA,YAAa,EAAW,IACtB,QAAQ,OAAO,CACb,KAAM,WACN,QAAS,CAAE,WAAU,YAAW,QAAO,CACxC,CAAC,CACL,CACD,EACD,CAED,QAAQ,OAAO,CACb,KAAM,SACN,QAAS,CAAE,GAAI,GAAM,WAAU,CAChC,CAAC,OACK,EAAK,CACZ,IAAM,EAAU,EAAoB,EAAI,CACxC,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,CCrEJ,SAAS,EACP,EACU,CAEV,OAAO,EAAW,EAAI,CASxB,SAAS,EACP,EACU,CACV,OAAO,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,EAAoB,KAAK,QAAQ,KAAK,CAEtC,GAAM,CAAE,YAAW,YAAW,iBAAgB,cAAa,cACzD,EAGI,EAAQ,EAA0B,EAAW,KAAK,CAGlD,CAAE,WAAU,YAAa,EAAgB,EAAa,EAAM,OAAO,CAEzE,EAAO,KACL,EAAO,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,MAAM,EAAQ,CACZ,MAAO,mBAAmB,IAC1B,QAAS,GAAa,GAAa,QAAQ,KAAK,CAChD,UAAW,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,GAAU,EAAgB,EAAO,EAAoB,EAAW,CACzE,iBAAkB,CAAE,aAAY,UAAS,eACvC,EAAsB,CAAE,aAAY,UAAS,YAAW,CAAC,CAC5D,CAAC,CAMA,QAAQ,KAAK,SAAA,aAAoB,EACnC,GAAU,CAAC,MAAO,GAAQ,CACxB,EAAO,MAAM,EAAI,CACjB,QAAQ,KAAK,EAAE,EACf"}
|