@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.
- package/README.md +12 -1
- package/dist/browser.d.ts +7 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +5 -0
- package/dist/browser.js.map +1 -1
- package/dist/calc/errors.d.ts +1 -1
- package/dist/calc/errors.d.ts.map +1 -1
- package/dist/calc/errors.js.map +1 -1
- package/dist/calc/prng.d.ts.map +1 -1
- package/dist/calc/prng.js +6 -14
- package/dist/calc/prng.js.map +1 -1
- package/dist/calculation-context.d.ts +6 -0
- package/dist/calculation-context.d.ts.map +1 -0
- package/dist/calculation-context.js +52 -0
- package/dist/calculation-context.js.map +1 -0
- package/dist/cli.js +96 -3
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/lease-up-cash-flows.d.ts +10 -0
- package/dist/lease-up-cash-flows.d.ts.map +1 -0
- package/dist/lease-up-cash-flows.js +143 -0
- package/dist/lease-up-cash-flows.js.map +1 -0
- package/dist/lease-up-structure.d.ts +3 -0
- package/dist/lease-up-structure.d.ts.map +1 -0
- package/dist/lease-up-structure.js +76 -0
- package/dist/lease-up-structure.js.map +1 -0
- package/dist/packs/excel-emit.d.ts +3 -0
- package/dist/packs/excel-emit.d.ts.map +1 -1
- package/dist/packs/excel-emit.js +32 -3
- package/dist/packs/excel-emit.js.map +1 -1
- package/dist/period-path.d.ts +3 -0
- package/dist/period-path.d.ts.map +1 -1
- package/dist/period-path.js +31 -1
- package/dist/period-path.js.map +1 -1
- package/dist/property-cash-flows.d.ts +13 -0
- package/dist/property-cash-flows.d.ts.map +1 -0
- package/dist/property-cash-flows.js +288 -0
- package/dist/property-cash-flows.js.map +1 -0
- package/dist/protocol.d.ts +143 -2
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +1 -1
- package/dist/protocol.js.map +1 -1
- package/dist/refinement.d.ts +5 -1
- package/dist/refinement.d.ts.map +1 -1
- package/dist/refinement.js +97 -27
- package/dist/refinement.js.map +1 -1
- package/dist/validator.d.ts.map +1 -1
- package/dist/validator.js +2 -60
- package/dist/validator.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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,
|
|
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"}
|
package/dist/packs/excel-emit.js
CHANGED
|
@@ -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
|
-
|
|
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":"AAAA,+BAA+B;AAC/B,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,+EAA+E;AAC/E,oCAAoC;AACpC,EAAE;AACF,2EAA2E;AAC3E,uEAAuE;AACvE,4EAA4E;AAC5E,+EAA+E;AAC/E,EAAE;AACF,4BAA4B;AAC5B,yEAAyE;AACzE,kEAAkE;AAClE,6DAA6D;AAC7D,uEAAuE;AACvE,uEAAuE;AACvE,EAAE;AACF,gCAAgC;AAChC,yEAAyE;AACzE,qCAAqC;AACrC,qDAAqD;AACrD,2EAA2E;AAC3E,wEAAwE;AACxE,kEAAkE;AAElE,OAAO,EAAE,eAAe,EAAa,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"excel-emit.js","sourceRoot":"","sources":["../../src/packs/excel-emit.ts"],"names":[],"mappings":"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"}
|
package/dist/period-path.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/period-path.js
CHANGED
|
@@ -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
|
package/dist/period-path.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"period-path.js","sourceRoot":"","sources":["../src/period-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
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"}
|