openplanter 0.2.3 → 0.2.4
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/investigation-tools/asx-calendar-fetcher.d.ts +2 -16
- package/dist/investigation-tools/asx-calendar-fetcher.d.ts.map +1 -1
- package/dist/investigation-tools/asx-calendar-fetcher.js +82 -133
- package/dist/investigation-tools/asx-calendar-fetcher.js.map +1 -1
- package/dist/investigation-tools/bulk-asx-announcements.d.ts +2 -26
- package/dist/investigation-tools/bulk-asx-announcements.d.ts.map +1 -1
- package/dist/investigation-tools/bulk-asx-announcements.js +48 -95
- package/dist/investigation-tools/bulk-asx-announcements.js.map +1 -1
- package/dist/investigation-tools/price-fetcher.d.ts +1 -27
- package/dist/investigation-tools/price-fetcher.d.ts.map +1 -1
- package/dist/investigation-tools/price-fetcher.js +39 -76
- package/dist/investigation-tools/price-fetcher.js.map +1 -1
- package/dist/investigation-tools/shared.d.ts +2 -1
- package/dist/investigation-tools/shared.d.ts.map +1 -1
- package/dist/investigation-tools/shared.js +5 -1
- package/dist/investigation-tools/shared.js.map +1 -1
- package/dist/investigation-tools/volume-scanner.d.ts +0 -31
- package/dist/investigation-tools/volume-scanner.d.ts.map +1 -1
- package/dist/investigation-tools/volume-scanner.js +24 -86
- package/dist/investigation-tools/volume-scanner.js.map +1 -1
- package/package.json +3 -2
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* asx-calendar-fetcher.ts — ASX Appendix 4C Reporting Calendar Fetcher
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Fetches recent ASX quarterly activity / Appendix 4C announcements from
|
|
5
|
+
* the ASX Markit Digital API and outputs structured data for downstream analysis.
|
|
6
6
|
*/
|
|
7
7
|
declare const OUTPUT_COLUMNS: readonly ["ticker", "company_name", "quarter_end", "due_date", "lodged_date", "status"];
|
|
8
8
|
export interface CalendarEntry {
|
|
@@ -17,22 +17,8 @@ export interface PeriodRange {
|
|
|
17
17
|
start: Date;
|
|
18
18
|
end: Date;
|
|
19
19
|
}
|
|
20
|
-
/**
|
|
21
|
-
* Parse a period string into a date range for filtering.
|
|
22
|
-
*
|
|
23
|
-
* Supported formats:
|
|
24
|
-
* - next_30d, next_90d, next_NNd — from today through NN days ahead
|
|
25
|
-
* - Q1_2026, Q2_2026, etc. — quarter due date window
|
|
26
|
-
*/
|
|
27
20
|
export declare function parsePeriod(period: string): PeriodRange;
|
|
28
21
|
export declare function fetchCalendarLive(): Promise<CalendarEntry[]>;
|
|
29
|
-
/**
|
|
30
|
-
* Fetch and filter ASX 4C calendar entries.
|
|
31
|
-
*
|
|
32
|
-
* @param options.tickers - Comma-separated tickers or "all"
|
|
33
|
-
* @param options.period - Period string (next_30d, Q1_2026, etc.)
|
|
34
|
-
* @param options.records - Pre-fetched records (for testing / offline use)
|
|
35
|
-
*/
|
|
36
22
|
export declare function fetchCalendar(options?: {
|
|
37
23
|
tickers?: string;
|
|
38
24
|
period?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asx-calendar-fetcher.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/asx-calendar-fetcher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"asx-calendar-fetcher.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/asx-calendar-fetcher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,QAAA,MAAM,cAAc,yFAOV,CAAC;AAiCX,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;CAC3C;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,IAAI,CAAC;IACZ,GAAG,EAAE,IAAI,CAAC;CACX;AAwBD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAsCvD;AA6HD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAGlE;AAID,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;CAC3B,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA0C3B;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* asx-calendar-fetcher.ts — ASX Appendix 4C Reporting Calendar Fetcher
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Fetches recent ASX quarterly activity / Appendix 4C announcements from
|
|
5
|
+
* the ASX Markit Digital API and outputs structured data for downstream analysis.
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
7
|
+
import { fetchJson, normalizeTicker, isValidTicker, DEFAULT_USER_AGENT } from "./shared.js";
|
|
8
8
|
// ── Constants ────────────────────────────────────────────────────
|
|
9
|
-
const
|
|
9
|
+
const ASX_MARKIT_API = "https://asx.api.markitdigital.com/asx-research/1.0/companies/{ticker}/announcements";
|
|
10
10
|
const OUTPUT_COLUMNS = [
|
|
11
11
|
"ticker",
|
|
12
12
|
"company_name",
|
|
@@ -15,7 +15,6 @@ const OUTPUT_COLUMNS = [
|
|
|
15
15
|
"lodged_date",
|
|
16
16
|
"status",
|
|
17
17
|
];
|
|
18
|
-
/** Quarter-end month mappings (calendar quarters) */
|
|
19
18
|
const QUARTER_END_MONTHS = {
|
|
20
19
|
Q1: 3,
|
|
21
20
|
Q2: 6,
|
|
@@ -28,44 +27,23 @@ const QUARTER_END_DAYS = {
|
|
|
28
27
|
Q3: 30,
|
|
29
28
|
Q4: 31,
|
|
30
29
|
};
|
|
31
|
-
/** 4C reports are due within ~1 month after quarter end */
|
|
32
30
|
const REPORT_DUE_OFFSET_DAYS = 31;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
parse: (m) => new Date(+m[1], +m[2] - 1, +m[3]),
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
// DD-MM-YYYY
|
|
47
|
-
regex: /^(\d{1,2})-(\d{1,2})-(\d{4})$/,
|
|
48
|
-
parse: (m) => new Date(+m[3], +m[2] - 1, +m[1]),
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
// DD Mon YYYY (e.g. "15 Feb 2026")
|
|
52
|
-
regex: /^(\d{1,2})\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+(\d{4})$/i,
|
|
53
|
-
parse: (m) => new Date(`${m[2]} ${m[1]}, ${m[3]}`),
|
|
54
|
-
},
|
|
31
|
+
const QUARTERLY_ANNOUNCEMENT_TYPES = [
|
|
32
|
+
"QUARTERLY ACTIVITIES REPORT",
|
|
33
|
+
"QUARTERLY CASHFLOW REPORT",
|
|
34
|
+
];
|
|
35
|
+
const QUARTERLY_HEADLINE_KEYWORDS = [
|
|
36
|
+
"appendix 4c",
|
|
37
|
+
"quarterly cash flow",
|
|
38
|
+
"quarterly cashflow",
|
|
39
|
+
"quarterly activities",
|
|
40
|
+
"quarterly report",
|
|
55
41
|
];
|
|
56
42
|
// ── Period Parsing ───────────────────────────────────────────────
|
|
57
|
-
/**
|
|
58
|
-
* Parse a period string into a date range for filtering.
|
|
59
|
-
*
|
|
60
|
-
* Supported formats:
|
|
61
|
-
* - next_30d, next_90d, next_NNd — from today through NN days ahead
|
|
62
|
-
* - Q1_2026, Q2_2026, etc. — quarter due date window
|
|
63
|
-
*/
|
|
64
43
|
export function parsePeriod(period) {
|
|
65
44
|
const trimmed = period.trim();
|
|
66
45
|
const today = new Date();
|
|
67
46
|
today.setHours(0, 0, 0, 0);
|
|
68
|
-
// Handle next_Nd pattern
|
|
69
47
|
if (trimmed.startsWith("next_") && trimmed.endsWith("d")) {
|
|
70
48
|
const daysStr = trimmed.slice(5, -1);
|
|
71
49
|
const days = parseInt(daysStr, 10);
|
|
@@ -76,7 +54,6 @@ export function parsePeriod(period) {
|
|
|
76
54
|
end.setDate(end.getDate() + days);
|
|
77
55
|
return { start: today, end };
|
|
78
56
|
}
|
|
79
|
-
// Handle QN_YYYY pattern
|
|
80
57
|
if (trimmed.includes("_")) {
|
|
81
58
|
const parts = trimmed.split("_", 2);
|
|
82
59
|
const quarterKey = parts[0].toUpperCase();
|
|
@@ -96,10 +73,10 @@ export function parsePeriod(period) {
|
|
|
96
73
|
throw new Error(`Unrecognised period '${period}'. Use next_30d, next_90d, Q1_2026, Q2_2026, etc.`);
|
|
97
74
|
}
|
|
98
75
|
// ── Helpers ──────────────────────────────────────────────────────
|
|
99
|
-
function inferQuarterEnd(
|
|
100
|
-
const approxQtrEnd = new Date(
|
|
76
|
+
function inferQuarterEnd(lodgedDate) {
|
|
77
|
+
const approxQtrEnd = new Date(lodgedDate);
|
|
101
78
|
approxQtrEnd.setDate(approxQtrEnd.getDate() - REPORT_DUE_OFFSET_DAYS);
|
|
102
|
-
const month = approxQtrEnd.getMonth() + 1;
|
|
79
|
+
const month = approxQtrEnd.getMonth() + 1;
|
|
103
80
|
if (month <= 3) {
|
|
104
81
|
return `${approxQtrEnd.getFullYear()}-03-31`;
|
|
105
82
|
}
|
|
@@ -113,24 +90,17 @@ function inferQuarterEnd(dueDate) {
|
|
|
113
90
|
return `${approxQtrEnd.getFullYear()}-12-31`;
|
|
114
91
|
}
|
|
115
92
|
}
|
|
116
|
-
function tryParseDate(text) {
|
|
117
|
-
const trimmed = text.trim();
|
|
118
|
-
for (const fmt of DATE_FORMATS) {
|
|
119
|
-
const m = trimmed.match(fmt.regex);
|
|
120
|
-
if (m) {
|
|
121
|
-
const d = fmt.parse(m);
|
|
122
|
-
if (!isNaN(d.getTime()))
|
|
123
|
-
return d;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
93
|
function formatDateIso(d) {
|
|
129
94
|
const year = d.getFullYear();
|
|
130
95
|
const month = String(d.getMonth() + 1).padStart(2, "0");
|
|
131
96
|
const day = String(d.getDate()).padStart(2, "0");
|
|
132
97
|
return `${year}-${month}-${day}`;
|
|
133
98
|
}
|
|
99
|
+
function computeDueDate(quarterEnd) {
|
|
100
|
+
const qe = new Date(quarterEnd);
|
|
101
|
+
qe.setDate(qe.getDate() + REPORT_DUE_OFFSET_DAYS);
|
|
102
|
+
return formatDateIso(qe);
|
|
103
|
+
}
|
|
134
104
|
function determineStatus(dueDateStr, lodgedDateStr) {
|
|
135
105
|
if (lodgedDateStr)
|
|
136
106
|
return "lodged";
|
|
@@ -141,6 +111,13 @@ function determineStatus(dueDateStr, lodgedDateStr) {
|
|
|
141
111
|
today.setHours(0, 0, 0, 0);
|
|
142
112
|
return dueDt < today ? "overdue" : "upcoming";
|
|
143
113
|
}
|
|
114
|
+
function is4CRelated(item) {
|
|
115
|
+
const annType = (item.announcementType ?? "").toUpperCase();
|
|
116
|
+
if (QUARTERLY_ANNOUNCEMENT_TYPES.some((t) => annType.includes(t)))
|
|
117
|
+
return true;
|
|
118
|
+
const headline = (item.headline ?? "").toLowerCase();
|
|
119
|
+
return QUARTERLY_HEADLINE_KEYWORDS.some((kw) => headline.includes(kw));
|
|
120
|
+
}
|
|
144
121
|
function filterByTickers(records, tickers) {
|
|
145
122
|
const tickerSet = new Set(tickers.map((t) => normalizeTicker(t)));
|
|
146
123
|
return records.filter((r) => tickerSet.has(r.ticker));
|
|
@@ -156,95 +133,56 @@ function filterByPeriod(records, startDate, endDate) {
|
|
|
156
133
|
});
|
|
157
134
|
}
|
|
158
135
|
// ── Live data fetching ───────────────────────────────────────────
|
|
159
|
-
function
|
|
160
|
-
const
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
const rows = table.find("tr").toArray();
|
|
165
|
-
for (const row of rows) {
|
|
166
|
-
const allCells = ch(row).find("td, th");
|
|
167
|
-
if (allCells.length < 3)
|
|
168
|
-
continue;
|
|
169
|
-
// Skip header rows
|
|
170
|
-
if (ch(row).find("th").length > 0)
|
|
171
|
-
continue;
|
|
172
|
-
const cellTexts = allCells
|
|
173
|
-
.toArray()
|
|
174
|
-
.map((cell) => ch(cell).text().trim());
|
|
175
|
-
// Heuristic: find a cell that looks like an ASX code (2-4 uppercase letters)
|
|
176
|
-
let ticker = "";
|
|
177
|
-
let companyName = "";
|
|
178
|
-
for (let i = 0; i < cellTexts.length; i++) {
|
|
179
|
-
const stripped = cellTexts[i].trim().toUpperCase();
|
|
180
|
-
if (stripped.length >= 2 &&
|
|
181
|
-
stripped.length <= 4 &&
|
|
182
|
-
/^[A-Z]+$/.test(stripped) &&
|
|
183
|
-
!ticker) {
|
|
184
|
-
ticker = stripped;
|
|
185
|
-
// Next cell is usually the company name
|
|
186
|
-
if (i + 1 < cellTexts.length) {
|
|
187
|
-
companyName = cellTexts[i + 1];
|
|
188
|
-
}
|
|
189
|
-
break;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
if (!ticker)
|
|
193
|
-
continue;
|
|
194
|
-
// Look for date-like cells
|
|
195
|
-
let dueDateStr = "";
|
|
196
|
-
let lodgedDateStr = null;
|
|
197
|
-
for (const text of cellTexts) {
|
|
198
|
-
const parsed = tryParseDate(text);
|
|
199
|
-
if (parsed) {
|
|
200
|
-
const dateIso = formatDateIso(parsed);
|
|
201
|
-
if (!dueDateStr) {
|
|
202
|
-
dueDateStr = dateIso;
|
|
203
|
-
}
|
|
204
|
-
else if (!lodgedDateStr) {
|
|
205
|
-
lodgedDateStr = dateIso;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
if (!dueDateStr)
|
|
210
|
-
continue;
|
|
211
|
-
const quarterEnd = inferQuarterEnd(new Date(dueDateStr));
|
|
212
|
-
const status = determineStatus(dueDateStr, lodgedDateStr);
|
|
213
|
-
records.push({
|
|
214
|
-
ticker,
|
|
215
|
-
company_name: companyName,
|
|
216
|
-
quarter_end: quarterEnd,
|
|
217
|
-
due_date: dueDateStr,
|
|
218
|
-
lodged_date: lodgedDateStr,
|
|
219
|
-
status,
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
return records;
|
|
223
|
-
}
|
|
224
|
-
export async function fetchCalendarLive() {
|
|
136
|
+
async function fetchTickerCalendar(ticker) {
|
|
137
|
+
const clean = normalizeTicker(ticker);
|
|
138
|
+
if (!isValidTicker(clean))
|
|
139
|
+
return [];
|
|
140
|
+
const url = ASX_MARKIT_API.replace("{ticker}", clean) + "?count=50";
|
|
225
141
|
try {
|
|
226
|
-
const
|
|
227
|
-
|
|
142
|
+
const resp = await fetchJson(url, {
|
|
143
|
+
delay: 0.5,
|
|
144
|
+
userAgent: DEFAULT_USER_AGENT,
|
|
145
|
+
});
|
|
146
|
+
const companyName = resp.data?.displayName ?? clean;
|
|
147
|
+
const items = resp.data?.items ?? [];
|
|
148
|
+
const records = [];
|
|
149
|
+
for (const item of items) {
|
|
150
|
+
if (!is4CRelated(item))
|
|
151
|
+
continue;
|
|
152
|
+
const dateStr = item.date ?? "";
|
|
153
|
+
const lodgedDate = dateStr ? new Date(dateStr) : null;
|
|
154
|
+
if (!lodgedDate || isNaN(lodgedDate.getTime()))
|
|
155
|
+
continue;
|
|
156
|
+
const lodgedDateIso = formatDateIso(lodgedDate);
|
|
157
|
+
const quarterEnd = inferQuarterEnd(lodgedDate);
|
|
158
|
+
const dueDate = computeDueDate(quarterEnd);
|
|
159
|
+
const status = determineStatus(dueDate, lodgedDateIso);
|
|
160
|
+
records.push({
|
|
161
|
+
ticker: clean,
|
|
162
|
+
company_name: companyName,
|
|
163
|
+
quarter_end: quarterEnd,
|
|
164
|
+
due_date: dueDate,
|
|
165
|
+
lodged_date: lodgedDateIso,
|
|
166
|
+
status,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
return records;
|
|
228
170
|
}
|
|
229
171
|
catch (err) {
|
|
230
172
|
const msg = err instanceof Error ? err.message : String(err);
|
|
231
|
-
console.error(`[error] Failed to fetch calendar
|
|
173
|
+
console.error(`[error] Failed to fetch calendar for ${clean}: ${msg}`);
|
|
232
174
|
return [];
|
|
233
175
|
}
|
|
234
176
|
}
|
|
177
|
+
export async function fetchCalendarLive() {
|
|
178
|
+
console.warn("[warn] fetchCalendarLive() requires explicit tickers with the Markit Digital API. Use fetchCalendar({ tickers }) instead.");
|
|
179
|
+
return [];
|
|
180
|
+
}
|
|
235
181
|
// ── Main entry point ─────────────────────────────────────────────
|
|
236
|
-
/**
|
|
237
|
-
* Fetch and filter ASX 4C calendar entries.
|
|
238
|
-
*
|
|
239
|
-
* @param options.tickers - Comma-separated tickers or "all"
|
|
240
|
-
* @param options.period - Period string (next_30d, Q1_2026, etc.)
|
|
241
|
-
* @param options.records - Pre-fetched records (for testing / offline use)
|
|
242
|
-
*/
|
|
243
182
|
export async function fetchCalendar(options) {
|
|
244
183
|
const tickersInput = options?.tickers ?? "all";
|
|
245
184
|
const periodStr = options?.period ?? "next_30d";
|
|
246
185
|
const { start: startDate, end: endDate } = parsePeriod(periodStr);
|
|
247
|
-
// Parse ticker filter
|
|
248
186
|
let filterTickers = null;
|
|
249
187
|
if (tickersInput.trim().toLowerCase() !== "all") {
|
|
250
188
|
filterTickers = tickersInput
|
|
@@ -254,16 +192,27 @@ export async function fetchCalendar(options) {
|
|
|
254
192
|
if (!filterTickers.length)
|
|
255
193
|
filterTickers = null;
|
|
256
194
|
}
|
|
257
|
-
|
|
258
|
-
|
|
195
|
+
let records = options?.records ?? [];
|
|
196
|
+
if (!options?.records) {
|
|
197
|
+
if (filterTickers) {
|
|
198
|
+
const allRecords = [];
|
|
199
|
+
for (const ticker of filterTickers) {
|
|
200
|
+
const tickerRecords = await fetchTickerCalendar(ticker);
|
|
201
|
+
allRecords.push(...tickerRecords);
|
|
202
|
+
}
|
|
203
|
+
records = allRecords;
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
console.warn("[warn] asx_calendar_fetcher requires specific tickers. Pass tickers='BHP,RIO,...' instead of 'all'.");
|
|
207
|
+
return [];
|
|
208
|
+
}
|
|
209
|
+
}
|
|
259
210
|
if (!records.length)
|
|
260
211
|
return [];
|
|
261
|
-
// Apply filters
|
|
262
212
|
records = filterByPeriod(records, startDate, endDate);
|
|
263
213
|
if (filterTickers) {
|
|
264
214
|
records = filterByTickers(records, filterTickers);
|
|
265
215
|
}
|
|
266
|
-
// Sort by due_date ascending
|
|
267
216
|
records.sort((a, b) => a.due_date.localeCompare(b.due_date));
|
|
268
217
|
return records;
|
|
269
218
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asx-calendar-fetcher.js","sourceRoot":"","sources":["../../src/investigation-tools/asx-calendar-fetcher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"asx-calendar-fetcher.js","sourceRoot":"","sources":["../../src/investigation-tools/asx-calendar-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,14 +2,11 @@
|
|
|
2
2
|
* bulk-asx-announcements.ts — Bulk ASX Announcement Fetcher
|
|
3
3
|
*
|
|
4
4
|
* Fetches recent ASX announcements (Appendix 3Y director trades, 4C cashflow
|
|
5
|
-
* reports, 3B issue of securities) for multiple tickers
|
|
6
|
-
*
|
|
5
|
+
* reports, 3B issue of securities) for multiple tickers via the ASX Markit
|
|
6
|
+
* Digital API. Returns structured announcement records.
|
|
7
7
|
*/
|
|
8
|
-
/** Recognised ASX announcement type codes for bulk filtering. */
|
|
9
8
|
export type AsxAnnouncementTypeCode = "3Y" | "4C" | "3B";
|
|
10
|
-
/** All supported type codes. */
|
|
11
9
|
export declare const ALL_TYPE_CODES: readonly AsxAnnouncementTypeCode[];
|
|
12
|
-
/** A single ASX announcement record. */
|
|
13
10
|
export interface AsxAnnouncementRecord {
|
|
14
11
|
ticker: string;
|
|
15
12
|
announcement_type: AsxAnnouncementTypeCode;
|
|
@@ -18,36 +15,15 @@ export interface AsxAnnouncementRecord {
|
|
|
18
15
|
url: string;
|
|
19
16
|
file_size: string | null;
|
|
20
17
|
}
|
|
21
|
-
/** Options for fetching announcements for a single ticker. */
|
|
22
18
|
export interface FetchAnnouncementsOptions {
|
|
23
|
-
/** Announcement types to match (default: all). */
|
|
24
19
|
types?: AsxAnnouncementTypeCode[];
|
|
25
|
-
/** How many days back to search (default: 90). */
|
|
26
20
|
daysBack?: number;
|
|
27
|
-
/** Delay in ms between API requests (default: 1000). */
|
|
28
21
|
delayMs?: number;
|
|
29
22
|
}
|
|
30
|
-
/** Options for bulk-fetching across multiple tickers. */
|
|
31
23
|
export interface BulkFetchOptions extends FetchAnnouncementsOptions {
|
|
32
|
-
/** Callback invoked with progress info after each ticker. */
|
|
33
24
|
onProgress?: (ticker: string, found: number, total: number) => void;
|
|
34
25
|
}
|
|
35
|
-
/**
|
|
36
|
-
* Fetch announcements for a single ticker from the ASX API.
|
|
37
|
-
*
|
|
38
|
-
* Paginates up to {@link MAX_PAGES_PER_TICKER} pages and returns records
|
|
39
|
-
* whose titles match the requested types within the date window.
|
|
40
|
-
*/
|
|
41
26
|
export declare function fetchAnnouncementsForTicker(ticker: string, opts?: FetchAnnouncementsOptions): Promise<AsxAnnouncementRecord[]>;
|
|
42
|
-
/**
|
|
43
|
-
* Bulk-fetch announcements for multiple tickers.
|
|
44
|
-
*
|
|
45
|
-
* Fetches sequentially with rate-limiting between tickers to respect
|
|
46
|
-
* ASX API fair-use expectations.
|
|
47
|
-
*/
|
|
48
27
|
export declare function fetchBulkAnnouncements(tickers: string[], opts?: BulkFetchOptions): Promise<AsxAnnouncementRecord[]>;
|
|
49
|
-
/**
|
|
50
|
-
* Parse a comma-separated ticker string into an array of normalised tickers.
|
|
51
|
-
*/
|
|
52
28
|
export declare function parseTickers(raw: string): string[];
|
|
53
29
|
//# sourceMappingURL=bulk-asx-announcements.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bulk-asx-announcements.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/bulk-asx-announcements.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"bulk-asx-announcements.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/bulk-asx-announcements.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmBH,MAAM,MAAM,uBAAuB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzD,eAAO,MAAM,cAAc,EAAE,SAAS,uBAAuB,EAInD,CAAC;AAqBX,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,uBAAuB,CAAC;IAC3C,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAiB,SAAQ,yBAAyB;IACjE,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE;AA8DD,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,yBAA8B,GACnC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAyElC;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,qBAAqB,EAAE,CAAC,CA0BlC;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAMlD"}
|