create-cloesce 0.3.4 → 0.4.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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "create-cloesce",
3
3
  "description": "Create Cloesce App",
4
- "version": "0.3.4",
4
+ "version": "0.4.0",
5
5
  "author": "Ben Schreiber <bpschreiber2003@gmail.com>",
6
6
  "repository": {
7
7
  "url": "https://github.com/bens-schreiber/create-cloesce-app"
@@ -10,7 +10,7 @@
10
10
  "test": "vitest"
11
11
  },
12
12
  "dependencies": {
13
- "cloesce": ">=0.3.0",
13
+ "cloesce": ">=0.4.0",
14
14
  "wrangler": "^4.61.1"
15
15
  },
16
16
  "devDependencies": {
@@ -16,9 +16,8 @@ env {
16
16
 
17
17
  // If a model is to be stored in a D1 database as a table, it must be decorated with `[use <binding>]`
18
18
  // The `list`, `get`, and `save` operations are used to generate CRUD operations for the model.
19
- // Optionally, these tags can be combined, e.g. `[use db, list, get, save]`
20
19
  [use db]
21
- [use list, save, get]
20
+ [crud list, save, get]
22
21
  model WeatherReport {
23
22
  // The `primary` block describes the primary key of the table.
24
23
  // It can be composed of several fields. Any number of primary blocks can be defined,
@@ -26,6 +25,12 @@ model WeatherReport {
26
25
  primary {
27
26
  id: int
28
27
  }
28
+
29
+ // Define regular SQL columns under the `column` block.
30
+ column {
31
+ title: string
32
+ description: string
33
+ }
29
34
 
30
35
  // A `nav` block describes a relationship between two models.
31
36
  // In this case, it is a one-to-many relationship between WeatherReport and Weather,
@@ -39,25 +44,27 @@ model WeatherReport {
39
44
  nav (Weather::weatherReportId) {
40
45
  weatherEntries
41
46
  }
42
-
43
- // All fields that are not apart of a block are just regular fields in the table.
44
- title: string
45
- description: string
46
47
  }
47
48
 
48
49
  [use db]
49
- [use get, list, save]
50
+ [crud get, list, save]
50
51
  model Weather {
51
52
  primary {
52
53
  id: int
53
54
  }
55
+
56
+ column {
57
+ dateTime: date
58
+ location: string
59
+ temperature: int
60
+ condition: string
61
+ }
54
62
 
55
63
  // A `foreign` block describes a one to one relationship between two models.
56
64
  // It translates directly to a foreign key constraint in the database (`weatherReportId` references `id` in WeatherReport).
57
65
  foreign (WeatherReport::id) {
58
66
  weatherReportId
59
67
 
60
-
61
68
  // A `nav` block inside a `foreign` block generates a navigation field,
62
69
  // meaning the backend and client will have a WeatherReport object named `weatherReport` nested inside the Weather model.
63
70
  nav {
@@ -68,11 +75,6 @@ model Weather {
68
75
  r2 (bucket, "weather/photos/{id}.jpg") {
69
76
  photo
70
77
  }
71
-
72
- dateTime: date
73
- location: string
74
- temperature: int
75
- condition: string
76
78
  }
77
79
 
78
80
  // An `api` block describes what endpoints must be implemented in the backend
@@ -85,7 +87,8 @@ api Weather {
85
87
  //
86
88
  // In this case, `uploadPhoto` accepts the Wrangler environment (dependency injected),
87
89
  // and a stream (the photo to be uploaded).
88
- post uploadPhoto(self, e: env, s: stream) -> void
90
+ [inject bucket]
91
+ post uploadPhoto(self, s: stream)
89
92
 
90
93
  // By default, Cloesce will hydrate a `self` instance with all 1:1, KV, R2,
91
94
  // and the near side of 1:M/M:M relationships.
@@ -23,10 +23,7 @@ const showResult = (outputId: string, result: any) => {
23
23
  };
24
24
 
25
25
  window.listReports = async () => {
26
- const result = await WeatherReport.$list({
27
- lastSeen_id: 0,
28
- limit: 100
29
- })
26
+ const result = await WeatherReport.$list(0, 100);
30
27
  showResult('list-output', result);
31
28
  };
32
29
 
@@ -51,9 +48,7 @@ window.addWeatherEntry = async () => {
51
48
  return;
52
49
  }
53
50
 
54
- const getResult = await WeatherReport.$get({
55
- id: reportId
56
- });
51
+ const getResult = await WeatherReport.$get(reportId);
57
52
  if (!getResult.ok) {
58
53
  showResult('entry-output', getResult);
59
54
  return;
@@ -64,12 +64,12 @@ describe("Miniflare Integration Tests", () => {
64
64
  temperature: 25,
65
65
  condition: "Sunny"
66
66
  }]
67
- }))!;
67
+ })).value!;
68
68
 
69
69
  await Weather.uploadPhoto(report.weatherEntries[0], env, testData as any);
70
70
 
71
71
  // Act
72
- const weatherEntries = (await Weather.Default.list(env, 0, 100))!;
72
+ const weatherEntries = (await Weather.Default.list(env, 0, 100)).value!;
73
73
  const photo = Weather.downloadPhoto(weatherEntries[0]);
74
74
 
75
75
  // Assert