@tywalk/pcf-helper 1.5.6 → 1.5.8

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 CHANGED
@@ -1,33 +1,257 @@
1
- # PCF Helper
1
+ # PCF Helper Core 🔧
2
2
 
3
- A simple command-line tool that upgrades, builds, and imports your PCF control into your Dataverse environment.
3
+ [![npm version](https://badge.fury.io/js/%40tywalk%2Fpcf-helper.svg)](https://badge.fury.io/js/%40tywalk%2Fpcf-helper)
4
+ [![TypeScript](https://img.shields.io/badge/TypeScript-007ACC?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
4
5
 
5
- You can run commands separately or run `pcf-helper-deploy` to upgrade, build, and import with just one command.
6
+ **Individual CLI commands and core library for Power Platform Component Framework (PCF) development.**
6
7
 
7
- ## Requirements
8
+ This package provides discrete command-line utilities for each PCF operation, making it ideal for automation scripts and developers who prefer granular control over their PCF workflows.
8
9
 
9
- This tool requires the following:
10
+ ## 📋 Table of Contents
10
11
 
11
- * `pac` cli installed on your machine.
12
- * `dotnet` cli or Visual Studio installed on your machine.
12
+ - [Installation](#installation)
13
+ - [Available Commands](#available-commands)
14
+ - [Command Reference](#command-reference)
15
+ - [API Reference](#api-reference)
16
+ - [Troubleshooting](#troubleshooting)
13
17
 
14
- ## Instructions
18
+ ## 📦 Installation
15
19
 
16
- 1. In your project, run `npm install --save @tywalk/pcf-helper`. Or, install globally `npm install --save --global @tywalk/pcf-helper`.
17
- 2. In your project's `package.json` file, add commands as npm scripts:
20
+ ### Global Installation (Recommended)
18
21
 
19
- ```json
20
- "scripts": {
21
- "upgrade": "pcf-helper-upgrade --path <path to pcf project folder>",
22
- "build": "pcf-helper-build --path <path to pcf project folder>",
23
- "import": "pcf-helper-import --path <path to pcf project folder> --environment <environment guid or url>",
24
- "deploy": "pcf-helper-deploy --path <path to pcf project folder> --environment <environment guid or url>",
25
- "init": "pcf-helper-init --path <path to pcf project folder (optional)> --name <name of the pcf project> --publisher-name <powerapps publisher name> --publisher-prefix <powerapps publisher prefix>"
26
- },
22
+ ```bash
23
+ npm install -g @tywalk/pcf-helper
27
24
  ```
28
25
 
29
- ## Contributing
26
+ ### Local Installation
30
27
 
31
- ### Deployment
28
+ ```bash
29
+ npm install @tywalk/pcf-helper
30
+ ```
31
+
32
+ ## 🛠️ Available Commands
33
+
34
+ Each command is available as a standalone executable:
35
+
36
+ | Command | Purpose | Global Usage |
37
+ |---------|---------|--------------|
38
+ | `pcf-helper-init` | Initialize new PCF project | `pcf-helper-init [options]` |
39
+ | `pcf-helper-build` | Build PCF controls | `pcf-helper-build [options]` |
40
+ | `pcf-helper-import` | Import controls to solution | `pcf-helper-import [options]` |
41
+ | `pcf-helper-deploy` | Deploy controls (upgrade + build + import) | `pcf-helper-deploy [options]` |
42
+ | `pcf-helper-upgrade` | Upgrade project dependencies | `pcf-helper-upgrade [options]` |
43
+ | `pcf-helper-session` | Manage development sessions | `pcf-helper-session [options]` |
44
+
45
+ ## 📖 Command Reference
46
+
47
+ ### 🏗️ pcf-helper-init
48
+
49
+ Initialize a new PCF project with proper scaffolding.
50
+
51
+ ```bash
52
+ pcf-helper-init -n <control-name> [options]
53
+ ```
54
+
55
+ #### Options
56
+
57
+ | Option | Description | Required | Default |
58
+ |--------|-------------|----------|---------|
59
+ | `-n, --name <name>` | Name of the PCF control | ✅ | - |
60
+ | `--publisher-name <name>` | Publisher name for the control | ❌ | - |
61
+ | `--publisher-prefix <prefix>` | Publisher prefix | ❌ | - |
62
+ | `-p, --path <path>` | Path to create the project | ❌ | Current directory |
63
+ | `--run-npm-install` | Run npm install after init | ❌ | `true` |
64
+ | `-V, --verbose` | Enable verbose logging | ❌ | `false` |
65
+ | `-v, --version` | Display version | ❌ | - |
66
+
67
+ #### Example
68
+
69
+ ```bash
70
+ # Basic initialization
71
+ pcf-helper-init -n MyCustomControl
72
+
73
+ # Full initialization with custom settings
74
+ pcf-helper-init -n MyCustomControl \
75
+ --publisher-name "Contoso" \
76
+ --publisher-prefix "con" \
77
+ -p ./my-pcf-project \
78
+ --verbose
79
+ ```
80
+
81
+ ### ⚡ pcf-helper-build
82
+
83
+ Build and compile your PCF controls.
84
+
85
+ ```bash
86
+ pcf-helper-build -p <solution-path> [options]
87
+ ```
88
+
89
+ #### Options
90
+
91
+ | Option | Description | Required | Default |
92
+ |--------|-------------|----------|---------|
93
+ | `-p, --path <path>` | Path to solution folder | ✅ | - |
94
+ | `-t, --timeout <ms>` | Timeout in milliseconds | ❌ | 300000 |
95
+ | `-V, --verbose` | Enable verbose logging | ❌ | `false` |
96
+ | `-v, --version` | Display version | ❌ | - |
97
+
98
+ #### Example
99
+
100
+ ```bash
101
+ # Build with default settings
102
+ pcf-helper-build -p ./MySolution
103
+
104
+ # Build with custom timeout and verbose output
105
+ pcf-helper-build -p ./MySolution --timeout 120000 --verbose
106
+ ```
107
+
108
+ ### 📦 pcf-helper-import
109
+
110
+ Import PCF controls into your Dataverse solution.
111
+
112
+ ```bash
113
+ pcf-helper-import -p <solution-path> [options]
114
+ ```
115
+
116
+ #### Options
117
+
118
+ | Option | Description | Required | Default |
119
+ |--------|-------------|----------|---------|
120
+ | `-p, --path <path>` | Path to solution folder | ✅ | - |
121
+ | `-e, --environment <environment>` | Target environment | ❌ | - |
122
+ | `-t, --timeout <ms>` | Timeout in milliseconds | ❌ | 300000 |
123
+ | `-V, --verbose` | Enable verbose logging | ❌ | `false` |
124
+ | `-v, --version` | Display version | ❌ | - |
125
+
126
+ ### 🚀 pcf-helper-deploy
127
+
128
+ Deploy your PCF controls to the target environment. This command runs upgrade, build, and import in sequence.
129
+
130
+ ```bash
131
+ pcf-helper-deploy -p <solution-path> [options]
132
+ ```
133
+
134
+ #### Options
135
+
136
+ Same as pcf-helper-import, but runs the full deployment pipeline.
137
+
138
+ ### 🔄 pcf-helper-upgrade
139
+
140
+ Upgrade project dependencies and framework versions.
141
+
142
+ ```bash
143
+ pcf-helper-upgrade -p <solution-path> [options]
144
+ ```
145
+
146
+ #### Options
147
+
148
+ | Option | Description | Required | Default |
149
+ |--------|-------------|----------|---------|
150
+ | `-p, --path <path>` | Path to solution folder | ✅ | - |
151
+ | `-V, --verbose` | Enable verbose logging | ❌ | `false` |
152
+ | `-v, --version` | Display version | ❌ | - |
153
+
154
+ ### 🎯 pcf-helper-session
155
+
156
+ Manage development sessions with live reloading capabilities.
157
+
158
+ ```bash
159
+ pcf-helper-session [options]
160
+ ```
161
+
162
+ #### Options
163
+
164
+ | Option | Description | Required | Default |
165
+ |--------|-------------|----------|---------|
166
+ | `-u, --url <url>` | Remote environment URL | ❌ | - |
167
+ | `-s, --script <path>` | Remote script to intercept | ❌ | - |
168
+ | `-t, --stylesheet <path>` | Remote stylesheet to intercept | ❌ | - |
169
+ | `-b, --bundle <path>` | Local bundle path | ❌ | - |
170
+ | `-c, --css <path>` | Local CSS path | ❌ | - |
171
+ | `-f, --config <path>` | Config file path | ❌ | `session.config.json` |
172
+ | `-V, --verbose` | Enable verbose logging | ❌ | `false` |
173
+ | `-v, --version` | Display version | ❌ | - |
174
+
175
+ ## 🔧 API Reference
176
+
177
+ You can also use PCF Helper programmatically in your Node.js applications:
178
+
179
+ ```typescript
180
+ import * as pcfHelper from '@tywalk/pcf-helper';
181
+
182
+ // Build a PCF control
183
+ const result = pcfHelper.runBuild('./my-solution', true, 120000);
184
+
185
+ // Initialize a new project
186
+ const initResult = pcfHelper.runInit(
187
+ './new-project',
188
+ 'MyControl',
189
+ 'My Publisher',
190
+ 'mp',
191
+ true,
192
+ true
193
+ );
194
+
195
+ // Set logging level
196
+ pcfHelper.setLogLevel('debug');
197
+ ```
198
+
199
+ ### Available Functions
200
+
201
+ - `runBuild(path, verbose, timeout?)` - Build PCF controls
202
+ - `runInit(path, name, publisherName, publisherPrefix, runNpmInstall, verbose)` - Initialize new PCF project
203
+ - `runImport(path, environment, verbose, timeout?)` - Import controls to solution
204
+ - `runUpgrade(path, verbose)` - Upgrade project
205
+ - `runSession(...)` - Manage development sessions
206
+ - `setLogLevel(level)` - Set logging verbosity ('debug' | 'info' | 'warn' | 'error')
207
+
208
+ ## 🐛 Troubleshooting
209
+
210
+ ### Common Issues
211
+
212
+ #### Build Failures
213
+
214
+ ```bash
215
+ # Enable verbose logging for detailed error information
216
+ pcf-helper-build -p . --verbose
217
+
218
+ # Check if PAC CLI is properly installed
219
+ pac --version
220
+
221
+ # Verify .NET SDK installation
222
+ dotnet --version
223
+ ```
224
+
225
+ #### Timeout Errors
226
+
227
+ ```bash
228
+ # Increase timeout for large projects
229
+ pcf-helper-build -p . --timeout 600000 # 10 minutes
230
+ ```
231
+
232
+ ### Getting Help
233
+
234
+ ```bash
235
+ # Show help for any command
236
+ pcf-helper-build --help
237
+ pcf-helper-init --help
238
+
239
+ # Show version
240
+ pcf-helper-build --version
241
+ ```
242
+
243
+ ## 📚 Additional Resources
244
+
245
+ - [Power Platform Component Framework Documentation](https://docs.microsoft.com/en-us/powerapps/developer/component-framework/)
246
+ - [Power Platform CLI Reference](https://docs.microsoft.com/en-us/powerapps/developer/data-platform/powerapps-cli)
247
+
248
+ ## 🔗 Related Packages
249
+
250
+ - **[@tywalk/pcf-helper-run](../pcf-helper-run/README.md)** - Unified CLI interface
251
+ - **[@tywalk/color-logger](https://www.npmjs.com/package/@tywalk/color-logger)** - Enhanced logging utilities
252
+
253
+ ---
254
+
255
+ ## 🏠 [← Back to Main Package](../../README.md)
32
256
 
33
-
257
+ For questions or issues, please visit our [GitHub Issues](https://github.com/tywalk/pcf-helper/issues) page.
@@ -12,14 +12,18 @@ test('build displays version', (done) => {
12
12
  console.error(`stderr: ${data}`);
13
13
  });
14
14
  task.on('close', (code) => {
15
- console.log(output);
16
- expect(output).toContain(`v${package_json_1.version}`);
15
+ expect(output).toContain(package_json_1.version);
17
16
  expect(code).toBe(0);
18
17
  done();
19
18
  });
20
19
  });
21
20
  test('build errors if no path is provided', (done) => {
22
21
  const task = (0, child_process_1.spawn)('node', ['./dist/bin/build.js', '-p']);
22
+ // Add timeout
23
+ const timeout = setTimeout(() => {
24
+ task.kill();
25
+ done.fail('Test timed out');
26
+ }, 5000);
23
27
  let output = '';
24
28
  task.stdout.on('data', (data) => {
25
29
  output += data.toString();
@@ -28,8 +32,8 @@ test('build errors if no path is provided', (done) => {
28
32
  console.error(`stderr: ${data}`);
29
33
  });
30
34
  task.on('close', (code) => {
31
- console.log(output);
32
35
  expect(code).toBe(1);
36
+ clearTimeout(timeout);
33
37
  done();
34
38
  });
35
39
  });
@@ -12,14 +12,18 @@ test('deploy displays version', (done) => {
12
12
  console.error(`stderr: ${data}`);
13
13
  });
14
14
  task.on('close', (code) => {
15
- console.log(output);
16
- expect(output).toContain(`v${package_json_1.version}`);
15
+ expect(output).toContain(package_json_1.version);
17
16
  expect(code).toBe(0);
18
17
  done();
19
18
  });
20
19
  });
21
20
  test('deploy errors if no path is provided', (done) => {
22
21
  const task = (0, child_process_1.spawn)('node', ['./dist/bin/deploy.js', '-p']);
22
+ // Add timeout
23
+ const timeout = setTimeout(() => {
24
+ task.kill();
25
+ done.fail('Test timed out');
26
+ }, 5000);
23
27
  let output = '';
24
28
  task.stdout.on('data', (data) => {
25
29
  output += data.toString();
@@ -28,8 +32,8 @@ test('deploy errors if no path is provided', (done) => {
28
32
  console.error(`stderr: ${data}`);
29
33
  });
30
34
  task.on('close', (code) => {
31
- console.log(output);
32
35
  expect(code).toBe(1);
36
+ clearTimeout(timeout);
33
37
  done();
34
38
  });
35
39
  });
@@ -9,14 +9,18 @@ test('import displays version', (done) => {
9
9
  output += data.toString();
10
10
  });
11
11
  task.on('close', (code) => {
12
- console.log(output);
13
- expect(output).toContain(`v${package_json_1.version}`);
12
+ expect(output).toContain(package_json_1.version);
14
13
  expect(code).toBe(0);
15
14
  done();
16
15
  });
17
16
  });
18
17
  test('import errors if no path is provided', (done) => {
19
18
  const task = (0, child_process_1.spawn)('node', ['./dist/bin/import.js', '-p']);
19
+ // Add timeout
20
+ const timeout = setTimeout(() => {
21
+ task.kill();
22
+ done.fail('Test timed out');
23
+ }, 5000);
20
24
  let output = '';
21
25
  task.stdout.on('data', (data) => {
22
26
  output += data.toString();
@@ -25,8 +29,8 @@ test('import errors if no path is provided', (done) => {
25
29
  console.error(`stderr: ${data}`);
26
30
  });
27
31
  task.on('close', (code) => {
28
- console.log(output);
29
32
  expect(code).toBe(1);
33
+ clearTimeout(timeout);
30
34
  done();
31
35
  });
32
36
  });
@@ -9,14 +9,18 @@ test('init displays version', (done) => {
9
9
  output += data.toString();
10
10
  });
11
11
  task.on('close', (code) => {
12
- console.log(output);
13
- expect(output).toContain(`v${package_json_1.version}`);
12
+ expect(output).toContain(package_json_1.version);
14
13
  expect(code).toBe(0);
15
14
  done();
16
15
  });
17
16
  });
18
17
  test('init errors if no path is provided', (done) => {
19
18
  const task = (0, child_process_1.spawn)('node', ['./dist/bin/init.js', '-p']);
19
+ // Add timeout
20
+ const timeout = setTimeout(() => {
21
+ task.kill();
22
+ done.fail('Test timed out');
23
+ }, 5000);
20
24
  let output = '';
21
25
  task.stdout.on('data', (data) => {
22
26
  output += data.toString();
@@ -25,8 +29,8 @@ test('init errors if no path is provided', (done) => {
25
29
  console.error(`stderr: ${data}`);
26
30
  });
27
31
  task.on('close', (code) => {
28
- console.log(output);
29
32
  expect(code).toBe(1);
33
+ clearTimeout(timeout);
30
34
  done();
31
35
  });
32
36
  });
@@ -9,14 +9,18 @@ test('session displays version', (done) => {
9
9
  output += data.toString();
10
10
  });
11
11
  task.on('close', (code) => {
12
- console.log(output);
13
- expect(output).toContain(`v${package_json_1.version}`);
12
+ expect(output).toContain(package_json_1.version);
14
13
  expect(code).toBe(0);
15
14
  done();
16
15
  });
17
16
  });
18
17
  test('session errors if no args are provided', (done) => {
19
18
  const task = (0, child_process_1.spawn)('node', ['./dist/bin/session.js', '-e']);
19
+ // Add timeout
20
+ const timeout = setTimeout(() => {
21
+ task.kill();
22
+ done.fail('Test timed out');
23
+ }, 5000);
20
24
  let output = '';
21
25
  task.stdout.on('data', (data) => {
22
26
  output += data.toString();
@@ -25,8 +29,8 @@ test('session errors if no args are provided', (done) => {
25
29
  console.error(`stderr: ${data}`);
26
30
  });
27
31
  task.on('close', (code) => {
28
- console.log(output);
29
32
  expect(code).toBe(1);
33
+ clearTimeout(timeout);
30
34
  done();
31
35
  });
32
36
  });
@@ -9,14 +9,18 @@ test('upgrade displays version', (done) => {
9
9
  output += data.toString();
10
10
  });
11
11
  task.on('close', (code) => {
12
- console.log(output);
13
- expect(output).toContain(`v${package_json_1.version}`);
12
+ expect(output).toContain(package_json_1.version);
14
13
  expect(code).toBe(0);
15
14
  done();
16
15
  });
17
16
  });
18
17
  test('upgrade errors if no path is provided', (done) => {
19
18
  const task = (0, child_process_1.spawn)('node', ['./dist/bin/upgrade.js', '-p']);
19
+ // Add timeout
20
+ const timeout = setTimeout(() => {
21
+ task.kill();
22
+ done.fail('Test timed out');
23
+ }, 5000);
20
24
  let output = '';
21
25
  task.stdout.on('data', (data) => {
22
26
  output += data.toString();
@@ -25,8 +29,8 @@ test('upgrade errors if no path is provided', (done) => {
25
29
  console.error(`stderr: ${data}`);
26
30
  });
27
31
  task.on('close', (code) => {
28
- console.log(output);
29
32
  expect(code).toBe(1);
33
+ clearTimeout(timeout);
30
34
  done();
31
35
  });
32
36
  });
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tywalk/pcf-helper",
3
- "version": "1.5.6",
3
+ "version": "1.5.7",
4
4
  "description": "Command line helper for building and publishing PCF controls to Dataverse.",
5
5
  "main": "dist/index.js",
6
6
  "types": "./types/",
@@ -11,12 +11,17 @@
11
11
  "repository": {
12
12
  "url": "git+https://github.com/tywalk/pcf-helper.git"
13
13
  },
14
+ "publishConfig": {
15
+ "access": "public",
16
+ "provenance": true
17
+ },
14
18
  "scripts": {
15
19
  "test": "jest",
16
20
  "build": "tsc",
17
21
  "upgrade": "npm version patch --no-git-tag-version",
18
22
  "ready": "npm run upgrade && npm run build",
19
- "update": "npm run ready && npm publish --access public"
23
+ "update": "npm run ready && npm publish --access public",
24
+ "temp": "echo $version"
20
25
  },
21
26
  "keywords": [
22
27
  "pcf"
@@ -31,9 +36,13 @@
31
36
  "pcf-helper-session": "dist/bin/session.js"
32
37
  },
33
38
  "devDependencies": {
39
+ "@semantic-release/git": "^10.0.1",
40
+ "@semantic-release/github": "^12.0.6",
41
+ "@semantic-release/npm": "^13.1.5",
34
42
  "@types/jest": "^29.5.14",
35
43
  "@types/node": "^22.13.11",
36
44
  "jest": "^29.7.0",
45
+ "semantic-release": "^25.0.3",
37
46
  "ts-jest": "^29.2.6",
38
47
  "typescript": "^5.8.2"
39
48
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tywalk/pcf-helper",
3
- "version": "1.5.6",
3
+ "version": "1.5.8",
4
4
  "description": "Command line helper for building and publishing PCF controls to Dataverse.",
5
5
  "main": "dist/index.js",
6
6
  "types": "./types/",
@@ -11,12 +11,17 @@
11
11
  "repository": {
12
12
  "url": "git+https://github.com/tywalk/pcf-helper.git"
13
13
  },
14
+ "publishConfig": {
15
+ "access": "public",
16
+ "provenance": true
17
+ },
14
18
  "scripts": {
15
19
  "test": "jest",
16
20
  "build": "tsc",
17
21
  "upgrade": "npm version patch --no-git-tag-version",
18
22
  "ready": "npm run upgrade && npm run build",
19
- "update": "npm run ready && npm publish --access public"
23
+ "update": "npm run ready && npm publish --access public",
24
+ "temp": "echo $version"
20
25
  },
21
26
  "keywords": [
22
27
  "pcf"
@@ -31,9 +36,13 @@
31
36
  "pcf-helper-session": "dist/bin/session.js"
32
37
  },
33
38
  "devDependencies": {
39
+ "@semantic-release/git": "^10.0.1",
40
+ "@semantic-release/github": "^12.0.6",
41
+ "@semantic-release/npm": "^13.1.5",
34
42
  "@types/jest": "^29.5.14",
35
43
  "@types/node": "^22.13.11",
36
44
  "jest": "^29.7.0",
45
+ "semantic-release": "^25.0.3",
37
46
  "ts-jest": "^29.2.6",
38
47
  "typescript": "^5.8.2"
39
48
  },