Skip to content

Commit e69ec9e

Browse files
committed
feat: add import multipack command to enhance datapack management
- Implemented ImportMultipackCommand to allow users to select and install multipacks from Salesforce static resources. - Updated index.ts to export the new command. - Enhanced OpenSalesforceCommand to utilize the new DatapackTypeDefinition for improved record handling. - Modified execRestApiCommand to handle response types more flexibly. - Added importMultipack constant to constants.ts for command registration. - Removed obsolete exportQueryDefinitions files to streamline codebase. - Updated extension.ts to include necessary imports for new functionalities. - Refactored datapack export queries to support new datapack type definitions. - Improved datapack data provider to utilize new grouping and definition structures. - Enhanced object nodes to leverage new datapack definitions for better data representation.
1 parent 2323bfb commit e69ec9e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+2265
-665
lines changed

packages/cli/src/commands/activate.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { Logger, LogManager, FileSystem } from '@vlocode/core';
2-
import { OmniScriptActivator, OmniScriptVersionDetail, ScriptDefinitionProvider, OmniScriptLookupService } from '@vlocode/omniscript';
2+
import { OmniScriptAccess, OmniScriptActivator, OmniScriptRecord, ScriptDefinitionProvider } from '@vlocode/omniscript';
33
import { Argument, Option } from '../command';
44
import logSymbols from 'log-symbols';
55
import { forEachAsyncParallel, getErrorMessage, groupBy, isSalesforceId, Iterable, sortBy, Timer } from '@vlocode/util';
66
import { SalesforceCommand } from '../salesforceCommand';
77

88
interface ScriptActivationInfo {
99
type: string,
10-
allVersions: Array<OmniScriptVersionDetail>,
10+
allVersions: Array<OmniScriptRecord>,
1111
dependencies: Array<ScriptActivationInfo>,
12-
script: OmniScriptVersionDetail,
12+
script: OmniScriptRecord,
1313
status?: 'pending' | 'activated' | 'error',
1414
}
1515

@@ -119,7 +119,7 @@ export default class extends SalesforceCommand {
119119
}
120120

121121

