{"version":3,"sources":["../src/schemas/index.ts","../src/schemas/settings.ts","../src/examples/index.ts","../src/examples/step.ts","../src/hints.ts"],"sourcesContent":["import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\nexport { SettingsSchema, type Settings } from './settings';\nexport const settings = zodToSchema(SettingsSchema);\n","import { z } from '@walkeros/core/dev';\n\n/**\n * Fingerprint transformer settings schema.\n *\n * Mirrors: types.ts FingerprintSettings\n */\nexport const SettingsSchema = z\n  .object({\n    fields: z\n      .array(\n        z.union([\n          z\n            .string()\n            .describe('Dot-notation path: \"ingest.ip\", \"event.data.userId\"'),\n          z\n            .object({\n              key: z.string().optional().describe('Source property path'),\n              value: z\n                .unknown()\n                .optional()\n                .describe('Static value or fallback'),\n              fn: z\n                .string()\n                .optional()\n                .describe('$code: function for value transformation'),\n            })\n            .describe('Mapping value config for computed fields'),\n        ]),\n      )\n      .describe(\n        'Fields to include in hash (order matters). Each resolved via getMappingValue with source { event, ingest }.',\n      ),\n    output: z\n      .string()\n      .optional()\n      .describe(\n        'Dot-notation path where hash is stored on the event. Default: \"user.hash\"',\n      ),\n    length: z\n      .number()\n      .int()\n      .positive()\n      .optional()\n      .describe(\n        'Truncate hash to this length. Default: full 64-char SHA-256 hash',\n      ),\n  })\n  .describe(\n    'Fingerprint transformer: generates deterministic user hashes from event fields',\n  );\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","export * as step from './step';\n","import type { Flow } from '@walkeros/core';\n\nexport const serverFingerprint: Flow.StepExample = {\n  title: 'Server fingerprint',\n  description:\n    'Standard server fingerprint using ingest.ip and ingest.userAgent. Requires source config.ingest.',\n  in: {\n    name: 'page view',\n    data: {\n      domain: 'www.example.com',\n      title: 'Getting Started',\n      id: '/docs/getting-started',\n    },\n    id: 'ev-1700000600',\n    trigger: 'load',\n    entity: 'page',\n    action: 'view',\n    timestamp: 1700000600,\n    source: { type: 'express', platform: 'server' },\n  },\n  out: [\n    [\n      'return',\n      {\n        event: {\n          name: 'page view',\n          data: {\n            domain: 'www.example.com',\n            title: 'Getting Started',\n            id: '/docs/getting-started',\n          },\n          user: { hash: '158f99cc06e33fd6' },\n          id: 'ev-1700000600',\n          trigger: 'load',\n          entity: 'page',\n          action: 'view',\n          timestamp: 1700000600,\n          source: { type: 'express', platform: 'server' },\n        },\n      },\n    ],\n  ],\n};\n\nexport const missingFields: Flow.StepExample = {\n  public: false,\n  description:\n    'Graceful handling when ingest is missing - fields resolve to empty strings, hash is still generated.',\n  in: {\n    name: 'session start',\n    data: { id: 's3ss10n' },\n    id: 'ev-1700000601',\n    trigger: 'load',\n    entity: 'session',\n    action: 'start',\n    timestamp: 1700000601,\n    source: { type: 'express', platform: 'server' },\n  },\n  out: [\n    [\n      'return',\n      {\n        event: {\n          name: 'session start',\n          data: { id: 's3ss10n' },\n          user: { hash: 'e183220b699c10a8' },\n          id: 'ev-1700000601',\n          trigger: 'load',\n          entity: 'session',\n          action: 'start',\n          timestamp: 1700000601,\n          source: { type: 'express', platform: 'server' },\n        },\n      },\n    ],\n  ],\n};\n\nexport const ipAnonymization: Flow.StepExample = {\n  title: 'IP anonymization',\n  description:\n    'Privacy-preserving fingerprint using key+fn pattern: ' +\n    'fn truncates IP to /24 subnet before hashing, so 10.0.42.* users share a hash. ' +\n    'Config: fields: [{ key: \"ingest.ip\", fn: ip => ip.replace(/\\\\.\\\\d+$/, \".0\") }, \"ingest.userAgent\"]',\n  in: {\n    name: 'page view',\n    data: {\n      domain: 'www.example.com',\n      title: 'Privacy Policy',\n      id: '/privacy',\n    },\n    id: 'ev-1700000602',\n    trigger: 'load',\n    entity: 'page',\n    action: 'view',\n    timestamp: 1700000602,\n    source: { type: 'express', platform: 'server' },\n  },\n  out: [\n    [\n      'return',\n      {\n        event: {\n          name: 'page view',\n          data: {\n            domain: 'www.example.com',\n            title: 'Privacy Policy',\n            id: '/privacy',\n          },\n          user: { hash: '44d9154b9a9b3792' },\n          id: 'ev-1700000602',\n          trigger: 'load',\n          entity: 'page',\n          action: 'view',\n          timestamp: 1700000602,\n          source: { type: 'express', platform: 'server' },\n        },\n      },\n    ],\n  ],\n};\n","import type { Hint } from '@walkeros/core';\n\nexport const hints: Hint.Hints = {\n  'ingest-prerequisite': {\n    text: 'Fields starting with ingest.* require the server source to have config.ingest configured. config.ingest MUST use the map operator with direct request field paths (no req. prefix); a bare object like { ip: \"req.ip\" } is silently inert and leaves ingest empty. Without populated ingest, all ingest.* fields resolve to empty strings, the hash is still generated but not unique. Always pair this transformer with a source that extracts request metadata.',\n    code: [\n      {\n        lang: 'json',\n        code: JSON.stringify(\n          {\n            sources: {\n              express: {\n                package: '@walkeros/server-source-express',\n                config: {\n                  settings: { port: 8080 },\n                  ingest: {\n                    map: {\n                      ip: { key: 'ip' },\n                      userAgent: { key: 'headers.user-agent' },\n                      origin: { key: 'headers.origin' },\n                    },\n                  },\n                },\n              },\n            },\n            transformers: {\n              fingerprint: {\n                package: '@walkeros/server-transformer-fingerprint',\n                config: {\n                  settings: {\n                    fields: ['ingest.ip', 'ingest.userAgent'],\n                    output: 'user.hash',\n                    length: 16,\n                  },\n                },\n              },\n            },\n          },\n          null,\n          2,\n        ),\n      },\n    ],\n  },\n  'fields-overview': {\n    text: 'Fields resolve from { event, ingest } via walkerOS mapping. Common patterns: ingest.ip (client IP), ingest.userAgent (browser UA), event.data.* (any event property). For time-based rotation use fn fields: daily rotation with toISOString().slice(0,10), monthly with getDate(). Order matters — same fields in different order produce different hashes. Use { key, fn } objects to transform before hashing (e.g., IP anonymization via the ipAnonymization step example).',\n  },\n};\n"],"mappings":"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","names":[]}