@base44-preview/cli 0.0.44-pr.412.e87fc06 → 0.0.44-pr.419.4194a5c

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 CHANGED
@@ -53,10 +53,14 @@ The CLI will guide you through project setup. For step-by-step tutorials, see th
53
53
  | [`whoami`](https://docs.base44.com/developers/references/cli/commands/whoami) | Display the current authenticated user |
54
54
  | [`agents pull`](https://docs.base44.com/developers/references/cli/commands/agents-pull) | Pull agents from Base44 to local files |
55
55
  | [`agents push`](https://docs.base44.com/developers/references/cli/commands/agents-push) | Push local agents to Base44 |
56
+ | [`connectors list-available`](https://docs.base44.com/developers/references/cli/commands/connectors-list-available) | List all available integration types |
56
57
  | [`connectors pull`](https://docs.base44.com/developers/references/cli/commands/connectors-pull) | Pull connectors from Base44 to local files |
57
58
  | [`connectors push`](https://docs.base44.com/developers/references/cli/commands/connectors-push) | Push local connectors to Base44 |
58
59
  | [`entities push`](https://docs.base44.com/developers/references/cli/commands/entities-push) | Push local entities to Base44 |
59
- | [`functions deploy`](https://docs.base44.com/developers/references/cli/commands/functions-deploy) | Deploy local functions to Base44 |
60
+ | `functions delete` | Delete deployed functions |
61
+ | [`functions deploy`](https://docs.base44.com/developers/references/cli/commands/functions-deploy) | Deploy functions to Base44 |
62
+ | `functions list` | List all deployed functions |
63
+ | `functions pull` | Pull deployed functions from Base44 |
60
64
  | [`secrets list`](https://docs.base44.com/developers/references/cli/commands/secrets-list) | List project secret names |
61
65
  | [`secrets set`](https://docs.base44.com/developers/references/cli/commands/secrets-set) | Set one or more project secrets |
62
66
  | [`secrets delete`](https://docs.base44.com/developers/references/cli/commands/secrets-delete) | Delete a project secret |
package/dist/cli/index.js CHANGED
@@ -238100,7 +238100,7 @@ var FieldRLSSchema = exports_external.looseObject({
238100
238100
  delete: RLSRuleSchema.optional()
238101
238101
  });
238102
238102
  var PropertyDefinitionSchema = exports_external.looseObject({
238103
- type: exports_external.string().optional(),
238103
+ type: exports_external.string(),
238104
238104
  title: exports_external.string().optional(),
238105
238105
  description: exports_external.string().optional(),
238106
238106
  minLength: exports_external.number().int().min(0).optional(),
@@ -247967,7 +247967,7 @@ async function pullFunctionsAction(name2) {
247967
247967
  };
247968
247968
  }
247969
247969
  function getPullCommand(context) {
247970
- return new Command("pull").description("Pull deployed functions from Base44").argument("[name]", "Pull a single function by name").action(async (name2) => {
247970
+ return new Command("pull").description("Pull deployed functions from Base44").argument("[name]", "Function name to pull (pulls all if omitted)").action(async (name2) => {
247971
247971
  await runCommand(() => pullFunctionsAction(name2), { requireAuth: true }, context);
247972
247972
  });
247973
247973
  }
@@ -249174,14 +249174,163 @@ function createFunctionRouter(manager, logger) {
249174
249174
  return router;
249175
249175
  }
249176
249176
 
249177
- // src/cli/dev/dev-server/database.ts
249177
+ // src/cli/dev/dev-server/db/database.ts
249178
249178
  var import_nedb = __toESM(require_nedb(), 1);
249179
249179
 
249180
+ // src/cli/dev/dev-server/db/validator.ts
249181
+ var fieldTypes = [
249182
+ "string",
249183
+ "integer",
249184
+ "number",
249185
+ "boolean",
249186
+ "array",
249187
+ "object"
249188
+ ];
249189
+
249190
+ class Validator {
249191
+ filterFields(record2, entitySchema) {
249192
+ const filteredRecord = {};
249193
+ for (const [key2, value] of Object.entries(record2)) {
249194
+ if (entitySchema.properties[key2]) {
249195
+ filteredRecord[key2] = value;
249196
+ }
249197
+ }
249198
+ return filteredRecord;
249199
+ }
249200
+ applyDefaults(record2, entitySchema) {
249201
+ const result = {};
249202
+ for (const [key2, property] of Object.entries(entitySchema.properties)) {
249203
+ if (property.default !== undefined) {
249204
+ result[key2] = property.default;
249205
+ }
249206
+ }
249207
+ return {
249208
+ ...result,
249209
+ ...record2
249210
+ };
249211
+ }
249212
+ validate(record2, entitySchema, partial2 = false) {
249213
+ if (!partial2) {
249214
+ const requiredFieldsResponse = this.validateRequiredFields(record2, entitySchema);
249215
+ if (requiredFieldsResponse.hasError) {
249216
+ return requiredFieldsResponse;
249217
+ }
249218
+ }
249219
+ const fieldTypesResponse = this.validateFieldTypes(record2, entitySchema);
249220
+ if (fieldTypesResponse.hasError) {
249221
+ return fieldTypesResponse;
249222
+ }
249223
+ return {
249224
+ hasError: false
249225
+ };
249226
+ }
249227
+ createValidationError(message) {
249228
+ return {
249229
+ error_type: "ValidationError",
249230
+ message,
249231
+ request_id: null,
249232
+ traceback: ""
249233
+ };
249234
+ }
249235
+ validateFieldTypes(record2, entitySchema) {
249236
+ for (const [key2, value] of Object.entries(record2)) {
249237
+ const property = entitySchema.properties[key2];
249238
+ const result = this.validateValue(value, property, key2);
249239
+ if (result.hasError)
249240
+ return result;
249241
+ }
249242
+ return {
249243
+ hasError: false
249244
+ };
249245
+ }
249246
+ validateValue(value, property, fieldPath) {
249247
+ if (!property) {
249248
+ return { hasError: false };
249249
+ }
249250
+ const propertyType = property.type;
249251
+ if (!fieldTypes.includes(propertyType)) {
249252
+ return {
249253
+ hasError: true,
249254
+ error: this.createValidationError(`Error in field ${fieldPath}: Unsupported field type ${propertyType}`)
249255
+ };
249256
+ }
249257
+ switch (propertyType) {
249258
+ case "array":
249259
+ if (!Array.isArray(value)) {
249260
+ return {
249261
+ hasError: true,
249262
+ error: this.createValidationError(`Error in field ${fieldPath}: Input should be a valid array`)
249263
+ };
249264
+ }
249265
+ if (property.items) {
249266
+ for (let i5 = 0;i5 < value.length; i5++) {
249267
+ const itemResult = this.validateValue(value[i5], property.items, `${fieldPath}[${i5}]`);
249268
+ if (itemResult.hasError)
249269
+ return itemResult;
249270
+ }
249271
+ }
249272
+ break;
249273
+ case "object":
249274
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
249275
+ return {
249276
+ hasError: true,
249277
+ error: this.createValidationError(`Error in field ${fieldPath}: Input should be a valid object`)
249278
+ };
249279
+ }
249280
+ if (property.properties) {
249281
+ for (const [subKey, subValue] of Object.entries(value)) {
249282
+ if (property.properties[subKey]) {
249283
+ const subResult = this.validateValue(subValue, property.properties[subKey], `${fieldPath}.${subKey}`);
249284
+ if (subResult.hasError)
249285
+ return subResult;
249286
+ }
249287
+ }
249288
+ }
249289
+ break;
249290
+ case "integer":
249291
+ if (!Number.isInteger(value)) {
249292
+ return {
249293
+ hasError: true,
249294
+ error: this.createValidationError(`Error in field ${fieldPath}: Input should be a valid integer`)
249295
+ };
249296
+ }
249297
+ break;
249298
+ default:
249299
+ if (typeof value !== propertyType) {
249300
+ return {
249301
+ hasError: true,
249302
+ error: this.createValidationError(`Error in field ${fieldPath}: Input should be a valid ${propertyType}`)
249303
+ };
249304
+ }
249305
+ }
249306
+ return { hasError: false };
249307
+ }
249308
+ validateRequiredFields(record2, entitySchema) {
249309
+ if (entitySchema.required && entitySchema.required.length > 0) {
249310
+ for (const required2 of entitySchema.required) {
249311
+ if (record2[required2] == null) {
249312
+ return {
249313
+ hasError: true,
249314
+ error: this.createValidationError(`Error in field ${required2}: Field required`)
249315
+ };
249316
+ }
249317
+ }
249318
+ }
249319
+ return {
249320
+ hasError: false
249321
+ };
249322
+ }
249323
+ }
249324
+
249325
+ // src/cli/dev/dev-server/db/database.ts
249180
249326
  class Database {
249181
249327
  collections = new Map;
249328
+ schemas = new Map;
249329
+ validator = new Validator;
249182
249330
  load(entities) {
249183
249331
  for (const entity2 of entities) {
249184
249332
  this.collections.set(entity2.name, new import_nedb.default);
249333
+ this.schemas.set(entity2.name, entity2);
249185
249334
  }
249186
249335
  }
249187
249336
  getCollection(name2) {
@@ -249195,6 +249344,25 @@ class Database {
249195
249344
  collection.remove({}, { multi: true });
249196
249345
  }
249197
249346
  this.collections.clear();
249347
+ this.schemas.clear();
249348
+ }
249349
+ validate(entityName, record2, partial2 = false) {
249350
+ const schema9 = this.schemas.get(entityName);
249351
+ if (!schema9) {
249352
+ throw new Error(`Entity "${entityName}" not found`);
249353
+ }
249354
+ return this.validator.validate(record2, schema9, partial2);
249355
+ }
249356
+ prepareRecord(entityName, record2, partial2 = false) {
249357
+ const schema9 = this.schemas.get(entityName);
249358
+ if (!schema9) {
249359
+ throw new Error(`Entity "${entityName}" not found`);
249360
+ }
249361
+ const filteredRecord = this.validator.filterFields(record2, schema9);
249362
+ if (partial2) {
249363
+ return filteredRecord;
249364
+ }
249365
+ return this.validator.applyDefaults(filteredRecord, schema9);
249198
249366
  }
249199
249367
  }
249200
249368
 
@@ -249386,8 +249554,14 @@ function createEntityRoutes(db2, logger, remoteProxy, broadcast) {
249386
249554
  try {
249387
249555
  const now = new Date().toISOString();
249388
249556
  const { _id, ...body } = req.body;
249557
+ const filteredBody = db2.prepareRecord(entityName, body);
249558
+ const validation = db2.validate(entityName, filteredBody);
249559
+ if (validation.hasError) {
249560
+ res.status(422).json(validation.error);
249561
+ return;
249562
+ }
249389
249563
  const record2 = {
249390
- ...body,
249564
+ ...filteredBody,
249391
249565
  id: nanoid3(),
249392
249566
  created_date: now,
249393
249567
  updated_date: now
@@ -249408,12 +249582,21 @@ function createEntityRoutes(db2, logger, remoteProxy, broadcast) {
249408
249582
  }
249409
249583
  try {
249410
249584
  const now = new Date().toISOString();
249411
- const records = req.body.map((item) => ({
249412
- ...item,
249413
- id: nanoid3(),
249414
- created_date: now,
249415
- updated_date: now
249416
- }));
249585
+ const records = [];
249586
+ for (const record2 of req.body) {
249587
+ const filteredRecord = db2.prepareRecord(entityName, record2);
249588
+ const validation = db2.validate(entityName, filteredRecord);
249589
+ if (validation.hasError) {
249590
+ res.status(422).json(validation.error);
249591
+ return;
249592
+ }
249593
+ records.push({
249594
+ ...filteredRecord,
249595
+ id: nanoid3(),
249596
+ created_date: now,
249597
+ updated_date: now
249598
+ });
249599
+ }
249417
249600
  const inserted = stripInternalFields(await collection.insertAsync(records));
249418
249601
  emit(appId, entityName, "create", inserted);
249419
249602
  res.status(201).json(inserted);
@@ -249426,8 +249609,14 @@ function createEntityRoutes(db2, logger, remoteProxy, broadcast) {
249426
249609
  const { appId, entityName, id: id2 } = req.params;
249427
249610
  const { id: _id, created_date: _created_date, ...body } = req.body;
249428
249611
  try {
249612
+ const filteredBody = db2.prepareRecord(entityName, body, true);
249613
+ const validation = db2.validate(entityName, filteredBody, true);
249614
+ if (validation.hasError) {
249615
+ res.status(422).json(validation.error);
249616
+ return;
249617
+ }
249429
249618
  const updateData = {
249430
- ...body,
249619
+ ...filteredBody,
249431
249620
  updated_date: new Date().toISOString()
249432
249621
  };
249433
249622
  const result = await collection.updateAsync({ id: id2 }, { $set: updateData }, { returnUpdatedDocs: true });
@@ -255771,4 +255960,4 @@ export {
255771
255960
  CLIExitError
255772
255961
  };
255773
255962
 
255774
- //# debugId=9A2E9C491721ADA564756E2164756E21
255963
+ //# debugId=CD060DA1B6F7116364756E2164756E21