doc2vec 1.0.4 → 1.1.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/doc2vec.js CHANGED
@@ -1245,10 +1245,11 @@ class Doc2Vec {
1245
1245
  async processPage(url, sourceConfig) {
1246
1246
  const logger = this.logger.child('page-processor');
1247
1247
  logger.debug(`Processing page content from ${url}`);
1248
- const browser = await puppeteer_1.default.launch({
1249
- args: ['--no-sandbox', '--disable-setuid-sandbox'],
1250
- });
1248
+ let browser = null;
1251
1249
  try {
1250
+ browser = await puppeteer_1.default.launch({
1251
+ args: ['--no-sandbox', '--disable-setuid-sandbox'],
1252
+ });
1252
1253
  const page = await browser.newPage();
1253
1254
  logger.debug(`Navigating to ${url}`);
1254
1255
  await page.goto(url, { waitUntil: 'networkidle2', timeout: 60000 });
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+ /**
3
+ * Enhanced Logger for structured and consistent logging
4
+ * Compatible with CommonJS and ESM environments
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.defaultLogger = exports.LogLevel = exports.Logger = void 0;
8
+ /**
9
+ * Logger levels with their corresponding numeric values
10
+ */
11
+ var LogLevel;
12
+ (function (LogLevel) {
13
+ LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
14
+ LogLevel[LogLevel["INFO"] = 1] = "INFO";
15
+ LogLevel[LogLevel["WARN"] = 2] = "WARN";
16
+ LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
17
+ LogLevel[LogLevel["NONE"] = 100] = "NONE";
18
+ })(LogLevel || (exports.LogLevel = LogLevel = {}));
19
+ /**
20
+ * Basic color functions that don't rely on external packages
21
+ */
22
+ const colors = {
23
+ gray: (text) => `\x1b[90m${text}\x1b[0m`,
24
+ blue: (text) => `\x1b[34m${text}\x1b[0m`,
25
+ yellow: (text) => `\x1b[33m${text}\x1b[0m`,
26
+ red: (text) => `\x1b[31m${text}\x1b[0m`,
27
+ green: (text) => `\x1b[32m${text}\x1b[0m`,
28
+ reset: (text) => `\x1b[0m${text}\x1b[0m`
29
+ };
30
+ /**
31
+ * Enhanced Logger class with color-coding, timestamp, and formatting
32
+ */
33
+ class Logger {
34
+ /**
35
+ * Create a new Logger instance
36
+ *
37
+ * @param moduleName Name of the module using this logger
38
+ * @param config Logger configuration options
39
+ */
40
+ constructor(moduleName, config) {
41
+ this.moduleName = moduleName;
42
+ this.config = {
43
+ level: LogLevel.INFO,
44
+ useTimestamp: true,
45
+ useColor: true,
46
+ prettyPrint: true,
47
+ ...config
48
+ };
49
+ }
50
+ /**
51
+ * Format a log message with timestamp, level, and module information
52
+ *
53
+ * @param level Log level for this message
54
+ * @param message The message to log
55
+ * @param args Additional arguments to include
56
+ * @returns Formatted log message
57
+ */
58
+ formatMessage(level, message, args = []) {
59
+ const timestamp = this.config.useTimestamp ?
60
+ `[${new Date().toISOString()}] ` : '';
61
+ const modulePrefix = this.moduleName ?
62
+ `[${this.moduleName}] ` : '';
63
+ const levelFormatted = `[${level.padEnd(5)}]`;
64
+ let formattedMessage = `${timestamp}${levelFormatted} ${modulePrefix}${message}`;
65
+ if (args.length > 0) {
66
+ const argsString = args.map(arg => {
67
+ if (arg instanceof Error) {
68
+ return `\n--- Error Details ---\nMessage: ${arg.message}\nStack:\n${arg.stack}\n--- End Error ---`;
69
+ }
70
+ else if (this.config.prettyPrint && typeof arg === 'object' && arg !== null) {
71
+ try {
72
+ return JSON.stringify(arg, null, 2);
73
+ }
74
+ catch (e) {
75
+ return "[Unserializable Object]";
76
+ }
77
+ }
78
+ else {
79
+ return String(arg);
80
+ }
81
+ }).join('\n');
82
+ if (this.config.prettyPrint) {
83
+ formattedMessage += `\n${argsString}`;
84
+ }
85
+ else {
86
+ formattedMessage += ` ${args.map(String).join(' ')}`;
87
+ }
88
+ }
89
+ return formattedMessage;
90
+ }
91
+ /**
92
+ * Apply color to a message based on log level
93
+ *
94
+ * @param level Log level
95
+ * @param message Message to color
96
+ * @returns Colored message
97
+ */
98
+ colorize(level, message) {
99
+ if (!this.config.useColor)
100
+ return message;
101
+ switch (level) {
102
+ case LogLevel.DEBUG:
103
+ return colors.gray(message);
104
+ case LogLevel.INFO:
105
+ return colors.blue(message);
106
+ case LogLevel.WARN:
107
+ return colors.yellow(message);
108
+ case LogLevel.ERROR:
109
+ return colors.red(message);
110
+ default:
111
+ return message;
112
+ }
113
+ }
114
+ /**
115
+ * Log a debug message
116
+ *
117
+ * @param message Message to log
118
+ * @param args Additional arguments
119
+ */
120
+ debug(message, ...args) {
121
+ if (this.config.level <= LogLevel.DEBUG) {
122
+ const formattedMessage = this.formatMessage('DEBUG', message, args);
123
+ console.log(this.colorize(LogLevel.DEBUG, formattedMessage));
124
+ }
125
+ }
126
+ /**
127
+ * Log an info message
128
+ *
129
+ * @param message Message to log
130
+ * @param args Additional arguments
131
+ */
132
+ info(message, ...args) {
133
+ if (this.config.level <= LogLevel.INFO) {
134
+ const formattedMessage = this.formatMessage('INFO', message, args);
135
+ console.log(this.colorize(LogLevel.INFO, formattedMessage));
136
+ }
137
+ }
138
+ /**
139
+ * Log a warning message
140
+ *
141
+ * @param message Message to log
142
+ * @param args Additional arguments
143
+ */
144
+ warn(message, ...args) {
145
+ if (this.config.level <= LogLevel.WARN) {
146
+ const formattedMessage = this.formatMessage('WARN', message, args);
147
+ console.warn(this.colorize(LogLevel.WARN, formattedMessage));
148
+ }
149
+ }
150
+ /**
151
+ * Log an error message
152
+ *
153
+ * @param message Message to log
154
+ * @param args Additional arguments
155
+ */
156
+ error(message, ...args) {
157
+ if (this.config.level <= LogLevel.ERROR) {
158
+ const formattedMessage = this.formatMessage('ERROR', message, args);
159
+ console.error(this.colorize(LogLevel.ERROR, formattedMessage));
160
+ }
161
+ }
162
+ /**
163
+ * Create a child logger with a more specific module name
164
+ *
165
+ * @param subModule Name of the sub-module
166
+ * @returns New logger instance
167
+ */
168
+ child(subModule) {
169
+ return new Logger(`${this.moduleName}:${subModule}`, this.config);
170
+ }
171
+ /**
172
+ * Format a section header to clearly separate logical parts of execution
173
+ *
174
+ * @param title Section title
175
+ * @returns Logger instance for chaining
176
+ */
177
+ section(title) {
178
+ if (this.config.level <= LogLevel.INFO) {
179
+ const separator = '='.repeat(Math.max(80 - title.length - 4, 10));
180
+ const message = `${separator} ${title} ${separator}`;
181
+ console.log(this.colorize(LogLevel.INFO, message));
182
+ }
183
+ return this;
184
+ }
185
+ /**
186
+ * Create a progress indicator
187
+ *
188
+ * @param title Title of the operation
189
+ * @param total Total number of items to process
190
+ * @returns Object with update and complete methods
191
+ */
192
+ progress(title, total) {
193
+ let current = 0;
194
+ const startTime = Date.now();
195
+ const update = (increment = 1, message) => {
196
+ if (this.config.level > LogLevel.INFO)
197
+ return;
198
+ current += increment;
199
+ const percentage = Math.min(Math.floor((current / total) * 100), 100);
200
+ const elapsed = (Date.now() - startTime) / 1000;
201
+ let rate = current / elapsed;
202
+ let timeRemaining = '';
203
+ if (rate > 0 && current < total) {
204
+ const remainingSecs = (total - current) / rate;
205
+ timeRemaining = `, ETA: ${Math.floor(remainingSecs / 60)}m ${Math.floor(remainingSecs % 60)}s`;
206
+ }
207
+ const progressBar = this.createProgressBar(percentage);
208
+ const statusMsg = message ? ` - ${message}` : '';
209
+ console.log(this.colorize(LogLevel.INFO, this.formatMessage('INFO', `${title}: ${progressBar} ${percentage}% (${current}/${total}${timeRemaining})${statusMsg}`)));
210
+ };
211
+ const complete = (message = 'Completed') => {
212
+ if (this.config.level > LogLevel.INFO)
213
+ return;
214
+ const elapsed = (Date.now() - startTime) / 1000;
215
+ const rate = total / elapsed;
216
+ console.log(this.colorize(LogLevel.INFO, this.formatMessage('INFO', `${title}: ${this.createProgressBar(100)} 100% (${total}/${total}) - ${message} in ${elapsed.toFixed(2)}s (${rate.toFixed(2)} items/sec)`)));
217
+ };
218
+ return { update, complete };
219
+ }
220
+ /**
221
+ * Create a visual progress bar
222
+ *
223
+ * @param percentage Completion percentage
224
+ * @returns Visual progress bar
225
+ */
226
+ createProgressBar(percentage) {
227
+ const width = 20;
228
+ const completeChars = Math.floor((percentage / 100) * width);
229
+ const incompleteChars = width - completeChars;
230
+ let bar = '[';
231
+ if (this.config.useColor) {
232
+ bar += colors.green('='.repeat(completeChars));
233
+ bar += ' '.repeat(incompleteChars);
234
+ }
235
+ else {
236
+ bar += '='.repeat(completeChars);
237
+ bar += ' '.repeat(incompleteChars);
238
+ }
239
+ bar += ']';
240
+ return bar;
241
+ }
242
+ }
243
+ exports.Logger = Logger;
244
+ // Create a default logger instance
245
+ const defaultLogger = new Logger('app');
246
+ exports.defaultLogger = defaultLogger;
package/dist/logger.js CHANGED
@@ -61,13 +61,29 @@ class Logger {
61
61
  const modulePrefix = this.moduleName ?
62
62
  `[${this.moduleName}] ` : '';
63
63
  const levelFormatted = `[${level.padEnd(5)}]`;
64
- const formattedMessage = `${timestamp}${levelFormatted} ${modulePrefix}${message}`;
64
+ let formattedMessage = `${timestamp}${levelFormatted} ${modulePrefix}${message}`;
65
65
  if (args.length > 0) {
66
+ const argsString = args.map(arg => {
67
+ if (arg instanceof Error) {
68
+ return `\n--- Error Details ---\nMessage: ${arg.message}\nStack:\n${arg.stack}\n--- End Error ---`;
69
+ }
70
+ else if (this.config.prettyPrint && typeof arg === 'object' && arg !== null) {
71
+ try {
72
+ return JSON.stringify(arg, null, 2);
73
+ }
74
+ catch (e) {
75
+ return "[Unserializable Object]";
76
+ }
77
+ }
78
+ else {
79
+ return String(arg);
80
+ }
81
+ }).join('\n');
66
82
  if (this.config.prettyPrint) {
67
- return `${formattedMessage}\n${args.map(arg => typeof arg === 'object' ? JSON.stringify(arg, null, 2) : arg).join('\n')}`;
83
+ formattedMessage += `\n${argsString}`;
68
84
  }
69
85
  else {
70
- return `${formattedMessage} ${args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : arg).join(' ')}`;
86
+ formattedMessage += ` ${args.map(String).join(' ')}`;
71
87
  }
72
88
  }
73
89
  return formattedMessage;
package/doc2vec.ts CHANGED
@@ -1467,10 +1467,11 @@ class Doc2Vec {
1467
1467
  const logger = this.logger.child('page-processor');
1468
1468
  logger.debug(`Processing page content from ${url}`);
1469
1469
 
1470
- const browser: Browser = await puppeteer.launch({
1471
- args: ['--no-sandbox', '--disable-setuid-sandbox'],
1472
- });
1470
+ let browser: Browser | null = null;
1473
1471
  try {
1472
+ browser = await puppeteer.launch({
1473
+ args: ['--no-sandbox', '--disable-setuid-sandbox'],
1474
+ });
1474
1475
  const page: Page = await browser.newPage();
1475
1476
  logger.debug(`Navigating to ${url}`);
1476
1477
  await page.goto(url, { waitUntil: 'networkidle2', timeout: 60000 });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "doc2vec",
3
- "version": "1.0.4",
3
+ "version": "1.1.0",
4
4
  "type": "commonjs",
5
5
  "description": "",
6
6
  "main": "doc2vec.ts",