sfdx-hardis 5.17.3 → 5.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -4
- package/lib/commands/hardis/doc/fieldusage.d.ts +16 -0
- package/lib/commands/hardis/doc/fieldusage.js +145 -0
- package/lib/commands/hardis/doc/fieldusage.js.map +1 -0
- package/lib/commands/hardis/doc/mkdocs-to-cf.d.ts +31 -0
- package/lib/commands/hardis/doc/mkdocs-to-cf.js +222 -0
- package/lib/commands/hardis/doc/mkdocs-to-cf.js.map +1 -0
- package/lib/commands/hardis/doc/mkdocs-to-salesforce.d.ts +0 -2
- package/lib/commands/hardis/doc/mkdocs-to-salesforce.js +2 -30
- package/lib/commands/hardis/doc/mkdocs-to-salesforce.js.map +1 -1
- package/lib/commands/hardis/doc/project2markdown.js +1 -1
- package/lib/commands/hardis/doc/project2markdown.js.map +1 -1
- package/lib/common/utils/docUtils.d.ts +2 -0
- package/lib/common/utils/docUtils.js +29 -1
- package/lib/common/utils/docUtils.js.map +1 -1
- package/oclif.lock +29 -16
- package/oclif.manifest.json +413 -249
- package/package.json +6 -5
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,15 @@
|
|
|
4
4
|
|
|
5
5
|
Note: Can be used with `sfdx plugins:install sfdx-hardis@beta` and docker image `hardisgroupcom/sfdx-hardis@beta`
|
|
6
6
|
|
|
7
|
+
## [5.18.0] 2025-02-03
|
|
8
|
+
|
|
9
|
+
- New command [hardis:doc:fieldusage](https://sfdx-hardis.cloudity.com/hardis/doc/fieldusage/) : generate a report with custom field's usage from metadata dependencies.
|
|
10
|
+
|
|
11
|
+
## [5.17.4] 2025-01-31
|
|
12
|
+
|
|
13
|
+
- [hardis:doc:project2markdown](https://sfdx-hardis.cloudity.com/hardis/doc/project2markdown/): Fixes pages menu
|
|
14
|
+
- Stealth feature
|
|
15
|
+
|
|
7
16
|
## [5.17.3] 2025-01-29
|
|
8
17
|
|
|
9
18
|
- [hardis:doc:project2markdown](https://sfdx-hardis.cloudity.com/hardis/doc/project2markdown/): Improve Apex docs markdown
|
|
@@ -25,10 +34,10 @@ Note: Can be used with `sfdx plugins:install sfdx-hardis@beta` and docker image
|
|
|
25
34
|
- [hardis:doc:project2markdown](https://sfdx-hardis.cloudity.com/hardis/doc/project2markdown/) enhancements:
|
|
26
35
|
- Generate Apex classes documentation using `@cparra/apexdocs`, and describe them using AI if available
|
|
27
36
|
- Generate Lightning Pages documentation and describe them using AI if available
|
|
28
|
-
- Display error message in case of XML parsing error
|
|
29
|
-
- Do not raise issues when managed items fields don't have descriptions
|
|
30
|
-
- Do not raise inactive validation rule issue when the VR is from a managed package
|
|
31
|
-
- Fix New JSON coverage formatter is selecting wrong JSON from sf project deploy command
|
|
37
|
+
- Display error message in case of XML parsing error
|
|
38
|
+
- Do not raise issues when managed items fields don't have descriptions
|
|
39
|
+
- Do not raise inactive validation rule issue when the VR is from a managed package
|
|
40
|
+
- Fix New JSON coverage formatter is selecting wrong JSON from sf project deploy command
|
|
32
41
|
|
|
33
42
|
## [5.16.4] 2025-01-22
|
|
34
43
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
2
|
+
import { Connection } from '@salesforce/core';
|
|
3
|
+
import { AnyJson } from '@salesforce/ts-types';
|
|
4
|
+
export default class HardisDocFieldusage extends SfCommand<any> {
|
|
5
|
+
static flags: any;
|
|
6
|
+
static description: string;
|
|
7
|
+
static examples: string[];
|
|
8
|
+
querySObjects(connection: Connection, sObjectsFilter?: string[]): Promise<any>;
|
|
9
|
+
getFilteredSObjects(connection: Connection, sObjectsFilter?: string[]): Promise<Record<string, {
|
|
10
|
+
publisherId: string;
|
|
11
|
+
fields: any[];
|
|
12
|
+
}>>;
|
|
13
|
+
queryCustomFields(connection: Connection, sObjectName: string): Promise<any>;
|
|
14
|
+
queryMetadataComponentDependency(connection: Connection, fieldIds: string[]): Promise<any>;
|
|
15
|
+
run(): Promise<AnyJson>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { requiredOrgFlagWithDeprecations, SfCommand } from '@salesforce/sf-plugins-core';
|
|
2
|
+
import { Flags } from '@salesforce/sf-plugins-core';
|
|
3
|
+
import sortArray from 'sort-array';
|
|
4
|
+
import { generateReports, uxLog } from '../../../common/utils/index.js';
|
|
5
|
+
import { soqlQuery, soqlQueryTooling } from '../../../common/utils/apiUtils.js';
|
|
6
|
+
export default class HardisDocFieldusage extends SfCommand {
|
|
7
|
+
static flags = {
|
|
8
|
+
'target-org': requiredOrgFlagWithDeprecations,
|
|
9
|
+
'sObjects': Flags.string({
|
|
10
|
+
char: 's',
|
|
11
|
+
description: 'Comma-separated list of sObjects to filter',
|
|
12
|
+
required: false,
|
|
13
|
+
}),
|
|
14
|
+
};
|
|
15
|
+
static description = `
|
|
16
|
+
Retrieves custom field usage from metadata dependencies for specified sObjects.
|
|
17
|
+

|
|
18
|
+
`;
|
|
19
|
+
static examples = [
|
|
20
|
+
'$ sf hardis:doc:fieldusage',
|
|
21
|
+
'$ sf hardis:doc:fieldusage --sObjects Account,Contact,Opportunity',
|
|
22
|
+
'$ sf hardis:doc:fieldusage --target-org myOrgAlias --sObjects CustomObject__c'
|
|
23
|
+
];
|
|
24
|
+
async querySObjects(connection, sObjectsFilter) {
|
|
25
|
+
let sObjectsQuery = `
|
|
26
|
+
SELECT Id, DeveloperName, PublisherId, IsCustomizable, IsCustomSetting
|
|
27
|
+
FROM EntityDefinition
|
|
28
|
+
WHERE IsCustomizable = true
|
|
29
|
+
`;
|
|
30
|
+
if (sObjectsFilter && sObjectsFilter.length > 0) {
|
|
31
|
+
const sObjectsList = sObjectsFilter
|
|
32
|
+
.map(sObject => sObject.trim().replace(/__c$/, ''))
|
|
33
|
+
.map(sObject => `'${sObject}'`)
|
|
34
|
+
.join(',');
|
|
35
|
+
sObjectsQuery += ` AND DeveloperName IN (${sObjectsList})`;
|
|
36
|
+
}
|
|
37
|
+
const sObjectResults = await soqlQuery(sObjectsQuery, connection);
|
|
38
|
+
uxLog(this, `Found ${sObjectResults.records.length} sObjects.`);
|
|
39
|
+
return sObjectResults;
|
|
40
|
+
}
|
|
41
|
+
async getFilteredSObjects(connection, sObjectsFilter) {
|
|
42
|
+
const sObjectResults = await this.querySObjects(connection, sObjectsFilter);
|
|
43
|
+
const sObjectsDict = {};
|
|
44
|
+
sObjectResults.records.forEach((record) => {
|
|
45
|
+
if (!record.DeveloperName.endsWith('__Share') && !record.DeveloperName.endsWith('__ChangeEvent')) {
|
|
46
|
+
sObjectsDict[record.DeveloperName] = {
|
|
47
|
+
publisherId: record.PublisherId,
|
|
48
|
+
fields: []
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
return sObjectsDict;
|
|
53
|
+
}
|
|
54
|
+
async queryCustomFields(connection, sObjectName) {
|
|
55
|
+
uxLog(this, `Extracting fields for sObject: ${sObjectName}`);
|
|
56
|
+
const queryTooling = `
|
|
57
|
+
SELECT Id, DeveloperName
|
|
58
|
+
FROM CustomField
|
|
59
|
+
WHERE EntityDefinition.DeveloperName = '${sObjectName}'
|
|
60
|
+
`;
|
|
61
|
+
const fieldResults = await soqlQueryTooling(queryTooling, connection);
|
|
62
|
+
return fieldResults;
|
|
63
|
+
}
|
|
64
|
+
async queryMetadataComponentDependency(connection, fieldIds) {
|
|
65
|
+
const metadataQuery = `
|
|
66
|
+
SELECT MetadataComponentId, MetadataComponentType, MetadataComponentName, RefMetadataComponentName, RefMetadataComponentId
|
|
67
|
+
FROM MetadataComponentDependency
|
|
68
|
+
WHERE RefMetadataComponentId IN (${fieldIds.join(',')})
|
|
69
|
+
`;
|
|
70
|
+
const dependencyResults = await soqlQueryTooling(metadataQuery, connection);
|
|
71
|
+
return dependencyResults;
|
|
72
|
+
}
|
|
73
|
+
async run() {
|
|
74
|
+
const { flags } = await this.parse(HardisDocFieldusage);
|
|
75
|
+
const connection = flags['target-org'].getConnection();
|
|
76
|
+
const sObjectsFilter = flags['sObjects'] ? flags['sObjects'].split(',').map(s => s.trim()) : undefined;
|
|
77
|
+
const sObjectsDict = await this.getFilteredSObjects(connection, sObjectsFilter);
|
|
78
|
+
const fieldQueries = Object.keys(sObjectsDict).map(async (sObjectName) => {
|
|
79
|
+
const fieldResults = await this.queryCustomFields(connection, sObjectName);
|
|
80
|
+
if (fieldResults.records.length > 0) {
|
|
81
|
+
fieldResults.records.forEach((field) => {
|
|
82
|
+
sObjectsDict[sObjectName].fields.push({
|
|
83
|
+
id: field.Id,
|
|
84
|
+
name: field.DeveloperName,
|
|
85
|
+
type: "custom",
|
|
86
|
+
usedIn: []
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
await Promise.all(fieldQueries);
|
|
92
|
+
const dependencyQueries = Object.entries(sObjectsDict).map(async ([sObjectName, { fields }]) => {
|
|
93
|
+
if (fields.length === 0) {
|
|
94
|
+
uxLog(this, `sObject ${sObjectName} does not have any custom fields, skipping dependencies.`);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
uxLog(this, `Retrieving dependencies for sObject: ${sObjectName}`);
|
|
98
|
+
const fieldIds = fields.map((field) => `'${field.id}'`);
|
|
99
|
+
const dependencyResults = await this.queryMetadataComponentDependency(connection, fieldIds);
|
|
100
|
+
dependencyResults.records.forEach((dep) => {
|
|
101
|
+
const field = fields.find(f => f.id === dep.RefMetadataComponentId);
|
|
102
|
+
if (field) {
|
|
103
|
+
field.usedIn.push({ id: dep.MetadataComponentId, type: dep.MetadataComponentType, name: dep.MetadataComponentName });
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
await Promise.all(dependencyQueries);
|
|
108
|
+
const columns = [
|
|
109
|
+
{ key: 'sObjectName', header: 'sObject Name' },
|
|
110
|
+
{ key: 'fieldName', header: 'Field Name' },
|
|
111
|
+
{ key: 'fieldType', header: 'Field Type' },
|
|
112
|
+
{ key: 'dependencyType', header: 'Dependency Type' },
|
|
113
|
+
{ key: 'dependencyName', header: 'Dependency Name' }
|
|
114
|
+
];
|
|
115
|
+
const rows = [];
|
|
116
|
+
for (const [sObjectName, { fields }] of Object.entries(sObjectsDict)) {
|
|
117
|
+
fields.forEach((field) => {
|
|
118
|
+
field.usedIn.forEach((dep) => {
|
|
119
|
+
const row = {};
|
|
120
|
+
row[columns[0].key] = sObjectName;
|
|
121
|
+
row[columns[1].key] = field.name;
|
|
122
|
+
row[columns[2].key] = field.type;
|
|
123
|
+
row[columns[3].key] = dep.type;
|
|
124
|
+
row[columns[4].key] = dep.name;
|
|
125
|
+
rows.push(row);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
const resultSorted = sortArray(rows, {
|
|
130
|
+
by: [columns[0].key, columns[1].key, columns[3].key],
|
|
131
|
+
order: ['asc', 'asc', 'asc'],
|
|
132
|
+
});
|
|
133
|
+
console.table(rows);
|
|
134
|
+
const reportFiles = await generateReports(resultSorted, columns, this, {
|
|
135
|
+
logFileName: 'fields-usage',
|
|
136
|
+
logLabel: 'Find fields usage',
|
|
137
|
+
});
|
|
138
|
+
return {
|
|
139
|
+
outputString: 'Processed fieldusage doc',
|
|
140
|
+
result: resultSorted,
|
|
141
|
+
reportFiles,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=fieldusage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fieldusage.js","sourceRoot":"","sources":["../../../../src/commands/hardis/doc/fieldusage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
2
|
+
import { AnyJson } from '@salesforce/ts-types';
|
|
3
|
+
import Cloudflare from 'cloudflare';
|
|
4
|
+
export default class MkDocsToCloudflare extends SfCommand<any> {
|
|
5
|
+
static title: string;
|
|
6
|
+
static description: string;
|
|
7
|
+
static examples: string[];
|
|
8
|
+
static flags: any;
|
|
9
|
+
static requiresProject: boolean;
|
|
10
|
+
protected debugMode: boolean;
|
|
11
|
+
protected apiEmail: string | undefined;
|
|
12
|
+
protected apiToken: string | undefined;
|
|
13
|
+
protected accountId: string | undefined;
|
|
14
|
+
protected client: Cloudflare;
|
|
15
|
+
protected projectName: string | null;
|
|
16
|
+
protected currentGitBranch: string | null;
|
|
17
|
+
protected defaultLoginMethodType: string;
|
|
18
|
+
protected defaultAccessEmailDomain: string;
|
|
19
|
+
protected pagesProjectName: string;
|
|
20
|
+
protected pagesProject: Cloudflare.Pages.Projects.Project;
|
|
21
|
+
protected accessPolicyName: string;
|
|
22
|
+
protected accessPolicy: Cloudflare.ZeroTrust.Access.Policies.PolicyGetResponse | null;
|
|
23
|
+
protected accessApp: Cloudflare.ZeroTrust.Access.Applications.ApplicationGetResponse.SelfHostedApplication | null;
|
|
24
|
+
run(): Promise<AnyJson>;
|
|
25
|
+
private setupCloudflareClient;
|
|
26
|
+
private ensureCloudflarePagesProject;
|
|
27
|
+
private ensureCloudflareAccessPolicy;
|
|
28
|
+
private ensureCloudflareAccessApplication;
|
|
29
|
+
private ensureCloudflareAccessApplicationPolicy;
|
|
30
|
+
private uploadHtmlPages;
|
|
31
|
+
}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/* jscpd:ignore-start */
|
|
2
|
+
import { SfCommand, Flags, requiredOrgFlagWithDeprecations } from '@salesforce/sf-plugins-core';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import c from "chalk";
|
|
5
|
+
import * as path from "path";
|
|
6
|
+
import { Messages, SfError } from '@salesforce/core';
|
|
7
|
+
import Cloudflare from 'cloudflare';
|
|
8
|
+
import { execCommand, getCurrentGitBranch, uxLog } from '../../../common/utils/index.js';
|
|
9
|
+
import { CONSTANTS } from '../../../config/index.js';
|
|
10
|
+
import which from 'which';
|
|
11
|
+
import { generateMkDocsHTML } from '../../../common/utils/docUtils.js';
|
|
12
|
+
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
13
|
+
const messages = Messages.loadMessages('sfdx-hardis', 'org');
|
|
14
|
+
export default class MkDocsToCloudflare extends SfCommand {
|
|
15
|
+
static title = 'MkDocs to Cloudflare';
|
|
16
|
+
static description = `Generates MkDocs HTML pages and upload them to Cloudflare as a static pages
|
|
17
|
+
|
|
18
|
+
This command performs the following operations:
|
|
19
|
+
|
|
20
|
+
- Generates MkDocs HTML pages (using locally installed mkdocs-material, or using mkdocs docker image)
|
|
21
|
+
- Creates a Cloudflare pages app
|
|
22
|
+
- Assigns a policy restricting access to the application
|
|
23
|
+
- Opens the new WebSite in the default browser (only if not in CI context)
|
|
24
|
+
|
|
25
|
+
Note: the documentation must have been previously generated using "sf hardis:doc:project2markdown --with-history"
|
|
26
|
+
|
|
27
|
+
You can:
|
|
28
|
+
|
|
29
|
+
- Override default styles by customizing mkdocs.yml
|
|
30
|
+
|
|
31
|
+
More info on [Documentation section](${CONSTANTS.DOC_URL_ROOT}/salesforce-project-documentation/)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
| Variable | Description | Default |
|
|
35
|
+
| :----------------------------------------- | :---------- | :-----: |
|
|
36
|
+
| \`CLOUDFLARE_EMAIL\` | Cloudflare account email | <!--- Required --> |
|
|
37
|
+
| \`CLOUDFLARE_API_KEY\` | Cloudflare API key | <!--- Required --> |
|
|
38
|
+
| \`CLOUDFLARE_ACCOUNT_ID\` | Cloudflare account | <!--- Required --> |
|
|
39
|
+
| \`CLOUDFLARE_PROJECT_NAME\` | Project name, that will also be used for site URL | Built from git branch name |
|
|
40
|
+
| \`CLOUDFLARE_DEFAULT_LOGIN_METHOD_TYPE\` | Cloudflare default login method type | \`onetimepin\` |
|
|
41
|
+
| \`CLOUDFLARE_DEFAULT_ACCESS_EMAIL_DOMAIN\` | Cloudflare default access email domain | \`@cloudity.com\` |
|
|
42
|
+
|
|
43
|
+
`;
|
|
44
|
+
static examples = [
|
|
45
|
+
'$ sf hardis:doc:mkdocs-to-cf',
|
|
46
|
+
'$ CLOUDFLARE_EMAIL=xxx@xxx.com CLOUDFLARE_API_TOKEN=zzzzzz CLOUDFLARE_ACCOUNT_ID=zzzzz sf hardis:doc:mkdocs-to-cf',
|
|
47
|
+
];
|
|
48
|
+
static flags = {
|
|
49
|
+
debug: Flags.boolean({
|
|
50
|
+
char: 'd',
|
|
51
|
+
default: false,
|
|
52
|
+
description: messages.getMessage('debugMode'),
|
|
53
|
+
}),
|
|
54
|
+
websocket: Flags.string({
|
|
55
|
+
description: messages.getMessage('websocket'),
|
|
56
|
+
}),
|
|
57
|
+
skipauth: Flags.boolean({
|
|
58
|
+
description: 'Skip authentication check when a default username is required',
|
|
59
|
+
}),
|
|
60
|
+
'target-org': requiredOrgFlagWithDeprecations,
|
|
61
|
+
};
|
|
62
|
+
// Set this to true if your command requires a project workspace; 'requiresProject' is false by default
|
|
63
|
+
static requiresProject = true;
|
|
64
|
+
debugMode = false;
|
|
65
|
+
apiEmail;
|
|
66
|
+
apiToken;
|
|
67
|
+
accountId;
|
|
68
|
+
client;
|
|
69
|
+
projectName;
|
|
70
|
+
currentGitBranch;
|
|
71
|
+
defaultLoginMethodType = process.env.CLOUDFLARE_DEFAULT_LOGIN_METHOD_TYPE || "onetimepin";
|
|
72
|
+
defaultAccessEmailDomain = process.env.CLOUDFLARE_DEFAULT_ACCESS_EMAIL_DOMAIN || "@cloudity.com";
|
|
73
|
+
pagesProjectName;
|
|
74
|
+
pagesProject;
|
|
75
|
+
accessPolicyName;
|
|
76
|
+
accessPolicy;
|
|
77
|
+
accessApp;
|
|
78
|
+
/* jscpd:ignore-end */
|
|
79
|
+
async run() {
|
|
80
|
+
const { flags } = await this.parse(MkDocsToCloudflare);
|
|
81
|
+
this.debugMode = flags.debug || false;
|
|
82
|
+
// Check if the project is a MkDocs project
|
|
83
|
+
const mkdocsYmlFile = path.join(process.cwd(), "mkdocs.yml");
|
|
84
|
+
if (!fs.existsSync(mkdocsYmlFile)) {
|
|
85
|
+
throw new SfError('This command needs a mkdocs.yml config file. Generate one using "sf hardis:doc:project2markdown --with-history"');
|
|
86
|
+
}
|
|
87
|
+
this.currentGitBranch = await getCurrentGitBranch() || "main";
|
|
88
|
+
this.projectName = (process.env.CLOUDFLARE_PROJECT_NAME || this.currentGitBranch).replace(/\//g, "-").toLowerCase();
|
|
89
|
+
this.pagesProjectName = `sfdoc-${this.projectName}`;
|
|
90
|
+
this.accessPolicyName = `access-policy-${this.projectName}`;
|
|
91
|
+
// Create connection to Cloudflare
|
|
92
|
+
this.setupCloudflareClient();
|
|
93
|
+
// Generate HTML pages
|
|
94
|
+
await generateMkDocsHTML();
|
|
95
|
+
// Get or Create Cloudflare Pages project
|
|
96
|
+
await this.ensureCloudflarePagesProject();
|
|
97
|
+
// Ensure there is a policy restricting access to the application
|
|
98
|
+
await this.ensureCloudflareAccessPolicy();
|
|
99
|
+
// Ensure there is an access application
|
|
100
|
+
await this.ensureCloudflareAccessApplication();
|
|
101
|
+
// Ensure the access application has the right policy
|
|
102
|
+
await this.ensureCloudflareAccessApplicationPolicy();
|
|
103
|
+
// Upload pages
|
|
104
|
+
await this.uploadHtmlPages();
|
|
105
|
+
return { success: true };
|
|
106
|
+
}
|
|
107
|
+
setupCloudflareClient() {
|
|
108
|
+
this.apiEmail = process.env.CLOUDFLARE_EMAIL;
|
|
109
|
+
this.apiToken = process.env.CLOUDFLARE_API_TOKEN;
|
|
110
|
+
this.accountId = process.env.CLOUDFLARE_ACCOUNT_ID;
|
|
111
|
+
if (!this.apiEmail || !this.accountId || !this.apiToken) {
|
|
112
|
+
throw new Error('Missing CLOUDFLARE_EMAIL or CLOUDFLARE_API_TOKEN or CLOUDFLARE_ACCOUNT_ID');
|
|
113
|
+
}
|
|
114
|
+
this.client = new Cloudflare({
|
|
115
|
+
apiEmail: this.apiEmail,
|
|
116
|
+
apiToken: this.apiToken,
|
|
117
|
+
});
|
|
118
|
+
uxLog(this, c.grey("Cloudflare client info found"));
|
|
119
|
+
}
|
|
120
|
+
async ensureCloudflarePagesProject() {
|
|
121
|
+
uxLog(this, c.cyan("Checking Cloudflare Pages project..."));
|
|
122
|
+
try {
|
|
123
|
+
this.pagesProject = await this.client.pages.projects.get(this.pagesProjectName, { account_id: this.accountId || "" });
|
|
124
|
+
uxLog(this, c.cyan("Cloudflare Pages project found: " + this.pagesProjectName));
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
uxLog(this, c.grey(e.message));
|
|
128
|
+
this.pagesProject = await this.client.pages.projects.create({
|
|
129
|
+
name: this.pagesProjectName,
|
|
130
|
+
account_id: this.accountId || "",
|
|
131
|
+
production_branch: this.currentGitBranch || "main",
|
|
132
|
+
});
|
|
133
|
+
uxLog(this, c.green("Cloudflare Pages project created: " + this.pagesProjectName));
|
|
134
|
+
}
|
|
135
|
+
uxLog(this, c.grey(JSON.stringify(this.pagesProject, null, 2)));
|
|
136
|
+
}
|
|
137
|
+
async ensureCloudflareAccessPolicy() {
|
|
138
|
+
uxLog(this, c.cyan("Checking Cloudflare Access policy..."));
|
|
139
|
+
const accessPolicies = await this.client.zeroTrust.access.policies.list({ account_id: this.accountId || "" });
|
|
140
|
+
this.accessPolicy = accessPolicies.result.find((p) => p.name === this.accessPolicyName) || null;
|
|
141
|
+
if (this.accessPolicy) {
|
|
142
|
+
uxLog(this, c.cyan("Cloudflare policy found: " + this.accessPolicyName));
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
const loginMethods = await this.client.zeroTrust.identityProviders.list({ account_id: this.accountId || "" });
|
|
146
|
+
const defaultLoginMethod = loginMethods.result.find((m) => m.type === this.defaultLoginMethodType);
|
|
147
|
+
if (!defaultLoginMethod) {
|
|
148
|
+
throw new SfError(`No login method of type ${this.defaultLoginMethodType} found in Cloudflare account. Please create one in Zero Trust/Settings before running this command`);
|
|
149
|
+
}
|
|
150
|
+
this.accessPolicy = await this.client.zeroTrust.access.policies.create({
|
|
151
|
+
name: this.accessPolicyName,
|
|
152
|
+
account_id: this.accountId || "",
|
|
153
|
+
decision: "allow",
|
|
154
|
+
include: [
|
|
155
|
+
{ login_method: { id: defaultLoginMethod.id } }
|
|
156
|
+
],
|
|
157
|
+
require: [
|
|
158
|
+
{
|
|
159
|
+
email_domain: { domain: this.defaultAccessEmailDomain },
|
|
160
|
+
}
|
|
161
|
+
],
|
|
162
|
+
});
|
|
163
|
+
uxLog(this, c.green("Cloudflare policy created: " + this.accessPolicyName));
|
|
164
|
+
}
|
|
165
|
+
uxLog(this, c.grey(JSON.stringify(this.accessPolicy, null, 2)));
|
|
166
|
+
}
|
|
167
|
+
async ensureCloudflareAccessApplication() {
|
|
168
|
+
uxLog(this, c.cyan("Checking Cloudflare access application..."));
|
|
169
|
+
const accessApplications = await this.client.zeroTrust.access.applications.list({ account_id: this.accountId || "" });
|
|
170
|
+
this.accessApp = (accessApplications.result.find((a) => a.name === this.pagesProject?.domains?.[0]) || null);
|
|
171
|
+
if (this.accessApp) {
|
|
172
|
+
uxLog(this, c.cyan("Cloudflare access application found: " + this.pagesProject?.domains?.[0]));
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
this.accessApp = await this.client.zeroTrust.access.applications.create({
|
|
176
|
+
name: this.pagesProject?.domains?.[0],
|
|
177
|
+
account_id: this.accountId || "",
|
|
178
|
+
type: "self_hosted",
|
|
179
|
+
domain: this.pagesProject?.domains?.[0],
|
|
180
|
+
destinations: [
|
|
181
|
+
{
|
|
182
|
+
"type": "public",
|
|
183
|
+
"uri": `${this.pagesProject?.domains?.[0]}`
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"type": "public",
|
|
187
|
+
"uri": `*.${this.pagesProject?.domains?.[0]}`
|
|
188
|
+
}
|
|
189
|
+
]
|
|
190
|
+
});
|
|
191
|
+
uxLog(this, c.green("Cloudflare access application created: " + this.pagesProject?.domains?.[0]));
|
|
192
|
+
}
|
|
193
|
+
uxLog(this, c.grey(JSON.stringify(this.accessApp, null, 2)));
|
|
194
|
+
}
|
|
195
|
+
async ensureCloudflareAccessApplicationPolicy() {
|
|
196
|
+
uxLog(this, c.cyan("Checking Cloudflare access application policy..."));
|
|
197
|
+
if (this.accessApp?.policies?.length && this.accessApp.policies.find(p => p.id === this.accessPolicy?.id)) {
|
|
198
|
+
uxLog(this, c.cyan(`Access Application ${this.accessApp.name} already has the policy ${this.accessPolicy?.name}`));
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
this.accessApp = (await this.client.zeroTrust.access.applications.update(this.accessApp?.id || "", {
|
|
202
|
+
account_id: this.accountId,
|
|
203
|
+
domain: this.accessApp?.domain,
|
|
204
|
+
destinations: this.accessApp?.destinations,
|
|
205
|
+
type: this.accessApp?.type,
|
|
206
|
+
policies: [this.accessPolicy?.id || ""],
|
|
207
|
+
}));
|
|
208
|
+
uxLog(this, c.green(`Access Application ${this.accessApp?.name} updated with the policy ${this.accessPolicy?.name}`));
|
|
209
|
+
}
|
|
210
|
+
uxLog(this, c.grey(JSON.stringify(this.accessApp, null, 2)));
|
|
211
|
+
}
|
|
212
|
+
async uploadHtmlPages() {
|
|
213
|
+
uxLog(this, c.cyan("Uploading HTML pages to Cloudflare Pages..."));
|
|
214
|
+
let wranglerCommand = `wrangler pages publish ./site --project-name="${this.pagesProjectName}" --branch=${this.currentGitBranch}`;
|
|
215
|
+
const isWranglerAvailable = await which("wrangler", { nothrow: true });
|
|
216
|
+
if (!isWranglerAvailable) {
|
|
217
|
+
wranglerCommand = "npx --yes " + wranglerCommand;
|
|
218
|
+
}
|
|
219
|
+
await execCommand(wranglerCommand, this, { fail: true, output: true, debug: this.debugMode });
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=mkdocs-to-cf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mkdocs-to-cf.js","sourceRoot":"","sources":["../../../../src/commands/hardis/doc/mkdocs-to-cf.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,8 +8,6 @@ export default class MkDocsToSalesforce extends SfCommand<any> {
|
|
|
8
8
|
static requiresProject: boolean;
|
|
9
9
|
protected debugMode: boolean;
|
|
10
10
|
run(): Promise<AnyJson>;
|
|
11
|
-
private installMkDocs;
|
|
12
|
-
private generateMkDocsHTML;
|
|
13
11
|
private createDocMetadatas;
|
|
14
12
|
private uploadDocMetadatas;
|
|
15
13
|
}
|
|
@@ -8,7 +8,7 @@ import { createTempDir, execCommand, isCI, uxLog } from '../../../common/utils/i
|
|
|
8
8
|
import { createBlankSfdxProject } from '../../../common/utils/projectUtils.js';
|
|
9
9
|
import { initPermissionSetAssignments, isProductionOrg } from '../../../common/utils/orgUtils.js';
|
|
10
10
|
import { CONSTANTS } from '../../../config/index.js';
|
|
11
|
-
import { readMkDocsFile, writeMkDocsFile } from '../../../common/utils/docUtils.js';
|
|
11
|
+
import { generateMkDocsHTML, readMkDocsFile, writeMkDocsFile } from '../../../common/utils/docUtils.js';
|
|
12
12
|
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
13
13
|
const messages = Messages.loadMessages('sfdx-hardis', 'org');
|
|
14
14
|
export default class MkDocsToSalesforce extends SfCommand {
|
|
@@ -76,7 +76,7 @@ More info on [Documentation section](${CONSTANTS.DOC_URL_ROOT}/salesforce-projec
|
|
|
76
76
|
await writeMkDocsFile(mkdocsYmlFile, mkdocsYmlCopy);
|
|
77
77
|
try {
|
|
78
78
|
// Generate HTML pages
|
|
79
|
-
await
|
|
79
|
+
await generateMkDocsHTML();
|
|
80
80
|
// Create temp sfdx project
|
|
81
81
|
const tmpDirForSfdxProject = await createTempDir();
|
|
82
82
|
const tmpProjectPath = await createBlankSfdxProject(tmpDirForSfdxProject);
|
|
@@ -107,34 +107,6 @@ More info on [Documentation section](${CONSTANTS.DOC_URL_ROOT}/salesforce-projec
|
|
|
107
107
|
throw e;
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
|
-
async installMkDocs() {
|
|
111
|
-
uxLog(this, c.cyan("Managing mkdocs-material local installation..."));
|
|
112
|
-
let mkdocsLocalOk = false;
|
|
113
|
-
const installMkDocsRes = await execCommand("pip install mkdocs-material mkdocs-exclude-search mdx_truly_sane_lists || python -m install mkdocs-material mkdocs-exclude-search mdx_truly_sane_lists || py -m install mkdocs-material mkdocs-exclude-search mdx_truly_sane_lists", this, { fail: false, output: true, debug: this.debugMode });
|
|
114
|
-
if (installMkDocsRes.status === 0) {
|
|
115
|
-
mkdocsLocalOk = true;
|
|
116
|
-
}
|
|
117
|
-
return mkdocsLocalOk;
|
|
118
|
-
}
|
|
119
|
-
async generateMkDocsHTML() {
|
|
120
|
-
const mkdocsLocalOk = await this.installMkDocs();
|
|
121
|
-
if (mkdocsLocalOk) {
|
|
122
|
-
// Generate MkDocs HTML pages with local MkDocs
|
|
123
|
-
uxLog(this, c.cyan("Generating HTML pages with mkdocs..."));
|
|
124
|
-
const mkdocsBuildRes = await execCommand("mkdocs build || python -m mkdocs build || py -m mkdocs build", this, { fail: false, output: true, debug: this.debugMode });
|
|
125
|
-
if (mkdocsBuildRes.status !== 0) {
|
|
126
|
-
throw new SfError('MkDocs build failed:\n' + mkdocsBuildRes.stderr + "\n" + mkdocsBuildRes.stdout);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
// Generate MkDocs HTML pages with Docker
|
|
131
|
-
uxLog(this, c.cyan("Generating HTML pages with Docker..."));
|
|
132
|
-
const mkdocsBuildRes = await execCommand("docker run --rm -v $(pwd):/docs squidfunk/mkdocs-material build", this, { fail: false, output: true, debug: this.debugMode });
|
|
133
|
-
if (mkdocsBuildRes.status !== 0) {
|
|
134
|
-
throw new SfError('MkDocs build with docker failed:\n' + mkdocsBuildRes.stderr + "\n" + mkdocsBuildRes.stdout);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
110
|
async createDocMetadatas(resName, defaultProjectPath, type) {
|
|
139
111
|
uxLog(this, c.cyan(`Creating Static Resource ${resName} metadata...`));
|
|
140
112
|
const staticResourcePath = path.join(defaultProjectPath, "staticresources");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mkdocs-to-salesforce.js","sourceRoot":"","sources":["../../../../src/commands/hardis/doc/mkdocs-to-salesforce.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,+BAA+B,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,CAAC,MAAM,OAAO,CAAC;AACtB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,4BAA4B,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAClG,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"mkdocs-to-salesforce.js","sourceRoot":"","sources":["../../../../src/commands/hardis/doc/mkdocs-to-salesforce.ts"],"names":[],"mappings":"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"}
|
|
@@ -287,7 +287,7 @@ ${Project2Markdown.htmlInstructions}
|
|
|
287
287
|
const pageFiles = await listPageFiles(packageDirs);
|
|
288
288
|
const pagesForMenu = { "All Lightning pages": "pages/index.md" };
|
|
289
289
|
for (const pagefile of pageFiles) {
|
|
290
|
-
const pageName = path.basename(pagefile, "flexipage-meta.xml");
|
|
290
|
+
const pageName = path.basename(pagefile, ".flexipage-meta.xml");
|
|
291
291
|
const mdFile = path.join(this.outputMarkdownRoot, "pages", pageName + ".md");
|
|
292
292
|
pagesForMenu[pageName] = "pages/" + pageName + ".md";
|
|
293
293
|
// Add apex code in documentation
|