@base44-preview/cli 0.0.33-pr.284.ebeee0d → 0.0.33-pr.286.ddceb19
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/index.js +174 -5
- package/dist/cli/index.js.map +9 -8
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -178557,9 +178557,10 @@ class ApiError extends SystemError {
|
|
|
178557
178557
|
} catch {
|
|
178558
178558
|
message = error48.message;
|
|
178559
178559
|
}
|
|
178560
|
+
const statusCode = ApiError.normalizeStatusCode(error48.response.status, responseBody);
|
|
178560
178561
|
const requestBody = error48.options.context?.__requestBody;
|
|
178561
178562
|
return new ApiError(`Error ${context}: ${message}`, {
|
|
178562
|
-
statusCode
|
|
178563
|
+
statusCode,
|
|
178563
178564
|
requestUrl: error48.request.url,
|
|
178564
178565
|
requestMethod: error48.request.method,
|
|
178565
178566
|
requestBody,
|
|
@@ -178616,6 +178617,12 @@ class ApiError extends SystemError {
|
|
|
178616
178617
|
return;
|
|
178617
178618
|
return REASON_HINTS[reason];
|
|
178618
178619
|
}
|
|
178620
|
+
static normalizeStatusCode(statusCode, responseBody) {
|
|
178621
|
+
if (responseBody?.error_type === "KeyError") {
|
|
178622
|
+
return 404;
|
|
178623
|
+
}
|
|
178624
|
+
return statusCode;
|
|
178625
|
+
}
|
|
178619
178626
|
}
|
|
178620
178627
|
|
|
178621
178628
|
class FileNotFoundError extends SystemError {
|
|
@@ -186012,6 +186019,13 @@ var DeployFunctionsResponseSchema = exports_external.object({
|
|
|
186012
186019
|
skipped: exports_external.array(exports_external.string()).optional().nullable(),
|
|
186013
186020
|
errors: exports_external.array(exports_external.object({ name: exports_external.string(), message: exports_external.string() })).nullable()
|
|
186014
186021
|
});
|
|
186022
|
+
var LogLevelSchema = exports_external.enum(["log", "info", "warn", "error", "debug"]);
|
|
186023
|
+
var FunctionLogEntrySchema = exports_external.object({
|
|
186024
|
+
time: exports_external.string(),
|
|
186025
|
+
level: LogLevelSchema,
|
|
186026
|
+
message: exports_external.string()
|
|
186027
|
+
});
|
|
186028
|
+
var FunctionLogsResponseSchema = exports_external.array(FunctionLogEntrySchema);
|
|
186015
186029
|
|
|
186016
186030
|
// src/core/resources/function/api.ts
|
|
186017
186031
|
function toDeployPayloadItem(fn) {
|
|
@@ -186042,6 +186056,42 @@ async function deployFunctions(functions) {
|
|
|
186042
186056
|
}
|
|
186043
186057
|
return result.data;
|
|
186044
186058
|
}
|
|
186059
|
+
function buildLogsQueryString(filters) {
|
|
186060
|
+
const params = new URLSearchParams;
|
|
186061
|
+
if (filters.since) {
|
|
186062
|
+
params.set("since", filters.since);
|
|
186063
|
+
}
|
|
186064
|
+
if (filters.until) {
|
|
186065
|
+
params.set("until", filters.until);
|
|
186066
|
+
}
|
|
186067
|
+
if (filters.level) {
|
|
186068
|
+
params.set("level", filters.level);
|
|
186069
|
+
}
|
|
186070
|
+
if (filters.limit !== undefined) {
|
|
186071
|
+
params.set("limit", String(filters.limit));
|
|
186072
|
+
}
|
|
186073
|
+
if (filters.order) {
|
|
186074
|
+
params.set("order", filters.order);
|
|
186075
|
+
}
|
|
186076
|
+
return params;
|
|
186077
|
+
}
|
|
186078
|
+
async function fetchFunctionLogs(functionName, filters = {}) {
|
|
186079
|
+
const appClient = getAppClient();
|
|
186080
|
+
const searchParams = buildLogsQueryString(filters);
|
|
186081
|
+
let response;
|
|
186082
|
+
try {
|
|
186083
|
+
response = await appClient.get(`functions-mgmt/${functionName}/logs`, {
|
|
186084
|
+
searchParams
|
|
186085
|
+
});
|
|
186086
|
+
} catch (error48) {
|
|
186087
|
+
throw await ApiError.fromHttpError(error48, `fetching function logs: '${functionName}'`);
|
|
186088
|
+
}
|
|
186089
|
+
const result = FunctionLogsResponseSchema.safeParse(await response.json());
|
|
186090
|
+
if (!result.success) {
|
|
186091
|
+
throw new SchemaValidationError("Invalid function logs response from server", result.error);
|
|
186092
|
+
}
|
|
186093
|
+
return result.data;
|
|
186094
|
+
}
|
|
186045
186095
|
// src/core/resources/function/config.ts
|
|
186046
186096
|
import { dirname as dirname4, join as join5 } from "node:path";
|
|
186047
186097
|
async function readFunctionConfig(configPath) {
|
|
@@ -194003,7 +194053,6 @@ async function printUpgradeNotificationIfAvailable() {
|
|
|
194003
194053
|
|
|
194004
194054
|
// src/cli/utils/runCommand.ts
|
|
194005
194055
|
async function runCommand(commandFn, options, context) {
|
|
194006
|
-
console.log();
|
|
194007
194056
|
if (options?.fullBanner) {
|
|
194008
194057
|
await printBanner(context.isNonInteractive);
|
|
194009
194058
|
We("");
|
|
@@ -194029,8 +194078,11 @@ async function runCommand(commandFn, options, context) {
|
|
|
194029
194078
|
const appConfig = await initAppConfig();
|
|
194030
194079
|
context.errorReporter.setContext({ appId: appConfig.id });
|
|
194031
194080
|
}
|
|
194032
|
-
const
|
|
194033
|
-
Le(outroMessage || "");
|
|
194081
|
+
const result = await commandFn();
|
|
194082
|
+
Le(result.outroMessage || "");
|
|
194083
|
+
if (result.stdout) {
|
|
194084
|
+
process.stdout.write(result.stdout);
|
|
194085
|
+
}
|
|
194034
194086
|
} catch (error48) {
|
|
194035
194087
|
const errorMessage = error48 instanceof Error ? error48.message : String(error48);
|
|
194036
194088
|
R2.error(errorMessage);
|
|
@@ -195451,6 +195503,122 @@ function getLinkCommand(context) {
|
|
|
195451
195503
|
});
|
|
195452
195504
|
}
|
|
195453
195505
|
|
|
195506
|
+
// src/cli/commands/project/logs.ts
|
|
195507
|
+
function parseFunctionFilters(options) {
|
|
195508
|
+
const filters = {};
|
|
195509
|
+
if (options.since) {
|
|
195510
|
+
filters.since = options.since;
|
|
195511
|
+
}
|
|
195512
|
+
if (options.until) {
|
|
195513
|
+
filters.until = options.until;
|
|
195514
|
+
}
|
|
195515
|
+
if (options.limit) {
|
|
195516
|
+
filters.limit = Number.parseInt(options.limit, 10);
|
|
195517
|
+
}
|
|
195518
|
+
if (options.order) {
|
|
195519
|
+
filters.order = options.order.toLowerCase();
|
|
195520
|
+
}
|
|
195521
|
+
return filters;
|
|
195522
|
+
}
|
|
195523
|
+
function parseFunctionNames(option) {
|
|
195524
|
+
if (!option)
|
|
195525
|
+
return [];
|
|
195526
|
+
return option.split(",").map((s) => s.trim()).filter((s) => s.length > 0);
|
|
195527
|
+
}
|
|
195528
|
+
function normalizeDatetime(value) {
|
|
195529
|
+
if (/Z$|[+-]\d{2}:\d{2}$/.test(value))
|
|
195530
|
+
return value;
|
|
195531
|
+
return `${value}Z`;
|
|
195532
|
+
}
|
|
195533
|
+
function formatEntry(entry) {
|
|
195534
|
+
const time3 = entry.time.substring(0, 19).replace("T", " ");
|
|
195535
|
+
const level = entry.level.toUpperCase().padEnd(5);
|
|
195536
|
+
const message = entry.message.trim();
|
|
195537
|
+
return `${time3} ${level} ${message}`;
|
|
195538
|
+
}
|
|
195539
|
+
function formatLogs(entries) {
|
|
195540
|
+
if (entries.length === 0) {
|
|
195541
|
+
return `No logs found matching the filters.
|
|
195542
|
+
`;
|
|
195543
|
+
}
|
|
195544
|
+
const header2 = `Showing ${entries.length} function log entries
|
|
195545
|
+
`;
|
|
195546
|
+
return [header2, ...entries.map(formatEntry)].join(`
|
|
195547
|
+
`);
|
|
195548
|
+
}
|
|
195549
|
+
function normalizeLogEntry(entry, functionName) {
|
|
195550
|
+
return {
|
|
195551
|
+
time: entry.time,
|
|
195552
|
+
level: entry.level,
|
|
195553
|
+
message: `[${functionName}] ${entry.message}`,
|
|
195554
|
+
source: functionName
|
|
195555
|
+
};
|
|
195556
|
+
}
|
|
195557
|
+
async function fetchLogsForFunctions(functionNames, options, availableFunctionNames) {
|
|
195558
|
+
const filters = parseFunctionFilters(options);
|
|
195559
|
+
const allEntries = [];
|
|
195560
|
+
for (const functionName of functionNames) {
|
|
195561
|
+
let logs;
|
|
195562
|
+
try {
|
|
195563
|
+
logs = await fetchFunctionLogs(functionName, filters);
|
|
195564
|
+
} catch (error48) {
|
|
195565
|
+
if (error48 instanceof ApiError && error48.statusCode === 404 && availableFunctionNames.length > 0) {
|
|
195566
|
+
const available = availableFunctionNames.join(", ");
|
|
195567
|
+
throw new InvalidInputError(`Function "${functionName}" was not found in this app`, {
|
|
195568
|
+
hints: [
|
|
195569
|
+
{
|
|
195570
|
+
message: `Available functions in this project: ${available}`
|
|
195571
|
+
},
|
|
195572
|
+
{
|
|
195573
|
+
message: "Make sure the function has been deployed before fetching logs",
|
|
195574
|
+
command: "base44 functions deploy"
|
|
195575
|
+
}
|
|
195576
|
+
]
|
|
195577
|
+
});
|
|
195578
|
+
}
|
|
195579
|
+
throw error48;
|
|
195580
|
+
}
|
|
195581
|
+
const entries = logs.map((entry) => normalizeLogEntry(entry, functionName));
|
|
195582
|
+
allEntries.push(...entries);
|
|
195583
|
+
}
|
|
195584
|
+
if (functionNames.length > 1) {
|
|
195585
|
+
const order = options.order?.toUpperCase() === "ASC" ? 1 : -1;
|
|
195586
|
+
allEntries.sort((a2, b) => order * a2.time.localeCompare(b.time));
|
|
195587
|
+
}
|
|
195588
|
+
return allEntries;
|
|
195589
|
+
}
|
|
195590
|
+
async function getAllFunctionNames() {
|
|
195591
|
+
const { functions } = await readProjectConfig();
|
|
195592
|
+
return functions.map((fn) => fn.name);
|
|
195593
|
+
}
|
|
195594
|
+
async function logsAction(options) {
|
|
195595
|
+
const specifiedFunctions = parseFunctionNames(options.function);
|
|
195596
|
+
const allProjectFunctions = await getAllFunctionNames();
|
|
195597
|
+
const functionNames = specifiedFunctions.length > 0 ? specifiedFunctions : allProjectFunctions;
|
|
195598
|
+
if (functionNames.length === 0) {
|
|
195599
|
+
return { outroMessage: "No functions found in this project." };
|
|
195600
|
+
}
|
|
195601
|
+
let entries = await fetchLogsForFunctions(functionNames, options, allProjectFunctions);
|
|
195602
|
+
const limit = options.limit ? Number.parseInt(options.limit, 10) : undefined;
|
|
195603
|
+
if (limit !== undefined && entries.length > limit) {
|
|
195604
|
+
entries = entries.slice(0, limit);
|
|
195605
|
+
}
|
|
195606
|
+
const logsOutput = options.json ? `${JSON.stringify(entries, null, 2)}
|
|
195607
|
+
` : formatLogs(entries);
|
|
195608
|
+
return { outroMessage: "Fetched logs", stdout: logsOutput };
|
|
195609
|
+
}
|
|
195610
|
+
function getLogsCommand(context) {
|
|
195611
|
+
return new Command("logs").description("Fetch function logs for this app").option("--function <names>", "Filter by function name(s), comma-separated. If omitted, fetches logs for all project functions").option("--since <datetime>", "Show logs from this time (ISO format)", normalizeDatetime).option("--until <datetime>", "Show logs until this time (ISO format)", normalizeDatetime).option("-n, --limit <n>", "Results per page (1-1000, default: 50)", (v) => {
|
|
195612
|
+
const n2 = Number.parseInt(v, 10);
|
|
195613
|
+
if (Number.isNaN(n2) || n2 < 1 || n2 > 1000) {
|
|
195614
|
+
throw new InvalidInputError(`Invalid limit: "${v}". Must be a number between 1 and 1000.`);
|
|
195615
|
+
}
|
|
195616
|
+
return v;
|
|
195617
|
+
}).addOption(new Option("--order <order>", "Sort order").choices(["asc", "desc"])).option("--json", "Output raw JSON").action(async (options) => {
|
|
195618
|
+
await runCommand(() => logsAction(options), { requireAuth: true }, context);
|
|
195619
|
+
});
|
|
195620
|
+
}
|
|
195621
|
+
|
|
195454
195622
|
// src/cli/commands/site/deploy.ts
|
|
195455
195623
|
import { resolve as resolve3 } from "node:path";
|
|
195456
195624
|
async function deployAction2(options) {
|
|
@@ -196172,6 +196340,7 @@ function createProgram(context) {
|
|
|
196172
196340
|
program2.addCommand(getSiteCommand(context));
|
|
196173
196341
|
program2.addCommand(getTypesCommand(context));
|
|
196174
196342
|
program2.addCommand(getDevCommand(context), { hidden: true });
|
|
196343
|
+
program2.addCommand(getLogsCommand(context), { hidden: true });
|
|
196175
196344
|
return program2;
|
|
196176
196345
|
}
|
|
196177
196346
|
|
|
@@ -200436,4 +200605,4 @@ export {
|
|
|
200436
200605
|
CLIExitError
|
|
200437
200606
|
};
|
|
200438
200607
|
|
|
200439
|
-
//# debugId=
|
|
200608
|
+
//# debugId=682DFFEB8217B90164756E2164756E21
|