js-bao 0.2.11 → 0.2.12

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.
Files changed (67) hide show
  1. package/README.md +174 -0
  2. package/dist/BaseModel-5YQCROYE.js +17 -0
  3. package/dist/BaseModel-5YQCROYE.js.map +1 -0
  4. package/dist/BaseModel-FCNWDJBH.js +17 -0
  5. package/dist/BaseModel-FCNWDJBH.js.map +1 -0
  6. package/dist/BrowserDatabaseFactory-PXOTK2DQ.js +119 -0
  7. package/dist/BrowserDatabaseFactory-PXOTK2DQ.js.map +1 -0
  8. package/dist/BrowserDatabaseFactory-WD4VX2VZ.js +119 -0
  9. package/dist/BrowserDatabaseFactory-WD4VX2VZ.js.map +1 -0
  10. package/dist/IncludeResolver-RCKQGNPZ.js +385 -0
  11. package/dist/IncludeResolver-RCKQGNPZ.js.map +1 -0
  12. package/dist/IncludeResolver-WGSQDMS7.js +385 -0
  13. package/dist/IncludeResolver-WGSQDMS7.js.map +1 -0
  14. package/dist/NodeDatabaseFactory-J4Z36UF3.js +165 -0
  15. package/dist/NodeDatabaseFactory-J4Z36UF3.js.map +1 -0
  16. package/dist/NodeDatabaseFactory-QIEKAXBM.js +10 -0
  17. package/dist/NodeDatabaseFactory-QIEKAXBM.js.map +1 -0
  18. package/dist/NodeSqliteEngine-HJSAYE4E.js +383 -0
  19. package/dist/NodeSqliteEngine-HJSAYE4E.js.map +1 -0
  20. package/dist/NodeSqliteEngine-I5SLWLME.js +383 -0
  21. package/dist/NodeSqliteEngine-I5SLWLME.js.map +1 -0
  22. package/dist/browser.cjs +3779 -3370
  23. package/dist/browser.d.cts +18 -1
  24. package/dist/browser.d.ts +18 -1
  25. package/dist/browser.js +3750 -3341
  26. package/dist/chunk-3PZWHUZO.js +4153 -0
  27. package/dist/chunk-3PZWHUZO.js.map +1 -0
  28. package/dist/chunk-53MS4MN7.js +373 -0
  29. package/dist/chunk-53MS4MN7.js.map +1 -0
  30. package/dist/chunk-65G2P4GL.js +709 -0
  31. package/dist/chunk-65G2P4GL.js.map +1 -0
  32. package/dist/chunk-6UX3YSCW.js +4151 -0
  33. package/dist/chunk-6UX3YSCW.js.map +1 -0
  34. package/dist/chunk-DANSD6BE.js +709 -0
  35. package/dist/chunk-DANSD6BE.js.map +1 -0
  36. package/dist/chunk-DF3JEQXA.js +373 -0
  37. package/dist/chunk-DF3JEQXA.js.map +1 -0
  38. package/dist/chunk-GO3APTPX.js +61 -0
  39. package/dist/chunk-GO3APTPX.js.map +1 -0
  40. package/dist/chunk-ID4U6IQC.js +53 -0
  41. package/dist/chunk-ID4U6IQC.js.map +1 -0
  42. package/dist/chunk-RQVS3LVL.js +165 -0
  43. package/dist/chunk-RQVS3LVL.js.map +1 -0
  44. package/dist/client.cjs +837 -0
  45. package/dist/client.d.cts +1101 -0
  46. package/dist/client.d.ts +1101 -0
  47. package/dist/client.js +806 -0
  48. package/dist/cloudflare-do.cjs +3637 -0
  49. package/dist/cloudflare-do.d.cts +1366 -0
  50. package/dist/cloudflare-do.d.ts +1366 -0
  51. package/dist/cloudflare-do.js +3614 -0
  52. package/dist/cloudflare.cjs +1048 -0
  53. package/dist/cloudflare.d.cts +1381 -0
  54. package/dist/cloudflare.d.ts +1381 -0
  55. package/dist/cloudflare.js +1017 -0
  56. package/dist/codegen.cjs +260 -19
  57. package/dist/environment-TOTQICSE.js +17 -0
  58. package/dist/environment-TOTQICSE.js.map +1 -0
  59. package/dist/index.cjs +1905 -1492
  60. package/dist/index.d.cts +19 -2
  61. package/dist/index.d.ts +19 -2
  62. package/dist/index.js +1870 -1457
  63. package/dist/node.cjs +4779 -4366
  64. package/dist/node.d.cts +18 -1
  65. package/dist/node.d.ts +18 -1
  66. package/dist/node.js +4758 -4345
  67. package/package.json +42 -13
