@kitalive/sfdx-plugin 0.3.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -10
- package/lib/bulk.js +2 -6
- package/lib/bulk.js.map +1 -1
- package/lib/commands/kit/data/csv/convert.d.ts +0 -13
- package/lib/commands/kit/data/csv/convert.js +3 -67
- package/lib/commands/kit/data/csv/convert.js.map +1 -1
- package/lib/commands/kit/layout/assignments/deploy.d.ts +0 -1
- package/lib/commands/kit/layout/assignments/deploy.js +2 -6
- package/lib/commands/kit/layout/assignments/deploy.js.map +1 -1
- package/lib/commands/kit/layout/assignments/retrieve.d.ts +0 -1
- package/lib/commands/kit/layout/assignments/retrieve.js +23 -8
- package/lib/commands/kit/layout/assignments/retrieve.js.map +1 -1
- package/lib/commands/kit/object/fields/describe.d.ts +14 -0
- package/lib/commands/kit/object/fields/describe.js +87 -0
- package/lib/commands/kit/object/fields/describe.js.map +1 -0
- package/lib/commands/kit/object/fields/setup.d.ts +21 -0
- package/lib/commands/kit/object/fields/setup.js +203 -0
- package/lib/commands/kit/object/fields/setup.js.map +1 -0
- package/lib/metadata.d.ts +18 -0
- package/lib/metadata.js +69 -0
- package/lib/metadata.js.map +1 -0
- package/lib/types.d.ts +25 -0
- package/lib/utils.d.ts +16 -1
- package/lib/utils.js +76 -1
- package/lib/utils.js.map +1 -1
- package/oclif.manifest.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { flags, SfdxCommand } from '@salesforce/command';
|
|
2
|
+
declare type SetupResult = {
|
|
3
|
+
field: string;
|
|
4
|
+
result: 'created' | 'updated' | 'deleted' | 'identical' | 'error';
|
|
5
|
+
error?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function setFieldOptions(field: any, existingField: any): void;
|
|
8
|
+
export default class FieldsSetupCommand extends SfdxCommand {
|
|
9
|
+
static description: string;
|
|
10
|
+
static examples: string[];
|
|
11
|
+
protected static requiresUsername: boolean;
|
|
12
|
+
protected static requiresProject: boolean;
|
|
13
|
+
protected static flagsConfig: {
|
|
14
|
+
object: flags.Discriminated<flags.String>;
|
|
15
|
+
file: flags.Discriminated<flags.String>;
|
|
16
|
+
delete: flags.Discriminated<flags.Boolean<boolean>>;
|
|
17
|
+
force: flags.Discriminated<flags.Boolean<boolean>>;
|
|
18
|
+
};
|
|
19
|
+
run(): Promise<SetupResult[]>;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setFieldOptions = void 0;
|
|
4
|
+
const command_1 = require("@salesforce/command");
|
|
5
|
+
const fs = require("fs-extra");
|
|
6
|
+
const metadata_1 = require("../../../../metadata");
|
|
7
|
+
const utils_1 = require("../../../../utils");
|
|
8
|
+
const deepCopy = (object) => object && JSON.parse(JSON.stringify(object));
|
|
9
|
+
const deepEquals = (obj1, obj2) => JSON.stringify(obj1) === JSON.stringify(obj2);
|
|
10
|
+
function setFieldOptions(field, existingField) {
|
|
11
|
+
var _a;
|
|
12
|
+
for (const [key, value] of Object.entries(field)) {
|
|
13
|
+
if (value === '')
|
|
14
|
+
delete field[key];
|
|
15
|
+
}
|
|
16
|
+
if (field.formula && (existingField === null || existingField === void 0 ? void 0 : existingField.formulaTreatBlanksAs) != null)
|
|
17
|
+
(_a = field.formulaTreatBlanksAs) !== null && _a !== void 0 ? _a : (field.formulaTreatBlanksAs = existingField.formulaTreatBlanksAs);
|
|
18
|
+
const setDefault = (name, value) => {
|
|
19
|
+
var _a;
|
|
20
|
+
if (field[name] === undefined)
|
|
21
|
+
field[name] = (_a = existingField === null || existingField === void 0 ? void 0 : existingField[name]) !== null && _a !== void 0 ? _a : value;
|
|
22
|
+
};
|
|
23
|
+
switch (field.type) {
|
|
24
|
+
case 'Checkbox':
|
|
25
|
+
if (!field.formula)
|
|
26
|
+
setDefault('defaultValue', false);
|
|
27
|
+
break;
|
|
28
|
+
case 'Currency':
|
|
29
|
+
case 'Number':
|
|
30
|
+
case 'Percent':
|
|
31
|
+
setDefault('precision', 18);
|
|
32
|
+
setDefault('scale', 0);
|
|
33
|
+
break;
|
|
34
|
+
case 'Text':
|
|
35
|
+
if (!field.formula)
|
|
36
|
+
setDefault('length', 255);
|
|
37
|
+
break;
|
|
38
|
+
case 'EncryptedText':
|
|
39
|
+
setDefault('length', 175);
|
|
40
|
+
setDefault('maskChar', 'asterisk');
|
|
41
|
+
setDefault('maskType', 'all');
|
|
42
|
+
break;
|
|
43
|
+
case 'LongTextArea':
|
|
44
|
+
case 'Html':
|
|
45
|
+
setDefault('length', 32768);
|
|
46
|
+
setDefault('visibleLines', 10);
|
|
47
|
+
break;
|
|
48
|
+
case 'Location':
|
|
49
|
+
setDefault('scale', 5);
|
|
50
|
+
break;
|
|
51
|
+
case 'Picklist':
|
|
52
|
+
setPicklistOptions(field, existingField);
|
|
53
|
+
break;
|
|
54
|
+
case 'MultiselectPicklist':
|
|
55
|
+
setDefault('visibleLines', 4);
|
|
56
|
+
setPicklistOptions(field, existingField);
|
|
57
|
+
break;
|
|
58
|
+
case 'Lookup':
|
|
59
|
+
if (field.required === 'true')
|
|
60
|
+
field.deleteConstraint = 'Restrict';
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.setFieldOptions = setFieldOptions;
|
|
65
|
+
function setPicklistOptions(field, existingField) {
|
|
66
|
+
var _a;
|
|
67
|
+
const { restricted, values, valueSetName } = field;
|
|
68
|
+
if (values || valueSetName) {
|
|
69
|
+
const valueSet = existingField
|
|
70
|
+
? deepCopy(existingField.valueSet)
|
|
71
|
+
: { restricted: true };
|
|
72
|
+
if (restricted !== undefined)
|
|
73
|
+
valueSet.restricted = restricted;
|
|
74
|
+
if (restricted === 'false')
|
|
75
|
+
delete valueSet.restricted;
|
|
76
|
+
if (valueSet.controllingField === null)
|
|
77
|
+
delete valueSet.controllingField;
|
|
78
|
+
if (valueSet.valueSettings === null)
|
|
79
|
+
delete valueSet.valueSettings;
|
|
80
|
+
if (values) {
|
|
81
|
+
(_a = valueSet.valueSetDefinition) !== null && _a !== void 0 ? _a : (valueSet.valueSetDefinition = { value: [] });
|
|
82
|
+
const optionMap = new Map(valueSet.valueSetDefinition.value.map((option) => [
|
|
83
|
+
option.fullName,
|
|
84
|
+
option,
|
|
85
|
+
]));
|
|
86
|
+
const options = values.split(/;|[\r\n]+/).map((value) => {
|
|
87
|
+
var _a;
|
|
88
|
+
const [name, label] = value.split(/\s*:\s*/);
|
|
89
|
+
const option = (_a = optionMap.get(name)) !== null && _a !== void 0 ? _a : { fullName: name };
|
|
90
|
+
option['label'] = label ? label : name;
|
|
91
|
+
return option;
|
|
92
|
+
});
|
|
93
|
+
valueSet.valueSetDefinition.value = options;
|
|
94
|
+
delete valueSet.valueSetName;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
valueSet.valueSetName = valueSetName;
|
|
98
|
+
delete valueSet.valueSetDefinition;
|
|
99
|
+
}
|
|
100
|
+
field.valueSet =
|
|
101
|
+
existingField && deepEquals(valueSet, existingField.valueSet)
|
|
102
|
+
? existingField.valueSet
|
|
103
|
+
: valueSet;
|
|
104
|
+
delete field.restricted;
|
|
105
|
+
delete field.values;
|
|
106
|
+
delete field.valueSetName;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
class FieldsSetupCommand extends command_1.SfdxCommand {
|
|
110
|
+
async run() {
|
|
111
|
+
const { object, file, delete: del, force } = this.flags;
|
|
112
|
+
const conn = this.org.getConnection();
|
|
113
|
+
const namespace = await (0, metadata_1.getOrgNamespace)(conn);
|
|
114
|
+
const pattern = namespace ? new RegExp(`^${namespace}__`, 'g') : null;
|
|
115
|
+
const removeNamespace = (name) => pattern ? name.replace(pattern, '') : name;
|
|
116
|
+
this.ux.startSpinner('parse ' + file);
|
|
117
|
+
const fields = (await (0, utils_1.parseCsv)(fs.createReadStream(file)));
|
|
118
|
+
this.ux.stopSpinner();
|
|
119
|
+
const existingFieldMap = await (0, metadata_1.getCustomFieldMap)(conn, object);
|
|
120
|
+
const oldFieldMap = new Map(existingFieldMap);
|
|
121
|
+
for (const field of fields) {
|
|
122
|
+
const name = removeNamespace(field.fullName);
|
|
123
|
+
const existingField = existingFieldMap.get(name);
|
|
124
|
+
existingFieldMap.delete(name);
|
|
125
|
+
setFieldOptions(field, existingField);
|
|
126
|
+
field.fullName = `${object}.${field.fullName}`;
|
|
127
|
+
}
|
|
128
|
+
let deleteFields = del ? [...existingFieldMap.values()] : [];
|
|
129
|
+
if (deleteFields.length && !force) {
|
|
130
|
+
const confirmed = await this.ux.confirm(`delete fields: ${deleteFields
|
|
131
|
+
.map(({ fullName }) => fullName)
|
|
132
|
+
.join(', ')}\nDo you want to delete the above fields? (y/n)`);
|
|
133
|
+
if (!confirmed)
|
|
134
|
+
deleteFields = [];
|
|
135
|
+
}
|
|
136
|
+
const results = [];
|
|
137
|
+
if (fields.length) {
|
|
138
|
+
this.ux.startSpinner('upsert fields');
|
|
139
|
+
const upsertResults = await (0, metadata_1.upsertMetadata)(conn, 'CustomField', fields);
|
|
140
|
+
const newFieldMap = await (0, metadata_1.getCustomFieldMap)(conn, object);
|
|
141
|
+
for (const { fullName, created, success, errors } of upsertResults) {
|
|
142
|
+
const name = fullName.slice(object.length + 1);
|
|
143
|
+
let result = created ? 'created' : success ? 'updated' : 'error';
|
|
144
|
+
if (result === 'updated' &&
|
|
145
|
+
deepEquals(newFieldMap.get(name), oldFieldMap.get(name))) {
|
|
146
|
+
result = 'identical';
|
|
147
|
+
}
|
|
148
|
+
results.push({
|
|
149
|
+
field: name,
|
|
150
|
+
result,
|
|
151
|
+
error: Array.isArray(errors)
|
|
152
|
+
? errors.map((e) => e.message).join(', ')
|
|
153
|
+
: errors === null || errors === void 0 ? void 0 : errors.message,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
this.ux.stopSpinner();
|
|
157
|
+
}
|
|
158
|
+
if (deleteFields.length) {
|
|
159
|
+
this.ux.startSpinner('delete fields');
|
|
160
|
+
const names = deleteFields.map(({ fullName }) => `${object}.${fullName}`);
|
|
161
|
+
for (const { fullName, success, errors } of await (0, metadata_1.deleteMetadata)(conn, 'CustomField', names)) {
|
|
162
|
+
results.push({
|
|
163
|
+
field: fullName.slice(object.length + 1),
|
|
164
|
+
result: success ? 'deleted' : 'error',
|
|
165
|
+
error: Array.isArray(errors)
|
|
166
|
+
? errors.map((e) => e.message).join(', ')
|
|
167
|
+
: errors === null || errors === void 0 ? void 0 : errors.message,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
this.ux.stopSpinner();
|
|
171
|
+
}
|
|
172
|
+
this.ux.styledHeader('Fields setup result');
|
|
173
|
+
this.ux.table(results, ['field', 'result', 'error']);
|
|
174
|
+
return results;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
exports.default = FieldsSetupCommand;
|
|
178
|
+
FieldsSetupCommand.description = 'upsert and delete object fields from a CSV file';
|
|
179
|
+
FieldsSetupCommand.examples = [
|
|
180
|
+
'$ sfdx kit:object:fields:setup -o Account -f path/to/account_fields.csv',
|
|
181
|
+
'$ sfdx kit:object:fields:setup -u me@my.org -o CustomObject__c -f path/to/custom_object_fields.csv --delete',
|
|
182
|
+
];
|
|
183
|
+
FieldsSetupCommand.requiresUsername = true;
|
|
184
|
+
FieldsSetupCommand.requiresProject = false;
|
|
185
|
+
FieldsSetupCommand.flagsConfig = {
|
|
186
|
+
object: command_1.flags.string({
|
|
187
|
+
char: 'o',
|
|
188
|
+
required: true,
|
|
189
|
+
description: 'SObject name',
|
|
190
|
+
}),
|
|
191
|
+
file: command_1.flags.string({
|
|
192
|
+
char: 'f',
|
|
193
|
+
required: true,
|
|
194
|
+
description: 'input csv file path',
|
|
195
|
+
}),
|
|
196
|
+
delete: command_1.flags.boolean({
|
|
197
|
+
description: 'delete fields that are not in the csv file',
|
|
198
|
+
}),
|
|
199
|
+
force: command_1.flags.boolean({
|
|
200
|
+
description: 'Do not confirm when deleting',
|
|
201
|
+
}),
|
|
202
|
+
};
|
|
203
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../../src/commands/kit/object/fields/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Connection, MetadataInfo, SaveResult, UpsertResult as JsforceUpsertResult } from 'jsforce';
|
|
2
|
+
import { CustomField } from './types';
|
|
3
|
+
interface UpsertResult extends JsforceUpsertResult {
|
|
4
|
+
errors: {
|
|
5
|
+
message: string;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export declare function getOrgNamespace(conn: Connection): Promise<string>;
|
|
9
|
+
export declare function completeDefaultNamespace(conn: Connection, objectName: string): Promise<string>;
|
|
10
|
+
export declare function completeDefaultNamespace(conn: Connection, objectNames: string[]): Promise<string[]>;
|
|
11
|
+
export declare function chunkMetadata<T>(type: string, metadata: T | T[]): Array<T[]>;
|
|
12
|
+
export declare function readMetadata(conn: Connection, type: string, fullNames: string | string[]): Promise<MetadataInfo[]>;
|
|
13
|
+
export declare function updateMetadata(conn: Connection, type: string, metadata: MetadataInfo | MetadataInfo[]): Promise<SaveResult[]>;
|
|
14
|
+
export declare function upsertMetadata(conn: Connection, type: string, metadata: MetadataInfo | MetadataInfo[]): Promise<UpsertResult[]>;
|
|
15
|
+
export declare function deleteMetadata(conn: Connection, type: string, fullNames: string | string[]): Promise<SaveResult[]>;
|
|
16
|
+
export declare function getCustomFields(conn: Connection, object: string): Promise<CustomField[]>;
|
|
17
|
+
export declare function getCustomFieldMap(conn: Connection, object: string): Promise<Map<string, CustomField>>;
|
|
18
|
+
export {};
|
package/lib/metadata.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCustomFieldMap = exports.getCustomFields = exports.deleteMetadata = exports.upsertMetadata = exports.updateMetadata = exports.readMetadata = exports.chunkMetadata = exports.completeDefaultNamespace = exports.getOrgNamespace = void 0;
|
|
4
|
+
const utils_1 = require("./utils");
|
|
5
|
+
let orgNamespace;
|
|
6
|
+
async function getOrgNamespace(conn) {
|
|
7
|
+
if (orgNamespace === undefined) {
|
|
8
|
+
const { records: [{ NamespacePrefix }], } = await conn.query('SELECT NamespacePrefix FROM Organization');
|
|
9
|
+
orgNamespace = NamespacePrefix;
|
|
10
|
+
}
|
|
11
|
+
return orgNamespace;
|
|
12
|
+
}
|
|
13
|
+
exports.getOrgNamespace = getOrgNamespace;
|
|
14
|
+
async function completeDefaultNamespace(conn, objectName) {
|
|
15
|
+
const ns = await getOrgNamespace(conn);
|
|
16
|
+
if (!ns)
|
|
17
|
+
return objectName;
|
|
18
|
+
const isArray = Array.isArray(objectName);
|
|
19
|
+
const objectNames = isArray ? objectName : [objectName];
|
|
20
|
+
const results = objectNames.map((name) => {
|
|
21
|
+
if (name.endsWith('__c') && name.split('__').length === 2) {
|
|
22
|
+
return `${ns}__${name}`;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
return name;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return isArray ? results : results[0];
|
|
29
|
+
}
|
|
30
|
+
exports.completeDefaultNamespace = completeDefaultNamespace;
|
|
31
|
+
function chunkMetadata(type, metadata) {
|
|
32
|
+
// metadata limit: https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_createMetadata.htm
|
|
33
|
+
const size = type === 'CustomMetadata' || type === 'CustomApplication' ? 200 : 10;
|
|
34
|
+
return (0, utils_1.chunk)(Array.isArray(metadata) ? metadata : [metadata], size);
|
|
35
|
+
}
|
|
36
|
+
exports.chunkMetadata = chunkMetadata;
|
|
37
|
+
function readMetadata(conn, type, fullNames) {
|
|
38
|
+
return Promise.all(chunkMetadata(type, fullNames).map((data) => conn.metadata.read(type, data))).then((a) => a.flat());
|
|
39
|
+
}
|
|
40
|
+
exports.readMetadata = readMetadata;
|
|
41
|
+
function updateMetadata(conn, type, metadata) {
|
|
42
|
+
return Promise.all(chunkMetadata(type, metadata).map((data) => conn.metadata.update(type, data))).then((a) => a.flat());
|
|
43
|
+
}
|
|
44
|
+
exports.updateMetadata = updateMetadata;
|
|
45
|
+
function upsertMetadata(conn, type, metadata) {
|
|
46
|
+
return Promise.all(chunkMetadata(type, metadata).map((data) => conn.metadata.upsert(type, data))).then((a) => a.flat());
|
|
47
|
+
}
|
|
48
|
+
exports.upsertMetadata = upsertMetadata;
|
|
49
|
+
function deleteMetadata(conn, type, fullNames) {
|
|
50
|
+
return Promise.all(chunkMetadata(type, fullNames).map((data) => conn.metadata.delete(type, data))).then((a) => a.flat());
|
|
51
|
+
}
|
|
52
|
+
exports.deleteMetadata = deleteMetadata;
|
|
53
|
+
async function getCustomFields(conn, object) {
|
|
54
|
+
object = await completeDefaultNamespace(conn, object);
|
|
55
|
+
const { records } = await conn.tooling.query(`SELECT DeveloperName, Metadata FROM CustomField WHERE EntityDefinition.QualifiedApiName='${object}' AND ManageableState = 'unmanaged'`);
|
|
56
|
+
return records
|
|
57
|
+
.filter((r) => !r.DeveloperName.endsWith('_del'))
|
|
58
|
+
.map((r) => ({
|
|
59
|
+
fullName: r.DeveloperName + '__c',
|
|
60
|
+
...r.Metadata,
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
exports.getCustomFields = getCustomFields;
|
|
64
|
+
async function getCustomFieldMap(conn, object) {
|
|
65
|
+
const fields = await getCustomFields(conn, object);
|
|
66
|
+
return new Map(fields.map((f) => [f.fullName, f]));
|
|
67
|
+
}
|
|
68
|
+
exports.getCustomFieldMap = getCustomFieldMap;
|
|
69
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"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"}
|
package/lib/types.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MetadataInfo } from 'jsforce';
|
|
1
2
|
export declare type LayoutAssignment = {
|
|
2
3
|
layout: string;
|
|
3
4
|
recordType?: string;
|
|
@@ -9,3 +10,27 @@ export declare type ProfileMetadata = {
|
|
|
9
10
|
fullName: string;
|
|
10
11
|
layoutAssignments: LayoutAssignment[];
|
|
11
12
|
};
|
|
13
|
+
interface CustomValue {
|
|
14
|
+
fullName?: string;
|
|
15
|
+
valueName?: string;
|
|
16
|
+
label: string;
|
|
17
|
+
default?: boolean;
|
|
18
|
+
}
|
|
19
|
+
interface ValueSet {
|
|
20
|
+
restricted?: boolean;
|
|
21
|
+
valueSetName?: string;
|
|
22
|
+
valueSetDefinition?: {
|
|
23
|
+
sorted?: boolean;
|
|
24
|
+
value: CustomValue[];
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export interface CustomField extends MetadataInfo {
|
|
28
|
+
label?: string;
|
|
29
|
+
type?: string;
|
|
30
|
+
defaultValue?: string;
|
|
31
|
+
valueSet?: ValueSet;
|
|
32
|
+
restricted?: boolean;
|
|
33
|
+
valueSetName?: string;
|
|
34
|
+
values?: string;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
package/lib/utils.d.ts
CHANGED
|
@@ -1 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { JsonMap } from '@salesforce/ts-types';
|
|
3
|
+
export declare function chunk<T>(array: Array<T>, size: number): Array<Array<T>>;
|
|
4
|
+
export declare function rangeGenerator(from: number, to: number): Iterable<number>;
|
|
5
|
+
export declare function range(from: number, to: number): Array<number>;
|
|
6
|
+
export declare function parseCsv(input: NodeJS.ReadableStream, options?: {
|
|
7
|
+
encoding?: string;
|
|
8
|
+
delimiter?: string;
|
|
9
|
+
quote?: string;
|
|
10
|
+
skiplines?: number;
|
|
11
|
+
trim?: boolean;
|
|
12
|
+
mapping?: JsonMap;
|
|
13
|
+
convert?: (row: JsonMap) => JsonMap | null | undefined;
|
|
14
|
+
}): Promise<JsonMap[]>;
|
|
15
|
+
export declare function loadScript(file: any): any;
|
|
16
|
+
export declare function columnMapper(mapping: any): (row: any) => {};
|
package/lib/utils.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.chunk = void 0;
|
|
3
|
+
exports.columnMapper = exports.loadScript = exports.parseCsv = exports.range = exports.rangeGenerator = exports.chunk = void 0;
|
|
4
|
+
const csv = require("fast-csv");
|
|
5
|
+
const iconv_lite_1 = require("iconv-lite");
|
|
6
|
+
const path = require("path");
|
|
7
|
+
const stream_1 = require("stream");
|
|
4
8
|
function chunk(array, size) {
|
|
5
9
|
const result = [];
|
|
6
10
|
for (let i = 0, l = array.length; i < l; i += size) {
|
|
@@ -9,4 +13,75 @@ function chunk(array, size) {
|
|
|
9
13
|
return result;
|
|
10
14
|
}
|
|
11
15
|
exports.chunk = chunk;
|
|
16
|
+
function* rangeGenerator(from, to) {
|
|
17
|
+
for (let i = from; i <= to; i++) {
|
|
18
|
+
yield i;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.rangeGenerator = rangeGenerator;
|
|
22
|
+
function range(from, to) {
|
|
23
|
+
return Array.from(rangeGenerator(from, to));
|
|
24
|
+
}
|
|
25
|
+
exports.range = range;
|
|
26
|
+
function parseCsv(input, options) {
|
|
27
|
+
const { encoding, delimiter, quote, skiplines, trim, mapping, convert } = options !== null && options !== void 0 ? options : {};
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const mapper = mapping ? columnMapper(mapping) : undefined;
|
|
30
|
+
let lines = 2;
|
|
31
|
+
const rows = [];
|
|
32
|
+
const parser = csv
|
|
33
|
+
.parse({
|
|
34
|
+
headers: true,
|
|
35
|
+
ignoreEmpty: true,
|
|
36
|
+
delimiter: delimiter === '\\t' ? '\t' : delimiter || ',',
|
|
37
|
+
quote: quote !== null && quote !== void 0 ? quote : '"',
|
|
38
|
+
skipLines: skiplines,
|
|
39
|
+
trim,
|
|
40
|
+
})
|
|
41
|
+
.on('data', (row) => {
|
|
42
|
+
try {
|
|
43
|
+
if (mapper)
|
|
44
|
+
row = mapper(row);
|
|
45
|
+
if (convert)
|
|
46
|
+
row = convert(row);
|
|
47
|
+
if (row)
|
|
48
|
+
rows.push(row);
|
|
49
|
+
lines++;
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
throw new Error(`A error occurred in csv file at line ${lines}: ${e.message}\ndata: ${JSON.stringify(row)}`);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
const callback = (e) => (e ? reject(e) : resolve(rows));
|
|
56
|
+
if (!encoding || encoding === 'utf8') {
|
|
57
|
+
(0, stream_1.pipeline)(input, parser, callback);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
(0, stream_1.pipeline)(input, (0, iconv_lite_1.decodeStream)(encoding), parser, callback);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
exports.parseCsv = parseCsv;
|
|
65
|
+
function loadScript(file) {
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
67
|
+
const script = require(path.resolve(file));
|
|
68
|
+
if (!script.convert)
|
|
69
|
+
throw new Error('function convert is not exported');
|
|
70
|
+
return script;
|
|
71
|
+
}
|
|
72
|
+
exports.loadScript = loadScript;
|
|
73
|
+
function columnMapper(mapping) {
|
|
74
|
+
const keys = Object.keys(mapping);
|
|
75
|
+
return (row) => {
|
|
76
|
+
const result = {};
|
|
77
|
+
for (const to of keys) {
|
|
78
|
+
const from = mapping[to];
|
|
79
|
+
if (!(from in row))
|
|
80
|
+
throw new Error(`The column '${from}' is not found`);
|
|
81
|
+
result[to] = row[from];
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
exports.columnMapper = columnMapper;
|
|
12
87
|
//# sourceMappingURL=utils.js.map
|
package/lib/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AACA,gCAAgC;AAChC,2CAA0C;AAC1C,6BAA6B;AAC7B,mCAAkC;AAElC,SAAgB,KAAK,CAAI,KAAe,EAAE,IAAY;IACpD,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE;QAClD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;KACvC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAND,sBAMC;AAED,QAAe,CAAC,CAAC,cAAc,CAAC,IAAY,EAAE,EAAU;IACtD,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QAC/B,MAAM,CAAC,CAAC;KACT;AACH,CAAC;AAJD,wCAIC;AAED,SAAgB,KAAK,CAAC,IAAY,EAAE,EAAU;IAC5C,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAFD,sBAEC;AAED,SAAgB,QAAQ,CACtB,KAA4B,EAC5B,OAQC;IAED,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GACrE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC;IAChB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE3D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,GAAG;aACf,KAAK,CAAC;YACL,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG;YACxD,KAAK,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,GAAG;YACnB,SAAS,EAAE,SAAS;YACpB,IAAI;SACL,CAAC;aACD,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;YAClB,IAAI;gBACF,IAAI,MAAM;oBAAE,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,OAAO;oBAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;gBAChC,IAAI,GAAG;oBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACxB,KAAK,EAAE,CAAC;aACT;YAAC,OAAO,CAAC,EAAE;gBACV,MAAM,IAAI,KAAK,CACb,wCAAwC,KAAK,KAC3C,CAAC,CAAC,OACJ,WAAW,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CACjC,CAAC;aACH;QACH,CAAC,CAAC,CAAC;QAEL,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,MAAM,EAAE;YACpC,IAAA,iBAAQ,EAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;SACnC;aAAM;YACL,IAAA,iBAAQ,EAAC,KAAK,EAAE,IAAA,yBAAY,EAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;SAC3D;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAlDD,4BAkDC;AAED,SAAgB,UAAU,CAAC,IAAI;IAC7B,8DAA8D;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACzE,OAAO,MAAM,CAAC;AAChB,CAAC;AALD,gCAKC;AAED,SAAgB,YAAY,CAAC,OAAO;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,EAAE,EAAE;QACb,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE;YACrB,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;YACzB,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,gBAAgB,CAAC,CAAC;YACzE,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;SACxB;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAXD,oCAWC"}
|