@rebasepro/server-core 0.0.1-canary.f81da60 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/app/frontend/node_modules/esbuild/LICENSE.md +21 -0
  2. package/app/frontend/node_modules/esbuild/README.md +3 -0
  3. package/app/frontend/node_modules/esbuild/bin/esbuild +220 -0
  4. package/app/frontend/node_modules/esbuild/install.js +285 -0
  5. package/app/frontend/node_modules/esbuild/lib/main.d.ts +705 -0
  6. package/app/frontend/node_modules/esbuild/lib/main.js +2239 -0
  7. package/app/frontend/node_modules/esbuild/package.json +46 -0
  8. package/dist/index.es.js +140 -28
  9. package/dist/index.es.js.map +1 -1
  10. package/dist/index.umd.js +140 -28
  11. package/dist/index.umd.js.map +1 -1
  12. package/dist/server-core/src/auth/google-oauth.d.ts +33 -3
  13. package/dist/server-core/src/auth/index.d.ts +1 -0
  14. package/dist/server-core/src/init.d.ts +1 -0
  15. package/dist/types/src/controllers/auth.d.ts +8 -2
  16. package/dist/types/src/controllers/client.d.ts +13 -0
  17. package/dist/types/src/controllers/navigation.d.ts +18 -6
  18. package/dist/types/src/controllers/registry.d.ts +9 -1
  19. package/dist/types/src/controllers/side_entity_controller.d.ts +7 -0
  20. package/dist/types/src/rebase_context.d.ts +17 -0
  21. package/dist/types/src/types/collections.d.ts +20 -1
  22. package/dist/types/src/types/component_ref.d.ts +47 -0
  23. package/dist/types/src/types/entity_views.d.ts +2 -1
  24. package/dist/types/src/types/index.d.ts +1 -0
  25. package/dist/types/src/types/properties.d.ts +15 -3
  26. package/dist/types/src/types/translations.d.ts +2 -0
  27. package/examples/firebase/node_modules/esbuild/LICENSE.md +21 -0
  28. package/examples/firebase/node_modules/esbuild/README.md +3 -0
  29. package/examples/firebase/node_modules/esbuild/bin/esbuild +220 -0
  30. package/examples/firebase/node_modules/esbuild/install.js +285 -0
  31. package/examples/firebase/node_modules/esbuild/lib/main.d.ts +705 -0
  32. package/examples/firebase/node_modules/esbuild/lib/main.js +2239 -0
  33. package/examples/firebase/node_modules/esbuild/package.json +46 -0
  34. package/examples/medmot-staging/frontend/node_modules/esbuild/LICENSE.md +21 -0
  35. package/examples/medmot-staging/frontend/node_modules/esbuild/README.md +3 -0
  36. package/examples/medmot-staging/frontend/node_modules/esbuild/bin/esbuild +220 -0
  37. package/examples/medmot-staging/frontend/node_modules/esbuild/install.js +285 -0
  38. package/examples/medmot-staging/frontend/node_modules/esbuild/lib/main.d.ts +705 -0
  39. package/examples/medmot-staging/frontend/node_modules/esbuild/lib/main.js +2239 -0
  40. package/examples/medmot-staging/frontend/node_modules/esbuild/package.json +46 -0
  41. package/examples/sdk-demo/node_modules/esbuild/LICENSE.md +21 -0
  42. package/examples/sdk-demo/node_modules/esbuild/README.md +3 -0
  43. package/examples/sdk-demo/node_modules/esbuild/bin/esbuild +223 -0
  44. package/examples/sdk-demo/node_modules/esbuild/install.js +289 -0
  45. package/examples/sdk-demo/node_modules/esbuild/lib/main.d.ts +716 -0
  46. package/examples/sdk-demo/node_modules/esbuild/lib/main.js +2242 -0
  47. package/examples/sdk-demo/node_modules/esbuild/package.json +49 -0
  48. package/package.json +7 -7
  49. package/packages/client/node_modules/esbuild/LICENSE.md +21 -0
  50. package/packages/client/node_modules/esbuild/README.md +3 -0
  51. package/packages/client/node_modules/esbuild/bin/esbuild +220 -0
  52. package/packages/client/node_modules/esbuild/install.js +285 -0
  53. package/packages/client/node_modules/esbuild/lib/main.d.ts +705 -0
  54. package/packages/client/node_modules/esbuild/lib/main.js +2239 -0
  55. package/packages/client/node_modules/esbuild/package.json +46 -0
  56. package/packages/client-postgresql/node_modules/esbuild/LICENSE.md +21 -0
  57. package/packages/client-postgresql/node_modules/esbuild/README.md +3 -0
  58. package/packages/client-postgresql/node_modules/esbuild/bin/esbuild +220 -0
  59. package/packages/client-postgresql/node_modules/esbuild/install.js +285 -0
  60. package/packages/client-postgresql/node_modules/esbuild/lib/main.d.ts +705 -0
  61. package/packages/client-postgresql/node_modules/esbuild/lib/main.js +2239 -0
  62. package/packages/client-postgresql/node_modules/esbuild/package.json +46 -0
  63. package/packages/common/node_modules/esbuild/LICENSE.md +21 -0
  64. package/packages/common/node_modules/esbuild/README.md +3 -0
  65. package/packages/common/node_modules/esbuild/bin/esbuild +220 -0
  66. package/packages/common/node_modules/esbuild/install.js +285 -0
  67. package/packages/common/node_modules/esbuild/lib/main.d.ts +705 -0
  68. package/packages/common/node_modules/esbuild/lib/main.js +2239 -0
  69. package/packages/common/node_modules/esbuild/package.json +46 -0
  70. package/packages/server-mongodb/node_modules/esbuild/LICENSE.md +21 -0
  71. package/packages/server-mongodb/node_modules/esbuild/README.md +3 -0
  72. package/packages/server-mongodb/node_modules/esbuild/bin/esbuild +220 -0
  73. package/packages/server-mongodb/node_modules/esbuild/install.js +285 -0
  74. package/packages/server-mongodb/node_modules/esbuild/lib/main.d.ts +705 -0
  75. package/packages/server-mongodb/node_modules/esbuild/lib/main.js +2239 -0
  76. package/packages/server-mongodb/node_modules/esbuild/package.json +46 -0
  77. package/packages/server-postgresql/node_modules/esbuild/LICENSE.md +21 -0
  78. package/packages/server-postgresql/node_modules/esbuild/README.md +3 -0
  79. package/packages/server-postgresql/node_modules/esbuild/bin/esbuild +220 -0
  80. package/packages/server-postgresql/node_modules/esbuild/install.js +285 -0
  81. package/packages/server-postgresql/node_modules/esbuild/lib/main.d.ts +705 -0
  82. package/packages/server-postgresql/node_modules/esbuild/lib/main.js +2239 -0
  83. package/packages/server-postgresql/node_modules/esbuild/package.json +46 -0
  84. package/packages/types/node_modules/esbuild/LICENSE.md +21 -0
  85. package/packages/types/node_modules/esbuild/README.md +3 -0
  86. package/packages/types/node_modules/esbuild/bin/esbuild +220 -0
  87. package/packages/types/node_modules/esbuild/install.js +285 -0
  88. package/packages/types/node_modules/esbuild/lib/main.d.ts +705 -0
  89. package/packages/types/node_modules/esbuild/lib/main.js +2239 -0
  90. package/packages/types/node_modules/esbuild/package.json +46 -0
  91. package/packages/utils/node_modules/esbuild/LICENSE.md +21 -0
  92. package/packages/utils/node_modules/esbuild/README.md +3 -0
  93. package/packages/utils/node_modules/esbuild/bin/esbuild +220 -0
  94. package/packages/utils/node_modules/esbuild/install.js +285 -0
  95. package/packages/utils/node_modules/esbuild/lib/main.d.ts +705 -0
  96. package/packages/utils/node_modules/esbuild/lib/main.js +2239 -0
  97. package/packages/utils/node_modules/esbuild/package.json +46 -0
  98. package/src/api/errors.ts +3 -2
  99. package/src/api/server.ts +5 -2
  100. package/src/auth/google-oauth.ts +148 -17
  101. package/src/auth/index.ts +1 -0
  102. package/src/auth/routes.ts +25 -5
  103. package/src/collections/loader.ts +3 -3
  104. package/src/init.ts +14 -2
  105. package/history_diff.log +0 -385
  106. package/scratch.ts +0 -9
  107. package/test-ast.ts +0 -28
  108. package/test_output.txt +0 -1133
