@jakubmazanec/carson-templates 2.3.0-unstable.f7cb327 → 2.4.0-next.83fd9d1

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.
@@ -0,0 +1,2 @@
1
+ import { type Project } from '@jakubmazanec/carson';
2
+ export declare function getAppUrl(project: Project, deploymentEnvironment?: string): string;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ export function getAppUrl(project, deploymentEnvironment) {
3
+ let appName = project.config.deployment?.appName;
4
+ let appUrl = project.config.deployment?.appUrl;
5
+ if (appUrl && deploymentEnvironment === void 0 || !appName && appUrl) {
6
+ return appUrl;
7
+ }
8
+ if (!appName) {
9
+ return `http://localhost:5000`;
10
+ }
11
+ return `https://${deploymentEnvironment ? `${appName}-${deploymentEnvironment}` : appName}.fly.dev`;
12
+ }
13
+ //# sourceMappingURL=getAppUrl.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../source/getAppUrl.ts"],
4
+ "sourcesContent": ["import {type Project} from '@jakubmazanec/carson';\n\nexport function getAppUrl(project: Project, deploymentEnvironment?: string) {\n let appName = (project.config as {deployment?: {appName?: string}}).deployment?.appName;\n let appUrl = (project.config as {deployment?: {appUrl?: string}}).deployment?.appUrl;\n\n if ((appUrl && deploymentEnvironment === undefined) || (!appName && appUrl)) {\n return appUrl;\n }\n\n if (!appName) {\n return `http://localhost:5000`;\n }\n\n return `https://${deploymentEnvironment ? `${appName}-${deploymentEnvironment}` : appName}.fly.dev`;\n}\n"],
5
+ "mappings": ";AAEO,gBAAS,UAAU,SAAkB,uBAAgC;AAC1E,MAAI,UAAW,QAAQ,OAA6C,YAAY;AAChF,MAAI,SAAU,QAAQ,OAA4C,YAAY;AAE9E,MAAK,UAAU,0BAA0B,UAAe,CAAC,WAAW,QAAS;AAC3E,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,wBAAwB,GAAG,OAAO,IAAI,qBAAqB,KAAK,OAAO;AAC3F;",
6
+ "names": []
7
+ }
package/build/main.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './constants.js';
2
+ export * from './getAppUrl.js';
2
3
  export * from './getDependencies.js';
3
4
  export * from './getDevelopmentBranch.js';
4
5
  export * from './getMainBranch.js';
package/build/main.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  export * from "./constants.js";
3
+ export * from "./getAppUrl.js";
3
4
  export * from "./getDependencies.js";
4
5
  export * from "./getDevelopmentBranch.js";
5
6
  export * from "./getMainBranch.js";
package/build/main.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../source/main.ts"],
4
- "sourcesContent": ["export * from './constants.js';\nexport * from './getDependencies.js';\nexport * from './getDevelopmentBranch.js';\nexport * from './getMainBranch.js';\nexport * from './getReferences.js';\nexport * from './getWorkspaceName.js';\nexport {default as lodash} from 'lodash';\nexport {default as semver} from 'semver';\n"],
5
- "mappings": ";AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAQ,WAAW,cAAa;AAChC,SAAQ,WAAW,cAAa;",
4
+ "sourcesContent": ["export * from './constants.js';\nexport * from './getAppUrl.js';\nexport * from './getDependencies.js';\nexport * from './getDevelopmentBranch.js';\nexport * from './getMainBranch.js';\nexport * from './getReferences.js';\nexport * from './getWorkspaceName.js';\nexport {default as lodash} from 'lodash';\nexport {default as semver} from 'semver';\n"],
5
+ "mappings": ";AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAQ,WAAW,cAAa;AAChC,SAAQ,WAAW,cAAa;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jakubmazanec/carson-templates",
3
- "version": "2.3.0-unstable.f7cb327",
3
+ "version": "2.4.0-next.83fd9d1",
4
4
  "description": "Collection of Carson templates.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -31,7 +31,7 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "lodash": "^4.17.21",
34
- "semver": "^7.6.0"
34
+ "semver": "^7.6.2"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@jakubmazanec/carson": "^1.1.0",
@@ -43,17 +43,17 @@
43
43
  "@types/zen-observable": "^0.8.7",
44
44
  "@vitest/coverage-v8": "^1.3.1",
45
45
  "del-cli": "^5.1.0",
46
- "esbuild": "^0.20.1",
46
+ "esbuild": "^0.21.4",
47
47
  "eslint": "^8.56.0",
48
- "execa": "^8.0.1",
48
+ "execa": "^9.1.0",
49
49
  "fast-glob": "^3.3.2",
