@luquimbo/bi-superpowers 1.0.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/.claude-plugin/plugin.json +8 -0
- package/.mcp.json +25 -0
- package/AGENTS.md +244 -0
- package/CHANGELOG.md +265 -0
- package/LICENSE +21 -0
- package/README.md +211 -0
- package/bin/build-plugin.js +30 -0
- package/bin/cli.js +1064 -0
- package/bin/commands/add.js +533 -0
- package/bin/commands/add.test.js +77 -0
- package/bin/commands/build-desktop.js +166 -0
- package/bin/commands/changelog.js +443 -0
- package/bin/commands/diff.js +325 -0
- package/bin/commands/lint.js +419 -0
- package/bin/commands/lint.test.js +103 -0
- package/bin/commands/mcp-setup.js +246 -0
- package/bin/commands/pull.js +287 -0
- package/bin/commands/pull.test.js +36 -0
- package/bin/commands/push.js +231 -0
- package/bin/commands/push.test.js +14 -0
- package/bin/commands/search.js +344 -0
- package/bin/commands/search.test.js +115 -0
- package/bin/commands/setup.js +545 -0
- package/bin/commands/setup.test.js +46 -0
- package/bin/commands/sync-profile.js +405 -0
- package/bin/commands/sync-profile.test.js +14 -0
- package/bin/commands/sync-source.js +418 -0
- package/bin/commands/sync-source.test.js +14 -0
- package/bin/commands/watch.js +206 -0
- package/bin/lib/generators/claude-plugin.js +266 -0
- package/bin/lib/generators/claude-plugin.test.js +110 -0
- package/bin/lib/generators/index.js +116 -0
- package/bin/lib/generators/shared.js +282 -0
- package/bin/lib/licensing/index.js +35 -0
- package/bin/lib/licensing/storage.js +364 -0
- package/bin/lib/licensing/storage.test.js +55 -0
- package/bin/lib/licensing/validator.js +213 -0
- package/bin/lib/licensing/validator.test.js +137 -0
- package/bin/lib/microsoft-mcp.js +176 -0
- package/bin/lib/microsoft-mcp.test.js +106 -0
- package/bin/lib/skills.js +84 -0
- package/bin/mcp/powerbi-modeling-launcher.js +38 -0
- package/bin/postinstall.js +44 -0
- package/bin/utils/errors.js +159 -0
- package/bin/utils/git.js +298 -0
- package/bin/utils/logger.js +142 -0
- package/bin/utils/mcp-detect.js +274 -0
- package/bin/utils/mcp-detect.test.js +105 -0
- package/bin/utils/pbix.js +305 -0
- package/bin/utils/pbix.test.js +37 -0
- package/bin/utils/profiles.js +312 -0
- package/bin/utils/projects.js +168 -0
- package/bin/utils/readline.js +206 -0
- package/bin/utils/readline.test.js +47 -0
- package/bin/utils/tui.js +314 -0
- package/bin/utils/tui.test.js +127 -0
- package/commands/contributions.md +265 -0
- package/commands/data-model-design.md +468 -0
- package/commands/dax-doctor.md +248 -0
- package/commands/fabric-scripts.md +452 -0
- package/commands/migration-assistant.md +290 -0
- package/commands/model-documenter.md +242 -0
- package/commands/pbi-connect.md +239 -0
- package/commands/project-kickoff.md +905 -0
- package/commands/report-layout.md +296 -0
- package/commands/rls-design.md +533 -0
- package/commands/theme-tweaker.md +624 -0
- package/config.example.json +23 -0
- package/config.json +23 -0
- package/desktop-extension/manifest.json +37 -0
- package/desktop-extension/package.json +10 -0
- package/desktop-extension/server.js +95 -0
- package/docs/openrouter-free-models.md +92 -0
- package/library/examples/README.md +151 -0
- package/library/examples/finance-reporting/README.md +351 -0
- package/library/examples/finance-reporting/data-model.md +267 -0
- package/library/examples/finance-reporting/measures.dax +557 -0
- package/library/examples/hr-analytics/README.md +371 -0
- package/library/examples/hr-analytics/data-model.md +315 -0
- package/library/examples/hr-analytics/measures.dax +460 -0
- package/library/examples/marketing-analytics/README.md +37 -0
- package/library/examples/marketing-analytics/data-model.md +62 -0
- package/library/examples/marketing-analytics/measures.dax +110 -0
- package/library/examples/retail-analytics/README.md +439 -0
- package/library/examples/retail-analytics/data-model.md +288 -0
- package/library/examples/retail-analytics/measures.dax +481 -0
- package/library/examples/supply-chain/README.md +37 -0
- package/library/examples/supply-chain/data-model.md +69 -0
- package/library/examples/supply-chain/measures.dax +77 -0
- package/library/examples/udf-library/README.md +228 -0
- package/library/examples/udf-library/functions.dax +571 -0
- package/library/snippets/dax/README.md +292 -0
- package/library/snippets/dax/business-domains.md +576 -0
- package/library/snippets/dax/calculate-patterns.md +276 -0
- package/library/snippets/dax/calculation-groups.md +489 -0
- package/library/snippets/dax/error-handling.md +495 -0
- package/library/snippets/dax/iterators-and-aggregations.md +474 -0
- package/library/snippets/dax/kpis-and-metrics.md +293 -0
- package/library/snippets/dax/rankings-and-topn.md +235 -0
- package/library/snippets/dax/security-patterns.md +413 -0
- package/library/snippets/dax/text-and-formatting.md +316 -0
- package/library/snippets/dax/time-intelligence.md +196 -0
- package/library/snippets/dax/user-defined-functions.md +477 -0
- package/library/snippets/dax/virtual-tables.md +546 -0
- package/library/snippets/excel-formulas/README.md +84 -0
- package/library/snippets/excel-formulas/aggregations.md +330 -0
- package/library/snippets/excel-formulas/dates-and-times.md +361 -0
- package/library/snippets/excel-formulas/dynamic-arrays.md +314 -0
- package/library/snippets/excel-formulas/lookups.md +169 -0
- package/library/snippets/excel-formulas/text-functions.md +363 -0
- package/library/snippets/governance/naming-conventions.md +97 -0
- package/library/snippets/governance/review-checklists.md +107 -0
- package/library/snippets/power-query/README.md +389 -0
- package/library/snippets/power-query/api-integration.md +707 -0
- package/library/snippets/power-query/connections.md +434 -0
- package/library/snippets/power-query/data-cleaning.md +298 -0
- package/library/snippets/power-query/error-handling.md +526 -0
- package/library/snippets/power-query/parameters.md +350 -0
- package/library/snippets/power-query/performance.md +506 -0
- package/library/snippets/power-query/transformations.md +330 -0
- package/library/snippets/report-design/accessibility.md +78 -0
- package/library/snippets/report-design/chart-selection.md +54 -0
- package/library/snippets/report-design/layout-patterns.md +87 -0
- package/library/templates/data-models/README.md +93 -0
- package/library/templates/data-models/finance-model.md +627 -0
- package/library/templates/data-models/retail-star-schema.md +473 -0
- package/library/templates/excel/README.md +83 -0
- package/library/templates/excel/budget-tracker.md +432 -0
- package/library/templates/excel/data-entry-form.md +533 -0
- package/library/templates/power-bi/README.md +72 -0
- package/library/templates/power-bi/finance-report.md +449 -0
- package/library/templates/power-bi/kpi-scorecard.md +461 -0
- package/library/templates/power-bi/sales-dashboard.md +281 -0
- package/library/themes/excel/README.md +436 -0
- package/library/themes/power-bi/README.md +271 -0
- package/library/themes/power-bi/accessible.json +307 -0
- package/library/themes/power-bi/bi-superpowers-default.json +858 -0
- package/library/themes/power-bi/corporate-blue.json +291 -0
- package/library/themes/power-bi/dark-mode.json +291 -0
- package/library/themes/power-bi/minimal.json +292 -0
- package/library/themes/power-bi/print-friendly.json +309 -0
- package/package.json +93 -0
- package/skills/contributions/SKILL.md +267 -0
- package/skills/data-model-design/SKILL.md +470 -0
- package/skills/data-modeling/SKILL.md +254 -0
- package/skills/data-quality/SKILL.md +664 -0
- package/skills/dax/SKILL.md +708 -0
- package/skills/dax-doctor/SKILL.md +250 -0
- package/skills/dax-udf/SKILL.md +489 -0
- package/skills/deployment/SKILL.md +320 -0
- package/skills/excel-formulas/SKILL.md +463 -0
- package/skills/fabric-scripts/SKILL.md +454 -0
- package/skills/fast-standard/SKILL.md +509 -0
- package/skills/governance/SKILL.md +205 -0
- package/skills/migration-assistant/SKILL.md +292 -0
- package/skills/model-documenter/SKILL.md +244 -0
- package/skills/pbi-connect/SKILL.md +241 -0
- package/skills/power-query/SKILL.md +406 -0
- package/skills/project-kickoff/SKILL.md +907 -0
- package/skills/query-performance/SKILL.md +480 -0
- package/skills/report-design/SKILL.md +207 -0
- package/skills/report-layout/SKILL.md +298 -0
- package/skills/rls-design/SKILL.md +535 -0
- package/skills/semantic-model/SKILL.md +237 -0
- package/skills/testing-validation/SKILL.md +643 -0
- package/skills/theme-tweaker/SKILL.md +626 -0
- package/src/content/base.md +237 -0
- package/src/content/mcp-requirements.json +69 -0
- package/src/content/routing.md +203 -0
- package/src/content/skills/contributions.md +259 -0
- package/src/content/skills/data-model-design.md +462 -0
- package/src/content/skills/data-modeling.md +246 -0
- package/src/content/skills/data-quality.md +656 -0
- package/src/content/skills/dax-doctor.md +242 -0
- package/src/content/skills/dax-udf.md +481 -0
- package/src/content/skills/dax.md +700 -0
- package/src/content/skills/deployment.md +312 -0
- package/src/content/skills/excel-formulas.md +455 -0
- package/src/content/skills/fabric-scripts.md +446 -0
- package/src/content/skills/fast-standard.md +501 -0
- package/src/content/skills/governance.md +197 -0
- package/src/content/skills/migration-assistant.md +284 -0
- package/src/content/skills/model-documenter.md +236 -0
- package/src/content/skills/pbi-connect.md +233 -0
- package/src/content/skills/power-query.md +398 -0
- package/src/content/skills/project-kickoff.md +899 -0
- package/src/content/skills/query-performance.md +472 -0
- package/src/content/skills/report-design.md +199 -0
- package/src/content/skills/report-layout.md +290 -0
- package/src/content/skills/rls-design.md +527 -0
- package/src/content/skills/semantic-model.md +229 -0
- package/src/content/skills/testing-validation.md +635 -0
- package/src/content/skills/theme-tweaker.md +618 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# DAX User Defined Functions Library
|
|
2
|
+
|
|
3
|
+
A curated collection of reusable DAX User Defined Functions (UDFs) for common analytical patterns.
|
|
4
|
+
|
|
5
|
+
> **Status:** UDFs are a preview feature released September 2025. Syntax may change.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
This library provides ready-to-use functions for:
|
|
12
|
+
- Financial calculations (NPV, IRR, CAGR, loan payments)
|
|
13
|
+
- Statistical analysis (standard deviation, percentiles, z-scores)
|
|
14
|
+
- Text manipulation (formatting, validation, extraction)
|
|
15
|
+
- Date utilities (business days, fiscal periods, age calculation)
|
|
16
|
+
- Data validation (null handling, range checks, type validation)
|
|
17
|
+
- Formatting helpers (currency, percentages, conditional formatting)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## How to Use
|
|
22
|
+
|
|
23
|
+
### 1. Copy Functions to Your Query
|
|
24
|
+
|
|
25
|
+
Copy the `DEFINE` block from `functions.dax` into your DAX query:
|
|
26
|
+
|
|
27
|
+
```dax
|
|
28
|
+
DEFINE
|
|
29
|
+
FUNCTION AddTax = (amount : NUMERIC, rate : NUMERIC) =>
|
|
30
|
+
amount * (1 + rate)
|
|
31
|
+
|
|
32
|
+
EVALUATE { AddTax(100, 0.21) }
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 2. Use in DAX Studio
|
|
36
|
+
|
|
37
|
+
1. Open DAX Studio connected to your model
|
|
38
|
+
2. Paste the function definitions
|
|
39
|
+
3. Write your EVALUATE statement using the functions
|
|
40
|
+
|
|
41
|
+
### 3. Combine Multiple Functions
|
|
42
|
+
|
|
43
|
+
```dax
|
|
44
|
+
DEFINE
|
|
45
|
+
FUNCTION Round2 = (value : NUMERIC) => ROUND(value, 2)
|
|
46
|
+
FUNCTION AddTax = (amount : NUMERIC, rate : NUMERIC) => amount * (1 + rate)
|
|
47
|
+
FUNCTION FinalPrice = (price : NUMERIC, taxRate : NUMERIC) =>
|
|
48
|
+
Round2(AddTax(price, taxRate))
|
|
49
|
+
|
|
50
|
+
EVALUATE
|
|
51
|
+
ADDCOLUMNS(
|
|
52
|
+
Products,
|
|
53
|
+
"Price With Tax", FinalPrice([BasePrice], 0.21)
|
|
54
|
+
)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Function Catalog
|
|
60
|
+
|
|
61
|
+
### Financial Functions
|
|
62
|
+
|
|
63
|
+
| Function | Description | Parameters |
|
|
64
|
+
|----------|-------------|------------|
|
|
65
|
+
| `AddTax` | Add tax to amount | `amount`, `rate` |
|
|
66
|
+
| `CAGR` | Compound annual growth rate | `startValue`, `endValue`, `years` |
|
|
67
|
+
| `MonthlyPayment` | Loan payment calculation | `principal`, `annualRate`, `months` |
|
|
68
|
+
| `FutureValue` | Future value of investment | `presentValue`, `rate`, `periods` |
|
|
69
|
+
| `PresentValue` | Present value calculation | `futureValue`, `rate`, `periods` |
|
|
70
|
+
| `SimpleInterest` | Simple interest amount | `principal`, `rate`, `time` |
|
|
71
|
+
| `CompoundInterest` | Compound interest amount | `principal`, `rate`, `periods` |
|
|
72
|
+
| `EffectiveRate` | Effective annual rate | `nominalRate`, `periodsPerYear` |
|
|
73
|
+
|
|
74
|
+
### Statistical Functions
|
|
75
|
+
|
|
76
|
+
| Function | Description | Parameters |
|
|
77
|
+
|----------|-------------|------------|
|
|
78
|
+
| `ZScore` | Calculate z-score | `value`, `mean`, `stdDev` |
|
|
79
|
+
| `Normalize` | Normalize to 0-1 range | `value`, `min`, `max` |
|
|
80
|
+
| `Clamp` | Constrain value to range | `value`, `min`, `max` |
|
|
81
|
+
| `RoundToNearest` | Round to nearest multiple | `value`, `multiple` |
|
|
82
|
+
| `MovingAverage` | Simple moving average | (requires table context) |
|
|
83
|
+
|
|
84
|
+
### Text Functions
|
|
85
|
+
|
|
86
|
+
| Function | Description | Parameters |
|
|
87
|
+
|----------|-------------|------------|
|
|
88
|
+
| `FormatName` | "Last, First" format | `firstName`, `lastName` |
|
|
89
|
+
| `GetInitials` | Extract initials | `fullName` |
|
|
90
|
+
| `SafeTrim` | Null-safe trim | `text` |
|
|
91
|
+
| `TruncateText` | Truncate with ellipsis | `text`, `maxLength` |
|
|
92
|
+
| `PadLeft` | Left-pad string | `text`, `length`, `padChar` |
|
|
93
|
+
| `PadRight` | Right-pad string | `text`, `length`, `padChar` |
|
|
94
|
+
|
|
95
|
+
### Date Functions
|
|
96
|
+
|
|
97
|
+
| Function | Description | Parameters |
|
|
98
|
+
|----------|-------------|------------|
|
|
99
|
+
| `CalculateAge` | Age in years | `birthDate` |
|
|
100
|
+
| `FiscalYear` | Fiscal year (July start) | `dateValue` |
|
|
101
|
+
| `FiscalQuarter` | Fiscal quarter | `dateValue` |
|
|
102
|
+
| `IsWeekend` | Check if weekend | `dateValue` |
|
|
103
|
+
| `IsLeapYear` | Check for leap year | `year` |
|
|
104
|
+
| `QuarterStart` | First day of quarter | `dateValue` |
|
|
105
|
+
| `QuarterEnd` | Last day of quarter | `dateValue` |
|
|
106
|
+
|
|
107
|
+
### Validation Functions
|
|
108
|
+
|
|
109
|
+
| Function | Description | Parameters |
|
|
110
|
+
|----------|-------------|------------|
|
|
111
|
+
| `IsValidEmail` | Basic email validation | `email` |
|
|
112
|
+
| `InRange` | Check if value in range | `value`, `min`, `max` |
|
|
113
|
+
| `NullSafeEquals` | Null-safe comparison | `val1`, `val2` |
|
|
114
|
+
| `Coalesce` | Return first non-blank | `value`, `defaultValue` |
|
|
115
|
+
| `SafeDivide` | Division with zero handling | `numerator`, `denominator` |
|
|
116
|
+
| `IsNumericString` | Check if string is numeric | `text` |
|
|
117
|
+
|
|
118
|
+
### Formatting Functions
|
|
119
|
+
|
|
120
|
+
| Function | Description | Parameters |
|
|
121
|
+
|----------|-------------|------------|
|
|
122
|
+
| `FormatCurrency` | Format as currency | `value`, `decimals` |
|
|
123
|
+
| `FormatPercent` | Format as percentage | `value`, `decimals` |
|
|
124
|
+
| `FormatThousands` | Format with K/M/B suffix | `value` |
|
|
125
|
+
| `FormatDelta` | Format with +/- sign | `value` |
|
|
126
|
+
| `ConditionalFormat` | Value-based formatting | `value`, `thresholds` |
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Files
|
|
131
|
+
|
|
132
|
+
| File | Description |
|
|
133
|
+
|------|-------------|
|
|
134
|
+
| `README.md` | This documentation |
|
|
135
|
+
| `functions.dax` | Complete function library with examples |
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Usage Examples
|
|
140
|
+
|
|
141
|
+
### Financial Analysis
|
|
142
|
+
|
|
143
|
+
```dax
|
|
144
|
+
DEFINE
|
|
145
|
+
FUNCTION CAGR = (startValue : NUMERIC, endValue : NUMERIC, years : NUMERIC) =>
|
|
146
|
+
IF(startValue > 0 && years > 0,
|
|
147
|
+
POWER(endValue / startValue, 1 / years) - 1,
|
|
148
|
+
BLANK()
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
EVALUATE
|
|
152
|
+
SUMMARIZE(
|
|
153
|
+
Sales,
|
|
154
|
+
[Year],
|
|
155
|
+
"Revenue", SUM(Sales[Amount]),
|
|
156
|
+
"Growth Rate", CAGR(
|
|
157
|
+
CALCULATE(SUM(Sales[Amount]), PREVIOUSYEAR('Date'[Date])),
|
|
158
|
+
SUM(Sales[Amount]),
|
|
159
|
+
1
|
|
160
|
+
)
|
|
161
|
+
)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Data Validation
|
|
165
|
+
|
|
166
|
+
```dax
|
|
167
|
+
DEFINE
|
|
168
|
+
FUNCTION IsValidEmail = (email : STRING) =>
|
|
169
|
+
VAR _HasAt = FIND("@", email, 1, 0) > 0
|
|
170
|
+
VAR _HasDot = FIND(".", email, FIND("@", email, 1, 0) + 1, 0) > 0
|
|
171
|
+
VAR _NoSpaces = FIND(" ", email, 1, 0) = 0
|
|
172
|
+
RETURN _HasAt && _HasDot && _NoSpaces && LEN(email) >= 5
|
|
173
|
+
|
|
174
|
+
EVALUATE
|
|
175
|
+
FILTER(
|
|
176
|
+
Customers,
|
|
177
|
+
NOT IsValidEmail([Email])
|
|
178
|
+
)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Reporting
|
|
182
|
+
|
|
183
|
+
```dax
|
|
184
|
+
DEFINE
|
|
185
|
+
FUNCTION FormatThousands = (value : NUMERIC) =>
|
|
186
|
+
SWITCH(
|
|
187
|
+
TRUE(),
|
|
188
|
+
ABS(value) >= 1000000000, FORMAT(value / 1000000000, "#,##0.0") & "B",
|
|
189
|
+
ABS(value) >= 1000000, FORMAT(value / 1000000, "#,##0.0") & "M",
|
|
190
|
+
ABS(value) >= 1000, FORMAT(value / 1000, "#,##0.0") & "K",
|
|
191
|
+
FORMAT(value, "#,##0")
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
EVALUATE
|
|
195
|
+
ADDCOLUMNS(
|
|
196
|
+
SUMMARIZE(Sales, [Region]),
|
|
197
|
+
"Revenue Display", FormatThousands(SUM(Sales[Amount]))
|
|
198
|
+
)
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Best Practices
|
|
204
|
+
|
|
205
|
+
1. **Copy only what you need** - Don't include unused functions
|
|
206
|
+
2. **Document modifications** - Add comments when customizing
|
|
207
|
+
3. **Test thoroughly** - UDFs are in preview, validate results
|
|
208
|
+
4. **Consider performance** - Complex functions may impact query time
|
|
209
|
+
5. **Use specific types** - Avoid AnyVal when a specific type works
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Contributing
|
|
214
|
+
|
|
215
|
+
To add functions to this library:
|
|
216
|
+
1. Follow the naming conventions (PascalCase)
|
|
217
|
+
2. Include documentation comments (///)
|
|
218
|
+
3. Add to the appropriate category
|
|
219
|
+
4. Include example usage
|
|
220
|
+
5. Test with edge cases (nulls, zeros, negatives)
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## References
|
|
225
|
+
|
|
226
|
+
- [Microsoft Learn: DAX User Defined Functions](https://learn.microsoft.com/en-us/dax/dax-queries#user-defined-functions)
|
|
227
|
+
- [SQLBI: DAX UDFs](https://www.sqlbi.com/articles/user-defined-functions-in-dax/)
|
|
228
|
+
- [BI Agent Superpowers DAX Snippets](../../snippets/dax/user-defined-functions.md)
|