seo-testing-tool 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +228 -0
  3. package/dist/auth/GoogleOAuthService.d.ts +31 -0
  4. package/dist/auth/GoogleOAuthService.d.ts.map +1 -0
  5. package/dist/auth/GoogleOAuthService.js +69 -0
  6. package/dist/auth/GoogleOAuthService.js.map +1 -0
  7. package/dist/auth/TokenManager.d.ts +56 -0
  8. package/dist/auth/TokenManager.d.ts.map +1 -0
  9. package/dist/auth/TokenManager.js +190 -0
  10. package/dist/auth/TokenManager.js.map +1 -0
  11. package/dist/cli/commands.d.ts +36 -0
  12. package/dist/cli/commands.d.ts.map +1 -0
  13. package/dist/cli/commands.js +471 -0
  14. package/dist/cli/commands.js.map +1 -0
  15. package/dist/cli/formatters.d.ts +24 -0
  16. package/dist/cli/formatters.d.ts.map +1 -0
  17. package/dist/cli/formatters.js +175 -0
  18. package/dist/cli/formatters.js.map +1 -0
  19. package/dist/cli.d.ts +15 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +62 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/config/AnalysisConfig.d.ts +13 -0
  24. package/dist/config/AnalysisConfig.d.ts.map +1 -0
  25. package/dist/config/AnalysisConfig.js +10 -0
  26. package/dist/config/AnalysisConfig.js.map +1 -0
  27. package/dist/config/env.d.ts +30 -0
  28. package/dist/config/env.d.ts.map +1 -0
  29. package/dist/config/env.js +77 -0
  30. package/dist/config/env.js.map +1 -0
  31. package/dist/database/DatabaseService.d.ts +106 -0
  32. package/dist/database/DatabaseService.d.ts.map +1 -0
  33. package/dist/database/DatabaseService.js +180 -0
  34. package/dist/database/DatabaseService.js.map +1 -0
  35. package/dist/database/TimeSeriesService.d.ts +53 -0
  36. package/dist/database/TimeSeriesService.d.ts.map +1 -0
  37. package/dist/database/TimeSeriesService.js +122 -0
  38. package/dist/database/TimeSeriesService.js.map +1 -0
  39. package/dist/database/db.d.ts +20 -0
  40. package/dist/database/db.d.ts.map +1 -0
  41. package/dist/database/db.js +60 -0
  42. package/dist/database/db.js.map +1 -0
  43. package/dist/database/schema.d.ts +687 -0
  44. package/dist/database/schema.d.ts.map +1 -0
  45. package/dist/database/schema.js +62 -0
  46. package/dist/database/schema.js.map +1 -0
  47. package/dist/demo.d.ts +13 -0
  48. package/dist/demo.d.ts.map +1 -0
  49. package/dist/demo.js +149 -0
  50. package/dist/demo.js.map +1 -0
  51. package/dist/gsc/GSCDataFetcher.d.ts +100 -0
  52. package/dist/gsc/GSCDataFetcher.d.ts.map +1 -0
  53. package/dist/gsc/GSCDataFetcher.js +398 -0
  54. package/dist/gsc/GSCDataFetcher.js.map +1 -0
  55. package/dist/gsc/GSCPermissionService.d.ts +20 -0
  56. package/dist/gsc/GSCPermissionService.d.ts.map +1 -0
  57. package/dist/gsc/GSCPermissionService.js +84 -0
  58. package/dist/gsc/GSCPermissionService.js.map +1 -0
  59. package/dist/index.d.ts +12 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +41 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/notifications/NotificationService.d.ts +64 -0
  64. package/dist/notifications/NotificationService.d.ts.map +1 -0
  65. package/dist/notifications/NotificationService.js +115 -0
  66. package/dist/notifications/NotificationService.js.map +1 -0
  67. package/dist/orchestrator/SEOExperimentOrchestrator.d.ts +69 -0
  68. package/dist/orchestrator/SEOExperimentOrchestrator.d.ts.map +1 -0
  69. package/dist/orchestrator/SEOExperimentOrchestrator.js +199 -0
  70. package/dist/orchestrator/SEOExperimentOrchestrator.js.map +1 -0
  71. package/dist/services/ExportService.d.ts +52 -0
  72. package/dist/services/ExportService.d.ts.map +1 -0
  73. package/dist/services/ExportService.js +238 -0
  74. package/dist/services/ExportService.js.map +1 -0
  75. package/dist/smoke-test.d.ts +10 -0
  76. package/dist/smoke-test.d.ts.map +1 -0
  77. package/dist/smoke-test.js +73 -0
  78. package/dist/smoke-test.js.map +1 -0
  79. package/dist/stats/StatisticalEngine.d.ts +48 -0
  80. package/dist/stats/StatisticalEngine.d.ts.map +1 -0
  81. package/dist/stats/StatisticalEngine.js +205 -0
  82. package/dist/stats/StatisticalEngine.js.map +1 -0
  83. package/dist/stats/TDistribution.d.ts +28 -0
  84. package/dist/stats/TDistribution.d.ts.map +1 -0
  85. package/dist/stats/TDistribution.js +120 -0
  86. package/dist/stats/TDistribution.js.map +1 -0
  87. package/drizzle/0000_hot_whiplash.sql +51 -0
  88. package/drizzle/0001_open_photon.sql +9 -0
  89. package/drizzle/0002_faulty_the_watchers.sql +1 -0
  90. package/drizzle/meta/0000_snapshot.json +360 -0
  91. package/drizzle/meta/0001_snapshot.json +428 -0
  92. package/drizzle/meta/0002_snapshot.json +420 -0
  93. package/drizzle/meta/_journal.json +27 -0
  94. package/package.json +89 -0