50
50
  "fs-extra": "^11.2.0",
51
51
  "lodash": "^4.17.21",
52
- "prettier": "^3.2.5",
53
- "prettier-plugin-packagejson": "^2.4.12",
54
- "typedoc": "^0.25.10",
55
- "typedoc-plugin-markdown": "^3.17.1",
56
- "typescript": "^5.3.3",
52
+ "prettier": "^3.3.0",
53
+ "prettier-plugin-packagejson": "^2.5.0",
54
+ "typedoc": "^0.25.13",
55
+ "typedoc-plugin-markdown": "^4.0.3",
56
+ "typescript": "^5.4.5",
57
57
  "vitest": "^1.3.1",
58
58
  "zen-observable": "^0.10.0"
59
59
  },
@@ -0,0 +1,16 @@
1
+ import {type Project} from '@jakubmazanec/carson';
2
+
3
+ export function getAppUrl(project: Project, deploymentEnvironment?: string) {
4
+ let appName = (project.config as {deployment?: {appName?: string}}).deployment?.appName;
5
+ let appUrl = (project.config as {deployment?: {appUrl?: string}}).deployment?.appUrl;
6
+
7
+ if ((appUrl && deploymentEnvironment === undefined) || (!appName && appUrl)) {
8
+ return appUrl;
9
+ }
10
+
11
+ if (!appName) {
12
+ return `http://localhost:5000`;
13
+ }
14
+
15
+ return `https://${deploymentEnvironment ? `${appName}-${deploymentEnvironment}` : appName}.fly.dev`;
16
+ }
package/source/main.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './constants.js';
2
+ export * from './getAppUrl.js';
2
3
  export * from './getDependencies.js';
3
4
  export * from './getDevelopmentBranch.js';
4
5
  export * from './getMainBranch.js';
@@ -3,11 +3,11 @@ to: '.eslintrc.cjs'
3
3
  strategy: overwrite
4
4
  ---
5
5
  <%
6
- let lintIgnorePatterns = [
7
- ...LINT_IGNORE_PATTERNS,
8
- 'dbschema/edgeql-js/',
9
- 'dbschema/interfaces.*',
10
- ];
6
+ let lintIgnorePatterns = [...LINT_IGNORE_PATTERNS];
7
+
8
+ if (project.config.deployment?.dbInstance) {
9
+ lintIgnorePatterns.push('dbschema/edgeql-js/', 'dbschema/interfaces.*');
10
+ }
11
11
  -%>