package/dist/codegen.cjs CHANGED
@@ -1004,10 +1004,192 @@ ${methods.map((method) => ` ${method}`).join("\n")}
1004
1004
  }
1005
1005
  };
1006
1006
 
1007
+ // src/cli/extractors/SchemaExtractor.ts
1008
+ var ts2 = __toESM(require("typescript"), 1);
1009
+ var SchemaExtractor = class {
1010
+ program;
1011
+ verbose;
1012
+ constructor(filePaths, verbose = false) {
1013
+ this.verbose = verbose;
1014
+ this.program = ts2.createProgram(filePaths, {
1015
+ target: ts2.ScriptTarget.ES2020,
1016
+ module: ts2.ModuleKind.CommonJS,
1017
+ allowJs: false,
1018
+ declaration: true,
1019
+ esModuleInterop: true,
1020
+ skipLibCheck: true
1021
+ });
1022
+ }
1023
+ /**
1024
+ * Extract all schemas from model files
1025
+ */
1026
+ async extractSchemas() {
1027
+ const schemas = [];
1028
+ for (const sourceFile of this.program.getSourceFiles()) {
1029
+ if (sourceFile.isDeclarationFile) continue;
1030
+ const fileSchemas = this.extractFromFile(sourceFile);
1031
+ schemas.push(...fileSchemas);
1032
+ }
1033
+ return schemas;
1034
+ }
1035
+ /**
1036
+ * Generate schema output in the format expected by registerSchema
1037
+ */
1038
+ async generateSchemaOutput() {
1039
+ const schemas = await this.extractSchemas();
1040
+ const output = { models: {} };
1041
+ for (const schema of schemas) {
1042
+ output.models[schema.modelName] = {
1043
+ fields: schema.fields
1044
+ };
1045
+ }
1046
+ return output;
1047
+ }
1048
+ /**
1049
+ * Extract schemas from a single file
1050
+ */
1051
+ extractFromFile(sourceFile) {
1052
+ const schemas = [];
1053
+ const visit = (node) => {
1054
+ if (ts2.isVariableStatement(node) && node.declarationList.declarations.length > 0) {
1055
+ for (const declaration of node.declarationList.declarations) {
1056
+ if (declaration.initializer && ts2.isCallExpression(declaration.initializer) && ts2.isIdentifier(declaration.initializer.expression) && declaration.initializer.expression.text === "defineModelSchema" && declaration.initializer.arguments.length > 0) {
1057
+ const arg = declaration.initializer.arguments[0];
1058
+ if (ts2.isObjectLiteralExpression(arg)) {
1059
+ const schema = this.parseDefineModelSchema(arg);
1060
+ if (schema) {
1061
+ Logger.verbose(
1062
+ `Extracted schema for model: ${schema.modelName}`,
1063
+ "SchemaExtractor"
1064
+ );
1065
+ schemas.push(schema);
1066
+ }
1067
+ }
1068
+ }
1069
+ }
1070
+ }
1071
+ ts2.forEachChild(node, visit);
1072
+ };
1073
+ visit(sourceFile);
1074
+ return schemas;
1075
+ }
1076
+ /**
1077
+ * Parse defineModelSchema argument
1078
+ */
1079
+ parseDefineModelSchema(obj) {
1080
+ let modelName = null;
1081
+ let fields = {};
1082
+ for (const property of obj.properties) {
1083
+ if (ts2.isPropertyAssignment(property) && ts2.isIdentifier(property.name)) {
1084
+ const propName = property.name.text;
1085
+ if (propName === "name" && ts2.isStringLiteral(property.initializer)) {
1086
+ modelName = property.initializer.text;
1087
+ } else if (propName === "fields" && ts2.isObjectLiteralExpression(property.initializer)) {
1088
+ fields = this.parseFields(property.initializer);
1089
+ }
1090
+ }
1091
+ }
1092
+ return modelName ? { modelName, fields } : null;
1093
+ }
1094
+ /**
1095
+ * Parse fields object
1096
+ */
1097
+ parseFields(obj) {
1098
+ const fields = {};
1099
+ for (const property of obj.properties) {
1100
+ if (ts2.isPropertyAssignment(property) && ts2.isIdentifier(property.name)) {
1101
+ const fieldName = property.name.text;
1102
+ if (ts2.isObjectLiteralExpression(property.initializer)) {
1103
+ const fieldDef = this.parseFieldDefinition(property.initializer);
1104
+ if (fieldDef) {
1105
+ fields[fieldName] = fieldDef;
1106
+ }
1107
+ }
1108
+ }
1109
+ }
1110
+ return fields;
1111
+ }
1112
+ /**
1113
+ * Parse individual field definition
1114
+ */
1115
+ parseFieldDefinition(obj) {
1116
+ const fieldDef = { type: "string" };
1117
+ for (const property of obj.properties) {
1118
+ if (ts2.isPropertyAssignment(property) && ts2.isIdentifier(property.name)) {
1119
+ const propName = property.name.text;
1120
+ const value = this.parsePropertyValue(property.initializer);
1121
+ switch (propName) {
1122
+ case "type":
1123
+ if (typeof value === "string") {
1124
+ fieldDef.type = value;
1125
+ }
1126
+ break;
1127
+ case "indexed":
1128
+ if (typeof value === "boolean") {
1129
+ fieldDef.indexed = value;
1130
+ }
1131
+ break;
1132
+ case "unique":
1133
+ if (typeof value === "boolean") {
1134
+ fieldDef.unique = value;
1135
+ }
1136
+ break;
1137
+ case "required":
1138
+ if (typeof value === "boolean") {
1139
+ fieldDef.required = value;
1140
+ }
1141
+ break;
1142
+ case "autoAssign":
1143
+ if (typeof value === "boolean") {
1144
+ fieldDef.autoAssign = value;
1145
+ }
1146
+ break;
1147
+ case "primaryKey":
1148
+ if (typeof value === "boolean") {
1149
+ fieldDef.primaryKey = value;
1150
+ }
1151
+ break;
1152
+ case "default":
1153
+ fieldDef.default = value;
1154
+ break;
1155
+ }
1156
+ }
1157
+ }
1158
+ return fieldDef.type ? fieldDef : null;
1159
+ }
1160
+ /**
1161
+ * Parse a property value to a JavaScript value
1162
+ */
1163
+ parsePropertyValue(node) {
1164
+ if (ts2.isStringLiteral(node)) {
1165
+ return node.text;
1166
+ } else if (ts2.isNumericLiteral(node)) {
1167
+ return parseFloat(node.text);
1168
+ } else if (node.kind === ts2.SyntaxKind.TrueKeyword) {
1169
+ return true;
1170
+ } else if (node.kind === ts2.SyntaxKind.FalseKeyword) {
1171
+ return false;
1172
+ } else if (node.kind === ts2.SyntaxKind.NullKeyword) {
1173
+ return null;
1174
+ } else if (ts2.isArrayLiteralExpression(node)) {
1175
+ return node.elements.map((el) => this.parsePropertyValue(el));
1176
+ } else if (ts2.isObjectLiteralExpression(node)) {
1177
+ const obj = {};
1178
+ for (const prop of node.properties) {
1179
+ if (ts2.isPropertyAssignment(prop) && ts2.isIdentifier(prop.name)) {
1180
+ obj[prop.name.text] = this.parsePropertyValue(prop.initializer);
1181
+ }
1182
+ }
1183
+ return obj;
1184
+ }
1185
+ return void 0;
1186
+ }
1187
+ };
1188
+
1007
1189
  // package.json
