@cieloazul310/jclub-financial-statistics 0.0.1-alpha.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/dist/dataset/2005-J1.json +728 -0
- package/dist/dataset/2005-J2.json +548 -0
- package/dist/dataset/2006-J1.json +780 -0
- package/dist/dataset/2006-J2.json +600 -0
- package/dist/dataset/2007-J1.json +780 -0
- package/dist/dataset/2007-J2.json +600 -0
- package/dist/dataset/2008-J1.json +780 -0
- package/dist/dataset/2008-J2.json +672 -0
- package/dist/dataset/2009-J1.json +780 -0
- package/dist/dataset/2009-J2.json +780 -0
- package/dist/dataset/2010-J1.json +780 -0
- package/dist/dataset/2010-J2.json +816 -0
- package/dist/dataset/2011-J1.json +780 -0
- package/dist/dataset/2011-J2.json +852 -0
- package/dist/dataset/2012-J1.json +780 -0
- package/dist/dataset/2012-J2.json +924 -0
- package/dist/dataset/2013-J1.json +780 -0
- package/dist/dataset/2013-J2.json +924 -0
- package/dist/dataset/2014-J1.json +780 -0
- package/dist/dataset/2014-J2.json +924 -0
- package/dist/dataset/2014-J3.json +528 -0
- package/dist/dataset/2015-J1.json +780 -0
- package/dist/dataset/2015-J2.json +924 -0
- package/dist/dataset/2015-J3.json +564 -0
- package/dist/dataset/2016-J1.json +780 -0
- package/dist/dataset/2016-J2.json +924 -0
- package/dist/dataset/2016-J3.json +600 -0
- package/dist/dataset/2017-J1.json +780 -0
- package/dist/dataset/2017-J2.json +924 -0
- package/dist/dataset/2017-J3.json +636 -0
- package/dist/dataset/2018-J1.json +780 -0
- package/dist/dataset/2018-J2.json +924 -0
- package/dist/dataset/2018-J3.json +636 -0
- package/dist/dataset/2019-J1.json +780 -0
- package/dist/dataset/2019-J2.json +924 -0
- package/dist/dataset/2019-J3.json +672 -0
- package/dist/dataset/2020-J1.json +780 -0
- package/dist/dataset/2020-J2.json +924 -0
- package/dist/dataset/2020-J3.json +708 -0
- package/dist/dataset/2021-J1.json +852 -0
- package/dist/dataset/2021-J2.json +924 -0
- package/dist/dataset/2021-J3.json +672 -0
- package/dist/dataset/2022-J1.json +780 -0
- package/dist/dataset/2022-J2.json +924 -0
- package/dist/dataset/2022-J3.json +780 -0
- package/dist/dataset/2023-J1.json +780 -0
- package/dist/dataset/2023-J2.json +924 -0
- package/dist/dataset/2023-J3.json +852 -0
- package/dist/dataset/2024-J1.json +852 -0
- package/dist/dataset/2024-J2.json +852 -0
- package/dist/dataset/2024-J3.json +852 -0
- package/dist/index.cjs +104 -0
- package/dist/index.d.cts +31 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +31 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +111 -0
- package/dist/index.mjs.map +1 -0
- package/dist/type.cjs +22 -0
- package/dist/type.d.cts +31 -0
- package/dist/type.d.cts.map +1 -0
- package/dist/type.d.mts +31 -0
- package/dist/type.d.mts.map +1 -0
- package/dist/type.mjs +21 -0
- package/dist/type.mjs.map +1 -0
- package/package.json +63 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
const require_type = require('./type.cjs');
|
|
2
|
+
let fs_promises = require("fs/promises");
|
|
3
|
+
let path = require("path");
|
|
4
|
+
|
|
5
|
+
//#region src/index.ts
|
|
6
|
+
async function findDatasetDir() {
|
|
7
|
+
const candidates = [
|
|
8
|
+
(0, path.resolve)(__dirname, "dataset"),
|
|
9
|
+
(0, path.resolve)(__dirname, "../dist/dataset"),
|
|
10
|
+
(0, path.resolve)(process.cwd(), "packages/statistics/dist/dataset"),
|
|
11
|
+
(0, path.resolve)(process.cwd(), "dist/dataset")
|
|
12
|
+
];
|
|
13
|
+
for (const c of candidates) try {
|
|
14
|
+
if ((await (0, fs_promises.stat)(c)).isDirectory()) return c;
|
|
15
|
+
} catch (err) {}
|
|
16
|
+
throw new Error("dataset directory not found (looked in candidates)");
|
|
17
|
+
}
|
|
18
|
+
async function loadStatsFile(year, category) {
|
|
19
|
+
const filename = (0, path.join)(await findDatasetDir(), `${year}-${category}.json`);
|
|
20
|
+
try {
|
|
21
|
+
const raw = await (0, fs_promises.readFile)(filename, "utf8");
|
|
22
|
+
return JSON.parse(raw);
|
|
23
|
+
} catch (err) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function getStatistics(year, category, key) {
|
|
28
|
+
const file = await loadStatsFile(year, category);
|
|
29
|
+
if (!file) return {
|
|
30
|
+
year,
|
|
31
|
+
category,
|
|
32
|
+
key,
|
|
33
|
+
totalCount: 0,
|
|
34
|
+
values: [],
|
|
35
|
+
sum: 0,
|
|
36
|
+
average: null,
|
|
37
|
+
min: null,
|
|
38
|
+
max: null,
|
|
39
|
+
variance: null,
|
|
40
|
+
stddev: null
|
|
41
|
+
};
|
|
42
|
+
const entry = file.stats?.[key];
|
|
43
|
+
if (!entry) return {
|
|
44
|
+
year,
|
|
45
|
+
category,
|
|
46
|
+
key,
|
|
47
|
+
totalCount: 0,
|
|
48
|
+
values: [],
|
|
49
|
+
sum: 0,
|
|
50
|
+
average: null,
|
|
51
|
+
min: null,
|
|
52
|
+
max: null,
|
|
53
|
+
variance: null,
|
|
54
|
+
stddev: null
|
|
55
|
+
};
|
|
56
|
+
const values = entry.values ?? [];
|
|
57
|
+
return {
|
|
58
|
+
year,
|
|
59
|
+
category,
|
|
60
|
+
key,
|
|
61
|
+
totalCount: entry.totalCount ?? values.length,
|
|
62
|
+
values,
|
|
63
|
+
sum: entry.stats?.sum ?? 0,
|
|
64
|
+
average: entry.stats?.average ?? null,
|
|
65
|
+
min: entry.stats?.min ?? null,
|
|
66
|
+
max: entry.stats?.max ?? null,
|
|
67
|
+
variance: entry.stats?.variance ?? null,
|
|
68
|
+
stddev: entry.stats?.deviation ?? null
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const DEFAULT_YEARS = Array.from({ length: 20 }, (_, i) => 2005 + i);
|
|
72
|
+
/**
|
|
73
|
+
* Returns an array of statistics for a single category across multiple years.
|
|
74
|
+
* Example: getCategoryYearSeries("J2", key) -> [Stats|null for 2005, 2006, ...]
|
|
75
|
+
*/
|
|
76
|
+
async function getCategoryYearSeries(category, key) {
|
|
77
|
+
const result = [];
|
|
78
|
+
for (const year of DEFAULT_YEARS) {
|
|
79
|
+
const stats = await getStatistics(year, category, key);
|
|
80
|
+
result.push(stats.totalCount === 0 ? null : stats);
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Returns statistics for a single year as an object keyed by category.
|
|
86
|
+
* If a category has no data, its value will be null.
|
|
87
|
+
*/
|
|
88
|
+
async function getStatsByYear(year, key) {
|
|
89
|
+
const out = {
|
|
90
|
+
J1: null,
|
|
91
|
+
J2: null,
|
|
92
|
+
J3: null
|
|
93
|
+
};
|
|
94
|
+
for (const cat of require_type.CATEGORIES) {
|
|
95
|
+
const stats = await getStatistics(year, cat, key);
|
|
96
|
+
out[cat] = stats.totalCount === 0 ? null : stats;
|
|
97
|
+
}
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
//#endregion
|
|
102
|
+
exports.getCategoryYearSeries = getCategoryYearSeries;
|
|
103
|
+
exports.getStatistics = getStatistics;
|
|
104
|
+
exports.getStatsByYear = getStatsByYear;
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Category, Fields, ValueItem } from "./type.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/index.d.ts
|
|
4
|
+
type StatsResult = {
|
|
5
|
+
year: number;
|
|
6
|
+
category: Category;
|
|
7
|
+
key: Fields;
|
|
8
|
+
totalCount: number;
|
|
9
|
+
values: ValueItem[];
|
|
10
|
+
sum: number;
|
|
11
|
+
average: number | null;
|
|
12
|
+
min: number | null;
|
|
13
|
+
max: number | null;
|
|
14
|
+
variance: number | null;
|
|
15
|
+
stddev: number | null;
|
|
16
|
+
};
|
|
17
|
+
declare function getStatistics(year: number, category: Category, key: Fields): Promise<StatsResult>;
|
|
18
|
+
type Year = number;
|
|
19
|
+
/**
|
|
20
|
+
* Returns an array of statistics for a single category across multiple years.
|
|
21
|
+
* Example: getCategoryYearSeries("J2", key) -> [Stats|null for 2005, 2006, ...]
|
|
22
|
+
*/
|
|
23
|
+
declare function getCategoryYearSeries(category: Category, key: Fields): Promise<(StatsResult | null)[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Returns statistics for a single year as an object keyed by category.
|
|
26
|
+
* If a category has no data, its value will be null.
|
|
27
|
+
*/
|
|
28
|
+
declare function getStatsByYear(year: Year, key: Fields): Promise<Record<Category, StatsResult | null>>;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { StatsResult, Year, getCategoryYearSeries, getStatistics, getStatsByYear };
|
|
31
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";;;KAIY,WAAA;;EAAA,QAAA,EAEA,QAFW;EAEX,GAAA,EACL,MADK;EACL,UAAA,EAAA,MAAA;EAEG,MAAA,EAAA,SAAA,EAAA;EAAS,GAAA,EAAA,MAAA;EAsCG,OAAA,EAAA,MAAA,GAAa,IAAA;EAEvB,GAAA,EAAA,MAAA,GAAA,IAAA;EACL,GAAA,EAAA,MAAA,GAAA,IAAA;EACI,QAAA,EAAA,MAAA,GAAA,IAAA;EAAR,MAAA,EAAA,MAAA,GAAA,IAAA;CAAO;AA2DE,iBA/DU,aAAA,CA+DN,IAAA,EAAA,MAAA,EAAA,QAAA,EA7DJ,QA6DI,EAAA,GAAA,EA5DT,MA4DS,CAAA,EA3Db,OA2Da,CA3DL,WA2DK,CAAA;AAQM,KARV,IAAA,GAQU,MAAA;;;;;AAGZ,iBAHY,qBAAA,CAGZ,QAAA,EAFE,QAEF,EAAA,GAAA,EADH,MACG,CAAA,EAAP,OAAO,CAAA,CAAE,WAAF,GAAA,IAAA,CAAA,EAAA,CAAA;AAaV;;;;AAG4B,iBAHN,cAAA,CAGM,IAAA,EAFpB,IAEoB,EAAA,GAAA,EADrB,MACqB,CAAA,EAAzB,OAAyB,CAAjB,MAAiB,CAAV,QAAU,EAAA,WAAA,GAAA,IAAA,CAAA,CAAA"}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Category, Fields, ValueItem } from "./type.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/index.d.ts
|
|
4
|
+
type StatsResult = {
|
|
5
|
+
year: number;
|
|
6
|
+
category: Category;
|
|
7
|
+
key: Fields;
|
|
8
|
+
totalCount: number;
|
|
9
|
+
values: ValueItem[];
|
|
10
|
+
sum: number;
|
|
11
|
+
average: number | null;
|
|
12
|
+
min: number | null;
|
|
13
|
+
max: number | null;
|
|
14
|
+
variance: number | null;
|
|
15
|
+
stddev: number | null;
|
|
16
|
+
};
|
|
17
|
+
declare function getStatistics(year: number, category: Category, key: Fields): Promise<StatsResult>;
|
|
18
|
+
type Year = number;
|
|
19
|
+
/**
|
|
20
|
+
* Returns an array of statistics for a single category across multiple years.
|
|
21
|
+
* Example: getCategoryYearSeries("J2", key) -> [Stats|null for 2005, 2006, ...]
|
|
22
|
+
*/
|
|
23
|
+
declare function getCategoryYearSeries(category: Category, key: Fields): Promise<(StatsResult | null)[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Returns statistics for a single year as an object keyed by category.
|
|
26
|
+
* If a category has no data, its value will be null.
|
|
27
|
+
*/
|
|
28
|
+
declare function getStatsByYear(year: Year, key: Fields): Promise<Record<Category, StatsResult | null>>;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { StatsResult, Year, getCategoryYearSeries, getStatistics, getStatsByYear };
|
|
31
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";;;KAIY,WAAA;;EAAA,QAAA,EAEA,QAFW;EAEX,GAAA,EACL,MADK;EACL,UAAA,EAAA,MAAA;EAEG,MAAA,EAAA,SAAA,EAAA;EAAS,GAAA,EAAA,MAAA;EAsCG,OAAA,EAAA,MAAA,GAAa,IAAA;EAEvB,GAAA,EAAA,MAAA,GAAA,IAAA;EACL,GAAA,EAAA,MAAA,GAAA,IAAA;EACI,QAAA,EAAA,MAAA,GAAA,IAAA;EAAR,MAAA,EAAA,MAAA,GAAA,IAAA;CAAO;AA2DE,iBA/DU,aAAA,CA+DN,IAAA,EAAA,MAAA,EAAA,QAAA,EA7DJ,QA6DI,EAAA,GAAA,EA5DT,MA4DS,CAAA,EA3Db,OA2Da,CA3DL,WA2DK,CAAA;AAQM,KARV,IAAA,GAQU,MAAA;;;;;AAGZ,iBAHY,qBAAA,CAGZ,QAAA,EAFE,QAEF,EAAA,GAAA,EADH,MACG,CAAA,EAAP,OAAO,CAAA,CAAE,WAAF,GAAA,IAAA,CAAA,EAAA,CAAA;AAaV;;;;AAG4B,iBAHN,cAAA,CAGM,IAAA,EAFpB,IAEoB,EAAA,GAAA,EADrB,MACqB,CAAA,EAAzB,OAAyB,CAAjB,MAAiB,CAAV,QAAU,EAAA,WAAA,GAAA,IAAA,CAAA,CAAA"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { CATEGORIES } from "./type.mjs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { readFile, stat } from "fs/promises";
|
|
5
|
+
import { join, resolve } from "path";
|
|
6
|
+
|
|
7
|
+
//#region ../../node_modules/tsdown/esm-shims.js
|
|
8
|
+
const getFilename = () => fileURLToPath(import.meta.url);
|
|
9
|
+
const getDirname = () => path.dirname(getFilename());
|
|
10
|
+
const __dirname = /* @__PURE__ */ getDirname();
|
|
11
|
+
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region src/index.ts
|
|
14
|
+
async function findDatasetDir() {
|
|
15
|
+
const candidates = [
|
|
16
|
+
resolve(__dirname, "dataset"),
|
|
17
|
+
resolve(__dirname, "../dist/dataset"),
|
|
18
|
+
resolve(process.cwd(), "packages/statistics/dist/dataset"),
|
|
19
|
+
resolve(process.cwd(), "dist/dataset")
|
|
20
|
+
];
|
|
21
|
+
for (const c of candidates) try {
|
|
22
|
+
if ((await stat(c)).isDirectory()) return c;
|
|
23
|
+
} catch (err) {}
|
|
24
|
+
throw new Error("dataset directory not found (looked in candidates)");
|
|
25
|
+
}
|
|
26
|
+
async function loadStatsFile(year, category) {
|
|
27
|
+
const filename = join(await findDatasetDir(), `${year}-${category}.json`);
|
|
28
|
+
try {
|
|
29
|
+
const raw = await readFile(filename, "utf8");
|
|
30
|
+
return JSON.parse(raw);
|
|
31
|
+
} catch (err) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function getStatistics(year, category, key) {
|
|
36
|
+
const file = await loadStatsFile(year, category);
|
|
37
|
+
if (!file) return {
|
|
38
|
+
year,
|
|
39
|
+
category,
|
|
40
|
+
key,
|
|
41
|
+
totalCount: 0,
|
|
42
|
+
values: [],
|
|
43
|
+
sum: 0,
|
|
44
|
+
average: null,
|
|
45
|
+
min: null,
|
|
46
|
+
max: null,
|
|
47
|
+
variance: null,
|
|
48
|
+
stddev: null
|
|
49
|
+
};
|
|
50
|
+
const entry = file.stats?.[key];
|
|
51
|
+
if (!entry) return {
|
|
52
|
+
year,
|
|
53
|
+
category,
|
|
54
|
+
key,
|
|
55
|
+
totalCount: 0,
|
|
56
|
+
values: [],
|
|
57
|
+
sum: 0,
|
|
58
|
+
average: null,
|
|
59
|
+
min: null,
|
|
60
|
+
max: null,
|
|
61
|
+
variance: null,
|
|
62
|
+
stddev: null
|
|
63
|
+
};
|
|
64
|
+
const values = entry.values ?? [];
|
|
65
|
+
return {
|
|
66
|
+
year,
|
|
67
|
+
category,
|
|
68
|
+
key,
|
|
69
|
+
totalCount: entry.totalCount ?? values.length,
|
|
70
|
+
values,
|
|
71
|
+
sum: entry.stats?.sum ?? 0,
|
|
72
|
+
average: entry.stats?.average ?? null,
|
|
73
|
+
min: entry.stats?.min ?? null,
|
|
74
|
+
max: entry.stats?.max ?? null,
|
|
75
|
+
variance: entry.stats?.variance ?? null,
|
|
76
|
+
stddev: entry.stats?.deviation ?? null
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const DEFAULT_YEARS = Array.from({ length: 20 }, (_, i) => 2005 + i);
|
|
80
|
+
/**
|
|
81
|
+
* Returns an array of statistics for a single category across multiple years.
|
|
82
|
+
* Example: getCategoryYearSeries("J2", key) -> [Stats|null for 2005, 2006, ...]
|
|
83
|
+
*/
|
|
84
|
+
async function getCategoryYearSeries(category, key) {
|
|
85
|
+
const result = [];
|
|
86
|
+
for (const year of DEFAULT_YEARS) {
|
|
87
|
+
const stats = await getStatistics(year, category, key);
|
|
88
|
+
result.push(stats.totalCount === 0 ? null : stats);
|
|
89
|
+
}
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Returns statistics for a single year as an object keyed by category.
|
|
94
|
+
* If a category has no data, its value will be null.
|
|
95
|
+
*/
|
|
96
|
+
async function getStatsByYear(year, key) {
|
|
97
|
+
const out = {
|
|
98
|
+
J1: null,
|
|
99
|
+
J2: null,
|
|
100
|
+
J3: null
|
|
101
|
+
};
|
|
102
|
+
for (const cat of CATEGORIES) {
|
|
103
|
+
const stats = await getStatistics(year, cat, key);
|
|
104
|
+
out[cat] = stats.totalCount === 0 ? null : stats;
|
|
105
|
+
}
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
//#endregion
|
|
110
|
+
export { getCategoryYearSeries, getStatistics, getStatsByYear };
|
|
111
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["values: ValueItem[]","DEFAULT_YEARS: Year[]","result: (StatsResult | null)[]","out: Record<Category, StatsResult | null>"],"sources":["../../../node_modules/tsdown/esm-shims.js","../src/index.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { stat, readFile } from \"fs/promises\";\nimport { resolve, join } from \"path\";\nimport { CATEGORIES, type Category, type Fields, type ValueItem } from \"./type\";\n\nexport type StatsResult = {\n year: number;\n category: Category;\n key: Fields;\n totalCount: number;\n values: ValueItem[];\n sum: number;\n average: number | null;\n min: number | null;\n max: number | null;\n variance: number | null;\n stddev: number | null;\n};\n\nasync function findDatasetDir(): Promise<string> {\n const candidates = [\n resolve(__dirname, \"dataset\"), // when running from dist\n resolve(__dirname, \"../dist/dataset\"), // when running from src\n resolve(process.cwd(), \"packages/statistics/dist/dataset\"),\n resolve(process.cwd(), \"dist/dataset\"),\n ];\n for (const c of candidates) {\n try {\n const s = await stat(c);\n if (s.isDirectory()) return c;\n } catch (err) {\n // ignore\n }\n }\n throw new Error(\"dataset directory not found (looked in candidates)\");\n}\n\nasync function loadStatsFile(year: number, category: string) {\n const dir = await findDatasetDir();\n const filename = join(dir, `${year}-${category}.json`);\n try {\n const raw = await readFile(filename, \"utf8\");\n return JSON.parse(raw) as any;\n } catch (err) {\n return null;\n }\n}\n\nexport async function getStatistics(\n year: number,\n category: Category,\n key: Fields,\n): Promise<StatsResult> {\n const file = await loadStatsFile(year, category);\n if (!file) {\n return {\n year,\n category,\n key,\n totalCount: 0,\n values: [],\n sum: 0,\n average: null,\n min: null,\n max: null,\n variance: null,\n stddev: null,\n };\n }\n\n const entry = file.stats?.[key as string];\n if (!entry) {\n return {\n year,\n category,\n key,\n totalCount: 0,\n values: [],\n sum: 0,\n average: null,\n min: null,\n max: null,\n variance: null,\n stddev: null,\n };\n }\n\n const values: ValueItem[] = entry.values ?? [];\n const totalCount: number = entry.totalCount ?? values.length;\n const sum: number = entry.stats?.sum ?? 0;\n const average: number | null = entry.stats?.average ?? null;\n const min: number | null = entry.stats?.min ?? null;\n const max: number | null = entry.stats?.max ?? null;\n const variance: number | null = entry.stats?.variance ?? null;\n const stddev: number | null = entry.stats?.deviation ?? null;\n\n return {\n year,\n category,\n key,\n totalCount,\n values,\n sum,\n average,\n min,\n max,\n variance,\n stddev,\n };\n}\n\nexport type Year = number;\n\nconst DEFAULT_YEARS: Year[] = Array.from({ length: 20 }, (_, i) => 2005 + i);\n\n/**\n * Returns an array of statistics for a single category across multiple years.\n * Example: getCategoryYearSeries(\"J2\", key) -> [Stats|null for 2005, 2006, ...]\n */\nexport async function getCategoryYearSeries(\n category: Category,\n key: Fields,\n): Promise<(StatsResult | null)[]> {\n const result: (StatsResult | null)[] = [];\n for (const year of DEFAULT_YEARS) {\n const stats = await getStatistics(year, category, key);\n result.push(stats.totalCount === 0 ? null : stats);\n }\n return result;\n}\n\n/**\n * Returns statistics for a single year as an object keyed by category.\n * If a category has no data, its value will be null.\n */\nexport async function getStatsByYear(\n year: Year,\n key: Fields,\n): Promise<Record<Category, StatsResult | null>> {\n const out: Record<Category, StatsResult | null> = {\n J1: null,\n J2: null,\n J3: null,\n } as any;\n for (const cat of CATEGORIES) {\n const stats = await getStatistics(year, cat as Category, key);\n out[cat] = stats.totalCount === 0 ? null : stats;\n }\n return out;\n}\n"],"x_google_ignoreList":[0],"mappings":";;;;;;;AAIA,MAAM,oBAAoB,cAAc,OAAO,KAAK,IAAI;AACxD,MAAM,mBAAmB,KAAK,QAAQ,aAAa,CAAC;AAEpD,MAAa,YAA4B,4BAAY;;;;ACWrD,eAAe,iBAAkC;CAC/C,MAAM,aAAa;EACjB,QAAQ,WAAW,UAAU;EAC7B,QAAQ,WAAW,kBAAkB;EACrC,QAAQ,QAAQ,KAAK,EAAE,mCAAmC;EAC1D,QAAQ,QAAQ,KAAK,EAAE,eAAe;EACvC;AACD,MAAK,MAAM,KAAK,WACd,KAAI;AAEF,OADU,MAAM,KAAK,EAAE,EACjB,aAAa,CAAE,QAAO;UACrB,KAAK;AAIhB,OAAM,IAAI,MAAM,qDAAqD;;AAGvE,eAAe,cAAc,MAAc,UAAkB;CAE3D,MAAM,WAAW,KADL,MAAM,gBAAgB,EACP,GAAG,KAAK,GAAG,SAAS,OAAO;AACtD,KAAI;EACF,MAAM,MAAM,MAAM,SAAS,UAAU,OAAO;AAC5C,SAAO,KAAK,MAAM,IAAI;UACf,KAAK;AACZ,SAAO;;;AAIX,eAAsB,cACpB,MACA,UACA,KACsB;CACtB,MAAM,OAAO,MAAM,cAAc,MAAM,SAAS;AAChD,KAAI,CAAC,KACH,QAAO;EACL;EACA;EACA;EACA,YAAY;EACZ,QAAQ,EAAE;EACV,KAAK;EACL,SAAS;EACT,KAAK;EACL,KAAK;EACL,UAAU;EACV,QAAQ;EACT;CAGH,MAAM,QAAQ,KAAK,QAAQ;AAC3B,KAAI,CAAC,MACH,QAAO;EACL;EACA;EACA;EACA,YAAY;EACZ,QAAQ,EAAE;EACV,KAAK;EACL,SAAS;EACT,KAAK;EACL,KAAK;EACL,UAAU;EACV,QAAQ;EACT;CAGH,MAAMA,SAAsB,MAAM,UAAU,EAAE;AAS9C,QAAO;EACL;EACA;EACA;EACA,YAZyB,MAAM,cAAc,OAAO;EAapD;EACA,KAbkB,MAAM,OAAO,OAAO;EActC,SAb6B,MAAM,OAAO,WAAW;EAcrD,KAbyB,MAAM,OAAO,OAAO;EAc7C,KAbyB,MAAM,OAAO,OAAO;EAc7C,UAb8B,MAAM,OAAO,YAAY;EAcvD,QAb4B,MAAM,OAAO,aAAa;EAcvD;;AAKH,MAAMC,gBAAwB,MAAM,KAAK,EAAE,QAAQ,IAAI,GAAG,GAAG,MAAM,OAAO,EAAE;;;;;AAM5E,eAAsB,sBACpB,UACA,KACiC;CACjC,MAAMC,SAAiC,EAAE;AACzC,MAAK,MAAM,QAAQ,eAAe;EAChC,MAAM,QAAQ,MAAM,cAAc,MAAM,UAAU,IAAI;AACtD,SAAO,KAAK,MAAM,eAAe,IAAI,OAAO,MAAM;;AAEpD,QAAO;;;;;;AAOT,eAAsB,eACpB,MACA,KAC+C;CAC/C,MAAMC,MAA4C;EAChD,IAAI;EACJ,IAAI;EACJ,IAAI;EACL;AACD,MAAK,MAAM,OAAO,YAAY;EAC5B,MAAM,QAAQ,MAAM,cAAc,MAAM,KAAiB,IAAI;AAC7D,MAAI,OAAO,MAAM,eAAe,IAAI,OAAO;;AAE7C,QAAO"}
|
package/dist/type.cjs
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/type.ts
|
|
3
|
+
const CATEGORIES = [
|
|
4
|
+
"J1",
|
|
5
|
+
"J2",
|
|
6
|
+
"J3"
|
|
7
|
+
];
|
|
8
|
+
const Fields = [
|
|
9
|
+
"revenue",
|
|
10
|
+
"expense",
|
|
11
|
+
"net_worth",
|
|
12
|
+
"sponsor",
|
|
13
|
+
"ticket",
|
|
14
|
+
"broadcast",
|
|
15
|
+
"salary",
|
|
16
|
+
"average_attd",
|
|
17
|
+
"unit_price"
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
//#endregion
|
|
21
|
+
exports.CATEGORIES = CATEGORIES;
|
|
22
|
+
exports.Fields = Fields;
|
package/dist/type.d.cts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//#region src/type.d.ts
|
|
2
|
+
declare const CATEGORIES: readonly ["J1", "J2", "J3"];
|
|
3
|
+
type Category = (typeof CATEGORIES)[number];
|
|
4
|
+
declare const Fields: readonly ["revenue", "expense", "net_worth", "sponsor", "ticket", "broadcast", "salary", "average_attd", "unit_price"];
|
|
5
|
+
type Fields = (typeof Fields)[number];
|
|
6
|
+
type ValueItem = {
|
|
7
|
+
name: string;
|
|
8
|
+
value: number;
|
|
9
|
+
};
|
|
10
|
+
type StatsSummary = {
|
|
11
|
+
sum: number;
|
|
12
|
+
average: number | null;
|
|
13
|
+
min: number | null;
|
|
14
|
+
max: number | null;
|
|
15
|
+
median?: number | null;
|
|
16
|
+
deviation?: number | null;
|
|
17
|
+
variance?: number | null;
|
|
18
|
+
};
|
|
19
|
+
type CreateStatsResult = {
|
|
20
|
+
values: ValueItem[];
|
|
21
|
+
totalCount: number;
|
|
22
|
+
stats: StatsSummary;
|
|
23
|
+
};
|
|
24
|
+
type DatasetFile = {
|
|
25
|
+
year: number;
|
|
26
|
+
category: Category;
|
|
27
|
+
stats: Record<string, CreateStatsResult>;
|
|
28
|
+
};
|
|
29
|
+
//#endregion
|
|
30
|
+
export { CATEGORIES, Category, CreateStatsResult, DatasetFile, Fields, StatsSummary, ValueItem };
|
|
31
|
+
//# sourceMappingURL=type.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.d.cts","names":[],"sources":["../src/type.ts"],"sourcesContent":[],"mappings":";cAAa;AAAA,KACD,QAAA,GADyC,CAAA,OACtB,UADsB,CAAA,CAAA,MAAA,CAAA;AACzC,cAEC,MAFkB,EAAA,SAAU,CAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,QAAA,EAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,YAAA,CAAA;AAE5B,KAWD,MAAA,GADF,CAAA,OACmB,MADnB,CAAA,CAAA,MAAA,CAAA;AACE,KAEA,SAAA,GAFiB;EAEjB,IAAA,EAAA,MAAS;EAET,KAAA,EAAA,MAAA;AAUZ,CAAA;AAMY,KAhBA,YAAA,GAgBW;EAEX,GAAA,EAAA,MAAA;EACY,OAAA,EAAA,MAAA,GAAA,IAAA;EAAf,GAAA,EAAA,MAAA,GAAA,IAAA;EAAM,GAAA,EAAA,MAAA,GAAA,IAAA;;;;;KATH,iBAAA;UACF;;SAED;;KAGG,WAAA;;YAEA;SACH,eAAe"}
|
package/dist/type.d.mts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//#region src/type.d.ts
|
|
2
|
+
declare const CATEGORIES: readonly ["J1", "J2", "J3"];
|
|
3
|
+
type Category = (typeof CATEGORIES)[number];
|
|
4
|
+
declare const Fields: readonly ["revenue", "expense", "net_worth", "sponsor", "ticket", "broadcast", "salary", "average_attd", "unit_price"];
|
|
5
|
+
type Fields = (typeof Fields)[number];
|
|
6
|
+
type ValueItem = {
|
|
7
|
+
name: string;
|
|
8
|
+
value: number;
|
|
9
|
+
};
|
|
10
|
+
type StatsSummary = {
|
|
11
|
+
sum: number;
|
|
12
|
+
average: number | null;
|
|
13
|
+
min: number | null;
|
|
14
|
+
max: number | null;
|
|
15
|
+
median?: number | null;
|
|
16
|
+
deviation?: number | null;
|
|
17
|
+
variance?: number | null;
|
|
18
|
+
};
|
|
19
|
+
type CreateStatsResult = {
|
|
20
|
+
values: ValueItem[];
|
|
21
|
+
totalCount: number;
|
|
22
|
+
stats: StatsSummary;
|
|
23
|
+
};
|
|
24
|
+
type DatasetFile = {
|
|
25
|
+
year: number;
|
|
26
|
+
category: Category;
|
|
27
|
+
stats: Record<string, CreateStatsResult>;
|
|
28
|
+
};
|
|
29
|
+
//#endregion
|
|
30
|
+
export { CATEGORIES, Category, CreateStatsResult, DatasetFile, Fields, StatsSummary, ValueItem };
|
|
31
|
+
//# sourceMappingURL=type.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.d.mts","names":[],"sources":["../src/type.ts"],"sourcesContent":[],"mappings":";cAAa;AAAA,KACD,QAAA,GADyC,CAAA,OACtB,UADsB,CAAA,CAAA,MAAA,CAAA;AACzC,cAEC,MAFkB,EAAA,SAAU,CAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,QAAA,EAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,YAAA,CAAA;AAE5B,KAWD,MAAA,GADF,CAAA,OACmB,MADnB,CAAA,CAAA,MAAA,CAAA;AACE,KAEA,SAAA,GAFiB;EAEjB,IAAA,EAAA,MAAS;EAET,KAAA,EAAA,MAAA;AAUZ,CAAA;AAMY,KAhBA,YAAA,GAgBW;EAEX,GAAA,EAAA,MAAA;EACY,OAAA,EAAA,MAAA,GAAA,IAAA;EAAf,GAAA,EAAA,MAAA,GAAA,IAAA;EAAM,GAAA,EAAA,MAAA,GAAA,IAAA;;;;;KATH,iBAAA;UACF;;SAED;;KAGG,WAAA;;YAEA;SACH,eAAe"}
|
package/dist/type.mjs
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/type.ts
|
|
2
|
+
const CATEGORIES = [
|
|
3
|
+
"J1",
|
|
4
|
+
"J2",
|
|
5
|
+
"J3"
|
|
6
|
+
];
|
|
7
|
+
const Fields = [
|
|
8
|
+
"revenue",
|
|
9
|
+
"expense",
|
|
10
|
+
"net_worth",
|
|
11
|
+
"sponsor",
|
|
12
|
+
"ticket",
|
|
13
|
+
"broadcast",
|
|
14
|
+
"salary",
|
|
15
|
+
"average_attd",
|
|
16
|
+
"unit_price"
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
//#endregion
|
|
20
|
+
export { CATEGORIES, Fields };
|
|
21
|
+
//# sourceMappingURL=type.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.mjs","names":[],"sources":["../src/type.ts"],"sourcesContent":["export const CATEGORIES = [\"J1\", \"J2\", \"J3\"] as const;\nexport type Category = (typeof CATEGORIES)[number];\n\nexport const Fields = [\n \"revenue\",\n \"expense\",\n \"net_worth\",\n \"sponsor\",\n \"ticket\",\n \"broadcast\",\n \"salary\",\n \"average_attd\",\n \"unit_price\",\n] as const;\nexport type Fields = (typeof Fields)[number];\n\nexport type ValueItem = { name: string; value: number };\n\nexport type StatsSummary = {\n sum: number;\n average: number | null;\n min: number | null;\n max: number | null;\n median?: number | null;\n deviation?: number | null;\n variance?: number | null;\n};\n\nexport type CreateStatsResult = {\n values: ValueItem[];\n totalCount: number;\n stats: StatsSummary;\n};\n\nexport type DatasetFile = {\n year: number;\n category: Category;\n stats: Record<string, CreateStatsResult>;\n};\n"],"mappings":";AAAA,MAAa,aAAa;CAAC;CAAM;CAAM;CAAK;AAG5C,MAAa,SAAS;CACpB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD"}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cieloazul310/jclub-financial-statistics",
|
|
3
|
+
"version": "0.0.1-alpha.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"homepage": "https://github.com/cieloazul310/jclub-financial-table",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "cieloazul310",
|
|
8
|
+
"url": "https://cieloazul310.github.io"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/cieloazul310/jclub-financial-table.git",
|
|
13
|
+
"directory": "packages/statistics"
|
|
14
|
+
},
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public",
|
|
17
|
+
"registry": "https://registry.npmjs.org/"
|
|
18
|
+
},
|
|
19
|
+
"type": "module",
|
|
20
|
+
"main": "./dist/index.cjs",
|
|
21
|
+
"module": "./dist/index.mjs",
|
|
22
|
+
"types": "./dist/index.d.mts",
|
|
23
|
+
"files": [
|
|
24
|
+
"dist"
|
|
25
|
+
],
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"import": {
|
|
29
|
+
"types": "./dist/index.d.mts",
|
|
30
|
+
"default": "./dist/index.mjs"
|
|
31
|
+
},
|
|
32
|
+
"require": {
|
|
33
|
+
"types": "./dist/index.d.cts",
|
|
34
|
+
"default": "./dist/index.cjs"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"./package.json": "./package.json"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "npm run build:template && npm run build:statistics",
|
|
41
|
+
"build:statistics": "tsx ./scripts/build-statistics.ts",
|
|
42
|
+
"build:template": "tsdown"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@cieloazul310/jclub-financial-data": "^0.0.1-alpha.0",
|
|
46
|
+
"@repo/eslint-config": "^0.0.1-alpha.0",
|
|
47
|
+
"@repo/typescript-config": "^0.0.1-alpha.0",
|
|
48
|
+
"@types/node": "^24.9.1",
|
|
49
|
+
"eslint": "^9.34.0",
|
|
50
|
+
"tsdown": "^0.18.2",
|
|
51
|
+
"tsx": "^4.20.6",
|
|
52
|
+
"typescript": "^5.9.2"
|
|
53
|
+
},
|
|
54
|
+
"peerDependencies": {
|
|
55
|
+
"@cieloazul310/jclub-financial-data": "^0.0.1-alpha.0"
|
|
56
|
+
},
|
|
57
|
+
"lint-staged": {
|
|
58
|
+
"**/*.{js,mjs,cjs,ts,tsx}": [
|
|
59
|
+
"eslint --fix",
|
|
60
|
+
"prettier --parser typescript --write"
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
}
|