12
12
  /**
13
13
  * DO NOT EDIT!
@@ -11,12 +11,13 @@ for (let project of workspace.projects) {
11
11
  }
12
12
 
13
13
  let copyFilesLines = ['COPY package-lock.json package.json /workspace/'];
14
+ let currentProject = project;
14
15
 
15
16
  for (let project of workspace.projects) {
16
- if (project.config.deployment?.appName) {
17
+ if (project.config.deployment?.appName && project.name === currentProject.name) {
17
18
  copyFilesLines.push(`COPY --from=build /workspace/${project.relativePath}/build /workspace/${project.relativePath}/build`);
18
19
  copyFilesLines.push(`COPY --from=build /workspace/${project.relativePath}/package.json /workspace/${project.relativePath}/package.json`);
19
- } else {
20
+ } else if (!project.config.deployment?.appName) {
20
21
  if (project.packageJson.bin) {
21
22
  copyFilesLines.push(`COPY --from=build /workspace/${project.relativePath}/bin /workspace/${project.relativePath}/bin`);
22
23
  }
@@ -39,14 +40,31 @@ FROM node:20-slim as base
39
40
 
40
41
  WORKDIR /workspace
41
42
 
43
+ # Set up env variables
42
44
  ENV NODE_ENV=production
45
+ <%
46
+ if (project.config.deployment?.appName) {
47
+ -%>
48
+ ARG VITE_APP_URL
49
+ ENV VITE_APP_URL=$VITE_APP_URL
50
+ <%
51
+ }
52
+
53
+ if (project.config.deployment?.dbInstance) {
54
+ -%>
55
+ ARG EDGEDB_INSTANCE
56
+ ENV EDGEDB_INSTANCE=$EDGEDB_INSTANCE
57
+ ARG EDGEDB_BRANCH
58
+ ENV EDGEDB_BRANCH=$EDGEDB_BRANCH
59
+ <%
60
+ }
61
+ -%>
43
62
 
44
63
  # Throw-away build stage to reduce size of final image
45
64
  FROM base as build
46
65
 
47
66
  # Install packages needed to install dependencies
48
- RUN apt-get update -qq && \
49
- apt-get install --no-install-recommends -y build-essential node-gyp pkg-config python-is-python3
67
+ RUN apt-get update -qq && apt-get install --no-install-recommends -y build-essential node-gyp pkg-config python-is-python3
50
68
 
51
69
  # Install dependencies
52
70
  <%- installDependenciesLines.join('\n') %>
@@ -56,7 +74,17 @@ RUN npm ci --include=dev --ignore-scripts
56
74
  COPY --link . .
57
75
 
58
76
  # Build
59
- RUN npm run build
77
+ <%
78
+ if (project.config.deployment?.dbInstance) {
79
+ -%>
80
+ RUN --mount=type=secret,id=EDGEDB_SECRET_KEY EDGEDB_SECRET_KEY="$(cat /run/secrets/EDGEDB_SECRET_KEY)" npm run build
81
+ <%
82
+ } else {
83
+ -%>
84
+ RUN npm run build -- --filter=<%- project.name %>
85
+ <%
86
+ }
87
+ -%>
60
88
 
61
89
  # Final stage for app image
62
90
  FROM base
@@ -68,6 +96,6 @@ FROM base
68
96
  RUN npm ci --omit=dev --ignore-scripts
69
97
 
70
98
  # Start the server
71
- WORKDIR /workspace/apps/somewhere
99
+ WORKDIR /workspace/<%- project.relativePath %>
72
100
  EXPOSE 5000
73
101
  ENTRYPOINT ["npm", "start"]
@@ -22,5 +22,5 @@ If you want to contribute, see [CONTRIBUTING](./CONTRIBUTING.md) for details.
22
22
 
23
23
  ## License
24
24
 
25
- This package is licensed under the GNU Affero General Public License v3. See [LICENSE](./LICENSE.md)
25
+ This app is licensed under the GNU Affero General Public License v3. See [LICENSE](./LICENSE.md)
26
26
  for details.
@@ -13,11 +13,16 @@ let tsconfig = lodash.merge(
13
13
  resolveJsonModule: true,
14
14
  rootDir: '.',
15
15
  },
16
- include: ['./env.d.ts', './*', './app/**/*'],
16
+ include: project.config.deployment?.dbInstance ? ['./app/**/*', './dbschema/**/*', './*'] : ['./app/**/*', './*'],
17
17
  references: getReferences(workspace, project),
18
18
  },
19
19
  project.config.overrides?.tsconfig ?? {},
20
20
  );
21
+
22
+ // TODO: when EdgeDB client supports `exactOptionalPropertyTypes: true`, remove this line
23
+ if (project.config.deployment?.dbInstance) {
24
+ tsconfig.compilerOptions.exactOptionalPropertyTypes = false;
25
+ }
21
26
  -%>
22
27
  //
23
28
  // DO NOT EDIT!
@@ -2,6 +2,18 @@
2
2
  to: 'tsconfig.typecheck.json'
3
3
  strategy: overwrite
4
4
  ---
5
+ <%
6
+ let tsconfig = lodash.merge(
7
+ {
8
+ extends: './tsconfig.json',
9
+ compilerOptions: {
10
+ composite: false,
11
+ },
12
+ include: project.config.deployment?.dbInstance ? ['./app/**/*', './dbschema/**/*', './tests/**/*', './*'] : ['./app/**/*', './tests/**/*', './*'],
13
+ },
14
+ project.config.overrides?.tsconfig ?? {},
15
+ );
16
+ -%>
5
17
  //
6
18
  // DO NOT EDIT!
7
19
  // This file was autogenerated by Carson.
@@ -10,10 +22,4 @@ strategy: overwrite
10
22
  // Run `npx carson update workspace` to regenerate.
11
23
  //
12
24
 
