@blotout/qinto-cli 0.1.19 → 0.1.21
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 +11 -1
- package/dist/index.js +3780 -3710
- package/dist/index.js.map +1 -1
- package/dist/worker-artifact/README.md +1 -1
- package/dist/worker-artifact/app-runtime/index.js +50 -10
- package/dist/worker-artifact/main/index.js +292 -177
- package/dist/worker-artifact/version.json +6 -6
- package/package.json +3 -3
- package/templates/app/full/qinto.app.jsonc +0 -129
- package/templates/app/full/src/browser.ts +0 -15
- package/templates/app/full/src/server.ts +0 -133
- package/templates/app/full/ui/src/pages/index.astro +0 -53
- package/templates/app/minimal/qinto.app.jsonc +0 -20
- package/templates/app/minimal/src/server.ts +0 -9
- package/templates/project/gitignore +0 -3
- package/templates/project/package.json +0 -13
- package/templates/project/tsconfig.json +0 -12
- package/templates/ui/astro.config.mjs +0 -6
- package/templates/ui/package.json +0 -12
- package/templates/ui/src/pages/index.astro +0 -50
|
@@ -19528,10 +19528,13 @@ var variableSchema = external_exports.object({
|
|
|
19528
19528
|
label: external_exports.string().min(1).max(100),
|
|
19529
19529
|
required: external_exports.boolean().optional(),
|
|
19530
19530
|
browser: external_exports.boolean().optional(),
|
|
19531
|
+
owner: external_exports.enum(["site", "developer"]).optional(),
|
|
19531
19532
|
helpText: external_exports.string().min(1).max(MAX_VARIABLE_HELP_TEXT).optional(),
|
|
19532
19533
|
helpUrl: httpsUrl("helpUrl").optional()
|
|
19533
19534
|
}).strict().refine((variable) => !(variable.kind === "secret" && variable.browser === true), {
|
|
19534
19535
|
message: "A secret variable can never be browser-exposed"
|
|
19536
|
+
}).refine((variable) => !(variable.required === true && variable.owner === "developer"), {
|
|
19537
|
+
message: "A developer-owned variable cannot be required"
|
|
19535
19538
|
});
|
|
19536
19539
|
var appVariableSchema = external_exports.object({
|
|
19537
19540
|
name: external_exports.string().min(1).max(64).regex(VARIABLE_NAME),
|
|
@@ -19994,6 +19997,7 @@ var MAX_PUSHES_PER_INSTALL = 10;
|
|
|
19994
19997
|
var MAX_CAPTURE_WRITES_PER_INSTALL = 10;
|
|
19995
19998
|
var CONTEXT_LEVELS = ["private", "shared"];
|
|
19996
19999
|
var PUSH_BROADCASTS = ["install", "app", "site"];
|
|
20000
|
+
var ACTION_SOURCES = ["website", "api", "app", "scheduled", "webhook", "tool", "workflow"];
|
|
19997
20001
|
var MAX_PRIVATE_CONTEXT_ENTRY_BYTES = 32 * 1024;
|
|
19998
20002
|
var MAX_SHARED_CONTEXT_ENTRY_BYTES = 4 * 1024;
|
|
19999
20003
|
var MAX_PUSH_BYTES = 16 * 1024;
|
|
@@ -20022,9 +20026,10 @@ var effectGroupSchema = external_exports.object({
|
|
|
20022
20026
|
context: external_exports.array(contextWriteSchema).optional()
|
|
20023
20027
|
}).strict();
|
|
20024
20028
|
var captureValueSchema = external_exports.object({ value: external_exports.string().max(512), createdAt: external_exports.number().int(), updatedAt: external_exports.number().int(), type: external_exports.enum(CAPTURE_TYPES) }).strict();
|
|
20029
|
+
var pageSchema = external_exports.object({ url: external_exports.string().min(1).max(4096), referrer: external_exports.string().min(1).max(4096).optional() }).strict();
|
|
20025
20030
|
var actionContextFields = {
|
|
20026
20031
|
occurredAt: external_exports.number().int().nonnegative().safe(),
|
|
20027
|
-
page:
|
|
20032
|
+
page: pageSchema.optional(),
|
|
20028
20033
|
network: external_exports.object({
|
|
20029
20034
|
ip: external_exports.string().min(1).max(64).optional(),
|
|
20030
20035
|
userAgent: external_exports.string().min(1).max(512).optional(),
|
|
@@ -20052,6 +20057,8 @@ var envelopeRequestSchema = external_exports.object({
|
|
|
20052
20057
|
}).strict().optional(),
|
|
20053
20058
|
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(),
|
|
20054
20059
|
geo: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
|
|
20060
|
+
// Connect envelopes only: the page the visitor's socket opened from.
|
|
20061
|
+
page: pageSchema.optional(),
|
|
20055
20062
|
// Only what this app captured or wrote for this visitor; `updatedAt` is when the current value
|
|
20056
20063
|
// was first seen, which is the click time a CAPI `fbc` is built from.
|
|
20057
20064
|
captures: external_exports.record(external_exports.string().max(64), captureValueSchema).optional(),
|
|
@@ -20069,6 +20076,9 @@ var envelopeRequestSchema = external_exports.object({
|
|
|
20069
20076
|
userId: external_exports.string().min(1).max(64),
|
|
20070
20077
|
payload: external_exports.record(external_exports.string(), external_exports.unknown()),
|
|
20071
20078
|
receivedAt: external_exports.number().int(),
|
|
20079
|
+
// Optional on the wire: an app worker redeploys before its site worker, so this reader must
|
|
20080
|
+
// accept an envelope a site worker predating the field produces.
|
|
20081
|
+
source: external_exports.enum(ACTION_SOURCES).optional(),
|
|
20072
20082
|
context: actionContextSchema.optional(),
|
|
20073
20083
|
browser: external_exports.record(external_exports.string().min(1).max(64), external_exports.unknown()).optional(),
|
|
20074
20084
|
origin: external_exports.object({ app: external_exports.string().min(1).max(30), install: external_exports.number().int().min(1), depth: external_exports.number().int().min(0) }).strict().optional()
|
|
@@ -20951,6 +20961,18 @@ var brokerPush = async (env, input2) => {
|
|
|
20951
20961
|
data: input2.data
|
|
20952
20962
|
});
|
|
20953
20963
|
};
|
|
20964
|
+
var brokerTrack = async (env, input2) => {
|
|
20965
|
+
await askBroker(env, `apps.track ${input2.event.payload["event"]}`, {
|
|
20966
|
+
v: ENVELOPE_VERSION,
|
|
20967
|
+
kind: "track",
|
|
20968
|
+
slug: callerSlug(env),
|
|
20969
|
+
key: env.QINTO_INTERNAL_KEY,
|
|
20970
|
+
source: input2.source,
|
|
20971
|
+
userId: input2.userId,
|
|
20972
|
+
installId: input2.installId,
|
|
20973
|
+
event: input2.event
|
|
20974
|
+
});
|
|
20975
|
+
};
|
|
20954
20976
|
var brokerContextRead = async (env, userId) => {
|
|
20955
20977
|
const answer = await askBroker(env, "apps.context read", {
|
|
20956
20978
|
v: ENVELOPE_VERSION,
|
|
@@ -21065,6 +21087,18 @@ var buildAppsClient = (env, envelope) => {
|
|
|
21065
21087
|
};
|
|
21066
21088
|
};
|
|
21067
21089
|
|
|
21090
|
+
// src/emitted-event.ts
|
|
21091
|
+
var checkEmittedEvent = (event) => {
|
|
21092
|
+
if (event.type !== "track") {
|
|
21093
|
+
throw new Error("only track events may be emitted");
|
|
21094
|
+
}
|
|
21095
|
+
const occurredAt = event.occurredAt ?? Date.now();
|
|
21096
|
+
if (!Number.isSafeInteger(occurredAt) || occurredAt < 0) {
|
|
21097
|
+
throw new Error("an emitted event occurredAt must be non-negative Unix milliseconds");
|
|
21098
|
+
}
|
|
21099
|
+
return { ...event, occurredAt };
|
|
21100
|
+
};
|
|
21101
|
+
|
|
21068
21102
|
// src/oauth.ts
|
|
21069
21103
|
var EXPIRY_FLOOR_MS = 1e3;
|
|
21070
21104
|
var read = (env, id, ord, now) => {
|
|
@@ -21550,6 +21584,9 @@ var buildWorkflowContext = (env, stamp) => {
|
|
|
21550
21584
|
broadcast: message.broadcast
|
|
21551
21585
|
});
|
|
21552
21586
|
},
|
|
21587
|
+
track: async (userId, event) => {
|
|
21588
|
+
await brokerTrack(env, { source: "workflow", userId, installId: install.id, event: checkEmittedEvent(event) });
|
|
21589
|
+
},
|
|
21553
21590
|
apps
|
|
21554
21591
|
};
|
|
21555
21592
|
};
|
|
@@ -21623,15 +21660,9 @@ var buildContext = ({
|
|
|
21623
21660
|
// and the extra entry keeps it visibly over while bounding memory.
|
|
21624
21661
|
emit: (event) => {
|
|
21625
21662
|
requireSubject(subject, "emit");
|
|
21626
|
-
|
|
21627
|
-
throw new Error("only track events may be emitted");
|
|
21628
|
-
}
|
|
21629
|
-
const occurredAt = event.occurredAt ?? Date.now();
|
|
21630
|
-
if (!Number.isSafeInteger(occurredAt) || occurredAt < 0) {
|
|
21631
|
-
throw new Error("an emitted event occurredAt must be non-negative Unix milliseconds");
|
|
21632
|
-
}
|
|
21663
|
+
const checked = checkEmittedEvent(event);
|
|
21633
21664
|
if (emits.length <= MAX_EMITS_PER_INSTALL) {
|
|
21634
|
-
emits.push(
|
|
21665
|
+
emits.push(checked);
|
|
21635
21666
|
}
|
|
21636
21667
|
},
|
|
21637
21668
|
push: (message) => {
|
|
@@ -21802,6 +21833,9 @@ var dispatchSchedule = async (envelope, bundle, env) => {
|
|
|
21802
21833
|
broadcast: message.broadcast
|
|
21803
21834
|
});
|
|
21804
21835
|
},
|
|
21836
|
+
track: async (userId, event2) => {
|
|
21837
|
+
await brokerTrack(env, { source: "scheduled", userId, installId: install.id, event: checkEmittedEvent(event2) });
|
|
21838
|
+
},
|
|
21805
21839
|
context: (userId) => {
|
|
21806
21840
|
return asyncContext(env, () => {
|
|
21807
21841
|
return userId;
|
|
@@ -21919,6 +21953,9 @@ var buildContext2 = (envelope, env) => {
|
|
|
21919
21953
|
identity: buildIdentity(env),
|
|
21920
21954
|
apps: buildAppsClient(env, { depth: 0 }),
|
|
21921
21955
|
query: buildQuery({ env, ticket: envelope.tool.queryTicket, installId: install.id }),
|
|
21956
|
+
track: async (userId, event) => {
|
|
21957
|
+
await brokerTrack(env, { source: "tool", userId, installId: install.id, event: checkEmittedEvent(event) });
|
|
21958
|
+
},
|
|
21922
21959
|
fail: (message) => {
|
|
21923
21960
|
return { kind: "tool_error", message: truncate(message) };
|
|
21924
21961
|
}
|
|
@@ -22181,6 +22218,9 @@ var buildContext3 = ({
|
|
|
22181
22218
|
broadcast: message.broadcast
|
|
22182
22219
|
});
|
|
22183
22220
|
},
|
|
22221
|
+
track: async (userId, event) => {
|
|
22222
|
+
await brokerTrack(env, { source: "webhook", userId, installId: install.id, event: checkEmittedEvent(event) });
|
|
22223
|
+
},
|
|
22184
22224
|
context: (userId) => {
|
|
22185
22225
|
return asyncContext(env, () => {
|
|
22186
22226
|
return userId;
|
|
@@ -22852,7 +22892,7 @@ var dispatch = async (envelope, versions, env) => {
|
|
|
22852
22892
|
if (handler === void 0) {
|
|
22853
22893
|
return jsonError(200, "missing handler: onConnect");
|
|
22854
22894
|
}
|
|
22855
|
-
return runInstalls(envelope, env, (ctx) => handler(ctx));
|
|
22895
|
+
return runInstalls(envelope, env, (ctx) => handler({ ...ctx, ...envelope.page === void 0 ? {} : { page: envelope.page } }));
|
|
22856
22896
|
}
|
|
22857
22897
|
case "transform": {
|
|
22858
22898
|
return dispatchTransform(envelope, bundle, env);
|