Skip to content

Commit ebd18c3

Browse files
committed
cross compilation of @mongoid & MongoEntity(Companion) to JS
1 parent fe1d8fe commit ebd18c3

File tree

94 files changed

+142
-111
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

94 files changed

+142
-111
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
target
1010
out
1111
.bloop
12+
.bsp
1213

1314
*.sjsir
1415
*.class

build.sbt

+58-45
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ lazy val `commons-jvm` = project.in(file(".jvm"))
226226
lazy val `commons-js` = project.in(file(".js"))
227227
.aggregate(
228228
`commons-core-js`,
229+
`commons-mongo-js`,
229230
`commons-benchmark-js`,
230231
)
231232
.settings(aggregateProjectSettings)
@@ -288,6 +289,63 @@ lazy val `commons-core-js` = project.in(`commons-core`.base / "js")
288289
)
289290
)
290291

292+
lazy val `commons-mongo` = project
293+
.dependsOn(`commons-core` % CompileAndTest)
294+
.settings(
295+
jvmCommonSettings,
296+
sourceDirsSettings(_ / "jvm"),
297+
libraryDependencies ++= Seq(
298+
"com.google.guava" % "guava" % guavaVersion,
299+
"io.monix" %% "monix" % monixVersion,
300+
"org.mongodb" % "mongodb-driver-core" % mongoVersion,
301+
"org.mongodb" % "mongodb-driver-sync" % mongoVersion % Optional,
302+
"org.mongodb" % "mongodb-driver-reactivestreams" % mongoVersion % Optional,
303+
"org.mongodb.scala" %% "mongo-scala-driver" % mongoVersion % Optional,
304+
),
305+
)
306+
307+
// only to allow @mongoId & MongoEntity to be used in JS/JVM cross-compiled code
308+
lazy val `commons-mongo-js` = project.in(`commons-mongo`.base / "js")
309+
.enablePlugins(ScalaJSPlugin)
310+
.configure(p => if (forIdeaImport) p.dependsOn(`commons-mongo`) else p)
311+
.dependsOn(`commons-core-js`)
312+
.settings(
313+
jsCommonSettings,
314+
sameNameAs(`commons-mongo`),
315+
sourceDirsSettings(_.getParentFile),
316+
)
317+
318+
lazy val `commons-redis` = project
319+
.dependsOn(`commons-core` % CompileAndTest)
320+
.settings(
321+
jvmCommonSettings,
322+
libraryDependencies ++= Seq(
323+
"com.google.guava" % "guava" % guavaVersion,
324+
"com.typesafe.akka" %% "akka-actor" % akkaVersion,
325+
"com.typesafe.akka" %% "akka-stream" % akkaVersion,
326+
"com.typesafe.scala-logging" %% "scala-logging" % scalaLoggingVersion,
327+
),
328+
parallelExecution in Test := false,
329+
)
330+
331+
lazy val `commons-hocon` = project
332+
.dependsOn(`commons-core` % CompileAndTest)
333+
.settings(
334+
jvmCommonSettings,
335+
libraryDependencies ++= Seq(
336+
"com.typesafe" % "config" % typesafeConfigVersion,
337+
),
338+
)
339+
340+
lazy val `commons-spring` = project
341+
.dependsOn(`commons-hocon` % CompileAndTest)
342+
.settings(
343+
jvmCommonSettings,
344+
libraryDependencies ++= Seq(
345+
"org.springframework" % "spring-context" % springVersion,
346+
),
347+
)
348+
291349
lazy val `commons-jetty` = project
292350
.dependsOn(`commons-core` % CompileAndTest)
293351
.settings(
@@ -338,51 +396,6 @@ lazy val `commons-benchmark-js` = project.in(`commons-benchmark`.base / "js")
338396
scalaJSUseMainModuleInitializer := true,
339397
)
340398

