@uwmd/core 2.7.0 → 2.9.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.
Files changed (55) hide show
  1. package/README.md +12 -1
  2. package/dist/browser.d.ts +7 -0
  3. package/dist/browser.d.ts.map +1 -1
  4. package/dist/browser.js +5 -0
  5. package/dist/browser.js.map +1 -1
  6. package/dist/calc/errors.d.ts +1 -1
  7. package/dist/calc/errors.d.ts.map +1 -1
  8. package/dist/calc/errors.js.map +1 -1
  9. package/dist/calc/prng.d.ts.map +1 -1
  10. package/dist/calc/prng.js +6 -14
  11. package/dist/calc/prng.js.map +1 -1
  12. package/dist/calculation-context.d.ts +6 -0
  13. package/dist/calculation-context.d.ts.map +1 -0
  14. package/dist/calculation-context.js +52 -0
  15. package/dist/calculation-context.js.map +1 -0
  16. package/dist/cli.js +96 -3
  17. package/dist/cli.js.map +1 -1
  18. package/dist/index.d.ts +7 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +5 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/lease-up-cash-flows.d.ts +10 -0
  23. package/dist/lease-up-cash-flows.d.ts.map +1 -0
  24. package/dist/lease-up-cash-flows.js +143 -0
  25. package/dist/lease-up-cash-flows.js.map +1 -0
  26. package/dist/lease-up-structure.d.ts +3 -0
  27. package/dist/lease-up-structure.d.ts.map +1 -0
  28. package/dist/lease-up-structure.js +76 -0
  29. package/dist/lease-up-structure.js.map +1 -0
  30. package/dist/packs/excel-emit.d.ts +3 -0
  31. package/dist/packs/excel-emit.d.ts.map +1 -1
  32. package/dist/packs/excel-emit.js +32 -3
  33. package/dist/packs/excel-emit.js.map +1 -1
  34. package/dist/period-path.d.ts +3 -0
  35. package/dist/period-path.d.ts.map +1 -1
  36. package/dist/period-path.js +31 -1
  37. package/dist/period-path.js.map +1 -1
  38. package/dist/property-cash-flows.d.ts +13 -0
  39. package/dist/property-cash-flows.d.ts.map +1 -0
  40. package/dist/property-cash-flows.js +288 -0
  41. package/dist/property-cash-flows.js.map +1 -0
  42. package/dist/protocol.d.ts +143 -2
  43. package/dist/protocol.d.ts.map +1 -1
  44. package/dist/protocol.js +1 -1
  45. package/dist/protocol.js.map +1 -1
  46. package/dist/refinement.d.ts +5 -1
  47. package/dist/refinement.d.ts.map +1 -1
  48. package/dist/refinement.js +97 -27
  49. package/dist/refinement.js.map +1 -1
  50. package/dist/validator.d.ts.map +1 -1
  51. package/dist/validator.js +2 -60
  52. package/dist/validator.js.map +1 -1
  53. package/dist/version.d.ts +1 -1
  54. package/dist/version.js +1 -1
  55. package/package.json +2 -2