122-
private async saveDefinition(script: OmniScriptVersionDetail, options?: { preFix?: string, postFix?: string } ) {
122+
private async saveDefinition(script: OmniScriptRecord, options?: { preFix?: string, postFix?: string } ) {
123123
const fileNameParts = [
124124
options?.preFix ?? '',
125125
script.type,
@@ -151,8 +151,8 @@ export default class extends SalesforceCommand {
151151
}
152152

153153
private async getScripts(scriptFilter: any): Promise<Map<string, ScriptActivationInfo> | undefined> {
154-
const lookup = this.container.create(OmniScriptLookupService);
155-
const scripts = await lookup.getScriptVersions(scriptFilter);
154+
const lookup = this.container.create(OmniScriptAccess);
155+
const scripts = await lookup.filter(scriptFilter);
156156

157157
if (!scripts.length) {
158158
return;
@@ -173,12 +173,11 @@ export default class extends SalesforceCommand {
173173
);
174174

175175
// Build dependency graph
176-
const elements = await lookup.getScriptElements([...scriptsToActivate.keys()], { type: 'OmniScript' });
176+
const elements = await lookup.elements({ scriptId: [...scriptsToActivate.keys()], type: 'OmniScript', active: true });
177177
for (const element of elements.values()) {
178178
const propSet = JSON.parse(element.propertySet);
179179
const scriptRef = `${propSet['Type']}/${propSet['Sub Type']}/${propSet['Language']!}`;
180180
const dependency = Iterable.find(scriptsToActivate.values(), info => info.type.toLowerCase() === scriptRef.toLowerCase());
181-
182181
if (dependency) {
183182
scriptsToActivate.get(element.omniScriptId)!.dependencies.push(dependency);
184183
}

packages/core/src/container.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ export class Container {
574574
return instance[proxyTarget];
575575
}
576576

577-
public registerProvider<T extends object, I extends T = T>(service: ServiceType<T>, provider: (receiver: any) => I| Promise<I> | undefined) {
577+
public registerProvider<T extends object, I extends T = T>(service: ServiceType<T>, provider: (receiver: any) => I | Promise<I> | undefined) {
578578
this.logger.debug(`(${this.containerGuid}) Register provider for: ${this.getServiceName(service)}`);
579579
this.providers.set(this.getServiceName(service), provider);
580580
}

packages/core/src/fs/cachedFileSystem.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import * as fs from 'fs';
21
import { cache, clearCache } from '@vlocode/util';
32
import { FileInfo, FileStat, FileSystem, StatsOptions, WriteOptions } from './fileSystem';
43

packages/core/src/fs/fileSystem.ts

Lines changed: 19 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { spreadAsync } from '@vlocode/util';
2-
import { minimatch, MinimatchOptions } from 'minimatch'
3-
import { Glob } from 'glob'
2+
import * as fs from 'fs'
3+
import { globbyStream, Options as GlobbyOptions } from 'globby';
44

55
export interface StatsOptions {
66
/**
@@ -187,50 +187,34 @@ export abstract class FileSystem {
187187
* ```
188188
*/
189189
public async *find(patterns: GlobPatterns, options?: FindOptions): AsyncGenerator<string> {
190-
const globs = (Array.isArray(patterns) ? patterns : [ patterns ]).flatMap(
191-
pattern => (options?.cwd && Array.isArray(options.cwd) ? options.cwd : [ options?.cwd ]).map(
192-
(cwd: string | undefined) => new Glob(pattern, {
193-
cwd,
194-
withFileTypes: true,
195-
windowsPathsNoEscape: true,
196-
dotRelative: true,
197-
ignore: options?.exclude,
198-
noext: true,
199-
nodir: options?.findType === FindType.file,
200-
maxDepth: options?.depth,
201-
nocase: options?.noCase
202-
})
203-
)
190+
const globs = (options?.cwd && Array.isArray(options.cwd) ? options.cwd : [ options?.cwd ]).map(
191+
(cwd: string | undefined) => globbyStream(patterns, {
192+
cwd,
193+
fs: this.globbyFs?.() ?? fs,
194+
ignore: options?.exclude ? Array.isArray(options?.exclude) ? options.exclude : [ options?.exclude ] : undefined,
195+
onlyDirectories: options?.findType === FindType.directory,
196+
onlyFiles: options?.findType === FindType.file,
197+
deep: options?.depth,
198+
unique: true,
199+
absolute: true,
200+
})
204201
);
205202

206203
let limit = options?.limit;
207204

208205
for (const glob of globs) {
209-
for await (const file of glob) {
210-
if (options?.findType === FindType.directory && !file.isDirectory()) {
206+
for await (const file of glob) {
207+
if (typeof file !== 'string') {
211208
continue;
212-
}
213-
yield this.normalizeSeparators(file.fullpath());
209+
}
210+
yield this.normalizeSeparators(file);
214211
if (limit !== undefined && --limit === 0) {
215212
return;
216213
}
217214
}
218215
}
219216
}
220217

221-
private compilePatterns(patterns: GlobPatterns, options?: MinimatchOptions): RegExp[] {
222-
return (Array.isArray(patterns) ? patterns : [ patterns ]).map(pattern => {
223-
if (typeof pattern === 'string') {
224-
const compiled = minimatch.makeRe(this.normalizeSeparators(pattern), options);
225-
if (!compiled) {
226-
throw new Error(`Invalid glob pattern: ${pattern}`);
227-
}
228-
return compiled;
229-
}
230-
return pattern;
231-
});
232-
}
233-
234218
private normalizeSeparators(path: string): string {
235219
// Normalize windows path separator to posix for globby
236220
return path.replace(/[/\\]+/g, '/');
@@ -285,4 +269,6 @@ export abstract class FileSystem {
285269
public findFiles(globPatterns: string | string[]): Promise<string[]> {
286270
return spreadAsync(this.find(globPatterns, { findType: FindType.file }));
287271
}
272+
273+
protected globbyFs?(): GlobbyOptions['fs'];
288274
}

packages/core/src/fs/memoryFileSystem.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export class MemoryFileSystem extends NodeFileSystem {
1111
return this.innerFs as unknown as Volume
1212
}
1313

14-
constructor(files: { [fileName: string] : string } = {}) {
14+
constructor(files: { [fileName: string] : string | Buffer } = {}) {
1515
super(MemFs.fromJSON(files) as any);
1616
}
1717

packages/core/src/fs/nodeFileSystem.ts

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
import * as fs from 'fs';
2-
import * as path from 'path';
3-
import globby from 'globby';
42
import { injectable } from '../index';
53
import { FileInfo, FileStat, FileSystem, StatsOptions, WriteOptions } from './fileSystem';
64

@@ -68,24 +66,15 @@ export class NodeFileSystem extends FileSystem {
6866
}));
6967
}
7068

71-
public findFiles(patterns: string | string[]): Promise<string[]> {
72-
return globby(this.normalizeGlobPatterns(patterns), {
73-
fs: {
74-
lstat: this.innerFs.lstat.bind(this.innerFs),
75-
stat: this.innerFs.stat.bind(this.innerFs),
76-
lstatSync: this.innerFs.lstatSync.bind(this.innerFs),
77-
statSync: this.innerFs.statSync.bind(this.innerFs),
78-
readdir: this.innerFs.readdir.bind(this.innerFs),
79-
readdirSync: this.innerFs.readdirSync.bind(this.innerFs)
80-
}
81-
});
82-
}
83-
84-
protected normalizeGlobPatterns(patterns: string | string[]) {
85-
// Normalize windows path separator to posix for globby
86-
return typeof patterns == 'string' ?
87-
patterns.replace(/[/\\]+/g, path.posix.sep) :
88-
patterns.map(this.normalizeGlobPatterns, this);
69+
protected globbyFs() {
70+
return {
71+
lstat: this.innerFs.lstat.bind(this.innerFs),
72+
stat: this.innerFs.stat.bind(this.innerFs),
73+
lstatSync: this.innerFs.lstatSync.bind(this.innerFs),
74+
statSync: this.innerFs.statSync.bind(this.innerFs),
75+
readdir: this.innerFs.readdir.bind(this.innerFs),
76+
readdirSync: this.innerFs.readdirSync.bind(this.innerFs)
77+
};
8978
}
9079
}
9180

packages/core/src/logging/logManager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export default class LogManager {
2121
constructor(private globalLogLevel: LogLevel) {
2222
}
2323

24-
public get<T>(type: (new (...args: any[]) => T) | string) : Logger {
24+
public get(type: { name: string } | string) : Logger {
2525
const name = typeof type === 'string' ? type : type.name;
2626
return this.activeLoggers[name] || (this.activeLoggers[name] = this.createLogger(name));
2727
}

packages/omniscript/src/omniScriptAccess.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { injectable } from "@vlocode/core";
22
import { QueryBuilder, SalesforceLookupService, SalesforceSchemaService, SalesforceService } from "@vlocode/salesforce";
3-
import { OmniProcessRecord, OmniScriptSpecification, OmniScriptRecord, OmniScriptElementRecord, OmniProcessElementRecord, OmniScriptWithElementsRecord, OmniScriptEmbeddedScriptPropertySet, OmniScriptElementType, VlocityUITemplateRecord } from "./types";
3+
import { OmniProcessRecord, OmniScriptSpecification, OmniScriptRecord, OmniScriptElementRecord, OmniProcessElementRecord, OmniScriptWithElementsRecord, OmniScriptElementType, VlocityUITemplateRecord } from "./types";
44
import { arrayMapPush } from "@vlocode/util";
55

66
type OmniScriptFilter = (OmniScriptSpecification & { version?: number, active?: boolean })
@@ -235,16 +235,25 @@ export class OmniScriptAccess {
235235
* dependentScriptIds.map(id => omniScriptAccess.find(id))
236236
* );
237237
*/
238-
public async findActiveDependentScripts(script: OmniScriptSpecification) {
238+
public async findActiveDependentScripts(script: OmniScriptSpecification | OmniScriptSpecification[]) {
239239
const elements = await this.elements({ type: 'OmniScript', active: true });
240240
const scriptIds = new Set<string>();
241+
const scripts = Array.isArray(script) ? script : [ script ];
241242

242243
for (const element of elements) {
243-
const propSet: OmniScriptEmbeddedScriptPropertySet = JSON.parse(element.propertySet);
244-
if (script.subType === propSet["Sub Type"] &&
245-
script.type === propSet.Type &&
246-
script.language === propSet.Language
247-
) {
244+
const {
245+
"Type": scriptType,
246+
"Sub Type": scriptSubType,
247+
"Language": scriptLanguage
248+
} = JSON.parse(element.propertySet);
249+
250+
const isMatchingScript = scripts.some(script => {
251+
return script.type === scriptType &&
252+
script.subType === scriptSubType &&
253+
script.language === scriptLanguage;
254+
});
255+
256+
if (isMatchingScript) {
248257
scriptIds.add(element.omniScriptId);
249258
}
250259
}
@@ -264,7 +273,6 @@ export class OmniScriptAccess {
264273
Type: script.type,
265274
SubType: script.subType,
266275
VersionNumber: script.version,
267-
OmniProcessType: 'OmniScript',
268276
IsActive: script.active
269277
}, {
270278
ignoreUndefined: true
@@ -291,7 +299,6 @@ export class OmniScriptAccess {
291299
'%vlocity_namespace%__SubType__c': script.subType,
292300
'%vlocity_namespace%__Language__c': script.language,
293301
'%vlocity_namespace%__Version__c': script.version,
294-
'%vlocity_namespace%__OmniProcessType__c': 'OmniScript',
295302
'%vlocity_namespace%__IsActive__c': script.active
296303
}, {
297304
ignoreUndefined: true

0 commit comments

Comments
 (0)