@mindful-web/marko-web-identity-x 1.76.7 → 1.78.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CLAUDE.md ADDED
@@ -0,0 +1,139 @@
1
+ # marko-web-identity-x — Claude Code Context
2
+
3
+ The Marko/Express wrapper for **IdentityX** (Parameter1's identity + access platform) on Mindful
4
+ Web sites. Owns the whole authenticated-user surface: login / register / authenticate (email-link)
5
+ / profile / logout, content access + download gating, comments, and the server-side IdentityX API
6
+ client. Add-ons layer on top: `marko-web-omeda-identity-x` (wraps this and adds Omeda hooks —
7
+ how most sites install it), `marko-web-auth0-identity-x`, `marko-web-identity-x-mailchimp`. Google
8
+ Sign-In (One-Tap + button) is **built in** here (see below).
9
+
10
+ ## Config model — the `IdentityXConfiguration` instance (`config.js`)
11
+
12
+ Unlike most Mindful packages, config is **not** read from `site.getAsObject(...)` — it's an
13
+ instance of `IdentityXConfiguration` (`new IdentityX({...})`), passed to the installer and injected
14
+ onto every request as `req.identityX.config`. Read in templates via
15
+ `req.identityX.config.get(...)` / `.getAsObject(...)` / typed getters.
16
+
17
+ ```js
18
+ const IdentityX = require('@mindful-web/marko-web-identity-x/config');
19
+ const config = new IdentityX({
20
+ appId: '<APP-ID>', // required
21
+ apiToken: process.env.IDENTITYX_API_TOKEN, // required for write ops
22
+ requiredServerFields: ['organization', 'countryCode'],
23
+ requiredClientFields: [...], // gate access until present
24
+ hiddenFields: [...], defaultCountryCode, booleanQuestionsLabel, gtmUserFields,
25
+ onHookError: newrelic.noticeError.bind(newrelic), // hook + google-auth error reporter
26
+ googleAuth: { clientId, missingFieldsBehavior, autoPrompt, signInButtonEnabled }, // opt-in; see below
27
+ });
28
+ ```
29
+
30
+ Arbitrary extra keys pass through `...rest` into `options` and are reachable via `config.get(path)`.
31
+ `endpointTypes` (`authenticate|changeEmail|login|logout|register|profile`) map to `/user/<type>`
32
+ routes via `getEndpointFor(type)` (override with an `endpoints` config key).
33
+
34
+ ## Wiring (`index.js`)
35
+
36
+ `IdentityX(app, config, { templates })`:
37
+ 1. `app.use(middleware(config))` — injects the service (below).
38
+ 2. `app.use('/__idx', routes)` — the JSON API router.
39
+ 3. For each `endpointType` with a supplied `template`, registers `GET <endpoint>` to render it
40
+ (the `authenticate` endpoint redirects to profile when a token is already present).
41
+
42
+ Most sites don't call this directly — they call `omedaIdentityX(app, { idxConfig, idxRouteTemplates, … })`,
43
+ which adds Omeda integration hooks to `idxConfig` and then calls `identityX(app, idxConfig, …)`
44
+ internally. So **`googleAuth` goes on the `idxConfig` instance**, not the omeda params and not site config.
45
+
46
+ ## Middleware (`middleware.js`)
47
+
48
+ Injects a per-request `IdentityX` **service** instance as `req.identityX` (+ `res.locals.identityX`),
49
+ reads the token cookie, and sets the identity cookie for logged-in users. `IdentityXRequest.identityX`
50
+ is the type every route/template relies on.
51
+
52
+ ## Routes — `/__idx/*` (`routes/index.js`)
53
+
54
+ JSON API behind the Vue components: `authenticate`, `login`, `login-fields`, `logout`, `profile`,
55
+ `access`, `download`, `change-email/{initiate,confirm}`, `comment(s)`/`comment-count`/`flag`,
56
+ `countries`/`regions`, and **`google`** (see below). `logout.js` removes the context cookie, calls
57
+ `onLogout` (tokenless) or `logoutAppUser`, and **clears the GIS `g_state` cookie** unconditionally.
58
+
59
+ ## Components / tags (`components/marko.json`)
60
+
61
+ Marko wrappers (`<marko-web-identity-x-*>`) that render a matching **browser Vue component**
62
+ (`browser/*.vue`, registered in `browser/index.js` as `IdentityX*`, overridable via
63
+ `Custom*Component`): `form-login`, `form-authenticate`, `form-register`, `form-profile`,
64
+ `form-change-email`, `form-logout`, `form-access`, `access`, `comment-stream`, `identify` /
65
+ `non-auth-identify`, `context` (a `|{ user, application, fields, isEnabled }|` provider), and the
66
+ Google tags. Vue components emit an EventBus stream bridged to `dataLayer` + p1events (see
67
+ `browser/index.js`).
68
+
69
+ ## Service (`service.js`)
70
+
71
+ Server-side IdentityX GraphQL client (Apollo, idx-compat). Key methods: `loadActiveContext`,
72
+ `loadAppUserByEmail` / `findUserById` / `findUserByExternalId`, `createAppUser`,
73
+ `impersonateAppUser`, `logoutAppUser`, `addExternalUserId`, `setUnverifiedAppUserData`,
74
+ `generateEntityId`, `sendLoginLink`, `checkContentAccess`, cookie helpers (`setToken`,
75
+ `setIdentityCookie`, `getIdentity`). Org-scoped writes use `getOrgUserApiToken()`.
76
+
77
+ ## Hooks (`hooks.js`)
78
+
79
+ `onLoadActiveContext`, `onLoginLinkSent`, `onAuthenticationSuccess`, `onLogout`,
80
+ `onChangeEmailLinkSent`, `onChangeEmailSuccess`, `onUserProfileUpdate`. Registered via
81
+ `config.addHook({ name, fn, shouldAwait })` and invoked with `utils/call-hooks-for`. This is the
82
+ seam Omeda uses for rapid-identify + subscription sync. **Note:** `onLogout` currently fires only
83
+ in the tokenless logout branch — a "fire `onLogout` always" change would let the `g_state` clear
84
+ become a hook rather than inline route code.
85
+
86
+ ## Google Sign-In (One-Tap + button) — folded in 2026-07
87
+
88
+ Verifies a Google Identity Services (GIS) credential server-side and drops the user into the
89
+ standard IdentityX session, bypassing the email-link step. Handles the One-Tap prompt **and** the
90
+ rendered "Sign in with Google" button; both post to `POST /__idx/google`. **Dormant until
91
+ `googleAuth.clientId` is set** — no client id ⇒ nothing renders and the route 400s. Previously a
92
+ standalone `marko-web-google-identity-x` package; folded in here because it was ~all ceremony gated
93
+ on a client id and already depended on idx internals.
94
+
95
+ **Config** (on the IdentityX config, above): `clientId` (master gate — per-deploy env),
96
+ `missingFieldsBehavior` (`profile-gate` default | `immediate` | `relaxed`; `relaxed` is a doc-only
97
+ alias of `immediate` — only `profile-gate` is special-cased), `autoPrompt` (site-wide floating
98
+ overlay), `signInButtonEnabled` (button; default true).
99
+
100
+ **Route — `routes/google.js` (`POST /__idx/google`).** Verify the JWT →
101
+ `loadAppUserByEmail`/`createAppUser` (**email is the primary key**) → link the Google `sub` as a
102
+ supplementary external id under `{ provider:'google', tenant:'oauth', type:'account' }` (idempotent;
103
+ conflict-guarded; non-fatal via `config.get('onHookError')`) → `impersonateAppUser({ method:'GOOGLE_ONE_TAP', verify:true })`
104
+ → backfill given/family name only if absent → fire `onLoginLinkSent` **then** (re-fetch)
105
+ `onAuthenticationSuccess`, same order/hooks as email-link so Omeda rapid-identify + subscription
106
+ sync run identically. `profile-gate` computes `requiresUserInput` by checking required fields are
107
+ non-empty (deliberately not `forceProfileReVerification`). Responds `{ ok, requiresUserInput,
108
+ redirectTo, user, entity, … }`; the client redirects to `/user/profile` when input is required.
109
+
110
+ **Tags** (`components/marko.json`, config read from `req.identityX.config`):
111
+ - `<marko-web-identity-x-google-init>` — loads the GSI client + defines `window.handleGoogleOneTapCredential`;
112
+ shows the One-Tap prompt when `autoPrompt`. The button depends on this being on the page.
113
+ - `<marko-web-identity-x-google-sign-in-button client-id= redirect-to= label=>` — the button; self-hides
114
+ when unconfigured or `signInButtonEnabled` is false.
115
+
116
+ **Auto-rendering.** Both tags render inside `form-login.marko` + `form-authenticate.marko`, so the
117
+ login/authenticate pages get the button with **no per-site edit**. For the site-wide floating prompt
118
+ (`autoPrompt: true`), a site additionally drops `<marko-web-identity-x-google-init/>` once in its
119
+ document layout, gated on `!req.identityX.token`. The button tag can also be placed in a content
120
+ meter / gate.
121
+
122
+ **CSS.** `.google-sign-in` styles ship in `marko-web-theme-monorail/scss/components/_identity-x.scss`
123
+ (with the rest of the auth CSS) — no separate import.
124
+
125
+ **Logout.** `routes/logout.js` clears the GIS `g_state` cookie so a later sign-in with a *different*
126
+ Google account isn't blocked by stale auto-select state (harmless no-op when Google Sign-In is unused).
127
+
128
+ **Deliberate decisions / limitations.** `loginSource: 'google-one-tap'` and
129
+ `method: 'GOOGLE_ONE_TAP'` are emitted for BOTH surfaces (don't distinguish button vs prompt) —
130
+ kept for analytics/enum continuity. One success p1event (`Identity / Authenticate`, label
131
+ `Google Sign In` for the button via GIS `select_by` `btn*`, else `Google One Tap`), fired client-side
132
+ after `setIdentity`. `google-auth-library` is now a base-idx dependency (every site pulls it,
133
+ server-only) — accepted because the feature is gated on the client id. The Google OAuth app must
134
+ list each site origin as an authorized JavaScript origin or the surfaces silently no-show.
135
+
136
+ ## Fleet / rollout
137
+
138
+ Not tracked in-repo. The Google-auth architecture change + fleet rollout plan lives outside the repo
139
+ at `../GOOGLE-AUTH-ROLLOUT.md` (mindful working dir).
package/README.md CHANGED
@@ -197,4 +197,52 @@ Each component will emit an event when an error is encountered and include the e
197
197
  | `identity-x-profile-errored` | `{ label, message: '...', ...additionalEventData }`
198
198
  | `identity-x-comment-post-errored` | `{ label, message: '...', ...additionalEventData }`
199
199
  | `identity-x-comment-report-errored` | `{ label, message: '...', ...additionalEventData }`
200
+
201
+ ## Google Sign-In (One-Tap + button)
202
+
203
+ Built in. Verifies a Google Identity Services (GIS) credential server-side and drops the user
204
+ into the standard IdentityX session, bypassing the email-link step. Handles both the One-Tap
205
+ prompt and the rendered "Sign in with Google" button; both post to `POST /__idx/google`.
206
+
207
+ **Dormant until configured** — with no `clientId`, nothing renders and the route 400s. Enable
208
+ per-site by adding a `googleAuth` block to the IdentityX config:
209
+
210
+ ```js
211
+ const config = new IdentityX({
212
+ appId: '<MY-APPLICATION-ID>',
213
+ googleAuth: {
214
+ clientId: process.env.GOOGLE_AUTH_CLIENT_ID || '', // GIS OAuth client id — the master gate
215
+ missingFieldsBehavior: 'profile-gate', // 'profile-gate' | 'immediate' | 'relaxed'
216
+ autoPrompt: false, // floating One-Tap overlay
217
+ signInButtonEnabled: true, // render the button
218
+ },
219
+ });
220
+ ```
221
+
222
+ Reading the values from env is optional — set literals here if you'd rather not manage infra
223
+ env vars. The client id's Google OAuth app must list each site origin as an **authorized
224
+ JavaScript origin**, or the prompt/button silently no-shows.
225
+
226
+ `missingFieldsBehavior`: `profile-gate` authenticates immediately but forces profile completion
227
+ before gated content; `immediate`/`relaxed` grant access with fields left blank (`relaxed` is a
228
+ doc-only alias of `immediate`).
229
+
230
+ **Rendering.** The button + GIS init are rendered automatically inside the `form-login` and
231
+ `form-authenticate` templates — no per-site placement, and both self-hide when unconfigured. For
232
+ the **site-wide floating One-Tap prompt** (`autoPrompt: true`), also drop
233
+ `<marko-web-identity-x-google-init/>` once in your document layout, gated on an unauthenticated
234
+ user, e.g. `<if(!req.identityX.token)> <marko-web-identity-x-google-init/> </if>`. The button tag
235
+ (`<marko-web-identity-x-google-sign-in-button redirect-to=... />`) can also be placed in a content meter
236
+ or gate if desired.
237
+
238
+ **CSS.** Styles ship with the rest of the auth CSS in `marko-web-theme-monorail`
239
+ (`scss/components/_identity-x.scss`) — no separate import.
240
+
241
+ **Logout.** The idx logout route clears the GIS `g_state` cookie so a later sign-in with a
242
+ *different* Google account isn't blocked by stale auto-select state (harmless no-op when Google
243
+ Sign-In isn't used).
244
+
245
+ The Google account id (JWT `sub`) is persisted as a supplementary idx external id under
246
+ `{ provider: 'google', tenant: 'oauth', type: 'account' }`; email stays the primary key.
247
+ Non-fatal linkage errors report through the config's `onHookError`.
200
248
  | `identity-x-comment-stream-errored` | `{ label, message: '...', ...additionalEventData }`
@@ -231,6 +231,10 @@ export default {
231
231
  type: Object,
232
232
  default: null,
233
233
  },
234
+ contentEntity: {
235
+ type: String,
236
+ default: null,
237
+ },
234
238
  customBooleanFieldAnswers: {
235
239
  type: Array,
236
240
  default: () => [],
@@ -351,7 +355,11 @@ export default {
351
355
  this.isLoading = true;
352
356
  this.didSubmit = false;
353
357
  try {
354
- const additionalEventData = { ...this.additionalEventData, actionSource: this.loginSource };
358
+ const additionalEventData = {
359
+ ...this.additionalEventData,
360
+ actionSource: this.loginSource,
361
+ ...(this.contentEntity && { ent: this.contentEntity }),
362
+ };
355
363
  let data = {};
356
364
  if (this.canUpdateProfile) {
357
365
  const res = await post('/profile', { ...this.user, additionalEventData });
@@ -421,7 +429,10 @@ export default {
421
429
  contentId: content.id,
422
430
  contentType: content.type,
423
431
  userId: this.user.id,
424
- additionalEventData,
432
+ additionalEventData: {
433
+ ...additionalEventData,
434
+ ...(this.contentEntity && { ent: this.contentEntity }),
435
+ },
425
436
  }, data.entity);
426
437
  } catch (e) {
427
438
  this.error = e;
@@ -57,6 +57,10 @@ export default {
57
57
  type: String,
58
58
  default: 'en',
59
59
  },
60
+ contentEntity: {
61
+ type: String,
62
+ default: null,
63
+ },
60
64
  },
61
65
 
62
66
  /**
@@ -96,10 +100,14 @@ export default {
96
100
  this.isLoading = true;
97
101
  const { currentDisplayName, body, stream } = this;
98
102
  try {
103
+ const additionalEventData = {
104
+ ...(this.contentEntity && { ent: this.contentEntity }),
105
+ };
99
106
  const res = await post('/comment', {
100
107
  displayName: currentDisplayName,
101
108
  body,
102
109
  stream,
110
+ additionalEventData,
103
111
  });
104
112
  const data = await res.json();
105
113
  if (!res.ok) throw new FormError(data.message, res.status);
@@ -20,7 +20,7 @@
20
20
  <create
21
21
  v-else
22
22
  :display-name="activeUser.displayName"
23
- :stream="{ identifier, title, description, url }"
23
+ :stream="{ identifier, type, title, description, url }"
24
24
  @comment-post-submitted="load"
25
25
  :lang="lang"
26
26
  />
@@ -34,7 +34,7 @@
34
34
  </p>
35
35
  <login
36
36
  :class="element('login-form')"
37
- :additional-event-data="additionalEventData"
37
+ :additional-event-data="enrichedAdditionalEventData"
38
38
  :source="loginSource"
39
39
  :endpoints="endpoints"
40
40
  :custom-select-field-answers="loginCustomSelectFieldAnswers"
@@ -133,6 +133,10 @@ export default {
133
133
  type: String,
134
134
  required: true,
135
135
  },
136
+ type: {
137
+ type: String,
138
+ default: undefined,
139
+ },
136
140
  title: {
137
141
  type: String,
138
142
  default: undefined,
@@ -241,6 +245,10 @@ export default {
241
245
  type: String,
242
246
  default: 'en',
243
247
  },
248
+ contentEntity: {
249
+ type: String,
250
+ default: null,
251
+ },
244
252
  },
245
253
 
246
254
  data: () => ({
@@ -280,6 +288,16 @@ export default {
280
288
  approvedComments() {
281
289
  return this.comments.filter((comment) => comment.approved);
282
290
  },
291
+
292
+ /**
293
+ *
294
+ */
295
+ enrichedAdditionalEventData() {
296
+ return {
297
+ ...(this.additionalEventData || {}),
298
+ ...(this.contentEntity && { ent: this.contentEntity }),
299
+ };
300
+ },
283
301
  },
284
302
 
285
303
  /**
@@ -238,6 +238,10 @@ export default {
238
238
  type: Object,
239
239
  default: null,
240
240
  },
241
+ contentEntity: {
242
+ type: String,
243
+ default: null,
244
+ },
241
245
  customBooleanFieldAnswers: {
242
246
  type: Array,
243
247
  default: () => [],
@@ -354,7 +358,11 @@ export default {
354
358
  this.isLoading = true;
355
359
  this.didSubmit = false;
356
360
  try {
357
- const additionalEventData = { ...this.additionalEventData, actionSource: this.loginSource };
361
+ const additionalEventData = {
362
+ ...this.additionalEventData,
363
+ actionSource: this.loginSource,
364
+ ...(this.contentEntity && { ent: this.contentEntity }),
365
+ };
358
366
  let data = {};
359
367
  if (this.canUpdateProfile) {
360
368
  const res = await post('/profile', { ...this.user, additionalEventData });
@@ -422,7 +430,10 @@ export default {
422
430
  contentType: content.type,
423
431
  companyId: company.id,
424
432
  userId: this.user.id,
425
- additionalEventData,
433
+ additionalEventData: {
434
+ ...additionalEventData,
435
+ ...(this.contentEntity && { ent: this.contentEntity }),
436
+ },
426
437
  }, entity);
427
438
  this.downloaded.push(content.id);
428
439
  }
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
 
4
4
  var marko_template = module.exports = require("marko/dist/html").t(__filename),
5
- marko_componentType = "/@mindful-web/marko-web-identity-x$1.76.7/components/access.marko",
5
+ marko_componentType = "/@mindful-web/marko-web-identity-x$1.78.0/components/access.marko",
6
6
  marko_component = require("./access.marko"),
7
7
  marko_renderer = require("marko/dist/runtime/components/renderer"),
8
8
  module_objectPath_module = require("@mindful-web/object-path"),
@@ -53,7 +53,7 @@ marko_template._ = marko_renderer(render, {
53
53
  }, marko_component);
54
54
 
55
55
  marko_template.meta = {
56
- id: "/@mindful-web/marko-web-identity-x$1.76.7/components/access.marko",
56
+ id: "/@mindful-web/marko-web-identity-x$1.78.0/components/access.marko",
57
57
  component: "./access.marko",
58
58
  tags: [
59
59
  "@mindful-web/marko-core/components/resolve.marko"
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
 
4
4
  var marko_template = module.exports = require("marko/dist/html").t(__filename),
5
- marko_componentType = "/@mindful-web/marko-web-identity-x$1.76.7/components/comment-stream.marko",
5
+ marko_componentType = "/@mindful-web/marko-web-identity-x$1.78.0/components/comment-stream.marko",
6
6
  marko_component = require("./comment-stream.marko"),
7
7
  marko_renderer = require("marko/dist/runtime/components/renderer"),
8
8
  module_objectPath_module = require("@mindful-web/object-path"),
@@ -85,7 +85,7 @@ marko_template._ = marko_renderer(render, {
85
85
  }, marko_component);
86
86
 
87
87
  marko_template.meta = {
88
- id: "/@mindful-web/marko-web-identity-x$1.76.7/components/comment-stream.marko",
88
+ id: "/@mindful-web/marko-web-identity-x$1.78.0/components/comment-stream.marko",
89
89
  component: "./comment-stream.marko",
90
90
  tags: [
91
91
  "@mindful-web/marko-web/components/browser-component.marko",
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
 
4
4
  var marko_template = module.exports = require("marko/dist/html").t(__filename),
5
- marko_componentType = "/@mindful-web/marko-web-identity-x$1.76.7/components/context.marko",
5
+ marko_componentType = "/@mindful-web/marko-web-identity-x$1.78.0/components/context.marko",
6
6
  marko_component = require("./context.marko"),
7
7
  marko_renderer = require("marko/dist/runtime/components/renderer"),
8
8
  marko_dynamicTag = require("marko/dist/runtime/helpers/dynamic-tag"),
@@ -49,7 +49,7 @@ marko_template._ = marko_renderer(render, {
49
49
  }, marko_component);
50
50
 
51
51
  marko_template.meta = {
52
- id: "/@mindful-web/marko-web-identity-x$1.76.7/components/context.marko",
52
+ id: "/@mindful-web/marko-web-identity-x$1.78.0/components/context.marko",
53
53
  component: "./context.marko",
54
54
  tags: [
55
55
  "@mindful-web/marko-core/components/resolve.marko"
@@ -1,6 +1,7 @@
1
1
 
2
2
  import defaultValue from "@mindful-web/marko-core/utils/default-value";
3
3
  import { get, getAsArray, getAsObject } from "@mindful-web/object-path";
4
+ import baseContentEntity from "@mindful-web/marko-web-p1-events/utils/base-content-entity";
4
5
 
5
6
  import getCreateUserCustomFields from '../utils/get-create-user-custom-fields'
6
7
  import getFormCustomFields from '../utils/get-form-custom-fields'
@@ -53,9 +54,12 @@ $ const loginButtonLabels = defaultValue(input.loginButtonLabels, {
53
54
  siteContext: content.siteContext,
54
55
  });
55
56
 
57
+ $ const contentEntity = (content && content.id && content.type) ? baseContentEntity(content.id, content.type) : null;
58
+
56
59
  $ const props = {
57
60
  // Access form props
58
61
  content: formAccessContent(content),
62
+ contentEntity: contentEntity,
59
63
  title: form.title,
60
64
  fieldRows: form.fieldRows,
61
65
  loginSource: "contentAccess",
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
 
4
4
  var marko_template = module.exports = require("marko/dist/html").t(__filename),
5
- marko_componentType = "/@mindful-web/marko-web-identity-x$1.76.7/components/form-access.marko",
5
+ marko_componentType = "/@mindful-web/marko-web-identity-x$1.78.0/components/form-access.marko",
6
6
  marko_component = require("./form-access.marko"),
7
7
  marko_renderer = require("marko/dist/runtime/components/renderer"),
8
8
  module_defaultValue = require("@mindful-web/marko-core/utils/default-value"),
@@ -12,6 +12,8 @@ var marko_template = module.exports = require("marko/dist/html").t(__filename),
12
12
  get = module_objectPath_module.get,
13
13
  getAsArray = module_objectPath_module.getAsArray,
14
14
  getAsObject = module_objectPath_module.getAsObject,
15
+ module_baseContentEntity = require("@mindful-web/marko-web-p1-events/utils/base-content-entity"),
16
+ baseContentEntity = module_baseContentEntity.default || module_baseContentEntity,
15
17
  module_getCreateUserCustomFields = require("../utils/get-create-user-custom-fields"),
16
18
  getCreateUserCustomFields = module_getCreateUserCustomFields.default || module_getCreateUserCustomFields,
17
19
  module_getFormCustomFields = require("../utils/get-form-custom-fields"),
@@ -93,9 +95,12 @@ function render(input, out, __component, component, state) {
93
95
  siteContext: content.siteContext,
94
96
  });
95
97
 
98
+ const contentEntity = (content && content.id && content.type) ? baseContentEntity(content.id, content.type) : null;
99
+
96
100
  const props = {
97
101
  // Access form props
98
102
  content: formAccessContent(content),
103
+ contentEntity: contentEntity,
99
104
  title: form.title,
100
105
  fieldRows: form.fieldRows,
101
106
  loginSource: "contentAccess",
@@ -174,7 +179,7 @@ marko_template._ = marko_renderer(render, {
174
179
  }, marko_component);
175
180
 
176
181
  marko_template.meta = {
177
- id: "/@mindful-web/marko-web-identity-x$1.76.7/components/form-access.marko",
182
+ id: "/@mindful-web/marko-web-identity-x$1.78.0/components/form-access.marko",
178
183
  component: "./form-access.marko",
179
184
  tags: [
180
185
  "@mindful-web/marko-web/components/browser-component.marko",
@@ -32,5 +32,7 @@ $ const lang = input.lang || defaultValue(site.config.lang, "en");
32
32
  lang
33
33
  };
34
34
  <marko-web-browser-component name="IdentityXAuthenticate" props=props />
35
+ <marko-web-identity-x-google-init/>
36
+ <marko-web-identity-x-google-sign-in-button redirect-to=query.redirectTo/>
35
37
  </marko-web-identity-x-context>
36
38
  </if>
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
 
4
4
  var marko_template = module.exports = require("marko/dist/html").t(__filename),
5
- marko_componentType = "/@mindful-web/marko-web-identity-x$1.76.7/components/form-authenticate.marko",
5
+ marko_componentType = "/@mindful-web/marko-web-identity-x$1.78.0/components/form-authenticate.marko",
6
6
  marko_component = require("./form-authenticate.marko"),
7
7
  marko_renderer = require("marko/dist/runtime/components/renderer"),
8
8
  module_objectPath_module = require("@mindful-web/object-path"),
@@ -13,6 +13,10 @@ var marko_template = module.exports = require("marko/dist/html").t(__filename),
13
13
  marko_web_browser_component_template = require("@mindful-web/marko-web/components/browser-component.marko"),
14
14
  marko_loadTag = require("marko/dist/runtime/helpers/load-tag"),
15
15
  marko_web_browser_component_tag = marko_loadTag(marko_web_browser_component_template),
16
+ marko_web_identity_x_google_init_template = require("./google-init.marko"),
17
+ marko_web_identity_x_google_init_tag = marko_loadTag(marko_web_identity_x_google_init_template),
18
+ marko_web_identity_x_google_sign_in_button_template = require("./google-sign-in-button.marko"),
19
+ marko_web_identity_x_google_sign_in_button_tag = marko_loadTag(marko_web_identity_x_google_sign_in_button_template),
16
20
  marko_web_identity_x_context_template = require("./context.marko"),
17
21
  marko_web_identity_x_context_tag = marko_loadTag(marko_web_identity_x_context_template);
18
22
 
@@ -61,6 +65,12 @@ function render(input, out, __component, component, state) {
61
65
  name: "IdentityXAuthenticate",
62
66
  props: props
63
67
  }, out, __component, "1");
68
+
69
+ marko_web_identity_x_google_init_tag({}, out, __component, "2");
70
+
71
+ marko_web_identity_x_google_sign_in_button_tag({
72
+ redirectTo: query.redirectTo
73
+ }, out, __component, "3");
64
74
  }
65
75
  }, out, __component, "0");
66
76
  }
@@ -71,10 +81,12 @@ marko_template._ = marko_renderer(render, {
71
81
  }, marko_component);
72
82
 
73
83
  marko_template.meta = {
74
- id: "/@mindful-web/marko-web-identity-x$1.76.7/components/form-authenticate.marko",
84
+ id: "/@mindful-web/marko-web-identity-x$1.78.0/components/form-authenticate.marko",
75
85
  component: "./form-authenticate.marko",
76
86
  tags: [
77
87
  "@mindful-web/marko-web/components/browser-component.marko",
88
+ "./google-init.marko",
89
+ "./google-sign-in-button.marko",
78
90
  "./context.marko"
79
91
  ]
80
92
  };
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
 
4
4
  var marko_template = module.exports = require("marko/dist/html").t(__filename),
5
- marko_componentType = "/@mindful-web/marko-web-identity-x$1.76.7/components/form-change-email.marko",
5
+ marko_componentType = "/@mindful-web/marko-web-identity-x$1.78.0/components/form-change-email.marko",
6
6
  marko_component = require("./form-change-email.marko"),
7
7
  marko_renderer = require("marko/dist/runtime/components/renderer"),
8
8
  module_objectPath_module = require("@mindful-web/object-path"),
@@ -59,7 +59,7 @@ marko_template._ = marko_renderer(render, {
59
59
  }, marko_component);
60
60
 
61
61
  marko_template.meta = {
62
- id: "/@mindful-web/marko-web-identity-x$1.76.7/components/form-change-email.marko",
62
+ id: "/@mindful-web/marko-web-identity-x$1.78.0/components/form-change-email.marko",
63
63
  component: "./form-change-email.marko",
64
64
  tags: [
65
65
  "@mindful-web/marko-web/components/browser-component.marko",
@@ -40,6 +40,8 @@ $ const withFields = defaultValue(input.withFields, false);
40
40
  };
41
41
  <if(isEnabled)>
42
42
  <marko-web-browser-component name="IdentityXLogin" props=props />
43
+ <marko-web-identity-x-google-init/>
44
+ <marko-web-identity-x-google-sign-in-button redirect-to=input.redirect/>
43
45
  </if>
44
46
  </marko-web-identity-x-context>
45
47
  </if>
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
 
4
4
  var marko_template = module.exports = require("marko/dist/html").t(__filename),
5
- marko_componentType = "/@mindful-web/marko-web-identity-x$1.76.7/components/form-login.marko",
5
+ marko_componentType = "/@mindful-web/marko-web-identity-x$1.78.0/components/form-login.marko",
6
6
  marko_component = require("./form-login.marko"),
7
7
  marko_renderer = require("marko/dist/runtime/components/renderer"),
8
8
  module_objectPath_module = require("@mindful-web/object-path"),
@@ -15,6 +15,10 @@ var marko_template = module.exports = require("marko/dist/html").t(__filename),
15
15
  marko_web_browser_component_template = require("@mindful-web/marko-web/components/browser-component.marko"),
16
16
  marko_loadTag = require("marko/dist/runtime/helpers/load-tag"),
17
17
  marko_web_browser_component_tag = marko_loadTag(marko_web_browser_component_template),
18
+ marko_web_identity_x_google_init_template = require("./google-init.marko"),
19
+ marko_web_identity_x_google_init_tag = marko_loadTag(marko_web_identity_x_google_init_template),
20
+ marko_web_identity_x_google_sign_in_button_template = require("./google-sign-in-button.marko"),
21
+ marko_web_identity_x_google_sign_in_button_tag = marko_loadTag(marko_web_identity_x_google_sign_in_button_template),
18
22
  marko_web_identity_x_context_template = require("./context.marko"),
19
23
  marko_web_identity_x_context_tag = marko_loadTag(marko_web_identity_x_context_template);
20
24
 
@@ -71,6 +75,12 @@ function render(input, out, __component, component, state) {
71
75
  name: "IdentityXLogin",
72
76
  props: props
73
77
  }, out, __component, "1");
78
+
79
+ marko_web_identity_x_google_init_tag({}, out, __component, "2");
80
+
81
+ marko_web_identity_x_google_sign_in_button_tag({
82
+ redirectTo: input.redirect
83
+ }, out, __component, "3");
74
84
  }
75
85
  }
76
86
  }, out, __component, "0");
@@ -82,10 +92,12 @@ marko_template._ = marko_renderer(render, {
82
92
  }, marko_component);
83
93
 
84
94
  marko_template.meta = {
85
- id: "/@mindful-web/marko-web-identity-x$1.76.7/components/form-login.marko",
95
+ id: "/@mindful-web/marko-web-identity-x$1.78.0/components/form-login.marko",
86
96
  component: "./form-login.marko",
87
97
  tags: [
88
98
  "@mindful-web/marko-web/components/browser-component.marko",
99
+ "./google-init.marko",
100
+ "./google-sign-in-button.marko",
89
101
  "./context.marko"
90
102
  ]
91
103
  };
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
 
4
4
  var marko_template = module.exports = require("marko/dist/html").t(__filename),
5
- marko_componentType = "/@mindful-web/marko-web-identity-x$1.76.7/components/form-logout.marko",
5
+ marko_componentType = "/@mindful-web/marko-web-identity-x$1.78.0/components/form-logout.marko",
6
6
  marko_renderer = require("marko/dist/runtime/components/renderer"),
7
7
  module_defaultValue = require("@mindful-web/marko-core/utils/default-value"),
8
8
  defaultValue = module_defaultValue.default || module_defaultValue,
@@ -29,7 +29,7 @@ marko_template._ = marko_renderer(render, {
29
29
  });
30
30
 
31
31
  marko_template.meta = {
32
- id: "/@mindful-web/marko-web-identity-x$1.76.7/components/form-logout.marko",
32
+ id: "/@mindful-web/marko-web-identity-x$1.78.0/components/form-logout.marko",
33
33
  tags: [
34
34
  "@mindful-web/marko-web/components/browser-component.marko"
35
35
  ]
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
 
4
4
  var marko_template = module.exports = require("marko/dist/html").t(__filename),
5
- marko_componentType = "/@mindful-web/marko-web-identity-x$1.76.7/components/form-profile.marko",
5
+ marko_componentType = "/@mindful-web/marko-web-identity-x$1.78.0/components/form-profile.marko",
6
6
  marko_component = require("./form-profile.marko"),
7
7
  marko_renderer = require("marko/dist/runtime/components/renderer"),
8
8
  module_objectPath_module = require("@mindful-web/object-path"),
@@ -84,7 +84,7 @@ marko_template._ = marko_renderer(render, {
84
84
  }, marko_component);
85
85
 
86
86
  marko_template.meta = {
87
- id: "/@mindful-web/marko-web-identity-x$1.76.7/components/form-profile.marko",
87
+ id: "/@mindful-web/marko-web-identity-x$1.78.0/components/form-profile.marko",
88
88
  component: "./form-profile.marko",
89
89
  tags: [
90
90
  "@mindful-web/marko-web/components/browser-component.marko",
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
 
4
4
  var marko_template = module.exports = require("marko/dist/html").t(__filename),
5
- marko_componentType = "/@mindful-web/marko-web-identity-x$1.76.7/components/form-register.marko",
5
+ marko_componentType = "/@mindful-web/marko-web-identity-x$1.78.0/components/form-register.marko",
6
6
  marko_renderer = require("marko/dist/runtime/components/renderer"),
7
7
  marko_assign = require("marko/dist/runtime/helpers/assign"),
8
8
  marko_web_identity_x_form_login_template = require("./form-login.marko"),
@@ -25,7 +25,7 @@ marko_template._ = marko_renderer(render, {
25
25
  });
26
26
 
27
27
  marko_template.meta = {
28
- id: "/@mindful-web/marko-web-identity-x$1.76.7/components/form-register.marko",
28
+ id: "/@mindful-web/marko-web-identity-x$1.78.0/components/form-register.marko",
29
29
  tags: [
30
30
  "./form-login.marko"
31
31
  ]