@ekwo-ai/xbrl-cbso 0.4.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 (56) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/LICENSE +21 -0
  3. package/README.md +202 -0
  4. package/dist/enterprise-number.d.ts +9 -0
  5. package/dist/enterprise-number.d.ts.map +1 -0
  6. package/dist/enterprise-number.js +18 -0
  7. package/dist/enterprise-number.js.map +1 -0
  8. package/dist/equations.d.ts +35 -0
  9. package/dist/equations.d.ts.map +1 -0
  10. package/dist/equations.js +77 -0
  11. package/dist/equations.js.map +1 -0
  12. package/dist/errors.d.ts +9 -0
  13. package/dist/errors.d.ts.map +1 -0
  14. package/dist/errors.js +12 -0
  15. package/dist/errors.js.map +1 -0
  16. package/dist/fact-keys.d.ts +68 -0
  17. package/dist/fact-keys.d.ts.map +1 -0
  18. package/dist/fact-keys.js +121 -0
  19. package/dist/fact-keys.js.map +1 -0
  20. package/dist/generator.d.ts +73 -0
  21. package/dist/generator.d.ts.map +1 -0
  22. package/dist/generator.js +394 -0
  23. package/dist/generator.js.map +1 -0
  24. package/dist/index.d.ts +11 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +8 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/pcmn/index.d.ts +68 -0
  29. package/dist/pcmn/index.d.ts.map +1 -0
  30. package/dist/pcmn/index.js +266 -0
  31. package/dist/pcmn/index.js.map +1 -0
  32. package/dist/rounding.d.ts +25 -0
  33. package/dist/rounding.d.ts.map +1 -0
  34. package/dist/rounding.js +35 -0
  35. package/dist/rounding.js.map +1 -0
  36. package/dist/taxonomy/cbso-26-m01-f.d.ts +17 -0
  37. package/dist/taxonomy/cbso-26-m01-f.d.ts.map +1 -0
  38. package/dist/taxonomy/cbso-26-m01-f.js +433 -0
  39. package/dist/taxonomy/cbso-26-m01-f.js.map +1 -0
  40. package/dist/taxonomy/identification.d.ts +13 -0
  41. package/dist/taxonomy/identification.d.ts.map +1 -0
  42. package/dist/taxonomy/identification.js +16 -0
  43. package/dist/taxonomy/identification.js.map +1 -0
  44. package/dist/taxonomy/index.d.ts +27 -0
  45. package/dist/taxonomy/index.d.ts.map +1 -0
  46. package/dist/taxonomy/index.js +83 -0
  47. package/dist/taxonomy/index.js.map +1 -0
  48. package/dist/types.d.ts +149 -0
  49. package/dist/types.d.ts.map +1 -0
  50. package/dist/types.js +2 -0
  51. package/dist/types.js.map +1 -0
  52. package/dist/validate.d.ts +4 -0
  53. package/dist/validate.d.ts.map +1 -0
  54. package/dist/validate.js +84 -0
  55. package/dist/validate.js.map +1 -0
  56. package/package.json +65 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { CbsoInput } from './types.js';
