@linkforty/core 1.34.0 → 1.35.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 (51) hide show
  1. package/README.md +32 -0
  2. package/dist/cli.d.ts +6 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +10 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +1 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/lib/database.d.ts.map +1 -1
  11. package/dist/lib/database.js +7 -0
  12. package/dist/lib/database.js.map +1 -1
  13. package/dist/lib/database.test.js +28 -1
  14. package/dist/lib/database.test.js.map +1 -1
  15. package/dist/lib/portable/bundle.d.ts +57 -0
  16. package/dist/lib/portable/bundle.d.ts.map +1 -0
  17. package/dist/lib/portable/bundle.js +139 -0
  18. package/dist/lib/portable/bundle.js.map +1 -0
  19. package/dist/lib/portable/cli.d.ts +14 -0
  20. package/dist/lib/portable/cli.d.ts.map +1 -0
  21. package/dist/lib/portable/cli.js +102 -0
  22. package/dist/lib/portable/cli.js.map +1 -0
  23. package/dist/lib/portable/cli.test.d.ts +2 -0
  24. package/dist/lib/portable/cli.test.d.ts.map +1 -0
  25. package/dist/lib/portable/cli.test.js +98 -0
  26. package/dist/lib/portable/cli.test.js.map +1 -0
  27. package/dist/lib/portable/files.d.ts +17 -0
  28. package/dist/lib/portable/files.d.ts.map +1 -0
  29. package/dist/lib/portable/files.js +37 -0
  30. package/dist/lib/portable/files.js.map +1 -0
  31. package/dist/lib/portable/import.d.ts +52 -0
  32. package/dist/lib/portable/import.d.ts.map +1 -0
  33. package/dist/lib/portable/import.js +211 -0
  34. package/dist/lib/portable/import.js.map +1 -0
  35. package/dist/lib/portable/index.d.ts +5 -0
  36. package/dist/lib/portable/index.d.ts.map +1 -0
  37. package/dist/lib/portable/index.js +5 -0
  38. package/dist/lib/portable/index.js.map +1 -0
  39. package/dist/lib/portable/portable.integration.test.d.ts +2 -0
  40. package/dist/lib/portable/portable.integration.test.d.ts.map +1 -0
  41. package/dist/lib/portable/portable.integration.test.js +139 -0
  42. package/dist/lib/portable/portable.integration.test.js.map +1 -0
  43. package/dist/lib/portable/registry.d.ts +47 -0
  44. package/dist/lib/portable/registry.d.ts.map +1 -0
  45. package/dist/lib/portable/registry.js +211 -0
  46. package/dist/lib/portable/registry.js.map +1 -0
  47. package/dist/lib/portable/registry.schema.test.d.ts +2 -0
  48. package/dist/lib/portable/registry.schema.test.d.ts.map +1 -0
  49. package/dist/lib/portable/registry.schema.test.js +59 -0
  50. package/dist/lib/portable/registry.schema.test.js.map +1 -0
  51. package/package.json +4 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable.integration.test.js","sourceRoot":"","sources":["../../../src/lib/portable/portable.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * What a LinkForty bundle carries, column by column.
