@blamejs/blamejs-shop 0.4.55 → 0.4.57
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/CHANGELOG.md +4 -0
- package/lib/admin.js +385 -2
- package/lib/asset-manifest.json +1 -1
- package/lib/vendor/MANIFEST.json +426 -366
- package/lib/vendor/blamejs/.github/codeql/codeql-config.yml +25 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +1 -1
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +1 -1
- package/lib/vendor/blamejs/.github/workflows/ci.yml +13 -13
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +8 -7
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +2 -2
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +4 -4
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +1 -1
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
- package/lib/vendor/blamejs/CHANGELOG.md +2 -0
- package/lib/vendor/blamejs/api-snapshot.json +1381 -4
- package/lib/vendor/blamejs/eslint.config.mjs +1 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +4 -1
- package/lib/vendor/blamejs/examples/wiki/lib/symbol-index.js +5 -2
- package/lib/vendor/blamejs/examples/wiki/routes/pages.js +4 -1
- package/lib/vendor/blamejs/fuzz/guard-text.fuzz.js +20 -0
- package/lib/vendor/blamejs/index.js +2 -0
- package/lib/vendor/blamejs/lib/a2a-tasks.js +7 -23
- package/lib/vendor/blamejs/lib/acme.js +6 -5
- package/lib/vendor/blamejs/lib/agent-event-bus.js +5 -4
- package/lib/vendor/blamejs/lib/agent-idempotency.js +2 -5
- package/lib/vendor/blamejs/lib/agent-orchestrator.js +2 -5
- package/lib/vendor/blamejs/lib/agent-saga.js +3 -5
- package/lib/vendor/blamejs/lib/agent-tenant.js +2 -5
- package/lib/vendor/blamejs/lib/ai-adverse-decision.js +2 -15
- package/lib/vendor/blamejs/lib/ai-capability.js +1 -6
- package/lib/vendor/blamejs/lib/ai-dp.js +1 -5
- package/lib/vendor/blamejs/lib/ai-input.js +2 -2
- package/lib/vendor/blamejs/lib/ai-pref.js +3 -8
- package/lib/vendor/blamejs/lib/ai-quota.js +3 -14
- package/lib/vendor/blamejs/lib/api-key.js +37 -28
- package/lib/vendor/blamejs/lib/archive-adapters.js +2 -4
- package/lib/vendor/blamejs/lib/archive-entry-policy.js +32 -0
- package/lib/vendor/blamejs/lib/archive-read.js +5 -17
- package/lib/vendor/blamejs/lib/archive-tar-read.js +5 -16
- package/lib/vendor/blamejs/lib/archive.js +2 -10
- package/lib/vendor/blamejs/lib/arg-parser.js +7 -6
- package/lib/vendor/blamejs/lib/asyncapi-traits.js +2 -6
- package/lib/vendor/blamejs/lib/atomic-file.js +108 -31
- package/lib/vendor/blamejs/lib/audit-chain.js +133 -53
- package/lib/vendor/blamejs/lib/audit-daily-review.js +24 -14
- package/lib/vendor/blamejs/lib/audit-emit.js +82 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +257 -0
- package/lib/vendor/blamejs/lib/audit.js +84 -0
- package/lib/vendor/blamejs/lib/auth/access-lock.js +5 -27
- package/lib/vendor/blamejs/lib/auth/dpop.js +23 -35
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +9 -15
- package/lib/vendor/blamejs/lib/auth/jwt-external.js +26 -8
- package/lib/vendor/blamejs/lib/auth/jwt.js +13 -15
- package/lib/vendor/blamejs/lib/auth/lockout.js +6 -25
- package/lib/vendor/blamejs/lib/auth/oauth.js +67 -45
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +55 -32
- package/lib/vendor/blamejs/lib/auth/oid4vp.js +3 -2
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +6 -6
- package/lib/vendor/blamejs/lib/auth/passkey.js +3 -3
- package/lib/vendor/blamejs/lib/auth/password.js +7 -1
- package/lib/vendor/blamejs/lib/auth/saml.js +37 -27
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-holder.js +2 -14
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-issuer.js +2 -14
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +1 -1
- package/lib/vendor/blamejs/lib/auth/status-list.js +7 -7
- package/lib/vendor/blamejs/lib/auth/step-up.js +6 -12
- package/lib/vendor/blamejs/lib/auth-bot-challenge.js +6 -37
- package/lib/vendor/blamejs/lib/backup/bundle.js +11 -18
- package/lib/vendor/blamejs/lib/backup/index.js +14 -47
- package/lib/vendor/blamejs/lib/bounded-map.js +112 -1
- package/lib/vendor/blamejs/lib/breach-deadline.js +1 -11
- package/lib/vendor/blamejs/lib/cache.js +7 -18
- package/lib/vendor/blamejs/lib/cbor.js +2 -1
- package/lib/vendor/blamejs/lib/cdn-cache-control.js +8 -9
- package/lib/vendor/blamejs/lib/cert.js +3 -10
- package/lib/vendor/blamejs/lib/chain-writer.js +162 -47
- package/lib/vendor/blamejs/lib/cli.js +5 -1
- package/lib/vendor/blamejs/lib/client-hints.js +7 -9
- package/lib/vendor/blamejs/lib/cloud-events.js +40 -31
- package/lib/vendor/blamejs/lib/cluster-storage.js +2 -38
- package/lib/vendor/blamejs/lib/cms-codec.js +2 -1
- package/lib/vendor/blamejs/lib/codepoint-class.js +67 -1
- package/lib/vendor/blamejs/lib/compliance-ai-act-logging.js +1 -6
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +2 -4
- package/lib/vendor/blamejs/lib/compliance-eaa.js +1 -11
- package/lib/vendor/blamejs/lib/compliance-sanctions-fetcher.js +21 -28
- package/lib/vendor/blamejs/lib/compliance-sanctions.js +2 -14
- package/lib/vendor/blamejs/lib/compliance.js +2 -9
- package/lib/vendor/blamejs/lib/config-drift.js +2 -12
- package/lib/vendor/blamejs/lib/content-digest.js +10 -8
- package/lib/vendor/blamejs/lib/cookies.js +5 -11
- package/lib/vendor/blamejs/lib/cose.js +19 -11
- package/lib/vendor/blamejs/lib/cra-report.js +1 -11
- package/lib/vendor/blamejs/lib/crypto-field.js +5 -10
- package/lib/vendor/blamejs/lib/crypto.js +120 -3
- package/lib/vendor/blamejs/lib/csp.js +235 -3
- package/lib/vendor/blamejs/lib/daemon.js +42 -41
- package/lib/vendor/blamejs/lib/data-act.js +19 -9
- package/lib/vendor/blamejs/lib/db-query.js +6 -40
- package/lib/vendor/blamejs/lib/db.js +34 -12
- package/lib/vendor/blamejs/lib/dbsc.js +5 -6
- package/lib/vendor/blamejs/lib/ddl-change-control.js +18 -14
- package/lib/vendor/blamejs/lib/deprecate.js +4 -5
- package/lib/vendor/blamejs/lib/did.js +6 -2
- package/lib/vendor/blamejs/lib/dsr.js +8 -12
- package/lib/vendor/blamejs/lib/external-db-migrate.js +21 -22
- package/lib/vendor/blamejs/lib/external-db.js +14 -26
- package/lib/vendor/blamejs/lib/fda-21cfr11.js +12 -8
- package/lib/vendor/blamejs/lib/fdx.js +22 -18
- package/lib/vendor/blamejs/lib/file-upload.js +80 -66
- package/lib/vendor/blamejs/lib/flag-evaluation-context.js +5 -8
- package/lib/vendor/blamejs/lib/framework-error.js +12 -0
- package/lib/vendor/blamejs/lib/framework-schema.js +19 -0
- package/lib/vendor/blamejs/lib/fsm.js +7 -12
- package/lib/vendor/blamejs/lib/gate-contract.js +869 -38
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +4 -13
- package/lib/vendor/blamejs/lib/graphql-federation.js +1 -1
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +2 -1
- package/lib/vendor/blamejs/lib/guard-all.js +1 -0
- package/lib/vendor/blamejs/lib/guard-archive.js +9 -30
- package/lib/vendor/blamejs/lib/guard-auth.js +23 -80
- package/lib/vendor/blamejs/lib/guard-cidr.js +20 -96
- package/lib/vendor/blamejs/lib/guard-csv.js +135 -196
- package/lib/vendor/blamejs/lib/guard-domain.js +23 -106
- package/lib/vendor/blamejs/lib/guard-dsn.js +16 -13
- package/lib/vendor/blamejs/lib/guard-email.js +46 -53
- package/lib/vendor/blamejs/lib/guard-envelope.js +1 -1
- package/lib/vendor/blamejs/lib/guard-event-bus-topic.js +2 -1
- package/lib/vendor/blamejs/lib/guard-filename.js +12 -60
- package/lib/vendor/blamejs/lib/guard-graphql.js +28 -75
- package/lib/vendor/blamejs/lib/guard-html-wcag.js +15 -2
- package/lib/vendor/blamejs/lib/guard-html.js +65 -117
- package/lib/vendor/blamejs/lib/guard-idempotency-key.js +2 -1
- package/lib/vendor/blamejs/lib/guard-image.js +280 -77
- package/lib/vendor/blamejs/lib/guard-imap-command.js +8 -9
- package/lib/vendor/blamejs/lib/guard-json.js +87 -103
- package/lib/vendor/blamejs/lib/guard-jsonpath.js +20 -88
- package/lib/vendor/blamejs/lib/guard-jwt.js +32 -114
- package/lib/vendor/blamejs/lib/guard-list-id.js +2 -7
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -7
- package/lib/vendor/blamejs/lib/guard-mail-compose.js +5 -6
- package/lib/vendor/blamejs/lib/guard-mail-move.js +2 -1
- package/lib/vendor/blamejs/lib/guard-mail-query.js +5 -3
- package/lib/vendor/blamejs/lib/guard-mail-sieve.js +6 -7
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +5 -4
- package/lib/vendor/blamejs/lib/guard-markdown.js +76 -110
- package/lib/vendor/blamejs/lib/guard-message-id.js +5 -6
- package/lib/vendor/blamejs/lib/guard-mime.js +20 -99
- package/lib/vendor/blamejs/lib/guard-oauth.js +19 -73
- package/lib/vendor/blamejs/lib/guard-pdf.js +65 -72
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +12 -13
- package/lib/vendor/blamejs/lib/guard-posture-chain.js +2 -1
- package/lib/vendor/blamejs/lib/guard-regex.js +24 -99
- package/lib/vendor/blamejs/lib/guard-saga-config.js +2 -1
- package/lib/vendor/blamejs/lib/guard-shell.js +22 -87
- package/lib/vendor/blamejs/lib/guard-smtp-command.js +8 -11
- package/lib/vendor/blamejs/lib/guard-sql.js +15 -13
- package/lib/vendor/blamejs/lib/guard-stream-args.js +2 -1
- package/lib/vendor/blamejs/lib/guard-svg.js +95 -140
- package/lib/vendor/blamejs/lib/guard-template.js +23 -80
- package/lib/vendor/blamejs/lib/guard-tenant-id.js +2 -1
- package/lib/vendor/blamejs/lib/guard-text.js +592 -0
- package/lib/vendor/blamejs/lib/guard-time.js +27 -95
- package/lib/vendor/blamejs/lib/guard-uuid.js +21 -93
- package/lib/vendor/blamejs/lib/guard-xml.js +76 -106
- package/lib/vendor/blamejs/lib/guard-yaml.js +24 -60
- package/lib/vendor/blamejs/lib/http-client-cache.js +5 -12
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +2 -4
- package/lib/vendor/blamejs/lib/http-client.js +8 -21
- package/lib/vendor/blamejs/lib/http-message-signature.js +3 -2
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +5 -7
- package/lib/vendor/blamejs/lib/i18n.js +83 -26
- package/lib/vendor/blamejs/lib/inbox.js +8 -8
- package/lib/vendor/blamejs/lib/incident-report.js +3 -21
- package/lib/vendor/blamejs/lib/ip-utils.js +49 -6
- package/lib/vendor/blamejs/lib/jobs.js +3 -2
- package/lib/vendor/blamejs/lib/keychain.js +6 -18
- package/lib/vendor/blamejs/lib/legal-hold.js +6 -15
- package/lib/vendor/blamejs/lib/log-stream-cloudwatch.js +44 -112
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +17 -14
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +16 -80
- package/lib/vendor/blamejs/lib/log-stream-webhook.js +20 -92
- package/lib/vendor/blamejs/lib/mail-arc-sign.js +8 -3
- package/lib/vendor/blamejs/lib/mail-arf.js +3 -2
- package/lib/vendor/blamejs/lib/mail-auth.js +40 -66
- package/lib/vendor/blamejs/lib/mail-bimi.js +19 -39
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +3 -2
- package/lib/vendor/blamejs/lib/mail-dav.js +8 -35
- package/lib/vendor/blamejs/lib/mail-deploy.js +6 -9
- package/lib/vendor/blamejs/lib/mail-dkim.js +19 -38
- package/lib/vendor/blamejs/lib/mail-greylist.js +15 -26
- package/lib/vendor/blamejs/lib/mail-helo.js +2 -3
- package/lib/vendor/blamejs/lib/mail-journal.js +2 -1
- package/lib/vendor/blamejs/lib/mail-mdn.js +4 -3
- package/lib/vendor/blamejs/lib/mail-rbl.js +5 -8
- package/lib/vendor/blamejs/lib/mail-scan.js +2 -2
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +33 -20
- package/lib/vendor/blamejs/lib/mail-server-imap.js +32 -87
- package/lib/vendor/blamejs/lib/mail-server-jmap.js +35 -51
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +29 -83
- package/lib/vendor/blamejs/lib/mail-server-mx.js +33 -74
- package/lib/vendor/blamejs/lib/mail-server-net.js +177 -0
- package/lib/vendor/blamejs/lib/mail-server-pop3.js +30 -83
- package/lib/vendor/blamejs/lib/mail-server-rate-limit.js +30 -6
- package/lib/vendor/blamejs/lib/mail-server-submission.js +34 -73
- package/lib/vendor/blamejs/lib/mail-server-tls.js +89 -0
- package/lib/vendor/blamejs/lib/mail-spam-score.js +7 -8
- package/lib/vendor/blamejs/lib/mail-store.js +3 -2
- package/lib/vendor/blamejs/lib/mail.js +6 -11
- package/lib/vendor/blamejs/lib/markup-escape.js +31 -0
- package/lib/vendor/blamejs/lib/markup-tokenizer.js +54 -0
- package/lib/vendor/blamejs/lib/mcp-tool-registry.js +26 -23
- package/lib/vendor/blamejs/lib/mcp.js +1 -1
- package/lib/vendor/blamejs/lib/mdoc.js +11 -12
- package/lib/vendor/blamejs/lib/metrics.js +32 -30
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +3 -23
- package/lib/vendor/blamejs/lib/middleware/api-encrypt.js +11 -22
- package/lib/vendor/blamejs/lib/middleware/assetlinks.js +2 -7
- package/lib/vendor/blamejs/lib/middleware/bearer-auth.js +2 -1
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +31 -48
- package/lib/vendor/blamejs/lib/middleware/bot-disclose.js +7 -10
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +2 -10
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +13 -2
- package/lib/vendor/blamejs/lib/middleware/daily-byte-quota.js +6 -26
- package/lib/vendor/blamejs/lib/middleware/deny-response.js +19 -1
- package/lib/vendor/blamejs/lib/middleware/fetch-metadata.js +7 -0
- package/lib/vendor/blamejs/lib/middleware/idempotency-key.js +4 -20
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +20 -28
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +3 -2
- package/lib/vendor/blamejs/lib/middleware/security-headers.js +9 -1
- package/lib/vendor/blamejs/lib/middleware/security-txt.js +2 -6
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +12 -27
- package/lib/vendor/blamejs/lib/middleware/web-app-manifest.js +2 -7
- package/lib/vendor/blamejs/lib/migrations.js +4 -13
- package/lib/vendor/blamejs/lib/mime-parse.js +34 -17
- package/lib/vendor/blamejs/lib/module-loader.js +44 -0
- package/lib/vendor/blamejs/lib/money.js +105 -0
- package/lib/vendor/blamejs/lib/mtls-ca.js +116 -36
- package/lib/vendor/blamejs/lib/network-byte-quota.js +4 -18
- package/lib/vendor/blamejs/lib/network-dane.js +8 -6
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +97 -6
- package/lib/vendor/blamejs/lib/network-dnssec.js +16 -16
- package/lib/vendor/blamejs/lib/network-heartbeat.js +3 -2
- package/lib/vendor/blamejs/lib/network-smtp-policy.js +29 -41
- package/lib/vendor/blamejs/lib/network-tls.js +40 -42
- package/lib/vendor/blamejs/lib/nis2-report.js +1 -11
- package/lib/vendor/blamejs/lib/nonce-store.js +81 -3
- package/lib/vendor/blamejs/lib/numeric-bounds.js +22 -8
- package/lib/vendor/blamejs/lib/object-store/azure-blob-bucket-ops.js +2 -6
- package/lib/vendor/blamejs/lib/object-store/azure-blob.js +5 -45
- package/lib/vendor/blamejs/lib/object-store/gcs.js +8 -71
- package/lib/vendor/blamejs/lib/object-store/http-put.js +1 -5
- package/lib/vendor/blamejs/lib/object-store/http-request.js +128 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4-bucket-ops.js +2 -1
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +9 -77
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +9 -25
- package/lib/vendor/blamejs/lib/observability.js +95 -0
- package/lib/vendor/blamejs/lib/openapi-paths-builder.js +7 -3
- package/lib/vendor/blamejs/lib/otel-export.js +7 -10
- package/lib/vendor/blamejs/lib/outbox.js +43 -37
- package/lib/vendor/blamejs/lib/pagination.js +11 -15
- package/lib/vendor/blamejs/lib/parsers/safe-env.js +5 -4
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +10 -4
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +11 -9
- package/lib/vendor/blamejs/lib/parsers/safe-xml.js +2 -2
- package/lib/vendor/blamejs/lib/parsers/safe-yaml.js +7 -6
- package/lib/vendor/blamejs/lib/pick.js +63 -5
- package/lib/vendor/blamejs/lib/pipl-cn.js +69 -59
- package/lib/vendor/blamejs/lib/privacy-pass.js +8 -6
- package/lib/vendor/blamejs/lib/problem-details.js +2 -5
- package/lib/vendor/blamejs/lib/pubsub.js +4 -8
- package/lib/vendor/blamejs/lib/redact.js +2 -1
- package/lib/vendor/blamejs/lib/render.js +4 -2
- package/lib/vendor/blamejs/lib/request-helpers.js +133 -6
- package/lib/vendor/blamejs/lib/restore.js +5 -22
- package/lib/vendor/blamejs/lib/retention.js +3 -5
- package/lib/vendor/blamejs/lib/safe-async.js +457 -0
- package/lib/vendor/blamejs/lib/safe-buffer.js +137 -6
- package/lib/vendor/blamejs/lib/safe-decompress.js +2 -1
- package/lib/vendor/blamejs/lib/safe-dns.js +2 -1
- package/lib/vendor/blamejs/lib/safe-ical.js +12 -26
- package/lib/vendor/blamejs/lib/safe-json.js +7 -8
- package/lib/vendor/blamejs/lib/safe-jsonpath.js +6 -5
- package/lib/vendor/blamejs/lib/safe-mime.js +25 -29
- package/lib/vendor/blamejs/lib/safe-redirect.js +2 -5
- package/lib/vendor/blamejs/lib/safe-schema.js +7 -6
- package/lib/vendor/blamejs/lib/safe-sql.js +126 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +12 -26
- package/lib/vendor/blamejs/lib/sandbox-worker.js +9 -2
- package/lib/vendor/blamejs/lib/sandbox.js +3 -2
- package/lib/vendor/blamejs/lib/scheduler.js +5 -12
- package/lib/vendor/blamejs/lib/sec-cyber.js +82 -37
- package/lib/vendor/blamejs/lib/seeders.js +4 -11
- package/lib/vendor/blamejs/lib/self-update.js +92 -69
- package/lib/vendor/blamejs/lib/session-device-binding.js +112 -66
- package/lib/vendor/blamejs/lib/session.js +194 -6
- package/lib/vendor/blamejs/lib/sql.js +225 -78
- package/lib/vendor/blamejs/lib/sse.js +6 -10
- package/lib/vendor/blamejs/lib/static.js +136 -98
- package/lib/vendor/blamejs/lib/storage.js +4 -2
- package/lib/vendor/blamejs/lib/structured-fields.js +275 -16
- package/lib/vendor/blamejs/lib/tenant-quota.js +2 -20
- package/lib/vendor/blamejs/lib/tsa.js +11 -15
- package/lib/vendor/blamejs/lib/validate-opts.js +154 -8
- package/lib/vendor/blamejs/lib/vault/seal-pem-file.js +30 -48
- package/lib/vendor/blamejs/lib/vault-aad.js +3 -2
- package/lib/vendor/blamejs/lib/vc.js +2 -7
- package/lib/vendor/blamejs/lib/vex.js +35 -13
- package/lib/vendor/blamejs/lib/web-push-vapid.js +23 -20
- package/lib/vendor/blamejs/lib/webhook-dispatcher.js +706 -0
- package/lib/vendor/blamejs/lib/webhook.js +43 -18
- package/lib/vendor/blamejs/lib/websocket-channels.js +9 -7
- package/lib/vendor/blamejs/lib/websocket.js +7 -3
- package/lib/vendor/blamejs/lib/worm.js +2 -3
- package/lib/vendor/blamejs/lib/ws-client.js +8 -10
- package/lib/vendor/blamejs/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.15.13.json +81 -0
- package/lib/vendor/blamejs/scripts/check-changelog-extract.js +1 -1
- package/lib/vendor/blamejs/test/00-primitives.js +136 -7
- package/lib/vendor/blamejs/test/10-state.js +9 -3
- package/lib/vendor/blamejs/test/30-chain.js +40 -0
- package/lib/vendor/blamejs/test/helpers/check.js +18 -0
- package/lib/vendor/blamejs/test/helpers/db.js +4 -0
- package/lib/vendor/blamejs/test/helpers/index.js +1 -0
- package/lib/vendor/blamejs/test/integration/audit-chain-external-db.test.js +2 -1
- package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +2 -1
- package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +8 -1
- package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +1 -1
- package/lib/vendor/blamejs/test/integration/framework-schema-mysql.test.js +2 -1
- package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +269 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file-fd-read.test.js +149 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-framework-namespaces.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +88 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-use-store.test.js +55 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-object-store-adapter.test.js +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/bot-guard.test.js +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/bounded-map.test.js +129 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/chain-writer-multichain.test.js +107 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-api-key.test.js +12 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +2788 -3214
- package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +78 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-base64url.test.js +63 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +2 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-builder.test.js +50 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-nonce.test.js +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +2 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/defineguard-resolve-opts.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +9 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract-content-gate.test.js +290 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-csv.test.js +84 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-email.test.js +78 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +23 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-gate-disposition-coverage.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +60 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +184 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-json.test.js +54 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +10 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +45 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +101 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +18 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-text.test.js +365 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-xml.test.js +35 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-yaml.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +20 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/inbox.test.js +15 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-arf.test.js +10 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +39 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-greylist.test.js +17 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-tls.test.js +39 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +17 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mime-parse.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/money.test.js +17 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-revocation.test.js +98 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-release.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-memory-getorinsert.test.js +100 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +88 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async-loops.test.js +278 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +37 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-jsonpath.test.js +14 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sandbox.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-headers.test.js +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +2 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +18 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-extensions.test.js +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/session-valid-from.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +100 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/structured-fields.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/validate-opts-shape.test.js +235 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +374 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +75 -8
- package/lib/vendor/blamejs/test/layer-5-integration/guard-host-integration.test.js +3 -3
- package/lib/winback-campaigns.js +202 -42
- package/package.json +1 -1
package/lib/winback-campaigns.js
CHANGED
|
@@ -592,6 +592,93 @@ function create(opts) {
|
|
|
592
592
|
return _rowToCampaign(await _getCampaignRow(slug));
|
|
593
593
|
},
|
|
594
594
|
|
|
595
|
+
// Re-activate an archived campaign — clears `archived_at` so the
|
|
596
|
+
// scan path picks it up again. The inverse of `archiveCampaign`.
|
|
597
|
+
// Idempotent: re-activating an already-active campaign is a no-op
|
|
598
|
+
// that returns the current shape. Throws when the campaign doesn't
|
|
599
|
+
// exist (config-time tier — an operator acting on a typo'd slug
|
|
600
|
+
// should hear about it).
|
|
601
|
+
activateCampaign: async function (slug, activateOpts) {
|
|
602
|
+
_validateSlug(slug, "slug");
|
|
603
|
+
activateOpts = activateOpts || {};
|
|
604
|
+
var now = activateOpts.now == null ? _now() : activateOpts.now;
|
|
605
|
+
_validateNonNegInt(now, "now");
|
|
606
|
+
var existing = await _getCampaignRow(slug);
|
|
607
|
+
if (!existing) {
|
|
608
|
+
throw new TypeError(
|
|
609
|
+
"winbackCampaigns.activateCampaign: campaign '" + slug + "' not found"
|
|
610
|
+
);
|
|
611
|
+
}
|
|
612
|
+
if (existing.archived_at == null) {
|
|
613
|
+
return _rowToCampaign(existing);
|
|
614
|
+
}
|
|
615
|
+
await query(
|
|
616
|
+
"UPDATE winback_campaigns SET archived_at = NULL, updated_at = ?1 WHERE slug = ?2",
|
|
617
|
+
[now, slug],
|
|
618
|
+
);
|
|
619
|
+
return _rowToCampaign(await _getCampaignRow(slug));
|
|
620
|
+
},
|
|
621
|
+
|
|
622
|
+
// List every campaign, newest-first, with an optional status
|
|
623
|
+
// filter ("active" | "archived"). The operator console reads this
|
|
624
|
+
// for the campaign table; absent a filter every campaign returns.
|
|
625
|
+
listCampaigns: async function (listOpts) {
|
|
626
|
+
listOpts = listOpts || {};
|
|
627
|
+
var status = listOpts.status;
|
|
628
|
+
var sql = "SELECT * FROM winback_campaigns";
|
|
629
|
+
if (status === "active") {
|
|
630
|
+
sql += " WHERE archived_at IS NULL";
|
|
631
|
+
} else if (status === "archived") {
|
|
632
|
+
sql += " WHERE archived_at IS NOT NULL";
|
|
633
|
+
} else if (status != null) {
|
|
634
|
+
throw new TypeError(
|
|
635
|
+
"winbackCampaigns.listCampaigns: status must be 'active' or 'archived' when supplied"
|
|
636
|
+
);
|
|
637
|
+
}
|
|
638
|
+
sql += " ORDER BY created_at DESC";
|
|
639
|
+
var rows = (await query(sql, [])).rows;
|
|
640
|
+
var out = [];
|
|
641
|
+
for (var i = 0; i < rows.length; i += 1) out.push(_rowToCampaign(rows[i]));
|
|
642
|
+
return out;
|
|
643
|
+
},
|
|
644
|
+
|
|
645
|
+
// Read the most-recent deliveries across a campaign's enrollments,
|
|
646
|
+
// newest-first, bounded by `limit` (default 100). Joins each
|
|
647
|
+
// delivery to its enrollment so the console can show which
|
|
648
|
+
// customer received which step + coupon at which time. The
|
|
649
|
+
// operator-facing delivery-log panel reads this.
|
|
650
|
+
recentDeliveriesForCampaign: async function (input) {
|
|
651
|
+
if (!input || typeof input !== "object") {
|
|
652
|
+
throw new TypeError("winbackCampaigns.recentDeliveriesForCampaign: input object required");
|
|
653
|
+
}
|
|
654
|
+
var slug = _validateSlug(input.slug, "slug");
|
|
655
|
+
var limit = input.limit == null ? 100 : input.limit;
|
|
656
|
+
_validatePositiveInt(limit, "limit");
|
|
657
|
+
if (limit > 500) limit = 500;
|
|
658
|
+
var rows = (await query(
|
|
659
|
+
"SELECT d.id AS id, d.enrollment_id AS enrollment_id, " +
|
|
660
|
+
" d.step_index AS step_index, d.coupon_code AS coupon_code, " +
|
|
661
|
+
" d.delivered_at AS delivered_at, e.customer_id AS customer_id " +
|
|
662
|
+
"FROM winback_deliveries d " +
|
|
663
|
+
"JOIN winback_enrollments e ON e.id = d.enrollment_id " +
|
|
664
|
+
"WHERE e.campaign_slug = ?1 " +
|
|
665
|
+
"ORDER BY d.delivered_at DESC, d.step_index DESC LIMIT ?2",
|
|
666
|
+
[slug, limit],
|
|
667
|
+
)).rows;
|
|
668
|
+
var out = [];
|
|
669
|
+
for (var i = 0; i < rows.length; i += 1) {
|
|
670
|
+
out.push({
|
|
671
|
+
id: rows[i].id,
|
|
672
|
+
enrollment_id: rows[i].enrollment_id,
|
|
673
|
+
customer_id: rows[i].customer_id,
|
|
674
|
+
step_index: Number(rows[i].step_index),
|
|
675
|
+
coupon_code: rows[i].coupon_code || null,
|
|
676
|
+
delivered_at: Number(rows[i].delivered_at),
|
|
677
|
+
});
|
|
678
|
+
}
|
|
679
|
+
return out;
|
|
680
|
+
},
|
|
681
|
+
|
|
595
682
|
// Scan the operator's order history for customers whose last
|
|
596
683
|
// paid order landed inside the lapse window for each active
|
|
597
684
|
// campaign + who aren't already enrolled. Returns a flat array
|
|
@@ -869,8 +956,12 @@ function create(opts) {
|
|
|
869
956
|
suppressionReason = sup.suppression_type || "suppressed";
|
|
870
957
|
}
|
|
871
958
|
} catch (_e) {
|
|
872
|
-
//
|
|
873
|
-
//
|
|
959
|
+
// FAIL-CLOSED — a suppression-list outage must NOT let a
|
|
960
|
+
// marketing send slip past. Treat the unavailable check as a
|
|
961
|
+
// hit and cancel the enrollment rather than email an address
|
|
962
|
+
// that may have opted out.
|
|
963
|
+
suppressed = true;
|
|
964
|
+
suppressionReason = "suppression-check-unavailable";
|
|
874
965
|
}
|
|
875
966
|
}
|
|
876
967
|
|
|
@@ -887,11 +978,45 @@ function create(opts) {
|
|
|
887
978
|
continue;
|
|
888
979
|
}
|
|
889
980
|
|
|
890
|
-
//
|
|
891
|
-
//
|
|
892
|
-
//
|
|
893
|
-
//
|
|
894
|
-
//
|
|
981
|
+
// ATOMIC CLAIM — advance the FSM FIRST, so the conditional UPDATE
|
|
982
|
+
// is the single point that decides which of two overlapping ticks
|
|
983
|
+
// owns this step. The send + coupon mint happen ONLY after a
|
|
984
|
+
// winning claim (changes === 1), so a step is at-most-once: a
|
|
985
|
+
// marketing message is better missed than doubled, and a
|
|
986
|
+
// concurrent tick can't double-send or double-mint. The loser
|
|
987
|
+
// (changes === 0) skips — the winner already owns the step.
|
|
988
|
+
var nextIdx = stepIdx + 1;
|
|
989
|
+
var claim;
|
|
990
|
+
if (nextIdx >= steps.length) {
|
|
991
|
+
claim = await query(
|
|
992
|
+
"UPDATE winback_enrollments SET " +
|
|
993
|
+
"status = 'exhausted', current_step_index = ?1, " +
|
|
994
|
+
"next_step_at = NULL, updated_at = ?2 " +
|
|
995
|
+
"WHERE id = ?3 AND status = 'active' AND current_step_index = ?4",
|
|
996
|
+
[nextIdx, now, enr.id, stepIdx],
|
|
997
|
+
);
|
|
998
|
+
} else {
|
|
999
|
+
var createdAt = Number(enr.created_at);
|
|
1000
|
+
var nextAt = _nextStepAt(steps, createdAt, nextIdx);
|
|
1001
|
+
claim = await query(
|
|
1002
|
+
"UPDATE winback_enrollments SET " +
|
|
1003
|
+
"current_step_index = ?1, next_step_at = ?2, updated_at = ?3 " +
|
|
1004
|
+
"WHERE id = ?4 AND status = 'active' AND current_step_index = ?5",
|
|
1005
|
+
[nextIdx, nextAt, now, enr.id, stepIdx],
|
|
1006
|
+
);
|
|
1007
|
+
}
|
|
1008
|
+
var claimed = Number((claim && (claim.changes != null ? claim.changes : claim.rowCount)) || 0);
|
|
1009
|
+
if (claimed !== 1) {
|
|
1010
|
+
// A concurrent tick already advanced this step — it owns the
|
|
1011
|
+
// send; skip without re-sending or re-minting.
|
|
1012
|
+
continue;
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
// Claimed. Mint the per-step coupon (the primitive's core step
|
|
1016
|
+
// action, independent of whether an address resolved — the
|
|
1017
|
+
// delivery row records the coupon for a mailer retry), then route
|
|
1018
|
+
// the send through the operator's email primitive. The send is
|
|
1019
|
+
// best-effort: a failure doesn't roll back the claim.
|
|
895
1020
|
var couponCode = await _resolveCouponForStep(step, customerId);
|
|
896
1021
|
if (
|
|
897
1022
|
email &&
|
|
@@ -910,22 +1035,15 @@ function create(opts) {
|
|
|
910
1035
|
},
|
|
911
1036
|
});
|
|
912
1037
|
} catch (_e) {
|
|
913
|
-
// drop-silent — the
|
|
914
|
-
//
|
|
915
|
-
// delivery row's coupon_code if it minted one.
|
|
1038
|
+
// drop-silent — the claim already committed; the operator's
|
|
1039
|
+
// mailer retries from the delivery row's coupon_code if any.
|
|
916
1040
|
}
|
|
917
1041
|
}
|
|
918
1042
|
|
|
919
|
-
//
|
|
920
|
-
// (
|
|
921
|
-
//
|
|
922
|
-
|
|
923
|
-
// layer.
|
|
924
|
-
var prior = await query(
|
|
925
|
-
"SELECT id FROM winback_deliveries WHERE enrollment_id = ?1 AND step_index = ?2 LIMIT 1",
|
|
926
|
-
[enr.id, stepIdx],
|
|
927
|
-
);
|
|
928
|
-
if (!prior.rows[0]) {
|
|
1043
|
+
// Record the delivery. Only the claiming tick reaches here, so the
|
|
1044
|
+
// UNIQUE(enrollment_id, step_index) index can't collide; the
|
|
1045
|
+
// try/catch is a defensive backstop that never strands the batch.
|
|
1046
|
+
try {
|
|
929
1047
|
var deliveryId = b.uuid.v7();
|
|
930
1048
|
await query(
|
|
931
1049
|
"INSERT INTO winback_deliveries " +
|
|
@@ -933,28 +1051,7 @@ function create(opts) {
|
|
|
933
1051
|
"VALUES (?1, ?2, ?3, ?4, ?5)",
|
|
934
1052
|
[deliveryId, enr.id, stepIdx, couponCode, now],
|
|
935
1053
|
);
|
|
936
|
-
}
|
|
937
|
-
|
|
938
|
-
// Advance the FSM.
|
|
939
|
-
var nextIdx = stepIdx + 1;
|
|
940
|
-
if (nextIdx >= steps.length) {
|
|
941
|
-
await query(
|
|
942
|
-
"UPDATE winback_enrollments SET " +
|
|
943
|
-
"status = 'exhausted', current_step_index = ?1, " +
|
|
944
|
-
"next_step_at = NULL, updated_at = ?2 " +
|
|
945
|
-
"WHERE id = ?3 AND status = 'active' AND current_step_index = ?4",
|
|
946
|
-
[nextIdx, now, enr.id, stepIdx],
|
|
947
|
-
);
|
|
948
|
-
} else {
|
|
949
|
-
var createdAt = Number(enr.created_at);
|
|
950
|
-
var nextAt = _nextStepAt(steps, createdAt, nextIdx);
|
|
951
|
-
await query(
|
|
952
|
-
"UPDATE winback_enrollments SET " +
|
|
953
|
-
"current_step_index = ?1, next_step_at = ?2, updated_at = ?3 " +
|
|
954
|
-
"WHERE id = ?4 AND status = 'active' AND current_step_index = ?5",
|
|
955
|
-
[nextIdx, nextAt, now, enr.id, stepIdx],
|
|
956
|
-
);
|
|
957
|
-
}
|
|
1054
|
+
} catch (_e) { /* drop-silent — the claim already owns the step; an audit-row collision cannot cause a double-send */ }
|
|
958
1055
|
|
|
959
1056
|
deliveries.push({
|
|
960
1057
|
enrollment_id: enr.id,
|
|
@@ -1274,6 +1371,69 @@ function create(opts) {
|
|
|
1274
1371
|
};
|
|
1275
1372
|
},
|
|
1276
1373
|
|
|
1374
|
+
// One bounded cron pass over the already-wired instance: scan the
|
|
1375
|
+
// order history for lapsed customers, enroll the eligible ones,
|
|
1376
|
+
// then dispatch every due step through the suppression/consent-
|
|
1377
|
+
// gated send path. Composes `scanForLapsedCustomers` +
|
|
1378
|
+
// `enrollCustomer` + `dispatchTick` so the operator's worker fires
|
|
1379
|
+
// a single call per tick rather than re-deriving the loop.
|
|
1380
|
+
//
|
|
1381
|
+
// Drop-silent per recipient: the dispatch loop already swallows a
|
|
1382
|
+
// single send / resolver / coupon failure so one bad address never
|
|
1383
|
+
// strands the batch; enroll failures are caught per-candidate here
|
|
1384
|
+
// (a UNIQUE-collision from a concurrent tick is a no-op, not a
|
|
1385
|
+
// batch-killer). The whole pass is idempotent — re-running it (or
|
|
1386
|
+
// an overlapping tick) cannot double-enroll a customer (UNIQUE
|
|
1387
|
+
// (customer_id, campaign_slug) + the existing-row return) nor
|
|
1388
|
+
// double-send a step (UNIQUE (enrollment_id, step_index) + the
|
|
1389
|
+
// conditional FSM advance).
|
|
1390
|
+
runTick: async function (runTickOpts) {
|
|
1391
|
+
runTickOpts = runTickOpts || {};
|
|
1392
|
+
var now = runTickOpts.now == null ? _now() : runTickOpts.now;
|
|
1393
|
+
_validateNonNegInt(now, "now");
|
|
1394
|
+
var batchSize = runTickOpts.batch_size == null ? 500 : runTickOpts.batch_size;
|
|
1395
|
+
_validatePositiveInt(batchSize, "batch_size");
|
|
1396
|
+
var resolveEmail = runTickOpts.resolveEmail || null;
|
|
1397
|
+
if (resolveEmail != null && typeof resolveEmail !== "function") {
|
|
1398
|
+
throw new TypeError(
|
|
1399
|
+
"winbackCampaigns.runTick: resolveEmail must be a function (enrollment) => Promise<string|null>"
|
|
1400
|
+
);
|
|
1401
|
+
}
|
|
1402
|
+
|
|
1403
|
+
var candidates = await this.scanForLapsedCustomers({
|
|
1404
|
+
as_of: now,
|
|
1405
|
+
max_batch: batchSize,
|
|
1406
|
+
});
|
|
1407
|
+
var enrolledN = 0;
|
|
1408
|
+
for (var i = 0; i < candidates.length; i += 1) {
|
|
1409
|
+
try {
|
|
1410
|
+
await this.enrollCustomer({
|
|
1411
|
+
campaign_slug: candidates[i].campaign_slug,
|
|
1412
|
+
customer_id: candidates[i].customer_id,
|
|
1413
|
+
now: now,
|
|
1414
|
+
});
|
|
1415
|
+
enrolledN += 1;
|
|
1416
|
+
} catch (_e) {
|
|
1417
|
+
// drop-silent — a concurrent tick that already enrolled this
|
|
1418
|
+
// (customer, campaign) loses the UNIQUE race; the row exists,
|
|
1419
|
+
// so this pass simply moves on. Any other per-candidate fault
|
|
1420
|
+
// (a vanished campaign mid-scan) likewise must not strand the
|
|
1421
|
+
// rest of the batch.
|
|
1422
|
+
}
|
|
1423
|
+
}
|
|
1424
|
+
var dispatch = await this.dispatchTick({
|
|
1425
|
+
now: now,
|
|
1426
|
+
batch_size: batchSize,
|
|
1427
|
+
resolveEmail: resolveEmail,
|
|
1428
|
+
});
|
|
1429
|
+
return {
|
|
1430
|
+
now: now,
|
|
1431
|
+
candidates: candidates.length,
|
|
1432
|
+
enrolled: enrolledN,
|
|
1433
|
+
dispatched: dispatch.dispatched,
|
|
1434
|
+
};
|
|
1435
|
+
},
|
|
1436
|
+
|
|
1277
1437
|
// Expose the optional deps so a wiring sanity check can assert
|
|
1278
1438
|
// they reached the factory.
|
|
1279
1439
|
_deps: {
|
package/package.json
CHANGED