@@ -0,0 +1,143 @@
1
+ import { CalcError } from './calc/errors.js';
2
+ import { isDayCountConvention, parseISODate } from './calc/day-count.js';
3
+ import { periodSection, periodPayload } from './period-path.js';
4
+ import { checkLeaseUpContent } from './lease-up-structure.js';
5
+ import { verifyLeaseUpSchedule, leaseUpContext } from './lease-up.js';
6
+ import { toUWEnvelope, computeEnvelopeDigest } from './envelope.js';
7
+ export class LeaseUpCashFlowProjectionError extends CalcError {
8
+ proto;
9
+ constructor(message, pointer, evidence) {
10
+ super('CALC-LU-PROJECTION', message, pointer);
11
+ this.name = 'LeaseUpCashFlowProjectionError';
12
+ this.proto = {
13
+ category: 'calc',
14
+ code: 'CALC-LU-PROJECTION',
15
+ message,
16
+ pointer,
17
+ ...(evidence ? { evidence } : {}),
18
+ };
19
+ }
20
+ }
21
+ function refuse(message, pointer, evidence) {
22
+ throw new LeaseUpCashFlowProjectionError(message, pointer, evidence);
23
+ }
24
+ function record(value) {
25
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
26
+ }
27
+ function onlyKeys(value, keys) {
28
+ return Object.keys(value).every((key) => keys.includes(key));
29
+ }
30
+ /** Copies exact binary64 amounts; creates no edits or provenance. Rejects with typed evidence. */
31
+ export async function projectLeaseUpCashFlows(parsed, plan) {
32
+ if (!record(plan) || !onlyKeys(plan, ['source_variant', 'day_count', 'cash_dates'])) {
33
+ refuse('Expected a projection plan with source_variant, day_count and cash_dates only.', 'plan');
34
+ }
35
+ if (typeof plan.source_variant !== 'string' || plan.source_variant.length === 0) {
36
+ refuse('An exact source_variant is required.', 'plan.source_variant');
37
+ }
38
+ if (!isDayCountConvention(plan.day_count))
39
+ refuse('An explicit registered day_count is required.', 'plan.day_count');
40
+ if (!Array.isArray(plan.cash_dates) || plan.cash_dates.length === 0)
41
+ refuse('cash_dates must be a non-empty array.', 'plan.cash_dates');
42
+ const sourceVariant = plan.source_variant;
43
+ const dayCount = plan.day_count;
44
+ const source = `sections.lease_up_schedule[${JSON.stringify(sourceVariant)}]`;
45
+ let block;
46
+ try {
47
+ block = periodSection(parsed, 'lease_up_schedule', {
48
+ sectionVariants: { lease_up_schedule: sourceVariant },
49
+ });
50
+ }
51
+ catch (error) {
52
+ if (error instanceof CalcError)
53
+ refuse('Cannot select the exact lease-up source variant.', source, {
54
+ selection: error.proto,
55
+ });
56
+ throw error;
57
+ }
58
+ if (!block)
59
+ refuse('The lease-up source section is missing.', source);
60
+ const payload = periodPayload(block);
61
+ if (!record(payload))
62
+ refuse('The selected lease-up payload must be an object.', source);
63
+ const issues = [];
64
+ checkLeaseUpContent(payload, sourceVariant, issues);
65
+ if (issues.length)
66
+ refuse('The selected lease-up schedule is structurally invalid.', source, {
67
+ structure: issues,
68
+ });
69
+ if (payload['model_type'] !== 'natural_turnover' &&
70
+ payload['model_type'] !== 'absorption_curve') {
71
+ refuse('The selected schedule requires a registered model_type.', `${source}.model_type`);
72
+ }
73
+ // Malformed summaries must not disappear behind the verifier's optional checks.
74
+ const summary = payload['stabilized_summary'];
75
+ if (summary !== undefined && summary !== null) {
76
+ if (!record(summary))
77
+ refuse('stabilized_summary must be an object or null.', `${source}.stabilized_summary`);
78
+ for (const key of ['occupied_sf', 'occupancy_rate', 'annualized_egi', 'annualized_noi']) {
79
+ const value = summary[key];
80
+ if (value !== undefined &&
81
+ value !== null &&
82
+ (typeof value !== 'number' || !Number.isFinite(value))) {
83
+ refuse('Stated summary values must be finite numbers or null.', `${source}.stabilized_summary.${key}`);
84
+ }
85
+ }
86
+ }
87
+ const schedule = payload;
88
+ for (const [i, row] of schedule.schedule.entries()) {
89
+ if (typeof row.net_cash_flow !== 'number' || !Number.isFinite(row.net_cash_flow)) {
90
+ refuse('Every source period must state a finite net_cash_flow; missing amounts are not zero.', `${source}.schedule[${i}].net_cash_flow`);
91
+ }
92
+ }
93
+ const verification = verifyLeaseUpSchedule(schedule, leaseUpContext(parsed));
94
+ if (verification.verdict !== 'verified') {
95
+ refuse(`The selected lease-up schedule is ${verification.verdict}.`, source, { verification });
96
+ }
97
+ const periods = new Set(schedule.schedule.map((row) => row.period));
98
+ const dates = new Map();
99
+ for (const [i, mapping] of plan.cash_dates.entries()) {
100
+ const pointer = `plan.cash_dates[${i}]`;
101
+ if (!record(mapping) ||
102
+ !onlyKeys(mapping, ['period', 'date']) ||
103
+ typeof mapping.period !== 'string') {
104
+ refuse('Each cash date requires exactly period and date.', pointer);
105
+ }
106
+ if (!periods.has(mapping.period))
107
+ refuse('Cash date maps an unknown source period.', `${pointer}.period`);
108
+ if (dates.has(mapping.period))
109
+ refuse('A source period may be mapped only once.', `${pointer}.period`);
110
+ if (typeof mapping.date !== 'string' || !parseISODate(mapping.date))
111
+ refuse('Cash date must be a real YYYY-MM-DD date.', `${pointer}.date`);
112
+ dates.set(mapping.period, { date: mapping.date, index: i });
113
+ }
114
+ let previous;
115
+ const bindings = schedule.schedule.map((row) => {
116
+ const mapping = dates.get(row.period);
117
+ if (!mapping)
118
+ refuse(`Missing cash date for source period ${row.period}.`, 'plan.cash_dates');
119
+ if (previous !== undefined && mapping.date < previous)
120
+ refuse('Cash dates must be non-decreasing in source period order.', `plan.cash_dates[${mapping.index}].date`);
121
+ previous = mapping.date;
122
+ return {
123
+ source_path: `lease_up_schedule.schedule@${row.period}.net_cash_flow`,
124
+ date: mapping.date,
125
+ amount: row.net_cash_flow,
126
+ };
127
+ });
128
+ const series = {
129
+ label: 'Lease-up receipts and TI/LC only',
130
+ day_count: dayCount,
131
+ series: bindings.map((binding) => ({
132
+ date: binding.date,
133
+ amount: binding.amount,
134
+ kind: 'other',
135
+ label: binding.source_path,
136
+ })),
137
+ };
138
+ // Canonicalization starts synchronously before the first await. The digest and
139
+ // copied bindings therefore describe the same input snapshot.
140
+ const source_envelope_digest = await computeEnvelopeDigest(toUWEnvelope(parsed));
141
+ return { source_envelope_digest, source_variant: sourceVariant, series, bindings };
142
+ }
143
+ //# sourceMappingURL=lease-up-cash-flows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lease-up-cash-flows.js","sourceRoot":"","sources":["../src/lease-up-cash-flows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ValidationMessage } from './types.js';
2
+ export declare function checkLeaseUpContent(content: Record<string, unknown>, variant: string, issues: ValidationMessage[]): void;
3
+ //# sourceMappingURL=lease-up-structure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lease-up-structure.d.ts","sourceRoot":"","sources":["../src/lease-up-structure.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,iBAAiB,EAAE,GAC1B,IAAI,CA8EN"}
@@ -0,0 +1,76 @@
1
+ import { leaseUpPeriodOrdinal } from './lease-up.js';
2
+ export function checkLeaseUpContent(content, variant, issues) {
3
+ const section = 'lease_up_schedule';
4
+ const label = variant === 'default' ? '' : ` (variant "${variant}")`;
5
+ const granRaw = content['period_granularity'];
6
+ const granularity = granRaw === 'monthly' || granRaw === 'quarterly' ? granRaw : 'quarterly';
7
+ if (granRaw !== 'monthly' && granRaw !== 'quarterly') {
8
+ issues.push({
9
+ code: 'LU-01',
10
+ severity: 'error',
11
+ section,
12
+ field: 'period_granularity',
13
+ message: `LU-01: period_granularity${label} must be "monthly" or "quarterly", not ${JSON.stringify(granRaw)}`,
14
+ });
15
+ }
16
+ const schedule = content['schedule'];
17
+ const rows = Array.isArray(schedule) ? schedule : [];
18
+ if (!Array.isArray(schedule) || rows.length === 0) {
19
+ issues.push({
20
+ code: 'LU-03',
21
+ severity: 'error',
22
+ section,
23
+ field: 'schedule',
24
+ message: `LU-03: schedule${label} must be a non-empty array of periods`,
25
+ });
26
+ return;
27
+ }
28
+ // LU-01 (grammar) / LU-02 (strictly increasing, gap-free). One diagnostic
29
+ // per defect: a row outside the grammar is not also reported as a gap.
30
+ let prev = null;
31
+ let grammarBroken = false;
32
+ for (let i = 0; i < rows.length; i++) {
33
+ const row = rows[i];
34
+ const period = row && typeof row === 'object' ? row['period'] : undefined;
35
+ const ordinal = typeof period === 'string' ? leaseUpPeriodOrdinal(period, granularity) : null;
36
+ if (ordinal === null) {
37
+ grammarBroken = true;
38
+ issues.push({
39
+ code: 'LU-01',
40
+ severity: 'error',
41
+ section,
42
+ field: `schedule[${i}].period`,
43
+ message: `LU-01: period ${JSON.stringify(period)}${label} is outside the ${granularity} grammar (${granularity === 'quarterly' ? 'YYYY-Qn' : 'YYYY-MM'})`,
44
+ });
45
+ prev = null;
46
+ continue;
47
+ }
48
+ if (prev !== null && ordinal !== prev + 1) {
49
+ issues.push({
50
+ code: 'LU-02',
51
+ severity: 'error',
52
+ section,
53
+ field: `schedule[${i}].period`,
54
+ message: `LU-02: periods${label} must be strictly increasing and gap-free; ${String(period)} does not immediately follow the prior period`,
55
+ });
56
+ }
57
+ prev = ordinal;
58
+ }
59
+ // LU-03 (second arm): a stabilization_target earlier than the first period.
60
+ const target = content['stabilization_target'];
61
+ if (!grammarBroken && typeof target === 'string') {
62
+ const first = rows[0]['period'];
63
+ const targetOrd = leaseUpPeriodOrdinal(target, granularity);
64
+ const firstOrd = typeof first === 'string' ? leaseUpPeriodOrdinal(first, granularity) : null;
65
+ if (targetOrd !== null && firstOrd !== null && targetOrd < firstOrd) {
66
+ issues.push({
67
+ code: 'LU-03',
68
+ severity: 'error',
69
+ section,
70
+ field: 'stabilization_target',
71
+ message: `LU-03: stabilization_target ${target}${label} is earlier than the first schedule period ${String(first)}`,
72
+ });
73
+ }
74
+ }
75
+ }
76
+ //# sourceMappingURL=lease-up-structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lease-up-structure.js","sourceRoot":"","sources":["../src/lease-up-structure.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAA2B,MAAM,eAAe,CAAC;AAE9E,MAAM,UAAU,mBAAmB,CACjC,OAAgC,EAChC,OAAe,EACf,MAA2B;IAE3B,MAAM,OAAO,GAAG,mBAAmB,CAAC;IACpC,MAAM,KAAK,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,OAAO,IAAI,CAAC;IACrE,MAAM,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC9C,MAAM,WAAW,GACf,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;IAC3E,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,OAAO;YACjB,OAAO;YACP,KAAK,EAAE,oBAAoB;YAC3B,OAAO,EAAE,4BAA4B,KAAK,0CAA0C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;SAC9G,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,OAAO;YACjB,OAAO;YACP,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,kBAAkB,KAAK,uCAAuC;SACxE,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,0EAA0E;IAC1E,uEAAuE;IACvE,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,MAAM,GACV,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAE,GAA+B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1F,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9F,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,aAAa,GAAG,IAAI,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,OAAO;gBACjB,OAAO;gBACP,KAAK,EAAE,YAAY,CAAC,UAAU;gBAC9B,OAAO,EAAE,iBAAiB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,KAAK,mBAAmB,WAAW,aAAa,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG;aAC1J,CAAC,CAAC;YACH,IAAI,GAAG,IAAI,CAAC;YACZ,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,OAAO;gBACjB,OAAO;gBACP,KAAK,EAAE,YAAY,CAAC,UAAU;gBAC9B,OAAO,EAAE,iBAAiB,KAAK,8CAA8C,MAAM,CAAC,MAAM,CAAC,+CAA+C;aAC3I,CAAC,CAAC;QACL,CAAC;QACD,IAAI,GAAG,OAAO,CAAC;IACjB,CAAC;IAED,4EAA4E;IAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC/C,IAAI,CAAC,aAAa,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACjD,MAAM,KAAK,GAAI,IAAI,CAAC,CAAC,CAA6B,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7F,IAAI,SAAS,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,SAAS,GAAG,QAAQ,EAAE,CAAC;YACpE,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,OAAO;gBACjB,OAAO;gBACP,KAAK,EAAE,sBAAsB;gBAC7B,OAAO,EAAE,+BAA+B,MAAM,GAAG,KAAK,8CAA8C,MAAM,CAAC,KAAK,CAAC,EAAE;aACpH,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,10 +1,13 @@
1
1
  import { type Expr } from '../calc/parser.js';
