@fin.cx/opendata 1.2.0 → 1.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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@fin.cx/opendata',
6
- version: '1.2.0',
6
+ version: '1.4.0',
7
7
  description: 'A TypeScript library for accessing, managing, and updating open business data, focused on German companies and integrating with MongoDB.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxrQkFBa0I7SUFDeEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDBJQUEwSTtDQUN4SixDQUFBIn0=
@@ -12,9 +12,13 @@ export declare class BusinessRecord extends plugins.smartdata.SmartDataDbDoc<Bus
12
12
  email?: string;
13
13
  website?: string;
14
14
  businessType?: string;
15
- registrationNumber?: string;
16
- registrationCourt?: string;
17
- legalForm?: string;
15
+ registrationId?: string;
16
+ germanParsedRegistration?: {
17
+ court?: string;
18
+ type?: 'HRA' | 'HRB' | 'GnR' | 'PR' | 'VR' | 'GsR';
19
+ number?: string;
20
+ };
21
+ legalForm?: 'GmbH' | 'GmbH & Co. KG' | 'AG' | 'LLC' | 'LLP' | 'GmbH & Co. KGaA' | 'GmbH & Co. KGaA, LLC';
18
22
  managingDirectors?: string[];
19
23
  boardOfDirectors?: string[];
20
24
  supervisoryBoard?: string[];
@@ -26,4 +26,4 @@ BusinessRecord = __decorate([
26
26
  plugins.smartdata.Manager()
27
27
  ], BusinessRecord);
28
28
  export { BusinessRecord };
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5idXNpbmVzc3JlY29yZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuYnVzaW5lc3NyZWNvcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFHakMsSUFBTSxjQUFjLEdBQXBCLE1BQU0sY0FBZSxTQUFRLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FBOEM7SUFBN0Y7O1FBTUwsU0FBSSxHQXFCQSxFQUFFLENBQUM7SUFDVCxDQUFDO0NBQUEsQ0FBQTtBQXpCQztJQURDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFOzswQ0FDYjtBQUdYO0lBREMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7OzRDQXNCbEI7QUEzQkksY0FBYztJQUQxQixPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRTtHQUNmLGNBQWMsQ0E0QjFCIn0=
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5idXNpbmVzc3JlY29yZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuYnVzaW5lc3NyZWNvcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFHakMsSUFBTSxjQUFjLEdBQXBCLE1BQU0sY0FBZSxTQUFRLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FHckQ7SUFITTs7UUFRTCxTQUFJLEdBZ0NBLEVBQUUsQ0FBQztJQUNULENBQUM7Q0FBQSxDQUFBO0FBcENDO0lBREMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7OzBDQUNiO0FBR1g7SUFEQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTs7NENBaUNsQjtBQXhDSSxjQUFjO0lBRDFCLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO0dBQ2YsY0FBYyxDQXlDMUIifQ==
@@ -1,3 +1,4 @@
1
+ import type { BusinessRecord } from './classes.businessrecord.js';
1
2
  import type { OpenData } from './classes.main.opendata.js';
2
3
  import * as plugins from './plugins.js';
3
4
  /**
@@ -5,12 +6,85 @@ import * as plugins from './plugins.js';
5
6
  */
6
7
  export declare class HandelsRegister {
7
8
  private openDataRef;
9
+ private asyncExecutionStack;
10
+ private uniqueDowloadFolder;
8
11
  smartbrowserInstance: plugins.smartbrowser.SmartBrowser;
9
12
  constructor(openDataRef: OpenData);
10
13
  start(): Promise<void>;
11
14
  stop(): Promise<void>;
12
15
  /**
13
- * Search for a company by name
16
+ * Creates a new page and configures it to allow file downloads
17
+ * to a predefined path.
14
18
  */
15
- getDataForCompany(companyNameArg: string): Promise<any[]>;
19
+ getNewPage: () => Promise<plugins.smartbrowser.smartpuppeteer.puppeteer.Page>;
20
+ private navigateToPage;
21
+ private waitForResults;
22
+ private clickFindButton;
23
+ private downloadFile;
24
+ /**
25
+ * Helper method to parse the German registration string
26
+ */
27
+ private parseGermanRegistration;
28
+ /**
29
+ * Search for a company by name and return basic info
30
+ */
31
+ searchCompany(companyNameArg: string): Promise<{
32
+ name?: string;
33
+ address?: string;
34
+ postalCode?: string;
35
+ city?: string;
36
+ country?: string;
37
+ phone?: string;
38
+ fax?: string;
39
+ email?: string;
40
+ website?: string;
41
+ businessType?: string;
42
+ registrationId?: string;
43
+ germanParsedRegistration?: {
44
+ court?: string;
45
+ type?: "HRA" | "HRB" | "GnR" | "PR" | "VR" | "GsR";
46
+ number?: string;
47
+ };
48
+ legalForm?: "GmbH" | "GmbH & Co. KG" | "AG" | "LLC" | "LLP" | "GmbH & Co. KGaA" | "GmbH & Co. KGaA, LLC";
49
+ managingDirectors?: string[];
50
+ boardOfDirectors?: string[];
51
+ supervisoryBoard?: string[];
52
+ foundingDate?: string;
53
+ capital?: string;
54
+ purpose?: string;
55
+ lastUpdate?: string;
56
+ }[]>;
57
+ /**
58
+ * Search for a specific company (known register type/number/court),
59
+ * then click on an element that triggers a file download.
60
+ */
61
+ getSpecificCompany(companyArg: BusinessRecord['data']['germanParsedRegistration']): Promise<{
62
+ businessRecords: {
63
+ name?: string;
64
+ address?: string;
65
+ postalCode?: string;
66
+ city?: string;
67
+ country?: string;
68
+ phone?: string;
69
+ fax?: string;
70
+ email?: string;
71
+ website?: string;
72
+ businessType?: string;
73
+ registrationId?: string;
74
+ germanParsedRegistration?: {
75
+ court?: string;
76
+ type?: "HRA" | "HRB" | "GnR" | "PR" | "VR" | "GsR";
77
+ number?: string;
78
+ };
79
+ legalForm?: "GmbH" | "GmbH & Co. KG" | "AG" | "LLC" | "LLP" | "GmbH & Co. KGaA" | "GmbH & Co. KGaA, LLC";
80
+ managingDirectors?: string[];
81
+ boardOfDirectors?: string[];
82
+ supervisoryBoard?: string[];
83
+ foundingDate?: string;
84
+ capital?: string;
85
+ purpose?: string;
86
+ lastUpdate?: string;
87
+ }[];
88
+ files: plugins.smartfile.SmartFile[];
89
+ }>;
16
90
  }
@@ -1,111 +1,271 @@
1
1
  import * as plugins from './plugins.js';
2
+ import * as paths from './paths.js';
2
3
  /**
3
4
  * the HandlesRegister exposed as a class
4
5
  */