package/dist/index.umd.js CHANGED
@@ -1011,7 +1011,8 @@
1011
1011
  }, { buffer: 3, lYpoI2: 11 }] }, {}, [1])(1);
1012
1012
  });
1013
1013
  })(object_hash);
1014
- const snakeCaseRegex = /[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g;
1014
+ const tokenizeRegex = /[A-Z]{2,}(?=[A-Z][a-z]|\b)|[A-Z]?[a-z]+|[0-9]+(?:[a-z](?![a-z]))?|[A-Z]/g;
1015
+ const snakeCaseRegex = tokenizeRegex;
1015
1016
  const toSnakeCase = (str) => {
1016
1017
  const regExpMatchArray = str.match(snakeCaseRegex);
1017
1018
  if (!regExpMatchArray) return "";
@@ -3465,8 +3466,7 @@
3465
3466
  const filePath = path__namespace.join(directory, file);
3466
3467
  try {
3467
3468
  const fileUrl = require$$0$2.pathToFileURL(filePath).href;
3468
- const dynamicImport = new Function("url", "return import(url)");
3469
- const module2 = await dynamicImport(fileUrl);
3469
+ const module2 = await import(fileUrl);
3470
3470
  if (module2 && module2.default) {
3471
3471
  collections.push(module2.default);
3472
3472
  } else {
@@ -3624,7 +3624,8 @@
3624
3624
  console.error(`❌ [API] ${c.req.method} ${c.req.path} → ${statusCode} ${code2}: ${logMessage}`);
3625
3625
  const causePg = error2.cause && typeof error2.cause === "object" ? error2.cause : void 0;
3626
3626
  const pgErrorCode = causePg?.code || error2.code;
3627
- if (pgErrorCode !== "42703" && pgErrorCode !== "42P01") {
3627
+ const suppressStack = pgErrorCode === "42703" || pgErrorCode === "42P01" || statusCode < 500 && code2 === "BAD_REQUEST";
3628
+ if (!suppressStack) {
3628
3629
  console.error(error2.stack || error2);
3629
3630
  }
3630
3631
  let clientMessage = "An unexpected error occurred";
@@ -21623,15 +21624,19 @@ ${credentialScope}
21623
21624
  ZodPromise.create;
21624
21625
  ZodOptional.create;
21625
21626
  ZodNullable.create;
21626
- function createGoogleProvider(clientId) {
21627
- const googleClient = new src$4.OAuth2Client(clientId);
21627
+ function createGoogleProvider(config) {
21628
+ const clientId = typeof config === "string" ? config : config.clientId;
21629
+ const clientSecret = typeof config === "string" ? void 0 : config.clientSecret;
21630
+ const googleClient = new src$4.OAuth2Client(clientId, clientSecret);
21628
21631
  return {
21629
21632
  id: "google",
21630
21633
  schema: objectType({
21631
21634
  idToken: stringType().min(1).optional(),
21632
- accessToken: stringType().min(1).optional()
21633
- }).refine((data) => data.idToken || data.accessToken, {
21634
- message: "Either idToken or accessToken is required"
21635
+ accessToken: stringType().min(1).optional(),
21636
+ code: stringType().min(1).optional(),
21637
+ redirectUri: stringType().min(1).optional()
21638
+ }).refine((data) => data.idToken || data.accessToken || data.code && data.redirectUri, {
21639
+ message: "One of idToken, accessToken, or code+redirectUri is required"
21635
21640
  }),
21636
21641
  verify: async (payload) => {
21637
21642
  try {
@@ -21642,7 +21647,7 @@ ${credentialScope}
21642
21647
  });
21643
21648
  const content = ticket.getPayload();
21644
21649
  if (!content) {
21645
- return null;
21650
+ throw new Error("Google ID token payload was empty");
21646
21651
  }
21647
21652
  return {
21648
21653
  providerId: content.sub,
@@ -21658,12 +21663,11 @@ ${credentialScope}
21658
21663
  }
21659
21664
  });
21660
21665
  if (!res.ok) {
21661
- console.error("Google userinfo request failed:", res.status);
21662
- return null;
21666
+ throw new Error(`Google userinfo request failed with status ${res.status}`);
21663
21667
  }
21664
21668
  const info = await res.json();
21665
21669
  if (!info.sub || !info.email) {
21666
- return null;
21670
+ throw new Error("Google userinfo response missing sub or email");
21667
21671
  }
21668
21672
  return {
21669
21673
  providerId: info.sub,
@@ -21672,10 +21676,73 @@ ${credentialScope}
21672
21676
  photoUrl: info.picture || null
21673
21677
  };
21674
21678
  }
21675
- return null;
21679
+ if (payload.code && payload.redirectUri) {
21680
+ if (!clientSecret) {
21681
+ throw new Error("Google authorization code flow requires clientSecret. Configure GOOGLE_CLIENT_SECRET in your environment.");
21682
+ }
21683
+ const tokenResponse = await fetch("https://oauth2.googleapis.com/token", {
21684
+ method: "POST",
21685
+ headers: {
21686
+ "Content-Type": "application/x-www-form-urlencoded"
21687
+ },
21688
+ body: new URLSearchParams({
21689
+ code: payload.code,
21690
+ client_id: clientId,
21691
+ client_secret: clientSecret,
21692
+ redirect_uri: payload.redirectUri,
21693
+ grant_type: "authorization_code"
21694
+ })
21695
+ });
21696
+ if (!tokenResponse.ok) {
21697
+ const errorBody = await tokenResponse.text();
21698
+ throw new Error(`Google token exchange failed (${tokenResponse.status}): ${errorBody}`);
21699
+ }
21700
+ const tokenData = await tokenResponse.json();
21701
+ if (tokenData.error) {
21702
+ throw new Error(`Google token exchange error: ${tokenData.error} – ${tokenData.error_description || "no details"}`);
21703
+ }
21704
+ if (tokenData.id_token) {
21705
+ const ticket = await googleClient.verifyIdToken({
21706
+ idToken: tokenData.id_token,
21707
+ audience: clientId
21708
+ });
21709
+ const content = ticket.getPayload();
21710
+ if (!content) {
21711
+ throw new Error("Google ID token payload was empty after code exchange");
21712
+ }
21713
+ return {
21714
+ providerId: content.sub,
21715
+ email: content.email || "",
21716
+ displayName: content.name || null,
21717
+ photoUrl: content.picture || null
21718
+ };
21719
+ }
21720
+ if (tokenData.access_token) {
21721
+ const userInfoRes = await fetch("https://www.googleapis.com/oauth2/v3/userinfo", {
21722
+ headers: {
21723
+ Authorization: `Bearer ${tokenData.access_token}`
21724
+ }
21725
+ });
21726
+ if (!userInfoRes.ok) {
21727
+ throw new Error(`Google userinfo request failed after code exchange (${userInfoRes.status})`);
21728
+ }
21729
+ const info = await userInfoRes.json();
21730
+ if (!info.sub || !info.email) {
21731
+ return null;
21732
+ }
21733
+ return {
21734
+ providerId: info.sub,
21735
+ email: info.email,
21736
+ displayName: info.name || null,
21737
+ photoUrl: info.picture || null
21738
+ };
21739
+ }
21740
+ throw new Error("Google token exchange returned neither id_token nor access_token");
21741
+ }
21742
+ throw new Error("No valid Google credential provided (expected idToken, accessToken, or code+redirectUri)");
21676
21743
  } catch (error2) {
21677
- console.error("Failed to verify Google token:", error2);
21678
- return null;
21744
+ console.error("Google OAuth verification failed:", error2);
21745
+ throw error2;
21679
21746
  }
21680
21747
  }
21681
21748
  };
@@ -22883,7 +22950,11 @@ Si tienes alguna pregunta, no dudes en contactarnos respondiendo a este correo.
22883
22950
  passwordHash,
22884
22951
  displayName: displayName || void 0
22885
22952
  });