1008
1190
  var package_default = {
1009
1191
  name: "js-bao",
1010
- version: "0.2.11",
1192
+ version: "0.2.12",
1011
1193
  description: "A library providing data modeling capabilities which support live updates and queries.",
1012
1194
  types: "dist/index.d.ts",
1013
1195
  type: "module",
@@ -1039,6 +1221,21 @@ var package_default = {
1039
1221
  types: "./dist/browser.d.ts",
1040
1222
  import: "./dist/browser.js",
1041
1223
  require: "./dist/browser.cjs"
1224
+ },
1225
+ "./cloudflare": {
1226
+ types: "./dist/cloudflare.d.ts",
1227
+ import: "./dist/cloudflare.js",
1228
+ require: "./dist/cloudflare.cjs"
1229
+ },
1230
+ "./cloudflare/do": {
1231
+ types: "./dist/cloudflare-do.d.ts",
1232
+ import: "./dist/cloudflare-do.js",
1233
+ require: "./dist/cloudflare-do.cjs"
1234
+ },
1235
+ "./client": {
1236
+ types: "./dist/client.d.ts",
1237
+ import: "./dist/client.js",
1238
+ require: "./dist/client.cjs"
1042
1239
  }
1043
1240
  },
1044
1241
  bin: {
@@ -1046,32 +1243,37 @@ var package_default = {
1046
1243
  "jsbao-codegen": "./dist/codegen.cjs"
1047
1244
  },
1048
1245
  scripts: {
1049
- build: "npm run build:cli && npm run codegen && rm -f dist/index.* dist/node.* dist/browser.* && npm run build:main",
1050
- "build:main": "npm run build:browser && npm run build:node && npm run build:universal",
1246
+ build: "pnpm build:cli && pnpm codegen && rm -f dist/index.* dist/node.* dist/browser.* dist/cloudflare.* dist/cloudflare-do.* dist/client.* && pnpm build:main",
1247
+ "build:main": "pnpm build:browser && pnpm build:node && pnpm build:universal && pnpm build:cloudflare && pnpm build:cloudflare-do && pnpm build:client",
1051
1248
  "build:browser": "tsup src/browser.ts --format esm,cjs --dts --platform browser --external better-sqlite3 --external sql.js --external async-mutex --external ulid --no-splitting",
1052
1249
  "build:node": "tsup src/node.ts --format esm,cjs --dts --platform node --external better-sqlite3 --external sql.js --external async-mutex --external ulid --no-splitting",
1053
1250
  "build:universal": "tsup src/index.ts --format esm,cjs --dts --external better-sqlite3 --external sql.js --external async-mutex --external ulid --no-splitting",
1251
+ "build:cloudflare": "tsup src/cloudflare.ts --format esm,cjs --dts --platform browser --external better-sqlite3 --external sql.js --external async-mutex --external ulid --external yjs --no-splitting",
1252
+ "build:cloudflare-do": "tsup src/cloudflare-do.ts --format esm,cjs --dts --platform neutral --external better-sqlite3 --external sql.js --external async-mutex --external ulid --external yjs --no-splitting",
1253
+ "build:client": "tsup src/client.ts --format esm,cjs --dts --platform browser --external better-sqlite3 --external sql.js --external async-mutex --external ulid --external yjs --no-splitting",
1054
1254
  "build:cli": "tsup src/cli/codegen.ts --format cjs --dts --platform node --target node18 --external commander --external typescript --external fs --external path --external util --no-splitting",
1055
- dev: 'npm run build:cli && concurrently "npm run codegen:watch" "npm run dev:main"',
1056
- "dev:main": 'concurrently "npm run build:browser:dev --watch" "npm run build:node:dev --watch" "npm run build:universal:dev --watch"',
1057
- "dev:simple": "npm run build:cli && npm run codegen && npm run build:main --watch",
1255
+ dev: 'pnpm build:cli && concurrently "pnpm codegen:watch" "pnpm dev:main"',
1256
+ "dev:main": 'concurrently "pnpm build:browser:dev --watch" "pnpm build:node:dev --watch" "pnpm build:universal:dev --watch"',
1257
+ "dev:simple": "pnpm build:cli && pnpm codegen && pnpm build:main --watch",
1058
1258
  "build:browser:dev": "tsup src/browser.ts --format esm,cjs --dts --sourcemap --platform browser --external better-sqlite3 --external sql.js --external async-mutex --external ulid",
1059
1259
  "build:node:dev": "tsup src/node.ts --format esm,cjs --dts --sourcemap --platform node --external better-sqlite3 --external sql.js --external async-mutex --external ulid",
1060
1260
  "build:universal:dev": "tsup src/index.ts --format esm,cjs --dts --sourcemap --external better-sqlite3 --external sql.js --external async-mutex --external ulid",
1061
1261
  codegen: "./dist/codegen.cjs --config js-bao.config.cjs || echo 'Codegen skipped (likely in consumer project)'",
1062
1262
  "codegen:watch": "./dist/codegen.cjs --config js-bao.config.cjs --watch",
1063
1263
  "codegen:consumer": `node -e "require('child_process').spawn('./node_modules/.bin/js-bao-codegen', process.argv.slice(2), {stdio: 'inherit'})"`,
1264
+ "publish:alpha": "node scripts/publish.js --tag alpha",
1265
+ "publish:stable": "node scripts/publish.js",
1064
1266
  test: 'echo "Error: no test specified" && exit 1',
1065
- prepare: "npm run build",
1066
- prepublishOnly: "npm run build"
1267
+ prepare: "pnpm build",
1268
+ prepublishOnly: "pnpm build"
1067
1269
  },
1068
1270
  dependencies: {
1069
1271
  "async-mutex": "^0.5.0",
1070
- "sql.js": "~1.13.0",
1272
+ "sql.js": "^1.13.0",
1071
1273
  ulid: "^3.0.0"
1072
1274
  },
1073
1275
  devDependencies: {
1074
- "@types/better-sqlite3": "^7.6.9",
1276
+ "@types/better-sqlite3": "^7.6.13",
1075
1277
  "@types/node": "^20.17.51",
1076
1278
  "@types/sql.js": "^1.4.9",
1077
1279
  commander: "^11.0.0",
@@ -1085,7 +1287,7 @@ var package_default = {
1085
1287
  yjs: "^13.6.18"
1086
1288
  },
1087
1289
  optionalDependencies: {
1088
- "better-sqlite3": "^9.6.0"
1290
+ "better-sqlite3": "^12.6.2"
1089
1291
  },
1090
1292
  keywords: [
1091
1293
  "yjs",
@@ -1096,10 +1298,19 @@ var package_default = {
1096
1298
  "reactivedb",
1097
1299
  "nodejs",
1098
1300
  "browser",
1099
- "sqlite"
1301
+ "sqlite",
1302
+ "cloudflare",
1303
+ "durable-objects",
1304
+ "workers"
1100
1305
  ],
1101
1306
  author: "Primitive LLC",
1102
- license: "UNLICENSED"
1307
+ license: "UNLICENSED",
1308
+ pnpm: {
1309
+ onlyBuiltDependencies: [
1310
+ "better-sqlite3",
1311
+ "esbuild"
1312
+ ]
1313
+ }
1103
1314
  };
1104
1315
 
1105
1316
  // src/cli/codegen.ts
@@ -1132,7 +1343,15 @@ var CodegenCLI = class {
1132
1343
  "--no-include-pagination",
1133
1344
  "Exclude pagination types from output",
1134
1345
  false
1135
- ).option("-v, --verbose", "Show detailed logging information", false).action(async (options) => {
1346
+ ).option("-v, --verbose", "Show detailed logging information", false).option(
1347
+ "-s, --schema",
1348
+ "Generate schema.json file for dynamic schema registration",
1349
+ false
1350
+ ).option(
1351
+ "--schema-output <file>",
1352
+ "Output path for schema.json file",
1353
+ "./schema.json"
1354
+ ).action(async (options) => {
1136
1355
  await this.run(options);
1137
1356
  });
1138
1357
  }
@@ -1180,6 +1399,9 @@ ${formattedList}`,
1180
1399
  Logger.warn("No model files found. Exiting.", "js-bao-codegen");
1181
1400
  return;
1182
1401
  }
1402
+ if (config.schema) {
1403
+ await this.generateSchema(modelFiles, config);
1404
+ }
1183
1405
  const analyzer = new ModelAnalyzer(modelFiles, cliOptions.verbose);
1184
1406
  const models = await analyzer.analyzeModels();
1185
1407
  Logger.verbose(
@@ -1187,10 +1409,12 @@ ${formattedList}`,
1187
1409
  "js-bao-codegen"
1188
1410
  );
1189
1411
  if (models.length === 0) {
1190
- Logger.warn(
1191
- "No models with relationships found. Exiting.",
1192
- "js-bao-codegen"
1193
- );
1412
+ if (!config.schema) {
1413
+ Logger.warn(
1414
+ "No models with relationships found. Exiting.",
1415
+ "js-bao-codegen"
1416
+ );
1417
+ }
1194
1418
  return;
1195
1419
  }
1196
1420
  const generationOptions = {
@@ -1236,7 +1460,9 @@ ${formattedList}`,
1236
1460
  exclude: cliOptions.exclude.length > 2 ? cliOptions.exclude : configFile.exclude || ["**/*.test.ts", "**/*.spec.ts"],
1237
1461
  generatePerModelFiles: cliOptions.generatePerModelFiles || configFile.generatePerModelFiles || false,
1238
1462
  includePagination: configFile.includePagination ?? true,
1239
- verbose: cliOptions.verbose
1463
+ verbose: cliOptions.verbose,
1464
+ schema: cliOptions.schema || configFile.schema || false,
1465
+ schemaOutput: cliOptions.schemaOutput !== "./schema.json" ? cliOptions.schemaOutput : configFile.schemaOutput || "./schema.json"
1240
1466
  };
1241
1467
  } else {
1242
1468
  Logger.warn(`Config file not found: ${configPath}`, "js-bao-codegen");
@@ -1252,6 +1478,21 @@ ${formattedList}`,
1252
1478
  const resolvedInputDir = path3.resolve(inputDir);
1253
1479
  return await FileUtils.findTSFiles(resolvedInputDir, exclude);
1254
1480
  }
1481
+ async generateSchema(modelFiles, config) {
1482
+ Logger.log("Generating schema.json...", "js-bao-codegen");
1483
+ const extractor = new SchemaExtractor(modelFiles, config.verbose);
1484
+ const schemaOutput = await extractor.generateSchemaOutput();
1485
+ const outputPath = path3.resolve(config.schemaOutput);
1486
+ await FileUtils.writeFileContent(
1487
+ outputPath,
1488
+ JSON.stringify(schemaOutput, null, 2)
1489
+ );
1490
+ Logger.log(`Schema written to ${outputPath}`, "js-bao-codegen");
1491
+ Logger.verbose(
1492
+ `Extracted ${Object.keys(schemaOutput.models).length} model(s)`,
1493
+ "js-bao-codegen"
1494
+ );
1495
+ }
1255
1496
  async setupWatchMode(config, initialFiles) {
1256
1497
  Logger.log("Watch mode enabled. Watching for changes...", "js-bao-codegen");
1257
1498
  const checkInterval = 2e3;
@@ -0,0 +1,17 @@
1
+ import {
2
+ constants,
3
+ detectEnvironment,
4
+ features,
5
+ isBrowser,
6
+ isNode,
7
+ isNodeModuleAvailable
8
+ } from "./chunk-GO3APTPX.js";
9
+ export {
10
+ constants,
11
+ detectEnvironment,
12
+ features,
13
+ isBrowser,
14
+ isNode,
15
+ isNodeModuleAvailable
16
+ };
17
+ //# sourceMappingURL=environment-TOTQICSE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}