13
- {
14
- "extends": "./tsconfig.json",
15
- "compilerOptions": {
16
- "composite": false
17
- },
18
- "include": ["./app/**/*", "./tests/**/*", "./*"]
19
- }
25
+ <%- JSON.stringify(tsconfig, null, 2) %>
@@ -9,7 +9,17 @@ let lines = [];
9
9
  for (let project of workspace.projects) {
10
10
  if (project.config.deployment?.appName) {
11
11
  lines.push(`!${project.relativePath}/app/**`);
12
+
13
+ if (project.config.deployment?.dbInstance) {
14
+ lines.push(`!${project.relativePath}/dbschema/**`);
15
+ }
16
+
12
17
  lines.push(`!${project.relativePath}/public/**`);
18
+
19
+ if (project.config.deployment?.dbInstance) {
20
+ lines.push(`!${project.relativePath}/edgedb.toml`);
21
+ }
22
+
13
23
  lines.push(`!${project.relativePath}/env.d.ts`);
14
24
  lines.push(`!${project.relativePath}/package.json`);
15
25
  lines.push(`!${project.relativePath}/postcss.config.cjs`);
@@ -2,6 +2,21 @@
2
2
  to: '.github/workflows/check-pull-request.yaml'
3
3
  strategy: overwrite
4
4
  ---
5
+ <%
6
+ let appsWithDb = [];
7
+
8
+ for (let project of workspace.projects) {
9
+ if (project.config.deployment?.dbInstance) {
10
+ appsWithDb.push(project.name);
11
+ }
12
+ }
13
+
14
+ let appsWithDbFilter = appsWithDb.map((name) => `--filter=!${name}`).join(' ');
15
+
16
+ if (appsWithDbFilter) {
17
+ appsWithDbFilter = `-- ${appsWithDbFilter}`;
18
+ }
19
+ -%>
5
20
  #
6
21
  # DO NOT EDIT!
7
22
  # This file was autogenerated by Carson.
@@ -45,6 +60,17 @@ jobs:
45
60
  with:
46
61
  node-version: 20
47
62
 
63
+ <%
64
+ if (workspace.projects.some((project) => project.config.deployment?.dbInstance)) {
65
+ -%>
66
+
67
+ - uses: edgedb/setup-edgedb@v1
68
+ with:
69
+ server-version: none
70
+ <%
71
+ }
72
+ -%>
73
+
48
74
  - name: Install packages
49
75
  run: npm ci
50
76
 
@@ -62,8 +88,25 @@ jobs:
62
88
 
63
89
  git config --unset core.filemode
64
90
 
65
- - name: Run tests
66
- run: npm test
91
+ - name: Test
92
+ run: npm test <%- appsWithDbFilter %>
93
+
94
+ <%
95
+ for (let project of workspace.projects) {
96
+ if (project.config.deployment?.dbInstance) {
97
+ -%>
98
+
99
+ - name: Test "<%- project.name %>"
100
+ run: |
101
+ npm run test -- --filter=<%- project.name %>
102
+ env:
103
+ EDGEDB_INSTANCE: <%- project.config.deployment.dbInstance %>
104
+ EDGEDB_BRANCH: ${{ github.head_ref }}
105
+ EDGEDB_SECRET_KEY: ${{ secrets.<%- lodash.snakeCase(project.config.deployment.dbInstance).toUpperCase() %>_EDGEDB_TOKEN }}
106
+ <%
107
+ }
108
+ }
109
+ -%>
67
110
 
68
111
  - name: Check for changes
69
112
  run: |
@@ -2,6 +2,32 @@
2
2
  to: '.github/workflows/release-pull-request.yaml'
3
3
  strategy: overwrite
4
4
  ---
5
+ <%
6
+ let apps = [];
7
+ let appsWithDb = [];
8
+
9
+ for (let project of workspace.projects) {
10
+ if (project.config.deployment?.appName) {
11
+ apps.push(project.name);
12
+ }
13
+
14
+ if (project.config.deployment?.dbInstance) {
15
+ appsWithDb.push(project.name);
16
+ }
17
+ }
18
+
19
+ let appsFilter = apps.map((name) => `--filter=!${name}`).join(' ');
20
+
21
+ if (appsFilter) {
22
+ appsFilter = `-- ${appsFilter}`;
23
+ }
24
+
25
+ let appsWithDbFilter = appsWithDb.map((name) => `--filter=!${name}`).join(' ');
26
+
27
+ if (appsWithDbFilter) {
28
+ appsWithDbFilter = `-- ${appsWithDbFilter}`;
29
+ }
30
+ -%>
5
31
  #
6
32
  # DO NOT EDIT!
7
33
  # This file was autogenerated by Carson.
@@ -47,26 +73,20 @@ jobs:
47
73
  registry-url: 'https://registry.npmjs.org'
48
74
 
49
75
  <%
50
- if (workspace.projects.some((project) => project.config.deployment?.dbInstance)) {
76
+ if (workspace.projects.some((project) => project.config.deployment?.appName)) {
51
77
  -%>
52
78
 
53
- - uses: edgedb/setup-edgedb@v1
54
- - with:
55
- server-version: none
79
+ - uses: superfly/flyctl-actions/setup-flyctl@master
56
80
  <%
57
81
  }
58
82
 
59
- for (let project of workspace.projects) {
60
- if (project.config.deployment?.dbInstance) {
83
+ if (workspace.projects.some((project) => project.config.deployment?.dbInstance)) {
61
84
  -%>
62
85
 
63
- - name: Authenticate EdgeDB Cloud
64
- env:
65
- EDGEDB_SECRET_KEY: ${{ secrets.<%- lodash.snakeCase(project.config.deployment.dbInstance.split('/')[1] ?? '').toUpperCase() %>_EDGEDB_TOKEN }}
66
- run: |
67
- edgedb project init --link <%- project.config.deployment?.dbInstance %>
86
+ - uses: edgedb/setup-edgedb@v1
87
+ with:
88
+ server-version: none
68
89
  <%
69
- }
70
90
  }
71
91
  -%>
72
92
 
@@ -87,8 +107,25 @@ for (let project of workspace.projects) {
87
107
 
88
108
  git config --unset core.filemode
89
109
 
90
- - name: Run tests
91
- run: npm test
110
+ - name: Test
111
+ run: npm test <%- appsWithDbFilter %>
112
+
113
+ <%
114
+ for (let project of workspace.projects) {
115
+ if (project.config.deployment?.dbInstance) {
116
+ -%>
117
+
118
+ - name: Test "<%- project.name %>"
119
+ run: |
120
+ npm run test -- --filter=<%- project.name %>
121
+ env:
122
+ EDGEDB_INSTANCE: <%- project.config.deployment.dbInstance %>
123
+ EDGEDB_BRANCH: ${{ github.head_ref }}
124
+ EDGEDB_SECRET_KEY: ${{ secrets.<%- lodash.snakeCase(project.config.deployment.dbInstance).toUpperCase() %>_EDGEDB_TOKEN }}
125
+ <%
126
+ }
127
+ }
128
+ -%>
92
129
 
93
130
  - name: Check for changes
94
131
  run: |
@@ -105,7 +142,7 @@ for (let project of workspace.projects) {
105
142
  git config --unset core.filemode
106
143
 
107
144
  - name: Build packages
108
- run: npm run build
145
+ run: npm run build <%- appsFilter %>
109
146
 
110
147
  - name: Authenticate to npm registry
111
148
  run: |
@@ -128,21 +165,29 @@ for (let project of workspace.projects) {
128
165
  NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
129
166
  NPM_CONFIG_PROVENANCE: 'true' # must be string, not boolean
130
167
  <%
131
- if (workspace.projects.some((project) => project.config.deployment?.appName)) {
168
+ for (let project of workspace.projects) {
169
+ if (project.config.deployment?.appName && project.config.deployment?.dbInstance) {
132
170
  -%>
133
171
 
134
- - uses: superfly/flyctl-actions/setup-flyctl@master
172
+ - name: Deploy <%- project.name %>
173
+ run: |
174
+ npm run deploy --workspace <%- project.name %> -- --app <%- project.config.deployment?.appName %>-unstable --build-arg "VITE_APP_URL=$VITE_APP_URL" --build-arg "EDGEDB_INSTANCE=$EDGEDB_INSTANCE" --build-arg "EDGEDB_BRANCH=$EDGEDB_BRANCH" --build-secret "EDGEDB_SECRET_KEY=$EDGEDB_SECRET_KEY"
175
+ env:
176
+ VITE_APP_URL: <%- getAppUrl(project, 'unstable') %>
177
+ EDGEDB_INSTANCE: <%- project.config.deployment.dbInstance %>
178
+ EDGEDB_BRANCH: ${{ github.head_ref }}
179
+ EDGEDB_SECRET_KEY: ${{ secrets.<%- lodash.snakeCase(project.config.deployment.dbInstance).toUpperCase() %>_EDGEDB_TOKEN }}
180
+ FLY_ACCESS_TOKEN: ${{ secrets.FLY_TOKEN }}
181
+ FLY_API_TOKEN: ${{ secrets.FLY_TOKEN }}
135
182
  <%
136
- }
137
-
138
- for (let project of workspace.projects) {
139
- if (project.config.deployment?.appName) {
183
+ } else if (project.config.deployment?.appName) {
140
184
  -%>
141
185
 
142
186
  - name: Deploy <%- project.name %>
143
- run:
144
- npm run deploy --workspace <%- project.name %> -- --app <%- project.config.deployment?.appName %>-unstable
187
+ run: |
188
+ npm run deploy --workspace <%- project.name %> -- --app <%- project.config.deployment?.appName %>-unstable --build-arg "VITE_APP_URL=$VITE_APP_URL"
145
189
  env:
190
+ VITE_APP_URL: <%- getAppUrl(project, 'unstable') %>
146
191
  FLY_ACCESS_TOKEN: ${{ secrets.FLY_TOKEN }}
147
192
  FLY_API_TOKEN: ${{ secrets.FLY_TOKEN }}
148
193
  <%
@@ -2,6 +2,32 @@
2
2
  to: '.github/workflows/release.yaml'
3
3
  strategy: overwrite
4
4
  ---
5
+ <%
6
+ let apps = [];
7
+ let appsWithDb = [];
8
+
9
+ for (let project of workspace.projects) {
10
+ if (project.config.deployment?.appName) {
11
+ apps.push(project.name);
12
+ }
13
+
14
+ if (project.config.deployment?.dbInstance) {
15
+ appsWithDb.push(project.name);
16
+ }
17
+ }
18
+
19
+ let appsFilter = apps.map((name) => `--filter=!${name}`).join(' ');
20
+
21
+ if (appsFilter) {
22
+ appsFilter = `-- ${appsFilter}`;
23
+ }
24
+
25
+ let appsWithDbFilter = appsWithDb.map((name) => `--filter=!${name}`).join(' ');
26
+
27
+ if (appsWithDbFilter) {
28
+ appsWithDbFilter = `-- ${appsWithDbFilter}`;
29
+ }
30
+ -%>
5
31
  #
6
32
  # DO NOT EDIT!
7
33
  # This file was autogenerated by Carson.
@@ -43,6 +69,24 @@ jobs:
43
69
  node-version: 20
44
70
  registry-url: 'https://registry.npmjs.org'
45
71
 
72
+ <%
73
+ if (workspace.projects.some((project) => project.config.deployment?.appName)) {
74
+ -%>
75
+
76
+ - uses: superfly/flyctl-actions/setup-flyctl@master
77
+ <%
78
+ }
79
+
80
+ if (workspace.projects.some((project) => project.config.deployment?.dbInstance)) {
81
+ -%>
82
+
83
+ - uses: edgedb/setup-edgedb@v1
84
+ with:
85
+ server-version: none
86
+ <%
87
+ }
88
+ -%>
89
+
46
90
  - name: Install packages
47
91
  run: npm ci
48
92
 
@@ -60,8 +104,42 @@ jobs:
60
104
 
61
105
  git config --unset core.filemode
62
106
 
63
- - name: Run tests
64
- run: npm test
107
+ <%
108
+ for (let project of workspace.projects) {
109
+ if (project.config.deployment?.dbInstance) {
110
+ -%>
111
+
112
+ - name: Migrate "<%- project.name %>"
113
+ run: |
114
+ edgedb migrate --schema-dir <%- project.relativePath %>/dbschema
115
+ env:
116
+ EDGEDB_INSTANCE: <%- project.config.deployment.dbInstance %>
117
+ EDGEDB_BRANCH: ${{ github.ref_name }}
118
+ EDGEDB_SECRET_KEY: ${{ secrets.<%- lodash.snakeCase(project.config.deployment.dbInstance).toUpperCase() %>_EDGEDB_TOKEN }}
119
+ <%
120
+ }
121
+ }
122
+ -%>
123
+
124
+ - name: Test
125
+ run: npm test <%- appsWithDbFilter %>
126
+
127
+ <%
128
+ for (let project of workspace.projects) {
129
+ if (project.config.deployment?.dbInstance) {
130
+ -%>
131
+
132
+ - name: Test "<%- project.name %>"
133
+ run: |
134
+ npm run test -- --filter=<%- project.name %>
135
+ env:
136
+ EDGEDB_INSTANCE: <%- project.config.deployment.dbInstance %>
137
+ EDGEDB_BRANCH: ${{ github.ref_name }}
138
+ EDGEDB_SECRET_KEY: ${{ secrets.<%- lodash.snakeCase(project.config.deployment.dbInstance).toUpperCase() %>_EDGEDB_TOKEN }}
139
+ <%
140
+ }
141
+ }
142
+ -%>
65
143
 
66
144
  - name: Check for changes
67
145
  run: |
@@ -78,7 +156,7 @@ jobs:
78
156
  git config --unset core.filemode
79
157
 
80
158
  - name: Build packages
81
- run: npm run build
159
+ run: npm run build <%- appsFilter %>
82
160
 
83
161
  - name: Authenticate to npm registry
84
162
  run: |
@@ -128,22 +206,31 @@ jobs:
128
206
  - name: Push changes
129
207
  run: |
130
208
  git push --follow-tags
209
+
131
210
  <%
132
- if (workspace.projects.some((project) => project.config.deployment?.appName)) {
211
+ for (let project of workspace.projects) {
212
+ if (project.config.deployment?.appName && project.config.deployment?.dbInstance) {
133
213
  -%>
134
214
 
135
- - uses: superfly/flyctl-actions/setup-flyctl@master
215
+ - name: Deploy "<%- project.name %>"
216
+ run: |
217
+ npm run deploy --workspace <%- project.name %> -- --build-arg "VITE_APP_URL=$VITE_APP_URL" --build-arg "EDGEDB_INSTANCE=$EDGEDB_INSTANCE" --build-arg "EDGEDB_BRANCH=$EDGEDB_BRANCH" --build-secret "EDGEDB_SECRET_KEY=$EDGEDB_SECRET_KEY"
218
+ env:
219
+ VITE_APP_URL: <%- getAppUrl(project) %>
220
+ EDGEDB_INSTANCE: <%- project.config.deployment.dbInstance %>
221
+ EDGEDB_BRANCH: ${{ github.ref_name }}
222
+ EDGEDB_SECRET_KEY: ${{ secrets.<%- lodash.snakeCase(project.config.deployment.dbInstance).toUpperCase() %>_EDGEDB_TOKEN }}
223
+ FLY_ACCESS_TOKEN: ${{ secrets.FLY_TOKEN }}
224
+ FLY_API_TOKEN: ${{ secrets.FLY_TOKEN }}
136
225
  <%
137
- }
138
-
139
- for (let project of workspace.projects) {
140
- if (project.config.deployment?.appName) {
226
+ } else if (project.config.deployment?.appName) {
141
227
  -%>
142
228
 
143
- - name: Deploy <%- project.name %>
144
- run:
145
- npm run deploy --workspace <%- project.name %>
229
+ - name: Deploy "<%- project.name %>"
230
+ run: |
231
+ npm run deploy --workspace <%- project.name %> -- --build-arg "VITE_APP_URL=$VITE_APP_URL"
146
232
  env:
233
+ VITE_APP_URL: <%- getAppUrl(project) %>
147
234
  FLY_ACCESS_TOKEN: ${{ secrets.FLY_TOKEN }}
148
235
  FLY_API_TOKEN: ${{ secrets.FLY_TOKEN }}
149
236
  <%
@@ -194,6 +281,24 @@ for (let project of workspace.projects) {
194
281
  node-version: 20
195
282
  registry-url: 'https://registry.npmjs.org'
196
283
 
284
+ <%
285
+ if (workspace.projects.some((project) => project.config.deployment?.appName)) {
286
+ -%>
287
+
288
+ - uses: superfly/flyctl-actions/setup-flyctl@master
289
+ <%
290
+ }
291
+
292
+ if (workspace.projects.some((project) => project.config.deployment?.dbInstance)) {
293
+ -%>
294
+
295
+ - uses: edgedb/setup-edgedb@v1
296
+ with:
297
+ server-version: none
298
+ <%
299
+ }
300
+ -%>
301
+
197
302
  - name: Install packages
198
303
  run: npm ci
199
304
 
@@ -211,8 +316,42 @@ for (let project of workspace.projects) {
211
316
 
212
317
  git config --unset core.filemode
213
318
 
214
- - name: Run tests
215
- run: npm test
319
+ <%
320
+ for (let project of workspace.projects) {
321
+ if (project.config.deployment?.dbInstance) {
322
+ -%>
323
+
324
+ - name: Migrate "<%- project.name %>"
325
+ run: |
326
+ edgedb migrate --schema-dir <%- project.relativePath %>/dbschema
327
+ env:
328
+ EDGEDB_INSTANCE: <%- project.config.deployment.dbInstance %>
329
+ EDGEDB_BRANCH: ${{ github.ref_name }}
330
+ EDGEDB_SECRET_KEY: ${{ secrets.<%- lodash.snakeCase(project.config.deployment.dbInstance).toUpperCase() %>_EDGEDB_TOKEN }}
331
+ <%
332
+ }
333
+ }
334
+ -%>
335
+
336
+ - name: Test
337
+ run: npm test <%- appsWithDbFilter %>
338
+
339
+ <%
340
+ for (let project of workspace.projects) {
341
+ if (project.config.deployment?.dbInstance) {
342
+ -%>
343
+
344
+ - name: Test "<%- project.name %>"
345
+ run: |
346
+ npm run test -- --filter=<%- project.name %>
347
+ env:
348
+ EDGEDB_INSTANCE: <%- project.config.deployment.dbInstance %>
349
+ EDGEDB_BRANCH: ${{ github.ref_name }}
350
+ EDGEDB_SECRET_KEY: ${{ secrets.<%- lodash.snakeCase(project.config.deployment.dbInstance).toUpperCase() %>_EDGEDB_TOKEN }}
351
+ <%
352
+ }
353
+ }
354
+ -%>
216
355
 
217
356
  - name: Check for changes
218
357
  run: |
@@ -229,7 +368,7 @@ for (let project of workspace.projects) {
229
368
  git config --unset core.filemode
230
369
 
231
370
  - name: Build packages
232
- run: npm run build
371
+ run: npm run build <%- appsFilter %>
233
372
 
234
373
  - name: Update documentation
235
374
  run: |
@@ -262,21 +401,29 @@ for (let project of workspace.projects) {
262
401
  NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
263
402
  NPM_CONFIG_PROVENANCE: 'true' # must be string, not boolean
264
403
  <%
265
- if (workspace.projects.some((project) => project.config.deployment?.appName)) {
404
+ for (let project of workspace.projects) {
405
+ if (project.config.deployment?.appName && project.config.deployment?.dbInstance) {
266
406
  -%>
267
407
 
268
- - uses: superfly/flyctl-actions/setup-flyctl@master
408
+ - name: Deploy "<%- project.name %>"
409
+ run: |
410
+ npm run deploy --workspace <%- project.name %> -- --app <%- project.config.deployment?.appName %>-next --build-arg "VITE_APP_URL=$VITE_APP_URL" --build-arg "EDGEDB_INSTANCE=$EDGEDB_INSTANCE" --build-arg "EDGEDB_BRANCH=$EDGEDB_BRANCH" --build-secret "EDGEDB_SECRET_KEY=$EDGEDB_SECRET_KEY"
411
+ env:
412
+ VITE_APP_URL: <%- getAppUrl(project, 'next') %>
413
+ EDGEDB_INSTANCE: <%- project.config.deployment.dbInstance %>
414
+ EDGEDB_BRANCH: ${{ github.ref_name }}
415
+ EDGEDB_SECRET_KEY: ${{ secrets.<%- lodash.snakeCase(project.config.deployment.dbInstance).toUpperCase() %>_EDGEDB_TOKEN }}
416
+ FLY_ACCESS_TOKEN: ${{ secrets.FLY_TOKEN }}
417
+ FLY_API_TOKEN: ${{ secrets.FLY_TOKEN }}
269
418
  <%
270
- }
271
-
272
- for (let project of workspace.projects) {
273
- if (project.config.deployment?.appName) {
419
+ } else if (project.config.deployment?.appName) {
274
420
  -%>
275
421
 
276
- - name: Deploy <%- project.name %>
277
- run:
278
- npm run deploy --workspace <%- project.name %> -- --app <%- project.config.deployment?.appName %>-next
422
+ - name: Deploy "<%- project.name %>"
423
+ run: |
424
+ npm run deploy --workspace <%- project.name %> -- --app <%- project.config.deployment?.appName %>-next --build-arg "VITE_APP_URL=$VITE_APP_URL"
279
425
  env:
426
+ VITE_APP_URL: <%- getAppUrl(project, 'next') %>
280
427
  FLY_ACCESS_TOKEN: ${{ secrets.FLY_TOKEN }}
281
428
  FLY_API_TOKEN: ${{ secrets.FLY_TOKEN }}
282
429
  <%
@@ -8,7 +8,7 @@ let turboConfig = {
8
8
  pipeline: {
9
9
  build: {
10
10
  dependsOn: ['^build', 'codegen'],
11
- outputs: [`${BUILD_DIRECTORY}/**`],
11
+ outputs: [`${BUILD_DIRECTORY}/**`, 'app/**'],
12
12
  },
13
13
  clean: {
14
14
  cache: false,
@@ -33,7 +33,7 @@ let turboConfig = {
33
33
  outputs: [],
34
34
  },
35
35
  test: {
36
- dependsOn: ['^build', 'typecheck', 'lint'],
36
+ dependsOn: ['^build', 'codegen', 'typecheck', 'lint'],
37
37
  outputs: ['coverage/**'],
38
38
  },
39
39
  typecheck: {
@@ -41,6 +41,7 @@ let turboConfig = {
41
41
  outputs: [],
42
42
  },
43
43
  },
44
+ globalEnv: [],
44
45
  globalDependencies: [
45
46
  '.editorconfig',
46
47
  '.eslintrc.cjs',
@@ -51,6 +52,14 @@ let turboConfig = {
51
52
  ],
52
53
  };
53
54
 
55
+ if (workspace.projects.some((project) => project.config.deployment?.appName)) {
56
+ turboConfig.globalEnv.push('VITE_APP_URL');
57
+ }
58
+
59
+ if (workspace.projects.some((project) => project.config.deployment?.dbInstance)) {
60
+ turboConfig.globalEnv.push('EDGEDB_INSTANCE', 'EDGEDB_BRANCH', 'EDGEDB_SECRET_KEY');
61
+ }
62
+
54
63
  if (workspace.projects.find((project) => project.name === LINTER_CONFIG_PACKAGE_NAME)) {
55
64
  turboConfig.pipeline.lint.dependsOn = [`${LINTER_CONFIG_PACKAGE_NAME}#build`, '^build', 'codegen'];
56
65
  }