22886
- if (config.defaultRole) {
22953
+ const existingUsers = await authRepo.listUsers();
22954
+ const isFirstUser = existingUsers.length === 1 && existingUsers[0].id === user.id;
22955
+ if (isFirstUser) {
22956
+ await authRepo.setUserRoles(user.id, ["admin"]);
22957
+ } else if (config.defaultRole) {
22887
22958
  await authRepo.assignDefaultRole(user.id, config.defaultRole);
22888
22959
  }
22889
22960
  const {
@@ -22924,7 +22995,13 @@ Si tienes alguna pregunta, no dudes en contactarnos respondiendo a este correo.
22924
22995
  for (const provider of config.oauthProviders) {
22925
22996
  router.post(`/${provider.id}`, defaultAuthLimiter, async (c) => {
22926
22997
  const payload = parseBody2(provider.schema, await c.req.json());
22927
- const externalUser = await provider.verify(payload);
22998
+ let externalUser;
22999
+ try {
23000
+ externalUser = await provider.verify(payload);
23001
+ } catch (err) {
23002
+ const msg = err instanceof Error ? err.message : String(err);
23003
+ throw ApiError.unauthorized(`${provider.id} login failed: ${msg}`, "OAUTH_ERROR");
23004
+ }
22928
23005
  if (!externalUser) {
22929
23006
  throw ApiError.unauthorized(`Invalid ${provider.id} credentials`, "INVALID_TOKEN");
22930
23007
  }
@@ -22948,7 +23025,11 @@ Si tienes alguna pregunta, no dudes en contactarnos respondiendo a este correo.
22948
23025
  await authRepo.linkUserIdentity(user.id, provider.id, externalUser.providerId, {
22949
23026
  email: externalUser.email
22950
23027
  });
22951
- if (config.defaultRole) {
23028
+ const allUsers = await authRepo.listUsers();
23029
+ const isFirstUser = allUsers.length === 1 && allUsers[0].id === user.id;
23030
+ if (isFirstUser) {
23031
+ await authRepo.setUserRoles(user.id, ["admin"]);
23032
+ } else if (config.defaultRole) {
22952
23033
  await authRepo.assignDefaultRole(user.id, config.defaultRole);
22953
23034
  }
22954
23035
  sendWelcomeEmail({
@@ -24976,20 +25057,21 @@ Si tienes alguna pregunta, no dudes en contactarnos respondiendo a este correo.
24976
25057
  refreshToken: session.refreshToken
24977
25058
  };
24978
25059
  }
24979
- async function signInWithGoogle(idToken) {
25060
+ async function signInWithGoogle(tokenOrPayload) {
24980
25061
  const fetchFn = getFetch();
25062
+ const body = typeof tokenOrPayload === "string" ? {
25063
+ idToken: tokenOrPayload
25064
+ } : tokenOrPayload;
24981
25065
  const res = await fetchFn(authUrl("/google"), {
24982
25066
  method: "POST",
24983
25067
  headers: {
24984
25068
  "Content-Type": "application/json"
24985
25069
  },
24986
- body: JSON.stringify({
24987
- idToken
24988
- })
25070
+ body: JSON.stringify(body)
24989
25071
  });
24990
- const body = await res.json().catch(() => ({}));
24991
- if (!res.ok) throwApiError(res.status, body, res.statusText);
24992
- const session = handleAuthResponse(body, "SIGNED_IN");
25072
+ const responseBody = await res.json().catch(() => ({}));
25073
+ if (!res.ok) throwApiError(res.status, responseBody, res.statusText);
25074
+ const session = handleAuthResponse(responseBody, "SIGNED_IN");
24993
25075
  return {
24994
25076
  user: session.user,
24995
25077
  accessToken: session.accessToken,
@@ -25651,6 +25733,25 @@ Si tienes alguna pregunta, no dudes en contactarnos respondiendo a este correo.
25651
25733
  };
25652
25734
  return client;
25653
25735
  }
25736
+ function createFunctionsClient(transport) {
25737
+ return {
25738
+ async invoke(name2, payload, options2) {
25739
+ const method = options2?.method ?? "POST";
25740
+ const subPath = options2?.path ? `/${options2.path.replace(/^\//, "")}` : "";
25741
+ const routePath = `/functions/${encodeURIComponent(name2)}${subPath}`;
25742
+ const init = {
25743
+ method
25744
+ };
25745
+ if (payload !== void 0 && method !== "GET") {
25746
+ init.body = JSON.stringify(payload);
25747
+ }
25748
+ if (options2?.headers) {
25749
+ init.headers = options2.headers;
25750
+ }
25751
+ return transport.request(routePath, init);
25752
+ }
25753
+ };
25754
+ }
25654
25755
  function createStorage(transport) {
25655
25756
  const urlsCache = /* @__PURE__ */ new Map();
25656
25757
  async function putObject({
@@ -25784,6 +25885,7 @@ Si tienes alguna pregunta, no dudes en contactarnos respondiendo a este correo.
25784
25885
  const admin = createAdmin(transport, options2.admin);
25785
25886
  const cron = createCron(transport, options2.cron);
25786
25887
  const storage = createStorage(transport);
25888
+ const functions = createFunctionsClient(transport);
25787
25889
  let ws;
25788
25890
  if (!options2.onUnauthorized) {
25789
25891
  transport.setOnUnauthorized(async () => {
@@ -25822,6 +25924,7 @@ Si tienes alguna pregunta, no dudes en contactarnos respondiendo a este correo.
25822
25924
  auth,
25823
25925
  admin,
25824
25926
  cron,
25927
+ functions,
25825
25928
  storage,
25826
25929
  ws,
25827
25930
  setToken: transport.setToken,
@@ -37149,7 +37252,7 @@ Si tienes alguna pregunta, no dudes en contactarnos respondiendo a este correo.
37149
37252
  const {
37150
37253
  createGoogleProvider: createGoogleProvider2
37151
37254
  } = await Promise.resolve().then(() => index);
37152
- oauthProviders.push(createGoogleProvider2(config.auth.google.clientId));
37255
+ oauthProviders.push(createGoogleProvider2(config.auth.google));
37153
37256
  }
37154
37257
  if (config.auth.linkedin?.clientId && config.auth.linkedin?.clientSecret) {
37155
37258
  const {
@@ -37350,6 +37453,13 @@ Si tienes alguna pregunta, no dudes en contactarnos respondiendo a este correo.
37350
37453
  }
37351
37454
  _initRebase(serverClient);
37352
37455
  logger.info("Rebase singleton initialized");
37456
+ if (defaultDriverResult.internals) {
37457
+ const internals = defaultDriverResult.internals;
37458
+ const driver = internals.driver;
37459
+ if (driver && "client" in driver) {
37460
+ driver.client = serverClient;
37461
+ }
37462
+ }
37353
37463
  if (config.functionsDir) {
37354
37464
  const {
37355
37465
  loadFunctionsFromDirectory: loadFunctionsFromDirectory2
@@ -48228,7 +48338,9 @@ export default ${safeId}Collection;
48228
48338
  * Setup Hono middleware
48229
48339
  */
48230
48340
  setupMiddleware() {
48231
- this.router.use("/*", secureHeaders.secureHeaders());
48341
+ this.router.use("/*", secureHeaders.secureHeaders({
48342
+ crossOriginOpenerPolicy: "same-origin-allow-popups"
48343
+ }));
48232
48344
  if (this.config.cors) {
48233
48345
  const origin = this.config.cors.origin;
48234
48346
  this.router.use("/*", cors.cors({