@base44-preview/cli 0.0.38-pr.382.a4f0192 → 0.0.40-pr.386.9d07976
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/bin/binary-entry.ts +40 -0
- package/dist/assets/deno-runtime/main.ts +72 -0
- package/dist/cli/index.js +223 -336
- package/dist/cli/index.js.map +16 -18
- package/package.json +7 -4
- package/dist/deno-runtime/main.js +0 -31
- package/dist/deno-runtime/main.js.map +0 -10
- /package/dist/{templates → assets/templates}/backend-and-client/.nvmrc +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/README.md +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/base44/agents/task_manager.jsonc +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/base44/app.jsonc.ejs +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/base44/config.jsonc.ejs +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/base44/entities/task.jsonc +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/components.json +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/gitignore.ejs +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/index.html +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/jsconfig.json +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/package.json +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/postcss.config.js +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/src/App.jsx +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/src/api/base44Client.js.ejs +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/src/components/Base44Logo.jsx +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/src/components/ui/button.jsx +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/src/components/ui/checkbox.jsx +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/src/components/ui/input.jsx +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/src/index.css +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/src/main.jsx +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/tailwind.config.js +0 -0
- /package/dist/{templates → assets/templates}/backend-and-client/vite.config.js +0 -0
- /package/dist/{templates → assets/templates}/backend-only/base44/app.jsonc.ejs +0 -0
- /package/dist/{templates → assets/templates}/backend-only/base44/config.jsonc.ejs +0 -0
- /package/dist/{templates → assets/templates}/backend-only/base44/gitignore.ejs +0 -0
- /package/dist/{templates → assets/templates}/templates.json +0 -0
package/dist/cli/index.js
CHANGED
|
@@ -8933,10 +8933,10 @@ var require_ejs = __commonJS((exports) => {
|
|
|
8933
8933
|
exports.localsName = _DEFAULT_LOCALS_NAME;
|
|
8934
8934
|
exports.promiseImpl = new Function("return this;")().Promise;
|
|
8935
8935
|
exports.resolveInclude = function(name2, filename, isDir) {
|
|
8936
|
-
var
|
|
8936
|
+
var dirname6 = path11.dirname;
|
|
8937
8937
|
var extname = path11.extname;
|
|
8938
8938
|
var resolve = path11.resolve;
|
|
8939
|
-
var includePath = resolve(isDir ? filename :
|
|
8939
|
+
var includePath = resolve(isDir ? filename : dirname6(filename), name2);
|
|
8940
8940
|
var ext = extname(name2);
|
|
8941
8941
|
if (!ext) {
|
|
8942
8942
|
includePath += ".ejs";
|
|
@@ -18040,7 +18040,7 @@ var require_lodash = __commonJS((exports, module) => {
|
|
|
18040
18040
|
}
|
|
18041
18041
|
return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined2, comparator) : [];
|
|
18042
18042
|
});
|
|
18043
|
-
function
|
|
18043
|
+
function join13(array2, separator) {
|
|
18044
18044
|
return array2 == null ? "" : nativeJoin.call(array2, separator);
|
|
18045
18045
|
}
|
|
18046
18046
|
function last(array2) {
|
|
@@ -18062,7 +18062,7 @@ var require_lodash = __commonJS((exports, module) => {
|
|
|
18062
18062
|
function nth(array2, n2) {
|
|
18063
18063
|
return array2 && array2.length ? baseNth(array2, toInteger(n2)) : undefined2;
|
|
18064
18064
|
}
|
|
18065
|
-
var
|
|
18065
|
+
var pull = baseRest(pullAll);
|
|
18066
18066
|
function pullAll(array2, values2) {
|
|
18067
18067
|
return array2 && array2.length && values2 && values2.length ? basePullAll(array2, values2) : array2;
|
|
18068
18068
|
}
|
|
@@ -19827,7 +19827,7 @@ __p += '`;
|
|
|
19827
19827
|
lodash.pickBy = pickBy;
|
|
19828
19828
|
lodash.property = property;
|
|
19829
19829
|
lodash.propertyOf = propertyOf;
|
|
19830
|
-
lodash.pull =
|
|
19830
|
+
lodash.pull = pull;
|
|
19831
19831
|
lodash.pullAll = pullAll;
|
|
19832
19832
|
lodash.pullAllBy = pullAllBy;
|
|
19833
19833
|
lodash.pullAllWith = pullAllWith;
|
|
@@ -19972,7 +19972,7 @@ __p += '`;
|
|
|
19972
19972
|
lodash.isUndefined = isUndefined;
|
|
19973
19973
|
lodash.isWeakMap = isWeakMap;
|
|
19974
19974
|
lodash.isWeakSet = isWeakSet;
|
|
19975
|
-
lodash.join =
|
|
19975
|
+
lodash.join = join13;
|
|
19976
19976
|
lodash.kebabCase = kebabCase2;
|
|
19977
19977
|
lodash.last = last;
|
|
19978
19978
|
lodash.lastIndexOf = lastIndexOf;
|
|
@@ -20601,7 +20601,7 @@ function cleanDoc(doc2) {
|
|
|
20601
20601
|
return mapDoc(doc2, (currentDoc) => cleanDocFn(currentDoc));
|
|
20602
20602
|
}
|
|
20603
20603
|
function replaceEndOfLine(doc2, replacement = literalline) {
|
|
20604
|
-
return mapDoc(doc2, (currentDoc) => typeof currentDoc === "string" ?
|
|
20604
|
+
return mapDoc(doc2, (currentDoc) => typeof currentDoc === "string" ? join13(replacement, currentDoc.split(`
|
|
20605
20605
|
`)) : currentDoc);
|
|
20606
20606
|
}
|
|
20607
20607
|
function canBreakFn(doc2) {
|
|
@@ -20681,7 +20681,7 @@ function indentIfBreak(contents, options) {
|
|
|
20681
20681
|
negate: options.negate
|
|
20682
20682
|
};
|
|
20683
20683
|
}
|
|
20684
|
-
function
|
|
20684
|
+
function join13(separator, docs) {
|
|
20685
20685
|
assertDoc(separator);
|
|
20686
20686
|
assertDocArray(docs);
|
|
20687
20687
|
const parts = [];
|
|
@@ -21392,7 +21392,7 @@ var init_doc = __esm(() => {
|
|
|
21392
21392
|
MODE_FLAT = Symbol("MODE_FLAT");
|
|
21393
21393
|
DOC_FILL_PRINTED_LENGTH = Symbol("DOC_FILL_PRINTED_LENGTH");
|
|
21394
21394
|
builders = {
|
|
21395
|
-
join:
|
|
21395
|
+
join: join13,
|
|
21396
21396
|
line,
|
|
21397
21397
|
softline,
|
|
21398
21398
|
hardline,
|
|
@@ -113630,7 +113630,7 @@ async function clearCache3() {
|
|
|
113630
113630
|
clearCache();
|
|
113631
113631
|
clearCache2();
|
|
113632
113632
|
}
|
|
113633
|
-
var require2, __filename2,
|
|
113633
|
+
var require2, __filename2, __dirname3, __create2, __defProp3, __getOwnPropDesc, __getOwnPropNames2, __getProtoOf2, __hasOwnProp2, __require2, __commonJS2 = (cb2, mod) => function __require22() {
|
|
113634
113634
|
return mod || (0, cb2[__getOwnPropNames2(cb2)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
113635
113635
|
}, __export3 = (target, all) => {
|
|
113636
113636
|
for (var name2 in all)
|
|
@@ -114373,7 +114373,7 @@ var init_prettier = __esm(() => {
|
|
|
114373
114373
|
init_doc();
|
|
114374
114374
|
require2 = __prettierCreateRequire(import.meta.url);
|
|
114375
114375
|
__filename2 = __prettierFileUrlToPath(import.meta.url);
|
|
114376
|
-
|
|
114376
|
+
__dirname3 = __prettierDirname(__filename2);
|
|
114377
114377
|
__create2 = Object.create;
|
|
114378
114378
|
__defProp3 = Object.defineProperty;
|
|
114379
114379
|
__getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -126306,7 +126306,7 @@ Expected it to be ${EXPECTED_TYPE_VALUES}.`;
|
|
|
126306
126306
|
return mapDoc2(doc2, (currentDoc) => cleanDocFn2(currentDoc));
|
|
126307
126307
|
}
|
|
126308
126308
|
function replaceEndOfLine2(doc2, replacement = literalline2) {
|
|
126309
|
-
return mapDoc2(doc2, (currentDoc) => typeof currentDoc === "string" ?
|
|
126309
|
+
return mapDoc2(doc2, (currentDoc) => typeof currentDoc === "string" ? join15(replacement, currentDoc.split(`
|
|
126310
126310
|
`)) : currentDoc);
|
|
126311
126311
|
}
|
|
126312
126312
|
function canBreakFn2(doc2) {
|
|
@@ -126392,7 +126392,7 @@ Expected it to be ${EXPECTED_TYPE_VALUES}.`;
|
|
|
126392
126392
|
negate: options8.negate
|
|
126393
126393
|
};
|
|
126394
126394
|
}
|
|
126395
|
-
function
|
|
126395
|
+
function join15(separator, docs) {
|
|
126396
126396
|
assertDoc2(separator);
|
|
126397
126397
|
assertDocArray2(docs);
|
|
126398
126398
|
const parts = [];
|
|
@@ -127057,7 +127057,7 @@ Expected it to be ${EXPECTED_TYPE_VALUES}.`;
|
|
|
127057
127057
|
}
|
|
127058
127058
|
}
|
|
127059
127059
|
var builders2 = {
|
|
127060
|
-
join:
|
|
127060
|
+
join: join15,
|
|
127061
127061
|
line: line3,
|
|
127062
127062
|
softline: softline2,
|
|
127063
127063
|
hardline: hardline4,
|
|
@@ -156272,10 +156272,10 @@ var require_view = __commonJS((exports, module) => {
|
|
|
156272
156272
|
var debug = require_src4()("express:view");
|
|
156273
156273
|
var path18 = __require("node:path");
|
|
156274
156274
|
var fs28 = __require("node:fs");
|
|
156275
|
-
var
|
|
156275
|
+
var dirname11 = path18.dirname;
|
|
156276
156276
|
var basename4 = path18.basename;
|
|
156277
156277
|
var extname2 = path18.extname;
|
|
156278
|
-
var
|
|
156278
|
+
var join16 = path18.join;
|
|
156279
156279
|
var resolve6 = path18.resolve;
|
|
156280
156280
|
module.exports = View;
|
|
156281
156281
|
function View(name2, options8) {
|
|
@@ -156311,7 +156311,7 @@ var require_view = __commonJS((exports, module) => {
|
|
|
156311
156311
|
for (var i5 = 0;i5 < roots.length && !path19; i5++) {
|
|
156312
156312
|
var root2 = roots[i5];
|
|
156313
156313
|
var loc = resolve6(root2, name2);
|
|
156314
|
-
var dir =
|
|
156314
|
+
var dir = dirname11(loc);
|
|
156315
156315
|
var file2 = basename4(loc);
|
|
156316
156316
|
path19 = this.resolve(dir, file2);
|
|
156317
156317
|
}
|
|
@@ -156337,12 +156337,12 @@ var require_view = __commonJS((exports, module) => {
|
|
|
156337
156337
|
};
|
|
156338
156338
|
View.prototype.resolve = function resolve7(dir, file2) {
|
|
156339
156339
|
var ext = this.ext;
|
|
156340
|
-
var path19 =
|
|
156340
|
+
var path19 = join16(dir, file2);
|
|
156341
156341
|
var stat2 = tryStat(path19);
|
|
156342
156342
|
if (stat2 && stat2.isFile()) {
|
|
156343
156343
|
return path19;
|
|
156344
156344
|
}
|
|
156345
|
-
path19 =
|
|
156345
|
+
path19 = join16(dir, basename4(file2, ext), "index" + ext);
|
|
156346
156346
|
stat2 = tryStat(path19);
|
|
156347
156347
|
if (stat2 && stat2.isFile()) {
|
|
156348
156348
|
return path19;
|
|
@@ -160037,7 +160037,7 @@ var require_send = __commonJS((exports, module) => {
|
|
|
160037
160037
|
var Stream2 = __require("stream");
|
|
160038
160038
|
var util2 = __require("util");
|
|
160039
160039
|
var extname2 = path18.extname;
|
|
160040
|
-
var
|
|
160040
|
+
var join16 = path18.join;
|
|
160041
160041
|
var normalize = path18.normalize;
|
|
160042
160042
|
var resolve6 = path18.resolve;
|
|
160043
160043
|
var sep = path18.sep;
|
|
@@ -160209,7 +160209,7 @@ var require_send = __commonJS((exports, module) => {
|
|
|
160209
160209
|
return res;
|
|
160210
160210
|
}
|
|
160211
160211
|
parts = path19.split(sep);
|
|
160212
|
-
path19 = normalize(
|
|
160212
|
+
path19 = normalize(join16(root2, path19));
|
|
160213
160213
|
} else {
|
|
160214
160214
|
if (UP_PATH_REGEXP.test(path19)) {
|
|
160215
160215
|
debug('malicious path "%s"', path19);
|
|
@@ -160349,7 +160349,7 @@ var require_send = __commonJS((exports, module) => {
|
|
|
160349
160349
|
return self2.onStatError(err);
|
|
160350
160350
|
return self2.error(404);
|
|
160351
160351
|
}
|
|
160352
|
-
var p4 =
|
|
160352
|
+
var p4 = join16(path19, self2._index[i5]);
|
|
160353
160353
|
debug('stat "%s"', p4);
|
|
160354
160354
|
fs28.stat(p4, function(err2, stat2) {
|
|
160355
160355
|
if (err2)
|
|
@@ -206944,7 +206944,7 @@ var require_buffer_list = __commonJS((exports, module) => {
|
|
|
206944
206944
|
}
|
|
206945
206945
|
}, {
|
|
206946
206946
|
key: "join",
|
|
206947
|
-
value: function
|
|
206947
|
+
value: function join16(s5) {
|
|
206948
206948
|
if (this.length === 0)
|
|
206949
206949
|
return "";
|
|
206950
206950
|
var p4 = this.head;
|
|
@@ -210590,7 +210590,7 @@ var require_dist5 = __commonJS((exports, module) => {
|
|
|
210590
210590
|
});
|
|
210591
210591
|
module.exports = __toCommonJS(src_exports);
|
|
210592
210592
|
var import_promises22 = __require("node:fs/promises");
|
|
210593
|
-
var
|
|
210593
|
+
var import_node_fs22 = __require("node:fs");
|
|
210594
210594
|
var DEVIN_LOCAL_PATH = "/opt/.devin";
|
|
210595
210595
|
var CURSOR2 = "cursor";
|
|
210596
210596
|
var CURSOR_CLI = "cursor-cli";
|
|
@@ -210647,13 +210647,17 @@ var require_dist5 = __commonJS((exports, module) => {
|
|
|
210647
210647
|
return { isAgent: true, agent: { name: REPLIT } };
|
|
210648
210648
|
}
|
|
210649
210649
|
try {
|
|
210650
|
-
await (0, import_promises22.access)(DEVIN_LOCAL_PATH,
|
|
210650
|
+
await (0, import_promises22.access)(DEVIN_LOCAL_PATH, import_node_fs22.constants.F_OK);
|
|
210651
210651
|
return { isAgent: true, agent: { name: DEVIN } };
|
|
210652
210652
|
} catch (error48) {}
|
|
210653
210653
|
return { isAgent: false, agent: undefined };
|
|
210654
210654
|
}
|
|
210655
210655
|
});
|
|
210656
210656
|
|
|
210657
|
+
// src/cli/index.ts
|
|
210658
|
+
import { dirname as dirname15, join as join19 } from "node:path";
|
|
210659
|
+
import { fileURLToPath as fileURLToPath6 } from "node:url";
|
|
210660
|
+
|
|
210657
210661
|
// node_modules/commander/esm.mjs
|
|
210658
210662
|
var import__ = __toESM(require_commander(), 1);
|
|
210659
210663
|
var {
|
|
@@ -210671,7 +210675,7 @@ var {
|
|
|
210671
210675
|
} = import__.default;
|
|
210672
210676
|
|
|
210673
210677
|
// src/cli/commands/agents/pull.ts
|
|
210674
|
-
import { dirname as
|
|
210678
|
+
import { dirname as dirname7, join as join10 } from "node:path";
|
|
210675
210679
|
|
|
210676
210680
|
// node_modules/@clack/core/dist/index.mjs
|
|
210677
210681
|
var import_picocolors = __toESM(require_picocolors(), 1);
|
|
@@ -226137,8 +226141,7 @@ var distribution_default = ky;
|
|
|
226137
226141
|
|
|
226138
226142
|
// src/core/config.ts
|
|
226139
226143
|
import { homedir } from "node:os";
|
|
226140
|
-
import {
|
|
226141
|
-
import { fileURLToPath } from "node:url";
|
|
226144
|
+
import { join } from "node:path";
|
|
226142
226145
|
|
|
226143
226146
|
// src/core/consts.ts
|
|
226144
226147
|
var PROJECT_SUBDIR = "base44";
|
|
@@ -226210,19 +226213,12 @@ var TestOverridesSchema = exports_external.object({
|
|
|
226210
226213
|
});
|
|
226211
226214
|
|
|
226212
226215
|
// src/core/config.ts
|
|
226213
|
-
var __dirname2 = dirname(fileURLToPath(import.meta.url));
|
|
226214
226216
|
function getBase44GlobalDir() {
|
|
226215
226217
|
return join(homedir(), ".base44");
|
|
226216
226218
|
}
|
|
226217
226219
|
function getAuthFilePath() {
|
|
226218
226220
|
return join(getBase44GlobalDir(), "auth", "auth.json");
|
|
226219
226221
|
}
|
|
226220
|
-
function getTemplatesDir() {
|
|
226221
|
-
return join(__dirname2, "../templates");
|
|
226222
|
-
}
|
|
226223
|
-
function getTemplatesIndexPath() {
|
|
226224
|
-
return join(getTemplatesDir(), "templates.json");
|
|
226225
|
-
}
|
|
226226
226222
|
function getAppConfigPath(projectRoot) {
|
|
226227
226223
|
return join(projectRoot, PROJECT_SUBDIR, ".app.jsonc");
|
|
226228
226224
|
}
|
|
@@ -226553,7 +226549,7 @@ import {
|
|
|
226553
226549
|
readdir,
|
|
226554
226550
|
unlink
|
|
226555
226551
|
} from "node:fs/promises";
|
|
226556
|
-
import { dirname
|
|
226552
|
+
import { dirname } from "node:path";
|
|
226557
226553
|
async function pathExists(path) {
|
|
226558
226554
|
try {
|
|
226559
226555
|
await access(path);
|
|
@@ -226563,14 +226559,14 @@ async function pathExists(path) {
|
|
|
226563
226559
|
}
|
|
226564
226560
|
}
|
|
226565
226561
|
async function writeFile(filePath, content) {
|
|
226566
|
-
const dir =
|
|
226562
|
+
const dir = dirname(filePath);
|
|
226567
226563
|
if (!await pathExists(dir)) {
|
|
226568
226564
|
await mkdir(dir, { recursive: true });
|
|
226569
226565
|
}
|
|
226570
226566
|
await fsWriteFile(filePath, content, "utf-8");
|
|
226571
226567
|
}
|
|
226572
226568
|
async function copyFile(src, dest) {
|
|
226573
|
-
const dir =
|
|
226569
|
+
const dir = dirname(dest);
|
|
226574
226570
|
if (!await pathExists(dir)) {
|
|
226575
226571
|
await mkdir(dir, { recursive: true });
|
|
226576
226572
|
}
|
|
@@ -226611,7 +226607,7 @@ async function readJsonFile(filePath) {
|
|
|
226611
226607
|
}
|
|
226612
226608
|
}
|
|
226613
226609
|
async function writeJsonFile(filePath, data) {
|
|
226614
|
-
const dir =
|
|
226610
|
+
const dir = dirname(filePath);
|
|
226615
226611
|
if (!await pathExists(dir)) {
|
|
226616
226612
|
await mkdir(dir, { recursive: true });
|
|
226617
226613
|
}
|
|
@@ -227761,7 +227757,7 @@ import path3 from "node:path";
|
|
|
227761
227757
|
|
|
227762
227758
|
// node_modules/tar/dist/esm/list.js
|
|
227763
227759
|
import fs2 from "node:fs";
|
|
227764
|
-
import { dirname as
|
|
227760
|
+
import { dirname as dirname2, parse as parse6 } from "path";
|
|
227765
227761
|
|
|
227766
227762
|
// node_modules/tar/dist/esm/options.js
|
|
227767
227763
|
var argmap = new Map([
|
|
@@ -229337,7 +229333,7 @@ var filesFilter = (opt, files) => {
|
|
|
229337
229333
|
if (m !== undefined) {
|
|
229338
229334
|
ret = m;
|
|
229339
229335
|
} else {
|
|
229340
|
-
ret = mapHas(
|
|
229336
|
+
ret = mapHas(dirname2(file2), root);
|
|
229341
229337
|
}
|
|
229342
229338
|
}
|
|
229343
229339
|
map2.set(file2, ret);
|
|
@@ -232498,10 +232494,10 @@ var import_fast_glob2 = __toESM(require_out4(), 1);
|
|
|
232498
232494
|
// node_modules/unicorn-magic/node.js
|
|
232499
232495
|
import { promisify } from "node:util";
|
|
232500
232496
|
import { execFile as execFileCallback, execFileSync as execFileSyncOriginal } from "node:child_process";
|
|
232501
|
-
import { fileURLToPath
|
|
232497
|
+
import { fileURLToPath } from "node:url";
|
|
232502
232498
|
var execFileOriginal = promisify(execFileCallback);
|
|
232503
232499
|
function toPath(urlOrPath) {
|
|
232504
|
-
return urlOrPath instanceof URL ?
|
|
232500
|
+
return urlOrPath instanceof URL ? fileURLToPath(urlOrPath) : urlOrPath;
|
|
232505
232501
|
}
|
|
232506
232502
|
var TEN_MEGABYTES_IN_BYTES = 10 * 1024 * 1024;
|
|
232507
232503
|
|
|
@@ -232916,9 +232912,9 @@ var shouldExpandGlobstarDirectory = (pattern) => {
|
|
|
232916
232912
|
if (!match) {
|
|
232917
232913
|
return false;
|
|
232918
232914
|
}
|
|
232919
|
-
const
|
|
232920
|
-
const hasWildcards = /[*?[\]{}]/.test(
|
|
232921
|
-
const hasExtension = nodePath.extname(
|
|
232915
|
+
const dirname3 = match[1];
|
|
232916
|
+
const hasWildcards = /[*?[\]{}]/.test(dirname3);
|
|
232917
|
+
const hasExtension = nodePath.extname(dirname3) && !dirname3.startsWith(".");
|
|
232922
232918
|
return !hasWildcards && !hasExtension;
|
|
232923
232919
|
};
|
|
232924
232920
|
var getDirectoryGlob = ({ directoryPath, files, extensions }) => {
|
|
@@ -233175,7 +233171,7 @@ var generateGlobTasks = normalizeArguments(generateTasks);
|
|
|
233175
233171
|
var generateGlobTasksSync = normalizeArgumentsSync(generateTasksSync);
|
|
233176
233172
|
|
|
233177
233173
|
// src/core/project/config.ts
|
|
233178
|
-
import { dirname as
|
|
233174
|
+
import { dirname as dirname5, join as join6 } from "node:path";
|
|
233179
233175
|
|
|
233180
233176
|
// src/core/resources/agent/schema.ts
|
|
233181
233177
|
var EntityOperationSchema = exports_external.enum(["create", "update", "delete", "read"]);
|
|
@@ -233911,21 +233907,6 @@ var DeployFunctionsResponseSchema = exports_external.object({
|
|
|
233911
233907
|
skipped: exports_external.array(exports_external.string()).optional().nullable(),
|
|
233912
233908
|
errors: exports_external.array(exports_external.object({ name: exports_external.string(), message: exports_external.string() })).nullable()
|
|
233913
233909
|
});
|
|
233914
|
-
var FunctionAutomationInfoSchema = exports_external.object({
|
|
233915
|
-
name: exports_external.string(),
|
|
233916
|
-
type: exports_external.string(),
|
|
233917
|
-
is_active: exports_external.boolean()
|
|
233918
|
-
});
|
|
233919
|
-
var FunctionInfoSchema = exports_external.object({
|
|
233920
|
-
name: exports_external.string(),
|
|
233921
|
-
deployment_id: exports_external.string(),
|
|
233922
|
-
entry: exports_external.string(),
|
|
233923
|
-
files: exports_external.array(FunctionFileSchema),
|
|
233924
|
-
automations: exports_external.array(FunctionAutomationInfoSchema)
|
|
233925
|
-
});
|
|
233926
|
-
var ListFunctionsResponseSchema = exports_external.object({
|
|
233927
|
-
functions: exports_external.array(FunctionInfoSchema)
|
|
233928
|
-
});
|
|
233929
233910
|
var LogLevelSchema = exports_external.enum(["info", "warning", "error", "debug"]);
|
|
233930
233911
|
var FunctionLogEntrySchema = exports_external.object({
|
|
233931
233912
|
time: exports_external.string(),
|
|
@@ -233963,20 +233944,6 @@ async function deployFunctions(functions) {
|
|
|
233963
233944
|
}
|
|
233964
233945
|
return result.data;
|
|
233965
233946
|
}
|
|
233966
|
-
async function listDeployedFunctions() {
|
|
233967
|
-
const appClient = getAppClient();
|
|
233968
|
-
let response;
|
|
233969
|
-
try {
|
|
233970
|
-
response = await appClient.get("backend-functions", { timeout: 30000 });
|
|
233971
|
-
} catch (error48) {
|
|
233972
|
-
throw await ApiError.fromHttpError(error48, "listing deployed functions");
|
|
233973
|
-
}
|
|
233974
|
-
const result = ListFunctionsResponseSchema.safeParse(await response.json());
|
|
233975
|
-
if (!result.success) {
|
|
233976
|
-
throw new SchemaValidationError("Invalid response from server", result.error);
|
|
233977
|
-
}
|
|
233978
|
-
return result.data;
|
|
233979
|
-
}
|
|
233980
233947
|
function buildLogsQueryString(filters) {
|
|
233981
233948
|
const params = new URLSearchParams;
|
|
233982
233949
|
if (filters.since) {
|
|
@@ -234014,7 +233981,7 @@ async function fetchFunctionLogs(functionName, filters = {}) {
|
|
|
234014
233981
|
return result.data;
|
|
234015
233982
|
}
|
|
234016
233983
|
// src/core/resources/function/config.ts
|
|
234017
|
-
import { basename as basename2, dirname as
|
|
233984
|
+
import { basename as basename2, dirname as dirname3, join as join5, relative } from "node:path";
|
|
234018
233985
|
async function readFunctionConfig(configPath) {
|
|
234019
233986
|
const parsed = await readJsonFile(configPath);
|
|
234020
233987
|
const result = FunctionConfigSchema.safeParse(parsed);
|
|
@@ -234025,7 +233992,7 @@ async function readFunctionConfig(configPath) {
|
|
|
234025
233992
|
}
|
|
234026
233993
|
async function readFunction(configPath) {
|
|
234027
233994
|
const config5 = await readFunctionConfig(configPath);
|
|
234028
|
-
const functionDir =
|
|
233995
|
+
const functionDir = dirname3(configPath);
|
|
234029
233996
|
const entryPath = join5(functionDir, config5.entry);
|
|
234030
233997
|
if (!await pathExists(entryPath)) {
|
|
234031
233998
|
throw new InvalidInputError(`Function entry file not found: ${entryPath} (referenced in ${configPath})`, {
|
|
@@ -234052,11 +234019,11 @@ async function readAllFunctions(functionsDir) {
|
|
|
234052
234019
|
absolute: true,
|
|
234053
234020
|
ignore: ENTRY_IGNORE_DOT_PATHS
|
|
234054
234021
|
});
|
|
234055
|
-
const configFilesDirs = new Set(configFiles.map((f) =>
|
|
234056
|
-
const entryFilesWithoutConfig = entryFiles.filter((entryFile) => !configFilesDirs.has(
|
|
234022
|
+
const configFilesDirs = new Set(configFiles.map((f) => dirname3(f)));
|
|
234023
|
+
const entryFilesWithoutConfig = entryFiles.filter((entryFile) => !configFilesDirs.has(dirname3(entryFile)));
|
|
234057
234024
|
const functionsFromConfig = await Promise.all(configFiles.map((configPath) => readFunction(configPath)));
|
|
234058
234025
|
const functionsWithoutConfig = await Promise.all(entryFilesWithoutConfig.map(async (entryFile) => {
|
|
234059
|
-
const functionDir =
|
|
234026
|
+
const functionDir = dirname3(entryFile);
|
|
234060
234027
|
const filePaths = await globby("**/*.{js,ts,json}", {
|
|
234061
234028
|
cwd: functionDir,
|
|
234062
234029
|
absolute: true
|
|
@@ -234091,9 +234058,9 @@ async function readAllFunctions(functionsDir) {
|
|
|
234091
234058
|
return functions;
|
|
234092
234059
|
}
|
|
234093
234060
|
// src/core/resources/function/deploy.ts
|
|
234094
|
-
import { dirname as
|
|
234061
|
+
import { dirname as dirname4, relative as relative2 } from "node:path";
|
|
234095
234062
|
async function loadFunctionCode(fn) {
|
|
234096
|
-
const functionDir =
|
|
234063
|
+
const functionDir = dirname4(fn.entryPath);
|
|
234097
234064
|
const loadedFiles = await Promise.all(fn.filePaths.map(async (filePath) => {
|
|
234098
234065
|
const content = await readTextFile(filePath);
|
|
234099
234066
|
const path11 = relative2(functionDir, filePath).split(/[/\\]/).join("/");
|
|
@@ -234108,67 +234075,6 @@ async function pushFunctions(functions) {
|
|
|
234108
234075
|
const functionsWithCode = await Promise.all(functions.map(loadFunctionCode));
|
|
234109
234076
|
return deployFunctions(functionsWithCode);
|
|
234110
234077
|
}
|
|
234111
|
-
// src/core/resources/function/pull.ts
|
|
234112
|
-
import { join as join6 } from "node:path";
|
|
234113
|
-
async function writeFunctions(functionsDir, functions) {
|
|
234114
|
-
const written = [];
|
|
234115
|
-
const skipped = [];
|
|
234116
|
-
for (const fn of functions) {
|
|
234117
|
-
const functionDir = join6(functionsDir, fn.name);
|
|
234118
|
-
const configPath = join6(functionDir, "function.jsonc");
|
|
234119
|
-
if (await isFunctionUnchanged(functionDir, fn)) {
|
|
234120
|
-
skipped.push(fn.name);
|
|
234121
|
-
continue;
|
|
234122
|
-
}
|
|
234123
|
-
const config5 = {
|
|
234124
|
-
name: fn.name,
|
|
234125
|
-
entry: fn.entry
|
|
234126
|
-
};
|
|
234127
|
-
if (fn.automations.length > 0) {
|
|
234128
|
-
config5.automations = fn.automations;
|
|
234129
|
-
}
|
|
234130
|
-
await writeJsonFile(configPath, config5);
|
|
234131
|
-
for (const file2 of fn.files) {
|
|
234132
|
-
await writeFile(join6(functionDir, file2.path), file2.content);
|
|
234133
|
-
}
|
|
234134
|
-
written.push(fn.name);
|
|
234135
|
-
}
|
|
234136
|
-
return { written, skipped };
|
|
234137
|
-
}
|
|
234138
|
-
async function isFunctionUnchanged(functionDir, fn) {
|
|
234139
|
-
if (!await pathExists(functionDir)) {
|
|
234140
|
-
return false;
|
|
234141
|
-
}
|
|
234142
|
-
const configPath = join6(functionDir, "function.jsonc");
|
|
234143
|
-
try {
|
|
234144
|
-
const localConfig = await readJsonFile(configPath);
|
|
234145
|
-
if (localConfig.entry !== fn.entry) {
|
|
234146
|
-
return false;
|
|
234147
|
-
}
|
|
234148
|
-
const localAuto = JSON.stringify(localConfig.automations ?? []);
|
|
234149
|
-
const remoteAuto = JSON.stringify(fn.automations);
|
|
234150
|
-
if (localAuto !== remoteAuto) {
|
|
234151
|
-
return false;
|
|
234152
|
-
}
|
|
234153
|
-
} catch {
|
|
234154
|
-
return false;
|
|
234155
|
-
}
|
|
234156
|
-
for (const file2 of fn.files) {
|
|
234157
|
-
const filePath = join6(functionDir, file2.path);
|
|
234158
|
-
if (!await pathExists(filePath)) {
|
|
234159
|
-
return false;
|
|
234160
|
-
}
|
|
234161
|
-
try {
|
|
234162
|
-
const localContent = await readTextFile(filePath);
|
|
234163
|
-
if (localContent !== file2.content) {
|
|
234164
|
-
return false;
|
|
234165
|
-
}
|
|
234166
|
-
} catch {
|
|
234167
|
-
return false;
|
|
234168
|
-
}
|
|
234169
|
-
}
|
|
234170
|
-
return true;
|
|
234171
|
-
}
|
|
234172
234078
|
// src/core/resources/function/resource.ts
|
|
234173
234079
|
var functionResource = {
|
|
234174
234080
|
readAll: readAllFunctions,
|
|
@@ -234184,12 +234090,12 @@ async function findConfigInDir(dir) {
|
|
|
234184
234090
|
}
|
|
234185
234091
|
async function findProjectRoot(startPath) {
|
|
234186
234092
|
let current = startPath || process.cwd();
|
|
234187
|
-
while (current !==
|
|
234093
|
+
while (current !== dirname5(current)) {
|
|
234188
234094
|
const configPath = await findConfigInDir(current);
|
|
234189
234095
|
if (configPath) {
|
|
234190
234096
|
return { root: current, configPath };
|
|
234191
234097
|
}
|
|
234192
|
-
current =
|
|
234098
|
+
current = dirname5(current);
|
|
234193
234099
|
}
|
|
234194
234100
|
return null;
|
|
234195
234101
|
}
|
|
@@ -234211,12 +234117,12 @@ async function readProjectConfig(projectRoot) {
|
|
|
234211
234117
|
throw new SchemaValidationError("Invalid project configuration", result.error, configPath);
|
|
234212
234118
|
}
|
|
234213
234119
|
const project = result.data;
|
|
234214
|
-
const configDir =
|
|
234120
|
+
const configDir = dirname5(configPath);
|
|
234215
234121
|
const [entities, functions, agents, connectors] = await Promise.all([
|
|
234216
|
-
entityResource.readAll(
|
|
234217
|
-
functionResource.readAll(
|
|
234218
|
-
agentResource.readAll(
|
|
234219
|
-
connectorResource.readAll(
|
|
234122
|
+
entityResource.readAll(join6(configDir, project.entitiesDir)),
|
|
234123
|
+
functionResource.readAll(join6(configDir, project.functionsDir)),
|
|
234124
|
+
agentResource.readAll(join6(configDir, project.agentsDir)),
|
|
234125
|
+
connectorResource.readAll(join6(configDir, project.connectorsDir))
|
|
234220
234126
|
]);
|
|
234221
234127
|
return {
|
|
234222
234128
|
project: { ...project, root, configPath },
|
|
@@ -234313,12 +234219,131 @@ async function readAppConfig(projectRoot) {
|
|
|
234313
234219
|
// src/core/project/template.ts
|
|
234314
234220
|
var import_ejs = __toESM(require_ejs(), 1);
|
|
234315
234221
|
var import_front_matter = __toESM(require_front_matter(), 1);
|
|
234316
|
-
import { dirname as
|
|
234222
|
+
import { dirname as dirname6, join as join8 } from "node:path";
|
|
234223
|
+
|
|
234224
|
+
// src/core/assets.ts
|
|
234225
|
+
import { cpSync, existsSync } from "node:fs";
|
|
234226
|
+
import { homedir as homedir2 } from "node:os";
|
|
234227
|
+
import { join as join7 } from "node:path";
|
|
234228
|
+
// package.json
|
|
234229
|
+
var package_default = {
|
|
234230
|
+
name: "base44",
|
|
234231
|
+
version: "0.0.40",
|
|
234232
|
+
description: "Base44 CLI - Unified interface for managing Base44 applications",
|
|
234233
|
+
type: "module",
|
|
234234
|
+
bin: {
|
|
234235
|
+
base44: "./bin/run.js"
|
|
234236
|
+
},
|
|
234237
|
+
files: [
|
|
234238
|
+
"dist/cli",
|
|
234239
|
+
"dist/assets",
|
|
234240
|
+
"bin"
|
|
234241
|
+
],
|
|
234242
|
+
scripts: {
|
|
234243
|
+
build: "bun run clean && mkdir -p dist/assets && cp -r templates dist/assets/ && bun run infra/build.ts",
|
|
234244
|
+
"build:watch": "bun run clean && mkdir -p dist/assets && cp -r templates dist/assets/ && bun run infra/build.ts --watch",
|
|
234245
|
+
typecheck: "tsc --noEmit",
|
|
234246
|
+
dev: "./bin/dev.ts",
|
|
234247
|
+
start: "./bin/run.js",
|
|
234248
|
+
clean: "rm -rf dist && mkdir -p dist",
|
|
234249
|
+
lint: "biome check src tests",
|
|
234250
|
+
"lint:fix": "biome check --write src tests",
|
|
234251
|
+
test: "vitest run",
|
|
234252
|
+
"test:watch": "vitest",
|
|
234253
|
+
"build:binaries": "bun run infra/build-binaries.ts",
|
|
234254
|
+
"package:binaries": "bun run infra/package-binaries.ts",
|
|
234255
|
+
knip: "knip",
|
|
234256
|
+
"knip:fix": "knip --fix"
|
|
234257
|
+
},
|
|
234258
|
+
keywords: [
|
|
234259
|
+
"base44",
|
|
234260
|
+
"cli",
|
|
234261
|
+
"command-line"
|
|
234262
|
+
],
|
|
234263
|
+
author: "",
|
|
234264
|
+
license: "MIT",
|
|
234265
|
+
repository: {
|
|
234266
|
+
type: "git",
|
|
234267
|
+
url: "https://github.com/base44/cli"
|
|
234268
|
+
},
|
|
234269
|
+
devDependencies: {
|
|
234270
|
+
"@biomejs/biome": "^2.0.0",
|
|
234271
|
+
"@clack/prompts": "^1.0.1",
|
|
234272
|
+
"@seald-io/nedb": "^4.1.2",
|
|
234273
|
+
"@types/bun": "^1.2.15",
|
|
234274
|
+
"@types/common-tags": "^1.8.4",
|
|
234275
|
+
"@types/cors": "^2.8.19",
|
|
234276
|
+
"@types/deno": "^2.5.0",
|
|
234277
|
+
"@types/ejs": "^3.1.5",
|
|
234278
|
+
"@types/express": "^5.0.6",
|
|
234279
|
+
"@types/json-schema": "^7.0.15",
|
|
234280
|
+
"@types/lodash": "^4.17.24",
|
|
234281
|
+
"@types/multer": "^2.0.0",
|
|
234282
|
+
"@types/node": "^22.10.5",
|
|
234283
|
+
"@vercel/detect-agent": "^1.1.0",
|
|
234284
|
+
chalk: "^5.6.2",
|
|
234285
|
+
chokidar: "^5.0.0",
|
|
234286
|
+
commander: "^12.1.0",
|
|
234287
|
+
"common-tags": "^1.8.2",
|
|
234288
|
+
cors: "^2.8.5",
|
|
234289
|
+
dotenv: "17.3.1",
|
|
234290
|
+
ejs: "^3.1.10",
|
|
234291
|
+
execa: "^9.6.1",
|
|
234292
|
+
express: "^5.0.1",
|
|
234293
|
+
"front-matter": "^4.0.2",
|
|
234294
|
+
"get-port": "^7.1.0",
|
|
234295
|
+
globby: "^16.1.0",
|
|
234296
|
+
"http-proxy-middleware": "^3.0.5",
|
|
234297
|
+
"json-schema-to-typescript": "^15.0.4",
|
|
234298
|
+
json5: "^2.2.3",
|
|
234299
|
+
knip: "^5.83.1",
|
|
234300
|
+
ky: "^1.14.2",
|
|
234301
|
+
lodash: "^4.17.23",
|
|
234302
|
+
msw: "^2.12.10",
|
|
234303
|
+
multer: "^2.0.0",
|
|
234304
|
+
nanoid: "^5.1.6",
|
|
234305
|
+
open: "^11.0.0",
|
|
234306
|
+
"p-wait-for": "^6.0.0",
|
|
234307
|
+
"posthog-node": "5.21.2",
|
|
234308
|
+
"socket.io": "^4.8.3",
|
|
234309
|
+
"strip-ansi": "^7.1.2",
|
|
234310
|
+
tar: "^7.5.4",
|
|
234311
|
+
"tmp-promise": "^3.0.3",
|
|
234312
|
+
typescript: "^5.7.2",
|
|
234313
|
+
vitest: "^4.0.16",
|
|
234314
|
+
zod: "^4.3.5"
|
|
234315
|
+
},
|
|
234316
|
+
engines: {
|
|
234317
|
+
node: ">=20.19.0"
|
|
234318
|
+
}
|
|
234319
|
+
};
|
|
234320
|
+
|
|
234321
|
+
// src/core/assets.ts
|
|
234322
|
+
var ASSETS_DIR = join7(homedir2(), ".base44", "assets", package_default.version);
|
|
234323
|
+
function getTemplatesDir() {
|
|
234324
|
+
return join7(ASSETS_DIR, "templates");
|
|
234325
|
+
}
|
|
234326
|
+
function getTemplatesIndexPath() {
|
|
234327
|
+
return join7(ASSETS_DIR, "templates", "templates.json");
|
|
234328
|
+
}
|
|
234329
|
+
function getDenoWrapperPath() {
|
|
234330
|
+
return join7(ASSETS_DIR, "deno-runtime", "main.ts");
|
|
234331
|
+
}
|
|
234332
|
+
function ensureNpmAssets(sourceDir) {
|
|
234333
|
+
if (existsSync(ASSETS_DIR))
|
|
234334
|
+
return;
|
|
234335
|
+
if (!existsSync(sourceDir))
|
|
234336
|
+
return;
|
|
234337
|
+
cpSync(sourceDir, ASSETS_DIR, { recursive: true });
|
|
234338
|
+
}
|
|
234339
|
+
|
|
234340
|
+
// src/core/project/template.ts
|
|
234317
234341
|
async function listTemplates() {
|
|
234318
|
-
const
|
|
234342
|
+
const indexPath = getTemplatesIndexPath();
|
|
234343
|
+
const parsed = await readJsonFile(indexPath);
|
|
234319
234344
|
const result = TemplatesConfigSchema.safeParse(parsed);
|
|
234320
234345
|
if (!result.success) {
|
|
234321
|
-
throw new SchemaValidationError("Invalid templates configuration", result.error,
|
|
234346
|
+
throw new SchemaValidationError("Invalid templates configuration", result.error, indexPath);
|
|
234322
234347
|
}
|
|
234323
234348
|
return result.data.templates;
|
|
234324
234349
|
}
|
|
@@ -234335,7 +234360,7 @@ async function renderTemplate(template, destPath, data) {
|
|
|
234335
234360
|
if (file2.endsWith(".ejs")) {
|
|
234336
234361
|
const rendered = await import_ejs.default.renderFile(srcPath, data);
|
|
234337
234362
|
const { attributes, body } = import_front_matter.default(rendered);
|
|
234338
|
-
const destFile = attributes.outputFileName ? join8(
|
|
234363
|
+
const destFile = attributes.outputFileName ? join8(dirname6(file2), attributes.outputFileName) : file2.replace(/\.ejs$/, "");
|
|
234339
234364
|
const destFilePath = join8(destPath, destFile);
|
|
234340
234365
|
await writeFile(destFilePath, body);
|
|
234341
234366
|
} else {
|
|
@@ -234363,11 +234388,7 @@ async function createProjectFiles(options) {
|
|
|
234363
234388
|
const { name: name2, description, path: basePath, template } = options;
|
|
234364
234389
|
await assertProjectNotExists(basePath);
|
|
234365
234390
|
const { projectId } = await createProject(name2, description);
|
|
234366
|
-
await renderTemplate(template, basePath, {
|
|
234367
|
-
name: name2,
|
|
234368
|
-
description,
|
|
234369
|
-
projectId
|
|
234370
|
-
});
|
|
234391
|
+
await renderTemplate(template, basePath, { name: name2, description, projectId });
|
|
234371
234392
|
return {
|
|
234372
234393
|
projectId,
|
|
234373
234394
|
projectDir: basePath
|
|
@@ -235539,7 +235560,7 @@ function isPlainObject2(value) {
|
|
|
235539
235560
|
}
|
|
235540
235561
|
|
|
235541
235562
|
// node_modules/execa/lib/arguments/file-url.js
|
|
235542
|
-
import { fileURLToPath as
|
|
235563
|
+
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
235543
235564
|
var safeNormalizeFileUrl = (file2, name2) => {
|
|
235544
235565
|
const fileString = normalizeFileUrl(normalizeDenoExecPath(file2));
|
|
235545
235566
|
if (typeof fileString !== "string") {
|
|
@@ -235549,7 +235570,7 @@ var safeNormalizeFileUrl = (file2, name2) => {
|
|
|
235549
235570
|
};
|
|
235550
235571
|
var normalizeDenoExecPath = (file2) => isDenoExecPath(file2) ? file2.toString() : file2;
|
|
235551
235572
|
var isDenoExecPath = (file2) => typeof file2 !== "string" && file2 && Object.getPrototypeOf(file2) === String.prototype;
|
|
235552
|
-
var normalizeFileUrl = (file2) => file2 instanceof URL ?
|
|
235573
|
+
var normalizeFileUrl = (file2) => file2 instanceof URL ? fileURLToPath2(file2) : file2;
|
|
235553
235574
|
|
|
235554
235575
|
// node_modules/execa/lib/methods/parameters.js
|
|
235555
235576
|
var normalizeParameters = (rawFile, rawArguments = [], rawOptions = {}) => {
|
|
@@ -236403,10 +236424,10 @@ function pathKey(options = {}) {
|
|
|
236403
236424
|
import { promisify as promisify3 } from "node:util";
|
|
236404
236425
|
import { execFile as execFileCallback2, execFileSync as execFileSyncOriginal2 } from "node:child_process";
|
|
236405
236426
|
import path11 from "node:path";
|
|
236406
|
-
import { fileURLToPath as
|
|
236427
|
+
import { fileURLToPath as fileURLToPath3 } from "node:url";
|
|
236407
236428
|
var execFileOriginal2 = promisify3(execFileCallback2);
|
|
236408
236429
|
function toPath2(urlOrPath) {
|
|
236409
|
-
return urlOrPath instanceof URL ?
|
|
236430
|
+
return urlOrPath instanceof URL ? fileURLToPath3(urlOrPath) : urlOrPath;
|
|
236410
236431
|
}
|
|
236411
236432
|
function traversePathUp(startPath) {
|
|
236412
236433
|
return {
|
|
@@ -242024,95 +242045,6 @@ var {
|
|
|
242024
242045
|
getEachMessage: getEachMessage2,
|
|
242025
242046
|
getCancelSignal: getCancelSignal2
|
|
242026
242047
|
} = getIpcExport();
|
|
242027
|
-
// package.json
|
|
242028
|
-
var package_default = {
|
|
242029
|
-
name: "base44",
|
|
242030
|
-
version: "0.0.38",
|
|
242031
|
-
description: "Base44 CLI - Unified interface for managing Base44 applications",
|
|
242032
|
-
type: "module",
|
|
242033
|
-
bin: {
|
|
242034
|
-
base44: "./bin/run.js"
|
|
242035
|
-
},
|
|
242036
|
-
files: [
|
|
242037
|
-
"dist",
|
|
242038
|
-
"bin"
|
|
242039
|
-
],
|
|
242040
|
-
scripts: {
|
|
242041
|
-
build: "bun run clean && cp -r templates dist/ && bun run infra/build.ts",
|
|
242042
|
-
"build:watch": "bun run clean && cp -r templates dist/ && bun run infra/build.ts --watch",
|
|
242043
|
-
typecheck: "tsc --noEmit",
|
|
242044
|
-
dev: "./bin/dev.ts",
|
|
242045
|
-
start: "./bin/run.js",
|
|
242046
|
-
clean: "rm -rf dist && mkdir -p dist",
|
|
242047
|
-
lint: "biome check src tests",
|
|
242048
|
-
"lint:fix": "biome check --write src tests",
|
|
242049
|
-
test: "vitest run",
|
|
242050
|
-
"test:watch": "vitest",
|
|
242051
|
-
knip: "knip",
|
|
242052
|
-
"knip:fix": "knip --fix"
|
|
242053
|
-
},
|
|
242054
|
-
keywords: [
|
|
242055
|
-
"base44",
|
|
242056
|
-
"cli",
|
|
242057
|
-
"command-line"
|
|
242058
|
-
],
|
|
242059
|
-
author: "",
|
|
242060
|
-
license: "MIT",
|
|
242061
|
-
repository: {
|
|
242062
|
-
type: "git",
|
|
242063
|
-
url: "https://github.com/base44/cli"
|
|
242064
|
-
},
|
|
242065
|
-
devDependencies: {
|
|
242066
|
-
"@biomejs/biome": "^2.0.0",
|
|
242067
|
-
"@clack/prompts": "^1.0.1",
|
|
242068
|
-
"@seald-io/nedb": "^4.1.2",
|
|
242069
|
-
"@types/bun": "^1.2.15",
|
|
242070
|
-
"@types/common-tags": "^1.8.4",
|
|
242071
|
-
"@types/cors": "^2.8.19",
|
|
242072
|
-
"@types/deno": "^2.5.0",
|
|
242073
|
-
"@types/ejs": "^3.1.5",
|
|
242074
|
-
"@types/express": "^5.0.6",
|
|
242075
|
-
"@types/json-schema": "^7.0.15",
|
|
242076
|
-
"@types/lodash": "^4.17.24",
|
|
242077
|
-
"@types/multer": "^2.0.0",
|
|
242078
|
-
"@types/node": "^22.10.5",
|
|
242079
|
-
"@vercel/detect-agent": "^1.1.0",
|
|
242080
|
-
chalk: "^5.6.2",
|
|
242081
|
-
chokidar: "^5.0.0",
|
|
242082
|
-
commander: "^12.1.0",
|
|
242083
|
-
"common-tags": "^1.8.2",
|
|
242084
|
-
cors: "^2.8.5",
|
|
242085
|
-
dotenv: "17.3.1",
|
|
242086
|
-
ejs: "^3.1.10",
|
|
242087
|
-
execa: "^9.6.1",
|
|
242088
|
-
express: "^5.0.1",
|
|
242089
|
-
"front-matter": "^4.0.2",
|
|
242090
|
-
"get-port": "^7.1.0",
|
|
242091
|
-
globby: "^16.1.0",
|
|
242092
|
-
"http-proxy-middleware": "^3.0.5",
|
|
242093
|
-
"json-schema-to-typescript": "^15.0.4",
|
|
242094
|
-
json5: "^2.2.3",
|
|
242095
|
-
knip: "^5.83.1",
|
|
242096
|
-
ky: "^1.14.2",
|
|
242097
|
-
lodash: "^4.17.23",
|
|
242098
|
-
msw: "^2.12.10",
|
|
242099
|
-
multer: "^2.0.0",
|
|
242100
|
-
nanoid: "^5.1.6",
|
|
242101
|
-
open: "^11.0.0",
|
|
242102
|
-
"p-wait-for": "^6.0.0",
|
|
242103
|
-
"posthog-node": "5.21.2",
|
|
242104
|
-
"socket.io": "^4.8.3",
|
|
242105
|
-
"strip-ansi": "^7.1.2",
|
|
242106
|
-
tar: "^7.5.4",
|
|
242107
|
-
"tmp-promise": "^3.0.3",
|
|
242108
|
-
typescript: "^5.7.2",
|
|
242109
|
-
vitest: "^4.0.16",
|
|
242110
|
-
zod: "^4.3.5"
|
|
242111
|
-
},
|
|
242112
|
-
engines: {
|
|
242113
|
-
node: ">=20.19.0"
|
|
242114
|
-
}
|
|
242115
|
-
};
|
|
242116
242048
|
|
|
242117
242049
|
// src/cli/utils/version-check.ts
|
|
242118
242050
|
async function checkForUpgrade() {
|
|
@@ -242236,7 +242168,7 @@ function getDashboardUrl(projectId) {
|
|
|
242236
242168
|
// src/cli/commands/agents/pull.ts
|
|
242237
242169
|
async function pullAgentsAction() {
|
|
242238
242170
|
const { project: project2 } = await readProjectConfig();
|
|
242239
|
-
const configDir =
|
|
242171
|
+
const configDir = dirname7(project2.configPath);
|
|
242240
242172
|
const agentsDir = join10(configDir, project2.agentsDir);
|
|
242241
242173
|
const remoteAgents = await runTask("Fetching agents from Base44", async () => {
|
|
242242
242174
|
return await fetchAgents();
|
|
@@ -242331,10 +242263,10 @@ function getWhoamiCommand(context) {
|
|
|
242331
242263
|
}
|
|
242332
242264
|
|
|
242333
242265
|
// src/cli/commands/connectors/pull.ts
|
|
242334
|
-
import { dirname as
|
|
242266
|
+
import { dirname as dirname8, join as join11 } from "node:path";
|
|
242335
242267
|
async function pullConnectorsAction() {
|
|
242336
242268
|
const { project: project2 } = await readProjectConfig();
|
|
242337
|
-
const configDir =
|
|
242269
|
+
const configDir = dirname8(project2.configPath);
|
|
242338
242270
|
const connectorsDir = join11(configDir, project2.connectorsDir);
|
|
242339
242271
|
const remoteConnectors = await runTask("Fetching connectors from Base44", async () => {
|
|
242340
242272
|
return await listConnectors();
|
|
@@ -242370,7 +242302,7 @@ function getConnectorsPullCommand(context) {
|
|
|
242370
242302
|
// node_modules/open/index.js
|
|
242371
242303
|
import process20 from "node:process";
|
|
242372
242304
|
import path16 from "node:path";
|
|
242373
|
-
import { fileURLToPath as
|
|
242305
|
+
import { fileURLToPath as fileURLToPath4 } from "node:url";
|
|
242374
242306
|
import childProcess3 from "node:child_process";
|
|
242375
242307
|
import fs19, { constants as fsConstants2 } from "node:fs/promises";
|
|
242376
242308
|
|
|
@@ -242696,8 +242628,8 @@ var is_in_ssh_default = isInSsh;
|
|
|
242696
242628
|
|
|
242697
242629
|
// node_modules/open/index.js
|
|
242698
242630
|
var fallbackAttemptSymbol = Symbol("fallbackAttempt");
|
|
242699
|
-
var
|
|
242700
|
-
var localXdgOpenPath = path16.join(
|
|
242631
|
+
var __dirname2 = import.meta.url ? path16.dirname(fileURLToPath4(import.meta.url)) : "";
|
|
242632
|
+
var localXdgOpenPath = path16.join(__dirname2, "xdg-open");
|
|
242701
242633
|
var { platform: platform6, arch } = process20;
|
|
242702
242634
|
var tryEachApp = async (apps, opener) => {
|
|
242703
242635
|
if (apps.length === 0) {
|
|
@@ -242841,7 +242773,7 @@ var baseOpen = async (options) => {
|
|
|
242841
242773
|
if (app) {
|
|
242842
242774
|
command = app;
|
|
242843
242775
|
} else {
|
|
242844
|
-
const isBundled = !
|
|
242776
|
+
const isBundled = !__dirname2 || __dirname2 === "/";
|
|
242845
242777
|
let exeLocalXdgOpen = false;
|
|
242846
242778
|
try {
|
|
242847
242779
|
await fs19.access(localXdgOpenPath, fsConstants2.X_OK);
|
|
@@ -243215,63 +243147,14 @@ async function deployFunctionsAction() {
|
|
|
243215
243147
|
}
|
|
243216
243148
|
return { outroMessage: "Functions deployed to Base44" };
|
|
243217
243149
|
}
|
|
243218
|
-
function
|
|
243219
|
-
return new Command("deploy").description("Deploy local functions to Base44").action(async () => {
|
|
243150
|
+
function getFunctionsDeployCommand(context) {
|
|
243151
|
+
return new Command("functions").description("Manage project functions").addCommand(new Command("deploy").description("Deploy local functions to Base44").action(async () => {
|
|
243220
243152
|
await runCommand(deployFunctionsAction, { requireAuth: true }, context);
|
|
243221
|
-
});
|
|
243222
|
-
}
|
|
243223
|
-
|
|
243224
|
-
// src/cli/commands/functions/pull.ts
|
|
243225
|
-
import { dirname as dirname10, join as join12 } from "node:path";
|
|
243226
|
-
async function pullFunctionsAction(name2) {
|
|
243227
|
-
const { project: project2 } = await readProjectConfig();
|
|
243228
|
-
const configDir = dirname10(project2.configPath);
|
|
243229
|
-
const functionsDir = join12(configDir, project2.functionsDir);
|
|
243230
|
-
const remoteFunctions = await runTask("Fetching functions from Base44", async () => {
|
|
243231
|
-
const { functions } = await listDeployedFunctions();
|
|
243232
|
-
return functions;
|
|
243233
|
-
}, {
|
|
243234
|
-
successMessage: "Functions fetched successfully",
|
|
243235
|
-
errorMessage: "Failed to fetch functions"
|
|
243236
|
-
});
|
|
243237
|
-
const toPull = name2 ? remoteFunctions.filter((f) => f.name === name2) : remoteFunctions;
|
|
243238
|
-
if (name2 && toPull.length === 0) {
|
|
243239
|
-
return {
|
|
243240
|
-
outroMessage: `Function "${name2}" not found on remote`
|
|
243241
|
-
};
|
|
243242
|
-
}
|
|
243243
|
-
if (toPull.length === 0) {
|
|
243244
|
-
return { outroMessage: "No functions found on remote" };
|
|
243245
|
-
}
|
|
243246
|
-
const { written, skipped } = await runTask("Writing function files", async () => {
|
|
243247
|
-
return await writeFunctions(functionsDir, toPull);
|
|
243248
|
-
}, {
|
|
243249
|
-
successMessage: "Function files written successfully",
|
|
243250
|
-
errorMessage: "Failed to write function files"
|
|
243251
|
-
});
|
|
243252
|
-
for (const name3 of written) {
|
|
243253
|
-
R2.success(`${name3.padEnd(25)} written`);
|
|
243254
|
-
}
|
|
243255
|
-
for (const name3 of skipped) {
|
|
243256
|
-
R2.info(`${name3.padEnd(25)} unchanged`);
|
|
243257
|
-
}
|
|
243258
|
-
return {
|
|
243259
|
-
outroMessage: `Pulled ${toPull.length} function${toPull.length !== 1 ? "s" : ""} to ${functionsDir}`
|
|
243260
|
-
};
|
|
243261
|
-
}
|
|
243262
|
-
function getPullCommand(context) {
|
|
243263
|
-
return new Command("pull").description("Pull deployed functions from Base44").argument("[name]", "Pull a single function by name").action(async (name2) => {
|
|
243264
|
-
await runCommand(() => pullFunctionsAction(name2), { requireAuth: true }, context);
|
|
243265
|
-
});
|
|
243266
|
-
}
|
|
243267
|
-
|
|
243268
|
-
// src/cli/commands/functions/index.ts
|
|
243269
|
-
function getFunctionsCommand(context) {
|
|
243270
|
-
return new Command("functions").description("Manage backend functions").addCommand(getDeployCommand(context)).addCommand(getPullCommand(context));
|
|
243153
|
+
}));
|
|
243271
243154
|
}
|
|
243272
243155
|
|
|
243273
243156
|
// src/cli/commands/project/create.ts
|
|
243274
|
-
import { basename as basename3, join as
|
|
243157
|
+
import { basename as basename3, join as join12, resolve as resolve2 } from "node:path";
|
|
243275
243158
|
var import_kebabCase = __toESM(require_kebabCase(), 1);
|
|
243276
243159
|
var DEFAULT_TEMPLATE_ID = "backend-only";
|
|
243277
243160
|
async function getTemplateById(templateId) {
|
|
@@ -243407,7 +243290,7 @@ async function executeCreate({
|
|
|
243407
243290
|
updateMessage("Building project...");
|
|
243408
243291
|
await execa({ cwd: resolvedPath, shell: true })`${buildCommand}`;
|
|
243409
243292
|
updateMessage("Deploying site...");
|
|
243410
|
-
return await deploySite(
|
|
243293
|
+
return await deploySite(join12(resolvedPath, outputDirectory));
|
|
243411
243294
|
}, {
|
|
243412
243295
|
successMessage: theme.colors.base44Orange("Site deployed successfully"),
|
|
243413
243296
|
errorMessage: "Failed to deploy site"
|
|
@@ -243509,7 +243392,7 @@ ${summaryLines.join(`
|
|
|
243509
243392
|
}
|
|
243510
243393
|
return { outroMessage: "App deployed successfully" };
|
|
243511
243394
|
}
|
|
243512
|
-
function
|
|
243395
|
+
function getDeployCommand(context) {
|
|
243513
243396
|
return new Command("deploy").description("Deploy all project resources (entities, functions, agents, connectors, and site)").option("-y, --yes", "Skip confirmation prompt").action(async (options) => {
|
|
243514
243397
|
await runCommand(() => deployAction({
|
|
243515
243398
|
...options,
|
|
@@ -244033,10 +243916,10 @@ function toPascalCase(name2) {
|
|
|
244033
243916
|
return name2.split(/[-_\s]+/).map((w8) => w8.charAt(0).toUpperCase() + w8.slice(1)).join("");
|
|
244034
243917
|
}
|
|
244035
243918
|
// src/core/types/update-project.ts
|
|
244036
|
-
import { join as
|
|
243919
|
+
import { join as join15 } from "node:path";
|
|
244037
243920
|
var TYPES_INCLUDE_PATH = `${PROJECT_SUBDIR}/${TYPES_OUTPUT_SUBDIR}/*.d.ts`;
|
|
244038
243921
|
async function updateProjectConfig(projectRoot) {
|
|
244039
|
-
const tsconfigPath =
|
|
243922
|
+
const tsconfigPath = join15(projectRoot, "tsconfig.json");
|
|
244040
243923
|
if (!await pathExists(tsconfigPath)) {
|
|
244041
243924
|
return false;
|
|
244042
243925
|
}
|
|
@@ -244079,7 +243962,7 @@ function getTypesCommand(context) {
|
|
|
244079
243962
|
}
|
|
244080
243963
|
|
|
244081
243964
|
// src/cli/dev/dev-server/main.ts
|
|
244082
|
-
import { dirname as
|
|
243965
|
+
import { dirname as dirname13, join as join18 } from "node:path";
|
|
244083
243966
|
var import_cors = __toESM(require_lib4(), 1);
|
|
244084
243967
|
var import_express4 = __toESM(require_express(), 1);
|
|
244085
243968
|
|
|
@@ -244238,10 +244121,6 @@ function createDevLogger() {
|
|
|
244238
244121
|
|
|
244239
244122
|
// src/cli/dev/dev-server/function-manager.ts
|
|
244240
244123
|
import { spawn as spawn2, spawnSync as spawnSync2 } from "node:child_process";
|
|
244241
|
-
import { dirname as dirname13, join as join17 } from "node:path";
|
|
244242
|
-
import { fileURLToPath as fileURLToPath7 } from "node:url";
|
|
244243
|
-
var __dirname5 = dirname13(fileURLToPath7(import.meta.url));
|
|
244244
|
-
var WRAPPER_PATH = join17(__dirname5, "../deno-runtime/main.js");
|
|
244245
244124
|
var READY_TIMEOUT = 30000;
|
|
244246
244125
|
|
|
244247
244126
|
class FunctionManager {
|
|
@@ -244249,9 +244128,11 @@ class FunctionManager {
|
|
|
244249
244128
|
running = new Map;
|
|
244250
244129
|
starting = new Map;
|
|
244251
244130
|
logger;
|
|
244252
|
-
|
|
244131
|
+
wrapperPath;
|
|
244132
|
+
constructor(functions, logger, wrapperPath) {
|
|
244253
244133
|
this.functions = new Map(functions.map((f7) => [f7.name, f7]));
|
|
244254
244134
|
this.logger = logger;
|
|
244135
|
+
this.wrapperPath = wrapperPath;
|
|
244255
244136
|
if (functions.length > 0) {
|
|
244256
244137
|
this.verifyDenoIsInstalled();
|
|
244257
244138
|
}
|
|
@@ -244324,7 +244205,7 @@ class FunctionManager {
|
|
|
244324
244205
|
}
|
|
244325
244206
|
spawnFunction(func, port) {
|
|
244326
244207
|
this.logger.log(`Spawning function "${func.name}" on port ${port}`);
|
|
244327
|
-
const process21 = spawn2("deno", ["run", "--allow-all",
|
|
244208
|
+
const process21 = spawn2("deno", ["run", "--allow-all", this.wrapperPath], {
|
|
244328
244209
|
env: {
|
|
244329
244210
|
...globalThis.process.env,
|
|
244330
244211
|
FUNCTION_PATH: func.entryPath,
|
|
@@ -245545,9 +245426,9 @@ class NodeFsHandler {
|
|
|
245545
245426
|
if (this.fsw.closed) {
|
|
245546
245427
|
return;
|
|
245547
245428
|
}
|
|
245548
|
-
const
|
|
245429
|
+
const dirname12 = sp2.dirname(file2);
|
|
245549
245430
|
const basename5 = sp2.basename(file2);
|
|
245550
|
-
const parent = this.fsw._getWatchedDir(
|
|
245431
|
+
const parent = this.fsw._getWatchedDir(dirname12);
|
|
245551
245432
|
let prevStats = stats;
|
|
245552
245433
|
if (parent.has(basename5))
|
|
245553
245434
|
return;
|
|
@@ -245574,7 +245455,7 @@ class NodeFsHandler {
|
|
|
245574
245455
|
prevStats = newStats2;
|
|
245575
245456
|
}
|
|
245576
245457
|
} catch (error48) {
|
|
245577
|
-
this.fsw._remove(
|
|
245458
|
+
this.fsw._remove(dirname12, basename5);
|
|
245578
245459
|
}
|
|
245579
245460
|
} else if (parent.has(basename5)) {
|
|
245580
245461
|
const at13 = newStats.atimeMs;
|
|
@@ -246535,7 +246416,7 @@ async function createDevServer(options8) {
|
|
|
246535
246416
|
next();
|
|
246536
246417
|
});
|
|
246537
246418
|
const devLogger = createDevLogger();
|
|
246538
|
-
const functionManager = new FunctionManager(functions, devLogger);
|
|
246419
|
+
const functionManager = new FunctionManager(functions, devLogger, options8.denoWrapperPath);
|
|
246539
246420
|
const functionRoutes = createFunctionRouter(functionManager, devLogger);
|
|
246540
246421
|
app.use("/api/apps/:appId/functions", functionRoutes);
|
|
246541
246422
|
if (functionManager.getFunctionNames().length > 0) {
|
|
@@ -246577,8 +246458,8 @@ async function createDevServer(options8) {
|
|
|
246577
246458
|
broadcastEntityEvent(io6, appId, entityName, event);
|
|
246578
246459
|
};
|
|
246579
246460
|
const base44ConfigWatcher = new WatchBase44({
|
|
246580
|
-
functions:
|
|
246581
|
-
entities:
|
|
246461
|
+
functions: join18(dirname13(project2.configPath), project2.functionsDir),
|
|
246462
|
+
entities: join18(dirname13(project2.configPath), project2.entitiesDir)
|
|
246582
246463
|
}, devLogger);
|
|
246583
246464
|
base44ConfigWatcher.on("change", async (name2) => {
|
|
246584
246465
|
try {
|
|
@@ -246626,6 +246507,7 @@ async function devAction(options8) {
|
|
|
246626
246507
|
const port = options8.port ? Number(options8.port) : undefined;
|
|
246627
246508
|
const { port: resolvedPort } = await createDevServer({
|
|
246628
246509
|
port,
|
|
246510
|
+
denoWrapperPath: getDenoWrapperPath(),
|
|
246629
246511
|
loadResources: async () => {
|
|
246630
246512
|
const { functions, entities, project: project2 } = await readProjectConfig();
|
|
246631
246513
|
return { functions, entities, project: project2 };
|
|
@@ -246747,13 +246629,13 @@ function createProgram(context) {
|
|
|
246747
246629
|
program2.addCommand(getLogoutCommand(context));
|
|
246748
246630
|
program2.addCommand(getCreateCommand(context));
|
|
246749
246631
|
program2.addCommand(getDashboardCommand(context));
|
|
246750
|
-
program2.addCommand(
|
|
246632
|
+
program2.addCommand(getDeployCommand(context));
|
|
246751
246633
|
program2.addCommand(getLinkCommand(context));
|
|
246752
246634
|
program2.addCommand(getEjectCommand(context));
|
|
246753
246635
|
program2.addCommand(getEntitiesPushCommand(context));
|
|
246754
246636
|
program2.addCommand(getAgentsCommand(context));
|
|
246755
246637
|
program2.addCommand(getConnectorsCommand(context));
|
|
246756
|
-
program2.addCommand(
|
|
246638
|
+
program2.addCommand(getFunctionsDeployCommand(context));
|
|
246757
246639
|
program2.addCommand(getSecretsCommand(context));
|
|
246758
246640
|
program2.addCommand(getSiteCommand(context));
|
|
246759
246641
|
program2.addCommand(getTypesCommand(context));
|
|
@@ -246767,7 +246649,7 @@ var import_detect_agent = __toESM(require_dist5(), 1);
|
|
|
246767
246649
|
import { release, type } from "node:os";
|
|
246768
246650
|
|
|
246769
246651
|
// node_modules/posthog-node/dist/extensions/error-tracking/modifiers/module.node.mjs
|
|
246770
|
-
import { dirname as
|
|
246652
|
+
import { dirname as dirname14, posix, sep } from "path";
|
|
246771
246653
|
function createModulerModifier() {
|
|
246772
246654
|
const getModuleFromFileName = createGetModuleFromFilename();
|
|
246773
246655
|
return async (frames) => {
|
|
@@ -246776,7 +246658,7 @@ function createModulerModifier() {
|
|
|
246776
246658
|
return frames;
|
|
246777
246659
|
};
|
|
246778
246660
|
}
|
|
246779
|
-
function createGetModuleFromFilename(basePath = process.argv[1] ?
|
|
246661
|
+
function createGetModuleFromFilename(basePath = process.argv[1] ? dirname14(process.argv[1]) : process.cwd(), isWindows5 = sep === "\\") {
|
|
246780
246662
|
const normalizedBase = isWindows5 ? normalizeWindowsPath2(basePath) : basePath;
|
|
246781
246663
|
return (filename) => {
|
|
246782
246664
|
if (!filename)
|
|
@@ -250965,11 +250847,16 @@ function addCommandInfoToErrorReporter(program2, errorReporter) {
|
|
|
250965
250847
|
});
|
|
250966
250848
|
}
|
|
250967
250849
|
// src/cli/index.ts
|
|
250850
|
+
var __dirname4 = dirname15(fileURLToPath6(import.meta.url));
|
|
250968
250851
|
async function runCLI() {
|
|
250852
|
+
ensureNpmAssets(join19(__dirname4, "../assets"));
|
|
250969
250853
|
const errorReporter = new ErrorReporter;
|
|
250970
250854
|
errorReporter.registerProcessErrorHandlers();
|
|
250971
250855
|
const isNonInteractive = !process.stdin.isTTY || !process.stdout.isTTY;
|
|
250972
|
-
const context = {
|
|
250856
|
+
const context = {
|
|
250857
|
+
errorReporter,
|
|
250858
|
+
isNonInteractive
|
|
250859
|
+
};
|
|
250973
250860
|
const program2 = createProgram(context);
|
|
250974
250861
|
try {
|
|
250975
250862
|
const userInfo = await readAuth();
|
|
@@ -250994,4 +250881,4 @@ export {
|
|
|
250994
250881
|
CLIExitError
|
|
250995
250882
|
};
|
|
250996
250883
|
|
|
250997
|
-
//# debugId=
|
|
250884
|
+
//# debugId=9E9726773409F01264756E2164756E21
|