341-
lazy val `commons-mongo` = project
342-
.dependsOn(`commons-core` % CompileAndTest)
343-
.settings(
344-
jvmCommonSettings,
345-
libraryDependencies ++= Seq(
346-
"com.google.guava" % "guava" % guavaVersion,
347-
"io.monix" %% "monix" % monixVersion,
348-
"org.mongodb" % "mongodb-driver-core" % mongoVersion,
349-
"org.mongodb" % "mongodb-driver-sync" % mongoVersion % Optional,
350-
"org.mongodb" % "mongodb-driver-reactivestreams" % mongoVersion % Optional,
351-
"org.mongodb.scala" %% "mongo-scala-driver" % mongoVersion % Optional,
352-
),
353-
)
354-
355-
lazy val `commons-redis` = project
356-
.dependsOn(`commons-core` % CompileAndTest)
357-
.settings(
358-
jvmCommonSettings,
359-
libraryDependencies ++= Seq(
360-
"com.google.guava" % "guava" % guavaVersion,
361-
"com.typesafe.akka" %% "akka-actor" % akkaVersion,
362-
"com.typesafe.akka" %% "akka-stream" % akkaVersion,
363-
"com.typesafe.scala-logging" %% "scala-logging" % scalaLoggingVersion,
364-
),
365-
parallelExecution in Test := false,
366-
)
367-
368-
lazy val `commons-hocon` = project
369-
.dependsOn(`commons-core` % CompileAndTest)
370-
.settings(
371-
jvmCommonSettings,
372-
libraryDependencies ++= Seq(
373-
"com.typesafe" % "config" % typesafeConfigVersion,
374-
),
375-
)
376-
377-
lazy val `commons-spring` = project
378-
.dependsOn(`commons-hocon` % CompileAndTest)
379-
.settings(
380-
jvmCommonSettings,
381-
libraryDependencies ++= Seq(
382-
"org.springframework" % "spring-context" % springVersion,
383-
),
384-
)
385-
386399
lazy val `commons-comprof` = project
387400
.disablePlugins(GenerativePlugin)
388401
.dependsOn(`commons-core`)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.avsystem.commons
2+
package mongo.typed
3+
4+
import com.avsystem.commons.meta.MacroInstances
5+
import com.avsystem.commons.serialization.{GenObjectCodec, HasGenObjectCodec}
6+
7+
abstract class MongoDataCompanion[T](
8+
implicit instances: MacroInstances[Unit, () => GenObjectCodec[T]]
9+
) extends HasGenObjectCodec[T]
10+
11+
abstract class MongoEntityCompanion[T <: BaseMongoEntity](
12+
implicit instances: MacroInstances[Unit, () => GenObjectCodec[T]]
13+
) extends MongoDataCompanion[T]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.avsystem.commons
2+
package mongo.typed
3+
4+
import com.avsystem.commons.annotation.explicitGenerics
5+
import com.avsystem.commons.meta.MacroInstances
6+
import com.avsystem.commons.mongo.BsonGenCodecs
7+
import com.avsystem.commons.serialization.GenObjectCodec
8+
9+
import scala.annotation.{compileTimeOnly, implicitNotFound}
10+
11+
trait MongoAdtInstances[T] {
12+
def codec: GenObjectCodec[T]
13+
def format: MongoAdtFormat[T]
14+
}
15+
16+
/**
17+
* Provides additional static validation for `as`, `is` and `ref` macros from [[DataTypeDsl]].
18+
* Catches mistakes when someone forgets to use [[MongoDataCompanion]] or [[MongoEntityCompanion]] for its
19+
* case class or sealed hierarchy.
20+
*/
21+
@implicitNotFound("${T} is an opaque data type - does it have a companion that extends MongoDataCompanion?")
22+
sealed trait IsMongoAdtOrSubtype[T]
23+
24+
abstract class AbstractMongoDataCompanion[Implicits, E](implicits: Implicits)(
25+
implicit instances: MacroInstances[Implicits, MongoAdtInstances[E]]
26+
) extends DataTypeDsl[E] {
27+
implicit val codec: GenObjectCodec[E] = instances(implicits, this).codec
28+
implicit val format: MongoAdtFormat[E] = instances(implicits, this).format
29+
30+
implicit def isMongoAdtOrSubtype[C <: E]: IsMongoAdtOrSubtype[C] = null
31+
32+
implicit class macroDslExtensions(value: E) {
33+
@explicitGenerics
34+
@compileTimeOnly("the .as[Subtype] construct can only be used inside lambda passed to .ref(...) macro")
35+
def as[T <: E]: T = sys.error("stub")
36+
}
37+
38+
final val SelfRef: MongoRef[E, E] = MongoRef.RootRef(format)
39+
}
40+
41+
abstract class AbstractMongoEntityCompanion[Implicits, E <: BaseMongoEntity](implicits: Implicits)(
42+
implicit instances: MacroInstances[Implicits, MongoAdtInstances[E]]
43+
) extends AbstractMongoDataCompanion[Implicits, E](implicits) {
44+
45+
type ID = E#IDType
46+
47+
final val IdRef: Ref[ID] = format.fieldRefFor(SelfRef, MongoEntity.Id)
48+
}
49+
50+
/**
51+
* Base class for companion objects of types that represent inner documents of MongoDB entities.
52+
* Just like entities, inner documents may be case classes or sealed hierarchies with `@flatten` annotation.
53+
*
54+
* NOTE: It is enough for a MongoDB field type to have just `GenCodec` defined (i.e. you can get away with
55+
* using `HasGenCodec` instead of `MongoDataCompanion`). However, data type which only has codec will be considered
56+
* opaque and you won't be able to reference its inner fields in filters, updates, indices, etc.
57+
*/
58+
abstract class MongoDataCompanion[E](
59+
implicit instances: MacroInstances[BsonGenCodecs.type, MongoAdtInstances[E]]
60+
) extends AbstractMongoDataCompanion[BsonGenCodecs.type, E](BsonGenCodecs)
61+
62+
/**
63+
* Base class for companion objects of types representing MongoDB entities.
64+
* Entities may be case classes or sealed hierarchies with `@flatten` annotation.
65+
* They must extend [[MongoEntity]].
66+
*/
67+
abstract class MongoEntityCompanion[E <: BaseMongoEntity](
68+
implicit instances: MacroInstances[BsonGenCodecs.type, MongoAdtInstances[E]]
69+
) extends AbstractMongoEntityCompanion[BsonGenCodecs.type, E](BsonGenCodecs)
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
package com.avsystem.commons
22
package mongo.typed
33

