powerautodoc 0.1.19 → 0.1.21
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 +49 -4
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +3 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +3 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/index.js +22 -2
- package/dist/index.js.map +1 -1
- package/dist/ir/emailTemplate.d.ts +21 -0
- package/dist/ir/emailTemplate.d.ts.map +1 -0
- package/dist/ir/emailTemplate.js +7 -0
- package/dist/ir/emailTemplate.js.map +1 -0
- package/dist/ir/globalChoice.d.ts +32 -0
- package/dist/ir/globalChoice.d.ts.map +1 -0
- package/dist/ir/globalChoice.js +6 -0
- package/dist/ir/globalChoice.js.map +1 -0
- package/dist/ir/index.d.ts +2 -0
- package/dist/ir/index.d.ts.map +1 -1
- package/dist/ir/index.js.map +1 -1
- package/dist/parsers/emailTemplateParser.d.ts +3 -0
- package/dist/parsers/emailTemplateParser.d.ts.map +1 -0
- package/dist/parsers/emailTemplateParser.js +109 -0
- package/dist/parsers/emailTemplateParser.js.map +1 -0
- package/dist/parsers/globalChoiceParser.d.ts +8 -0
- package/dist/parsers/globalChoiceParser.d.ts.map +1 -0
- package/dist/parsers/globalChoiceParser.js +83 -0
- package/dist/parsers/globalChoiceParser.js.map +1 -0
- package/dist/parsers/index.d.ts +2 -0
- package/dist/parsers/index.d.ts.map +1 -1
- package/dist/parsers/index.js +2 -0
- package/dist/parsers/index.js.map +1 -1
- package/dist/publisher/wikiAssembler.d.ts +2 -2
- package/dist/publisher/wikiAssembler.d.ts.map +1 -1
- package/dist/publisher/wikiAssembler.js +43 -7
- package/dist/publisher/wikiAssembler.js.map +1 -1
- package/dist/renderers/emailTemplateRenderer.d.ts +4 -0
- package/dist/renderers/emailTemplateRenderer.d.ts.map +1 -0
- package/dist/renderers/emailTemplateRenderer.js +77 -0
- package/dist/renderers/emailTemplateRenderer.js.map +1 -0
- package/dist/renderers/flowRenderer.d.ts.map +1 -1
- package/dist/renderers/flowRenderer.js +0 -2
- package/dist/renderers/flowRenderer.js.map +1 -1
- package/dist/renderers/globalChoiceRenderer.d.ts +10 -0
- package/dist/renderers/globalChoiceRenderer.d.ts.map +1 -0
- package/dist/renderers/globalChoiceRenderer.js +72 -0
- package/dist/renderers/globalChoiceRenderer.js.map +1 -0
- package/dist/renderers/index.d.ts +2 -0
- package/dist/renderers/index.d.ts.map +1 -1
- package/dist/renderers/index.js +2 -0
- package/dist/renderers/index.js.map +1 -1
- package/dist/renderers/pluginRenderer.d.ts.map +1 -1
- package/dist/renderers/pluginRenderer.js +0 -2
- package/dist/renderers/pluginRenderer.js.map +1 -1
- package/dist/renderers/securityRoleRenderer.d.ts +6 -2
- package/dist/renderers/securityRoleRenderer.d.ts.map +1 -1
- package/dist/renderers/securityRoleRenderer.js +15 -36
- package/dist/renderers/securityRoleRenderer.js.map +1 -1
- package/dist/renderers/webResourceRenderer.d.ts +1 -1
- package/dist/renderers/webResourceRenderer.d.ts.map +1 -1
- package/dist/renderers/webResourceRenderer.js +15 -24
- package/dist/renderers/webResourceRenderer.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,14 +1,28 @@
|
|
|
1
|
-
#
|
|
1
|
+
# PowerAutoDoc
|
|
2
2
|
|
|
3
3
|
Automated as-built documentation generator for Power Platform solutions.
|
|
4
4
|
|
|
5
|
-
Reads unpacked solution XML from Git and produces structured markdown documentation
|
|
6
|
-
|
|
5
|
+
Reads unpacked solution XML from Git and produces structured markdown documentation for Azure DevOps Wiki — automatically, on every deployment.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
PowerAutoDoc uses an IR-based (Intermediate Representation) pipeline to parse Power Platform solutions and generate consistent, human-readable documentation. It covers the full stack of a solution:
|
|
10
|
+
|
|
11
|
+
- **C# Plugins** — Assembly metadata, step registrations, and configurations
|
|
12
|
+
- **JavaScript Web Resources** — Client-side logic and dependencies
|
|
13
|
+
- **Dataverse Schema** — Tables, columns, relationships, and forms
|
|
14
|
+
- **Security Roles** — Privilege definitions and access levels
|
|
7
15
|
|
|
8
16
|
## Quick Start
|
|
17
|
+
|
|
9
18
|
```bash
|
|
19
|
+
# Unpack your solution from source control
|
|
10
20
|
pac solution unpack --zipfile MySolution.zip --folder ./unpacked
|
|
21
|
+
|
|
22
|
+
# Install dependencies
|
|
11
23
|
npm install
|
|
24
|
+
|
|
25
|
+
# Run locally
|
|
12
26
|
npm run dev
|
|
13
27
|
```
|
|
14
28
|
|
|
@@ -16,6 +30,37 @@ npm run dev
|
|
|
16
30
|
|
|
17
31
|
See `docs/architecture.jsx` for the full system design (open as a React artifact in Claude).
|
|
18
32
|
|
|
33
|
+
The pipeline follows a Git-native input model:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
Unpacked Solution XML → IR Parser → Intermediate Representation → Renderers → Markdown Output
|
|
37
|
+
```
|
|
38
|
+
|
|
19
39
|
## Output
|
|
20
40
|
|
|
21
|
-
Generated
|
|
41
|
+
Generated documentation is written to `./output/` as structured markdown, ready for publishing to an Azure DevOps Wiki.
|
|
42
|
+
|
|
43
|
+
See `src/config/` for filtering and render options.
|
|
44
|
+
|
|
45
|
+
## CI/CD Integration
|
|
46
|
+
|
|
47
|
+
PowerAutoDoc is designed to run as part of your Azure DevOps pipeline, producing up-to-date as-built docs on every deployment with no manual effort.
|
|
48
|
+
|
|
49
|
+
```yaml
|
|
50
|
+
- script: npm run build:docs
|
|
51
|
+
displayName: "Generate As-Built Documentation"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Configuration
|
|
55
|
+
|
|
56
|
+
| Option | Location | Description |
|
|
57
|
+
| ----------- | ------------------------- | ------------------------------ |
|
|
58
|
+
| Filters | `src/config/filters.js` | Exclude components from output |
|
|
59
|
+
| Renderers | `src/config/renderers.js` | Customise markdown formatting |
|
|
60
|
+
| Output path | `src/config/output.js` | Set destination directory |
|
|
61
|
+
|
|
62
|
+
## Requirements
|
|
63
|
+
|
|
64
|
+
- Node.js 18+
|
|
65
|
+
- Power Platform CLI (`pac`)
|
|
66
|
+
- Access to an unpacked Power Platform solution
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiBhD,eAAO,MAAM,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiBhD,eAAO,MAAM,eAAe,EAAE,YAsC7B,CAAC;AA4BF;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,SAAS,GAAE,MAAsB,GAAG,YAAY,CAmC1E"}
|
package/dist/config/loader.js
CHANGED
|
@@ -46,10 +46,12 @@ export const CONFIG_DEFAULTS = {
|
|
|
46
46
|
webResources: true,
|
|
47
47
|
securityRoles: true,
|
|
48
48
|
environmentVariables: {
|
|
49
|
-
enabled:
|
|
49
|
+
enabled: true,
|
|
50
50
|
showDefaultValue: true,
|
|
51
51
|
showCurrentValue: true,
|
|
52
52
|
},
|
|
53
|
+
globalChoices: true,
|
|
54
|
+
emailTemplates: true,
|
|
53
55
|
},
|
|
54
56
|
};
|
|
55
57
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAGhC,MAAM,wBAAwB,GAAG;IAC/B,2BAA2B;IAC3B,2BAA2B;IAC3B,sBAAsB;IACtB,qBAAqB;IACrB,cAAc;IACd,uBAAuB;IACvB,YAAY;IACZ,YAAY;IACZ,oBAAoB;IACpB,mBAAmB;IACnB,oBAAoB;IACpB,eAAe;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAiB;IAC3C,SAAS,EAAE;QACT;YACE,IAAI,EAAE,YAAY;YAClB,eAAe,EAAE,EAAE;YACnB,IAAI,EAAE,KAAK;SACZ;KACF;IACD,MAAM,EAAE;QACN,IAAI,EAAE,UAAU;KACjB;IACD,KAAK,EAAE;QACL,iBAAiB,EAAE,KAAK;QACxB,yBAAyB,EAAE,IAAI;QAC/B,4BAA4B,EAAE,IAAI;QAClC,eAAe,EAAE,wBAAwB;KAC1C;IACD,MAAM,EAAE;QACN,UAAU,EAAE,SAAS;KACtB;IACD,UAAU,EAAE;QACV,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,IAAI;QACX,aAAa,EAAE,IAAI;QACnB,KAAK,EAAE,IAAI;QACX,gBAAgB,EAAE,IAAI;QACtB,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,IAAI;QACnB,oBAAoB,EAAE;YACpB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Shape of doc-gen.config.yml
|
|
3
3
|
* All fields are optional — loader merges with defaults.
|
|
4
4
|
*/
|
|
5
|
-
export type SolutionRole = 'datamodel' | 'flows' | 'classicWorkflows' | 'plugins' | 'webresources' | 'securityRoles' | 'environmentVariables' | 'all';
|
|
5
|
+
export type SolutionRole = 'datamodel' | 'flows' | 'classicWorkflows' | 'plugins' | 'webresources' | 'securityRoles' | 'environmentVariables' | 'globalChoices' | 'emailTemplates' | 'all';
|
|
6
6
|
export interface SolutionEntry {
|
|
7
7
|
/** Path to the unpacked solution folder (relative to config file) */
|
|
8
8
|
path: string;
|
|
@@ -53,6 +53,8 @@ export interface DocGenConfig {
|
|
|
53
53
|
webResources: boolean;
|
|
54
54
|
securityRoles: boolean;
|
|
55
55
|
environmentVariables: EnvironmentVariablesConfig;
|
|
56
|
+
globalChoices: boolean;
|
|
57
|
+
emailTemplates: boolean;
|
|
56
58
|
};
|
|
57
59
|
wiki?: WikiConfig;
|
|
58
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,OAAO,GAAG,kBAAkB,GAAG,SAAS,GAAG,cAAc,GAAG,eAAe,GAAG,sBAAsB,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,OAAO,GAAG,kBAAkB,GAAG,SAAS,GAAG,cAAc,GAAG,eAAe,GAAG,sBAAsB,GAAG,eAAe,GAAG,gBAAgB,GAAG,KAAK,CAAC;AAE3L,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,eAAe,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,IAAI,EAAE,YAAY,CAAC;IACnB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,0BAA0B;IACzC,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,sDAAsD;IACtD,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,aAAa,EAAE,CAAC;IAE3B,MAAM,EAAE;QACN,kDAAkD;QAClD,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IAEF,KAAK,EAAE;QACL,4DAA4D;QAC5D,iBAAiB,EAAE,OAAO,CAAC;QAC3B,8DAA8D;QAC9D,yBAAyB,EAAE,OAAO,CAAC;QACnC,sDAAsD;QACtD,4BAA4B,EAAE,OAAO,CAAC;QACtC,oDAAoD;QACpD,eAAe,EAAE,MAAM,EAAE,CAAC;KAC3B,CAAC;IAEF,MAAM,EAAE;QACN,4FAA4F;QAC5F,UAAU,EAAE,SAAS,GAAG,UAAU,CAAC;KACpC,CAAC;IAEF,UAAU,EAAE;QACV,iDAAiD;QACjD,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,OAAO,CAAC;QACf,KAAK,EAAE,OAAO,CAAC;QACf,aAAa,EAAE,OAAO,CAAC;QACvB,KAAK,EAAE,OAAO,CAAC;QACf,gBAAgB,EAAE,OAAO,CAAC;QAC1B,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,EAAE,OAAO,CAAC;QACtB,aAAa,EAAE,OAAO,CAAC;QACvB,oBAAoB,EAAE,0BAA0B,CAAC;QACjD,aAAa,EAAE,OAAO,CAAC;QACvB,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IAEF,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;CACb"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { loadConfig } from './config/index.js';
|
|
3
|
-
import { parseSolution, parseSolutionManifest, parseAllFlows, parseClassicWorkflows, parseBusinessRules, parseAllPlugins, parseAllWebResources, parseSecurityRoles, parseEnvironmentVariables, } from './parsers/index.js';
|
|
3
|
+
import { parseSolution, parseSolutionManifest, parseAllFlows, parseClassicWorkflows, parseBusinessRules, parseAllPlugins, parseAllWebResources, parseSecurityRoles, parseEnvironmentVariables, parseGlobalChoices, parseEmailTemplates } from './parsers/index.js';
|
|
4
4
|
import { writeTableMarkdown, writeOverviewMarkdown, writeFlowMarkdown, writePluginMarkdown, writeWebResourceMarkdown, } from './renderers/index.js';
|
|
5
5
|
import { publishToWiki } from './publisher/wikiPublisher.js';
|
|
6
6
|
import { buildWikiPages } from './publisher/wikiAssembler.js';
|
|
@@ -16,6 +16,8 @@ async function main() {
|
|
|
16
16
|
const allWebResources = [];
|
|
17
17
|
const allSecurityRoles = [];
|
|
18
18
|
const allEnvVars = [];
|
|
19
|
+
const allGlobalChoices = [];
|
|
20
|
+
const allEmailTemplates = [];
|
|
19
21
|
for (const solutionEntry of config.solutions) {
|
|
20
22
|
const { path: unpackedPath, role, publisherPrefix } = solutionEntry;
|
|
21
23
|
console.log(`\nProcessing solution: ${unpackedPath} (role: ${role})`);
|
|
@@ -33,6 +35,8 @@ async function main() {
|
|
|
33
35
|
const isWebResources = role === 'webresources' || role === 'all';
|
|
34
36
|
const isSecurity = role === 'all' || role === 'securityRoles';
|
|
35
37
|
const isEnvVars = role === 'all' || role === 'environmentVariables';
|
|
38
|
+
const isGlobalChoices = role === 'all' || role === 'globalChoices';
|
|
39
|
+
const isEmailTemplates = role === 'all' || role === 'emailTemplates';
|
|
36
40
|
// Always parse the manifest so every solution appears in the Overview
|
|
37
41
|
const manifest = parseSolutionManifest(unpackedPath);
|
|
38
42
|
// ---- Data model ----
|
|
@@ -98,6 +102,14 @@ async function main() {
|
|
|
98
102
|
allSecurityRoles.push(...roles);
|
|
99
103
|
console.log(` Parsed ${roles.length} security roles from: ${unpackedPath}`);
|
|
100
104
|
}
|
|
105
|
+
// ---- Global Choices ----
|
|
106
|
+
if ((role === 'all' || role === 'globalChoices') && config.components.globalChoices) {
|
|
107
|
+
const choices = parseGlobalChoices(unpackedPath, publisherPrefix);
|
|
108
|
+
allGlobalChoices.push(...choices);
|
|
109
|
+
if (choices.length > 0) {
|
|
110
|
+
console.log(` Parsed ${choices.length} global choices from: ${unpackedPath}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
101
113
|
// ---- Environment Variables ----
|
|
102
114
|
if ((role === 'all' || role === 'environmentVariables') && config.components.environmentVariables.enabled) {
|
|
103
115
|
const envVars = parseEnvironmentVariables(unpackedPath);
|
|
@@ -106,10 +118,18 @@ async function main() {
|
|
|
106
118
|
console.log(` Parsed ${envVars.length} environment variables from: ${unpackedPath}`);
|
|
107
119
|
}
|
|
108
120
|
}
|
|
121
|
+
// ---- Email Templates ----
|
|
122
|
+
if ((role === 'all' || role === 'emailTemplates') && config.components.emailTemplates) {
|
|
123
|
+
const emailTemplates = parseEmailTemplates(unpackedPath);
|
|
124
|
+
allEmailTemplates.push(...emailTemplates);
|
|
125
|
+
if (emailTemplates.length > 0) {
|
|
126
|
+
console.log(` Parsed ${emailTemplates.length} email templates from: ${unpackedPath}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
109
129
|
}
|
|
110
130
|
// ---- Wiki publish ----
|
|
111
131
|
if (config.wiki && mergedSolution) {
|
|
112
|
-
const pages = buildWikiPages(config, allSolutions, mergedSolution, allFlows, allPluginAssemblies, allWebResources, allClassicWorkflows, allBusinessRules, allSecurityRoles, allEnvVars);
|
|
132
|
+
const pages = buildWikiPages(config, allSolutions, mergedSolution, allFlows, allPluginAssemblies, allWebResources, allClassicWorkflows, allBusinessRules, allSecurityRoles, allEnvVars, allGlobalChoices, allEmailTemplates);
|
|
113
133
|
await publishToWiki(config.wiki, pages);
|
|
114
134
|
}
|
|
115
135
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EACL,aAAa,EAAE,qBAAqB,EACpC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,EACxD,eAAe,EAAE,oBAAoB,EACrC,kBAAkB,EAAE,yBAAyB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IR model for Email Templates.
|
|
3
|
+
* Subject and body are extracted from XSL files as plain text
|
|
4
|
+
* with dynamic field references shown as {fieldName} placeholders.
|
|
5
|
+
*/
|
|
6
|
+
export interface EmailTemplateModel {
|
|
7
|
+
id: string;
|
|
8
|
+
title: string;
|
|
9
|
+
description: string;
|
|
10
|
+
targetEntity: string;
|
|
11
|
+
templateTypeCode: number;
|
|
12
|
+
/** Plain text subject with dynamic fields as {fieldName} placeholders */
|
|
13
|
+
subject: string;
|
|
14
|
+
/** Plain text body with dynamic fields as {fieldName} placeholders */
|
|
15
|
+
body: string;
|
|
16
|
+
/** All dynamic field references from subject and body XSL */
|
|
17
|
+
dynamicFields: string[];
|
|
18
|
+
languageCode: number;
|
|
19
|
+
isCustomizable: boolean;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=emailTemplate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emailTemplate.d.ts","sourceRoot":"","sources":["../../src/ir/emailTemplate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emailTemplate.js","sourceRoot":"","sources":["../../src/ir/emailTemplate.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IR model for Global Option Sets (Global Choices).
|
|
3
|
+
* These are solution-level picklists reusable across multiple tables/columns.
|
|
4
|
+
*/
|
|
5
|
+
export type OptionSetType = 'picklist' | 'bool' | 'status' | 'state' | 'Unknown';
|
|
6
|
+
export interface ChoiceOptionModel {
|
|
7
|
+
/** Integer value stored in Dataverse */
|
|
8
|
+
value: number;
|
|
9
|
+
/** Display label (English 1033) */
|
|
10
|
+
label: string;
|
|
11
|
+
/** Description if provided */
|
|
12
|
+
description: string;
|
|
13
|
+
/** Whether the option is hidden from the UI */
|
|
14
|
+
isHidden: boolean;
|
|
15
|
+
/** External value for integration mapping (if set) */
|
|
16
|
+
externalValue: string;
|
|
17
|
+
}
|
|
18
|
+
export interface GlobalChoiceModel {
|
|
19
|
+
/** Schema name e.g. "isms_accounttype" */
|
|
20
|
+
schemaName: string;
|
|
21
|
+
/** Display name e.g. "Account type" */
|
|
22
|
+
displayName: string;
|
|
23
|
+
/** Description if provided */
|
|
24
|
+
description: string;
|
|
25
|
+
/** Picklist type */
|
|
26
|
+
optionSetType: OptionSetType;
|
|
27
|
+
/** Whether this is a global (solution-level) option set */
|
|
28
|
+
isGlobal: boolean;
|
|
29
|
+
/** Ordered list of options */
|
|
30
|
+
options: ChoiceOptionModel[];
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=globalChoice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"globalChoice.d.ts","sourceRoot":"","sources":["../../src/ir/globalChoice.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAEjF,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,QAAQ,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,aAAa,EAAE,aAAa,CAAC;IAC7B,2DAA2D;IAC3D,QAAQ,EAAE,OAAO,CAAC;IAClB,8BAA8B;IAC9B,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"globalChoice.js","sourceRoot":"","sources":["../../src/ir/globalChoice.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
package/dist/ir/index.d.ts
CHANGED
|
@@ -10,5 +10,7 @@ export type { ClassicWorkflowCategory, ClassicWorkflowMode, ClassicWorkflowScope
|
|
|
10
10
|
export type { BusinessRuleModel, BusinessRuleCondition, BusinessRuleAction, BusinessRuleActionType, BusinessRuleScope } from './businessRule.js';
|
|
11
11
|
export type { SecurityRoleModel, EntityPrivileges, PrivilegeLevel } from './securityRole.js';
|
|
12
12
|
export type { EnvironmentVariableModel, EnvironmentVariableType } from './environmentVariable.js';
|
|
13
|
+
export type { GlobalChoiceModel, ChoiceOptionModel, OptionSetType } from './globalChoice.js';
|
|
14
|
+
export type { EmailTemplateModel } from './emailTemplate.js';
|
|
13
15
|
export { WEB_RESOURCE_TYPE_MAP } from './webResource.js';
|
|
14
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/ir/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ir/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC3E,YAAY,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC7G,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,oBAAoB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClI,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC/F,YAAY,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AACvL,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACjJ,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC7F,YAAY,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAClG,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ir/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC3E,YAAY,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC7G,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,oBAAoB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClI,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC/F,YAAY,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AACvL,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACjJ,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC7F,YAAY,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAClG,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7F,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/ir/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ir/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ir/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emailTemplateParser.d.ts","sourceRoot":"","sources":["../../src/parsers/emailTemplateParser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAuGjE,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAiB9E"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { XMLParser } from 'fast-xml-parser';
|
|
4
|
+
const xmlParser = new XMLParser({
|
|
5
|
+
ignoreAttributes: false,
|
|
6
|
+
attributeNamePrefix: '@_',
|
|
7
|
+
isArray: (name) => name === 'emailtemplate',
|
|
8
|
+
});
|
|
9
|
+
const ENTITY_TYPE_MAP = {
|
|
10
|
+
0: 'Global',
|
|
11
|
+
1: 'Account',
|
|
12
|
+
2: 'Contact',
|
|
13
|
+
3: 'Opportunity',
|
|
14
|
+
4: 'Lead',
|
|
15
|
+
5: 'Case',
|
|
16
|
+
6: 'Invoice',
|
|
17
|
+
7: 'Order',
|
|
18
|
+
8: 'Quote',
|
|
19
|
+
9: 'Campaign Activity',
|
|
20
|
+
10: 'Campaign',
|
|
21
|
+
4700: 'System',
|
|
22
|
+
};
|
|
23
|
+
function resolveEntity(code) {
|
|
24
|
+
return ENTITY_TYPE_MAP[code] ?? `Entity (${code})`;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Reconstructs readable text from an XSL template by interleaving
|
|
28
|
+
* CDATA text content and xsl:value-of dynamic field placeholders in order.
|
|
29
|
+
* Returns { text, dynamicFields }.
|
|
30
|
+
*/
|
|
31
|
+
function extractFromXsl(xslPath) {
|
|
32
|
+
if (!fs.existsSync(xslPath))
|
|
33
|
+
return { text: '', dynamicFields: [] };
|
|
34
|
+
const raw = fs.readFileSync(xslPath, 'utf-8');
|
|
35
|
+
const parts = [];
|
|
36
|
+
const dynamicFields = [];
|
|
37
|
+
// Walk CDATA blocks and xsl:value-of selects in document order
|
|
38
|
+
const allMatches = [
|
|
39
|
+
...raw.matchAll(/\[CDATA\[([\s\S]*?)\]\]|<xsl:value-of select="([^"]+)"/g)
|
|
40
|
+
];
|
|
41
|
+
for (const m of allMatches) {
|
|
42
|
+
if (m[1] !== undefined) {
|
|
43
|
+
// CDATA block — strip HTML tags, normalise whitespace
|
|
44
|
+
const text = m[1]
|
|
45
|
+
.replace(/<\/?(p|div|li|ul|ol|br)[^>]*>/gi, '\n')
|
|
46
|
+
.replace(/<[^>]+>/g, '')
|
|
47
|
+
.replace(/ /g, ' ')
|
|
48
|
+
.replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&')
|
|
49
|
+
.replace(/[ \t]+/g, ' ')
|
|
50
|
+
.replace(/\n[ \t]+/g, '\n')
|
|
51
|
+
.trim();
|
|
52
|
+
if (text)
|
|
53
|
+
parts.push(text);
|
|
54
|
+
}
|
|
55
|
+
else if (m[2] && !m[2].startsWith('/')) {
|
|
56
|
+
// Dynamic field reference — format as {fieldName}
|
|
57
|
+
const field = m[2]
|
|
58
|
+
.replace(/^[a-z_]+\//, '') // strip entity prefix e.g. "contact/"
|
|
59
|
+
.replace(/\/@name$/, ''); // strip @name attribute selector
|
|
60
|
+
parts.push(`{${field}}`);
|
|
61
|
+
if (!dynamicFields.includes(m[2]))
|
|
62
|
+
dynamicFields.push(m[2]);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const text = parts.join('').replace(/\n{3,}/g, '\n\n').trim();
|
|
66
|
+
return { text, dynamicFields };
|
|
67
|
+
}
|
|
68
|
+
function parseTemplateEntry(entry, emailTemplatesDir) {
|
|
69
|
+
const id = (entry['templateid'] ?? '').replace(/[{}]/g, '');
|
|
70
|
+
const title = entry['title'] ?? '';
|
|
71
|
+
const description = entry['description'] ?? '';
|
|
72
|
+
const templateTypeCode = Number(entry['templatetypecode'] ?? 0);
|
|
73
|
+
const languageCode = Number(entry['languagecode'] ?? 1033);
|
|
74
|
+
const isCustomizable = String(entry['IsCustomizable'] ?? '1') === '1';
|
|
75
|
+
const xslDir = path.join(emailTemplatesDir, 'EmailDocuments', String(languageCode), '{' + id + '}');
|
|
76
|
+
const subjectXslPath = path.join(xslDir, 'subject.xsl');
|
|
77
|
+
const { text: subject, dynamicFields: subjectFields } = extractFromXsl(subjectXslPath);
|
|
78
|
+
const bodyXslPath = path.join(xslDir, 'body.xsl');
|
|
79
|
+
const { text: body, dynamicFields: bodyFields } = extractFromXsl(bodyXslPath);
|
|
80
|
+
const allFields = [...new Set([...subjectFields, ...bodyFields])].sort();
|
|
81
|
+
return {
|
|
82
|
+
id,
|
|
83
|
+
title,
|
|
84
|
+
description,
|
|
85
|
+
targetEntity: resolveEntity(templateTypeCode),
|
|
86
|
+
templateTypeCode,
|
|
87
|
+
subject,
|
|
88
|
+
body,
|
|
89
|
+
dynamicFields: allFields,
|
|
90
|
+
languageCode,
|
|
91
|
+
isCustomizable,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export function parseEmailTemplates(solutionRoot) {
|
|
95
|
+
const emailTemplatesDir = path.join(solutionRoot, 'Templates');
|
|
96
|
+
const metaPath = path.join(emailTemplatesDir, 'EmailTemplates.xml');
|
|
97
|
+
if (!fs.existsSync(metaPath)) {
|
|
98
|
+
console.log(`No Templates folder found at: ${emailTemplatesDir}`);
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
const xml = fs.readFileSync(metaPath, 'utf-8');
|
|
102
|
+
const doc = xmlParser.parse(xml);
|
|
103
|
+
const entries = doc['EmailTemplates']?.['emailtemplate'] ?? [];
|
|
104
|
+
return entries
|
|
105
|
+
.map(e => parseTemplateEntry(e, emailTemplatesDir))
|
|
106
|
+
.filter(t => t.isCustomizable && t.title)
|
|
107
|
+
.sort((a, b) => a.title.localeCompare(b.title));
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=emailTemplateParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emailTemplateParser.js","sourceRoot":"","sources":["../../src/parsers/emailTemplateParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { GlobalChoiceModel } from '../ir/globalChoice.js';
|
|
2
|
+
/**
|
|
3
|
+
* Scans the OptionSets/ folder and returns a model per global choice file.
|
|
4
|
+
* Filters to custom choices using the publisher prefix (e.g. "isms_").
|
|
5
|
+
* Sorted alphabetically by display name.
|
|
6
|
+
*/
|
|
7
|
+
export declare function parseGlobalChoices(solutionRoot: string, publisherPrefix?: string): GlobalChoiceModel[];
|
|
8
|
+
//# sourceMappingURL=globalChoiceParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"globalChoiceParser.d.ts","sourceRoot":"","sources":["../../src/parsers/globalChoiceParser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAoC,MAAM,uBAAuB,CAAC;AAsEjG;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,eAAe,CAAC,EAAE,MAAM,GACvB,iBAAiB,EAAE,CAgBrB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { XMLParser } from 'fast-xml-parser';
|
|
4
|
+
const xmlParser = new XMLParser({
|
|
5
|
+
ignoreAttributes: false,
|
|
6
|
+
attributeNamePrefix: '@_',
|
|
7
|
+
isArray: (name) => name === 'option' || name === 'label' || name === 'Description' || name === 'displayname',
|
|
8
|
+
});
|
|
9
|
+
function parseOptionSetType(raw) {
|
|
10
|
+
switch ((raw ?? '').toLowerCase()) {
|
|
11
|
+
case 'picklist': return 'picklist';
|
|
12
|
+
case 'bool': return 'bool';
|
|
13
|
+
case 'status': return 'status';
|
|
14
|
+
case 'state': return 'state';
|
|
15
|
+
default: return 'Unknown';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function parseOption(raw) {
|
|
19
|
+
const value = Number(raw['@_value'] ?? 0);
|
|
20
|
+
const isHidden = String(raw['@_IsHidden'] ?? '0') === '1';
|
|
21
|
+
const externalValue = String(raw['@_ExternalValue'] ?? '');
|
|
22
|
+
// Label — pick languagecode 1033 (English) first, fall back to first available
|
|
23
|
+
const labels = raw['labels']?.['label'] ?? [];
|
|
24
|
+
const englishLabel = labels.find((l) => String(l['@_languagecode']) === '1033');
|
|
25
|
+
const label = (englishLabel ?? labels[0])?.['@_description'] ?? '';
|
|
26
|
+
// Description
|
|
27
|
+
const descriptions = raw['Descriptions']?.['Description'] ?? [];
|
|
28
|
+
const englishDesc = descriptions.find((d) => String(d['@_languagecode']) === '1033');
|
|
29
|
+
const description = (englishDesc ?? descriptions[0])?.['@_description'] ?? '';
|
|
30
|
+
return { value, label, description, isHidden, externalValue };
|
|
31
|
+
}
|
|
32
|
+
function parseChoiceFile(filePath) {
|
|
33
|
+
try {
|
|
34
|
+
const xml = fs.readFileSync(filePath, 'utf-8');
|
|
35
|
+
const doc = xmlParser.parse(xml);
|
|
36
|
+
const os = doc['optionset'];
|
|
37
|
+
if (!os)
|
|
38
|
+
return null;
|
|
39
|
+
const schemaName = os['@_Name'] ?? path.basename(filePath, '.xml');
|
|
40
|
+
// Display name — prefer localizedName attribute, fall back to displaynames element
|
|
41
|
+
const localizedName = os['@_localizedName'] ?? '';
|
|
42
|
+
const displayNameEl = os['displaynames']?.['displayname'] ?? [];
|
|
43
|
+
const displayNameFromEl = (Array.isArray(displayNameEl) ? displayNameEl[0] : displayNameEl)?.['@_description'] ?? '';
|
|
44
|
+
const displayName = localizedName || displayNameFromEl || schemaName;
|
|
45
|
+
// Description
|
|
46
|
+
const descEl = os['Descriptions']?.['Description'] ?? [];
|
|
47
|
+
const descItem = Array.isArray(descEl) ? descEl[0] : descEl;
|
|
48
|
+
const description = descItem?.['@_description'] ?? '';
|
|
49
|
+
const optionSetType = parseOptionSetType(os['OptionSetType']);
|
|
50
|
+
const isGlobal = String(os['IsGlobal'] ?? '1') === '1';
|
|
51
|
+
// Options — filter out hidden ones by default; keep all and let renderer decide
|
|
52
|
+
const rawOptions = os['options']?.['option'] ?? [];
|
|
53
|
+
const options = rawOptions.map(parseOption);
|
|
54
|
+
return { schemaName, displayName, description, optionSetType, isGlobal, options };
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Scans the OptionSets/ folder and returns a model per global choice file.
|
|
62
|
+
* Filters to custom choices using the publisher prefix (e.g. "isms_").
|
|
63
|
+
* Sorted alphabetically by display name.
|
|
64
|
+
*/
|
|
65
|
+
export function parseGlobalChoices(solutionRoot, publisherPrefix) {
|
|
66
|
+
const optionSetsDir = path.join(solutionRoot, 'OptionSets');
|
|
67
|
+
if (!fs.existsSync(optionSetsDir))
|
|
68
|
+
return [];
|
|
69
|
+
return fs
|
|
70
|
+
.readdirSync(optionSetsDir)
|
|
71
|
+
.filter(f => {
|
|
72
|
+
if (!f.endsWith('.xml'))
|
|
73
|
+
return false;
|
|
74
|
+
if (publisherPrefix) {
|
|
75
|
+
return f.toLowerCase().startsWith(`${publisherPrefix.toLowerCase()}_`);
|
|
76
|
+
}
|
|
77
|
+
return true;
|
|
78
|
+
})
|
|
79
|
+
.map(f => parseChoiceFile(path.join(optionSetsDir, f)))
|
|
80
|
+
.filter((m) => m !== null)
|
|
81
|
+
.sort((a, b) => a.displayName.localeCompare(b.displayName));
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=globalChoiceParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"globalChoiceParser.js","sourceRoot":"","sources":["../../src/parsers/globalChoiceParser.ts"],"names":[],"mappings":"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"}
|
package/dist/parsers/index.d.ts
CHANGED
|
@@ -11,4 +11,6 @@ export { parseClassicWorkflows } from './classicWorkflowParser.js';
|
|
|
11
11
|
export { parseBusinessRules } from './businessRuleParser.js';
|
|
12
12
|
export { parseSecurityRoles } from './securityRoleParser.js';
|
|
13
13
|
export { parseEnvironmentVariables } from './environmentVariableParser.js';
|
|
14
|
+
export { parseGlobalChoices } from './globalChoiceParser.js';
|
|
15
|
+
export { parseEmailTemplates } from './emailTemplateParser.js';
|
|
14
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/parsers/index.js
CHANGED
|
@@ -11,4 +11,6 @@ export { parseClassicWorkflows } from './classicWorkflowParser.js';
|
|
|
11
11
|
export { parseBusinessRules } from './businessRuleParser.js';
|
|
12
12
|
export { parseSecurityRoles } from './securityRoleParser.js';
|
|
13
13
|
export { parseEnvironmentVariables } from './environmentVariableParser.js';
|
|
14
|
+
export { parseGlobalChoices } from './globalChoiceParser.js';
|
|
15
|
+
export { parseEmailTemplates } from './emailTemplateParser.js';
|
|
14
16
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DocGenConfig } from '../config/index.js';
|
|
2
|
-
import type { SolutionModel, FlowModel, PluginAssemblyModel, WebResourceModel, SecurityRoleModel, ClassicWorkflowModel, BusinessRuleModel, EnvironmentVariableModel } from '../ir/index.js';
|
|
2
|
+
import type { SolutionModel, FlowModel, PluginAssemblyModel, WebResourceModel, SecurityRoleModel, ClassicWorkflowModel, BusinessRuleModel, EnvironmentVariableModel, GlobalChoiceModel, EmailTemplateModel } from '../ir/index.js';
|
|
3
3
|
import type { WikiPage } from './wikiPublisher.js';
|
|
4
|
-
export declare function buildWikiPages(config: DocGenConfig, solutions: SolutionModel[], mergedSolution: SolutionModel, flows: FlowModel[], pluginAssemblies?: PluginAssemblyModel[], webResources?: WebResourceModel[], classicWorkflows?: ClassicWorkflowModel[], businessRules?: BusinessRuleModel[], securityRoles?: SecurityRoleModel[], envVars?: EnvironmentVariableModel[]): WikiPage[];
|
|
4
|
+
export declare function buildWikiPages(config: DocGenConfig, solutions: SolutionModel[], mergedSolution: SolutionModel, flows: FlowModel[], pluginAssemblies?: PluginAssemblyModel[], webResources?: WebResourceModel[], classicWorkflows?: ClassicWorkflowModel[], businessRules?: BusinessRuleModel[], securityRoles?: SecurityRoleModel[], envVars?: EnvironmentVariableModel[], globalChoices?: GlobalChoiceModel[], emailTemplates?: EmailTemplateModel[]): WikiPage[];
|
|
5
5
|
//# sourceMappingURL=wikiAssembler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wikiAssembler.d.ts","sourceRoot":"","sources":["../../src/publisher/wikiAssembler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EACV,aAAa,EAAE,SAAS,EAAE,mBAAmB,EAAE,gBAAgB,EAC/D,iBAAiB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"wikiAssembler.d.ts","sourceRoot":"","sources":["../../src/publisher/wikiAssembler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EACV,aAAa,EAAE,SAAS,EAAE,mBAAmB,EAAE,gBAAgB,EAC/D,iBAAiB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,wBAAwB,EACpF,iBAAiB,EAAE,kBAAkB,EACtC,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA4BnD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,aAAa,EAAE,EAC1B,cAAc,EAAE,aAAa,EAC7B,KAAK,EAAE,SAAS,EAAE,EAClB,gBAAgB,GAAE,mBAAmB,EAAO,EAC5C,YAAY,GAAE,gBAAgB,EAAO,EACrC,gBAAgB,GAAE,oBAAoB,EAAO,EAC7C,aAAa,GAAE,iBAAiB,EAAO,EACvC,aAAa,GAAE,iBAAiB,EAAO,EACvC,OAAO,GAAE,wBAAwB,EAAO,EACxC,aAAa,GAAE,iBAAiB,EAAO,EACvC,cAAc,GAAE,kBAAkB,EAAO,GACxC,QAAQ,EAAE,CAyPZ"}
|