@blotout/qinto-cli 0.1.30 → 0.1.31

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.
@@ -19607,6 +19607,7 @@ var endpointSchema = external_exports.object({
19607
19607
  var eventsSchema = external_exports.object({
19608
19608
  publishes: external_exports.array(external_exports.string().min(1).max(MAX_EVENT_TOPIC_LENGTH).regex(EVENT_TOPIC)).max(MAX_PUBLISHED_TOPICS).default([])
19609
19609
  }).strict();
19610
+ var dependenciesSchema = external_exports.array(external_exports.object({ app: external_exports.string().regex(APP_SLUG_PATTERN), description: renderableText(1, 200).optional() }).strict()).max(10);
19610
19611
  var rpcSchema = external_exports.object({
19611
19612
  exposes: external_exports.array(external_exports.object({ name: external_exports.string().regex(FUNCTION_NAME).max(64), visibility: external_exports.enum(["public", "private"]) }).strict()).max(32).optional(),
19612
19613
  calls: external_exports.array(external_exports.object({ app: external_exports.string().regex(APP_SLUG_PATTERN), fn: external_exports.string().regex(FUNCTION_NAME).max(64) }).strict()).max(64).optional()
@@ -19650,6 +19651,9 @@ var baseSchema = external_exports.object({
19650
19651
  description: "The app's browser surface: an optional entry for the bundle that ships inside the site's q.js, and the query params and cookies it declares for capture."
19651
19652
  }),
19652
19653
  resources: external_exports.array(resourceSchema).max(32).default([]).meta({ description: "The Cloudflare bindings the app worker is given." }),
19654
+ dependencies: dependenciesSchema.optional().meta({
19655
+ description: "The apps this app needs on the same site. Every app it calls over RPC must be listed."
19656
+ }),
19653
19657
  rpc: rpcSchema.optional().meta({ description: "The functions this app exposes to other apps, and the ones it calls on them." }),
19654
19658
  events: eventsSchema.optional().meta({
19655
19659
  description: "The push topics this app broadcasts to every app on the site. Requires the `sharedContext` data capability; a topic left out reaches only this app\u2019s own browser code."
@@ -19966,9 +19970,30 @@ var validateRpc = (manifest, ctx) => {
19966
19970
  ["rpc", "exposes"],
19967
19971
  "function"
19968
19972
  );
19973
+ const dependencies = new Set((manifest.dependencies ?? []).map((dependency) => dependency.app));
19969
19974
  for (const [index, call] of (manifest.rpc?.calls ?? []).entries()) {
19970
19975
  if (call.app === manifest.slug) {
19971
19976
  ctx.addIssue({ code: "custom", path: ["rpc", "calls", index, "app"], message: "An app cannot declare an RPC call to itself" });
19977
+ } else if (!dependencies.has(call.app)) {
19978
+ ctx.addIssue({
19979
+ code: "custom",
19980
+ path: ["rpc", "calls", index, "app"],
19981
+ message: `${call.app} is called over RPC, so it must be in dependencies. Add { "app": "${call.app}" } to dependencies; if your Qinto CLI rejects that field, upgrade it.`
19982
+ });
19983
+ }
19984
+ }
19985
+ };
19986
+ var validateDependencies = (manifest, ctx) => {
19987
+ const dependencies = manifest.dependencies ?? [];
19988
+ uniqueOrIssue(
19989
+ ctx,
19990
+ dependencies.map((dependency) => dependency.app),
19991
+ ["dependencies"],
19992
+ "dependency"
19993
+ );
19994
+ for (const [index, dependency] of dependencies.entries()) {
19995
+ if (dependency.app === manifest.slug) {
19996
+ ctx.addIssue({ code: "custom", path: ["dependencies", index, "app"], message: "An app cannot depend on itself" });
19972
19997
  }
19973
19998
  }
19974
19999
  };
@@ -20019,6 +20044,7 @@ var appManifestSchema = baseSchema.superRefine((manifest, ctx) => {
20019
20044
  validateEndpoints(manifest, ctx);
20020
20045
  validateCapture(manifest, ctx);
20021
20046
  validateBrowserHooks(manifest, ctx);
20047
+ validateDependencies(manifest, ctx);
20022
20048
  validateRpc(manifest, ctx);
20023
20049
  validateEvents(manifest, ctx);
20024
20050
  validateOauth(manifest, ctx);
@@ -20039,6 +20065,44 @@ var appRpcContractSchema = external_exports.record(external_exports.string().reg
20039
20065
  return new TextEncoder().encode(JSON.stringify(contract)).length <= MAX_RPC_CONTRACT_BYTES;
20040
20066
  }, "The RPC contract exceeds the size cap");
20041
20067
 
20068
+ // ../../../libs/app-envelope/src/geo.ts
20069
+ var cfString = external_exports.string().optional().catch(void 0);
20070
+ var requestGeoSchema = external_exports.object({
20071
+ country: cfString,
20072
+ city: cfString,
20073
+ region: cfString,
20074
+ regionCode: cfString,
20075
+ timezone: cfString,
20076
+ postalCode: cfString,
20077
+ continent: cfString,
20078
+ latitude: cfString,
20079
+ longitude: cfString,
20080
+ isEUCountry: cfString,
20081
+ botManagement: external_exports.object({
20082
+ ja4: cfString,
20083
+ ja3Hash: cfString,
20084
+ score: external_exports.number().optional().catch(void 0),
20085
+ verifiedBot: external_exports.boolean().optional().catch(void 0)
20086
+ }).optional().catch(void 0)
20087
+ });
20088
+ var userGeoSchema = external_exports.object({
20089
+ ip: external_exports.string().optional(),
20090
+ userAgent: external_exports.string().optional(),
20091
+ timezone: external_exports.string().optional(),
20092
+ city: external_exports.string().optional(),
20093
+ postalCode: external_exports.string().optional(),
20094
+ region: external_exports.string().optional(),
20095
+ regionCode: external_exports.string().optional(),
20096
+ country: external_exports.string().optional(),
20097
+ continent: external_exports.string().optional(),
20098
+ isEUCountry: external_exports.string().optional(),
20099
+ latitude: external_exports.string().optional(),
20100
+ longitude: external_exports.string().optional(),
20101
+ ja4: external_exports.string().optional(),
20102
+ ja3: external_exports.string().optional(),
20103
+ botScore: external_exports.string().optional()
20104
+ });
20105
+
20042
20106
  // ../../../libs/app-envelope/src/envelope.ts
20043
20107
  var ENVELOPE_VERSION = 3;
20044
20108
  var ENVELOPE_ERROR_CODES = ["invalid_arguments"];
@@ -20114,11 +20178,21 @@ var envelopeRequestSchema = external_exports.object({
20114
20178
  anonId: external_exports.string().min(1).max(64),
20115
20179
  globalId: external_exports.string().min(1).max(64).nullable(),
20116
20180
  createdAt: external_exports.number().int().optional(),
20117
- properties: external_exports.record(external_exports.string(), external_exports.unknown()),
20118
- geo: external_exports.record(external_exports.string(), external_exports.string()).optional()
20181
+ properties: external_exports.record(external_exports.string(), external_exports.string()),
20182
+ geo: userGeoSchema.optional()
20183
+ }).strict().optional(),
20184
+ consent: external_exports.object({
20185
+ enabled: external_exports.boolean(),
20186
+ categories: external_exports.object({
20187
+ necessary: external_exports.literal(true),
20188
+ functional: external_exports.boolean(),
20189
+ analytics: external_exports.boolean(),
20190
+ marketing: external_exports.boolean(),
20191
+ salesOfData: external_exports.boolean()
20192
+ }),
20193
+ apps: external_exports.record(external_exports.string(), external_exports.boolean())
20119
20194
  }).strict().optional(),
20120
- consent: external_exports.object({ enabled: external_exports.boolean(), categories: external_exports.record(external_exports.string(), external_exports.boolean()), apps: external_exports.record(external_exports.string(), external_exports.boolean()) }).strict().optional(),
20121
- geo: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
20195
+ geo: requestGeoSchema.optional(),
20122
20196
  // Connect envelopes only: the page the visitor's socket opened from, and the visit session it joined.
20123
20197
  page: pageSchema.optional(),
20124
20198
  session: sessionSchema.optional(),
@@ -20379,7 +20453,7 @@ var endpointContextSchema = external_exports.object({
20379
20453
  method: external_exports.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]),
20380
20454
  mode: external_exports.enum(["webhook", "api"]),
20381
20455
  version: external_exports.string().min(1).max(32),
20382
- geo: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
20456
+ geo: requestGeoSchema.optional(),
20383
20457
  installs: external_exports.array(installSchema3).min(1).max(15),
20384
20458
  user: external_exports.object({ anonId: external_exports.string().min(1).max(64) }).strict().optional()
20385
20459
  }).strict().refine((context) => {
@@ -22403,7 +22477,7 @@ var buildContext3 = ({
22403
22477
  geo,
22404
22478
  params,
22405
22479
  install: { id: install.id, label: install.label },
22406
- ...user === void 0 ? {} : { user: { anonId: user.anonId, globalId: null, properties: {} } },
22480
+ ...user === void 0 ? {} : { user: { anonId: user.anonId } },
22407
22481
  startWorkflow: buildStartWorkflow({
22408
22482
  ord: install.ord,
22409
22483
  installId: install.id,