3
+ *
4
+ * Every column of every table Core creates is classified here, and the schema
5
+ * test (registry.schema.test.ts) fails when a column exists that isn't, or a
6
+ * classified column no longer exists. So adding a column means deciding,
7
+ * in the same change, whether a bundle carries it.
8
+ *
9
+ * - `portable`: exported under `field` and restored on import.
10
+ * - `remap`: an owner reference (organization or user). Exported as is, and
11
+ * replaceable on import, so a bundle can be imported into a different
12
+ * organization or for a different user.
13
+ * - `excluded`: never exported; `reason` says why.
14
+ *
15
+ * JSONB columns whose keys belong to different features list the keys a bundle
16
+ * carries in `keys`; any other key is left out, so a key added later is not
17
+ * exported until it is listed here.
18
+ */
19
+ export type ColumnRule = {
20
+ class: 'portable';
21
+ field: string;
22
+ keys?: readonly string[];
23
+ } | {
24
+ class: 'remap';
25
+ field: string;
26
+ owner: 'organization' | 'user';
27
+ } | {
28
+ class: 'excluded';
29
+ reason: string;
30
+ };
31
+ export interface TableRule {
32
+ /** Record type in the bundle. */
33
+ record: string;
34
+ /** Primary key column; rows are read in its order. */
35
+ key: string;
36
+ columns: Readonly<Record<string, ColumnRule>>;
37
+ }
38
+ /**
39
+ * Tables in the order rows are written and restored: every table after the
40
+ * ones it references.
41
+ */
42
+ export declare const BUNDLE_TABLES: Readonly<Record<string, TableRule>>;
43
+ /** Columns a bundle carries for a table, in registry order. */
44
+ export declare function exportedColumns(table: string): Array<[column: string, rule: Exclude<ColumnRule, {
45
+ class: 'excluded';
46
+ }>]>;
47
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/lib/portable/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,MAAM,UAAU,GAClB;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC9D;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAAA;CAAE,GACjE;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C,MAAM,WAAW,SAAS;IACxB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CAC/C;AAUD;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAkL7D,CAAC;AAEF,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC,CAAC,CAIxH"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * What a LinkForty bundle carries, column by column.
3
+ *
4
+ * Every column of every table Core creates is classified here, and the schema
5
+ * test (registry.schema.test.ts) fails when a column exists that isn't, or a
6
+ * classified column no longer exists. So adding a column means deciding,
7
+ * in the same change, whether a bundle carries it.
8
+ *
9
+ * - `portable`: exported under `field` and restored on import.
10
+ * - `remap`: an owner reference (organization or user). Exported as is, and
11
+ * replaceable on import, so a bundle can be imported into a different
12
+ * organization or for a different user.
13
+ * - `excluded`: never exported; `reason` says why.
14
+ *
15
+ * JSONB columns whose keys belong to different features list the keys a bundle
16
+ * carries in `keys`; any other key is left out, so a key added later is not
17
+ * exported until it is listed here.
18
+ */
19
+ const p = (field, keys) => keys ? { class: 'portable', field, keys } : { class: 'portable', field };
20
+ const org = (field) => ({ class: 'remap', field, owner: 'organization' });
21
+ const user = (field) => ({ class: 'remap', field, owner: 'user' });
22
+ const excluded = (reason) => ({ class: 'excluded', reason });
23
+ const ENFORCEMENT = 'Abuse enforcement state belongs to the server that applied it';
24
+ /**
25
+ * Tables in the order rows are written and restored: every table after the
26
+ * ones it references.
27
+ */
28
+ export const BUNDLE_TABLES = {
29
+ organizations: {
30
+ record: 'organization',
31
+ key: 'id',
32
+ columns: {
33
+ id: p('id'),
34
+ name: p('name'),
35
+ settings: p('settings', ['appConfig', 'launchpad']),
36
+ suspended_at: excluded(ENFORCEMENT),
37
+ created_at: p('createdAt'),
38
+ updated_at: p('updatedAt'),
39
+ },
40
+ },
41
+ link_templates: {
42
+ record: 'template',
43
+ key: 'id',
44
+ columns: {
45
+ id: p('id'),
46
+ user_id: user('userId'),
47
+ name: p('name'),
48
+ slug: p('slug'),
49
+ description: p('description'),
50
+ settings: p('settings'),
51
+ is_default: p('isDefault'),
52
+ created_at: p('createdAt'),
53
+ updated_at: p('updatedAt'),
54
+ },
55
+ },
56
+ links: {
57
+ record: 'link',
58
+ key: 'id',
59
+ columns: {
60
+ id: p('id'),
61
+ user_id: user('userId'),
62
+ organization_id: org('organizationId'),
63
+ template_id: p('templateId'),
64
+ short_code: p('shortCode'),
65
+ original_url: p('originalUrl'),
66
+ title: p('title'),
67
+ description: p('description'),
68
+ ios_app_store_url: p('iosAppStoreUrl'),
69
+ android_app_store_url: p('androidAppStoreUrl'),
70
+ web_fallback_url: p('webFallbackUrl'),
71
+ app_scheme: p('appScheme'),
72
+ ios_universal_link: p('iosUniversalLink'),
73
+ android_app_link: p('androidAppLink'),
74
+ deep_link_path: p('deepLinkPath'),
75
+ deep_link_parameters: p('deepLinkParameters'),
76
+ utm_parameters: p('utmParameters'),
77
+ targeting_rules: p('targetingRules'),
78
+ attribution_window_hours: p('attributionWindowHours'),
79
+ append_click_id: p('appendClickId'),
80
+ og_title: p('ogTitle'),
81
+ og_description: p('ogDescription'),
82
+ og_image_url: p('ogImageUrl'),
83
+ og_type: p('ogType'),
84
+ launchpad_mode: p('launchpadMode'),
85
+ is_active: p('isActive'),
86
+ expires_at: p('expiresAt'),
87
+ warn_at: excluded(ENFORCEMENT),
88
+ disabled_at: excluded(ENFORCEMENT),
89
+ disabled_reason: excluded(ENFORCEMENT),
90
+ created_at: p('createdAt'),
91
+ updated_at: p('updatedAt'),
92
+ },
93
+ },
94
+ click_events: {
95
+ record: 'click',
96
+ key: 'id',
97
+ columns: {
98
+ id: p('id'),
99
+ link_id: p('linkId'),
100
+ clicked_at: p('clickedAt'),
101
+ ip_address: p('ipAddress'),
102
+ user_agent: p('userAgent'),
103
+ device_type: p('deviceType'),
104
+ platform: p('platform'),
105
+ country_code: p('countryCode'),
106
+ country_name: p('countryName'),
107
+ region: p('region'),
108
+ city: p('city'),
109
+ latitude: p('latitude'),
110
+ longitude: p('longitude'),
111
+ timezone: p('timezone'),
112
+ utm_source: p('utmSource'),
113
+ utm_medium: p('utmMedium'),
114
+ utm_campaign: p('utmCampaign'),
115
+ referrer: p('referrer'),
116
+ link_params: p('linkParams'),
117
+ is_bot: p('isBot'),
118
+ bot_reason: p('botReason'),
119
+ },
120
+ },
121
+ device_fingerprints: {
122
+ record: 'fingerprint',
123
+ key: 'id',
124
+ columns: {
125
+ id: p('id'),
126
+ click_id: p('clickId'),
127
+ fingerprint_hash: p('fingerprintHash'),
128
+ ip_address: p('ipAddress'),
129
+ user_agent: p('userAgent'),
130
+ timezone: p('timezone'),
131
+ language: p('language'),
132
+ screen_width: p('screenWidth'),
133
+ screen_height: p('screenHeight'),
134
+ platform: p('platform'),
135
+ platform_version: p('platformVersion'),
136
+ created_at: p('createdAt'),
137
+ },
138
+ },
139
+ install_events: {
140
+ record: 'install',
141
+ key: 'id',
142
+ columns: {
143
+ id: p('id'),
144
+ link_id: p('linkId'),
145
+ click_id: p('clickId'),
146
+ fingerprint_hash: p('fingerprintHash'),
147
+ confidence_score: p('confidenceScore'),
148
+ attribution_method: p('attributionMethod'),
149
+ matched_factors: p('matchedFactors'),
150
+ installed_at: p('installedAt'),
151
+ first_open_at: p('firstOpenAt'),
152
+ deep_link_retrieved: p('deepLinkRetrieved'),
153
+ deep_link_data: p('deepLinkData'),
154
+ attribution_window_hours: p('attributionWindowHours'),
155
+ ip_address: p('ipAddress'),
156
+ user_agent: p('userAgent'),
157
+ timezone: p('timezone'),
158
+ language: p('language'),
159
+ screen_width: p('screenWidth'),
160
+ screen_height: p('screenHeight'),
161
+ platform: p('platform'),
162
+ platform_version: p('platformVersion'),
163
+ device_id: p('deviceId'),
164
+ sdk_name: p('sdkName'),
165
+ sdk_version: p('sdkVersion'),
166
+ created_at: p('createdAt'),
167
+ },
168
+ },
169
+ in_app_events: {
170
+ record: 'event',
171
+ key: 'id',
172
+ columns: {
173
+ id: p('id'),
174
+ install_id: p('installId'),
175
+ event_name: p('eventName'),
176
+ event_data: p('eventData'),
177
+ event_timestamp: p('eventTimestamp'),
178
+ attributed_link_id: p('attributedLinkId'),
179
+ attributed_click_id: p('attributedClickId'),
180
+ attributed_at: p('attributedAt'),
181
+ session_id: p('sessionId'),
182
+ sdk_name: p('sdkName'),
183
+ sdk_version: p('sdkVersion'),
184
+ created_at: p('createdAt'),
185
+ },
186
+ },
187
+ webhooks: {
188
+ record: 'webhook',
189
+ key: 'id',
190
+ columns: {
191
+ id: p('id'),
192
+ user_id: user('userId'),
193
+ organization_id: org('organizationId'),
194
+ name: p('name'),
195
+ url: p('url'),
196
+ secret: excluded('A signing secret is a credential; import issues a new one'),
197
+ events: p('events'),
198
+ is_active: p('isActive'),
199
+ retry_count: p('retryCount'),
200
+ timeout_ms: p('timeoutMs'),
201
+ headers: p('headers'),
202
+ created_at: p('createdAt'),
203
+ updated_at: p('updatedAt'),
204
+ },
205
+ },
206
+ };
207
+ /** Columns a bundle carries for a table, in registry order. */
208
+ export function exportedColumns(table) {
209
+ return Object.entries(BUNDLE_TABLES[table].columns).filter((entry) => entry[1].class !== 'excluded');
210
+ }
211
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/lib/portable/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=registry.schema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.schema.test.d.ts","sourceRoot":"","sources":["../../../src/lib/portable/registry.schema.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ import pg from 'pg';
2
+ import { afterAll, beforeAll, describe, expect, it } from 'vitest';
3
+ import { db, initializeDatabase } from '../database.js';
4
+ import { BUNDLE_TABLES } from './registry.js';
5
+ /**
6
+ * Every column Core creates is classified in registry.ts.
7
+ *
8
+ * Fails when a migration adds a column (or table) the registry doesn't
9
+ * classify, or the registry names a column that no longer exists. The fix is
10
+ * to decide, in the same change, whether a bundle carries it: add it to
11
+ * BUNDLE_TABLES as portable, remap or excluded with a reason.
12
+ *
13
+ * Needs a real database; skipped without DATABASE_URL, like database.test.ts.
14
+ */
15
+ const ADMIN_URL = process.env.DATABASE_URL;
16
+ describe.skipIf(!ADMIN_URL)('bundle registry covers the schema', () => {
17
+ const scratchName = `lf_core_registry_${Date.now()}`;
18
+ let admin;
19
+ let columns;
20
+ beforeAll(async () => {
21
+ admin = new pg.Client({ connectionString: ADMIN_URL });
22
+ await admin.connect();
23
+ await admin.query(`CREATE DATABASE ${scratchName}`);
24
+ const url = new URL(ADMIN_URL);
25
+ url.pathname = `/${scratchName}`;
26
+ await initializeDatabase({ url: url.toString(), pool: { min: 1, max: 2 } });
27
+ const result = await db.query(`SELECT table_name, column_name FROM information_schema.columns
28
+ WHERE table_schema = 'public'
29
+ ORDER BY table_name, ordinal_position`);
30
+ columns = new Map();
31
+ for (const { table_name, column_name } of result.rows) {
32
+ columns.set(table_name, [...(columns.get(table_name) ?? []), column_name]);
33
+ }
34
+ }, 60000);
35
+ afterAll(async () => {
36
+ await db?.end().catch(() => undefined);
37
+ await admin.query(`DROP DATABASE IF EXISTS ${scratchName} WITH (FORCE)`);
38
+ await admin.end();
39
+ }, 30000);
40
+ it('classifies every table', () => {
41
+ const unclassified = [...columns.keys()].filter((table) => !(table in BUNDLE_TABLES));
42
+ expect(unclassified, 'add these tables to BUNDLE_TABLES in registry.ts').toEqual([]);
43
+ });
44
+ it('classifies every column of every table, and only columns that exist', () => {
45
+ for (const [table, rule] of Object.entries(BUNDLE_TABLES)) {
46
+ const actual = columns.get(table) ?? [];
47
+ const classified = Object.keys(rule.columns);
48
+ expect(actual.filter((c) => !classified.includes(c)), `classify these ${table} columns in registry.ts`).toEqual([]);
49
+ expect(classified.filter((c) => !actual.includes(c)), `these ${table} columns in registry.ts no longer exist`).toEqual([]);
50
+ }
51
+ });
52
+ it('gives every exported column a unique field name per table', () => {
53
+ for (const [table, rule] of Object.entries(BUNDLE_TABLES)) {
54
+ const fields = Object.values(rule.columns).flatMap((c) => (c.class === 'excluded' ? [] : [c.field]));
55
+ expect(new Set(fields).size, table).toBe(fields.length);
56
+ }
57
+ });
58
+ });
59
+ //# sourceMappingURL=registry.schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.schema.test.js","sourceRoot":"","sources":["../../../src/lib/portable/registry.schema.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,12 @@
1
1
  {
2
2
  "name": "@linkforty/core",
3
- "version": "1.34.0",
3
+ "version": "1.35.0",
4
4
  "type": "module",
5
5
  "description": "Open-source deeplink management engine with device detection and analytics",
6
6
  "main": "dist/index.js",
7
+ "bin": {
8
+ "linkforty": "dist/cli.js"
9
+ },
7
10
  "types": "dist/index.d.ts",
8
11
  "license": "AGPL-3.0-only",
9
12
  "repository": {