5
6
  export class HandelsRegister {
6
7
  constructor(openDataRef) {
8
+ this.asyncExecutionStack = new plugins.lik.AsyncExecutionStack();
9
+ this.uniqueDowloadFolder = plugins.path.join(paths.downloadDir, plugins.smartunique.uniSimple());
10
+ // Puppeteer wrapper instance
7
11
  this.smartbrowserInstance = new plugins.smartbrowser.SmartBrowser();
12
+ /**
13
+ * Creates a new page and configures it to allow file downloads
14
+ * to a predefined path.
15
+ */
16
+ this.getNewPage = async () => {
17
+ const page = await this.smartbrowserInstance.headlessBrowser.newPage();
18
+ // 1) Create a DevTools session for this page
19
+ const cdpSession = await page.target().createCDPSession();
20
+ // 2) Allow file downloads and set the download path
21
+ await cdpSession.send('Page.setDownloadBehavior', {
22
+ behavior: 'allow',
23
+ downloadPath: this.uniqueDowloadFolder, // <-- Change this to your desired absolute path
24
+ });
25
+ // Optionally set viewport and go to page
26
+ await page.setViewport({ width: 1920, height: 1080 });
27
+ await page.goto('https://www.handelsregister.de/');
28
+ return page;
29
+ };
30
+ this.navigateToPage = async (pageArg, pageNameArg) => {
31
+ try {
32
+ await pageArg.evaluate((pageNameArg2) => {
33
+ const elements = Array.from(document.querySelectorAll('.ui-menuitem-text > span'));
34
+ const targetElement = elements.find((el) => el.textContent?.trim() === pageNameArg2);
35
+ if (targetElement) {
36
+ targetElement.click();
37
+ }
38
+ }, pageNameArg);
39
+ console.log(`Navigated to the ${pageNameArg} page successfully.`);
40
+ }
41
+ catch (error) {
42
+ console.error(`Failed to navigate to the ${pageNameArg} page:`, error);
43
+ }
44
+ };
45
+ this.waitForResults = async (pageArg) => {
46
+ await pageArg
47
+ .waitForSelector('#ergebnissForm\\:selectedSuchErgebnisFormTable_data', {
48
+ timeout: 30000,
49
+ })
50
+ .catch(async (err) => {
51
+ await pageArg.screenshot({ path: paths.downloadDir + '/error.png' });
52
+ throw err;
53
+ });
54
+ const businessRecords = await pageArg.evaluate(() => {
55
+ const rows = document.querySelectorAll('#ergebnissForm\\:selectedSuchErgebnisFormTable_data > tr');
56
+ const records = [];
57
+ rows.forEach((row) => {
58
+ const nameElement = row.querySelector('td.ui-panelgrid-cell span.marginLeft20');
59
+ const cityElement = row.querySelector('td.ui-panelgrid-cell.sitzSuchErgebnisse span');
60
+ const statusElement = row.querySelector('td.ui-panelgrid-cell span.verticalText');
61
+ const registrationCourtElement = row.querySelector('td.ui-panelgrid-cell.fontTableNameSize');
62
+ const name = nameElement?.textContent?.trim();
63
+ const city = cityElement?.textContent?.trim();
64
+ const status = statusElement?.textContent?.trim();
65
+ const registrationId = registrationCourtElement?.textContent?.trim();
66
+ // Push parsed data into records array
67
+ records.push({
68
+ name,
69
+ city,
70
+ registrationId,
71
+ businessType: status,
72
+ });
73
+ });
74
+ return records;
75
+ });
76
+ return businessRecords;
77
+ };
78
+ this.clickFindButton = async (pageArg) => {
79
+ try {
80
+ // Wait for the button with the text "Find" to appear
81
+ await pageArg.waitForSelector('span.ui-button-text.ui-c', { timeout: 5000 });
82
+ // adjust to 100 results per page
83
+ await pageArg.select('#form\\:ergebnisseProSeite_input', '100');
84
+ // Locate and click the button using its text
85
+ await pageArg.evaluate(() => {
86
+ const buttons = Array.from(document.querySelectorAll('span.ui-button-text.ui-c'));
87
+ const targetButton = buttons.find((button) => button.textContent?.trim() === 'Find');
88
+ if (targetButton) {
89
+ const parentButton = targetButton.closest('button') || targetButton;
90
+ parentButton.click();
91
+ }
92
+ });
93
+ console.log('Find button clicked successfully!');
94
+ }
95
+ catch (error) {
96
+ console.error('Failed to find or click the "Find" button:', error);
97
+ }
98
+ };
8
99
  this.openDataRef = openDataRef;
9
100
  }
10
101
  async start() {
102
+ // Start the browser
103
+ await plugins.smartfile.fs.ensureDir(this.uniqueDowloadFolder);
11
104
  await this.smartbrowserInstance.start();
12
105
  }
13
106
  async stop() {
107
+ // Stop the browser
108
+ await plugins.smartfile.fs.remove(this.uniqueDowloadFolder);
14
109
  await this.smartbrowserInstance.stop();
15
110
  }
111
+ async downloadFile(pageArg, typeArg) {
112
+ // Trigger the file download by clicking on the relevant link
113
+ await pageArg.evaluate((typeArg2) => {
114
+ // Locate the table body
115
+ const tableBody = document.querySelector('#ergebnissForm\\:selectedSuchErgebnisFormTable_data');
116
+ if (!tableBody) {
117
+ throw new Error('Table body not found');
118
+ }
119
+ // Locate the first row
120
+ const firstRow = tableBody.querySelector('tr:nth-child(1)');
121
+ if (!firstRow) {
122
+ throw new Error('First row not found');
123
+ }
124
+ // Locate the last cell in the first row
125
+ const lastCell = firstRow.querySelector('td:last-child');
126
+ if (!lastCell) {
127
+ throw new Error('Last cell not found in the first row');
128
+ }
129
+ // Locate the download links
130
+ const adLink = lastCell.querySelector('a:first-of-type');
131
+ const siLink = lastCell.querySelector('a:last-of-type');
132
+ if (!siLink) {
133
+ throw new Error('SI link not found in the last cell');
134
+ }
135
+ // Simulate a click on the last <a> element
136
+ switch (typeArg2) {
137
+ case 'AD':
138
+ adLink.click();
139
+ break;
140
+ case 'SI':
141
+ siLink.click();
142
+ break;
143
+ default:
144
+ throw new Error('Invalid file type');
145
+ }
146
+ }, typeArg);
147
+ // Wait a bit for the download to complete (you might want to implement
148
+ // a more robust file-exists check or a wait-for-download library)
149
+ await pageArg.waitForTimeout(10000);
150
+ const files = await plugins.smartfile.fs.fileTreeToObject(this.uniqueDowloadFolder, '**/*');
151
+ await plugins.smartfile.fs.ensureEmptyDir(this.uniqueDowloadFolder);
152
+ return files[0];
153
+ }
16
154
  /**
17
- * Search for a company by name
155
+ * Helper method to parse the German registration string
18
156
  */
19
- async getDataForCompany(companyNameArg) {
20
- const page = await this.smartbrowserInstance.headlessBrowser.newPage();
21
- await page.setViewport({ width: 1920, height: 1080 });
22
- await page.goto('https://www.handelsregister.de/');
23
- await page.evaluate(() => {
24
- const elements = Array.from(document.querySelectorAll('.ui-menuitem-text > span'));
25
- const targetElement = elements.find((el) => el.textContent?.trim() === 'Normal search');
26
- if (targetElement) {
27
- targetElement.click();
28
- }
29
- });
30
- try {
31
- // Wait for the textarea to appear
32
- await page.waitForSelector('#form\\:schlagwoerter', { timeout: 5000 });
33
- // Enter text into the textarea using page.evaluate
34
- const inputText = companyNameArg;
35
- await page.evaluate((text) => {
36
- const textarea = document.querySelector('#form\\:schlagwoerter');
37
- if (textarea) {
38
- textarea.value = text; // Set the value
39
- // Trigger the change event manually if required
40
- const event = new Event('change', { bubbles: true });
41
- textarea.dispatchEvent(event);
42
- }
43
- }, inputText);
44
- console.log('Text entered successfully!');
45
- }
46
- catch (error) {
47
- console.error('Failed to find or enter text into the textarea:', error);
157
+ async parseGermanRegistration(input) {
158
+ // e.g. District court Berlin (Charlottenburg) HRB 123456
159
+ const regex = /District court (\p{L}[\p{L}\s-]*?(?:\s*\([\p{L}\s-]+\))?)\s+(HRA|HRB|GnR|VR|PR|GsR)\s+(\d+)/u;
160
+ const match = input.match(regex);
161
+ if (match) {
162
+ return {
163
+ court: match[1],
164
+ type: match[2], // Adjust if needed
165
+ number: match[3],
166
+ };
48
167
  }
49
- try {
50
- // Wait for the radio button's label to appear
51
- await page.waitForSelector('label[for="form:schlagwortOptionen:0"]', { timeout: 5000 });
52
- // Click the label to select the radio button
53
- await page.evaluate(() => {
54
- const label = document.querySelector('label[for="form:schlagwortOptionen:0"]');
55
- if (label) {
56
- label.click();
57
- }
58
- });
59
- console.log('Radio button clicked successfully!');
60
- }
61
- catch (error) {
62
- console.error('Failed to find or click the radio button:', error);
63
- }
64
- try {
65
- // Wait for the button with the text "Find" to appear
66
- await page.waitForSelector('span.ui-button-text.ui-c', { timeout: 5000 });
67
- // Locate and click the button using its text
68
- await page.evaluate(() => {
69
- const buttons = Array.from(document.querySelectorAll('span.ui-button-text.ui-c'));
70
- const targetButton = buttons.find((button) => button.textContent?.trim() === 'Find');
71
- if (targetButton) {
72
- const parentButton = targetButton.closest('button') || targetButton;
73
- parentButton.click();
74
- }
75
- });
76
- console.log('Find button clicked successfully!');
77
- }
78
- catch (error) {
79
- console.error('Failed to find or click the "Find" button:', error);
80
- }
81
- await page.waitForSelector('#ergebnissForm\\:selectedSuchErgebnisFormTable_data', {
82
- timeout: 10000,
83
- });
84
- const businessRecords = await page.evaluate(() => {
85
- const rows = document.querySelectorAll('#ergebnissForm\\:selectedSuchErgebnisFormTable_data > tr');
86
- const records = [];
87
- rows.forEach((row) => {
88
- const nameElement = row.querySelector('td.ui-panelgrid-cell span.marginLeft20');
89
- const cityElement = row.querySelector('td.ui-panelgrid-cell.sitzSuchErgebnisse span');
90
- const statusElement = row.querySelector('td.ui-panelgrid-cell span.verticalText');
91
- const registrationCourtElement = row.querySelector('td.ui-panelgrid-cell.fontTableNameSize');
92
- const name = nameElement?.textContent?.trim();
93
- const city = cityElement?.textContent?.trim();
94
- const status = statusElement?.textContent?.trim();
95
- const registrationCourt = registrationCourtElement?.textContent?.trim();
96
- // Push parsed data into records array
97
- records.push({
98
- name,
99
- city,
100
- registrationCourt,
101
- businessType: status,
168
+ }
169
+ /**
170
+ * Search for a company by name and return basic info
171
+ */
172
+ async searchCompany(companyNameArg) {
173
+ return this.asyncExecutionStack.getExclusiveExecutionSlot(async () => {
174
+ const page = await this.getNewPage();
175
+ await this.navigateToPage(page, 'Normal search');
176
+ try {
177
+ // Wait for the textarea to appear
178
+ await page.waitForSelector('#form\\:schlagwoerter', { timeout: 5000 });
179
+ // Enter text into the textarea
180
+ const inputText = companyNameArg;
181
+ await page.evaluate((text) => {
182
+ const textarea = document.querySelector('#form\\:schlagwoerter');
183
+ if (textarea) {
184
+ textarea.value = text; // Set the value
185
+ // Trigger the change event manually if required
186
+ const event = new Event('change', { bubbles: true });
187
+ textarea.dispatchEvent(event);
188
+ }
189
+ }, inputText);
190
+ console.log('Text entered successfully!');
191
+ }
192
+ catch (error) {
193
+ console.error('Failed to find or enter text into the textarea:', error);
194
+ }
195
+ try {
196
+ // Wait for the radio button's label to appear
197
+ await page.waitForSelector('label[for="form:schlagwortOptionen:0"]', { timeout: 5000 });
198
+ // Click the label to select the radio button
199
+ await page.evaluate(() => {
200
+ const label = document.querySelector('label[for="form:schlagwortOptionen:0"]');
201
+ if (label) {
202
+ label.click();
203
+ }
102
204
  });
103
- });
104
- return records;
105
- });
106
- await page.close();
107
- // Finally, we return an object, which triggers a JSON file download
108
- return businessRecords;
205
+ console.log('Radio button clicked successfully!');
206
+ }
207
+ catch (error) {
208
+ console.error('Failed to find or click the radio button:', error);
209
+ }
210
+ await this.clickFindButton(page);
211
+ const businessRecords = await this.waitForResults(page);
212
+ // Parse out the registration info
213
+ for (const record of businessRecords) {
214
+ if (record.registrationId) {
215
+ record.germanParsedRegistration = await this.parseGermanRegistration(record.registrationId);
216
+ }
217
+ }
218
+ await page.close();
219
+ return businessRecords;
220
+ }, 60000);
221
+ }
222
+ /**
223
+ * Search for a specific company (known register type/number/court),
224
+ * then click on an element that triggers a file download.
225
+ */
226
+ async getSpecificCompany(companyArg) {
227
+ return this.asyncExecutionStack.getExclusiveExecutionSlot(async () => {
228
+ const page = await this.getNewPage();
229
+ await this.navigateToPage(page, 'Normal search');
230
+ await page.waitForSelector('#form\\:schlagwoerter', { timeout: 5000 });
231
+ // 1) Type of Register (e.g. HRB, HRA, etc.)
232
+ await page.waitForSelector('#form\\:registerArt_label');
233
+ await page.click('#form\\:registerArt_label');
234
+ await page.waitForSelector('#form\\:registerArt_items');
235
+ await page.evaluate((type) => {
236
+ const options = Array.from(document.querySelectorAll('#form\\:registerArt_items li'));
237
+ const targetOption = options.find((option) => option.textContent?.trim() === type);
238
+ targetOption?.click();
239
+ }, companyArg.type);
240
+ // 2) Register number
241
+ await page.waitForSelector('#form\\:registerNummer');
242
+ await page.type('#form\\:registerNummer', companyArg.number);
243
+ // 3) Register court
244
+ await page.waitForSelector('#form\\:registergericht_label');
245
+ await page.click('#form\\:registergericht_label');
246
+ await page.waitForSelector('#form\\:registergericht_items');
247
+ await page.evaluate((court) => {
248
+ const options = Array.from(document.querySelectorAll('#form\\:registergericht_items li'));
249
+ const targetOption = options.find((option) => option.textContent?.trim() === court);
250
+ targetOption?.click();
251
+ }, companyArg.court);
252
+ // Click 'Find'
253
+ await this.clickFindButton(page);
254
+ // Optionally grab the results, just for logging
255
+ const businessRecords = await this.waitForResults(page);
256
+ console.log(businessRecords);
257
+ const files = [];
258
+ // download files
259
+ files.push(await this.downloadFile(page, 'SI'));
260
+ files.push(await this.downloadFile(page, 'AD'));
261
+ // At this point, the file should have been downloaded automatically
262
+ // to the path specified by `Page.setDownloadBehavior`
263
+ await page.close();
264
+ return {
265
+ businessRecords,
266
+ files,
267
+ };
268
+ }, 60000);
109
269
  }
110
270
  }
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5oYW5kZWxzcmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmhhbmRlbHNyZWdpc3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4Qzs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBSzFCLFlBQVksV0FBcUI7UUFGMUIseUJBQW9CLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBR3BFLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUk7UUFDZixNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsY0FBc0I7UUFDbkQsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDbkQsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUN2QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUM7WUFDbkYsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxD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
271
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5oYW5kZWxzcmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmhhbmRlbHNyZWdpc3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUVwQzs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBUTFCLFlBQVksV0FBcUI7UUFOekIsd0JBQW1CLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDNUQsd0JBQW1CLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFFcEcsNkJBQTZCO1FBQ3RCLHlCQUFvQixHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQWtCdEU7OztXQUdHO1FBQ0ksZUFBVSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQzdCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUV2RSw2Q0FBNkM7WUFDN0MsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUUxRCxvREFBb0Q7WUFDcEQsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO2dCQUNoRCxRQUFRLEVBQUUsT0FBTztnQkFDakIsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxnREFBZ0Q7YUFDekYsQ0FBQyxDQUFDO1lBRUgseUNBQXlDO1lBQ3pDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUs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
@@ -37,6 +37,8 @@ export class JsonlDataProcessor {
37
37
  continue;
38
38
  try {
39
39
  entry = JSON.parse(line);
40
+ console.log(JSON.stringify(entry, null, 2));
41
+ process.exit(0);
40
42
  }
41
43
  catch (err) {
42
44
  console.log(line);
@@ -72,4 +74,4 @@ export class JsonlDataProcessor {
72
74
  return businessRecord;
73
75
  }
74
76
  }
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5qc29ubGRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmpzb25sZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUdwQyxNQUFNLE9BQU8sa0JBQWtCO0lBRTdCLFlBQVksY0FBd0I7UUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7SUFDcEMsQ0FBQztJQUVELDhEQUE4RDtJQUN2RCxLQUFLLENBQUMsa0JBQWtCLENBQUMsVUFBVSxHQUFHLCtEQUErRDtRQUMxRyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFDLE1BQU0sWUFBWSxHQUFtQixFQUFFLENBQUM7UUFDeEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7YUFBTSxDQUFDO1FBQ1IsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hGLFlBQVk7YUFDVCxJQUFJLEVBRUgsQ0FBQztRQUNMLE1BQU0sZUFBZSxHQUFHLE1BQU0sWUFBWSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDekUsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxRQUFRLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGVBQWUsQ0FB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
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5qc29ubGRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmpzb25sZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUdwQyxNQUFNLE9BQU8sa0JBQWtCO0lBRTdCLFlBQVksY0FBd0I7UUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7SUFDcEMsQ0FBQztJQUVELDhEQUE4RDtJQUN2RCxLQUFLLENBQUMsa0JBQWtCLENBQUMsVUFBVSxHQUFHLCtEQUErRDtRQUMxRyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFDLE1BQU0sWUFBWSxHQUFtQixFQUFFLENBQUM7UUFDeEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7YUFBTSxDQUFDO1FBQ1IsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hGLFlBQVk7YUFDVCxJQUFJLEVBRUgsQ0FBQztRQUNMLE1BQU0sZUFBZSxHQUFHLE1BQU0sWUFBWSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDekUsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxRQUFRLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGVBQWUsQ0FB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
@@ -9,5 +9,6 @@ export declare class OpenData {
9
9
  handelsregister: HandelsRegister;
10
10
  CBusinessRecord: typeof BusinessRecord;
11
11
  start(): Promise<void>;
12
+ buildInitialDb(): Promise<void>;
12
13
  stop(): Promise<void>;
13
14
  }
@@ -20,9 +20,12 @@ export class OpenData {
20
20
  this.handelsregister = new HandelsRegister(this);
21
21
  await this.handelsregister.start();
22
22
  }
23
+ async buildInitialDb() {
24
+ await this.jsonLDataProcessor.processDataFromUrl();
25
+ }
23
26
  async stop() {
24
27
  await this.db.close();
25
28
  await this.handelsregister.stop();
26
29
  }
27
30
  }
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5tYWluLm9wZW5kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5tYWluLm9wZW5kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxLQUFLLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxPQUFPLFFBQVE7SUFBckI7UUFFVSxnQkFBVyxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFLdkUsb0JBQWUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztJQWtCM0YsQ0FBQztJQWhCUSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7WUFDeEMsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7WUFDbkUsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUM7WUFDckUsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUM7WUFDckUsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUM7U0FDeEUsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFDTSxLQUFLLENBQUMsSUFBSTtRQUNmLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEMsQ0FBQztDQUNGIn0=
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5tYWluLm9wZW5kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5tYWluLm9wZW5kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxLQUFLLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxPQUFPLFFBQVE7SUFBckI7UUFFVSxnQkFBVyxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFLdkUsb0JBQWUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztJQXVCM0YsQ0FBQztJQXJCUSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7WUFDeEMsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7WUFDbkUsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUM7WUFDckUsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUM7WUFDckUsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUM7U0FDeEUsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTSxLQUFLLENBQUMsY0FBYztRQUN6QixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSTtRQUNmLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEMsQ0FBQztDQUNGIn0=
@@ -1,3 +1,4 @@
1
1
  export declare const packageDir: string;
2
2
  export declare const nogitDir: string;
3
+ export declare const downloadDir: string;
3
4
  export declare const germanBusinessDataDir: string;
package/dist_ts/paths.js CHANGED
@@ -2,5 +2,7 @@ import * as plugins from './plugins.js';
2
2
  export const packageDir = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../');
3
3
  export const nogitDir = plugins.path.join(packageDir, './.nogit/');
4
4
  plugins.smartfile.fs.ensureDirSync(nogitDir);
5
+ export const downloadDir = plugins.path.join(nogitDir, 'downloads');
6
+ plugins.smartfile.fs.ensureDirSync(downloadDir);
5
7
  export const germanBusinessDataDir = plugins.path.join(nogitDir, 'germanbusinessdata');
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9wYXRocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ3pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQy9ELEtBQUssQ0FDTixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNuRSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFN0MsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUMifQ==
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9wYXRocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ3pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQy9ELEtBQUssQ0FDTixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNuRSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFN0MsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNwRSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7QUFHaEQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUMifQ==
@@ -1,5 +1,6 @@
1
1
  import * as path from 'path';
2
2
  export { path, };
3
+ import * as lik from '@push.rocks/lik';
3
4
  import * as qenv from '@push.rocks/qenv';
4
5
  import * as smartarchive from '@push.rocks/smartarchive';
5
6
  import * as smartbrowser from '@push.rocks/smartbrowser';
@@ -10,4 +11,7 @@ import * as smartpath from '@push.rocks/smartpath';
10
11
  import * as smartpromise from '@push.rocks/smartpromise';
11
12
  import * as smartrequest from '@push.rocks/smartrequest';
12
13
  import * as smartstream from '@push.rocks/smartstream';
13
- export { qenv, smartarchive, smartbrowser, smartdata, smartdelay, smartfile, smartpath, smartpromise, smartrequest, smartstream, };
14
+ import * as smartunique from '@push.rocks/smartunique';
15
+ export { lik, qenv, smartarchive, smartbrowser, smartdata, smartdelay, smartfile, smartpath, smartpromise, smartrequest, smartstream, smartunique, };
16
+ import * as tsclass from '@tsclass/tsclass';
17
+ export { tsclass, };
@@ -2,6 +2,7 @@
2
2
  import * as path from 'path';
3
3
  export { path, };
4
4
  // @push.rocks scope
5
+ import * as lik from '@push.rocks/lik';
5
6
  import * as qenv from '@push.rocks/qenv';
6
7
  import * as smartarchive from '@push.rocks/smartarchive';
7
8
  import * as smartbrowser from '@push.rocks/smartbrowser';
@@ -12,5 +13,9 @@ import * as smartpath from '@push.rocks/smartpath';
12
13
  import * as smartpromise from '@push.rocks/smartpromise';
13
14
  import * as smartrequest from '@push.rocks/smartrequest';
14
15
  import * as smartstream from '@push.rocks/smartstream';
15
- export { qenv, smartarchive, smartbrowser, smartdata, smartdelay, smartfile, smartpath, smartpromise, smartrequest, smartstream, };
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFDTCxJQUFJLEdBQ0wsQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssSUFBSSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE9BQU8sRUFDTCxJQUFJLEVBQ0osWUFBWSxFQUNaLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLFNBQVMsRUFDVCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixXQUFXLEdBQ1osQ0FBQSJ9
16
+ import * as smartunique from '@push.rocks/smartunique';
17
+ export { lik, qenv, smartarchive, smartbrowser, smartdata, smartdelay, smartfile, smartpath, smartpromise, smartrequest, smartstream, smartunique, };
18
+ // @tsclass scope
19
+ import * as tsclass from '@tsclass/tsclass';
20
+ export { tsclass, };
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFDTCxJQUFJLEdBQ0wsQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssR0FBRyxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxJQUFJLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RCxPQUFPLEVBQ0wsR0FBRyxFQUNILElBQUksRUFDSixZQUFZLEVBQ1osWUFBWSxFQUNaLFNBQVMsRUFDVCxVQUFVLEVBQ1YsU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLFdBQVcsRUFDWCxXQUFXLEdBQ1osQ0FBQTtBQUVELGlCQUFpQjtBQUNqQixPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8sRUFDTCxPQUFPLEdBQ1IsQ0FBQSJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fin.cx/opendata",
3
- "version": "1.2.0",
3
+ "version": "1.4.0",
4
4
  "private": false,
5
5
  "description": "A TypeScript library for accessing, managing, and updating open business data, focused on German companies and integrating with MongoDB.",
6
6
  "main": "dist_ts/index.js",
@@ -14,19 +14,22 @@
14
14
  "@git.zone/tsrun": "^1.3.3",
15
15
  "@git.zone/tstest": "^1.0.90",
16
16
  "@push.rocks/tapbundle": "^5.5.4",
17
- "@types/node": "^22.10.2"
17
+ "@types/node": "^22.10.4"
18
18
  },
19
19
  "dependencies": {
20
+ "@push.rocks/lik": "^6.1.0",
20
21
  "@push.rocks/qenv": "^6.1.0",
21
22
  "@push.rocks/smartarchive": "^4.0.39",
22
- "@push.rocks/smartbrowser": "^2.0.6",
23
+ "@push.rocks/smartbrowser": "^2.0.8",
23
24
  "@push.rocks/smartdata": "^5.2.10",
24
25
  "@push.rocks/smartdelay": "^3.0.5",
25
26
  "@push.rocks/smartfile": "^11.0.23",
26
27
  "@push.rocks/smartpath": "^5.0.18",
27
28
  "@push.rocks/smartpromise": "^4.0.4",
28
29
  "@push.rocks/smartrequest": "^2.0.23",
29
- "@push.rocks/smartstream": "^3.2.5"
30
+ "@push.rocks/smartstream": "^3.2.5",
31
+ "@push.rocks/smartunique": "^3.0.9",
32
+ "@tsclass/tsclass": "^4.2.0"
30
33
  },
31
34
  "repository": {
32
35
  "type": "git",
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@fin.cx/opendata',
6
- version: '1.2.0',
6
+ version: '1.4.0',
7
7
  description: 'A TypeScript library for accessing, managing, and updating open business data, focused on German companies and integrating with MongoDB.'
8
8
  }
@@ -1,32 +1,45 @@
1
1
  import * as plugins from './plugins.js';
2
2
 
3
3
  @plugins.smartdata.Manager()
4
- export class BusinessRecord extends plugins.smartdata.SmartDataDbDoc<BusinessRecord, BusinessRecord> {
5
-
4
+ export class BusinessRecord extends plugins.smartdata.SmartDataDbDoc<
5
+ BusinessRecord,
6
+ BusinessRecord
7
+ > {
6
8
  @plugins.smartdata.unI()
7
9
  id: string;
8
-
10
+
9
11
  @plugins.smartdata.svDb()
10
12
  data: {
11
- name?: string,
12
- address?: string,
13
- postalCode?: string,
14
- city?: string,
15
- country?: string,
16
- phone?: string,
17
- fax?: string,
18
- email?: string,
19
- website?: string,
20
- businessType?: string,
21
- registrationNumber?: string,
22
- registrationCourt?: string,
23
- legalForm?: string,
24
- managingDirectors?: string[],
25
- boardOfDirectors?: string[],
26
- supervisoryBoard?: string[],
27
- foundingDate?: string,
28
- capital?: string,
29
- purpose?: string,
30
- lastUpdate?: string
13
+ name?: string;
14
+ address?: string;
15
+ postalCode?: string;
16
+ city?: string;
17
+ country?: string;
18
+ phone?: string;
19
+ fax?: string;
20
+ email?: string;
21
+ website?: string;
22
+ businessType?: string;
23
+ registrationId?: string;
24
+ germanParsedRegistration?: {
25
+ court?: string;
26
+ type?: 'HRA' | 'HRB' | 'GnR' | 'PR' | 'VR' | 'GsR';
27
+ number?: string;
28
+ };
29
+ legalForm?:
30
+ | 'GmbH'
31
+ | 'GmbH & Co. KG'
32
+ | 'AG'
33
+ | 'LLC'
34
+ | 'LLP'
35
+ | 'GmbH & Co. KGaA'
36
+ | 'GmbH & Co. KGaA, LLC';
37
+ managingDirectors?: string[];
38
+ boardOfDirectors?: string[];
39
+ supervisoryBoard?: string[];
40
+ foundingDate?: string;
41
+ capital?: string;
42
+ purpose?: string;
43
+ lastUpdate?: string;
31
44
  } = {};
32
- }
45
+ }
@@ -1,12 +1,17 @@
1
+ import type { BusinessRecord } from './classes.businessrecord.js';
1
2
  import type { OpenData } from './classes.main.opendata.js';
2
3
  import * as plugins from './plugins.js';
4
+ import * as paths from './paths.js';
3
5
 
4
6
  /**
5
7
  * the HandlesRegister exposed as a class
6
8
  */
7
9
  export class HandelsRegister {
8
10
  private openDataRef: OpenData;
11
+ private asyncExecutionStack = new plugins.lik.AsyncExecutionStack();
12
+ private uniqueDowloadFolder = plugins.path.join(paths.downloadDir, plugins.smartunique.uniSimple());
9
13
 
14
+ // Puppeteer wrapper instance
10
15
  public smartbrowserInstance = new plugins.smartbrowser.SmartBrowser();
11
16
 
12
17
  constructor(openDataRef: OpenData) {
@@ -14,96 +19,72 @@ export class HandelsRegister {
14
19
  }
15
20
 
16
21
  public async start() {
22
+ // Start the browser
23
+ await plugins.smartfile.fs.ensureDir(this.uniqueDowloadFolder);
17
24
  await this.smartbrowserInstance.start();
18
25
  }
19
26
 
20
27
  public async stop() {
28
+ // Stop the browser
29
+ await plugins.smartfile.fs.remove(this.uniqueDowloadFolder);
21
30
  await this.smartbrowserInstance.stop();
22
31
  }
23
32
 
24
33
  /**
25
- * Search for a company by name
34
+ * Creates a new page and configures it to allow file downloads
35
+ * to a predefined path.
26
36
  */
27
- public async getDataForCompany(companyNameArg: string) {
37
+ public getNewPage = async () => {
28
38
  const page = await this.smartbrowserInstance.headlessBrowser.newPage();
29
- await page.setViewport({ width: 1920, height: 1080 });
30
- await page.goto('https://www.handelsregister.de/');
31
- await page.evaluate(() => {
32
- const elements = Array.from(document.querySelectorAll('.ui-menuitem-text > span'));
33
- const targetElement = elements.find((el) => el.textContent?.trim() === 'Normal search');
34
- if (targetElement) {
35
- (targetElement as HTMLElement).click();
36
- }
37
- });
38
39
 
39
- try {
40
- // Wait for the textarea to appear
41
- await page.waitForSelector('#form\\:schlagwoerter', { timeout: 5000 });
40
+ // 1) Create a DevTools session for this page
41
+ const cdpSession = await page.target().createCDPSession();
42
42
 
43
- // Enter text into the textarea using page.evaluate
44
- const inputText = companyNameArg;
45
- await page.evaluate((text) => {
46
- const textarea = document.querySelector<HTMLTextAreaElement>('#form\\:schlagwoerter');
47
- if (textarea) {
48
- textarea.value = text; // Set the value
49
- // Trigger the change event manually if required
50
- const event = new Event('change', { bubbles: true });
51
- textarea.dispatchEvent(event);
52
- }
53
- }, inputText);
43
+ // 2) Allow file downloads and set the download path
44
+ await cdpSession.send('Page.setDownloadBehavior', {
45
+ behavior: 'allow',
46
+ downloadPath: this.uniqueDowloadFolder, // <-- Change this to your desired absolute path
47
+ });
54
48
 
55
- console.log('Text entered successfully!');
56
- } catch (error) {
57
- console.error('Failed to find or enter text into the textarea:', error);
58
- }
49
+ // Optionally set viewport and go to page
50
+ await page.setViewport({ width: 1920, height: 1080 });
51
+ await page.goto('https://www.handelsregister.de/');
52
+ return page;
53
+ };
59
54
 
55
+ private navigateToPage = async (
56
+ pageArg: plugins.smartbrowser.smartpuppeteer.puppeteer.Page,
57
+ pageNameArg: string
58
+ ) => {
60
59
  try {
61
- // Wait for the radio button's label to appear
62
- await page.waitForSelector('label[for="form:schlagwortOptionen:0"]', { timeout: 5000 });
63
-
64
- // Click the label to select the radio button
65
- await page.evaluate(() => {
66
- const label = document.querySelector<HTMLLabelElement>(
67
- 'label[for="form:schlagwortOptionen:0"]'
68
- );
69
- if (label) {
70
- label.click();
60
+ await pageArg.evaluate((pageNameArg2) => {
61
+ const elements = Array.from(document.querySelectorAll('.ui-menuitem-text > span'));
62
+ const targetElement = elements.find((el) => el.textContent?.trim() === pageNameArg2);
63
+ if (targetElement) {
64
+ (targetElement as HTMLElement).click();
71
65
  }
72
- });
73
-
74
- console.log('Radio button clicked successfully!');
66
+ }, pageNameArg);
67
+ console.log(`Navigated to the ${pageNameArg} page successfully.`);
75
68
  } catch (error) {
76
- console.error('Failed to find or click the radio button:', error);
69
+ console.error(`Failed to navigate to the ${pageNameArg} page:`, error);
77
70
  }
71
+ };
78
72
 
79
- try {
80
- // Wait for the button with the text "Find" to appear
81
- await page.waitForSelector('span.ui-button-text.ui-c', { timeout: 5000 });
82
-
83
- // Locate and click the button using its text
84
- await page.evaluate(() => {
85
- const buttons = Array.from(document.querySelectorAll('span.ui-button-text.ui-c'));
86
- const targetButton = buttons.find((button) => button.textContent?.trim() === 'Find');
87
- if (targetButton) {
88
- const parentButton = targetButton.closest('button') || targetButton;
89
- (parentButton as HTMLElement).click();
90
- }
73
+ private waitForResults = async (pageArg: plugins.smartbrowser.smartpuppeteer.puppeteer.Page) => {
74
+ await pageArg
75
+ .waitForSelector('#ergebnissForm\\:selectedSuchErgebnisFormTable_data', {
76
+ timeout: 30000,
77
+ })
78
+ .catch(async (err) => {
79
+ await pageArg.screenshot({ path: paths.downloadDir + '/error.png' });
80
+ throw err;
91
81
  });
92
82
 
93
- console.log('Find button clicked successfully!');
94
- } catch (error) {
95
- console.error('Failed to find or click the "Find" button:', error);
96
- }
97
-
98
- await page.waitForSelector('#ergebnissForm\\:selectedSuchErgebnisFormTable_data', {
99
- timeout: 10000,
100
- });
101
-
102
- const businessRecords = await page.evaluate(() => {
83
+ const businessRecords: BusinessRecord['data'][] = await pageArg.evaluate(() => {
103
84
  const rows = document.querySelectorAll(
104
85
  '#ergebnissForm\\:selectedSuchErgebnisFormTable_data > tr'
105
86
  );
106
- const records = [];
87
+ const records: BusinessRecord['data'][] = [];
107
88
 
108
89
  rows.forEach((row) => {
109
90
  const nameElement = row.querySelector('td.ui-panelgrid-cell span.marginLeft20');
@@ -116,23 +97,243 @@ export class HandelsRegister {
116
97
  const name = nameElement?.textContent?.trim();
117
98
  const city = cityElement?.textContent?.trim();
118
99
  const status = statusElement?.textContent?.trim();
119
- const registrationCourt = registrationCourtElement?.textContent?.trim();
100
+ const registrationId = registrationCourtElement?.textContent?.trim();
120
101
 
121
102
  // Push parsed data into records array
122
103
  records.push({
123
104
  name,
124
105
  city,
125
- registrationCourt,
106
+ registrationId,
126
107
  businessType: status,
127
108
  });
128
109
  });
129
110
 
130
111
  return records;
131
112
  });
113
+ return businessRecords;
114
+ };
115
+
116
+ private clickFindButton = async (pageArg: plugins.smartbrowser.smartpuppeteer.puppeteer.Page) => {
117
+ try {
118
+ // Wait for the button with the text "Find" to appear
119
+ await pageArg.waitForSelector('span.ui-button-text.ui-c', { timeout: 5000 });
132
120
 
133
- await page.close();
121
+ // adjust to 100 results per page
122
+ await pageArg.select('#form\\:ergebnisseProSeite_input', '100');
134
123
 
135
- // Finally, we return an object, which triggers a JSON file download
136
- return businessRecords;
124
+ // Locate and click the button using its text
125
+ await pageArg.evaluate(() => {
126
+ const buttons = Array.from(document.querySelectorAll('span.ui-button-text.ui-c'));
127
+ const targetButton = buttons.find((button) => button.textContent?.trim() === 'Find');
128
+ if (targetButton) {
129
+ const parentButton = targetButton.closest('button') || targetButton;
130
+ (parentButton as HTMLElement).click();
131
+ }
132
+ });
133
+
134
+ console.log('Find button clicked successfully!');
135
+ } catch (error) {
136
+ console.error('Failed to find or click the "Find" button:', error);
137
+ }
138
+ };
139
+
140
+ private async downloadFile(
141
+ pageArg: plugins.smartbrowser.smartpuppeteer.puppeteer.Page,
142
+ typeArg: 'SI' | 'AD'
143
+ ) {
144
+ // Trigger the file download by clicking on the relevant link
145
+ await pageArg.evaluate((typeArg2) => {
146
+ // Locate the table body
147
+ const tableBody = document.querySelector(
148
+ '#ergebnissForm\\:selectedSuchErgebnisFormTable_data'
149
+ );
150
+ if (!tableBody) {
151
+ throw new Error('Table body not found');
152
+ }
153
+
154
+ // Locate the first row
155
+ const firstRow = tableBody.querySelector('tr:nth-child(1)');
156
+ if (!firstRow) {
157
+ throw new Error('First row not found');
158
+ }
159
+
160
+ // Locate the last cell in the first row
161
+ const lastCell = firstRow.querySelector('td:last-child');
162
+ if (!lastCell) {
163
+ throw new Error('Last cell not found in the first row');
164
+ }
165
+
166
+ // Locate the download links
167
+ const adLink = lastCell.querySelector('a:first-of-type');
168
+ const siLink = lastCell.querySelector('a:last-of-type');
169
+ if (!siLink) {
170
+ throw new Error('SI link not found in the last cell');
171
+ }
172
+
173
+ // Simulate a click on the last <a> element
174
+ switch (typeArg2) {
175
+ case 'AD':
176
+ (adLink as HTMLElement).click();
177
+ break;
178
+ case 'SI':
179
+ (siLink as HTMLElement).click();
180
+ break;
181
+ default:
182
+ throw new Error('Invalid file type');
183
+ }
184
+ }, typeArg);
185
+
186
+ // Wait a bit for the download to complete (you might want to implement
187
+ // a more robust file-exists check or a wait-for-download library)
188
+ await pageArg.waitForTimeout(10000);
189
+
190
+ const files = await plugins.smartfile.fs.fileTreeToObject(this.uniqueDowloadFolder, '**/*');
191
+ await plugins.smartfile.fs.ensureEmptyDir(this.uniqueDowloadFolder);
192
+
193
+ return files [0];
194
+ }
195
+
196
+ /**
197
+ * Helper method to parse the German registration string
198
+ */
199
+ private async parseGermanRegistration(
200
+ input: string
201
+ ): Promise<BusinessRecord['data']['germanParsedRegistration']> {
202
+ // e.g. District court Berlin (Charlottenburg) HRB 123456
203
+ const regex =
204
+ /District court (\p{L}[\p{L}\s-]*?(?:\s*\([\p{L}\s-]+\))?)\s+(HRA|HRB|GnR|VR|PR|GsR)\s+(\d+)/u;
205
+ const match = input.match(regex);
206
+
207
+ if (match) {
208
+ return {
209
+ court: match[1],
210
+ type: match[2] as 'HRA' | 'HRB', // Adjust if needed
211
+ number: match[3],
212
+ };
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Search for a company by name and return basic info
218
+ */
219
+ public async searchCompany(companyNameArg: string) {
220
+ return this.asyncExecutionStack.getExclusiveExecutionSlot(async () => {
221
+ const page = await this.getNewPage();
222
+ await this.navigateToPage(page, 'Normal search');
223
+
224
+ try {
225
+ // Wait for the textarea to appear
226
+ await page.waitForSelector('#form\\:schlagwoerter', { timeout: 5000 });
227
+
228
+ // Enter text into the textarea
229
+ const inputText = companyNameArg;
230
+ await page.evaluate((text) => {
231
+ const textarea = document.querySelector<HTMLTextAreaElement>('#form\\:schlagwoerter');
232
+ if (textarea) {
233
+ textarea.value = text; // Set the value
234
+ // Trigger the change event manually if required
235
+ const event = new Event('change', { bubbles: true });
236
+ textarea.dispatchEvent(event);
237
+ }
238
+ }, inputText);
239
+
240
+ console.log('Text entered successfully!');
241
+ } catch (error) {
242
+ console.error('Failed to find or enter text into the textarea:', error);
243
+ }
244
+
245
+ try {
246
+ // Wait for the radio button's label to appear
247
+ await page.waitForSelector('label[for="form:schlagwortOptionen:0"]', { timeout: 5000 });
248
+
249
+ // Click the label to select the radio button
250
+ await page.evaluate(() => {
251
+ const label = document.querySelector<HTMLLabelElement>(
252
+ 'label[for="form:schlagwortOptionen:0"]'
253
+ );
254
+ if (label) {
255
+ label.click();
256
+ }
257
+ });
258
+
259
+ console.log('Radio button clicked successfully!');
260
+ } catch (error) {
261
+ console.error('Failed to find or click the radio button:', error);
262
+ }
263
+
264
+ await this.clickFindButton(page);
265
+
266
+ const businessRecords = await this.waitForResults(page);
267
+
268
+ // Parse out the registration info
269
+ for (const record of businessRecords) {
270
+ if (record.registrationId) {
271
+ record.germanParsedRegistration = await this.parseGermanRegistration(
272
+ record.registrationId
273
+ );
274
+ }
275
+ }
276
+
277
+ await page.close();
278
+ return businessRecords;
279
+ }, 60000);
280
+ }
281
+
282
+ /**
283
+ * Search for a specific company (known register type/number/court),
284
+ * then click on an element that triggers a file download.
285
+ */
286
+ public async getSpecificCompany(companyArg: BusinessRecord['data']['germanParsedRegistration']) {
287
+ return this.asyncExecutionStack.getExclusiveExecutionSlot(async () => {
288
+ const page = await this.getNewPage();
289
+ await this.navigateToPage(page, 'Normal search');
290
+ await page.waitForSelector('#form\\:schlagwoerter', { timeout: 5000 });
291
+
292
+ // 1) Type of Register (e.g. HRB, HRA, etc.)
293
+ await page.waitForSelector('#form\\:registerArt_label');
294
+ await page.click('#form\\:registerArt_label');
295
+ await page.waitForSelector('#form\\:registerArt_items');
296
+ await page.evaluate((type) => {
297
+ const options = Array.from(document.querySelectorAll('#form\\:registerArt_items li'));
298
+ const targetOption = options.find((option) => option.textContent?.trim() === type);
299
+ (targetOption as HTMLElement)?.click();
300
+ }, companyArg.type);
301
+
302
+ // 2) Register number
303
+ await page.waitForSelector('#form\\:registerNummer');
304
+ await page.type('#form\\:registerNummer', companyArg.number);
305
+
306
+ // 3) Register court
307
+ await page.waitForSelector('#form\\:registergericht_label');
308
+ await page.click('#form\\:registergericht_label');
309
+ await page.waitForSelector('#form\\:registergericht_items');
310
+ await page.evaluate((court) => {
311
+ const options = Array.from(document.querySelectorAll('#form\\:registergericht_items li'));
312
+ const targetOption = options.find((option) => option.textContent?.trim() === court);
313
+ (targetOption as HTMLElement)?.click();
314
+ }, companyArg.court);
315
+
316
+ // Click 'Find'
317
+ await this.clickFindButton(page);
318
+
319
+ // Optionally grab the results, just for logging
320
+ const businessRecords = await this.waitForResults(page);
321
+ console.log(businessRecords);
322
+
323
+ const files: plugins.smartfile.SmartFile[] = [];
324
+
325
+ // download files
326
+ files.push(await this.downloadFile(page, 'SI'));
327
+ files.push(await this.downloadFile(page, 'AD'));
328
+
329
+ // At this point, the file should have been downloaded automatically
330
+ // to the path specified by `Page.setDownloadBehavior`
331
+ await page.close();
332
+
333
+ return {
334
+ businessRecords,
335
+ files,
336
+ };
337
+ }, 60000);
137
338
  }
138
339
  }
@@ -44,6 +44,8 @@ export class JsonlDataProcessor {
44
44
  if (!line) continue;
45
45
  try {
46
46
  entry = JSON.parse(line);
47
+ console.log(JSON.stringify(entry, null, 2));
48
+ process.exit(0);
47
49
  } catch (err) {
48
50
  console.log(line);
49
51
  await plugins.smartdelay.delayFor(10000);
@@ -25,6 +25,11 @@ export class OpenData {
25
25
  this.handelsregister = new HandelsRegister(this);
26
26
  await this.handelsregister.start();
27
27
  }
28
+
29
+ public async buildInitialDb() {
30
+ await this.jsonLDataProcessor.processDataFromUrl();
31
+ }
32
+
28
33
  public async stop() {
29
34
  await this.db.close();
30
35
  await this.handelsregister.stop();
package/ts/paths.ts CHANGED
@@ -8,4 +8,8 @@ export const packageDir = plugins.path.join(
8
8
  export const nogitDir = plugins.path.join(packageDir, './.nogit/');
9
9
  plugins.smartfile.fs.ensureDirSync(nogitDir);
10
10
 
11
+ export const downloadDir = plugins.path.join(nogitDir, 'downloads');
12
+ plugins.smartfile.fs.ensureDirSync(downloadDir);
13
+
14
+
11
15
  export const germanBusinessDataDir = plugins.path.join(nogitDir, 'germanbusinessdata');
package/ts/plugins.ts CHANGED
@@ -6,6 +6,7 @@ export {
6
6
  }
7
7
 
8
8
  // @push.rocks scope
9
+ import * as lik from '@push.rocks/lik';
9
10
  import * as qenv from '@push.rocks/qenv';
10
11
  import * as smartarchive from '@push.rocks/smartarchive';
11
12
  import * as smartbrowser from '@push.rocks/smartbrowser';
@@ -16,8 +17,10 @@ import * as smartpath from '@push.rocks/smartpath';
16
17
  import * as smartpromise from '@push.rocks/smartpromise';
17
18
  import * as smartrequest from '@push.rocks/smartrequest';
18
19
  import * as smartstream from '@push.rocks/smartstream';
20
+ import * as smartunique from '@push.rocks/smartunique';
19
21
 
20
22
  export {
23
+ lik,
21
24
  qenv,
22
25
  smartarchive,
23
26
  smartbrowser,
@@ -28,4 +31,12 @@ export {
28
31
  smartpromise,
29
32
  smartrequest,
30
33
  smartstream,
31
- }
34
+ smartunique,
35
+ }
36
+
37
+ // @tsclass scope
38
+ import * as tsclass from '@tsclass/tsclass';
39
+
40
+ export {
41
+ tsclass,
42
+ }