@kywi-software/core 0.15.0 → 0.15.2
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/AGENT-PATTERNS.md +51 -1
- package/dist/admin/audience-editor.d.ts +2 -0
- package/dist/admin/audience-editor.d.ts.map +1 -1
- package/dist/admin/audience-editor.js +4 -2
- package/dist/admin/audience-editor.js.map +1 -1
- package/dist/admin/condition-builder.d.ts.map +1 -1
- package/dist/admin/condition-builder.js +16 -3
- package/dist/admin/condition-builder.js.map +1 -1
- package/dist/admin/rule-tester.d.ts +1 -0
- package/dist/admin/rule-tester.d.ts.map +1 -1
- package/dist/admin/rule-tester.js +7 -4
- package/dist/admin/rule-tester.js.map +1 -1
- package/dist/admin/signal-options.d.ts +17 -0
- package/dist/admin/signal-options.d.ts.map +1 -1
- package/dist/admin/signal-options.js +28 -0
- package/dist/admin/signal-options.js.map +1 -1
- package/dist/admin/surfaces/audiences/audiences-data.d.ts +5 -0
- package/dist/admin/surfaces/audiences/audiences-data.d.ts.map +1 -1
- package/dist/admin/surfaces/audiences/audiences-data.js +3 -0
- package/dist/admin/surfaces/audiences/audiences-data.js.map +1 -1
- package/dist/admin/surfaces/feeds/feeds-data.d.ts +8 -1
- package/dist/admin/surfaces/feeds/feeds-data.d.ts.map +1 -1
- package/dist/admin/surfaces/feeds/feeds-data.js +39 -22
- package/dist/admin/surfaces/feeds/feeds-data.js.map +1 -1
- package/dist/api/api-key-routes.js +2 -2
- package/dist/api/api-key-routes.js.map +1 -1
- package/dist/api/audience-routes.d.ts.map +1 -1
- package/dist/api/audience-routes.js +10 -4
- package/dist/api/audience-routes.js.map +1 -1
- package/dist/api/audience-runtime-routes.d.ts +17 -0
- package/dist/api/audience-runtime-routes.d.ts.map +1 -1
- package/dist/api/audience-runtime-routes.js +474 -23
- package/dist/api/audience-runtime-routes.js.map +1 -1
- package/dist/api/ax-routes.d.ts.map +1 -1
- package/dist/api/ax-routes.js +7 -3
- package/dist/api/ax-routes.js.map +1 -1
- package/dist/api/category-routes.js +3 -3
- package/dist/api/category-routes.js.map +1 -1
- package/dist/api/changeset-routes.js +2 -2
- package/dist/api/changeset-routes.js.map +1 -1
- package/dist/api/comment-routes.js +4 -4
- package/dist/api/comment-routes.js.map +1 -1
- package/dist/api/component-routes.js +3 -3
- package/dist/api/component-routes.js.map +1 -1
- package/dist/api/config-routes.js +4 -4
- package/dist/api/config-routes.js.map +1 -1
- package/dist/api/content-permission-routes.js +2 -2
- package/dist/api/content-permission-routes.js.map +1 -1
- package/dist/api/content-routes.d.ts.map +1 -1
- package/dist/api/content-routes.js +8 -3
- package/dist/api/content-routes.js.map +1 -1
- package/dist/api/content-type-routes.js +3 -3
- package/dist/api/content-type-routes.js.map +1 -1
- package/dist/api/experiment-routes.js +2 -2
- package/dist/api/experiment-routes.js.map +1 -1
- package/dist/api/extension-routes.js +4 -4
- package/dist/api/extension-routes.js.map +1 -1
- package/dist/api/feed-routes.d.ts.map +1 -1
- package/dist/api/feed-routes.js +51 -4
- package/dist/api/feed-routes.js.map +1 -1
- package/dist/api/form-routes.js +2 -2
- package/dist/api/form-routes.js.map +1 -1
- package/dist/api/group-routes.js +3 -3
- package/dist/api/group-routes.js.map +1 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +15 -4
- package/dist/api/index.js.map +1 -1
- package/dist/api/layout-routes.d.ts +19 -1
- package/dist/api/layout-routes.d.ts.map +1 -1
- package/dist/api/layout-routes.js +65 -5
- package/dist/api/layout-routes.js.map +1 -1
- package/dist/api/layout-write-guard.d.ts +3 -2
- package/dist/api/layout-write-guard.d.ts.map +1 -1
- package/dist/api/layout-write-guard.js +12 -4
- package/dist/api/layout-write-guard.js.map +1 -1
- package/dist/api/media-routes.d.ts.map +1 -1
- package/dist/api/media-routes.js +50 -9
- package/dist/api/media-routes.js.map +1 -1
- package/dist/api/menu-routes.js +2 -2
- package/dist/api/menu-routes.js.map +1 -1
- package/dist/api/nav-routes.js +3 -3
- package/dist/api/nav-routes.js.map +1 -1
- package/dist/api/oauth-routes.js +2 -2
- package/dist/api/oauth-routes.js.map +1 -1
- package/dist/api/openapi.d.ts.map +1 -1
- package/dist/api/openapi.js +14 -1
- package/dist/api/openapi.js.map +1 -1
- package/dist/api/pagination.d.ts +10 -0
- package/dist/api/pagination.d.ts.map +1 -1
- package/dist/api/pagination.js +7 -1
- package/dist/api/pagination.js.map +1 -1
- package/dist/api/response.d.ts +29 -0
- package/dist/api/response.d.ts.map +1 -1
- package/dist/api/response.js +23 -3
- package/dist/api/response.js.map +1 -1
- package/dist/api/search-routes.d.ts.map +1 -1
- package/dist/api/search-routes.js +17 -3
- package/dist/api/search-routes.js.map +1 -1
- package/dist/api/section-template-routes.js +2 -2
- package/dist/api/section-template-routes.js.map +1 -1
- package/dist/api/site-routes.js +2 -2
- package/dist/api/site-routes.js.map +1 -1
- package/dist/api/tag-routes.d.ts.map +1 -1
- package/dist/api/tag-routes.js +2 -2
- package/dist/api/tag-routes.js.map +1 -1
- package/dist/api/user-routes.js +2 -2
- package/dist/api/user-routes.js.map +1 -1
- package/dist/api/version-routes.js +2 -2
- package/dist/api/version-routes.js.map +1 -1
- package/dist/api/webhook-routes.js +3 -3
- package/dist/api/webhook-routes.js.map +1 -1
- package/dist/api/workflow-routes.d.ts.map +1 -1
- package/dist/api/workflow-routes.js +15 -6
- package/dist/api/workflow-routes.js.map +1 -1
- package/dist/audiences/collectors/index.d.ts +8 -4
- package/dist/audiences/collectors/index.d.ts.map +1 -1
- package/dist/audiences/collectors/index.js +17 -4
- package/dist/audiences/collectors/index.js.map +1 -1
- package/dist/audiences/collectors/selfid.d.ts +25 -0
- package/dist/audiences/collectors/selfid.d.ts.map +1 -0
- package/dist/audiences/collectors/selfid.js +46 -0
- package/dist/audiences/collectors/selfid.js.map +1 -0
- package/dist/audiences/collectors/session.d.ts +41 -0
- package/dist/audiences/collectors/session.d.ts.map +1 -0
- package/dist/audiences/collectors/session.js +50 -0
- package/dist/audiences/collectors/session.js.map +1 -0
- package/dist/audiences/consent-config.d.ts +12 -0
- package/dist/audiences/consent-config.d.ts.map +1 -1
- package/dist/audiences/consent-config.js +16 -0
- package/dist/audiences/consent-config.js.map +1 -1
- package/dist/audiences/consent-startup.d.ts +7 -0
- package/dist/audiences/consent-startup.d.ts.map +1 -1
- package/dist/audiences/consent-startup.js +9 -2
- package/dist/audiences/consent-startup.js.map +1 -1
- package/dist/audiences/consent.d.ts +13 -0
- package/dist/audiences/consent.d.ts.map +1 -1
- package/dist/audiences/consent.js +13 -0
- package/dist/audiences/consent.js.map +1 -1
- package/dist/audiences/cookies.d.ts +21 -0
- package/dist/audiences/cookies.d.ts.map +1 -1
- package/dist/audiences/cookies.js +26 -0
- package/dist/audiences/cookies.js.map +1 -1
- package/dist/audiences/engine.d.ts.map +1 -1
- package/dist/audiences/engine.js +1 -0
- package/dist/audiences/engine.js.map +1 -1
- package/dist/audiences/entry-page.d.ts +89 -0
- package/dist/audiences/entry-page.d.ts.map +1 -0
- package/dist/audiences/entry-page.js +116 -0
- package/dist/audiences/entry-page.js.map +1 -0
- package/dist/audiences/evaluator/instant-match.d.ts.map +1 -1
- package/dist/audiences/evaluator/instant-match.js +7 -0
- package/dist/audiences/evaluator/instant-match.js.map +1 -1
- package/dist/audiences/index.d.ts +3 -2
- package/dist/audiences/index.d.ts.map +1 -1
- package/dist/audiences/index.js +6 -2
- package/dist/audiences/index.js.map +1 -1
- package/dist/audiences/queries.d.ts +16 -0
- package/dist/audiences/queries.d.ts.map +1 -1
- package/dist/audiences/queries.js +28 -1
- package/dist/audiences/queries.js.map +1 -1
- package/dist/audiences/schema.d.ts +17 -0
- package/dist/audiences/schema.d.ts.map +1 -1
- package/dist/audiences/schema.js +7 -0
- package/dist/audiences/schema.js.map +1 -1
- package/dist/audiences/server-eval.d.ts +19 -0
- package/dist/audiences/server-eval.d.ts.map +1 -1
- package/dist/audiences/server-eval.js +17 -1
- package/dist/audiences/server-eval.js.map +1 -1
- package/dist/audiences/types.d.ts +22 -1
- package/dist/audiences/types.d.ts.map +1 -1
- package/dist/audiences/types.js +1 -0
- package/dist/audiences/types.js.map +1 -1
- package/dist/ax/content-source.d.ts +10 -2
- package/dist/ax/content-source.d.ts.map +1 -1
- package/dist/ax/content-source.js +81 -5
- package/dist/ax/content-source.js.map +1 -1
- package/dist/ax/effective-body.d.ts +28 -0
- package/dist/ax/effective-body.d.ts.map +1 -0
- package/dist/ax/effective-body.js +47 -0
- package/dist/ax/effective-body.js.map +1 -0
- package/dist/ax/index.d.ts +3 -1
- package/dist/ax/index.d.ts.map +1 -1
- package/dist/ax/index.js +2 -0
- package/dist/ax/index.js.map +1 -1
- package/dist/ax/jsonld.d.ts +31 -1
- package/dist/ax/jsonld.d.ts.map +1 -1
- package/dist/ax/jsonld.js +35 -22
- package/dist/ax/jsonld.js.map +1 -1
- package/dist/ax/layout-to-html.d.ts +127 -0
- package/dist/ax/layout-to-html.d.ts.map +1 -0
- package/dist/ax/layout-to-html.js +545 -0
- package/dist/ax/layout-to-html.js.map +1 -0
- package/dist/ax/llms-full-txt.d.ts +3 -1
- package/dist/ax/llms-full-txt.d.ts.map +1 -1
- package/dist/ax/llms-full-txt.js +5 -2
- package/dist/ax/llms-full-txt.js.map +1 -1
- package/dist/ax/page-markdown.d.ts +10 -2
- package/dist/ax/page-markdown.d.ts.map +1 -1
- package/dist/ax/page-markdown.js +16 -3
- package/dist/ax/page-markdown.js.map +1 -1
- package/dist/ax/summary.d.ts +4 -0
- package/dist/ax/summary.d.ts.map +1 -1
- package/dist/ax/summary.js +6 -1
- package/dist/ax/summary.js.map +1 -1
- package/dist/ax/types.d.ts +24 -0
- package/dist/ax/types.d.ts.map +1 -1
- package/dist/cache/content-invalidation.d.ts.map +1 -1
- package/dist/cache/content-invalidation.js +11 -0
- package/dist/cache/content-invalidation.js.map +1 -1
- package/dist/config/types.d.ts +16 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/db/apply-snapshot.d.ts +7 -0
- package/dist/db/apply-snapshot.d.ts.map +1 -1
- package/dist/db/apply-snapshot.js +7 -0
- package/dist/db/apply-snapshot.js.map +1 -1
- package/dist/db/ax-queries.d.ts +6 -0
- package/dist/db/ax-queries.d.ts.map +1 -1
- package/dist/db/ax-queries.js +6 -0
- package/dist/db/ax-queries.js.map +1 -1
- package/dist/db/content-queries.d.ts.map +1 -1
- package/dist/db/content-queries.js +8 -0
- package/dist/db/content-queries.js.map +1 -1
- package/dist/db/layout-queries.d.ts +19 -2
- package/dist/db/layout-queries.d.ts.map +1 -1
- package/dist/db/layout-queries.js +11 -3
- package/dist/db/layout-queries.js.map +1 -1
- package/dist/db/search-queries.d.ts.map +1 -1
- package/dist/db/search-queries.js +24 -1
- package/dist/db/search-queries.js.map +1 -1
- package/dist/hooks/ax-invalidation.d.ts.map +1 -1
- package/dist/hooks/ax-invalidation.js +4 -0
- package/dist/hooks/ax-invalidation.js.map +1 -1
- package/dist/layout/index.d.ts +3 -1
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +3 -1
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/module-permissions.d.ts.map +1 -1
- package/dist/layout/module-permissions.js +2 -38
- package/dist/layout/module-permissions.js.map +1 -1
- package/dist/layout/seed-defaults.d.ts +45 -0
- package/dist/layout/seed-defaults.d.ts.map +1 -0
- package/dist/layout/seed-defaults.js +75 -0
- package/dist/layout/seed-defaults.js.map +1 -0
- package/dist/layout/walk.d.ts +14 -0
- package/dist/layout/walk.d.ts.map +1 -0
- package/dist/layout/walk.js +49 -0
- package/dist/layout/walk.js.map +1 -0
- package/dist/media/index.d.ts +1 -1
- package/dist/media/index.d.ts.map +1 -1
- package/dist/media/index.js +1 -1
- package/dist/media/index.js.map +1 -1
- package/dist/media/upload-allowlist.d.ts +23 -0
- package/dist/media/upload-allowlist.d.ts.map +1 -1
- package/dist/media/upload-allowlist.js +29 -0
- package/dist/media/upload-allowlist.js.map +1 -1
- package/dist/schema/mysql-tables.d.ts +17 -0
- package/dist/schema/mysql-tables.d.ts.map +1 -1
- package/dist/schema/mysql-tables.js +2 -0
- package/dist/schema/mysql-tables.js.map +1 -1
- package/dist/scope/jsonld.d.ts +18 -3
- package/dist/scope/jsonld.d.ts.map +1 -1
- package/dist/scope/jsonld.js +6 -4
- package/dist/scope/jsonld.js.map +1 -1
- package/package.json +6 -1
|
@@ -6,6 +6,10 @@ export declare const COOKIE_NAMES: {
|
|
|
6
6
|
readonly OPTOUT: "kywi_optout";
|
|
7
7
|
readonly KNOWN: "kywi_known";
|
|
8
8
|
readonly PREVIEW_INIT: "kywi_preview_init";
|
|
9
|
+
/** First page (path + query) of the visitor's session — kywi-cms#196. */
|
|
10
|
+
readonly ENTRY: "kywi_entry";
|
|
11
|
+
/** Server-readable copy of the visitor's self-ID answers — kywi-cms#200. */
|
|
12
|
+
readonly SELFID: "kywi_selfid";
|
|
9
13
|
};
|
|
10
14
|
export declare const COOKIE_MAX_AGE: {
|
|
11
15
|
readonly SIGNALS: 60;
|
|
@@ -15,12 +19,29 @@ export declare const COOKIE_MAX_AGE: {
|
|
|
15
19
|
readonly OPTOUT: number;
|
|
16
20
|
readonly KNOWN: number;
|
|
17
21
|
readonly PREVIEW_INIT: 30;
|
|
22
|
+
readonly ENTRY: -1;
|
|
23
|
+
/**
|
|
24
|
+
* Not a cookie of its own: the "until the browser closes" lifetime, for a
|
|
25
|
+
* write whose durability depends on consent. A self-ID pin from a visitor who
|
|
26
|
+
* has not consented is honoured for the session and then forgotten, rather
|
|
27
|
+
* than filed for 30 days (kywi-cms#200).
|
|
28
|
+
*/
|
|
29
|
+
readonly SESSION: -1;
|
|
30
|
+
readonly SELFID: number;
|
|
18
31
|
};
|
|
19
32
|
export declare function signSignals(payload: unknown, secret: string): Promise<string>;
|
|
20
33
|
export declare function verifySignals(token: string, secret: string): Promise<unknown | null>;
|
|
21
34
|
export declare function parseCookies(cookieHeader: string): Map<string, string>;
|
|
35
|
+
/**
|
|
36
|
+
* `options.secure` adds the `Secure` attribute, which callers pass when the
|
|
37
|
+
* request being answered is https. It is opt-in rather than always-on because
|
|
38
|
+
* a browser silently DISCARDS a `Secure` cookie over plain http, which would
|
|
39
|
+
* break local development and any http-only deployment — so the caller, which
|
|
40
|
+
* is the only thing that knows the scheme, decides. Omitted, nothing changes.
|
|
41
|
+
*/
|
|
22
42
|
export declare function buildSetCookieHeader(name: string, value: string, maxAge: number, options?: {
|
|
23
43
|
httpOnly?: boolean;
|
|
24
44
|
sameSite?: 'Strict' | 'Lax' | 'None';
|
|
45
|
+
secure?: boolean;
|
|
25
46
|
}): string;
|
|
26
47
|
//# sourceMappingURL=cookies.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/audiences/cookies.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY;;;;;;;;
|
|
1
|
+
{"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/audiences/cookies.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY;;;;;;;;IAQvB,yEAAyE;;IAEzE,4EAA4E;;CAEpE,CAAA;AAEV,eAAO,MAAM,cAAc;;;;;;;;;IAczB;;;;;OAKG;;;CAKK,CAAA;AAEV,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMnF;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAQ1F;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBtE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACvF,MAAM,CASR"}
|
|
@@ -7,6 +7,10 @@ export const COOKIE_NAMES = {
|
|
|
7
7
|
OPTOUT: 'kywi_optout',
|
|
8
8
|
KNOWN: 'kywi_known',
|
|
9
9
|
PREVIEW_INIT: 'kywi_preview_init',
|
|
10
|
+
/** First page (path + query) of the visitor's session — kywi-cms#196. */
|
|
11
|
+
ENTRY: 'kywi_entry',
|
|
12
|
+
/** Server-readable copy of the visitor's self-ID answers — kywi-cms#200. */
|
|
13
|
+
SELFID: 'kywi_selfid',
|
|
10
14
|
};
|
|
11
15
|
export const COOKIE_MAX_AGE = {
|
|
12
16
|
SIGNALS: 60,
|
|
@@ -19,6 +23,19 @@ export const COOKIE_MAX_AGE = {
|
|
|
19
23
|
OPTOUT: 365 * 24 * 3600,
|
|
20
24
|
KNOWN: 24 * 3600,
|
|
21
25
|
PREVIEW_INIT: 30,
|
|
26
|
+
// A session cookie (negative = no Max-Age directive): a new visit is a new
|
|
27
|
+
// entry page, so this must not outlive the browser session.
|
|
28
|
+
ENTRY: -1,
|
|
29
|
+
/**
|
|
30
|
+
* Not a cookie of its own: the "until the browser closes" lifetime, for a
|
|
31
|
+
* write whose durability depends on consent. A self-ID pin from a visitor who
|
|
32
|
+
* has not consented is honoured for the session and then forgotten, rather
|
|
33
|
+
* than filed for 30 days (kywi-cms#200).
|
|
34
|
+
*/
|
|
35
|
+
SESSION: -1,
|
|
36
|
+
// Self-ID answers persist on the same horizon as the audience they resolve to
|
|
37
|
+
// — long enough to be worth asking for, short enough to age out.
|
|
38
|
+
SELFID: 30 * 24 * 3600,
|
|
22
39
|
};
|
|
23
40
|
export async function signSignals(payload, secret) {
|
|
24
41
|
const key = new TextEncoder().encode(secret);
|
|
@@ -65,6 +82,13 @@ export function parseCookies(cookieHeader) {
|
|
|
65
82
|
}
|
|
66
83
|
return map;
|
|
67
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* `options.secure` adds the `Secure` attribute, which callers pass when the
|
|
87
|
+
* request being answered is https. It is opt-in rather than always-on because
|
|
88
|
+
* a browser silently DISCARDS a `Secure` cookie over plain http, which would
|
|
89
|
+
* break local development and any http-only deployment — so the caller, which
|
|
90
|
+
* is the only thing that knows the scheme, decides. Omitted, nothing changes.
|
|
91
|
+
*/
|
|
68
92
|
export function buildSetCookieHeader(name, value, maxAge, options) {
|
|
69
93
|
const parts = [`${name}=${encodeURIComponent(value)}`];
|
|
70
94
|
if (maxAge >= 0)
|
|
@@ -74,6 +98,8 @@ export function buildSetCookieHeader(name, value, maxAge, options) {
|
|
|
74
98
|
if (options?.httpOnly !== false)
|
|
75
99
|
parts.push('HttpOnly');
|
|
76
100
|
parts.push(`SameSite=${options?.sameSite ?? 'Lax'}`);
|
|
101
|
+
if (options?.secure)
|
|
102
|
+
parts.push('Secure');
|
|
77
103
|
return parts.join('; ');
|
|
78
104
|
}
|
|
79
105
|
//# sourceMappingURL=cookies.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/audiences/cookies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,OAAO,EAAE,cAAc;IACvB,OAAO,EAAE,cAAc;IACvB,GAAG,EAAE,UAAU;IACf,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,YAAY;IACnB,YAAY,EAAE,mBAAmB;
|
|
1
|
+
{"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/audiences/cookies.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/audiences/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAM1F,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AACD,MAAM,WAAW,cAAc;IAAG,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CAAE;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/audiences/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAM1F,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AACD,MAAM,WAAW,cAAc;IAAG,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CAAE;AAgB9F,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAiCjF"}
|
package/dist/audiences/engine.js
CHANGED
|
@@ -8,6 +8,7 @@ function mergeSignals(base, partial) {
|
|
|
8
8
|
referrer: partial.referrer ?? base.referrer,
|
|
9
9
|
session: partial.session ?? base.session,
|
|
10
10
|
behavioral: partial.behavioral ?? base.behavioral,
|
|
11
|
+
query: { ...base.query, ...partial.query },
|
|
11
12
|
selfId: { ...base.selfId, ...partial.selfId },
|
|
12
13
|
identity: partial.identity ?? base.identity,
|
|
13
14
|
adapters: { ...base.adapters, ...partial.adapters },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/audiences/engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAc3C,SAAS,YAAY,CAAC,IAAoB,EAAE,OAAgC;IAC1E,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG;QAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;QAC3C,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;QACxC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU;QACjD,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE;QAC7C,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;QAC3C,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE;QACnD,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE;KACxC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAA4B;IAC/D,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,OAAuB;YACpC,sEAAsE;YACtE,gDAAgD;YAChD,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAA;YACjG,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YAChE,IAAI,OAAO,GAAG,YAAY,CAAC,kBAAkB,EAAE,EAAE,aAAa,CAAC,CAAA;YAC/D,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC3B,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;YACzD,CAAC;YACD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAA;YAC1C,MAAM,EAAE,iBAAiB,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YACxF,yEAAyE;YACzE,oEAAoE;YACpE,2EAA2E;YAC3E,0EAA0E;YAC1E,yDAAyD;YACzD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC1D,MAAM,gBAAgB,GAAG,qBAAqB,CAC5C,YAAY,CAAC,YAAY,IAAI,EAAE,CAAC,EAChC,MAAM,CAAC,SAAS,EAChB,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,CAC1B,CAAA;YACD,MAAM,cAAc,GAAG,gBAAgB,IAAI,iBAAiB,CAAA;YAC5D,OAAO;gBACL,iBAAiB,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc;gBACrD,aAAa;gBACb,OAAO;gBACP,UAAU;aACX,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/audiences/engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAc3C,SAAS,YAAY,CAAC,IAAoB,EAAE,OAAgC;IAC1E,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG;QAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;QAC3C,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;QACxC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU;QACjD,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE;QAC1C,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE;QAC7C,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;QAC3C,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE;QACnD,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE;KACxC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAA4B;IAC/D,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,OAAuB;YACpC,sEAAsE;YACtE,gDAAgD;YAChD,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAA;YACjG,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YAChE,IAAI,OAAO,GAAG,YAAY,CAAC,kBAAkB,EAAE,EAAE,aAAa,CAAC,CAAA;YAC/D,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC3B,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;YACzD,CAAC;YACD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAA;YAC1C,MAAM,EAAE,iBAAiB,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YACxF,yEAAyE;YACzE,oEAAoE;YACpE,2EAA2E;YAC3E,0EAA0E;YAC1E,yDAAyD;YACzD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC1D,MAAM,gBAAgB,GAAG,qBAAqB,CAC5C,YAAY,CAAC,YAAY,IAAI,EAAE,CAAC,EAChC,MAAM,CAAC,SAAS,EAChB,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,CAC1B,CAAA;YACD,MAAM,cAAc,GAAG,gBAAgB,IAAI,iBAAiB,CAAA;YAC5D,OAAO;gBACL,iBAAiB,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc;gBACrD,aAAa;gBACb,OAAO;gBACP,UAAU;aACX,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entry page — the *write* side of the `kywi_entry` cookie contract
|
|
3
|
+
* (kywi-cms#196).
|
|
4
|
+
*
|
|
5
|
+
* `session.entryPage` has been in the signal catalogue and in the admin rule
|
|
6
|
+
* tester since the audience engine shipped, but nothing in core ever wrote it:
|
|
7
|
+
* `runServerCollectors` fed UTM params, the referrer and the visitor cookies
|
|
8
|
+
* into signal collection and left `session` at its schema defaults, so
|
|
9
|
+
* `entryPage` stayed `'/'` forever. A rule like
|
|
10
|
+
* `session.entryPage contains 'from=marketer'` could not fire on a real request
|
|
11
|
+
* no matter what the visitor did.
|
|
12
|
+
*
|
|
13
|
+
* This module is the missing writer, living next to its reader
|
|
14
|
+
* (`collectors/session.ts`) so a scaffolded app, the reference app and the
|
|
15
|
+
* runtime routes all share one implementation. The contract:
|
|
16
|
+
*
|
|
17
|
+
* • The value is `pathname + search` of the FIRST request of a session —
|
|
18
|
+
* `/developers?from=marketer`, not the whole URL. Query is included on
|
|
19
|
+
* purpose: a campaign link's own params are the interesting part.
|
|
20
|
+
* • It is written ONCE. A request that already carries the cookie returns
|
|
21
|
+
* `null` here, so "entry page" keeps meaning the page the visitor arrived
|
|
22
|
+
* on rather than quietly becoming "current page".
|
|
23
|
+
* • It is written only for a DOCUMENT request. If a subresource could record
|
|
24
|
+
* it, the first request of a session that happens to be `/kywi.js`, a font
|
|
25
|
+
* or an API call would name the entry page, and every rule downstream would
|
|
26
|
+
* be matching against an asset URL. Callers pass `Sec-Fetch-Dest` (and
|
|
27
|
+
* `Accept` for browsers that omit it); saying neither fails closed.
|
|
28
|
+
* • It is a SESSION cookie (no Max-Age): a new visit is a new entry page.
|
|
29
|
+
* • It is a `personalization` cookie in the category map, gated exactly like
|
|
30
|
+
* `kywi_visitor` and `kywi_utm` (kywi-cms#91). Without consent nothing is
|
|
31
|
+
* persisted — and the read side falls back to the CURRENT request's path,
|
|
32
|
+
* so a rule on the entry page still fires on the landing request itself.
|
|
33
|
+
* That fallback is also what makes `/developers?from=marketer` switch on
|
|
34
|
+
* the very request that carries it, with no reload, for everyone: a
|
|
35
|
+
* Set-Cookie only takes effect on the NEXT request.
|
|
36
|
+
*
|
|
37
|
+
* EDGE-SAFE LEAF MODULE: its only import is `./consent.js`, itself a zero-import
|
|
38
|
+
* leaf, because this is imported from Next.js edge middleware where core's
|
|
39
|
+
* DB-backed code cannot run. Keep it dependency-free beyond that. It is
|
|
40
|
+
* published as its own export entry (`@kywi-software/core/audiences/entry-page`)
|
|
41
|
+
* so importing it never drags in the DB-backed `audiences` barrel — the same
|
|
42
|
+
* arrangement as `utm-persistence.ts`.
|
|
43
|
+
*/
|
|
44
|
+
import { type ConsentGateOptions } from './consent.js';
|
|
45
|
+
/**
|
|
46
|
+
* Cookie name the entry-page collector reads (mirrors `COOKIE_NAMES.ENTRY` in
|
|
47
|
+
* `audiences/cookies.ts`). Kept as a literal so this leaf imports nothing — the
|
|
48
|
+
* `cookies` module pulls in `jose`, which an edge writer does not need. A core
|
|
49
|
+
* test asserts this stays equal to `COOKIE_NAMES.ENTRY`, so the two cannot drift.
|
|
50
|
+
*/
|
|
51
|
+
export declare const ENTRY_COOKIE = "kywi_entry";
|
|
52
|
+
/**
|
|
53
|
+
* The entry-page value for a URL: `pathname + search`, or `null` when the URL
|
|
54
|
+
* cannot be parsed. Exported because the READ side needs exactly the same
|
|
55
|
+
* derivation for its current-request fallback.
|
|
56
|
+
*/
|
|
57
|
+
export declare function entryPagePath(url: string): string | null;
|
|
58
|
+
/**
|
|
59
|
+
* The value to write to `kywi_entry` for this request, or `null` to leave things
|
|
60
|
+
* alone. `null` when: the visitor has not consented to personalization, the
|
|
61
|
+
* cookie is already set (the session's entry page is already recorded), or the
|
|
62
|
+
* URL is unparseable.
|
|
63
|
+
*
|
|
64
|
+
* Callers write it as a SESSION cookie — `buildSetCookieHeader(ENTRY_COOKIE,
|
|
65
|
+
* value, -1, { httpOnly: false })`, or the framework equivalent with no
|
|
66
|
+
* `maxAge`.
|
|
67
|
+
*/
|
|
68
|
+
export declare function entryPageCookieValue(url: string, options?: {
|
|
69
|
+
cookieHeader?: string | null;
|
|
70
|
+
/** The request's `Sec-Fetch-Dest` header. */
|
|
71
|
+
secFetchDest?: string | null;
|
|
72
|
+
/** The request's `Accept` header — the fallback when `Sec-Fetch-Dest` is absent. */
|
|
73
|
+
accept?: string | null;
|
|
74
|
+
} & ConsentGateOptions): string | null;
|
|
75
|
+
/**
|
|
76
|
+
* Is this request the visitor navigating to a PAGE, rather than the page
|
|
77
|
+
* fetching something?
|
|
78
|
+
*
|
|
79
|
+
* `Sec-Fetch-Dest` is authoritative where it exists (every current browser
|
|
80
|
+
* sends it, and it is one of the headers a page cannot forge). Without it, an
|
|
81
|
+
* `Accept` naming `text/html` is the long-standing signal. Neither is a no:
|
|
82
|
+
* a caller that cannot say what kind of request this is does not get to name
|
|
83
|
+
* the visitor's entry page.
|
|
84
|
+
*/
|
|
85
|
+
export declare function isDocumentRequest(headers: {
|
|
86
|
+
secFetchDest?: string | null;
|
|
87
|
+
accept?: string | null;
|
|
88
|
+
}): boolean;
|
|
89
|
+
//# sourceMappingURL=entry-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry-page.d.ts","sourceRoot":"","sources":["../../src/audiences/entry-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAE7E;;;;;GAKG;AACH,eAAO,MAAM,YAAY,eAAe,CAAA;AAExC;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOxD;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB,GAAG,kBAAuB,GAC1B,MAAM,GAAG,IAAI,CAKf;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB,GAAG,OAAO,CAGV"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entry page — the *write* side of the `kywi_entry` cookie contract
|
|
3
|
+
* (kywi-cms#196).
|
|
4
|
+
*
|
|
5
|
+
* `session.entryPage` has been in the signal catalogue and in the admin rule
|
|
6
|
+
* tester since the audience engine shipped, but nothing in core ever wrote it:
|
|
7
|
+
* `runServerCollectors` fed UTM params, the referrer and the visitor cookies
|
|
8
|
+
* into signal collection and left `session` at its schema defaults, so
|
|
9
|
+
* `entryPage` stayed `'/'` forever. A rule like
|
|
10
|
+
* `session.entryPage contains 'from=marketer'` could not fire on a real request
|
|
11
|
+
* no matter what the visitor did.
|
|
12
|
+
*
|
|
13
|
+
* This module is the missing writer, living next to its reader
|
|
14
|
+
* (`collectors/session.ts`) so a scaffolded app, the reference app and the
|
|
15
|
+
* runtime routes all share one implementation. The contract:
|
|
16
|
+
*
|
|
17
|
+
* • The value is `pathname + search` of the FIRST request of a session —
|
|
18
|
+
* `/developers?from=marketer`, not the whole URL. Query is included on
|
|
19
|
+
* purpose: a campaign link's own params are the interesting part.
|
|
20
|
+
* • It is written ONCE. A request that already carries the cookie returns
|
|
21
|
+
* `null` here, so "entry page" keeps meaning the page the visitor arrived
|
|
22
|
+
* on rather than quietly becoming "current page".
|
|
23
|
+
* • It is written only for a DOCUMENT request. If a subresource could record
|
|
24
|
+
* it, the first request of a session that happens to be `/kywi.js`, a font
|
|
25
|
+
* or an API call would name the entry page, and every rule downstream would
|
|
26
|
+
* be matching against an asset URL. Callers pass `Sec-Fetch-Dest` (and
|
|
27
|
+
* `Accept` for browsers that omit it); saying neither fails closed.
|
|
28
|
+
* • It is a SESSION cookie (no Max-Age): a new visit is a new entry page.
|
|
29
|
+
* • It is a `personalization` cookie in the category map, gated exactly like
|
|
30
|
+
* `kywi_visitor` and `kywi_utm` (kywi-cms#91). Without consent nothing is
|
|
31
|
+
* persisted — and the read side falls back to the CURRENT request's path,
|
|
32
|
+
* so a rule on the entry page still fires on the landing request itself.
|
|
33
|
+
* That fallback is also what makes `/developers?from=marketer` switch on
|
|
34
|
+
* the very request that carries it, with no reload, for everyone: a
|
|
35
|
+
* Set-Cookie only takes effect on the NEXT request.
|
|
36
|
+
*
|
|
37
|
+
* EDGE-SAFE LEAF MODULE: its only import is `./consent.js`, itself a zero-import
|
|
38
|
+
* leaf, because this is imported from Next.js edge middleware where core's
|
|
39
|
+
* DB-backed code cannot run. Keep it dependency-free beyond that. It is
|
|
40
|
+
* published as its own export entry (`@kywi-software/core/audiences/entry-page`)
|
|
41
|
+
* so importing it never drags in the DB-backed `audiences` barrel — the same
|
|
42
|
+
* arrangement as `utm-persistence.ts`.
|
|
43
|
+
*/
|
|
44
|
+
import { cookieAllowedByHeader } from './consent.js';
|
|
45
|
+
/**
|
|
46
|
+
* Cookie name the entry-page collector reads (mirrors `COOKIE_NAMES.ENTRY` in
|
|
47
|
+
* `audiences/cookies.ts`). Kept as a literal so this leaf imports nothing — the
|
|
48
|
+
* `cookies` module pulls in `jose`, which an edge writer does not need. A core
|
|
49
|
+
* test asserts this stays equal to `COOKIE_NAMES.ENTRY`, so the two cannot drift.
|
|
50
|
+
*/
|
|
51
|
+
export const ENTRY_COOKIE = 'kywi_entry';
|
|
52
|
+
/**
|
|
53
|
+
* The entry-page value for a URL: `pathname + search`, or `null` when the URL
|
|
54
|
+
* cannot be parsed. Exported because the READ side needs exactly the same
|
|
55
|
+
* derivation for its current-request fallback.
|
|
56
|
+
*/
|
|
57
|
+
export function entryPagePath(url) {
|
|
58
|
+
try {
|
|
59
|
+
const parsed = new URL(url);
|
|
60
|
+
return `${parsed.pathname}${parsed.search}`;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The value to write to `kywi_entry` for this request, or `null` to leave things
|
|
68
|
+
* alone. `null` when: the visitor has not consented to personalization, the
|
|
69
|
+
* cookie is already set (the session's entry page is already recorded), or the
|
|
70
|
+
* URL is unparseable.
|
|
71
|
+
*
|
|
72
|
+
* Callers write it as a SESSION cookie — `buildSetCookieHeader(ENTRY_COOKIE,
|
|
73
|
+
* value, -1, { httpOnly: false })`, or the framework equivalent with no
|
|
74
|
+
* `maxAge`.
|
|
75
|
+
*/
|
|
76
|
+
export function entryPageCookieValue(url, options = {}) {
|
|
77
|
+
if (!isDocumentRequest(options))
|
|
78
|
+
return null;
|
|
79
|
+
if (!cookieAllowedByHeader(ENTRY_COOKIE, options.cookieHeader, options))
|
|
80
|
+
return null;
|
|
81
|
+
if (hasEntryCookie(options.cookieHeader))
|
|
82
|
+
return null;
|
|
83
|
+
return entryPagePath(url);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Is this request the visitor navigating to a PAGE, rather than the page
|
|
87
|
+
* fetching something?
|
|
88
|
+
*
|
|
89
|
+
* `Sec-Fetch-Dest` is authoritative where it exists (every current browser
|
|
90
|
+
* sends it, and it is one of the headers a page cannot forge). Without it, an
|
|
91
|
+
* `Accept` naming `text/html` is the long-standing signal. Neither is a no:
|
|
92
|
+
* a caller that cannot say what kind of request this is does not get to name
|
|
93
|
+
* the visitor's entry page.
|
|
94
|
+
*/
|
|
95
|
+
export function isDocumentRequest(headers) {
|
|
96
|
+
if (headers.secFetchDest)
|
|
97
|
+
return headers.secFetchDest === 'document';
|
|
98
|
+
return (headers.accept ?? '').includes('text/html');
|
|
99
|
+
}
|
|
100
|
+
/** Is an entry page already recorded on this request? (Header scan, no deps.) */
|
|
101
|
+
function hasEntryCookie(header) {
|
|
102
|
+
if (!header)
|
|
103
|
+
return false;
|
|
104
|
+
for (const pair of header.split(';')) {
|
|
105
|
+
const trimmed = pair.trim();
|
|
106
|
+
const eqIdx = trimmed.indexOf('=');
|
|
107
|
+
if (eqIdx < 0)
|
|
108
|
+
continue;
|
|
109
|
+
if (trimmed.slice(0, eqIdx) !== ENTRY_COOKIE)
|
|
110
|
+
continue;
|
|
111
|
+
if (trimmed.slice(eqIdx + 1) !== '')
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=entry-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry-page.js","sourceRoot":"","sources":["../../src/audiences/entry-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAAE,qBAAqB,EAA2B,MAAM,cAAc,CAAA;AAE7E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAA;AAExC;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;QAC3B,OAAO,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAW,EACX,UAMyB,EAAE;IAE3B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAA;IAC5C,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC;QAAE,OAAO,IAAI,CAAA;IACpF,IAAI,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAA;IACrD,OAAO,aAAa,CAAC,GAAG,CAAC,CAAA;AAC3B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAGjC;IACC,IAAI,OAAO,CAAC,YAAY;QAAE,OAAO,OAAO,CAAC,YAAY,KAAK,UAAU,CAAA;IACpE,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AACrD,CAAC;AAED,iFAAiF;AACjF,SAAS,cAAc,CAAC,MAAiC;IACvD,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACzB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,KAAK,GAAG,CAAC;YAAE,SAAQ;QACvB,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,YAAY;YAAE,SAAQ;QACtD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE;YAAE,OAAO,IAAI,CAAA;IAClD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instant-match.d.ts","sourceRoot":"","sources":["../../../src/audiences/evaluator/instant-match.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAG1F,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"instant-match.d.ts","sourceRoot":"","sources":["../../../src/audiences/evaluator/instant-match.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAG1F,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CA4BhG;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,qBAAqB,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAgB3G"}
|
|
@@ -20,6 +20,13 @@ export function resolveSignalValue(signals, ref) {
|
|
|
20
20
|
return signals.session.entryPage;
|
|
21
21
|
if (ref === 'session.pagesVisited')
|
|
22
22
|
return signals.session.pagesVisited.join(',');
|
|
23
|
+
// `query.<param>` — this request's own query string (kywi-cms#196). An absent
|
|
24
|
+
// param is null, so `not_equals` matches it and `equals` does not, the same
|
|
25
|
+
// way an absent UTM param behaves.
|
|
26
|
+
if (ref.startsWith('query.')) {
|
|
27
|
+
const key = ref.slice(6);
|
|
28
|
+
return signals.query[key] ?? null;
|
|
29
|
+
}
|
|
23
30
|
if (ref.startsWith('selfId.')) {
|
|
24
31
|
const key = ref.slice(7);
|
|
25
32
|
return signals.selfId[key] ?? null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instant-match.js","sourceRoot":"","sources":["../../../src/audiences/evaluator/instant-match.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"instant-match.js","sourceRoot":"","sources":["../../../src/audiences/evaluator/instant-match.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,10 @@ export * from './consent.js';
|
|
|
5
5
|
export { personalizationRequiresConsent } from './consent-config.js';
|
|
6
6
|
export { REQUIRE_CONSENT_ENV, requireConsentFromEnv, assertConsentEnvAgreement, createConsentBannerCheck, } from './consent-startup.js';
|
|
7
7
|
export { utmCookieValue, UTM_COOKIE } from './utm-persistence.js';
|
|
8
|
+
export { entryPageCookieValue, entryPagePath, ENTRY_COOKIE } from './entry-page.js';
|
|
8
9
|
export * from './engine.js';
|
|
9
10
|
export * from './hmac.js';
|
|
10
|
-
export { runServerCollectors } from './collectors/index.js';
|
|
11
|
+
export { runServerCollectors, collectSession, collectQuery, collectSelfId } from './collectors/index.js';
|
|
11
12
|
export { resolveAudiences, type EvaluationTrace, type ConditionTrace, type ResolveResult } from './evaluator/resolver.js';
|
|
12
13
|
export { matchGlob } from './evaluator/glob.js';
|
|
13
14
|
export { evaluateInstantCondition, resolveSignalValue } from './evaluator/instant-match.js';
|
|
@@ -20,7 +21,7 @@ export { applyAudienceThemeOverrides, tokensToStyleBlock } from './theme-customi
|
|
|
20
21
|
export { getAudienceAnalytics, getAudiencesAnalytics, type AudienceAnalyticsData } from './analytics.js';
|
|
21
22
|
export { checkAudienceDeletionSafety, createPreviewContext, type AudienceDeletionSafetyResult } from './queries.js';
|
|
22
23
|
export { scanLayoutForAudience } from './deletion-guard.js';
|
|
23
|
-
export { getActiveAudiences, listAudiences, getAudienceById, createAudience, type CreateAudienceInput } from './queries.js';
|
|
24
|
+
export { getActiveAudiences, listAudiences, listPublicAudiences, getAudienceById, createAudience, type CreateAudienceInput } from './queries.js';
|
|
24
25
|
export { getSelfIdWidgetConfig, listSelfIdFields } from './queries.js';
|
|
25
26
|
export { evaluateActiveAudiences, type ServerAudienceEvaluation } from './server-eval.js';
|
|
26
27
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audiences/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAI5B,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sBAAsB,CAAA;AAI7B,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audiences/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAI5B,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sBAAsB,CAAA;AAI7B,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAIjE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnF,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACxG,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACzH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACxI,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAC1I,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AACzE,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC1F,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACxG,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,KAAK,4BAA4B,EAAE,MAAM,cAAc,CAAA;AACnH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAChJ,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAE,KAAK,wBAAwB,EAAE,MAAM,kBAAkB,CAAA"}
|
package/dist/audiences/index.js
CHANGED
|
@@ -11,9 +11,13 @@ export { REQUIRE_CONSENT_ENV, requireConsentFromEnv, assertConsentEnvAgreement,
|
|
|
11
11
|
// dependency-free leaf entry (`@kywi-software/core/audiences/utm-persistence`)
|
|
12
12
|
// for edge middleware that must not pull in this DB-backed barrel.
|
|
13
13
|
export { utmCookieValue, UTM_COOKIE } from './utm-persistence.js';
|
|
14
|
+
// Writer for the kywi_entry cookie collectSession reads (kywi-cms#196). Also a
|
|
15
|
+
// dependency-free leaf entry (`@kywi-software/core/audiences/entry-page`) for
|
|
16
|
+
// edge middleware, which is where an app normally writes it.
|
|
17
|
+
export { entryPageCookieValue, entryPagePath, ENTRY_COOKIE } from './entry-page.js';
|
|
14
18
|
export * from './engine.js';
|
|
15
19
|
export * from './hmac.js';
|
|
16
|
-
export { runServerCollectors } from './collectors/index.js';
|
|
20
|
+
export { runServerCollectors, collectSession, collectQuery, collectSelfId } from './collectors/index.js';
|
|
17
21
|
export { resolveAudiences } from './evaluator/resolver.js';
|
|
18
22
|
export { matchGlob } from './evaluator/glob.js';
|
|
19
23
|
export { evaluateInstantCondition, resolveSignalValue } from './evaluator/instant-match.js';
|
|
@@ -26,7 +30,7 @@ export { applyAudienceThemeOverrides, tokensToStyleBlock } from './theme-customi
|
|
|
26
30
|
export { getAudienceAnalytics, getAudiencesAnalytics } from './analytics.js';
|
|
27
31
|
export { checkAudienceDeletionSafety, createPreviewContext } from './queries.js';
|
|
28
32
|
export { scanLayoutForAudience } from './deletion-guard.js';
|
|
29
|
-
export { getActiveAudiences, listAudiences, getAudienceById, createAudience } from './queries.js';
|
|
33
|
+
export { getActiveAudiences, listAudiences, listPublicAudiences, getAudienceById, createAudience } from './queries.js';
|
|
30
34
|
export { getSelfIdWidgetConfig, listSelfIdFields } from './queries.js';
|
|
31
35
|
export { evaluateActiveAudiences } from './server-eval.js';
|
|
32
36
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audiences/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,4EAA4E;AAC5E,+EAA+E;AAC/E,4EAA4E;AAC5E,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sBAAsB,CAAA;AAC7B,uEAAuE;AACvE,+EAA+E;AAC/E,mEAAmE;AACnE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjE,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audiences/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,4EAA4E;AAC5E,+EAA+E;AAC/E,4EAA4E;AAC5E,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sBAAsB,CAAA;AAC7B,uEAAuE;AACvE,+EAA+E;AAC/E,mEAAmE;AACnE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjE,+EAA+E;AAC/E,8EAA8E;AAC9E,6DAA6D;AAC7D,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnF,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACxG,OAAO,EAAE,gBAAgB,EAAiE,MAAM,yBAAyB,CAAA;AACzH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAsE,MAAM,qBAAqB,CAAA;AACxI,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,gBAAgB,EAA2C,MAAM,oBAAoB,CAAA;AAC1I,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AACzE,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC1F,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAA8B,MAAM,gBAAgB,CAAA;AACxG,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAqC,MAAM,cAAc,CAAA;AACnH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAA4B,MAAM,cAAc,CAAA;AAChJ,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAiC,MAAM,kBAAkB,CAAA"}
|
|
@@ -8,6 +8,19 @@ export declare function buildAudienceWithGroups(audienceRow: AudienceRow, groupR
|
|
|
8
8
|
export declare function listAudiences(db: KywiDb, siteId: string): Promise<Audience[]>;
|
|
9
9
|
export declare function getAudienceById(db: KywiDb, id: string, siteId?: string): Promise<Audience | null>;
|
|
10
10
|
export declare function getActiveAudiences(db: KywiDb, siteId: string): Promise<Audience[]>;
|
|
11
|
+
/**
|
|
12
|
+
* The audiences a public page may name — active AND flagged `is_public`
|
|
13
|
+
* (kywi-cms#200), priority-ordered.
|
|
14
|
+
*
|
|
15
|
+
* Deliberately NOT `Audience`: this feeds an unauthenticated route, and an
|
|
16
|
+
* audience's condition groups are its targeting logic. Only the id and the name
|
|
17
|
+
* leave the database, so a page can render a chooser without publishing how
|
|
18
|
+
* anybody is classified.
|
|
19
|
+
*/
|
|
20
|
+
export declare function listPublicAudiences(db: KywiDb, siteId: string): Promise<Array<{
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
}>>;
|
|
11
24
|
export interface CreateAudienceInput {
|
|
12
25
|
siteId: string;
|
|
13
26
|
name: string;
|
|
@@ -15,6 +28,8 @@ export interface CreateAudienceInput {
|
|
|
15
28
|
priority: number;
|
|
16
29
|
status?: 'active' | 'draft' | 'archived';
|
|
17
30
|
scoreThreshold?: number;
|
|
31
|
+
/** List this audience's name publicly (kywi-cms#200). Defaults to false. */
|
|
32
|
+
public?: boolean;
|
|
18
33
|
conditionGroups?: Array<{
|
|
19
34
|
conditions: Array<{
|
|
20
35
|
type: 'instant' | 'score';
|
|
@@ -36,6 +51,7 @@ export declare function updateAudience(db: KywiDb, id: string, input: Partial<{
|
|
|
36
51
|
priority: number;
|
|
37
52
|
status: 'active' | 'draft' | 'archived';
|
|
38
53
|
scoreThreshold: number | null;
|
|
54
|
+
public: boolean;
|
|
39
55
|
}>, siteId?: string): Promise<Audience | null>;
|
|
40
56
|
export declare function deleteAudience(db: KywiDb, id: string, siteId?: string): Promise<boolean>;
|
|
41
57
|
export declare function reorderAudiences(db: KywiDb, siteId: string, orderedIds: string[]): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/audiences/queries.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,cAAc,EAKf,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EACV,QAAQ,EAGR,WAAW,EACX,kBAAkB,EAEnB,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAM7C,MAAM,MAAM,WAAW,GAAG,OAAO,aAAa,CAAC,YAAY,CAAA;AAC3D,MAAM,MAAM,iBAAiB,GAAG,OAAO,mBAAmB,CAAC,YAAY,CAAA;AACvE,MAAM,MAAM,YAAY,GAAG,OAAO,cAAc,CAAC,YAAY,CAAA;AAI7D,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,iBAAiB,EAAE,EAC9B,aAAa,EAAE,YAAY,EAAE,GAC5B,QAAQ,
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/audiences/queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,6 +54,8 @@ export function buildAudienceWithGroups(audienceRow, groupRows, conditionRows) {
|
|
|
54
54
|
priority: audienceRow.priority,
|
|
55
55
|
status: audienceRow.status,
|
|
56
56
|
scoreThreshold: audienceRow.scoreThreshold,
|
|
57
|
+
// Column `is_public`, wire/domain field `public` — see audiences/schema.ts.
|
|
58
|
+
public: audienceRow.isPublic,
|
|
57
59
|
createdAt: audienceRow.createdAt,
|
|
58
60
|
updatedAt: audienceRow.updatedAt,
|
|
59
61
|
conditionGroups,
|
|
@@ -144,6 +146,22 @@ export async function getActiveAudiences(db, siteId) {
|
|
|
144
146
|
return buildAudienceWithGroups(aud, audGroups, audConditions);
|
|
145
147
|
});
|
|
146
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* The audiences a public page may name — active AND flagged `is_public`
|
|
151
|
+
* (kywi-cms#200), priority-ordered.
|
|
152
|
+
*
|
|
153
|
+
* Deliberately NOT `Audience`: this feeds an unauthenticated route, and an
|
|
154
|
+
* audience's condition groups are its targeting logic. Only the id and the name
|
|
155
|
+
* leave the database, so a page can render a chooser without publishing how
|
|
156
|
+
* anybody is classified.
|
|
157
|
+
*/
|
|
158
|
+
export async function listPublicAudiences(db, siteId) {
|
|
159
|
+
return db
|
|
160
|
+
.select({ id: kywiAudiences.id, name: kywiAudiences.name })
|
|
161
|
+
.from(kywiAudiences)
|
|
162
|
+
.where(and(eq(kywiAudiences.siteId, siteId), eq(kywiAudiences.status, 'active'), eq(kywiAudiences.isPublic, true)))
|
|
163
|
+
.orderBy(asc(kywiAudiences.priority));
|
|
164
|
+
}
|
|
147
165
|
export async function createAudience(db, input) {
|
|
148
166
|
const insertValues = {
|
|
149
167
|
siteId: input.siteId,
|
|
@@ -156,6 +174,8 @@ export async function createAudience(db, input) {
|
|
|
156
174
|
insertValues.status = input.status;
|
|
157
175
|
if (input.scoreThreshold !== undefined)
|
|
158
176
|
insertValues.scoreThreshold = input.scoreThreshold;
|
|
177
|
+
if (input.public !== undefined)
|
|
178
|
+
insertValues.isPublic = input.public;
|
|
159
179
|
const [audienceRow] = await db
|
|
160
180
|
.insert(kywiAudiences)
|
|
161
181
|
.values(insertValues)
|
|
@@ -205,9 +225,16 @@ export async function createAudience(db, input) {
|
|
|
205
225
|
return buildAudienceWithGroups(aud, insertedGroups, insertedConditions);
|
|
206
226
|
}
|
|
207
227
|
export async function updateAudience(db, id, input, siteId) {
|
|
228
|
+
// `public` is the wire/domain name; the column is `is_public` (see schema.ts),
|
|
229
|
+
// so it is translated rather than spread through.
|
|
230
|
+
const { public: isPublic, ...columns } = input;
|
|
208
231
|
const [row] = await db
|
|
209
232
|
.update(kywiAudiences)
|
|
210
|
-
.set({
|
|
233
|
+
.set({
|
|
234
|
+
...columns,
|
|
235
|
+
...(isPublic !== undefined ? { isPublic } : {}),
|
|
236
|
+
updatedAt: new Date(),
|
|
237
|
+
})
|
|
211
238
|
.where(siteId === undefined
|
|
212
239
|
? eq(kywiAudiences.id, id)
|
|
213
240
|
: and(eq(kywiAudiences.id, id), eq(kywiAudiences.siteId, siteId)))
|