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,28 @@
1
+ /**
2
+ * Distribuzione t di Student - Implementazione self-contained
3
+ *
4
+ * Calcola p-value reali per il Welch's t-test senza dipendenze esterne.
5
+ * Usa l'approssimazione di Lanczos per log-gamma e l'algoritmo di Lentz
6
+ * per la regularized incomplete beta function.
7
+ */
8
+ /**
9
+ * Logaritmo naturale della funzione Gamma.
10
+ * Usa l'approssimazione di Lanczos con 6 coefficienti (~15 cifre di precisione).
11
+ */
12
+ export declare function lnGamma(x: number): number;
13
+ /**
14
+ * Regularized Incomplete Beta Function I_x(a, b).
15
+ * Usa l'algoritmo di Lentz per la continued fraction evaluation.
16
+ */
17
+ export declare function regularizedIncompleteBeta(x: number, a: number, b: number): number;
18
+ /**
19
+ * CDF della distribuzione t di Student.
20
+ * P(T <= t) per una variabile t con df gradi di libertà.
21
+ */
22
+ export declare function studentTCDF(t: number, df: number): number;
23
+ /**
24
+ * P-value two-tailed per il test t di Student.
25
+ * Calcola P(|T| > |t|) = I_x(df/2, 1/2) dove x = df/(df + t²).
26
+ */
27
+ export declare function twoTailedPValue(t: number, df: number): number;
28
+ //# sourceMappingURL=TDistribution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TDistribution.d.ts","sourceRoot":"","sources":["../../src/stats/TDistribution.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAazC;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAoDjF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAazD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAQ7D"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Distribuzione t di Student - Implementazione self-contained
3
+ *
4
+ * Calcola p-value reali per il Welch's t-test senza dipendenze esterne.
5
+ * Usa l'approssimazione di Lanczos per log-gamma e l'algoritmo di Lentz
6
+ * per la regularized incomplete beta function.
7
+ */
8
+ const LANCZOS_COEFFICIENTS = [
9
+ 76.18009172947146,
10
+ -86.50532032941677,
11
+ 24.01409824083091,
12
+ -1.231739572450155,
13
+ 0.1208650973866179e-2,
14
+ -0.5395239384953e-5,
15
+ ];
16
+ /**
17
+ * Logaritmo naturale della funzione Gamma.
18
+ * Usa l'approssimazione di Lanczos con 6 coefficienti (~15 cifre di precisione).
19
+ */
20
+ export function lnGamma(x) {
21
+ if (x <= 0)
22
+ throw new Error('lnGamma richiede x > 0');
23
+ let y = x;
24
+ let tmp = x + 5.5;
25
+ tmp -= (x + 0.5) * Math.log(tmp);
26
+ let ser = 1.000000000190015;
27
+ for (const coeff of LANCZOS_COEFFICIENTS) {
28
+ ser += coeff / ++y;
29
+ }
30
+ return -tmp + Math.log((2.5066282746310005 * ser) / x);
31
+ }
32
+ /**
33
+ * Regularized Incomplete Beta Function I_x(a, b).
34
+ * Usa l'algoritmo di Lentz per la continued fraction evaluation.
35
+ */
36
+ export function regularizedIncompleteBeta(x, a, b) {
37
+ if (x === 0)
38
+ return 0;
39
+ if (x === 1)
40
+ return 1;
41
+ // Relazione di simmetria per convergenza ottimale
42
+ if (x > (a + 1) / (a + b + 2)) {
43
+ return 1 - regularizedIncompleteBeta(1 - x, b, a);
44
+ }
45
+ const lnBeta = lnGamma(a) + lnGamma(b) - lnGamma(a + b);
46
+ const front = Math.exp(Math.log(x) * a + Math.log(1 - x) * b - lnBeta) / a;
47
+ // Lentz continued fraction per I_x(a, b)
48
+ const maxIterations = 200;
49
+ const epsilon = 1e-10;
50
+ const tiny = 1e-30;
51
+ let c = 1;
52
+ let d = 1 - ((a + b) * x) / (a + 1);
53
+ if (Math.abs(d) < tiny)
54
+ d = tiny;
55
+ d = 1 / d;
56
+ let result = d;
57
+ for (let m = 1; m <= maxIterations; m++) {
58
+ // Numeratore per termine dispari d_{2m-1}
59
+ let numerator = (m * (b - m) * x) / ((a + 2 * m - 1) * (a + 2 * m));
60
+ d = 1 + numerator * d;
61
+ if (Math.abs(d) < tiny)
62
+ d = tiny;
63
+ c = 1 + numerator / c;
64
+ if (Math.abs(c) < tiny)
65
+ c = tiny;
66
+ d = 1 / d;
67
+ result *= d * c;
68
+ // Numeratore per termine pari d_{2m}
69
+ numerator = (-(a + m) * (a + b + m) * x) / ((a + 2 * m) * (a + 2 * m + 1));
70
+ d = 1 + numerator * d;
71
+ if (Math.abs(d) < tiny)
72
+ d = tiny;
73
+ c = 1 + numerator / c;
74
+ if (Math.abs(c) < tiny)
75
+ c = tiny;
76
+ d = 1 / d;
77
+ const delta = d * c;
78
+ result *= delta;
79
+ // Convergenza raggiunta
80
+ if (Math.abs(delta - 1) < epsilon) {
81
+ break;
82
+ }
83
+ }
84
+ // Clamp per sicurezza numerica
85
+ return Math.max(0, Math.min(1, front * result));
86
+ }
87
+ /**
88
+ * CDF della distribuzione t di Student.
89
+ * P(T <= t) per una variabile t con df gradi di libertà.
90
+ */
91
+ export function studentTCDF(t, df) {
92
+ if (df <= 0)
93
+ throw new Error('Gradi di libertà devono essere > 0');
94
+ if (!isFinite(t))
95
+ return t > 0 ? 1 : 0;
96
+ if (t === 0)
97
+ return 0.5;
98
+ const x = df / (df + t * t);
99
+ const ibeta = regularizedIncompleteBeta(x, df / 2, 0.5);
100
+ if (t > 0) {
101
+ return 1 - 0.5 * ibeta;
102
+ }
103
+ else {
104
+ return 0.5 * ibeta;
105
+ }
106
+ }
107
+ /**
108
+ * P-value two-tailed per il test t di Student.
109
+ * Calcola P(|T| > |t|) = I_x(df/2, 1/2) dove x = df/(df + t²).
110
+ */
111
+ export function twoTailedPValue(t, df) {
112
+ if (isNaN(t) || isNaN(df) || df <= 0)
113
+ return 1;
114
+ if (!isFinite(t))
115
+ return 0;
116
+ const absT = Math.abs(t);
117
+ const x = df / (df + absT * absT);
118
+ return Math.max(0, Math.min(1, regularizedIncompleteBeta(x, df / 2, 0.5)));
119
+ }
120
+ //# sourceMappingURL=TDistribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TDistribution.js","sourceRoot":"","sources":["../../src/stats/TDistribution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ CREATE TABLE `AuditLog` (
2
+ `id` text PRIMARY KEY NOT NULL,
3
+ `testId` text NOT NULL,
4
+ `action` text NOT NULL,
5
+ `userId` text NOT NULL,
6
+ `timestamp` text DEFAULT (datetime('now')) NOT NULL
7
+ );
8
+ --> statement-breakpoint
9
+ CREATE INDEX `AuditLog_testId_idx` ON `AuditLog` (`testId`);--> statement-breakpoint
10
+ CREATE INDEX `AuditLog_userId_idx` ON `AuditLog` (`userId`);--> statement-breakpoint
11
+ CREATE TABLE `Metric` (
12
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
13
+ `testId` text NOT NULL,
14
+ `date` text NOT NULL,
15
+ `clicks` integer NOT NULL,
16
+ `impressions` integer NOT NULL,
17
+ `gapFilled` integer DEFAULT false NOT NULL,
18
+ `filledAt` text,
19
+ `createdAt` text DEFAULT (datetime('now')) NOT NULL,
20
+ FOREIGN KEY (`testId`) REFERENCES `Test`(`id`) ON UPDATE no action ON DELETE cascade
21
+ );
22
+ --> statement-breakpoint
23
+ CREATE UNIQUE INDEX `Metric_testId_date_key` ON `Metric` (`testId`,`date`);--> statement-breakpoint
24
+ CREATE INDEX `Metric_testId_date_idx` ON `Metric` (`testId`,`date`);--> statement-breakpoint
25
+ CREATE TABLE `Test` (
26
+ `id` text PRIMARY KEY NOT NULL,
27
+ `name` text NOT NULL,
28
+ `urls` text DEFAULT '[]' NOT NULL,
29
+ `siteUrl` text NOT NULL,
30
+ `startDate` text NOT NULL,
31
+ `splitDate` text NOT NULL,
32
+ `status` text DEFAULT 'running' NOT NULL,
33
+ `lastSyncAt` text,
34
+ `lastPValue` real,
35
+ `lastImprovement` real,
36
+ `userId` text NOT NULL,
37
+ `sharedWith` text DEFAULT '[]' NOT NULL,
38
+ `createdAt` text DEFAULT (datetime('now')) NOT NULL,
39
+ `updatedAt` text DEFAULT (datetime('now')) NOT NULL,
40
+ FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON UPDATE no action ON DELETE no action
41
+ );
42
+ --> statement-breakpoint
43
+ CREATE INDEX `Test_userId_idx` ON `Test` (`userId`);--> statement-breakpoint
44
+ CREATE INDEX `Test_status_idx` ON `Test` (`status`);--> statement-breakpoint
45
+ CREATE TABLE `User` (
46
+ `id` text PRIMARY KEY NOT NULL,
47
+ `email` text NOT NULL,
48
+ `createdAt` text DEFAULT (datetime('now')) NOT NULL
49
+ );
50
+ --> statement-breakpoint
51
+ CREATE UNIQUE INDEX `User_email_unique` ON `User` (`email`);
@@ -0,0 +1,9 @@
1
+ CREATE TABLE `OAuthToken` (
2
+ `userId` text PRIMARY KEY NOT NULL,
3
+ `accessToken` text NOT NULL,
4
+ `refreshToken` text NOT NULL,
5
+ `expiresAt` integer NOT NULL,
6
+ `createdAt` text DEFAULT (datetime('now')) NOT NULL,
7
+ `updatedAt` text DEFAULT (datetime('now')) NOT NULL,
8
+ FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON UPDATE no action ON DELETE no action
9
+ );
@@ -0,0 +1 @@
1
+ ALTER TABLE `Test` DROP COLUMN `sharedWith`;
@@ -0,0 +1,360 @@
1
+ {
2
+ "version": "6",
3
+ "dialect": "sqlite",
4
+ "id": "ec839ca6-e49d-4acf-aa97-acadcd716c66",
5
+ "prevId": "00000000-0000-0000-0000-000000000000",
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
+ "Test": {
168
+ "name": "Test",
169
+ "columns": {
170
+ "id": {
171
+ "name": "id",
172
+ "type": "text",
173
+ "primaryKey": true,
174
+ "notNull": true,
175
+ "autoincrement": false
176
+ },
177
+ "name": {
178
+ "name": "name",
179
+ "type": "text",
180
+ "primaryKey": false,
181
+ "notNull": true,
182
+ "autoincrement": false
183
+ },
184
+ "urls": {
185
+ "name": "urls",
186
+ "type": "text",
187
+ "primaryKey": false,
188
+ "notNull": true,
189
+ "autoincrement": false,
190
+ "default": "'[]'"
191
+ },
192
+ "siteUrl": {
193
+ "name": "siteUrl",
194
+ "type": "text",
195
+ "primaryKey": false,
196
+ "notNull": true,
197
+ "autoincrement": false
198
+ },
199
+ "startDate": {
200
+ "name": "startDate",
201
+ "type": "text",
202
+ "primaryKey": false,
203
+ "notNull": true,
204
+ "autoincrement": false
205
+ },
206
+ "splitDate": {
207
+ "name": "splitDate",
208
+ "type": "text",
209
+ "primaryKey": false,
210
+ "notNull": true,
211
+ "autoincrement": false
212
+ },
213
+ "status": {
214
+ "name": "status",
215
+ "type": "text",
216
+ "primaryKey": false,
217
+ "notNull": true,
218
+ "autoincrement": false,
219
+ "default": "'running'"
220
+ },
221
+ "lastSyncAt": {
222
+ "name": "lastSyncAt",
223
+ "type": "text",
224
+ "primaryKey": false,
225
+ "notNull": false,
226
+ "autoincrement": false
227
+ },
228
+ "lastPValue": {
229
+ "name": "lastPValue",
230
+ "type": "real",
231
+ "primaryKey": false,
232
+ "notNull": false,
233
+ "autoincrement": false
234
+ },
235
+ "lastImprovement": {
236
+ "name": "lastImprovement",
237
+ "type": "real",
238
+ "primaryKey": false,
239
+ "notNull": false,
240
+ "autoincrement": false
241
+ },
242
+ "userId": {
243
+ "name": "userId",
244
+ "type": "text",
245
+ "primaryKey": false,
246
+ "notNull": true,
247
+ "autoincrement": false
248
+ },
249
+ "sharedWith": {
250
+ "name": "sharedWith",
251
+ "type": "text",
252
+ "primaryKey": false,
253
+ "notNull": true,
254
+ "autoincrement": false,
255
+ "default": "'[]'"
256
+ },
257
+ "createdAt": {
258
+ "name": "createdAt",
259
+ "type": "text",
260
+ "primaryKey": false,
261
+ "notNull": true,
262
+ "autoincrement": false,
263
+ "default": "(datetime('now'))"
264
+ },
265
+ "updatedAt": {
266
+ "name": "updatedAt",
267
+ "type": "text",
268
+ "primaryKey": false,
269
+ "notNull": true,
270
+ "autoincrement": false,
271
+ "default": "(datetime('now'))"
272
+ }
273
+ },
274
+ "indexes": {
275
+ "Test_userId_idx": {
276
+ "name": "Test_userId_idx",
277
+ "columns": [
278
+ "userId"
279
+ ],
280
+ "isUnique": false
281
+ },
282
+ "Test_status_idx": {
283
+ "name": "Test_status_idx",
284
+ "columns": [
285
+ "status"
286
+ ],
287
+ "isUnique": false
288
+ }
289
+ },
290
+ "foreignKeys": {
291
+ "Test_userId_User_id_fk": {
292
+ "name": "Test_userId_User_id_fk",
293
+ "tableFrom": "Test",
294
+ "tableTo": "User",
295
+ "columnsFrom": [
296
+ "userId"
297
+ ],
298
+ "columnsTo": [
299
+ "id"
300
+ ],
301
+ "onDelete": "no action",
302
+ "onUpdate": "no action"
303
+ }
304
+ },
305
+ "compositePrimaryKeys": {},
306
+ "uniqueConstraints": {},
307
+ "checkConstraints": {}
308
+ },
309
+ "User": {
310
+ "name": "User",
311
+ "columns": {
312
+ "id": {
313
+ "name": "id",
314
+ "type": "text",
315
+ "primaryKey": true,
316
+ "notNull": true,
317
+ "autoincrement": false
318
+ },
319
+ "email": {
320
+ "name": "email",
321
+ "type": "text",
322
+ "primaryKey": false,
323
+ "notNull": true,
324
+ "autoincrement": false
325
+ },
326
+ "createdAt": {
327
+ "name": "createdAt",
328
+ "type": "text",
329
+ "primaryKey": false,
330
+ "notNull": true,
331
+ "autoincrement": false,
332
+ "default": "(datetime('now'))"
333
+ }
334
+ },
335
+ "indexes": {
336
+ "User_email_unique": {
337
+ "name": "User_email_unique",
338
+ "columns": [
339
+ "email"
340
+ ],
341
+ "isUnique": true
342
+ }
343
+ },
344
+ "foreignKeys": {},
345
+ "compositePrimaryKeys": {},
346
+ "uniqueConstraints": {},
347
+ "checkConstraints": {}
348
+ }
349
+ },
350
+ "views": {},
351
+ "enums": {},
352
+ "_meta": {
353
+ "schemas": {},
354
+ "tables": {},
355
+ "columns": {}
356
+ },
357
+ "internal": {
358
+ "indexes": {}
359
+ }
360
+ }