@@ -0,0 +1,420 @@
1
+ {
2
+ "version": "6",
3
+ "dialect": "sqlite",
4
+ "id": "afb65c6d-7a7d-4ec3-9609-a4032b271d95",
5
+ "prevId": "e0346cba-36bd-4bde-a95d-d7b58194e50a",
6
+ "tables": {
7
+ "AuditLog": {
8
+ "name": "AuditLog",
9
+ "columns": {
10
+ "id": {
11
+ "name": "id",
12
+ "type": "text",
13
+ "primaryKey": true,
14
+ "notNull": true,
15
+ "autoincrement": false
16
+ },
17
+ "testId": {
18
+ "name": "testId",
19
+ "type": "text",
20
+ "primaryKey": false,
21
+ "notNull": true,
22
+ "autoincrement": false
23
+ },
24
+ "action": {
25
+ "name": "action",
26
+ "type": "text",
27
+ "primaryKey": false,
28
+ "notNull": true,
29
+ "autoincrement": false
30
+ },
31
+ "userId": {
32
+ "name": "userId",
33
+ "type": "text",
34
+ "primaryKey": false,
35
+ "notNull": true,
36
+ "autoincrement": false
37
+ },
38
+ "timestamp": {
39
+ "name": "timestamp",
40
+ "type": "text",
41
+ "primaryKey": false,
42
+ "notNull": true,
43
+ "autoincrement": false,
44
+ "default": "(datetime('now'))"
45
+ }
46
+ },
47
+ "indexes": {
48
+ "AuditLog_testId_idx": {
49
+ "name": "AuditLog_testId_idx",
50
+ "columns": [
51
+ "testId"
52
+ ],
53
+ "isUnique": false
54
+ },
55
+ "AuditLog_userId_idx": {
56
+ "name": "AuditLog_userId_idx",
57
+ "columns": [
58
+ "userId"
59
+ ],
60
+ "isUnique": false
61
+ }
62
+ },
63
+ "foreignKeys": {},
64
+ "compositePrimaryKeys": {},
65
+ "uniqueConstraints": {},
66
+ "checkConstraints": {}
67
+ },
68
+ "Metric": {
69
+ "name": "Metric",
70
+ "columns": {
71
+ "id": {
72
+ "name": "id",
73
+ "type": "integer",
74
+ "primaryKey": true,
75
+ "notNull": true,
76
+ "autoincrement": true
77
+ },
78
+ "testId": {
79
+ "name": "testId",
80
+ "type": "text",
81
+ "primaryKey": false,
82
+ "notNull": true,
83
+ "autoincrement": false
84
+ },
85
+ "date": {
86
+ "name": "date",
87
+ "type": "text",
88
+ "primaryKey": false,
89
+ "notNull": true,
90
+ "autoincrement": false
91
+ },
92
+ "clicks": {
93
+ "name": "clicks",
94
+ "type": "integer",
95
+ "primaryKey": false,
96
+ "notNull": true,
97
+ "autoincrement": false
98
+ },
99
+ "impressions": {
100
+ "name": "impressions",
101
+ "type": "integer",
102
+ "primaryKey": false,
103
+ "notNull": true,
104
+ "autoincrement": false
105
+ },
106
+ "gapFilled": {
107
+ "name": "gapFilled",
108
+ "type": "integer",
109
+ "primaryKey": false,
110
+ "notNull": true,
111
+ "autoincrement": false,
112
+ "default": false
113
+ },
114
+ "filledAt": {
115
+ "name": "filledAt",
116
+ "type": "text",
117
+ "primaryKey": false,
118
+ "notNull": false,
119
+ "autoincrement": false
120
+ },
121
+ "createdAt": {
122
+ "name": "createdAt",
123
+ "type": "text",
124
+ "primaryKey": false,
125
+ "notNull": true,
126
+ "autoincrement": false,
127
+ "default": "(datetime('now'))"
128
+ }
129
+ },
130
+ "indexes": {
131
+ "Metric_testId_date_key": {
132
+ "name": "Metric_testId_date_key",
133
+ "columns": [
134
+ "testId",
135
+ "date"
136
+ ],
137
+ "isUnique": true
138
+ },
139
+ "Metric_testId_date_idx": {
140
+ "name": "Metric_testId_date_idx",
141
+ "columns": [
142
+ "testId",
143
+ "date"
144
+ ],
145
+ "isUnique": false
146
+ }
147
+ },
148
+ "foreignKeys": {
149
+ "Metric_testId_Test_id_fk": {
150
+ "name": "Metric_testId_Test_id_fk",
151
+ "tableFrom": "Metric",
152
+ "tableTo": "Test",
153
+ "columnsFrom": [
154
+ "testId"
155
+ ],
156
+ "columnsTo": [
157
+ "id"
158
+ ],
159
+ "onDelete": "cascade",
160
+ "onUpdate": "no action"
161
+ }
162
+ },
163
+ "compositePrimaryKeys": {},
164
+ "uniqueConstraints": {},
165
+ "checkConstraints": {}
166
+ },
167
+ "OAuthToken": {
168
+ "name": "OAuthToken",
169
+ "columns": {
170
+ "userId": {
171
+ "name": "userId",
172
+ "type": "text",
173
+ "primaryKey": true,
174
+ "notNull": true,
175
+ "autoincrement": false
176
+ },
177
+ "accessToken": {
178
+ "name": "accessToken",
179
+ "type": "text",
180
+ "primaryKey": false,
181
+ "notNull": true,
182
+ "autoincrement": false
183
+ },
184
+ "refreshToken": {
185
+ "name": "refreshToken",
186
+ "type": "text",
187
+ "primaryKey": false,
188
+ "notNull": true,
189
+ "autoincrement": false
190
+ },
191
+ "expiresAt": {
192
+ "name": "expiresAt",
193
+ "type": "integer",
194
+ "primaryKey": false,
195
+ "notNull": true,
196
+ "autoincrement": false
197
+ },
198
+ "createdAt": {
199
+ "name": "createdAt",
200
+ "type": "text",
201
+ "primaryKey": false,
202
+ "notNull": true,
203
+ "autoincrement": false,
204
+ "default": "(datetime('now'))"
205
+ },
206
+ "updatedAt": {
207
+ "name": "updatedAt",
208
+ "type": "text",
209
+ "primaryKey": false,
210
+ "notNull": true,
211
+ "autoincrement": false,
212
+ "default": "(datetime('now'))"
213
+ }
214
+ },
215
+ "indexes": {},
216
+ "foreignKeys": {
217
+ "OAuthToken_userId_User_id_fk": {
218
+ "name": "OAuthToken_userId_User_id_fk",
219
+ "tableFrom": "OAuthToken",
220
+ "tableTo": "User",
221
+ "columnsFrom": [
222
+ "userId"
223
+ ],
224
+ "columnsTo": [
225
+ "id"
226
+ ],
227
+ "onDelete": "no action",
228
+ "onUpdate": "no action"
229
+ }
230
+ },
231
+ "compositePrimaryKeys": {},
232
+ "uniqueConstraints": {},
233
+ "checkConstraints": {}
234
+ },
235
+ "Test": {
236
+ "name": "Test",
237
+ "columns": {
238
+ "id": {
239
+ "name": "id",
240
+ "type": "text",
241
+ "primaryKey": true,
242
+ "notNull": true,
243
+ "autoincrement": false
244
+ },
245
+ "name": {
246
+ "name": "name",
247
+ "type": "text",
248
+ "primaryKey": false,
249
+ "notNull": true,
250
+ "autoincrement": false
251
+ },
252
+ "urls": {
253
+ "name": "urls",
254
+ "type": "text",
255
+ "primaryKey": false,
256
+ "notNull": true,
257
+ "autoincrement": false,
258
+ "default": "'[]'"
259
+ },
260
+ "siteUrl": {
261
+ "name": "siteUrl",
262
+ "type": "text",
263
+ "primaryKey": false,
264
+ "notNull": true,
265
+ "autoincrement": false
266
+ },
267
+ "startDate": {
268
+ "name": "startDate",
269
+ "type": "text",
270
+ "primaryKey": false,
271
+ "notNull": true,
272
+ "autoincrement": false
273
+ },
274
+ "splitDate": {
275
+ "name": "splitDate",
276
+ "type": "text",
277
+ "primaryKey": false,
278
+ "notNull": true,
279
+ "autoincrement": false
280
+ },
281
+ "status": {
282
+ "name": "status",
283
+ "type": "text",
284
+ "primaryKey": false,
285
+ "notNull": true,
286
+ "autoincrement": false,
287
+ "default": "'running'"
288
+ },
289
+ "lastSyncAt": {
290
+ "name": "lastSyncAt",
291
+ "type": "text",
292
+ "primaryKey": false,
293
+ "notNull": false,
294
+ "autoincrement": false
295
+ },
296
+ "lastPValue": {
297
+ "name": "lastPValue",
298
+ "type": "real",
299
+ "primaryKey": false,
300
+ "notNull": false,
301
+ "autoincrement": false
302
+ },
303
+ "lastImprovement": {
304
+ "name": "lastImprovement",
305
+ "type": "real",
306
+ "primaryKey": false,
307
+ "notNull": false,
308
+ "autoincrement": false
309
+ },
310
+ "userId": {
311
+ "name": "userId",
312
+ "type": "text",
313
+ "primaryKey": false,
314
+ "notNull": true,
315
+ "autoincrement": false
316
+ },
317
+ "createdAt": {
318
+ "name": "createdAt",
319
+ "type": "text",
320
+ "primaryKey": false,
321
+ "notNull": true,
322
+ "autoincrement": false,
323
+ "default": "(datetime('now'))"
324
+ },
325
+ "updatedAt": {
326
+ "name": "updatedAt",
327
+ "type": "text",
328
+ "primaryKey": false,
329
+ "notNull": true,
330
+ "autoincrement": false,
331
+ "default": "(datetime('now'))"
332
+ }
333
+ },
334
+ "indexes": {
335
+ "Test_userId_idx": {
336
+ "name": "Test_userId_idx",
337
+ "columns": [
338
+ "userId"
339
+ ],
340
+ "isUnique": false
341
+ },
342
+ "Test_status_idx": {
343
+ "name": "Test_status_idx",
344
+ "columns": [
345
+ "status"
346
+ ],
347
+ "isUnique": false
348
+ }
349
+ },
350
+ "foreignKeys": {
351
+ "Test_userId_User_id_fk": {
352
+ "name": "Test_userId_User_id_fk",
353
+ "tableFrom": "Test",
354
+ "tableTo": "User",
355
+ "columnsFrom": [
356
+ "userId"
357
+ ],
358
+ "columnsTo": [
359
+ "id"
360
+ ],
361
+ "onDelete": "no action",
362
+ "onUpdate": "no action"
363
+ }
364
+ },
365
+ "compositePrimaryKeys": {},
366
+ "uniqueConstraints": {},
367
+ "checkConstraints": {}
368
+ },
369
+ "User": {
370
+ "name": "User",
371
+ "columns": {
372
+ "id": {
373
+ "name": "id",
374
+ "type": "text",
375
+ "primaryKey": true,
376
+ "notNull": true,
377
+ "autoincrement": false
378
+ },
379
+ "email": {
380
+ "name": "email",
381
+ "type": "text",
382
+ "primaryKey": false,
383
+ "notNull": true,
384
+ "autoincrement": false
385
+ },
386
+ "createdAt": {
387
+ "name": "createdAt",
388
+ "type": "text",
389
+ "primaryKey": false,
390
+ "notNull": true,
391
+ "autoincrement": false,
392
+ "default": "(datetime('now'))"
393
+ }
394
+ },
395
+ "indexes": {
396
+ "User_email_unique": {
397
+ "name": "User_email_unique",
398
+ "columns": [
399
+ "email"
400
+ ],
401
+ "isUnique": true
402
+ }
403
+ },
404
+ "foreignKeys": {},
405
+ "compositePrimaryKeys": {},
406
+ "uniqueConstraints": {},
407
+ "checkConstraints": {}
408
+ }
409
+ },
410
+ "views": {},
411
+ "enums": {},
412
+ "_meta": {
413
+ "schemas": {},
414
+ "tables": {},
415
+ "columns": {}
416
+ },
417
+ "internal": {
418
+ "indexes": {}
419
+ }
420
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "version": "7",
3
+ "dialect": "sqlite",
4
+ "entries": [
5
+ {
6
+ "idx": 0,
7
+ "version": "6",
8
+ "when": 1770836865309,
9
+ "tag": "0000_hot_whiplash",
10
+ "breakpoints": true
11
+ },
12
+ {
13
+ "idx": 1,
14
+ "version": "6",
15
+ "when": 1770837808163,
16
+ "tag": "0001_open_photon",
17
+ "breakpoints": true
18
+ },
19
+ {
20
+ "idx": 2,
21
+ "version": "6",
22
+ "when": 1770894149598,
23
+ "tag": "0002_faulty_the_watchers",
24
+ "breakpoints": true
25
+ }
26
+ ]
27
+ }
package/package.json ADDED
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "seo-testing-tool",
3
+ "version": "1.0.0",
4
+ "description": "SEO Testing Tool - Statistical analysis for SEO experiments",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/index.js",
10
+ "types": "./dist/index.d.ts"
11
+ }
12
+ },
13
+ "bin": {
14
+ "seo-tool": "./dist/cli.js"
15
+ },
16
+ "files": [
17
+ "dist/",
18
+ "drizzle/"
19
+ ],
20
+ "scripts": {
21
+ "test": "vitest",
22
+ "test:ui": "vitest --ui",
23
+ "test:coverage": "vitest --coverage",
24
+ "prebuild": "rimraf dist",
25
+ "build": "tsc",
26
+ "postbuild": "node dist/cli.js --version",
27
+ "prepack": "npm run build",
28
+ "prepublishOnly": "vitest run && npm run test:e2e",
29
+ "dev:cli": "tsx src/cli.ts",
30
+ "dev": "tsx watch src/index.ts",
31
+ "lint": "eslint src tests --ext .ts",
32
+ "format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
33
+ "db:generate": "drizzle-kit generate",
34
+ "db:push": "drizzle-kit push",
35
+ "db:migrate": "drizzle-kit migrate",
36
+ "db:studio": "drizzle-kit studio",
37
+ "cli:run": "tsx src/cli.ts run",
38
+ "test:e2e": "npm run build && vitest run --config vitest.e2e.config.ts",
39
+ "smoke-test": "tsx src/smoke-test.ts",
40
+ "demo": "tsx src/demo.ts"
41
+ },
42
+ "keywords": [
43
+ "seo",
44
+ "testing",
45
+ "statistics",
46
+ "google-search-console",
47
+ "analytics"
48
+ ],
49
+ "author": "Francesca <francescascarpellini327@gmail.com>",
50
+ "license": "MIT",
51
+ "repository": {
52
+ "type": "git",
53
+ "url": "git+https://github.com/svilupp0/SEO-Testing-Tool.git"
54
+ },
55
+ "bugs": {
56
+ "url": "https://github.com/svilupp0/SEO-Testing-Tool/issues"
57
+ },
58
+ "homepage": "https://github.com/svilupp0/SEO-Testing-Tool#readme",
59
+ "devDependencies": {
60
+ "@types/better-sqlite3": "^7.6.13",
61
+ "@types/inquirer": "^9.0.9",
62
+ "@types/node": "^20.11.0",
63
+ "@typescript-eslint/eslint-plugin": "^6.19.0",
64
+ "@typescript-eslint/parser": "^6.19.0",
65
+ "@vitest/coverage-v8": "^1.2.0",
66
+ "@vitest/ui": "^1.2.0",
67
+ "drizzle-kit": "^0.31.9",
68
+ "eslint": "^8.56.0",
69
+ "prettier": "^3.2.4",
70
+ "rimraf": "^6.1.3",
71
+ "tsx": "^4.7.0",
72
+ "typescript": "^5.3.3",
73
+ "vitest": "^1.2.0"
74
+ },
75
+ "dependencies": {
76
+ "asciichart": "^1.5.25",
77
+ "better-sqlite3": "^12.6.2",
78
+ "chalk": "^5.6.2",
79
+ "cli-table3": "^0.6.5",
80
+ "commander": "^14.0.3",
81
+ "dotenv": "^17.2.4",
82
+ "drizzle-orm": "^0.45.1",
83
+ "exceljs": "^4.4.0",
84
+ "inquirer": "^13.2.2"
85
+ },
86
+ "engines": {
87
+ "node": ">=18.0.0"
88
+ }
89
+ }