@eide/foir-cli 0.50.0 → 0.51.0
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/dist/cli.js +245 -36
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
// src/cli.ts
|
|
4
4
|
import { config } from "dotenv";
|
|
5
|
-
import { resolve as
|
|
5
|
+
import { resolve as resolve8, dirname as dirname4 } from "path";
|
|
6
6
|
import { fileURLToPath } from "url";
|
|
7
7
|
import { createRequire } from "module";
|
|
8
8
|
import { Command } from "commander";
|
|
@@ -303,13 +303,13 @@ function withErrorHandler(optsFn, fn) {
|
|
|
303
303
|
// src/commands/login.ts
|
|
304
304
|
async function findAvailablePort(start, end) {
|
|
305
305
|
for (let port = start; port <= end; port++) {
|
|
306
|
-
const available = await new Promise((
|
|
306
|
+
const available = await new Promise((resolve9) => {
|
|
307
307
|
const server = http.createServer();
|
|
308
308
|
server.listen(port, () => {
|
|
309
309
|
server.close();
|
|
310
|
-
|
|
310
|
+
resolve9(true);
|
|
311
311
|
});
|
|
312
|
-
server.on("error", () =>
|
|
312
|
+
server.on("error", () => resolve9(false));
|
|
313
313
|
});
|
|
314
314
|
if (available) return port;
|
|
315
315
|
}
|
|
@@ -347,7 +347,7 @@ async function loginAction(globalOpts) {
|
|
|
347
347
|
const state = crypto.randomBytes(16).toString("hex");
|
|
348
348
|
const port = await findAvailablePort(9876, 9900);
|
|
349
349
|
const redirectUri = `http://localhost:${port}/callback`;
|
|
350
|
-
const authCode = await new Promise((
|
|
350
|
+
const authCode = await new Promise((resolve9, reject) => {
|
|
351
351
|
let timeoutId;
|
|
352
352
|
const server = http.createServer((req, res) => {
|
|
353
353
|
const url = new URL(req.url, `http://localhost:${port}`);
|
|
@@ -386,7 +386,7 @@ async function loginAction(globalOpts) {
|
|
|
386
386
|
);
|
|
387
387
|
server.closeAllConnections();
|
|
388
388
|
server.close();
|
|
389
|
-
|
|
389
|
+
resolve9(code);
|
|
390
390
|
}
|
|
391
391
|
});
|
|
392
392
|
server.listen(port);
|
|
@@ -802,11 +802,18 @@ var HooksService = /* @__PURE__ */ serviceDesc9(file_hooks_v1_hooks, 0);
|
|
|
802
802
|
// ../../packages/proto-ts/src/notifications/v1/notifications_pb.js
|
|
803
803
|
import { enumDesc as enumDesc9, fileDesc as fileDesc14, messageDesc as messageDesc14, serviceDesc as serviceDesc10, tsEnum as tsEnum9 } from "@bufbuild/protobuf/codegenv2";
|
|
804
804
|
import { file_google_protobuf_struct as file_google_protobuf_struct10, file_google_protobuf_timestamp as file_google_protobuf_timestamp11 } from "@bufbuild/protobuf/wkt";
|
|
805
|
-
var file_notifications_v1_notifications = /* @__PURE__ */ fileDesc14("CiRub3RpZmljYXRpb25zL3YxL25vdGlmaWNhdGlvbnMucHJvdG8SEG5vdGlmaWNhdGlvbnMudjEisAUKDE5vdGlmaWNhdGlvbhIKCgJpZBgBIAEoCRIPCgd1c2VyX2lkGAIgASgJEjAKBHR5cGUYAyABKA4yIi5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvblR5cGUSDQoFdGl0bGUYBCABKAkSFAoHbWVzc2FnZRgFIAEoCUgAiAEBEjIKDHJpY2hfY29udGVudBgGIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIAYgBARJCCgtzb3VyY2VfdHlwZRgKIAEoDjIoLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uU291cmNlVHlwZUgCiAEBEhYKCXNvdXJjZV9pZBgLIAEoCUgDiAEBEhcKCmFjdGlvbl91cmwYDCABKAlIBIgBARIuCghtZXRhZGF0YRgNIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIBYgBARIPCgdpc19yZWFkGBQgASgIEjAKB3JlYWRfYXQYFSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSAaIAQESEQoJdGVuYW50X2lkGB4gASgJEhcKCnByb2plY3RfaWQYHyABKAlIB4gBARIuCgpjcmVhdGVkX2F0GDIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIzCgpleHBpcmVzX2F0GDMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgIiAEBQgoKCF9tZXNzYWdlQg8KDV9yaWNoX2NvbnRlbnRCDgoMX3NvdXJjZV90eXBlQgwKCl9zb3VyY2VfaWRCDQoLX2FjdGlvbl91cmxCCwoJX21ldGFkYXRhQgoKCF9yZWFkX2F0Qg0KC19wcm9qZWN0X2lkQg0KC19leHBpcmVzX2F0IskBChhMaXN0Tm90aWZpY2F0aW9uc1JlcXVlc3QSKwoFd2hlcmUYASABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0SACIAQESEgoFYWZ0ZXIYAiABKAlIAYgBARITCgZiZWZvcmUYAyABKAlIAogBARISCgVmaXJzdBgEIAEoBUgDiAEBEhEKBGxhc3QYBSABKAVIBIgBAUIICgZfd2hlcmVCCAoGX2FmdGVyQgkKB19iZWZvcmVCCAoGX2ZpcnN0QgcKBV9sYXN0IsMBChlMaXN0Tm90aWZpY2F0aW9uc1Jlc3BvbnNlEjUKDW5vdGlmaWNhdGlvbnMYASADKAsyHi5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbhINCgV0b3RhbBgCIAEoBRIUCgx1bnJlYWRfY291bnQYAyABKAUSKwoJcGFnZV9pbmZvGAQgASgLMhMuY29tbW9uLnYxLlBhZ2VJbmZvSACIAQESDwoHY3Vyc29ycxgFIAMoCUIMCgpfcGFnZV9pbmZvIikKG01hcmtOb3RpZmljYXRpb25SZWFkUmVxdWVzdBIKCgJpZBgBIAEoCSIvChxNYXJrTm90aWZpY2F0aW9uUmVhZFJlc3BvbnNlEg8KB3N1Y2Nlc3MYASABKAgiYQofTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVxdWVzdBI1CgR0eXBlGAEgASgOMiIubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25UeXBlSACIAQFCBwoFX3R5cGUiMQogTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVzcG9uc2USDQoFY291bnQYASABKAUiJwoZRGVsZXRlTm90aWZpY2F0aW9uUmVxdWVzdBIKCgJpZBgBIAEoCSItChpEZWxldGVOb3RpZmljYXRpb25SZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIIhcKFUdldFVucmVhZENvdW50UmVxdWVzdCInChZHZXRVbnJlYWRDb3VudFJlc3BvbnNlEg0KBWNvdW50GAEgASgFIrABChdTZW5kQW5ub3VuY2VtZW50UmVxdWVzdBINCgV0aXRsZRgBIAEoCRIUCgdtZXNzYWdlGAIgASgJSACIAQESFwoKYWN0aW9uX3VybBgDIAEoCUgBiAEBEhgKC3RhcmdldF90eXBlGAQgASgJSAKIAQESEgoKdGFyZ2V0X2lkcxgFIAMoCUIKCghfbWVzc2FnZUINCgtfYWN0aW9uX3VybEIOCgxfdGFyZ2V0X3R5cGUiUAoYU2VuZEFubm91bmNlbWVudFJlc3BvbnNlEjQKDG5vdGlmaWNhdGlvbhgBIAEoCzIeLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uIpgBCh5MaXN0QW5ub3VuY2VtZW50SGlzdG9yeVJlcXVlc3QSEgoFYWZ0ZXIYASABKAlIAIgBARITCgZiZWZvcmUYAiABKAlIAYgBARISCgVmaXJzdBgDIAEoBUgCiAEBEhEKBGxhc3QYBCABKAVIA4gBAUIICgZfYWZ0ZXJCCQoHX2JlZm9yZUIICgZfZmlyc3RCBwoFX2xhc3QiswEKH0xpc3RBbm5vdW5jZW1lbnRIaXN0b3J5UmVzcG9uc2USNQoNYW5ub3VuY2VtZW50cxgBIAMoCzIeLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uEg0KBXRvdGFsGAIgASgFEisKCXBhZ2VfaW5mbxgDIAEoCzITLmNvbW1vbi52MS5QYWdlSW5mb0gAiAEBEg8KB2N1cnNvcnMYBCADKAlCDAoKX3BhZ2VfaW5mbyKXAwoUQ3VzdG9tZXJOb3RpZmljYXRpb24SCgoCaWQYASABKAkSEwoLY3VzdG9tZXJfaWQYAiABKAkSDQoFdGl0bGUYAyABKAkSFAoHbWVzc2FnZRgEIAEoCUgAiAEBEhUKCGNhdGVnb3J5GAUgASgJSAGIAQESFwoKYWN0aW9uX3VybBgGIAEoCUgCiAEBEi4KCG1ldGFkYXRhGAcgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgDiAEBEg8KB2lzX3JlYWQYCCABKAgSMAoHcmVhZF9hdBgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIBIgBARIRCgl0ZW5hbnRfaWQYFCABKAkSEgoKcHJvamVjdF9pZBgVIAEoCRIuCgpjcmVhdGVkX2F0GDIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIKCghfbWVzc2FnZUILCglfY2F0ZWdvcnlCDQoLX2FjdGlvbl91cmxCCwoJX21ldGFkYXRhQgoKCF9yZWFkX2F0ItEBCiBMaXN0Q3VzdG9tZXJOb3RpZmljYXRpb25zUmVxdWVzdBIrCgV3aGVyZRgBIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIAIgBARISCgVhZnRlchgCIAEoCUgBiAEBEhMKBmJlZm9yZRgDIAEoCUgCiAEBEhIKBWZpcnN0GAQgASgFSAOIAQESEQoEbGFzdBgFIAEoBUgEiAEBQggKBl93aGVyZUIICgZfYWZ0ZXJCCQoHX2JlZm9yZUIICgZfZmlyc3RCBwoFX2xhc3QivQEKIUxpc3RDdXN0b21lck5vdGlmaWNhdGlvbnNSZXNwb25zZRI9Cg1ub3RpZmljYXRpb25zGAEgAygLMiYubm90aWZpY2F0aW9ucy52MS5DdXN0b21lck5vdGlmaWNhdGlvbhINCgV0b3RhbBgCIAEoBRIrCglwYWdlX2luZm8YAyABKAsyEy5jb21tb24udjEuUGFnZUluZm9IAIgBARIPCgdjdXJzb3JzGAQgAygJQgwKCl9wYWdlX2luZm8i8AEKH1NlbmRDdXN0b21lck5vdGlmaWNhdGlvblJlcXVlc3QSEwoLY3VzdG9tZXJfaWQYASABKAkSDQoFdGl0bGUYAiABKAkSFAoHbWVzc2FnZRgDIAEoCUgAiAEBEhUKCGNhdGVnb3J5GAQgASgJSAGIAQESFwoKYWN0aW9uX3VybBgFIAEoCUgCiAEBEi4KCG1ldGFkYXRhGAYgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgDiAEBQgoKCF9tZXNzYWdlQgsKCV9jYXRlZ29yeUINCgtfYWN0aW9uX3VybEILCglfbWV0YWRhdGEiYAogU2VuZEN1c3RvbWVyTm90aWZpY2F0aW9uUmVzcG9uc2USPAoMbm90aWZpY2F0aW9uGAEgASgLMiYubm90aWZpY2F0aW9ucy52MS5DdXN0b21lck5vdGlmaWNhdGlvbiK4AQojU2VuZEJ1bGtDdXN0b21lck5vdGlmaWNhdGlvblJlcXVlc3QSFAoMY3VzdG9tZXJfaWRzGAEgAygJEg0KBXRpdGxlGAIgASgJEhQKB21lc3NhZ2UYAyABKAlIAIgBARIVCghjYXRlZ29yeRgEIAEoCUgBiAEBEhcKCmFjdGlvbl91cmwYBSABKAlIAogBAUIKCghfbWVzc2FnZUILCglfY2F0ZWdvcnlCDQoLX2FjdGlvbl91cmwiNQokU2VuZEJ1bGtDdXN0b21lck5vdGlmaWNhdGlvblJlc3BvbnNlEg0KBWNvdW50GAEgASgFIjEKI01hcmtDdXN0b21lck5vdGlmaWNhdGlvblJlYWRSZXF1ZXN0EgoKAmlkGAEgASgJIjcKJE1hcmtDdXN0b21lck5vdGlmaWNhdGlvblJlYWRSZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIIlMKJ01hcmtBbGxDdXN0b21lck5vdGlmaWNhdGlvbnNSZWFkUmVxdWVzdBIYCgtjdXN0b21lcl9pZBgBIAEoCUgAiAEBQg4KDF9jdXN0b21lcl9pZCI5CihNYXJrQWxsQ3VzdG9tZXJOb3RpZmljYXRpb25zUmVhZFJlc3BvbnNlEg0KBWNvdW50GAEgASgFItABCh9MaXN0UHJvamVjdE5vdGlmaWNhdGlvbnNSZXF1ZXN0EisKBXdoZXJlGAEgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgAiAEBEhIKBWFmdGVyGAIgASgJSAGIAQESEwoGYmVmb3JlGAMgASgJSAKIAQESEgoFZmlyc3QYBCABKAVIA4gBARIRCgRsYXN0GAUgASgFSASIAQFCCAoGX3doZXJlQggKBl9hZnRlckIJCgdfYmVmb3JlQggKBl9maXJzdEIHCgVfbGFzdCK8AQogTGlzdFByb2plY3ROb3RpZmljYXRpb25zUmVzcG9uc2USPQoNbm90aWZpY2F0aW9ucxgBIAMoCzImLm5vdGlmaWNhdGlvbnMudjEuQ3VzdG9tZXJOb3RpZmljYXRpb24SDQoFdG90YWwYAiABKAUSKwoJcGFnZV9pbmZvGAMgASgLMhMuY29tbW9uLnYxLlBhZ2VJbmZvSACIAQESDwoHY3Vyc29ycxgEIAMoCUIMCgpfcGFnZV9pbmZvIm8KFk5vdGlmaWNhdGlvblByZWZlcmVuY2USEAoIY2F0ZWdvcnkYASABKAkSFQoNZW1haWxfZW5hYmxlZBgCIAEoCBIUCgxwdXNoX2VuYWJsZWQYAyABKAgSFgoOaW5fYXBwX2VuYWJsZWQYBCABKAgiOAohR2V0Tm90aWZpY2F0aW9uUHJlZmVyZW5jZXNSZXF1ZXN0EhMKC2N1c3RvbWVyX2lkGAEgASgJImMKIkdldE5vdGlmaWNhdGlvblByZWZlcmVuY2VzUmVzcG9uc2USPQoLcHJlZmVyZW5jZXMYASADKAsyKC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvblByZWZlcmVuY2Ui1gEKI1VwZGF0ZU5vdGlmaWNhdGlvblByZWZlcmVuY2VSZXF1ZXN0EhMKC2N1c3RvbWVyX2lkGAEgASgJEhAKCGNhdGVnb3J5GAIgASgJEhoKDWVtYWlsX2VuYWJsZWQYAyABKAhIAIgBARIZCgxwdXNoX2VuYWJsZWQYBCABKAhIAYgBARIbCg5pbl9hcHBfZW5hYmxlZBgFIAEoCEgCiAEBQhAKDl9lbWFpbF9lbmFibGVkQg8KDV9wdXNoX2VuYWJsZWRCEQoPX2luX2FwcF9lbmFibGVkIjcKJFVwZGF0ZU5vdGlmaWNhdGlvblByZWZlcmVuY2VSZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIIlIKGlJlZ2lzdGVyRGV2aWNlVG9rZW5SZXF1ZXN0EhMKC2N1c3RvbWVyX2lkGAEgASgJEg0KBXRva2VuGAIgASgJEhAKCHBsYXRmb3JtGAMgASgJIi4KG1JlZ2lzdGVyRGV2aWNlVG9rZW5SZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIIi0KHFVucmVnaXN0ZXJEZXZpY2VUb2tlblJlcXVlc3QSDQoFdG9rZW4YASABKAkiMAodVW5yZWdpc3RlckRldmljZVRva2VuUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCCrIAgoQTm90aWZpY2F0aW9uVHlwZRIhCh1OT1RJRklDQVRJT05fVFlQRV9VTlNQRUNJRklFRBAAEiMKH05PVElGSUNBVElPTl9UWVBFX0pPQl9DT01QTEVURUQQARIgChxOT1RJRklDQVRJT05fVFlQRV9KT0JfRkFJTEVEEAISIgoeTk9USUZJQ0FUSU9OX1RZUEVfSk9CX1BST0dSRVNTEAMSHQoZTk9USUZJQ0FUSU9OX1RZUEVfTUVOVElPThAEEiAKHE5PVElGSUNBVElPTl9UWVBFX05PVEVfUkVQTFkQBRIjCh9OT1RJRklDQVRJT05fVFlQRV9OT1RFX1JFU09MVkVEEAYSHAoYTk9USUZJQ0FUSU9OX1RZUEVfU1lTVEVNEAcSIgoeTk9USUZJQ0FUSU9OX1RZUEVfQU5OT1VOQ0VNRU5UEAgq9QEKFk5vdGlmaWNhdGlvblNvdXJjZVR5cGUSKAokTk9USUZJQ0FUSU9OX1NPVVJDRV9UWVBFX1VOU1BFQ0lGSUVEEAASIwofTk9USUZJQ0FUSU9OX1NPVVJDRV9UWVBFX1JFQ09SRBABEiIKHk5PVElGSUNBVElPTl9TT1VSQ0VfVFlQRV9NT0RFTBACEiEKHU5PVElGSUNBVElPTl9TT1VSQ0VfVFlQRV9OT1RFEAMSIAocTk9USUZJQ0FUSU9OX1NPVVJDRV9UWVBFX0pPQhAEEiMKH05PVElGSUNBVElPTl9TT1VSQ0VfVFlQRV9TWVNURU0QBTKTEQoUTm90aWZpY2F0aW9uc1NlcnZpY2USbAoRTGlzdE5vdGlmaWNhdGlvbnMSKi5ub3RpZmljYXRpb25zLnYxLkxpc3ROb3RpZmljYXRpb25zUmVxdWVzdBorLm5vdGlmaWNhdGlvbnMudjEuTGlzdE5vdGlmaWNhdGlvbnNSZXNwb25zZRJjCg5HZXRVbnJlYWRDb3VudBInLm5vdGlmaWNhdGlvbnMudjEuR2V0VW5yZWFkQ291bnRSZXF1ZXN0Gigubm90aWZpY2F0aW9ucy52MS5HZXRVbnJlYWRDb3VudFJlc3BvbnNlEnUKFE1hcmtOb3RpZmljYXRpb25SZWFkEi0ubm90aWZpY2F0aW9ucy52MS5NYXJrTm90aWZpY2F0aW9uUmVhZFJlcXVlc3QaLi5ub3RpZmljYXRpb25zLnYxLk1hcmtOb3RpZmljYXRpb25SZWFkUmVzcG9uc2USgQEKGE1hcmtBbGxOb3RpZmljYXRpb25zUmVhZBIxLm5vdGlmaWNhdGlvbnMudjEuTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVxdWVzdBoyLm5vdGlmaWNhdGlvbnMudjEuTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVzcG9uc2USbwoSRGVsZXRlTm90aWZpY2F0aW9uEisubm90aWZpY2F0aW9ucy52MS5EZWxldGVOb3RpZmljYXRpb25SZXF1ZXN0Giwubm90aWZpY2F0aW9ucy52MS5EZWxldGVOb3RpZmljYXRpb25SZXNwb25zZRJpChBTZW5kQW5ub3VuY2VtZW50Eikubm90aWZpY2F0aW9ucy52MS5TZW5kQW5ub3VuY2VtZW50UmVxdWVzdBoqLm5vdGlmaWNhdGlvbnMudjEuU2VuZEFubm91bmNlbWVudFJlc3BvbnNlEn4KF0xpc3RBbm5vdW5jZW1lbnRIaXN0b3J5EjAubm90aWZpY2F0aW9ucy52MS5MaXN0QW5ub3VuY2VtZW50SGlzdG9yeVJlcXVlc3QaMS5ub3RpZmljYXRpb25zLnYxLkxpc3RBbm5vdW5jZW1lbnRIaXN0b3J5UmVzcG9uc2UShAEKGUxpc3RDdXN0b21lck5vdGlmaWNhdGlvbnMSMi5ub3RpZmljYXRpb25zLnYxLkxpc3RDdXN0b21lck5vdGlmaWNhdGlvbnNSZXF1ZXN0GjMubm90aWZpY2F0aW9ucy52MS5MaXN0Q3VzdG9tZXJOb3RpZmljYXRpb25zUmVzcG9uc2USgQEKGFNlbmRDdXN0b21lck5vdGlmaWNhdGlvbhIxLm5vdGlmaWNhdGlvbnMudjEuU2VuZEN1c3RvbWVyTm90aWZpY2F0aW9uUmVxdWVzdBoyLm5vdGlmaWNhdGlvbnMudjEuU2VuZEN1c3RvbWVyTm90aWZpY2F0aW9uUmVzcG9uc2USjQEKHFNlbmRCdWxrQ3VzdG9tZXJOb3RpZmljYXRpb24SNS5ub3RpZmljYXRpb25zLnYxLlNlbmRCdWxrQ3VzdG9tZXJOb3RpZmljYXRpb25SZXF1ZXN0GjYubm90aWZpY2F0aW9ucy52MS5TZW5kQnVsa0N1c3RvbWVyTm90aWZpY2F0aW9uUmVzcG9uc2USjQEKHE1hcmtDdXN0b21lck5vdGlmaWNhdGlvblJlYWQSNS5ub3RpZmljYXRpb25zLnYxLk1hcmtDdXN0b21lck5vdGlmaWNhdGlvblJlYWRSZXF1ZXN0GjYubm90aWZpY2F0aW9ucy52MS5NYXJrQ3VzdG9tZXJOb3RpZmljYXRpb25SZWFkUmVzcG9uc2USmQEKIE1hcmtBbGxDdXN0b21lck5vdGlmaWNhdGlvbnNSZWFkEjkubm90aWZpY2F0aW9ucy52MS5NYXJrQWxsQ3VzdG9tZXJOb3RpZmljYXRpb25zUmVhZFJlcXVlc3QaOi5ub3RpZmljYXRpb25zLnYxLk1hcmtBbGxDdXN0b21lck5vdGlmaWNhdGlvbnNSZWFkUmVzcG9uc2USgQEKGExpc3RQcm9qZWN0Tm90aWZpY2F0aW9ucxIxLm5vdGlmaWNhdGlvbnMudjEuTGlzdFByb2plY3ROb3RpZmljYXRpb25zUmVxdWVzdBoyLm5vdGlmaWNhdGlvbnMudjEuTGlzdFByb2plY3ROb3RpZmljYXRpb25zUmVzcG9uc2UShwEKGkdldE5vdGlmaWNhdGlvblByZWZlcmVuY2VzEjMubm90aWZpY2F0aW9ucy52MS5HZXROb3RpZmljYXRpb25QcmVmZXJlbmNlc1JlcXVlc3QaNC5ub3RpZmljYXRpb25zLnYxLkdldE5vdGlmaWNhdGlvblByZWZlcmVuY2VzUmVzcG9uc2USjQEKHFVwZGF0ZU5vdGlmaWNhdGlvblByZWZlcmVuY2USNS5ub3RpZmljYXRpb25zLnYxLlVwZGF0ZU5vdGlmaWNhdGlvblByZWZlcmVuY2VSZXF1ZXN0GjYubm90aWZpY2F0aW9ucy52MS5VcGRhdGVOb3RpZmljYXRpb25QcmVmZXJlbmNlUmVzcG9uc2UScgoTUmVnaXN0ZXJEZXZpY2VUb2tlbhIsLm5vdGlmaWNhdGlvbnMudjEuUmVnaXN0ZXJEZXZpY2VUb2tlblJlcXVlc3QaLS5ub3RpZmljYXRpb25zLnYxLlJlZ2lzdGVyRGV2aWNlVG9rZW5SZXNwb25zZRJ4ChVVbnJlZ2lzdGVyRGV2aWNlVG9rZW4SLi5ub3RpZmljYXRpb25zLnYxLlVucmVnaXN0ZXJEZXZpY2VUb2tlblJlcXVlc3QaLy5ub3RpZmljYXRpb25zLnYxLlVucmVnaXN0ZXJEZXZpY2VUb2tlblJlc3BvbnNlQkdaRWdpdGh1Yi5jb20vZWlkZXN0dWRpby9mb2lyL2dlbi9wcm90by9ub3RpZmljYXRpb25zL3YxO25vdGlmaWNhdGlvbnN2MWIGcHJvdG8z", [file_google_protobuf_struct10, file_google_protobuf_timestamp11, file_common_v1_pagination]);
|
|
805
|
+
var file_notifications_v1_notifications = /* @__PURE__ */ fileDesc14("CiRub3RpZmljYXRpb25zL3YxL25vdGlmaWNhdGlvbnMucHJvdG8SEG5vdGlmaWNhdGlvbnMudjEisAUKDE5vdGlmaWNhdGlvbhIKCgJpZBgBIAEoCRIPCgd1c2VyX2lkGAIgASgJEjAKBHR5cGUYAyABKA4yIi5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvblR5cGUSDQoFdGl0bGUYBCABKAkSFAoHbWVzc2FnZRgFIAEoCUgAiAEBEjIKDHJpY2hfY29udGVudBgGIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIAYgBARJCCgtzb3VyY2VfdHlwZRgKIAEoDjIoLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uU291cmNlVHlwZUgCiAEBEhYKCXNvdXJjZV9pZBgLIAEoCUgDiAEBEhcKCmFjdGlvbl91cmwYDCABKAlIBIgBARIuCghtZXRhZGF0YRgNIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIBYgBARIPCgdpc19yZWFkGBQgASgIEjAKB3JlYWRfYXQYFSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSAaIAQESEQoJdGVuYW50X2lkGB4gASgJEhcKCnByb2plY3RfaWQYHyABKAlIB4gBARIuCgpjcmVhdGVkX2F0GDIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIzCgpleHBpcmVzX2F0GDMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgIiAEBQgoKCF9tZXNzYWdlQg8KDV9yaWNoX2NvbnRlbnRCDgoMX3NvdXJjZV90eXBlQgwKCl9zb3VyY2VfaWRCDQoLX2FjdGlvbl91cmxCCwoJX21ldGFkYXRhQgoKCF9yZWFkX2F0Qg0KC19wcm9qZWN0X2lkQg0KC19leHBpcmVzX2F0IskBChhMaXN0Tm90aWZpY2F0aW9uc1JlcXVlc3QSKwoFd2hlcmUYASABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0SACIAQESEgoFYWZ0ZXIYAiABKAlIAYgBARITCgZiZWZvcmUYAyABKAlIAogBARISCgVmaXJzdBgEIAEoBUgDiAEBEhEKBGxhc3QYBSABKAVIBIgBAUIICgZfd2hlcmVCCAoGX2FmdGVyQgkKB19iZWZvcmVCCAoGX2ZpcnN0QgcKBV9sYXN0IsMBChlMaXN0Tm90aWZpY2F0aW9uc1Jlc3BvbnNlEjUKDW5vdGlmaWNhdGlvbnMYASADKAsyHi5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbhINCgV0b3RhbBgCIAEoBRIUCgx1bnJlYWRfY291bnQYAyABKAUSKwoJcGFnZV9pbmZvGAQgASgLMhMuY29tbW9uLnYxLlBhZ2VJbmZvSACIAQESDwoHY3Vyc29ycxgFIAMoCUIMCgpfcGFnZV9pbmZvIikKG01hcmtOb3RpZmljYXRpb25SZWFkUmVxdWVzdBIKCgJpZBgBIAEoCSIvChxNYXJrTm90aWZpY2F0aW9uUmVhZFJlc3BvbnNlEg8KB3N1Y2Nlc3MYASABKAgiYQofTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVxdWVzdBI1CgR0eXBlGAEgASgOMiIubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25UeXBlSACIAQFCBwoFX3R5cGUiMQogTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVzcG9uc2USDQoFY291bnQYASABKAUiJwoZRGVsZXRlTm90aWZpY2F0aW9uUmVxdWVzdBIKCgJpZBgBIAEoCSItChpEZWxldGVOb3RpZmljYXRpb25SZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIIhcKFUdldFVucmVhZENvdW50UmVxdWVzdCInChZHZXRVbnJlYWRDb3VudFJlc3BvbnNlEg0KBWNvdW50GAEgASgFIrABChdTZW5kQW5ub3VuY2VtZW50UmVxdWVzdBINCgV0aXRsZRgBIAEoCRIUCgdtZXNzYWdlGAIgASgJSACIAQESFwoKYWN0aW9uX3VybBgDIAEoCUgBiAEBEhgKC3RhcmdldF90eXBlGAQgASgJSAKIAQESEgoKdGFyZ2V0X2lkcxgFIAMoCUIKCghfbWVzc2FnZUINCgtfYWN0aW9uX3VybEIOCgxfdGFyZ2V0X3R5cGUiUAoYU2VuZEFubm91bmNlbWVudFJlc3BvbnNlEjQKDG5vdGlmaWNhdGlvbhgBIAEoCzIeLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uIpgBCh5MaXN0QW5ub3VuY2VtZW50SGlzdG9yeVJlcXVlc3QSEgoFYWZ0ZXIYASABKAlIAIgBARITCgZiZWZvcmUYAiABKAlIAYgBARISCgVmaXJzdBgDIAEoBUgCiAEBEhEKBGxhc3QYBCABKAVIA4gBAUIICgZfYWZ0ZXJCCQoHX2JlZm9yZUIICgZfZmlyc3RCBwoFX2xhc3QiswEKH0xpc3RBbm5vdW5jZW1lbnRIaXN0b3J5UmVzcG9uc2USNQoNYW5ub3VuY2VtZW50cxgBIAMoCzIeLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uEg0KBXRvdGFsGAIgASgFEisKCXBhZ2VfaW5mbxgDIAEoCzITLmNvbW1vbi52MS5QYWdlSW5mb0gAiAEBEg8KB2N1cnNvcnMYBCADKAlCDAoKX3BhZ2VfaW5mbyKXAwoUQ3VzdG9tZXJOb3RpZmljYXRpb24SCgoCaWQYASABKAkSEwoLY3VzdG9tZXJfaWQYAiABKAkSDQoFdGl0bGUYAyABKAkSFAoHbWVzc2FnZRgEIAEoCUgAiAEBEhUKCGNhdGVnb3J5GAUgASgJSAGIAQESFwoKYWN0aW9uX3VybBgGIAEoCUgCiAEBEi4KCG1ldGFkYXRhGAcgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgDiAEBEg8KB2lzX3JlYWQYCCABKAgSMAoHcmVhZF9hdBgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIBIgBARIRCgl0ZW5hbnRfaWQYFCABKAkSEgoKcHJvamVjdF9pZBgVIAEoCRIuCgpjcmVhdGVkX2F0GDIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIKCghfbWVzc2FnZUILCglfY2F0ZWdvcnlCDQoLX2FjdGlvbl91cmxCCwoJX21ldGFkYXRhQgoKCF9yZWFkX2F0ItEBCiBMaXN0Q3VzdG9tZXJOb3RpZmljYXRpb25zUmVxdWVzdBIrCgV3aGVyZRgBIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIAIgBARISCgVhZnRlchgCIAEoCUgBiAEBEhMKBmJlZm9yZRgDIAEoCUgCiAEBEhIKBWZpcnN0GAQgASgFSAOIAQESEQoEbGFzdBgFIAEoBUgEiAEBQggKBl93aGVyZUIICgZfYWZ0ZXJCCQoHX2JlZm9yZUIICgZfZmlyc3RCBwoFX2xhc3QivQEKIUxpc3RDdXN0b21lck5vdGlmaWNhdGlvbnNSZXNwb25zZRI9Cg1ub3RpZmljYXRpb25zGAEgAygLMiYubm90aWZpY2F0aW9ucy52MS5DdXN0b21lck5vdGlmaWNhdGlvbhINCgV0b3RhbBgCIAEoBRIrCglwYWdlX2luZm8YAyABKAsyEy5jb21tb24udjEuUGFnZUluZm9IAIgBARIPCgdjdXJzb3JzGAQgAygJQgwKCl9wYWdlX2luZm8izwQKH1NlbmRDdXN0b21lck5vdGlmaWNhdGlvblJlcXVlc3QSEwoLY3VzdG9tZXJfaWQYASABKAkSDQoFdGl0bGUYAiABKAkSFAoHbWVzc2FnZRgDIAEoCUgAiAEBEhUKCGNhdGVnb3J5GAQgASgJSAGIAQESFwoKYWN0aW9uX3VybBgFIAEoCUgCiAEBEi4KCG1ldGFkYXRhGAYgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgDiAEBEhYKCWRlZXBfbGluaxgKIAEoCUgEiAEBEhIKBWJhZGdlGAsgASgFSAWIAQESFgoJdGhyZWFkX2lkGAwgASgJSAaIAQESLwoJcHVzaF9kYXRhGA0gASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgHiAEBEhoKDWVtYWlsX3N1YmplY3QYFCABKAlICIgBARIXCgplbWFpbF9ib2R5GBUgASgJSAmIAQESGwoOZW1haWxfcmVwbHlfdG8YFiABKAlICogBARIuCgplbWFpbF9jdGFzGBcgAygLMhoubm90aWZpY2F0aW9ucy52MS5FbWFpbEN0YUIKCghfbWVzc2FnZUILCglfY2F0ZWdvcnlCDQoLX2FjdGlvbl91cmxCCwoJX21ldGFkYXRhQgwKCl9kZWVwX2xpbmtCCAoGX2JhZGdlQgwKCl90aHJlYWRfaWRCDAoKX3B1c2hfZGF0YUIQCg5fZW1haWxfc3ViamVjdEINCgtfZW1haWxfYm9keUIRCg9fZW1haWxfcmVwbHlfdG8iJgoIRW1haWxDdGESDQoFbGFiZWwYASABKAkSCwoDdXJsGAIgASgJImAKIFNlbmRDdXN0b21lck5vdGlmaWNhdGlvblJlc3BvbnNlEjwKDG5vdGlmaWNhdGlvbhgBIAEoCzImLm5vdGlmaWNhdGlvbnMudjEuQ3VzdG9tZXJOb3RpZmljYXRpb24iuAEKI1NlbmRCdWxrQ3VzdG9tZXJOb3RpZmljYXRpb25SZXF1ZXN0EhQKDGN1c3RvbWVyX2lkcxgBIAMoCRINCgV0aXRsZRgCIAEoCRIUCgdtZXNzYWdlGAMgASgJSACIAQESFQoIY2F0ZWdvcnkYBCABKAlIAYgBARIXCgphY3Rpb25fdXJsGAUgASgJSAKIAQFCCgoIX21lc3NhZ2VCCwoJX2NhdGVnb3J5Qg0KC19hY3Rpb25fdXJsIjUKJFNlbmRCdWxrQ3VzdG9tZXJOb3RpZmljYXRpb25SZXNwb25zZRINCgVjb3VudBgBIAEoBSIxCiNNYXJrQ3VzdG9tZXJOb3RpZmljYXRpb25SZWFkUmVxdWVzdBIKCgJpZBgBIAEoCSI3CiRNYXJrQ3VzdG9tZXJOb3RpZmljYXRpb25SZWFkUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCCJTCidNYXJrQWxsQ3VzdG9tZXJOb3RpZmljYXRpb25zUmVhZFJlcXVlc3QSGAoLY3VzdG9tZXJfaWQYASABKAlIAIgBAUIOCgxfY3VzdG9tZXJfaWQiOQooTWFya0FsbEN1c3RvbWVyTm90aWZpY2F0aW9uc1JlYWRSZXNwb25zZRINCgVjb3VudBgBIAEoBSLQAQofTGlzdFByb2plY3ROb3RpZmljYXRpb25zUmVxdWVzdBIrCgV3aGVyZRgBIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIAIgBARISCgVhZnRlchgCIAEoCUgBiAEBEhMKBmJlZm9yZRgDIAEoCUgCiAEBEhIKBWZpcnN0GAQgASgFSAOIAQESEQoEbGFzdBgFIAEoBUgEiAEBQggKBl93aGVyZUIICgZfYWZ0ZXJCCQoHX2JlZm9yZUIICgZfZmlyc3RCBwoFX2xhc3QivAEKIExpc3RQcm9qZWN0Tm90aWZpY2F0aW9uc1Jlc3BvbnNlEj0KDW5vdGlmaWNhdGlvbnMYASADKAsyJi5ub3RpZmljYXRpb25zLnYxLkN1c3RvbWVyTm90aWZpY2F0aW9uEg0KBXRvdGFsGAIgASgFEisKCXBhZ2VfaW5mbxgDIAEoCzITLmNvbW1vbi52MS5QYWdlSW5mb0gAiAEBEg8KB2N1cnNvcnMYBCADKAlCDAoKX3BhZ2VfaW5mbyJvChZOb3RpZmljYXRpb25QcmVmZXJlbmNlEhAKCGNhdGVnb3J5GAEgASgJEhUKDWVtYWlsX2VuYWJsZWQYAiABKAgSFAoMcHVzaF9lbmFibGVkGAMgASgIEhYKDmluX2FwcF9lbmFibGVkGAQgASgIIjgKIUdldE5vdGlmaWNhdGlvblByZWZlcmVuY2VzUmVxdWVzdBITCgtjdXN0b21lcl9pZBgBIAEoCSJjCiJHZXROb3RpZmljYXRpb25QcmVmZXJlbmNlc1Jlc3BvbnNlEj0KC3ByZWZlcmVuY2VzGAEgAygLMigubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25QcmVmZXJlbmNlItYBCiNVcGRhdGVOb3RpZmljYXRpb25QcmVmZXJlbmNlUmVxdWVzdBITCgtjdXN0b21lcl9pZBgBIAEoCRIQCghjYXRlZ29yeRgCIAEoCRIaCg1lbWFpbF9lbmFibGVkGAMgASgISACIAQESGQoMcHVzaF9lbmFibGVkGAQgASgISAGIAQESGwoOaW5fYXBwX2VuYWJsZWQYBSABKAhIAogBAUIQCg5fZW1haWxfZW5hYmxlZEIPCg1fcHVzaF9lbmFibGVkQhEKD19pbl9hcHBfZW5hYmxlZCI3CiRVcGRhdGVOb3RpZmljYXRpb25QcmVmZXJlbmNlUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCCJ8ChpSZWdpc3RlckRldmljZVRva2VuUmVxdWVzdBITCgtjdXN0b21lcl9pZBgBIAEoCRINCgV0b2tlbhgCIAEoCRIQCghwbGF0Zm9ybRgDIAEoCRIYCgtkZXZpY2VfbmFtZRgEIAEoCUgAiAEBQg4KDF9kZXZpY2VfbmFtZSIuChtSZWdpc3RlckRldmljZVRva2VuUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCCItChxVbnJlZ2lzdGVyRGV2aWNlVG9rZW5SZXF1ZXN0Eg0KBXRva2VuGAEgASgJIjAKHVVucmVnaXN0ZXJEZXZpY2VUb2tlblJlc3BvbnNlEg8KB3N1Y2Nlc3MYASABKAgiyAMKDlB1c2hDcmVkZW50aWFsEgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSEAoIcGxhdGZvcm0YAyABKAkSFgoJYnVuZGxlX2lkGAogASgJSACIAQESGQoMYXBuc190ZWFtX2lkGAsgASgJSAGIAQESGAoLYXBuc19rZXlfaWQYDCABKAlIAogBARIcCg9hcG5zX3Byb2R1Y3Rpb24YDSABKAhIA4gBARIbCg5mY21fcHJvamVjdF9pZBgUIAEoCUgEiAEBEh0KEGZjbV9jbGllbnRfZW1haWwYFSABKAlIBYgBARISCgpoYXNfc2VjcmV0GB4gASgIEi4KCmNyZWF0ZWRfYXQYMiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYMyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgwKCl9idW5kbGVfaWRCDwoNX2FwbnNfdGVhbV9pZEIOCgxfYXBuc19rZXlfaWRCEgoQX2FwbnNfcHJvZHVjdGlvbkIRCg9fZmNtX3Byb2plY3RfaWRCEwoRX2ZjbV9jbGllbnRfZW1haWwi3wIKG1VwbG9hZFB1c2hDcmVkZW50aWFsUmVxdWVzdBISCgpwcm9qZWN0X2lkGAEgASgJEhAKCHBsYXRmb3JtGAIgASgJEhgKC2FwbnNfcDhfa2V5GAogASgJSACIAQESFgoJYnVuZGxlX2lkGAsgASgJSAGIAQESGQoMYXBuc190ZWFtX2lkGAwgASgJSAKIAQESGAoLYXBuc19rZXlfaWQYDSABKAlIA4gBARIcCg9hcG5zX3Byb2R1Y3Rpb24YDiABKAhIBIgBARIlChhmY21fc2VydmljZV9hY2NvdW50X2pzb24YFCABKAlIBYgBAUIOCgxfYXBuc19wOF9rZXlCDAoKX2J1bmRsZV9pZEIPCg1fYXBuc190ZWFtX2lkQg4KDF9hcG5zX2tleV9pZEISChBfYXBuc19wcm9kdWN0aW9uQhsKGV9mY21fc2VydmljZV9hY2NvdW50X2pzb24iVAocVXBsb2FkUHVzaENyZWRlbnRpYWxSZXNwb25zZRI0CgpjcmVkZW50aWFsGAEgASgLMiAubm90aWZpY2F0aW9ucy52MS5QdXNoQ3JlZGVudGlhbCIwChpMaXN0UHVzaENyZWRlbnRpYWxzUmVxdWVzdBISCgpwcm9qZWN0X2lkGAEgASgJIlQKG0xpc3RQdXNoQ3JlZGVudGlhbHNSZXNwb25zZRI1CgtjcmVkZW50aWFscxgBIAMoCzIgLm5vdGlmaWNhdGlvbnMudjEuUHVzaENyZWRlbnRpYWwiKQobRGVsZXRlUHVzaENyZWRlbnRpYWxSZXF1ZXN0EgoKAmlkGAEgASgJIi8KHERlbGV0ZVB1c2hDcmVkZW50aWFsUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCCrIAgoQTm90aWZpY2F0aW9uVHlwZRIhCh1OT1RJRklDQVRJT05fVFlQRV9VTlNQRUNJRklFRBAAEiMKH05PVElGSUNBVElPTl9UWVBFX0pPQl9DT01QTEVURUQQARIgChxOT1RJRklDQVRJT05fVFlQRV9KT0JfRkFJTEVEEAISIgoeTk9USUZJQ0FUSU9OX1RZUEVfSk9CX1BST0dSRVNTEAMSHQoZTk9USUZJQ0FUSU9OX1RZUEVfTUVOVElPThAEEiAKHE5PVElGSUNBVElPTl9UWVBFX05PVEVfUkVQTFkQBRIjCh9OT1RJRklDQVRJT05fVFlQRV9OT1RFX1JFU09MVkVEEAYSHAoYTk9USUZJQ0FUSU9OX1RZUEVfU1lTVEVNEAcSIgoeTk9USUZJQ0FUSU9OX1RZUEVfQU5OT1VOQ0VNRU5UEAgq9QEKFk5vdGlmaWNhdGlvblNvdXJjZVR5cGUSKAokTk9USUZJQ0FUSU9OX1NPVVJDRV9UWVBFX1VOU1BFQ0lGSUVEEAASIwofTk9USUZJQ0FUSU9OX1NPVVJDRV9UWVBFX1JFQ09SRBABEiIKHk5PVElGSUNBVElPTl9TT1VSQ0VfVFlQRV9NT0RFTBACEiEKHU5PVElGSUNBVElPTl9TT1VSQ0VfVFlQRV9OT1RFEAMSIAocTk9USUZJQ0FUSU9OX1NPVVJDRV9UWVBFX0pPQhAEEiMKH05PVElGSUNBVElPTl9TT1VSQ0VfVFlQRV9TWVNURU0QBTL1EwoUTm90aWZpY2F0aW9uc1NlcnZpY2USbAoRTGlzdE5vdGlmaWNhdGlvbnMSKi5ub3RpZmljYXRpb25zLnYxLkxpc3ROb3RpZmljYXRpb25zUmVxdWVzdBorLm5vdGlmaWNhdGlvbnMudjEuTGlzdE5vdGlmaWNhdGlvbnNSZXNwb25zZRJjCg5HZXRVbnJlYWRDb3VudBInLm5vdGlmaWNhdGlvbnMudjEuR2V0VW5yZWFkQ291bnRSZXF1ZXN0Gigubm90aWZpY2F0aW9ucy52MS5HZXRVbnJlYWRDb3VudFJlc3BvbnNlEnUKFE1hcmtOb3RpZmljYXRpb25SZWFkEi0ubm90aWZpY2F0aW9ucy52MS5NYXJrTm90aWZpY2F0aW9uUmVhZFJlcXVlc3QaLi5ub3RpZmljYXRpb25zLnYxLk1hcmtOb3RpZmljYXRpb25SZWFkUmVzcG9uc2USgQEKGE1hcmtBbGxOb3RpZmljYXRpb25zUmVhZBIxLm5vdGlmaWNhdGlvbnMudjEuTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVxdWVzdBoyLm5vdGlmaWNhdGlvbnMudjEuTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVzcG9uc2USbwoSRGVsZXRlTm90aWZpY2F0aW9uEisubm90aWZpY2F0aW9ucy52MS5EZWxldGVOb3RpZmljYXRpb25SZXF1ZXN0Giwubm90aWZpY2F0aW9ucy52MS5EZWxldGVOb3RpZmljYXRpb25SZXNwb25zZRJpChBTZW5kQW5ub3VuY2VtZW50Eikubm90aWZpY2F0aW9ucy52MS5TZW5kQW5ub3VuY2VtZW50UmVxdWVzdBoqLm5vdGlmaWNhdGlvbnMudjEuU2VuZEFubm91bmNlbWVudFJlc3BvbnNlEn4KF0xpc3RBbm5vdW5jZW1lbnRIaXN0b3J5EjAubm90aWZpY2F0aW9ucy52MS5MaXN0QW5ub3VuY2VtZW50SGlzdG9yeVJlcXVlc3QaMS5ub3RpZmljYXRpb25zLnYxLkxpc3RBbm5vdW5jZW1lbnRIaXN0b3J5UmVzcG9uc2UShAEKGUxpc3RDdXN0b21lck5vdGlmaWNhdGlvbnMSMi5ub3RpZmljYXRpb25zLnYxLkxpc3RDdXN0b21lck5vdGlmaWNhdGlvbnNSZXF1ZXN0GjMubm90aWZpY2F0aW9ucy52MS5MaXN0Q3VzdG9tZXJOb3RpZmljYXRpb25zUmVzcG9uc2USgQEKGFNlbmRDdXN0b21lck5vdGlmaWNhdGlvbhIxLm5vdGlmaWNhdGlvbnMudjEuU2VuZEN1c3RvbWVyTm90aWZpY2F0aW9uUmVxdWVzdBoyLm5vdGlmaWNhdGlvbnMudjEuU2VuZEN1c3RvbWVyTm90aWZpY2F0aW9uUmVzcG9uc2USjQEKHFNlbmRCdWxrQ3VzdG9tZXJOb3RpZmljYXRpb24SNS5ub3RpZmljYXRpb25zLnYxLlNlbmRCdWxrQ3VzdG9tZXJOb3RpZmljYXRpb25SZXF1ZXN0GjYubm90aWZpY2F0aW9ucy52MS5TZW5kQnVsa0N1c3RvbWVyTm90aWZpY2F0aW9uUmVzcG9uc2USjQEKHE1hcmtDdXN0b21lck5vdGlmaWNhdGlvblJlYWQSNS5ub3RpZmljYXRpb25zLnYxLk1hcmtDdXN0b21lck5vdGlmaWNhdGlvblJlYWRSZXF1ZXN0GjYubm90aWZpY2F0aW9ucy52MS5NYXJrQ3VzdG9tZXJOb3RpZmljYXRpb25SZWFkUmVzcG9uc2USmQEKIE1hcmtBbGxDdXN0b21lck5vdGlmaWNhdGlvbnNSZWFkEjkubm90aWZpY2F0aW9ucy52MS5NYXJrQWxsQ3VzdG9tZXJOb3RpZmljYXRpb25zUmVhZFJlcXVlc3QaOi5ub3RpZmljYXRpb25zLnYxLk1hcmtBbGxDdXN0b21lck5vdGlmaWNhdGlvbnNSZWFkUmVzcG9uc2USgQEKGExpc3RQcm9qZWN0Tm90aWZpY2F0aW9ucxIxLm5vdGlmaWNhdGlvbnMudjEuTGlzdFByb2plY3ROb3RpZmljYXRpb25zUmVxdWVzdBoyLm5vdGlmaWNhdGlvbnMudjEuTGlzdFByb2plY3ROb3RpZmljYXRpb25zUmVzcG9uc2UShwEKGkdldE5vdGlmaWNhdGlvblByZWZlcmVuY2VzEjMubm90aWZpY2F0aW9ucy52MS5HZXROb3RpZmljYXRpb25QcmVmZXJlbmNlc1JlcXVlc3QaNC5ub3RpZmljYXRpb25zLnYxLkdldE5vdGlmaWNhdGlvblByZWZlcmVuY2VzUmVzcG9uc2USjQEKHFVwZGF0ZU5vdGlmaWNhdGlvblByZWZlcmVuY2USNS5ub3RpZmljYXRpb25zLnYxLlVwZGF0ZU5vdGlmaWNhdGlvblByZWZlcmVuY2VSZXF1ZXN0GjYubm90aWZpY2F0aW9ucy52MS5VcGRhdGVOb3RpZmljYXRpb25QcmVmZXJlbmNlUmVzcG9uc2UScgoTUmVnaXN0ZXJEZXZpY2VUb2tlbhIsLm5vdGlmaWNhdGlvbnMudjEuUmVnaXN0ZXJEZXZpY2VUb2tlblJlcXVlc3QaLS5ub3RpZmljYXRpb25zLnYxLlJlZ2lzdGVyRGV2aWNlVG9rZW5SZXNwb25zZRJ4ChVVbnJlZ2lzdGVyRGV2aWNlVG9rZW4SLi5ub3RpZmljYXRpb25zLnYxLlVucmVnaXN0ZXJEZXZpY2VUb2tlblJlcXVlc3QaLy5ub3RpZmljYXRpb25zLnYxLlVucmVnaXN0ZXJEZXZpY2VUb2tlblJlc3BvbnNlEnUKFFVwbG9hZFB1c2hDcmVkZW50aWFsEi0ubm90aWZpY2F0aW9ucy52MS5VcGxvYWRQdXNoQ3JlZGVudGlhbFJlcXVlc3QaLi5ub3RpZmljYXRpb25zLnYxLlVwbG9hZFB1c2hDcmVkZW50aWFsUmVzcG9uc2UScgoTTGlzdFB1c2hDcmVkZW50aWFscxIsLm5vdGlmaWNhdGlvbnMudjEuTGlzdFB1c2hDcmVkZW50aWFsc1JlcXVlc3QaLS5ub3RpZmljYXRpb25zLnYxLkxpc3RQdXNoQ3JlZGVudGlhbHNSZXNwb25zZRJ1ChREZWxldGVQdXNoQ3JlZGVudGlhbBItLm5vdGlmaWNhdGlvbnMudjEuRGVsZXRlUHVzaENyZWRlbnRpYWxSZXF1ZXN0Gi4ubm90aWZpY2F0aW9ucy52MS5EZWxldGVQdXNoQ3JlZGVudGlhbFJlc3BvbnNlQkdaRWdpdGh1Yi5jb20vZWlkZXN0dWRpby9mb2lyL2dlbi9wcm90by9ub3RpZmljYXRpb25zL3YxO25vdGlmaWNhdGlvbnN2MWIGcHJvdG8z", [file_google_protobuf_struct10, file_google_protobuf_timestamp11, file_common_v1_pagination]);
|
|
806
806
|
var NotificationSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 0);
|
|
807
807
|
var ListNotificationsRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 1);
|
|
808
808
|
var MarkNotificationReadRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 3);
|
|
809
809
|
var MarkAllNotificationsReadRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 5);
|
|
810
|
+
var SendCustomerNotificationRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 18);
|
|
811
|
+
var RegisterDeviceTokenRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 34);
|
|
812
|
+
var UnregisterDeviceTokenRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 36);
|
|
813
|
+
var PushCredentialSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 38);
|
|
814
|
+
var UploadPushCredentialRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 39);
|
|
815
|
+
var ListPushCredentialsRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 41);
|
|
816
|
+
var DeletePushCredentialRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 43);
|
|
810
817
|
var NotificationsService = /* @__PURE__ */ serviceDesc10(file_notifications_v1_notifications, 0);
|
|
811
818
|
|
|
812
819
|
// ../../packages/proto-ts/src/schedules/v1/schedules_pb.js
|
|
@@ -3241,6 +3248,73 @@ function createNotificationsMethods(client) {
|
|
|
3241
3248
|
create11(MarkAllNotificationsReadRequestSchema, {})
|
|
3242
3249
|
);
|
|
3243
3250
|
return resp.count;
|
|
3251
|
+
},
|
|
3252
|
+
// ── Push Credentials ────────────────────────────────────────
|
|
3253
|
+
async listPushCredentials(params) {
|
|
3254
|
+
return client.listPushCredentials(
|
|
3255
|
+
create11(ListPushCredentialsRequestSchema, {
|
|
3256
|
+
projectId: params.projectId
|
|
3257
|
+
})
|
|
3258
|
+
);
|
|
3259
|
+
},
|
|
3260
|
+
async uploadPushCredential(params) {
|
|
3261
|
+
const resp = await client.uploadPushCredential(
|
|
3262
|
+
create11(UploadPushCredentialRequestSchema, {
|
|
3263
|
+
projectId: params.projectId,
|
|
3264
|
+
platform: params.platform,
|
|
3265
|
+
apnsP8Key: params.apnsP8Key,
|
|
3266
|
+
bundleId: params.bundleId,
|
|
3267
|
+
apnsTeamId: params.apnsTeamId,
|
|
3268
|
+
apnsKeyId: params.apnsKeyId,
|
|
3269
|
+
apnsProduction: params.apnsProduction,
|
|
3270
|
+
fcmServiceAccountJson: params.fcmServiceAccountJson
|
|
3271
|
+
})
|
|
3272
|
+
);
|
|
3273
|
+
return resp.credential ?? null;
|
|
3274
|
+
},
|
|
3275
|
+
async deletePushCredential(params) {
|
|
3276
|
+
const resp = await client.deletePushCredential(
|
|
3277
|
+
create11(DeletePushCredentialRequestSchema, { id: params.id })
|
|
3278
|
+
);
|
|
3279
|
+
return resp.success;
|
|
3280
|
+
},
|
|
3281
|
+
// ── Device Tokens ────────────────────────────────────────────
|
|
3282
|
+
async registerDeviceToken(params) {
|
|
3283
|
+
const resp = await client.registerDeviceToken(
|
|
3284
|
+
create11(RegisterDeviceTokenRequestSchema, {
|
|
3285
|
+
customerId: params.customerId,
|
|
3286
|
+
token: params.token,
|
|
3287
|
+
platform: params.platform,
|
|
3288
|
+
deviceName: params.deviceName
|
|
3289
|
+
})
|
|
3290
|
+
);
|
|
3291
|
+
return resp.success;
|
|
3292
|
+
},
|
|
3293
|
+
async unregisterDeviceToken(token) {
|
|
3294
|
+
const resp = await client.unregisterDeviceToken(
|
|
3295
|
+
create11(UnregisterDeviceTokenRequestSchema, { token })
|
|
3296
|
+
);
|
|
3297
|
+
return resp.success;
|
|
3298
|
+
},
|
|
3299
|
+
// ── Customer Notifications ───────────────────────────────────
|
|
3300
|
+
async sendCustomerNotification(params) {
|
|
3301
|
+
const resp = await client.sendCustomerNotification(
|
|
3302
|
+
create11(SendCustomerNotificationRequestSchema, {
|
|
3303
|
+
customerId: params.customerId,
|
|
3304
|
+
title: params.title,
|
|
3305
|
+
message: params.message,
|
|
3306
|
+
category: params.category,
|
|
3307
|
+
actionUrl: params.actionUrl,
|
|
3308
|
+
deepLink: params.deepLink,
|
|
3309
|
+
badge: params.badge,
|
|
3310
|
+
threadId: params.threadId,
|
|
3311
|
+
emailSubject: params.emailSubject,
|
|
3312
|
+
emailBody: params.emailBody,
|
|
3313
|
+
emailReplyTo: params.emailReplyTo,
|
|
3314
|
+
emailCtas: params.emailCtas
|
|
3315
|
+
})
|
|
3316
|
+
);
|
|
3317
|
+
return resp.notification ?? null;
|
|
3244
3318
|
}
|
|
3245
3319
|
};
|
|
3246
3320
|
}
|
|
@@ -9486,6 +9560,140 @@ function registerNotificationsCommands(program2, globalOpts) {
|
|
|
9486
9560
|
);
|
|
9487
9561
|
}
|
|
9488
9562
|
|
|
9563
|
+
// src/commands/push-credentials.ts
|
|
9564
|
+
import { existsSync as existsSync7, readFileSync as readFileSync3 } from "fs";
|
|
9565
|
+
import { resolve as resolve7 } from "path";
|
|
9566
|
+
function registerPushCredentialsCommands(program2, globalOpts) {
|
|
9567
|
+
const cmd = program2.command("push-credentials").alias("push-creds").description("Manage per-project push credentials (APNs / FCM)");
|
|
9568
|
+
cmd.command("list").description("List push credentials for the current project").action(
|
|
9569
|
+
withErrorHandler(globalOpts, async () => {
|
|
9570
|
+
const opts = globalOpts();
|
|
9571
|
+
const resolved = await requireProject(opts);
|
|
9572
|
+
const client = await createPlatformClient(opts);
|
|
9573
|
+
const resp = await client.notifications.listPushCredentials({
|
|
9574
|
+
projectId: resolved.project.id
|
|
9575
|
+
});
|
|
9576
|
+
formatListProto(PushCredentialSchema, resp.credentials, opts, {
|
|
9577
|
+
columns: [
|
|
9578
|
+
{ key: "id", header: "ID", width: 28 },
|
|
9579
|
+
{ key: "platform", header: "Platform", width: 10 },
|
|
9580
|
+
{
|
|
9581
|
+
key: "bundleId",
|
|
9582
|
+
header: "Bundle ID",
|
|
9583
|
+
width: 28,
|
|
9584
|
+
format: (v) => v ? String(v) : ""
|
|
9585
|
+
},
|
|
9586
|
+
{
|
|
9587
|
+
key: "fcmProjectId",
|
|
9588
|
+
header: "FCM project",
|
|
9589
|
+
width: 22,
|
|
9590
|
+
format: (v) => v ? String(v) : ""
|
|
9591
|
+
},
|
|
9592
|
+
{
|
|
9593
|
+
key: "apnsProduction",
|
|
9594
|
+
header: "Env",
|
|
9595
|
+
width: 8,
|
|
9596
|
+
format: (v) => {
|
|
9597
|
+
if (v === true) return "prod";
|
|
9598
|
+
if (v === false) return "sandbox";
|
|
9599
|
+
return "";
|
|
9600
|
+
}
|
|
9601
|
+
},
|
|
9602
|
+
{
|
|
9603
|
+
key: "updatedAt",
|
|
9604
|
+
header: "Updated",
|
|
9605
|
+
width: 12,
|
|
9606
|
+
format: (v) => {
|
|
9607
|
+
if (!v) return "";
|
|
9608
|
+
const d = new Date(v);
|
|
9609
|
+
if (Number.isNaN(d.getTime())) return "";
|
|
9610
|
+
return d.toLocaleDateString();
|
|
9611
|
+
}
|
|
9612
|
+
}
|
|
9613
|
+
]
|
|
9614
|
+
});
|
|
9615
|
+
})
|
|
9616
|
+
);
|
|
9617
|
+
cmd.command("upload-ios").description("Upload an APNs (.p8) credential for iOS").requiredOption("--p8 <path>", "Path to the APNs .p8 private key").requiredOption("--bundle-id <id>", "iOS app bundle identifier").requiredOption("--team-id <id>", "Apple Developer Team ID (10 chars)").requiredOption("--key-id <id>", "APNs Key ID (10 chars)").option("--production", "Use the production APNs endpoint (default: sandbox)").action(
|
|
9618
|
+
withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
9619
|
+
const opts = globalOpts();
|
|
9620
|
+
const resolved = await requireProject(opts);
|
|
9621
|
+
const client = await createPlatformClient(opts);
|
|
9622
|
+
const p8Path = resolve7(String(cmdOpts.p8));
|
|
9623
|
+
if (!existsSync7(p8Path)) {
|
|
9624
|
+
throw new Error(`APNs .p8 file not found: ${p8Path}`);
|
|
9625
|
+
}
|
|
9626
|
+
const p8 = readFileSync3(p8Path, "utf-8");
|
|
9627
|
+
const cred = await client.notifications.uploadPushCredential({
|
|
9628
|
+
projectId: resolved.project.id,
|
|
9629
|
+
platform: "ios",
|
|
9630
|
+
apnsP8Key: p8,
|
|
9631
|
+
bundleId: String(cmdOpts.bundleId),
|
|
9632
|
+
apnsTeamId: String(cmdOpts.teamId),
|
|
9633
|
+
apnsKeyId: String(cmdOpts.keyId),
|
|
9634
|
+
apnsProduction: Boolean(cmdOpts.production)
|
|
9635
|
+
});
|
|
9636
|
+
if (cred) formatOutputProto(PushCredentialSchema, cred, opts);
|
|
9637
|
+
if (!(opts.json || opts.jsonl || opts.quiet)) {
|
|
9638
|
+
success(
|
|
9639
|
+
`Uploaded iOS push credential for ${cmdOpts.bundleId} (${cmdOpts.production ? "production" : "sandbox"})`
|
|
9640
|
+
);
|
|
9641
|
+
}
|
|
9642
|
+
})
|
|
9643
|
+
);
|
|
9644
|
+
cmd.command("upload-android").description("Upload an FCM service-account JSON for Android").requiredOption(
|
|
9645
|
+
"--service-account <path>",
|
|
9646
|
+
"Path to the Firebase service-account JSON"
|
|
9647
|
+
).action(
|
|
9648
|
+
withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
9649
|
+
const opts = globalOpts();
|
|
9650
|
+
const resolved = await requireProject(opts);
|
|
9651
|
+
const client = await createPlatformClient(opts);
|
|
9652
|
+
const jsonPath = resolve7(String(cmdOpts.serviceAccount));
|
|
9653
|
+
if (!existsSync7(jsonPath)) {
|
|
9654
|
+
throw new Error(`Service account JSON not found: ${jsonPath}`);
|
|
9655
|
+
}
|
|
9656
|
+
const json = readFileSync3(jsonPath, "utf-8");
|
|
9657
|
+
try {
|
|
9658
|
+
const parsed = JSON.parse(json);
|
|
9659
|
+
if (!parsed.project_id) {
|
|
9660
|
+
throw new Error("service-account JSON is missing project_id");
|
|
9661
|
+
}
|
|
9662
|
+
} catch (err) {
|
|
9663
|
+
throw new Error(`Invalid service account JSON: ${err.message}`);
|
|
9664
|
+
}
|
|
9665
|
+
const cred = await client.notifications.uploadPushCredential({
|
|
9666
|
+
projectId: resolved.project.id,
|
|
9667
|
+
platform: "android",
|
|
9668
|
+
fcmServiceAccountJson: json
|
|
9669
|
+
});
|
|
9670
|
+
if (cred) formatOutputProto(PushCredentialSchema, cred, opts);
|
|
9671
|
+
if (!(opts.json || opts.jsonl || opts.quiet)) {
|
|
9672
|
+
success("Uploaded Android push credential");
|
|
9673
|
+
}
|
|
9674
|
+
})
|
|
9675
|
+
);
|
|
9676
|
+
cmd.command("delete <id>").description("Delete a push credential by id").action(
|
|
9677
|
+
withErrorHandler(globalOpts, async (id) => {
|
|
9678
|
+
const opts = globalOpts();
|
|
9679
|
+
const client = await createPlatformClient(opts);
|
|
9680
|
+
await client.notifications.deletePushCredential({ id });
|
|
9681
|
+
if (!(opts.json || opts.jsonl || opts.quiet)) {
|
|
9682
|
+
success(`Deleted push credential ${id}`);
|
|
9683
|
+
}
|
|
9684
|
+
})
|
|
9685
|
+
);
|
|
9686
|
+
}
|
|
9687
|
+
async function requireProject(opts) {
|
|
9688
|
+
const resolved = await resolveProjectContext(opts);
|
|
9689
|
+
if (!resolved) {
|
|
9690
|
+
throw new Error(
|
|
9691
|
+
"No project selected. Run `foir select-project` or set FOIR_PROJECT."
|
|
9692
|
+
);
|
|
9693
|
+
}
|
|
9694
|
+
return resolved;
|
|
9695
|
+
}
|
|
9696
|
+
|
|
9489
9697
|
// src/commands/configs.ts
|
|
9490
9698
|
function registerConfigsCommands(program2, globalOpts) {
|
|
9491
9699
|
const configs = program2.command("configs").description("Manage configs (apps, webhooks)");
|
|
@@ -9561,7 +9769,7 @@ function registerConfigsCommands(program2, globalOpts) {
|
|
|
9561
9769
|
// src/commands/apps.ts
|
|
9562
9770
|
import chalk17 from "chalk";
|
|
9563
9771
|
import { spawn as spawn2 } from "child_process";
|
|
9564
|
-
import { existsSync as
|
|
9772
|
+
import { existsSync as existsSync8, watch as fsWatch } from "fs";
|
|
9565
9773
|
import { resolve as resolvePath } from "path";
|
|
9566
9774
|
|
|
9567
9775
|
// src/lib/tunnel.ts
|
|
@@ -9576,7 +9784,7 @@ async function startTunnel(opts) {
|
|
|
9576
9784
|
}
|
|
9577
9785
|
var CLOUDFLARED_URL_RE = /https:\/\/[a-z0-9-]+\.trycloudflare\.com/i;
|
|
9578
9786
|
function startCloudflared(host, port, logs) {
|
|
9579
|
-
return new Promise((
|
|
9787
|
+
return new Promise((resolve9, reject) => {
|
|
9580
9788
|
let child;
|
|
9581
9789
|
try {
|
|
9582
9790
|
child = spawn(
|
|
@@ -9610,7 +9818,7 @@ function startCloudflared(host, port, logs) {
|
|
|
9610
9818
|
resolved = true;
|
|
9611
9819
|
const url = match[0];
|
|
9612
9820
|
const exited = waitForExit(child);
|
|
9613
|
-
|
|
9821
|
+
resolve9({
|
|
9614
9822
|
url,
|
|
9615
9823
|
exited,
|
|
9616
9824
|
stop: () => stopChild(child)
|
|
@@ -9640,7 +9848,7 @@ ${buffered}`));
|
|
|
9640
9848
|
});
|
|
9641
9849
|
}
|
|
9642
9850
|
function startNgrok(port, logs) {
|
|
9643
|
-
return new Promise((
|
|
9851
|
+
return new Promise((resolve9, reject) => {
|
|
9644
9852
|
let child;
|
|
9645
9853
|
try {
|
|
9646
9854
|
child = spawn("ngrok", ["http", String(port), "--log=stdout"], {
|
|
@@ -9676,7 +9884,7 @@ function startNgrok(port, logs) {
|
|
|
9676
9884
|
const https = data.tunnels.find((t) => t.public_url.startsWith("https://"));
|
|
9677
9885
|
if (https) {
|
|
9678
9886
|
resolved = true;
|
|
9679
|
-
|
|
9887
|
+
resolve9({
|
|
9680
9888
|
url: https.public_url,
|
|
9681
9889
|
exited: waitForExit(child),
|
|
9682
9890
|
stop: () => stopChild(child)
|
|
@@ -9721,7 +9929,7 @@ function registerAppsCommands(program2, globalOpts) {
|
|
|
9721
9929
|
apps.command("list").description("List installed apps").action(
|
|
9722
9930
|
withErrorHandler(globalOpts, async () => {
|
|
9723
9931
|
const opts = globalOpts();
|
|
9724
|
-
const resolved = await
|
|
9932
|
+
const resolved = await requireProject2(opts);
|
|
9725
9933
|
const client = await createPlatformClient(opts);
|
|
9726
9934
|
const resp = await client.apps.listApps({
|
|
9727
9935
|
tenantId: resolved.project.tenantId,
|
|
@@ -9755,7 +9963,7 @@ function registerAppsCommands(program2, globalOpts) {
|
|
|
9755
9963
|
apps.command("get <name>").description("Get an installed app by name").action(
|
|
9756
9964
|
withErrorHandler(globalOpts, async (name) => {
|
|
9757
9965
|
const opts = globalOpts();
|
|
9758
|
-
const resolved = await
|
|
9966
|
+
const resolved = await requireProject2(opts);
|
|
9759
9967
|
const client = await createPlatformClient(opts);
|
|
9760
9968
|
const app = await client.apps.getApp(
|
|
9761
9969
|
resolved.project.tenantId,
|
|
@@ -9780,7 +9988,7 @@ function registerAppsCommands(program2, globalOpts) {
|
|
|
9780
9988
|
globalOpts,
|
|
9781
9989
|
async (manifestUrl, cmdOpts) => {
|
|
9782
9990
|
const opts = globalOpts();
|
|
9783
|
-
const resolved = await
|
|
9991
|
+
const resolved = await requireProject2(opts);
|
|
9784
9992
|
const client = await createPlatformClient(opts);
|
|
9785
9993
|
const installResp = await client.apps.installApp(
|
|
9786
9994
|
resolved.project.tenantId,
|
|
@@ -9839,7 +10047,7 @@ function registerAppsCommands(program2, globalOpts) {
|
|
|
9839
10047
|
globalOpts,
|
|
9840
10048
|
async (name, cmdOpts) => {
|
|
9841
10049
|
const opts = globalOpts();
|
|
9842
|
-
const resolved = await
|
|
10050
|
+
const resolved = await requireProject2(opts);
|
|
9843
10051
|
const client = await createPlatformClient(opts);
|
|
9844
10052
|
const updateResp = await client.apps.updateApp(
|
|
9845
10053
|
resolved.project.tenantId,
|
|
@@ -9887,7 +10095,7 @@ function registerAppsCommands(program2, globalOpts) {
|
|
|
9887
10095
|
globalOpts,
|
|
9888
10096
|
async (name, cmdOpts) => {
|
|
9889
10097
|
const opts = globalOpts();
|
|
9890
|
-
const resolved = await
|
|
10098
|
+
const resolved = await requireProject2(opts);
|
|
9891
10099
|
const client = await createPlatformClient(opts);
|
|
9892
10100
|
const resp = await client.apps.uninstallApp(
|
|
9893
10101
|
resolved.project.tenantId,
|
|
@@ -9909,7 +10117,7 @@ function registerAppsCommands(program2, globalOpts) {
|
|
|
9909
10117
|
globalOpts,
|
|
9910
10118
|
async (appName, operationKey, cmdOpts) => {
|
|
9911
10119
|
const opts = globalOpts();
|
|
9912
|
-
const resolved = await
|
|
10120
|
+
const resolved = await requireProject2(opts);
|
|
9913
10121
|
const client = await createPlatformClient(opts);
|
|
9914
10122
|
const stored = operationKey.includes("/") ? operationKey : `${appName}/${operationKey}`;
|
|
9915
10123
|
const input = cmdOpts.data ? JSON.parse(String(cmdOpts.data)) : void 0;
|
|
@@ -10074,7 +10282,7 @@ function hostOf(url) {
|
|
|
10074
10282
|
}
|
|
10075
10283
|
}
|
|
10076
10284
|
function runPush(host, jsonMode) {
|
|
10077
|
-
return new Promise((
|
|
10285
|
+
return new Promise((resolve9, reject) => {
|
|
10078
10286
|
if (!jsonMode) {
|
|
10079
10287
|
console.log();
|
|
10080
10288
|
console.log(chalk17.dim(`\u2192 foir push (${FOIR_APPS_HOST_ENV}=${host})`));
|
|
@@ -10090,14 +10298,14 @@ function runPush(host, jsonMode) {
|
|
|
10090
10298
|
});
|
|
10091
10299
|
child.once("error", (err) => reject(err));
|
|
10092
10300
|
child.once("exit", (code) => {
|
|
10093
|
-
if (code === 0)
|
|
10301
|
+
if (code === 0) resolve9();
|
|
10094
10302
|
else reject(new Error(`foir push exited with code ${code ?? "null"}`));
|
|
10095
10303
|
});
|
|
10096
10304
|
});
|
|
10097
10305
|
}
|
|
10098
10306
|
function startWatchLoop(host, jsonMode) {
|
|
10099
10307
|
const cwd = process.cwd();
|
|
10100
|
-
const target = WATCH_FILES.map((n) => resolvePath(cwd, n)).find((p) =>
|
|
10308
|
+
const target = WATCH_FILES.map((n) => resolvePath(cwd, n)).find((p) => existsSync8(p));
|
|
10101
10309
|
if (!target) {
|
|
10102
10310
|
if (!jsonMode) {
|
|
10103
10311
|
console.error(chalk17.yellow(`! --watch: no foir.config.* in ${cwd}; skipping watch loop.`));
|
|
@@ -10131,21 +10339,21 @@ function startWatchLoop(host, jsonMode) {
|
|
|
10131
10339
|
return watcher;
|
|
10132
10340
|
}
|
|
10133
10341
|
function runWatchLoop(host, jsonMode) {
|
|
10134
|
-
return new Promise((
|
|
10342
|
+
return new Promise((resolve9) => {
|
|
10135
10343
|
const watcher = startWatchLoop(host, jsonMode);
|
|
10136
10344
|
if (!watcher) {
|
|
10137
|
-
|
|
10345
|
+
resolve9();
|
|
10138
10346
|
return;
|
|
10139
10347
|
}
|
|
10140
10348
|
const close = () => {
|
|
10141
10349
|
watcher.close();
|
|
10142
|
-
|
|
10350
|
+
resolve9();
|
|
10143
10351
|
};
|
|
10144
10352
|
process.once("SIGINT", close);
|
|
10145
10353
|
process.once("SIGTERM", close);
|
|
10146
10354
|
});
|
|
10147
10355
|
}
|
|
10148
|
-
async function
|
|
10356
|
+
async function requireProject2(opts) {
|
|
10149
10357
|
const resolved = await resolveProjectContext(opts);
|
|
10150
10358
|
if (!resolved) {
|
|
10151
10359
|
throw new Error(
|
|
@@ -10176,7 +10384,7 @@ function classToLabel(n) {
|
|
|
10176
10384
|
}
|
|
10177
10385
|
|
|
10178
10386
|
// src/commands/secrets.ts
|
|
10179
|
-
import { existsSync as
|
|
10387
|
+
import { existsSync as existsSync9 } from "fs";
|
|
10180
10388
|
import { promises as fs5 } from "fs";
|
|
10181
10389
|
import { resolve as resolvePath2 } from "path";
|
|
10182
10390
|
function registerSecretsCommands(program2, globalOpts) {
|
|
@@ -10184,7 +10392,7 @@ function registerSecretsCommands(program2, globalOpts) {
|
|
|
10184
10392
|
secrets.command("put").description("Store a new secret and print its ref").option("--label <label>", "Optional human-readable label").option("--app <name>", "Owner: app name (defaults to project-owned)").option("--file <path>", "Read plaintext from file (binary-safe)").option("--value <plaintext>", "Plaintext value (string only; prefer --file for binary)").action(
|
|
10185
10393
|
withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
10186
10394
|
const opts = globalOpts();
|
|
10187
|
-
const resolved = await
|
|
10395
|
+
const resolved = await requireProject3(opts);
|
|
10188
10396
|
const plaintext = await readPlaintext(cmdOpts);
|
|
10189
10397
|
const client = await createPlatformClient(opts);
|
|
10190
10398
|
const ownerKind = cmdOpts.app ? OwnerKind.APP : OwnerKind.PROJECT;
|
|
@@ -10211,7 +10419,7 @@ function registerSecretsCommands(program2, globalOpts) {
|
|
|
10211
10419
|
secrets.command("list").description("List secrets metadata (no plaintext)").option("--app <name>", "List app-owned secrets for this app").option("--include-soft-deleted", "Include soft-deleted entries").action(
|
|
10212
10420
|
withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
10213
10421
|
const opts = globalOpts();
|
|
10214
|
-
const resolved = await
|
|
10422
|
+
const resolved = await requireProject3(opts);
|
|
10215
10423
|
const client = await createPlatformClient(opts);
|
|
10216
10424
|
const ownerKind = cmdOpts.app ? OwnerKind.APP : OwnerKind.PROJECT;
|
|
10217
10425
|
const resp = await client.secrets.list({
|
|
@@ -10302,7 +10510,7 @@ function registerSecretsCommands(program2, globalOpts) {
|
|
|
10302
10510
|
).option("--config <path>", "Path to foir.secrets.ts (default: auto-discover)").option("--plaintext <path>", "Path to local.foir.secrets.ts (default: auto-discover)").option("--rotate", "Rotate plaintext for secrets that already exist").option("--dry-run", "Show what would change without calling PutSecret/RotateSecret").action(
|
|
10303
10511
|
withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
10304
10512
|
const opts = globalOpts();
|
|
10305
|
-
const resolved = await
|
|
10513
|
+
const resolved = await requireProject3(opts);
|
|
10306
10514
|
const configPath = await resolveSecretsConfigPath(
|
|
10307
10515
|
typeof cmdOpts.config === "string" ? cmdOpts.config : void 0
|
|
10308
10516
|
);
|
|
@@ -10412,7 +10620,7 @@ function registerSecretsCommands(program2, globalOpts) {
|
|
|
10412
10620
|
console.log("Aborted.");
|
|
10413
10621
|
return;
|
|
10414
10622
|
}
|
|
10415
|
-
const resolved = await
|
|
10623
|
+
const resolved = await requireProject3(opts);
|
|
10416
10624
|
const client = await createPlatformClient(opts);
|
|
10417
10625
|
const count = await client.secrets.purge({
|
|
10418
10626
|
tenantId: resolved.project.tenantId,
|
|
@@ -10422,7 +10630,7 @@ function registerSecretsCommands(program2, globalOpts) {
|
|
|
10422
10630
|
})
|
|
10423
10631
|
);
|
|
10424
10632
|
}
|
|
10425
|
-
async function
|
|
10633
|
+
async function requireProject3(opts) {
|
|
10426
10634
|
const resolved = await resolveProjectContext(opts);
|
|
10427
10635
|
if (!resolved) {
|
|
10428
10636
|
throw new Error(
|
|
@@ -10477,14 +10685,14 @@ var PLAINTEXT_CONFIG_NAMES = [
|
|
|
10477
10685
|
];
|
|
10478
10686
|
async function resolveSecretsConfigPath(explicit) {
|
|
10479
10687
|
if (explicit) {
|
|
10480
|
-
if (!
|
|
10688
|
+
if (!existsSync9(explicit)) {
|
|
10481
10689
|
throw new Error(`Secrets config not found: ${explicit}`);
|
|
10482
10690
|
}
|
|
10483
10691
|
return resolvePath2(explicit);
|
|
10484
10692
|
}
|
|
10485
10693
|
for (const name of SECRETS_CONFIG_NAMES) {
|
|
10486
10694
|
const path3 = resolvePath2(process.cwd(), name);
|
|
10487
|
-
if (
|
|
10695
|
+
if (existsSync9(path3)) return path3;
|
|
10488
10696
|
}
|
|
10489
10697
|
throw new Error(
|
|
10490
10698
|
`No secrets config found. Looked for: ${SECRETS_CONFIG_NAMES.join(", ")}.`
|
|
@@ -10492,14 +10700,14 @@ async function resolveSecretsConfigPath(explicit) {
|
|
|
10492
10700
|
}
|
|
10493
10701
|
async function resolvePlaintextPath(explicit) {
|
|
10494
10702
|
if (explicit) {
|
|
10495
|
-
if (!
|
|
10703
|
+
if (!existsSync9(explicit)) {
|
|
10496
10704
|
throw new Error(`Plaintext file not found: ${explicit}`);
|
|
10497
10705
|
}
|
|
10498
10706
|
return resolvePath2(explicit);
|
|
10499
10707
|
}
|
|
10500
10708
|
for (const name of PLAINTEXT_CONFIG_NAMES) {
|
|
10501
10709
|
const path3 = resolvePath2(process.cwd(), name);
|
|
10502
|
-
if (
|
|
10710
|
+
if (existsSync9(path3)) return path3;
|
|
10503
10711
|
}
|
|
10504
10712
|
return null;
|
|
10505
10713
|
}
|
|
@@ -10582,7 +10790,7 @@ function formatPushPlan(plan, opts) {
|
|
|
10582
10790
|
// src/cli.ts
|
|
10583
10791
|
var __filename = fileURLToPath(import.meta.url);
|
|
10584
10792
|
var __dirname = dirname4(__filename);
|
|
10585
|
-
config({ path:
|
|
10793
|
+
config({ path: resolve8(__dirname, "../.env.local") });
|
|
10586
10794
|
var require2 = createRequire(import.meta.url);
|
|
10587
10795
|
var { version } = require2("../package.json");
|
|
10588
10796
|
var program = new Command();
|
|
@@ -10630,6 +10838,7 @@ registerVariantCatalogCommands(program, getGlobalOpts);
|
|
|
10630
10838
|
registerFilesCommands(program, getGlobalOpts);
|
|
10631
10839
|
registerNotesCommands(program, getGlobalOpts);
|
|
10632
10840
|
registerNotificationsCommands(program, getGlobalOpts);
|
|
10841
|
+
registerPushCredentialsCommands(program, getGlobalOpts);
|
|
10633
10842
|
registerConfigsCommands(program, getGlobalOpts);
|
|
10634
10843
|
registerAppsCommands(program, getGlobalOpts);
|
|
10635
10844
|
registerSecretsCommands(program, getGlobalOpts);
|