@fingerprint79/sdk-snippets 0.0.1
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/README.md +49 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/ai-prompt.d.ts +24 -0
- package/dist/ai-prompt.d.ts.map +1 -0
- package/dist/ai-prompt.js +101 -0
- package/dist/ai-prompt.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/snippet-for-framework.d.ts +54 -0
- package/dist/snippet-for-framework.d.ts.map +1 -0
- package/dist/snippet-for-framework.js +245 -0
- package/dist/snippet-for-framework.js.map +1 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# @fingerprint79/sdk-snippets
|
|
2
|
+
|
|
3
|
+
Idiomatic init-snippet generators for the **Fingerprint Platform SDK** (`fingerprint-platform-sdk`) across the eight frontend frameworks we support:
|
|
4
|
+
|
|
5
|
+
- React · Next.js · Vue.js · Angular · Svelte · Preact · Vanilla JS · JavaScript SPA
|
|
6
|
+
|
|
7
|
+
Plus the «Copy prompt» markdown builder that drops a self-contained integration brief into Cursor / Claude / Copilot Chat.
|
|
8
|
+
|
|
9
|
+
The functions are pure (no React, no DOM, no `fs`) — the same module powers both the admin dashboard's Install Fingerprint wizard and the [`fingerprint-platform-mcp`](https://www.npmjs.com/package/fingerprint-platform-mcp) AI-assistant tool.
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install @fingerprint79/sdk-snippets
|
|
15
|
+
# or
|
|
16
|
+
pnpm add @fingerprint79/sdk-snippets
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { initSnippet, buildAiPrompt, FRAMEWORKS } from '@fingerprint79/sdk-snippets';
|
|
23
|
+
|
|
24
|
+
// 1) Per-framework init code (npm or CDN flavour)
|
|
25
|
+
const code = initSnippet({
|
|
26
|
+
framework: 'react',
|
|
27
|
+
source: 'npm',
|
|
28
|
+
apiKey: 'wxyz...',
|
|
29
|
+
collectorUrl: 'https://yoursite.com/fpjs',
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// 2) Self-contained markdown brief for an AI assistant
|
|
33
|
+
const md = buildAiPrompt({
|
|
34
|
+
framework: 'react',
|
|
35
|
+
source: 'npm',
|
|
36
|
+
apiKey: 'wxyz...',
|
|
37
|
+
collectorUrl: 'https://yoursite.com/fpjs',
|
|
38
|
+
docsUrl: 'https://docs.yoursite.com',
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// 3) Browse the supported-framework metadata
|
|
42
|
+
for (const fw of FRAMEWORKS) {
|
|
43
|
+
console.log(fw.id, fw.label);
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## License
|
|
48
|
+
|
|
49
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../src/snippet-for-framework.ts","../src/ai-prompt.ts","../src/index.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/globals.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/assert.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/assert/strict.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/async_hooks.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/buffer.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/child_process.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/cluster.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/console.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/constants.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/crypto.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/dgram.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/dns.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/dns/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/domain.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/events.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/fs.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/fs/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/http.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/http2.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/https.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/module.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/net.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/os.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/path.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/process.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/punycode.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/querystring.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/readline.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/readline/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/repl.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/sea.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/stream.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/stream/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/stream/web.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/string_decoder.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/test.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/timers.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/timers/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/tls.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/trace_events.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/tty.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/url.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/util.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/v8.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/vm.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/wasi.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/worker_threads.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/zlib.d.ts","../../../node_modules/.pnpm/@types+node@20.19.39/node_modules/@types/node/index.d.ts"],"fileIdsList":[[66,109,112],[66,111,112],[112],[66,112,117,145],[66,112,113,118,123,131,142,153],[66,112,113,114,123,131],[66,112],[61,62,63,66,112],[66,112,115,154],[66,112,116,117,124,132],[66,112,117,142,150],[66,112,118,120,123,131],[66,111,112,119],[66,112,120,121],[66,112,122,123],[66,111,112,123],[66,112,123,124,125,142,153],[66,112,123,124,125,138,142,145],[66,112,120,123,126,131,142,153],[66,112,123,124,126,127,131,142,150,153],[66,112,126,128,142,150,153],[64,65,66,67,68,69,70,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159],[66,112,123,129],[66,112,130,153,158],[66,112,120,123,131,142],[66,112,132],[66,112,133],[66,111,112,134],[66,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159],[66,112,136],[66,112,137],[66,112,123,138,139],[66,112,138,140,154,156],[66,112,123,142,143,145],[66,112,144,145],[66,112,142,143],[66,112,145],[66,112,146],[66,109,112,142,147],[66,112,123,148,149],[66,112,148,149],[66,112,117,131,142,150],[66,112,151],[66,112,131,152],[66,112,126,137,153],[66,112,117,154],[66,112,142,155],[66,112,130,156],[66,112,157],[66,107,112],[66,107,112,123,125,134,142,145,153,156,158],[66,112,142,159],[66,79,83,112,153],[66,79,112,142,153],[66,74,112],[66,76,79,112,150,153],[66,112,131,150],[66,112,160],[66,74,112,160],[66,76,79,112,131,153],[66,71,72,75,78,112,123,142,153],[66,79,86,112],[66,71,77,112],[66,79,100,101,112],[66,75,79,112,145,153,160],[66,100,112,160],[66,73,74,112,160],[66,79,112],[66,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[66,79,94,112],[66,79,86,87,112],[66,77,79,87,88,112],[66,78,112],[66,71,74,79,112],[66,79,83,87,88,112],[66,83,112],[66,77,79,82,112,153],[66,71,76,79,86,112],[66,112,142],[66,74,79,100,112,158,160],[58,66,112],[58,59,66,112]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"6797453c23a8c2fa0013abe38ebc237ab76faf2d474d509fa5dea7a2f6ec4a3a","signature":"051a71b413fdcbff411a8a4cb465b9a7a63102dd63542b2e69906589bd9ecc0f","impliedFormat":99},{"version":"da6928daeeefb666e3f7663dc5d97b9cf5afebac2b3da30f6d1acd41c93198c6","signature":"3b455f91cd13ccd959541bf7d7daf2bc7c125e194ff519aa12684fdfe1c138c8","impliedFormat":99},{"version":"2ad92d4664cf4a8e58206ad7c66e61b577bfc07f77ecb11d50ca33f3f339e1fe","signature":"2dfe5b9293d5fe29824bd89b72e091f9a2943f1ecfce2f42d1af15e6a294e749","impliedFormat":99},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"ba481bca06f37d3f2c137ce343c7d5937029b2468f8e26111f3c9d9963d6568d","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d9ef24f9a22a88e3e9b3b3d8c40ab1ddb0853f1bfbd5c843c37800138437b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2677634fe27e87348825bb041651e22d50a613e2fdf6a4a3ade971d71bac37e","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"8cd19276b6590b3ebbeeb030ac271871b9ed0afc3074ac88a94ed2449174b776","affectsGlobalScope":true,"impliedFormat":1},{"version":"696eb8d28f5949b87d894b26dc97318ef944c794a9a4e4f62360cd1d1958014b","impliedFormat":1},{"version":"3f8fa3061bd7402970b399300880d55257953ee6d3cd408722cb9ac20126460c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"68bd56c92c2bd7d2339457eb84d63e7de3bd56a69b25f3576e1568d21a162398","affectsGlobalScope":true,"impliedFormat":1},{"version":"3e93b123f7c2944969d291b35fed2af79a6e9e27fdd5faa99748a51c07c02d28","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"87aad3dd9752067dc875cfaa466fc44246451c0c560b820796bdd528e29bef40","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"8db0ae9cb14d9955b14c214f34dae1b9ef2baee2fe4ce794a4cd3ac2531e3255","affectsGlobalScope":true,"impliedFormat":1},{"version":"15fc6f7512c86810273af28f224251a5a879e4261b4d4c7e532abfbfc3983134","impliedFormat":1},{"version":"58adba1a8ab2d10b54dc1dced4e41f4e7c9772cbbac40939c0dc8ce2cdb1d442","impliedFormat":1},{"version":"641942a78f9063caa5d6b777c99304b7d1dc7328076038c6d94d8a0b81fc95c1","impliedFormat":1},{"version":"714435130b9015fae551788df2a88038471a5a11eb471f27c4ede86552842bc9","impliedFormat":1},{"version":"855cd5f7eb396f5f1ab1bc0f8580339bff77b68a770f84c6b254e319bbfd1ac7","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"7e20d899c28ca26a2a7afc98beaa69e63ff7fba0a8bc47b4e3bf3ede5e09e424","impliedFormat":1},{"version":"2d2fcaab481b31a5882065c7951255703ddbe1c0e507af56ea42d79ac3911201","impliedFormat":1},{"version":"a192fe8ec33f75edbc8d8f3ed79f768dfae11ff5735e7fe52bfa69956e46d78d","impliedFormat":1},{"version":"ca867399f7db82df981d6915bcbb2d81131d7d1ef683bc782b59f71dda59bc85","affectsGlobalScope":true,"impliedFormat":1},{"version":"372413016d17d804e1d139418aca0c68e47a83fb6669490857f4b318de8cccb3","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"6e70e9570e98aae2b825b533aa6292b6abd542e8d9f6e9475e88e1d7ba17c866","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"085f552d005479e2e6a7311cdbbe5d8c55c497b4d19274285df161ee9684cd9c","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"007faacc9268357caa21d24169f3f3f2497af3e9241308df2d89f6e6d9bb3f2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"74cf591a0f63db318651e0e04cb55f8791385f86e987a67fd4d2eaab8191f730","impliedFormat":1},{"version":"5eab9b3dc9b34f185417342436ec3f106898da5f4801992d8ff38ab3aff346b5","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"809821b8a065e3234a55b3a9d7846231ed18d66dd749f2494c66288d890daf7f","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"c3b41e74b9a84b88b1dca61ec39eee25c0dbc8e7d519ba11bb070918cfacf656","affectsGlobalScope":true,"impliedFormat":1},{"version":"4737a9dc24d0e68b734e6cfbcea0c15a2cfafeb493485e27905f7856988c6b29","affectsGlobalScope":true,"impliedFormat":1},{"version":"36d8d3e7506b631c9582c251a2c0b8a28855af3f76719b12b534c6edf952748d","impliedFormat":1},{"version":"1ca69210cc42729e7ca97d3a9ad48f2e9cb0042bada4075b588ae5387debd318","impliedFormat":1},{"version":"f5ebe66baaf7c552cfa59d75f2bfba679f329204847db3cec385acda245e574e","impliedFormat":1},{"version":"ed59add13139f84da271cafd32e2171876b0a0af2f798d0c663e8eeb867732cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7c5e2ea4a9749097c347454805e933844ed207b6eefec6b7cfd418b5f5f7b28","impliedFormat":1},{"version":"b1810689b76fd473bd12cc9ee219f8e62f54a7d08019a235d07424afbf074d25","impliedFormat":1}],"root":[[58,60]],"options":{"allowSyntheticDefaultImports":true,"alwaysStrict":true,"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"exactOptionalPropertyTypes":true,"module":199,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","removeComments":false,"rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":9,"tsBuildInfoFile":"./.tsbuildinfo"},"referencedMap":[[109,1],[110,1],[111,2],[66,3],[112,4],[113,5],[114,6],[61,7],[64,8],[62,7],[63,7],[115,9],[116,10],[117,11],[118,12],[119,13],[120,14],[121,14],[122,15],[123,16],[124,17],[125,18],[67,7],[65,7],[126,19],[127,20],[128,21],[160,22],[129,23],[130,24],[131,25],[132,26],[133,27],[134,28],[135,29],[136,30],[137,31],[138,32],[139,32],[140,33],[141,7],[142,34],[144,35],[143,36],[145,37],[146,38],[147,39],[148,40],[149,41],[150,42],[151,43],[152,44],[153,45],[154,46],[155,47],[156,48],[157,49],[68,7],[69,7],[70,7],[108,50],[158,51],[159,52],[56,7],[57,7],[11,7],[10,7],[2,7],[12,7],[13,7],[14,7],[15,7],[16,7],[17,7],[18,7],[19,7],[3,7],[20,7],[21,7],[4,7],[22,7],[26,7],[23,7],[24,7],[25,7],[27,7],[28,7],[29,7],[5,7],[30,7],[31,7],[32,7],[33,7],[6,7],[37,7],[34,7],[35,7],[36,7],[38,7],[7,7],[39,7],[44,7],[45,7],[40,7],[41,7],[42,7],[43,7],[8,7],[49,7],[46,7],[47,7],[48,7],[50,7],[9,7],[51,7],[52,7],[53,7],[55,7],[54,7],[1,7],[86,53],[96,54],[85,53],[106,55],[77,56],[76,57],[105,58],[99,59],[104,60],[79,61],[93,62],[78,63],[102,64],[74,65],[73,58],[103,66],[75,67],[80,68],[81,7],[84,68],[71,7],[107,69],[97,70],[88,71],[89,72],[91,73],[87,74],[90,75],[100,58],[82,76],[83,77],[92,78],[72,79],[95,70],[94,68],[98,7],[101,80],[59,81],[60,82],[58,7]],"latestChangedDtsFile":"./index.d.ts","version":"5.9.3"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Framework, SnippetSource } from './snippet-for-framework.js';
|
|
2
|
+
/**
|
|
3
|
+
* Builds the "Copy prompt" markdown that drops into Cursor / Claude
|
|
4
|
+
* / Copilot Chat — gives the integrator's coding assistant a
|
|
5
|
+
* self-contained brief on how to wire up Fingerprint on their stack.
|
|
6
|
+
*
|
|
7
|
+
* The template mirrors the FingerprintJS Pro version (boss showed us
|
|
8
|
+
* the screenshot in the planning call) but inlines OUR collector URL,
|
|
9
|
+
* the project's actual public key, the chosen framework, AND both
|
|
10
|
+
* install variants so the AI doesn't have to guess which install
|
|
11
|
+
* path the integrator prefers.
|
|
12
|
+
*
|
|
13
|
+
* Keep this self-contained — no React imports, no DOM access. The
|
|
14
|
+
* caller hands it to `navigator.clipboard.writeText` from a button
|
|
15
|
+
* click handler.
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildAiPrompt(opts: {
|
|
18
|
+
readonly framework: Framework;
|
|
19
|
+
readonly source: SnippetSource;
|
|
20
|
+
readonly apiKey: string;
|
|
21
|
+
readonly collectorUrl: string;
|
|
22
|
+
readonly docsUrl: string;
|
|
23
|
+
}): string;
|
|
24
|
+
//# sourceMappingURL=ai-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-prompt.d.ts","sourceRoot":"","sources":["../src/ai-prompt.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3E;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,GAAG,MAAM,CAoFT"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { cdnInstallSnippet, frameworkLabel, initSnippet, npmInstallSnippet, } from './snippet-for-framework.js';
|
|
2
|
+
/**
|
|
3
|
+
* Builds the "Copy prompt" markdown that drops into Cursor / Claude
|
|
4
|
+
* / Copilot Chat — gives the integrator's coding assistant a
|
|
5
|
+
* self-contained brief on how to wire up Fingerprint on their stack.
|
|
6
|
+
*
|
|
7
|
+
* The template mirrors the FingerprintJS Pro version (boss showed us
|
|
8
|
+
* the screenshot in the planning call) but inlines OUR collector URL,
|
|
9
|
+
* the project's actual public key, the chosen framework, AND both
|
|
10
|
+
* install variants so the AI doesn't have to guess which install
|
|
11
|
+
* path the integrator prefers.
|
|
12
|
+
*
|
|
13
|
+
* Keep this self-contained — no React imports, no DOM access. The
|
|
14
|
+
* caller hands it to `navigator.clipboard.writeText` from a button
|
|
15
|
+
* click handler.
|
|
16
|
+
*/
|
|
17
|
+
export function buildAiPrompt(opts) {
|
|
18
|
+
const fwLabel = frameworkLabel(opts.framework);
|
|
19
|
+
const snippet = initSnippet(opts);
|
|
20
|
+
const cdn = cdnInstallSnippet();
|
|
21
|
+
const npm = npmInstallSnippet();
|
|
22
|
+
return `# ${fwLabel} Integration Guide
|
|
23
|
+
|
|
24
|
+
Explain how to implement this installation step-by-step and verify
|
|
25
|
+
that it works.
|
|
26
|
+
|
|
27
|
+
Documentation: ${opts.docsUrl}
|
|
28
|
+
|
|
29
|
+
Add our snippet to each page you want to use Fingerprint on. You can
|
|
30
|
+
import the script directly from a CDN or include it as an NPM package.
|
|
31
|
+
|
|
32
|
+
Please disable your ad blocker when testing locally. For production
|
|
33
|
+
apps, the recommended pattern is a Cloudflare Worker on the
|
|
34
|
+
integrator's CF account, attached to a same-origin route pattern
|
|
35
|
+
like \`yoursite.com/fpjs/*\`. The Worker proxies BOTH the SDK
|
|
36
|
+
bundle (served on \`/fpjs/agent.js\`) AND the collector API
|
|
37
|
+
(\`/fpjs/ingest\`, \`/fpjs/result/<id>\`, \`/fpjs/comparison\`).
|
|
38
|
+
Cookies stay first-party, ad-blockers cannot pattern-match a path
|
|
39
|
+
on the integrator's own domain, and the integrator's app backend
|
|
40
|
+
is NEVER in the fingerprint request path — that would couple
|
|
41
|
+
uptime and add latency.
|
|
42
|
+
|
|
43
|
+
The code snippet below already includes the project's public API
|
|
44
|
+
key. Replace the \`yoursite.com/fpjs\` placeholder in
|
|
45
|
+
\`collectorUrl\` with the route the integrator wires in their
|
|
46
|
+
Cloudflare account.
|
|
47
|
+
|
|
48
|
+
## Option A — CDN
|
|
49
|
+
|
|
50
|
+
\`\`\`html
|
|
51
|
+
${cdn}
|
|
52
|
+
\`\`\`
|
|
53
|
+
|
|
54
|
+
## Option B — NPM
|
|
55
|
+
|
|
56
|
+
\`\`\`bash
|
|
57
|
+
${npm}
|
|
58
|
+
\`\`\`
|
|
59
|
+
|
|
60
|
+
## Initialise and identify (${fwLabel})
|
|
61
|
+
|
|
62
|
+
\`\`\`${opts.source === 'cdn' ? 'html' : 'ts'}
|
|
63
|
+
${snippet}
|
|
64
|
+
\`\`\`
|
|
65
|
+
|
|
66
|
+
## Production proxy — Cloudflare Worker
|
|
67
|
+
|
|
68
|
+
Before shipping, deploy a Cloudflare Worker on the integrator's CF
|
|
69
|
+
account, attached to a route pattern like \`yoursite.com/fpjs/*\`.
|
|
70
|
+
The Worker proxies the SDK bundle on \`/fpjs/agent.js\` and the
|
|
71
|
+
collector endpoints under \`/fpjs/\` (ingest, result, comparison).
|
|
72
|
+
Result: every fingerprint request is same-origin, cookies stay
|
|
73
|
+
first-party, ad-blockers blind to the path. Same pattern as FP
|
|
74
|
+
Pro's Cloudflare integration.
|
|
75
|
+
|
|
76
|
+
The dashboard's Get Started → Install → Step 3 panel shows a
|
|
77
|
+
ready-to-paste Worker script; copy it into the integrator's CF
|
|
78
|
+
Workers dashboard, attach the route, done. NEVER reverse-proxy
|
|
79
|
+
\`/v1/ingest\` through the integrator's app backend — it puts
|
|
80
|
+
the hot path on their server and ties fingerprinting to their
|
|
81
|
+
app uptime.
|
|
82
|
+
|
|
83
|
+
Fallback: if Cloudflare isn't an option, point a DNS CNAME from
|
|
84
|
+
\`fp.yoursite.com\` to the collector directly. Less adblock-proof
|
|
85
|
+
than the Worker route (a dedicated subdomain is easier for filter
|
|
86
|
+
rules to catch than a same-origin path), but still keeps cookies
|
|
87
|
+
first-party.
|
|
88
|
+
|
|
89
|
+
Then add the site's primary origin (\`https://yoursite.com\`) to
|
|
90
|
+
allowedHosts on the dashboard's Security page so the collector
|
|
91
|
+
rejects requests from other domains.
|
|
92
|
+
|
|
93
|
+
## Verify
|
|
94
|
+
|
|
95
|
+
Open the page where you mounted the SDK. The agent runs on load and
|
|
96
|
+
calls \`/v1/ingest\` on \`${opts.collectorUrl}\`. Then open the
|
|
97
|
+
Fingerprint dashboard's Identification view and confirm the event
|
|
98
|
+
appears within a couple of seconds.
|
|
99
|
+
`;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=ai-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-prompt.js","sourceRoot":"","sources":["../src/ai-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAIpC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,aAAa,CAAC,IAM7B;IACC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAEhC,OAAO,KAAK,OAAO;;;;;iBAKJ,IAAI,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;EAwB3B,GAAG;;;;;;EAMH,GAAG;;;8BAGyB,OAAO;;QAE7B,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;EAC3C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAiCmB,IAAI,CAAC,YAAY;;;CAG5C,CAAC;AACF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@fingerprint79/sdk-snippets` — idiomatic init-snippet generators
|
|
3
|
+
* for the Fingerprint Platform SDK across the eight frontend
|
|
4
|
+
* frameworks we support, plus the «Copy prompt» markdown builder.
|
|
5
|
+
*
|
|
6
|
+
* The functions here are pure — no React, no DOM, no fs. That's
|
|
7
|
+
* deliberate: the same code is consumed by (a) the admin dashboard
|
|
8
|
+
* (Vite + React bundle) to render install snippets in Get Started
|
|
9
|
+
* and Libraries, AND (b) the `fingerprint-platform-mcp` Node CLI
|
|
10
|
+
* which spits diffs back to AI assistants. Keeping the surface
|
|
11
|
+
* runtime-agnostic is what lets both consume it.
|
|
12
|
+
*/
|
|
13
|
+
export { FRAMEWORKS, frameworkLabel, cdnInstallSnippet, npmInstallSnippet, initSnippet, } from './snippet-for-framework.js';
|
|
14
|
+
export type { Framework, SnippetSource, SnippetInput } from './snippet-for-framework.js';
|
|
15
|
+
export { buildAiPrompt } from './ai-prompt.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,GACZ,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAEzF,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@fingerprint79/sdk-snippets` — idiomatic init-snippet generators
|
|
3
|
+
* for the Fingerprint Platform SDK across the eight frontend
|
|
4
|
+
* frameworks we support, plus the «Copy prompt» markdown builder.
|
|
5
|
+
*
|
|
6
|
+
* The functions here are pure — no React, no DOM, no fs. That's
|
|
7
|
+
* deliberate: the same code is consumed by (a) the admin dashboard
|
|
8
|
+
* (Vite + React bundle) to render install snippets in Get Started
|
|
9
|
+
* and Libraries, AND (b) the `fingerprint-platform-mcp` Node CLI
|
|
10
|
+
* which spits diffs back to AI assistants. Keeping the surface
|
|
11
|
+
* runtime-agnostic is what lets both consume it.
|
|
12
|
+
*/
|
|
13
|
+
export { FRAMEWORKS, frameworkLabel, cdnInstallSnippet, npmInstallSnippet, initSnippet, } from './snippet-for-framework.js';
|
|
14
|
+
export { buildAiPrompt } from './ai-prompt.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,GACZ,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code-snippet builder for the Install Fingerprint wizard.
|
|
3
|
+
*
|
|
4
|
+
* The SDK API is identical across frameworks (`init({collectorUrl,
|
|
5
|
+
* projectKey})` then `fp.identify(...)`), but how an integrator
|
|
6
|
+
* usually mounts it differs — Next.js needs `'use client'` + a
|
|
7
|
+
* client-only dynamic import, React needs a `useEffect`, Angular a
|
|
8
|
+
* service, etc. We hand out the smallest snippet that still feels
|
|
9
|
+
* idiomatic for each framework so a copy-paste lands in roughly the
|
|
10
|
+
* right place.
|
|
11
|
+
*
|
|
12
|
+
* `apiKey` is substituted into the snippet when revealed on the
|
|
13
|
+
* Get-Started page; otherwise the placeholder string from the i18n
|
|
14
|
+
* dictionary takes its place.
|
|
15
|
+
*/
|
|
16
|
+
export type Framework = 'javascript' | 'javascript-spa' | 'nextjs' | 'react' | 'vue' | 'angular' | 'svelte' | 'preact';
|
|
17
|
+
export type SnippetSource = 'cdn' | 'npm';
|
|
18
|
+
export interface SnippetInput {
|
|
19
|
+
readonly framework: Framework;
|
|
20
|
+
readonly source: SnippetSource;
|
|
21
|
+
/** Plain-text public api key, or the i18n placeholder when masked. */
|
|
22
|
+
readonly apiKey: string;
|
|
23
|
+
/** The customer's custom subdomain pointing at our collector, e.g.
|
|
24
|
+
* `https://fp.theirsite.com`. Always shown — encourages the
|
|
25
|
+
* production pattern over leaking our raw IP in browser source.
|
|
26
|
+
* See `InstallFlow.tsx::Step 3` for the DNS-setup explanation. */
|
|
27
|
+
readonly collectorUrl: string;
|
|
28
|
+
}
|
|
29
|
+
/** All 8 framework ids in display order. Mobile is intentionally
|
|
30
|
+
* absent from this enum — that picker lives on the platform step. */
|
|
31
|
+
export declare const FRAMEWORKS: ReadonlyArray<{
|
|
32
|
+
id: Framework;
|
|
33
|
+
label: string;
|
|
34
|
+
}>;
|
|
35
|
+
export declare function frameworkLabel(id: Framework): string;
|
|
36
|
+
/** CDN install line — same across frameworks (the bundle is plain
|
|
37
|
+
* IIFE either way). Always links the obfuscated build; never link
|
|
38
|
+
* `dist/fp.js` from a production page — DevTools → Sources reads it
|
|
39
|
+
* in the clear and undoes the obfuscator pipeline.
|
|
40
|
+
*
|
|
41
|
+
* The primary line is the same-origin path served by the Cloudflare
|
|
42
|
+
* Worker the integrator deploys in Step 3 («Production proxy»). The
|
|
43
|
+
* unpkg URL stays as a commented-out fallback for quick dev/staging
|
|
44
|
+
* — adblockers' default lists ship a rule for `unpkg.com`, so in
|
|
45
|
+
* production this URL is one of the first to disappear from
|
|
46
|
+
* document.scripts. */
|
|
47
|
+
export declare function cdnInstallSnippet(): string;
|
|
48
|
+
/** NPM install line — same across frameworks. */
|
|
49
|
+
export declare function npmInstallSnippet(): string;
|
|
50
|
+
/** Initialise-and-identify snippet, framework-specific. The
|
|
51
|
+
* framework parameter only changes the WRAPPER code — the
|
|
52
|
+
* Fingerprint API calls inside it are identical. */
|
|
53
|
+
export declare function initSnippet(input: SnippetInput): string;
|
|
54
|
+
//# sourceMappingURL=snippet-for-framework.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snippet-for-framework.d.ts","sourceRoot":"","sources":["../src/snippet-for-framework.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,SAAS,GACjB,YAAY,GACZ,gBAAgB,GAChB,QAAQ,GACR,OAAO,GACP,KAAK,GACL,SAAS,GACT,QAAQ,GACR,QAAQ,CAAC;AAEb,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,CAAC;AAE1C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;uEAGmE;IACnE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;sEACsE;AACtE,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAStE,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,CAEpD;AAED;;;;;;;;;;wBAUwB;AACxB,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAED,iDAAiD;AACjD,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C;AAED;;qDAEqD;AACrD,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CA+JvD"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code-snippet builder for the Install Fingerprint wizard.
|
|
3
|
+
*
|
|
4
|
+
* The SDK API is identical across frameworks (`init({collectorUrl,
|
|
5
|
+
* projectKey})` then `fp.identify(...)`), but how an integrator
|
|
6
|
+
* usually mounts it differs — Next.js needs `'use client'` + a
|
|
7
|
+
* client-only dynamic import, React needs a `useEffect`, Angular a
|
|
8
|
+
* service, etc. We hand out the smallest snippet that still feels
|
|
9
|
+
* idiomatic for each framework so a copy-paste lands in roughly the
|
|
10
|
+
* right place.
|
|
11
|
+
*
|
|
12
|
+
* `apiKey` is substituted into the snippet when revealed on the
|
|
13
|
+
* Get-Started page; otherwise the placeholder string from the i18n
|
|
14
|
+
* dictionary takes its place.
|
|
15
|
+
*/
|
|
16
|
+
/** All 8 framework ids in display order. Mobile is intentionally
|
|
17
|
+
* absent from this enum — that picker lives on the platform step. */
|
|
18
|
+
export const FRAMEWORKS = [
|
|
19
|
+
{ id: 'javascript', label: 'JavaScript' },
|
|
20
|
+
{ id: 'javascript-spa', label: 'JavaScript SPA' },
|
|
21
|
+
{ id: 'nextjs', label: 'Next.js' },
|
|
22
|
+
{ id: 'react', label: 'React' },
|
|
23
|
+
{ id: 'angular', label: 'Angular' },
|
|
24
|
+
{ id: 'vue', label: 'Vue.js' },
|
|
25
|
+
{ id: 'preact', label: 'Preact' },
|
|
26
|
+
{ id: 'svelte', label: 'Svelte' },
|
|
27
|
+
];
|
|
28
|
+
export function frameworkLabel(id) {
|
|
29
|
+
return FRAMEWORKS.find((f) => f.id === id)?.label ?? id;
|
|
30
|
+
}
|
|
31
|
+
/** CDN install line — same across frameworks (the bundle is plain
|
|
32
|
+
* IIFE either way). Always links the obfuscated build; never link
|
|
33
|
+
* `dist/fp.js` from a production page — DevTools → Sources reads it
|
|
34
|
+
* in the clear and undoes the obfuscator pipeline.
|
|
35
|
+
*
|
|
36
|
+
* The primary line is the same-origin path served by the Cloudflare
|
|
37
|
+
* Worker the integrator deploys in Step 3 («Production proxy»). The
|
|
38
|
+
* unpkg URL stays as a commented-out fallback for quick dev/staging
|
|
39
|
+
* — adblockers' default lists ship a rule for `unpkg.com`, so in
|
|
40
|
+
* production this URL is one of the first to disappear from
|
|
41
|
+
* document.scripts. */
|
|
42
|
+
export function cdnInstallSnippet() {
|
|
43
|
+
return `<!-- Production: self-hosted through the Cloudflare Worker (Step 3 below) -->
|
|
44
|
+
<script src="/fpjs/agent.js" async></script>
|
|
45
|
+
|
|
46
|
+
<!-- Dev / staging only — unpkg URL is on every ad-block list -->
|
|
47
|
+
<!-- <script src="https://unpkg.com/fingerprint-platform-sdk/dist/fp.obf.js" async></script> -->`;
|
|
48
|
+
}
|
|
49
|
+
/** NPM install line — same across frameworks. */
|
|
50
|
+
export function npmInstallSnippet() {
|
|
51
|
+
return `npm install fingerprint-platform-sdk
|
|
52
|
+
# or pnpm add fingerprint-platform-sdk
|
|
53
|
+
# or yarn add fingerprint-platform-sdk`;
|
|
54
|
+
}
|
|
55
|
+
/** Initialise-and-identify snippet, framework-specific. The
|
|
56
|
+
* framework parameter only changes the WRAPPER code — the
|
|
57
|
+
* Fingerprint API calls inside it are identical. */
|
|
58
|
+
export function initSnippet(input) {
|
|
59
|
+
const { framework, source, apiKey, collectorUrl } = input;
|
|
60
|
+
const config = ` collectorUrl: '${collectorUrl}',
|
|
61
|
+
projectKey: '${apiKey}',`;
|
|
62
|
+
// CDN init — global `window.FP` from the IIFE. The init call is
|
|
63
|
+
// identical across frameworks (same global, same shape); what
|
|
64
|
+
// differs is WHERE the integrator drops the <script> tag. The
|
|
65
|
+
// framework-specific lead comment surfaces that decision so an
|
|
66
|
+
// operator switching frameworks while parked on the CDN tab sees
|
|
67
|
+
// their picked framework's mounting convention spelled out.
|
|
68
|
+
if (source === 'cdn') {
|
|
69
|
+
return `${cdnPlacementComment(framework)}
|
|
70
|
+
<script>
|
|
71
|
+
// Initialize the agent at application startup.
|
|
72
|
+
const fp = window.FP.init({
|
|
73
|
+
${config}
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// Get the visitor and event identifier when you need it.
|
|
77
|
+
fp.identify({ event: 'pageview' }).then((r) => {
|
|
78
|
+
if (r.visitorId) console.log(r.eventId, r.visitorId, r.suspectScore);
|
|
79
|
+
else console.log('event queued:', r.eventId);
|
|
80
|
+
});
|
|
81
|
+
</script>`;
|
|
82
|
+
}
|
|
83
|
+
// NPM / bundler path — framework-specific wrapper.
|
|
84
|
+
switch (framework) {
|
|
85
|
+
case 'nextjs':
|
|
86
|
+
return `// app/_components/FpClient.tsx — client component
|
|
87
|
+
'use client';
|
|
88
|
+
import { useEffect } from 'react';
|
|
89
|
+
|
|
90
|
+
export function FpClient() {
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
let cancelled = false;
|
|
93
|
+
// Dynamic import keeps the SDK out of the server bundle — Next.js
|
|
94
|
+
// SSR has no Window, the SDK throws on the canvas calls there.
|
|
95
|
+
import('fingerprint-platform-sdk').then(({ init }) => {
|
|
96
|
+
if (cancelled) return;
|
|
97
|
+
const fp = init({
|
|
98
|
+
${config.replace(/^/gm, ' ')}
|
|
99
|
+
});
|
|
100
|
+
void fp.identify({ event: 'pageview' });
|
|
101
|
+
});
|
|
102
|
+
return () => { cancelled = true; };
|
|
103
|
+
}, []);
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Then mount <FpClient /> in your root layout.`;
|
|
108
|
+
case 'react':
|
|
109
|
+
return `import { useEffect } from 'react';
|
|
110
|
+
import { init } from 'fingerprint-platform-sdk';
|
|
111
|
+
|
|
112
|
+
export function useFingerprint() {
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
const fp = init({
|
|
115
|
+
${config.replace(/^/gm, ' ')}
|
|
116
|
+
});
|
|
117
|
+
fp.identify({ event: 'pageview' }).then((r) => {
|
|
118
|
+
if (r.visitorId) console.log(r.eventId, r.visitorId, r.suspectScore);
|
|
119
|
+
else console.log('event queued:', r.eventId);
|
|
120
|
+
});
|
|
121
|
+
}, []);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Call useFingerprint() once in your root component.`;
|
|
125
|
+
case 'vue':
|
|
126
|
+
return `// plugins/fingerprint.ts
|
|
127
|
+
import { init } from 'fingerprint-platform-sdk';
|
|
128
|
+
|
|
129
|
+
const fp = init({
|
|
130
|
+
${config}
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
export default {
|
|
134
|
+
install(app) {
|
|
135
|
+
app.config.globalProperties.$fp = fp;
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
// Then in main.ts:
|
|
140
|
+
// app.use(fpPlugin);
|
|
141
|
+
// And from any component:
|
|
142
|
+
// this.$fp.identify({ event: 'pageview' });`;
|
|
143
|
+
case 'angular':
|
|
144
|
+
return `// fingerprint.service.ts
|
|
145
|
+
import { Injectable } from '@angular/core';
|
|
146
|
+
import { init, type FpSdk } from 'fingerprint-platform-sdk';
|
|
147
|
+
|
|
148
|
+
@Injectable({ providedIn: 'root' })
|
|
149
|
+
export class FingerprintService {
|
|
150
|
+
readonly fp: FpSdk = init({
|
|
151
|
+
${config.replace(/^/gm, ' ')}
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Inject in components and call: this.fp.fp.identify({ event: 'pageview' });`;
|
|
156
|
+
case 'svelte':
|
|
157
|
+
return `// src/lib/fingerprint.ts
|
|
158
|
+
import { init } from 'fingerprint-platform-sdk';
|
|
159
|
+
|
|
160
|
+
export const fp = init({
|
|
161
|
+
${config}
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// In any +page.svelte:
|
|
165
|
+
// <script lang="ts">
|
|
166
|
+
// import { onMount } from 'svelte';
|
|
167
|
+
// import { fp } from '$lib/fingerprint';
|
|
168
|
+
// onMount(() => { void fp.identify({ event: 'pageview' }); });
|
|
169
|
+
// </script>`;
|
|
170
|
+
case 'preact':
|
|
171
|
+
return `import { useEffect } from 'preact/hooks';
|
|
172
|
+
import { init } from 'fingerprint-platform-sdk';
|
|
173
|
+
|
|
174
|
+
export function useFingerprint() {
|
|
175
|
+
useEffect(() => {
|
|
176
|
+
const fp = init({
|
|
177
|
+
${config.replace(/^/gm, ' ')}
|
|
178
|
+
});
|
|
179
|
+
void fp.identify({ event: 'pageview' });
|
|
180
|
+
}, []);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Call useFingerprint() once in your root component.`;
|
|
184
|
+
case 'javascript-spa':
|
|
185
|
+
return `// src/fingerprint.js
|
|
186
|
+
// Single-page app pattern: init once, identify() on each route change.
|
|
187
|
+
import { init } from 'fingerprint-platform-sdk';
|
|
188
|
+
|
|
189
|
+
export const fp = init({
|
|
190
|
+
${config}
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// In your router's onNavigate hook:
|
|
194
|
+
// fp.identify({ event: 'route:' + path });`;
|
|
195
|
+
case 'javascript':
|
|
196
|
+
default:
|
|
197
|
+
return `import { init } from 'fingerprint-platform-sdk';
|
|
198
|
+
|
|
199
|
+
const fp = init({
|
|
200
|
+
${config}
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
fp.identify({ event: 'pageview' }).then((r) => {
|
|
204
|
+
if (r.visitorId) console.log(r.eventId, r.visitorId, r.suspectScore);
|
|
205
|
+
else console.log('event queued:', r.eventId);
|
|
206
|
+
});`;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/** Framework-specific lead-comment for the CDN snippet. The init
|
|
210
|
+
* body itself is identical across frameworks (the IIFE exposes the
|
|
211
|
+
* same `window.FP.init` global), but mounting conventions differ —
|
|
212
|
+
* React puts the <script> in `public/index.html`, Next.js prefers
|
|
213
|
+
* `<Script>` from `next/script` in the root layout, etc. Surfacing
|
|
214
|
+
* the placement decision per-framework makes flipping the framework
|
|
215
|
+
* picker visibly do something even when the CDN tab is parked. */
|
|
216
|
+
function cdnPlacementComment(framework) {
|
|
217
|
+
switch (framework) {
|
|
218
|
+
case 'nextjs':
|
|
219
|
+
return `<!-- Next.js: prefer next/script with strategy="afterInteractive" in app/layout.tsx
|
|
220
|
+
rather than a raw <script>. The agent attaches to window.FP on first paint. -->`;
|
|
221
|
+
case 'react':
|
|
222
|
+
return `<!-- React: drop <script> in public/index.html (CRA / Vite-React).
|
|
223
|
+
Access window.FP from any component after first paint. -->`;
|
|
224
|
+
case 'vue':
|
|
225
|
+
return `<!-- Vue.js: place <script> in public/index.html.
|
|
226
|
+
Read window.FP inside onMounted / mounted hooks. -->`;
|
|
227
|
+
case 'angular':
|
|
228
|
+
return `<!-- Angular: add <script> to src/index.html.
|
|
229
|
+
Wrap window.FP in an Injectable service for DI ergonomics. -->`;
|
|
230
|
+
case 'svelte':
|
|
231
|
+
return `<!-- Svelte / SvelteKit: add <script> to app.html (SvelteKit) or
|
|
232
|
+
public/index.html. Use onMount() to read window.FP. -->`;
|
|
233
|
+
case 'preact':
|
|
234
|
+
return `<!-- Preact: drop <script> in your root index.html.
|
|
235
|
+
Read window.FP from any component after mount. -->`;
|
|
236
|
+
case 'javascript-spa':
|
|
237
|
+
return `<!-- SPA: include once in your shell HTML. Call fp.identify()
|
|
238
|
+
from your router's per-route hook to track navigation. -->`;
|
|
239
|
+
case 'javascript':
|
|
240
|
+
default:
|
|
241
|
+
return `<!-- Vanilla JS: paste anywhere in <body>. The SDK fires
|
|
242
|
+
identify() on its own once init() resolves. -->`;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=snippet-for-framework.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snippet-for-framework.js","sourceRoot":"","sources":["../src/snippet-for-framework.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA0BH;sEACsE;AACtE,MAAM,CAAC,MAAM,UAAU,GAAoD;IACzE,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;IACzC,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,EAAE;IACjD,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;IAClC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IAC/B,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;IACnC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC9B,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;IACjC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;CAClC,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,EAAa;IAC1C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;AAC1D,CAAC;AAED;;;;;;;;;;wBAUwB;AACxB,MAAM,UAAU,iBAAiB;IAC/B,OAAO;;;;iGAIwF,CAAC;AAClG,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,iBAAiB;IAC/B,OAAO;;uCAE8B,CAAC;AACxC,CAAC;AAED;;qDAEqD;AACrD,MAAM,UAAU,WAAW,CAAC,KAAmB;IAC7C,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IAC1D,MAAM,MAAM,GAAG,oBAAoB,YAAY;mBAC9B,MAAM,IAAI,CAAC;IAE5B,gEAAgE;IAChE,8DAA8D;IAC9D,8DAA8D;IAC9D,+DAA+D;IAC/D,iEAAiE;IACjE,4DAA4D;IAC5D,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,GAAG,mBAAmB,CAAC,SAAS,CAAC;;;;EAI1C,MAAM;;;;;;;;UAQE,CAAC;IACT,CAAC;IAED,mDAAmD;IACnD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO;;;;;;;;;;;;EAYX,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;;;;;;;;;gDASmB,CAAC;QAE7C,KAAK,OAAO;YACV,OAAO;;;;;;EAMX,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;;;;;;;;;sDASuB,CAAC;QAEnD,KAAK,KAAK;YACR,OAAO;;;;EAIX,MAAM;;;;;;;;;;;;+CAYuC,CAAC;QAE5C,KAAK,SAAS;YACZ,OAAO;;;;;;;EAOX,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;;;;8EAI+C,CAAC;QAE3E,KAAK,QAAQ;YACX,OAAO;;;;EAIX,MAAM;;;;;;;;eAQO,CAAC;QAEZ,KAAK,QAAQ;YACX,OAAO;;;;;;EAMX,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;;;;;;sDAMuB,CAAC;QAEnD,KAAK,gBAAgB;YACnB,OAAO;;;;;EAKX,MAAM;;;;8CAIsC,CAAC;QAE3C,KAAK,YAAY,CAAC;QAClB;YACE,OAAO;;;EAGX,MAAM;;;;;;IAMJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;mEAMmE;AACnE,SAAS,mBAAmB,CAAC,SAAoB;IAC/C,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO;qFACwE,CAAC;QAClF,KAAK,OAAO;YACV,OAAO;gEACmD,CAAC;QAC7D,KAAK,KAAK;YACR,OAAO;0DAC6C,CAAC;QACvD,KAAK,SAAS;YACZ,OAAO;oEACuD,CAAC;QACjE,KAAK,QAAQ;YACX,OAAO;6DACgD,CAAC;QAC1D,KAAK,QAAQ;YACX,OAAO;wDAC2C,CAAC;QACrD,KAAK,gBAAgB;YACnB,OAAO;gEACmD,CAAC;QAC7D,KAAK,YAAY,CAAC;QAClB;YACE,OAAO;qDACwC,CAAC;IACpD,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fingerprint79/sdk-snippets",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Idiomatic init-snippet generators for the Fingerprint Platform SDK across React, Next.js, Vue, Angular, Svelte, Preact, vanilla and SPA — plus the «Copy prompt» markdown builder. Shared between the admin dashboard and the MCP server.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md",
|
|
17
|
+
"LICENSE"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"fingerprint",
|
|
24
|
+
"device-id",
|
|
25
|
+
"sdk",
|
|
26
|
+
"snippets",
|
|
27
|
+
"react",
|
|
28
|
+
"nextjs",
|
|
29
|
+
"vue",
|
|
30
|
+
"angular",
|
|
31
|
+
"svelte",
|
|
32
|
+
"preact",
|
|
33
|
+
"mcp"
|
|
34
|
+
],
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc -b",
|
|
38
|
+
"typecheck": "tsc -b --noEmit",
|
|
39
|
+
"lint": "eslint src",
|
|
40
|
+
"test": "vitest run --passWithNoTests",
|
|
41
|
+
"clean": "rimraf dist .turbo *.tsbuildinfo"
|
|
42
|
+
}
|
|
43
|
+
}
|