2
+ /** Throws a {@link CbsoInputError} describing the first problem found. */
3
+ export declare function validateInput(input: CbsoInput): void;
4
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,YAAY,CAAC;AA8B3D,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAwDpD"}
@@ -0,0 +1,84 @@
1
+ import { CbsoInputError } from './errors.js';
2
+ import { isValidEnterpriseNumber } from './enterprise-number.js';
3
+ const ISO_DATE = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/;
4
+ function requireText(value, path) {
5
+ if (typeof value !== 'string' || value.trim() === '') {
6
+ throw new CbsoInputError('must be a non-empty string', path);
7
+ }
8
+ }
9
+ function requireDate(value, path) {
10
+ if (typeof value !== 'string' || !ISO_DATE.test(value)) {
11
+ throw new CbsoInputError('must be an ISO date (YYYY-MM-DD)', path);
12
+ }
13
+ }
14
+ function validateAddress(address, path) {
15
+ requireText(address.street, `${path}.street`);
16
+ requireText(address.number, `${path}.number`);
17
+ requireText(address.postalCode, `${path}.postalCode`);
18
+ requireText(address.city, `${path}.city`);
19
+ const country = (address.country ?? 'BE').toUpperCase();
20
+ if (!/^[A-Z]{2}$/.test(country)) {
21
+ throw new CbsoInputError('must be an ISO 3166-1 alpha-2 code', `${path}.country`);
22
+ }
23
+ if (country === 'BE' && !/^\d{4}$/.test(address.postalCode.trim())) {
24
+ throw new CbsoInputError('a Belgian postal code has four digits', `${path}.postalCode`);
25
+ }
26
+ }
27
+ /** Throws a {@link CbsoInputError} describing the first problem found. */
28
+ export function validateInput(input) {
29
+ requireText(input.entityNumber, 'entityNumber');
30
+ if (!isValidEnterpriseNumber(input.entityNumber)) {
31
+ throw new CbsoInputError('invalid Belgian enterprise number (check digits)', 'entityNumber');
32
+ }
33
+ requireText(input.denomination, 'denomination');
34
+ requireText(input.legalForm, 'legalForm');
35
+ requireText(input.court, 'court');
36
+ validateAddress(input.address, 'address');
37
+ for (const key of [
38
+ 'periodStart',
39
+ 'periodEnd',
40
+ 'prevPeriodStart',
41
+ 'prevPeriodEnd',
42
+ 'gaDate',
43
+ 'deedDate',
44
+ ]) {
45
+ requireDate(input[key], key);
46
+ }
47
+ if (input.periodStart >= input.periodEnd) {
48
+ throw new CbsoInputError('must be before periodEnd', 'periodStart');
49
+ }
50
+ if (input.prevPeriodEnd >= input.periodStart) {
51
+ throw new CbsoInputError('must be before periodStart', 'prevPeriodEnd');
52
+ }
53
+ for (const [code, v] of Object.entries(input.values ?? {})) {
54
+ for (const col of ['n', 'p']) {
55
+ const x = v?.[col];
56
+ if (x != null && !Number.isFinite(x)) {
57
+ throw new CbsoInputError('must be a finite number or null', `values.${code}.${col}`);
58
+ }
59
+ }
60
+ }
61
+ (input.administrators ?? []).forEach((admin, i) => {
62
+ const path = `administrators[${i}]`;
63
+ if (admin.kind === 'person') {
64
+ requireText(admin.lastName, `${path}.lastName`);
65
+ requireText(admin.firstName, `${path}.firstName`);
66
+ }
67
+ else if (admin.kind === 'company') {
68
+ requireText(admin.name, `${path}.name`);
69
+ if (admin.representative) {
70
+ requireText(admin.representative.lastName, `${path}.representative.lastName`);
71
+ requireText(admin.representative.firstName, `${path}.representative.firstName`);
72
+ }
73
+ const country = (admin.country ?? 'BE').toUpperCase();
74
+ if (country === 'BE' && admin.enterpriseNumber && !isValidEnterpriseNumber(admin.enterpriseNumber)) {
75
+ throw new CbsoInputError('invalid Belgian enterprise number (check digits)', `${path}.enterpriseNumber`);
76
+ }
77
+ }
78
+ else {
79
+ throw new CbsoInputError('kind must be "person" or "company"', `${path}.kind`);
80
+ }
81
+ validateAddress(admin, path);
82
+ });
83
+ }
84
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@ekwo-ai/xbrl-cbso",
3
+ "version": "0.4.0",
4
+ "description": "Generate XBRL annual accounts for the National Bank of Belgium (CBSO taxonomy, abridged model) — pure TypeScript, zero dependencies.",
5
+ "keywords": [
6
+ "xbrl",
7
+ "cbso",
8
+ "nbb",
9
+ "bnb",
10
+ "belgium",
11
+ "annual-accounts",
12
+ "jaarrekening",
13
+ "comptes-annuels",
14
+ "accounting",
15
+ "pcmn"
16
+ ],
17
+ "license": "MIT",
18
+ "author": "Ekwo AI",
19
+ "homepage": "https://github.com/Ekwo-ai/ekwo-os/tree/main/packages/formats/xbrl-cbso#readme",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/Ekwo-ai/ekwo-os.git",
23
+ "directory": "packages/formats/xbrl-cbso"
24
+ },
25
+ "bugs": {
26
+ "url": "https://github.com/Ekwo-ai/ekwo-os/issues"
27
+ },
28
+ "type": "module",
29
+ "sideEffects": false,
30
+ "engines": {
31
+ "node": ">=18"
32
+ },
33
+ "files": [
34
+ "dist",
35
+ "README.md",
36
+ "LICENSE",
37
+ "CHANGELOG.md"
38
+ ],
39
+ "main": "./dist/index.js",
40
+ "types": "./dist/index.d.ts",
41
+ "exports": {
42
+ ".": {
43
+ "types": "./dist/index.d.ts",
44
+ "import": "./dist/index.js"
45
+ },
46
+ "./pcmn": {
47
+ "types": "./dist/pcmn/index.d.ts",
48
+ "import": "./dist/pcmn/index.js"
49
+ }
50
+ },
51
+ "scripts": {
52
+ "build": "tsc -p tsconfig.build.json",
53
+ "typecheck": "tsc -p tsconfig.json --noEmit",
54
+ "test": "vitest run",
55
+ "test:watch": "vitest",
56
+ "example": "tsx examples/basic.ts",
57
+ "prepublishOnly": "npm run typecheck && npm test && npm run build"
58
+ },
59
+ "devDependencies": {
60
+ "@types/node": "^24.0.0",
61
+ "tsx": "^4.20.0",
62
+ "typescript": "^5.9.0",
63
+ "vitest": "^3.2.0"
64
+ }
65
+ }