4-
import com.avsystem.commons.annotation.explicitGenerics
5-
import com.avsystem.commons.meta.MacroInstances
6-
import com.avsystem.commons.mongo.{BsonGenCodecs, mongoId}
7-
import com.avsystem.commons.serialization.GenObjectCodec
8-
9-
import scala.annotation.{compileTimeOnly, implicitNotFound}
4+
import com.avsystem.commons.mongo.mongoId
105

116
/**
127
* Type-member version of [[MongoEntity]]. Used in type bounds where wildcards would wreak havoc
@@ -34,63 +29,3 @@ trait MongoEntity[ID] extends BaseMongoEntity {
3429
object MongoEntity {
3530
final val Id = "id"
3631
}
37-
38-
trait MongoAdtInstances[T] {
39-
def codec: GenObjectCodec[T]
40-
def format: MongoAdtFormat[T]
41-
}
42-
43-
/**
44-
* Provides additional static validation for `as`, `is` and `ref` macros from [[DataTypeDsl]].
45-
* Catches mistakes when someone forgets to use [[MongoDataCompanion]] or [[MongoEntityCompanion]] for its
46-
* case class or sealed hierarchy.
47-
*/
48-
@implicitNotFound("${T} is an opaque data type - does it have a companion that extends MongoDataCompanion?")
49-
sealed trait IsMongoAdtOrSubtype[T]
50-
51-
abstract class AbstractMongoDataCompanion[Implicits, E](implicits: Implicits)(
52-
implicit instances: MacroInstances[Implicits, MongoAdtInstances[E]]
53-
) extends DataTypeDsl[E] {
54-
implicit val codec: GenObjectCodec[E] = instances(implicits, this).codec
55-
implicit val format: MongoAdtFormat[E] = instances(implicits, this).format
56-
57-
implicit def isMongoAdtOrSubtype[C <: E]: IsMongoAdtOrSubtype[C] = null
58-
59-
implicit class macroDslExtensions(value: E) {
60-
@explicitGenerics
61-
@compileTimeOnly("the .as[Subtype] construct can only be used inside lambda passed to .ref(...) macro")
62-
def as[T <: E]: T = sys.error("stub")
63-
}
64-
65-
final val SelfRef: MongoRef[E, E] = MongoRef.RootRef(format)
66-
}
67-
68-
abstract class AbstractMongoEntityCompanion[Implicits, E <: BaseMongoEntity](implicits: Implicits)(
69-
implicit instances: MacroInstances[Implicits, MongoAdtInstances[E]]
70-
) extends AbstractMongoDataCompanion[Implicits, E](implicits) {
71-
72-
type ID = E#IDType
73-
74-
final val IdRef: Ref[ID] = format.fieldRefFor(SelfRef, MongoEntity.Id)
75-
}
76-
77-
/**
78-
* Base class for companion objects of types that represent inner documents of MongoDB entities.
79-
* Just like entities, inner documents may be case classes or sealed hierarchies with `@flatten` annotation.
80-
*
81-
* NOTE: It is enough for a MongoDB field type to have just `GenCodec` defined (i.e. you can get away with
82-
* using `HasGenCodec` instead of `MongoDataCompanion`). However, data type which only has codec will be considered
83-
* opaque and you won't be able to reference its inner fields in filters, updates, indices, etc.
84-
*/
85-
abstract class MongoDataCompanion[E](
86-
implicit instances: MacroInstances[BsonGenCodecs.type, MongoAdtInstances[E]]
87-
) extends AbstractMongoDataCompanion[BsonGenCodecs.type, E](BsonGenCodecs)
88-
89-
/**
90-
* Base class for companion objects of types representing MongoDB entities.
91-
* Entities may be case classes or sealed hierarchies with `@flatten` annotation.
92-
* They must extend [[MongoEntity]].
93-
*/
94-
abstract class MongoEntityCompanion[E <: BaseMongoEntity](
95-
implicit instances: MacroInstances[BsonGenCodecs.type, MongoAdtInstances[E]]
96-
) extends AbstractMongoEntityCompanion[BsonGenCodecs.type, E](BsonGenCodecs)

0 commit comments

Comments
 (0)