2
+ import type { PeriodExcelBinding } from '../protocol.js';
2
3
  export interface ExcelEmitOptions {
3
4
  /**
4
5
  * Map from calc-engine path (joined with dots, e.g. `noi_model.net_operating_income`)
5
6
  * to Excel named range (e.g. `noi`). Bare identifiers are looked up by name.
6
7
  */
7
8
  namedRanges: ReadonlyMap<string, string>;
9
+ /** RFC 0043: canonical selector paths mapped to trusted contextual workbook names. */
10
+ periodBindings?: ReadonlyMap<string, PeriodExcelBinding>;
8
11
  }
9
12
  export declare class ExcelEmitError extends Error {
10
13
  code: 'EXCEL-EMIT-PATH' | 'EXCEL-EMIT-FN' | 'EXCEL-EMIT-OP';
@@ -1 +1 @@
1
- {"version":3,"file":"excel-emit.d.ts","sourceRoot":"","sources":["../../src/packs/excel-emit.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAmB,KAAK,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAG/D,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,qBAAa,cAAe,SAAQ,KAAK;IAE9B,IAAI,EAAE,iBAAiB,GAAG,eAAe,GAAG,eAAe;gBAA3D,IAAI,EAAE,iBAAiB,GAAG,eAAe,GAAG,eAAe,EAClE,OAAO,EAAE,MAAM;CAKlB;AAuBD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,GAAG,MAAM,CA6EtE;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAEhF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3D,IAAI,EAAE,gBAAgB,GACrB,MAAM,CAGR"}
1
+ {"version":3,"file":"excel-emit.d.ts","sourceRoot":"","sources":["../../src/packs/excel-emit.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAwC,KAAK,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAIpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,sFAAsF;IACtF,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC1D;AAED,qBAAa,cAAe,SAAQ,KAAK;IAE9B,IAAI,EAAE,iBAAiB,GAAG,eAAe,GAAG,eAAe;gBAA3D,IAAI,EAAE,iBAAiB,GAAG,eAAe,GAAG,eAAe,EAClE,OAAO,EAAE,MAAM;CAKlB;AAuBD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAiGtE;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAEhF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3D,IAAI,EAAE,gBAAgB,GACrB,MAAM,CAGR"}
@@ -24,8 +24,10 @@
24
24
  // - Builtins map to their Excel equivalents (SUM, AVERAGE, MIN, MAX, IF,
25
25
  // ROUND, PMT, NPV, IRR). Functions without a clean Excel equivalent
26
26
  // (`coalesce`, `avg` with null handling) raise EXCEL-EMIT-FN.
27
- import { parseExpression } from '../calc/parser.js';
27
+ import { parseExpression, periodReferencePath } from '../calc/parser.js';
28
28
  import { resolveRoundTo } from '../calc/quantize.js';
29
+ import { periodReferenceContract } from '../period-path.js';
30
+ import { periodKeyIdentity } from '../periods.js';
29
31
  export class ExcelEmitError extends Error {
30
32
  code;
31
33
  constructor(code, message) {
@@ -84,8 +86,35 @@ export function emitFromAst(expr, opts) {
84
86
  }
85
87
  return mapped;
86
88
  }
87
- case 'period_path':
88
- throw new ExcelEmitError('EXCEL-EMIT-PATH', 'Period selectors require contextual workbook bindings and are not emitted.');
89
+ case 'period_path': {
90
+ let identity;
91
+ try {
92
+ identity = periodKeyIdentity(periodReferenceContract(expr).key);
93
+ }
94
+ catch {
95
+ throw new ExcelEmitError('EXCEL-EMIT-PATH', 'Invalid period selector or unregistered series.');
96
+ }
97
+ const binding = opts.periodBindings?.get(periodReferencePath(expr));
98
+ if (!binding)
99
+ throw new ExcelEmitError('EXCEL-EMIT-PATH', 'Period selectors require contextual workbook bindings.');
100
+ const name = (value) => {
101
+ if (typeof value !== 'string' || value.length > 255 || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(value)
102
+ || /^[A-Za-z]{1,3}[1-9][0-9]*$/.test(value) || /^[Rr][1-9][0-9]*[Cc][1-9][0-9]*$/.test(value) || /^[RrCc]$/.test(value)) {
103
+ throw new ExcelEmitError('EXCEL-EMIT-PATH', 'A period binding must use explicit workbook names, not addresses or formulas.');
104
+ }
105
+ return value;
106
+ };
107
+ const numeric = (ref) => `IF(ISBLANK(${ref}),NA(),IF(ISNUMBER(${ref}),${ref},VALUE("Non-numeric period value")))`;
108
+ if (binding.kind === 'override')
109
+ return numeric(name(binding.value_range));
110
+ if (binding.kind !== 'series')
111
+ throw new ExcelEmitError('EXCEL-EMIT-PATH', 'Unknown period binding kind.');
112
+ const keys = name(binding.keys_range);
113
+ const values = name(binding.values_range);
114
+ const valid = name(binding.valid_range);
115
+ const key = `"${identity}"`;
116
+ return `IF(${valid}<>1,VALUE("Invalid period identities"),IF(COUNTIF(${keys},${key})=0,NA(),${numeric(`INDEX(${values},MATCH(${key},${keys},0))`)}))`;
117
+ }
89
118
  case 'unary': {
90
119
  const inner = emitFromAst(expr.operand, opts);
91
120
  if (expr.op === '-')
@@ -1 +1 @@
1
- {"version":3,"file":"excel-emit.js","sourceRoot":"","sources":["../../src/packs/excel-emit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"excel-emit.js","sourceRoot":"","sources":["../../src/packs/excel-emit.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { PeriodColumnSnapshot } from './protocol.js';
1
2
  import type { ParsedUWFile, UWBlock } from './types.js';
2
3
  import { type Expr } from './calc/parser.js';
3
4
  export interface PeriodResolutionOptions {
@@ -17,4 +18,6 @@ export declare function resolvePeriodReference(parsed: ParsedUWFile, expr: Extra
17
18
  }>, options?: PeriodResolutionOptions): unknown;
18
19
  /** Resolve one contextual reference; does not reserve @ in generic object paths. */
19
20
  export declare function resolvePeriodPath(parsed: ParsedUWFile, path: string, options?: PeriodResolutionOptions): unknown;
21
+ /** Project a complete selected series for contextual workbook binding (RFC 0043). */
22
+ export declare function resolvePeriodColumn(parsed: ParsedUWFile, reference: string, options?: PeriodResolutionOptions): PeriodColumnSnapshot;
20
23
  //# sourceMappingURL=period-path.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"period-path.d.ts","sourceRoot":"","sources":["../src/period-path.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,EAAmB,KAAK,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAI9D,MAAM,WAAW,uBAAuB;IACtC,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,GAAG,IAAI,CAe1H;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAErD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;;;;EAQnF;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAgBzJ;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAIpH"}
1
+ {"version":3,"file":"period-path.d.ts","sourceRoot":"","sources":["../src/period-path.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,EAAwC,KAAK,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAInF,MAAM,WAAW,uBAAuB;IACtC,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,GAAG,IAAI,CAe1H;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAErD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;;;;EAQnF;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAgBzJ;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAIpH;AAGD,qFAAqF;AACrF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,oBAAoB,CAsBxI"}
@@ -1,7 +1,7 @@
1
1
  import { getPathSegment, isBlockedSegment } from './parser.js';
2
2
  import { PERIOD_SERIES } from './protocol.js';
3
3
  import { hasBlockRole, isBlockRole, resolveRoleBlock } from './block-roles.js';
4
- import { parseExpression } from './calc/parser.js';
4
+ import { parseExpression, periodReferencePath } from './calc/parser.js';
5
5
  import { CalcError } from './calc/errors.js';
6
6
  import { parsePeriodSelector, periodKeyIdentity, periodKindMatches, scanPeriodSeries } from './periods.js';
7
7
  export function periodSection(parsed, section, options = {}) {
@@ -67,4 +67,34 @@ export function resolvePeriodPath(parsed, path, options = {}) {
67
67
  throw new CalcError('CALC-PERIOD-001', 'Expected one period reference, not an expression.');
68
68
  return resolvePeriodReference(parsed, expr, options);
69
69
  }
70
+ /** Project a complete selected series for contextual workbook binding (RFC 0043). */
71
+ export function resolvePeriodColumn(parsed, reference, options = {}) {
72
+ const expr = parseExpression(reference);
73
+ if (expr.kind !== 'period_path')
74
+ throw new CalcError('CALC-PERIOD-001', 'Expected a period reference.');
75
+ const { entry, key, path } = periodReferenceContract(expr);
76
+ const result = { reference: periodReferencePath(expr), series_path: path,
77
+ variant: null, selector_identity: periodKeyIdentity(key), rows: [] };
78
+ const block = periodSection(parsed, expr.head, options);
79
+ if (!block)
80
+ return result;
81
+ result.variant = block.annotation.variant ?? null;
82
+ const payload = periodPayload(block);
83
+ let series = payload;
84
+ for (const segment of expr.series)
85
+ series = getPathSegment(series, segment);
86
+ const scan = scanPeriodSeries(entry, series, payload);
87
+ if (scan.duplicates.length)
88
+ throw new CalcError('CALC-PERIOD-002', `Duplicate periods in ${path}: ${scan.duplicates.join(', ')}.`);
89
+ if (scan.invalid.length)
90
+ throw new CalcError('CALC-PERIOD-001', `Malformed periods in ${path}: ${scan.invalid.join(', ')}.`);
91
+ const blocked = [expr.head, ...expr.series, ...expr.segments].some(isBlockedSegment);
92
+ result.rows = [...scan.rows].map(([identity, row]) => {
93
+ let value = row.value;
94
+ for (const segment of expr.segments)
95
+ value = getPathSegment(value, segment);
96
+ return { identity, value: blocked ? null : value ?? null };
97
+ });
98
+ return result;
99
+ }
70
100
  //# sourceMappingURL=period-path.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"period-path.js","sourceRoot":"","sources":["../src/period-path.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"period-path.js","sourceRoot":"","sources":["../src/period-path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ParsedUWFile } from './types.js';
2
+ import type { PropertyCashFlowPlan, PropertyCashFlowAssembly, PropertyCashFlowAssemblyIssue } from './protocol.js';
3
+ import { CalcError } from './calc/errors.js';
4
+ type Reason = PropertyCashFlowAssemblyIssue['reason'];
5
+ type Evidence = PropertyCashFlowAssemblyIssue['evidence'];
6
+ export declare class PropertyCashFlowAssemblyError extends CalcError {
7
+ readonly proto: PropertyCashFlowAssemblyIssue;
8
+ constructor(reason: Reason, message: string, pointer: string, evidence?: Evidence);
9
+ }
10
+ /** Assemble a complete declared ledger. No monetary arithmetic or document writes. */
11
+ export declare function assemblePropertyCashFlows(parsed: ParsedUWFile, input: PropertyCashFlowPlan): Promise<PropertyCashFlowAssembly>;
12
+ export {};
13
+ //# sourceMappingURL=property-cash-flows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-cash-flows.d.ts","sourceRoot":"","sources":["../src/property-cash-flows.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EACV,oBAAoB,EAAE,wBAAwB,EAAE,6BAA6B,EAG9E,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAM7C,KAAK,MAAM,GAAG,6BAA6B,CAAC,QAAQ,CAAC,CAAC;AACtD,KAAK,QAAQ,GAAG,6BAA6B,CAAC,UAAU,CAAC,CAAC;AAO1D,qBAAa,6BAA8B,SAAQ,SAAS;IAC1D,SAAkB,KAAK,EAAE,6BAA6B,CAAC;gBAC3C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ;CAMlF;AAgID,sFAAsF;AACtF,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,oBAAoB,GAChD,OAAO,CAAC,wBAAwB,CAAC,CAmHnC"}