@mulmoclaude/accounting-plugin 0.3.0 → 0.3.1
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/dist/server/router.d.ts.map +1 -1
- package/dist/server/service.d.ts +2 -2
- package/dist/server/service.d.ts.map +1 -1
- package/dist/server.cjs +36 -26
- package/dist/server.cjs.map +1 -1
- package/dist/server.js +36 -26
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/server/router.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/server/router.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAyUpD;;;2BAG2B;AAC3B,wBAAgB,sBAAsB,IAAI,MAAM,CAsC/C"}
|
package/dist/server/service.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ export declare function createBook(input: {
|
|
|
15
15
|
name: string;
|
|
16
16
|
currency?: string;
|
|
17
17
|
country?: string;
|
|
18
|
-
fiscalYearEnd?:
|
|
18
|
+
fiscalYearEnd?: unknown;
|
|
19
19
|
}, workspaceRoot?: string): Promise<{
|
|
20
20
|
book: BookSummary;
|
|
21
21
|
}>;
|
|
@@ -23,7 +23,7 @@ export declare function updateBook(input: {
|
|
|
23
23
|
bookId: string;
|
|
24
24
|
name?: string;
|
|
25
25
|
country?: string;
|
|
26
|
-
fiscalYearEnd?:
|
|
26
|
+
fiscalYearEnd?: unknown;
|
|
27
27
|
}, workspaceRoot?: string): Promise<{
|
|
28
28
|
book: BookSummary;
|
|
29
29
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/server/service.ts"],"names":[],"mappings":"AAsCA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAKL,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAoB,eAAe,EAA2E,MAAM,oBAAoB,CAAC;AAehJ,OAAO,KAAK,EAAE,OAAO,EAAoB,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAElH,qBAAa,eAAgB,SAAQ,KAAK;IAE/B,MAAM,EAAE,MAAM;IAEd,OAAO,CAAC,EAAE,OAAO;gBAFjB,MAAM,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACR,OAAO,CAAC,EAAE,OAAO,YAAA;CAK3B;AAiED,wBAAsB,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC,CAGzF;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/server/service.ts"],"names":[],"mappings":"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"}
|
package/dist/server.cjs
CHANGED
|
@@ -1509,27 +1509,45 @@ function unsupportedCountryError(received) {
|
|
|
1509
1509
|
function unsupportedFiscalYearEndError(received) {
|
|
1510
1510
|
return new AccountingError(400, `unsupported fiscalYearEnd ${JSON.stringify(received)} — must be a closing-month number ${require_shared.FISCAL_YEAR_END_MONTHS.join(", ")} (1 = January … 12 = December)`);
|
|
1511
1511
|
}
|
|
1512
|
-
/**
|
|
1513
|
-
* (
|
|
1514
|
-
*
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
*
|
|
1522
|
-
*
|
|
1523
|
-
*
|
|
1512
|
+
/** Coerce + validate a free-form `fiscalYearEnd` from any ingress path
|
|
1513
|
+
* (REST body, MCP tool args, direct callers). The service is the
|
|
1514
|
+
* validation boundary, so this is deliberately tolerant of input SHAPE
|
|
1515
|
+
* but strict about the resulting value:
|
|
1516
|
+
* - absent / null / empty string → `undefined` (field omitted; the
|
|
1517
|
+
* caller decides default-vs-no-op);
|
|
1518
|
+
* - a number, or a numeric string ("8") from a hand-rolled client →
|
|
1519
|
+
* that month;
|
|
1520
|
+
* - a legacy calendar-quarter token ("Q1".."Q4") from a stale client
|
|
1521
|
+
* → its closing month (same Q1→3 mapping the read side applies);
|
|
1522
|
+
* - anything else non-empty (a typo, garbage, an out-of-range or
|
|
1523
|
+
* non-integer number) → 400, echoing the ORIGINAL value so the
|
|
1524
|
+
* bad payload can't be silently mistaken for the default. */
|
|
1525
|
+
function coerceFiscalYearEndInput(raw) {
|
|
1526
|
+
if (raw === void 0 || raw === null || raw === "") return void 0;
|
|
1527
|
+
let month = raw;
|
|
1528
|
+
if (typeof raw === "string") {
|
|
1529
|
+
const trimmed = raw.trim();
|
|
1530
|
+
if (trimmed === "") return void 0;
|
|
1531
|
+
if (/^Q[1-4]$/.test(trimmed)) return require_shared.resolveFiscalYearEnd(trimmed);
|
|
1532
|
+
month = /^-?\d+$/.test(trimmed) ? Number(trimmed) : NaN;
|
|
1533
|
+
}
|
|
1534
|
+
if (!require_shared.isFiscalYearEnd(month)) throw unsupportedFiscalYearEndError(raw);
|
|
1535
|
+
return month;
|
|
1536
|
+
}
|
|
1537
|
+
/** Boundary checks shared by updateBook (name / country only —
|
|
1538
|
+
* fiscalYearEnd is coerced + validated separately via
|
|
1539
|
+
* `coerceFiscalYearEndInput`). Throws on the first failure so the
|
|
1540
|
+
* surrounding function stays under the cognitive-complexity threshold;
|
|
1541
|
+
* each rule is also unit-testable independently via the service entry
|
|
1542
|
+
* point. */
|
|
1524
1543
|
function validateUpdateBookInput(input) {
|
|
1525
1544
|
if (input.name !== void 0 && (typeof input.name !== "string" || input.name.trim() === "")) throw new AccountingError(400, "name must be a non-empty string when supplied");
|
|
1526
1545
|
if (input.country !== void 0 && input.country !== "" && !require_shared.isSupportedCountryCode(input.country)) throw unsupportedCountryError(input.country);
|
|
1527
|
-
if (input.fiscalYearEnd !== void 0 && !require_shared.isFiscalYearEnd(input.fiscalYearEnd)) throw unsupportedFiscalYearEndError(input.fiscalYearEnd);
|
|
1528
1546
|
}
|
|
1529
1547
|
async function createBook(input, workspaceRoot) {
|
|
1530
1548
|
if (typeof input.name !== "string" || input.name.trim() === "") throw new AccountingError(400, "name is required");
|
|
1531
1549
|
if (input.country !== void 0 && !require_shared.isSupportedCountryCode(input.country)) throw unsupportedCountryError(input.country);
|
|
1532
|
-
const fiscalYearEnd =
|
|
1550
|
+
const fiscalYearEnd = coerceFiscalYearEndInput(input.fiscalYearEnd) ?? 12;
|
|
1533
1551
|
const config = await loadOrInitConfig(workspaceRoot);
|
|
1534
1552
|
const bookId = input.id ?? await generateBookId(config, workspaceRoot);
|
|
1535
1553
|
if (!isSafeBookId(bookId)) throw new AccountingError(400, `invalid book id ${JSON.stringify(bookId)} — allowed characters are A-Z a-z 0-9 _ - (1-64 chars; cannot start with _ or -)`);
|
|
@@ -1554,11 +1572,12 @@ async function updateBook(input, workspaceRoot) {
|
|
|
1554
1572
|
const target = findBook(config, input.bookId);
|
|
1555
1573
|
if (!target) throw new AccountingError(404, `book ${JSON.stringify(input.bookId)} not found`);
|
|
1556
1574
|
validateUpdateBookInput(input);
|
|
1575
|
+
const fiscalYearEnd = coerceFiscalYearEndInput(input.fiscalYearEnd);
|
|
1557
1576
|
const next = {
|
|
1558
1577
|
...target,
|
|
1559
1578
|
...input.name !== void 0 ? { name: input.name } : {},
|
|
1560
1579
|
...input.country !== void 0 && input.country !== "" ? { country: input.country } : {},
|
|
1561
|
-
...
|
|
1580
|
+
...fiscalYearEnd !== void 0 ? { fiscalYearEnd } : {}
|
|
1562
1581
|
};
|
|
1563
1582
|
if (input.country === "") delete next.country;
|
|
1564
1583
|
await writeConfig({ books: config.books.map((book) => book.id === input.bookId ? next : book) }, workspaceRoot);
|
|
@@ -1906,15 +1925,6 @@ function asyncHandler(namespace, fallbackMessage, handler) {
|
|
|
1906
1925
|
}
|
|
1907
1926
|
//#endregion
|
|
1908
1927
|
//#region src/server/router.ts
|
|
1909
|
-
/** Coerce an inbound `fiscalYearEnd` to a number. The UI select and
|
|
1910
|
-
* the LLM tool (JSON-schema `number` enum) both send a number, but a
|
|
1911
|
-
* numeric string ("8") from a hand-rolled client is accepted too so
|
|
1912
|
-
* it isn't silently dropped to `undefined` (→ the December default).
|
|
1913
|
-
* Range validation stays authoritative in the service layer. */
|
|
1914
|
-
function coerceFiscalYearEnd(raw) {
|
|
1915
|
-
if (typeof raw === "number") return raw;
|
|
1916
|
-
if (typeof raw === "string" && raw.trim() !== "" && Number.isInteger(Number(raw))) return Number(raw);
|
|
1917
|
-
}
|
|
1918
1928
|
async function handleOpenBook(rest) {
|
|
1919
1929
|
if (typeof rest.bookId !== "string" || rest.bookId === "") throw new AccountingError(400, "openBook: bookId is required. Call 'getBooks' to enumerate, or 'createBook' first on a fresh workspace.");
|
|
1920
1930
|
const list = await listBooks();
|
|
@@ -1963,7 +1973,7 @@ var ACTION_HANDLERS = {
|
|
|
1963
1973
|
name: String(rest.name ?? ""),
|
|
1964
1974
|
currency: typeof rest.currency === "string" ? rest.currency : void 0,
|
|
1965
1975
|
country: typeof rest.country === "string" ? rest.country : void 0,
|
|
1966
|
-
fiscalYearEnd:
|
|
1976
|
+
fiscalYearEnd: rest.fiscalYearEnd
|
|
1967
1977
|
});
|
|
1968
1978
|
return {
|
|
1969
1979
|
bookId: result.book.id,
|
|
@@ -1975,7 +1985,7 @@ var ACTION_HANDLERS = {
|
|
|
1975
1985
|
bookId: String(rest.bookId ?? ""),
|
|
1976
1986
|
name: typeof rest.name === "string" ? rest.name : void 0,
|
|
1977
1987
|
country: typeof rest.country === "string" ? rest.country : void 0,
|
|
1978
|
-
fiscalYearEnd:
|
|
1988
|
+
fiscalYearEnd: rest.fiscalYearEnd
|
|
1979
1989
|
});
|
|
1980
1990
|
return {
|
|
1981
1991
|
bookId: result.book.id,
|