create-qs 0.0.0 → 0.8.23

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 (60) hide show
  1. package/README.md +140 -2
  2. package/index.js +1884 -0
  3. package/package.json +31 -5
  4. package/template/default/.quicksilver/.gitattributes +4 -0
  5. package/template/default/.quicksilver/manual/en-US/00-setup.md +199 -0
  6. package/template/default/.quicksilver/manual/zh-CN/00-setup.md +199 -0
  7. package/template/default/.quicksilver/manual/zh-TW/00-setup.md +199 -0
  8. package/template/default/AGENTS.md +333 -0
  9. package/template/default/README.md +5 -0
  10. package/template/default/_gitignore +70 -0
  11. package/template/default/build.gradle.kts +5 -0
  12. package/template/default/eslint.config.js +137 -0
  13. package/template/default/gradle/repo.settings.gradle.kts +90 -0
  14. package/template/default/gradle/wrapper/gradle-wrapper.jar +0 -0
  15. package/template/default/gradle/wrapper/gradle-wrapper.properties +7 -0
  16. package/template/default/gradle.properties +15 -0
  17. package/template/default/gradlew +248 -0
  18. package/template/default/gradlew.bat +93 -0
  19. package/template/default/modules/{{MODULE_DIRECTORY}}/api/build.gradle.kts +8 -0
  20. package/template/default/modules/{{MODULE_DIRECTORY}}/api/data/demo/README.md +11 -0
  21. package/template/default/modules/{{MODULE_DIRECTORY}}/api/data/init/rows/menus.jsons +1 -0
  22. package/template/default/modules/{{MODULE_DIRECTORY}}/api/data/init/rows/misc.jsons +15 -0
  23. package/template/default/modules/{{MODULE_DIRECTORY}}/api/data/upgrade/draft.jsons +1 -0
  24. package/template/default/modules/{{MODULE_DIRECTORY}}/api/src/main/kotlin/{{API_PACKAGE}}/AutoConfiguration.kt +25 -0
  25. package/template/default/modules/{{MODULE_DIRECTORY}}/api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  26. package/template/default/modules/{{MODULE_DIRECTORY}}/api/src/test/kotlin/{{API_PACKAGE}}/SmokeTests.kt +61 -0
  27. package/template/default/modules/{{MODULE_DIRECTORY}}/api/src/test/kotlin/{{API_PACKAGE}}/TestConfiguration.kt +6 -0
  28. package/template/default/modules/{{MODULE_DIRECTORY}}/module.yaml +8 -0
  29. package/template/default/modules/{{MODULE_DIRECTORY}}/web/package.json +25 -0
  30. package/template/default/modules/{{MODULE_DIRECTORY}}/web/src/module.ts +16 -0
  31. package/template/default/modules/{{MODULE_DIRECTORY}}/web/src/vite-env.d.ts +10 -0
  32. package/template/default/modules/{{MODULE_DIRECTORY}}/web/tsconfig.app.json +7 -0
  33. package/template/default/modules/{{MODULE_DIRECTORY}}/web/tsconfig.json +7 -0
  34. package/template/default/modules/{{MODULE_DIRECTORY}}/web/tsconfig.node.json +7 -0
  35. package/template/default/modules/{{MODULE_DIRECTORY}}/web/vite.config.ts +11 -0
  36. package/template/default/package.json +76 -0
  37. package/template/default/pnpm-workspace.yaml +40 -0
  38. package/template/default/publishing.yaml +52 -0
  39. package/template/default/quicksilver.yaml +13 -0
  40. package/template/default/run/api/build.gradle.kts +8 -0
  41. package/template/default/run/api/config/README.md +76 -0
  42. package/template/default/run/api/config/application-dev.yaml +45 -0
  43. package/template/default/run/api/config/application-h2.yaml +22 -0
  44. package/template/default/run/api/config/application-mariadb.yaml +22 -0
  45. package/template/default/run/api/config/application-mssql.yaml +22 -0
  46. package/template/default/run/api/config/application-oracle.yaml +22 -0
  47. package/template/default/run/api/config/application-postgresql.yaml +22 -0
  48. package/template/default/run/api/config/application-test.yaml +28 -0
  49. package/template/default/run/api/config/application.yaml +84 -0
  50. package/template/default/run/api/config/logback-test.xml +141 -0
  51. package/template/default/run/api/config/logback.xml +142 -0
  52. package/template/default/run/web/index.html +14 -0
  53. package/template/default/run/web/index.ts +6 -0
  54. package/template/default/run/web/package.json +18 -0
  55. package/template/default/run/web/static/config.js +15 -0
  56. package/template/default/run/web/tsconfig.app.json +4 -0
  57. package/template/default/run/web/tsconfig.json +7 -0
  58. package/template/default/run/web/tsconfig.node.json +4 -0
  59. package/template/default/run/web/vite.config.ts +21 -0
  60. package/template/default/settings.gradle.kts +19 -0
@@ -0,0 +1,84 @@
1
+ #
2
+ # By default, this file is for `run/api` subproject, so the path is relative to `run/api`
3
+ #
4
+ server:
5
+ port: ${API_PORT:6288}
6
+ # servlet.context-path: /quicksilver
7
+ error:
8
+ path: /error
9
+ whitelabel.enabled: false
10
+
11
+ spring:
12
+ application.name: Quicksilver
13
+ profiles.active: dev
14
+ test.database.replace: none
15
+ security.filter.dispatcher-types: request, async, error # skip security chain on forward dispatch
16
+ servlet.multipart:
17
+ max-file-size: 10MB
18
+ max-request-size: 10MB
19
+ h2.console.enabled: true
20
+
21
+ # To enable Redis
22
+ # redis:
23
+ # host: localhost
24
+ # port: 6379
25
+ # password: ""
26
+ # database: 0
27
+ # timeout: 5000ms
28
+ # lettuce:
29
+ # pool:
30
+ # max-active: 8
31
+ # max-idle: 8
32
+ # min-idle: 0
33
+ # max-wait: -1ms
34
+
35
+ logging.config: config/logback.xml
36
+
37
+ quicksilver:
38
+ application.mode: development # development/production
39
+ cluster.enabled: false
40
+ security.cipher.key-file: ${QUICKSILVER_CIPHER_KEY_FILE:./config/cipher.key}
41
+ cache:
42
+ type: caffeine # caffeine/redis/none
43
+ max-idle-seconds: 600
44
+ max-entities: 10000 # for caffeine only currently
45
+ cors:
46
+ allowed-origins: '*' # http://127.0.0.1:6186,http://192.168.1.100:6186 # '*' for any origin
47
+ allowed-headers: '' # authorization & content-type are always allowed. '' for no other headers, '*' for any header
48
+ token:
49
+ access-validity-seconds: 43200 # 43200 = 12 hours
50
+ refresh-validity-seconds: 2592000 # 2592000 = 30 days
51
+ datasource:
52
+ atomikos:
53
+ log_base_dir: local/log/atomikos # the only entry that differs from the Atomikos default (./)
54
+
55
+ # Below are the Atomikos 6.0.1 defaults, listed here only so you can find them.
56
+ # Uncomment an entry to change it; left commented out it follows the upstream default.
57
+ # tm_unique_name: qs-node1 transaction manager name; must be unique across a
58
+ # cluster and stable across restarts. Unset, Atomikos
59
+ # derives it from the host address, which is unstable
60
+ # in a container whose IP changes
61
+ # enable_logging: true turning this off gives up crash recovery
62
+ # force_shutdown_on_vm_exit: false true aborts in-flight transactions on JVM exit
63
+ # checkpoint_interval: 500 transaction log checkpoint interval (ms)
64
+ # serial_jta_transactions: true access XA resources serially within one transaction
65
+ # default_jta_timeout: 10000 default timeout of a single transaction (ms)
66
+ # max_timeout: 300000 largest timeout a transaction may request (ms)
67
+ # max_actives: 50 cap on concurrently active transactions
68
+ # log_base_name: tmlog transaction log file name prefix
69
+ # forget_orphaned_log_entries_delay: 86400000 delay before orphaned log entries are forgotten (ms)
70
+ # recovery_delay: 10000 recovery scan interval (ms); Atomikos defaults it to default_jta_timeout
71
+ # oltp_max_retries: 5 maximum commit/rollback retries
72
+ # oltp_retry_interval: 10000 interval between retries (ms)
73
+ # allow_subtransactions: true allow nested transactions
74
+ # logcloud_datasource_name: logCloudDS datasource name used in LogCloud mode
75
+ # throw_on_heuristic: false whether to throw on heuristic completion
76
+ # log_lock_acquisition_max_attempts: 3 maximum attempts to acquire the log lock
77
+ # log_lock_acquisition_retry_delay: 1000 delay between log lock attempts (ms)
78
+ pool:
79
+ min-size: 0
80
+ max-size: 64
81
+ max-idle-seconds: 600
82
+ max-live-seconds: 21600
83
+ upload:
84
+ directory: local/upload
@@ -0,0 +1,141 @@
1
+ <?xml version="1.0" encoding="UTF-8" ?>
2
+ <!DOCTYPE configuration>
3
+
4
+ <configuration scan="true" scanPeriod="30 seconds">
5
+
6
+ <import class="ch.qos.logback.core.ConsoleAppender"/>
7
+ <import class="ch.qos.logback.core.rolling.RollingFileAppender"/>
8
+ <import class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"/>
9
+ <import class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"/>
10
+ <import class="ch.qos.logback.classic.filter.LevelFilter"/>
11
+ <import class="ch.qos.logback.classic.filter.ThresholdFilter"/>
12
+
13
+ <property name="console_date_format" value="HH:mm:ss.SSS"/>
14
+ <property name="file_date_format" value="yyyy-MM-dd'T'HH:mm:ss.SSSXXX"/>
15
+ <property name="file_encoder_pattern" value="%d{${file_date_format}} [%thread] %-5level %logger - %msg%n"/>
16
+ <property name="log_directory" value="build/test/log/application"/>
17
+ <property name="log_daily_directory" value="${log_directory}/%d{yyyy-MM-dd}"/>
18
+ <property name="max_file_size" value="100MB"/>
19
+ <property name="max_history" value="100"/>
20
+ <property name="total_size_cap" value="20GB"/>
21
+
22
+ <conversionRule conversionWord="clr" class="org.springframework.boot.logging.logback.ColorConverter"/>
23
+ <conversionRule conversionWord="wEx" class="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
24
+
25
+ <appender name="STDOUT" class="ConsoleAppender">
26
+ <encoder class="PatternLayoutEncoder">
27
+ <pattern>%clr(%d{${console_date_format}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([%15.15t]){faint} %clr(-){faint} %clr(${LOG_CORRELATION_PATTERN:-}){faint}%clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}</pattern>
28
+ </encoder>
29
+ <filter class="ThresholdFilter">
30
+ <level>DEBUG</level>
31
+ </filter>
32
+ </appender>
33
+
34
+ <appender name="FILE_TRACE" class="RollingFileAppender">
35
+ <file>${log_directory}/trace.log</file>
36
+ <rollingPolicy class="SizeAndTimeBasedRollingPolicy">
37
+ <fileNamePattern>${log_daily_directory}/trace-%i.log.zip</fileNamePattern>
38
+ <maxFileSize>${max_file_size}</maxFileSize>
39
+ <maxHistory>${max_history}</maxHistory>
40
+ <totalSizeCap>${total_size_cap}</totalSizeCap>
41
+ </rollingPolicy>
42
+ <encoder class="PatternLayoutEncoder">
43
+ <pattern>${file_encoder_pattern}</pattern>
44
+ </encoder>
45
+ <filter class="LevelFilter">
46
+ <level>TRACE</level>
47
+ <onMatch>ACCEPT</onMatch>
48
+ <onMismatch>DENY</onMismatch>
49
+ </filter>
50
+ </appender>
51
+
52
+ <appender name="FILE_DEBUG" class="RollingFileAppender">
53
+ <file>${log_directory}/debug.log</file>
54
+ <rollingPolicy class="SizeAndTimeBasedRollingPolicy">
55
+ <fileNamePattern>${log_daily_directory}/debug-%i.log.zip</fileNamePattern>
56
+ <maxFileSize>${max_file_size}</maxFileSize>
57
+ <maxHistory>${max_history}</maxHistory>
58
+ <totalSizeCap>${total_size_cap}</totalSizeCap>
59
+ </rollingPolicy>
60
+ <encoder class="PatternLayoutEncoder">
61
+ <pattern>${file_encoder_pattern}</pattern>
62
+ </encoder>
63
+ <filter class="LevelFilter">
64
+ <level>DEBUG</level>
65
+ <onMatch>ACCEPT</onMatch>
66
+ <onMismatch>DENY</onMismatch>
67
+ </filter>
68
+ </appender>
69
+
70
+ <appender name="FILE_INFO" class="RollingFileAppender">
71
+ <file>${log_directory}/info.log</file>
72
+ <rollingPolicy class="SizeAndTimeBasedRollingPolicy">
73
+ <fileNamePattern>${log_daily_directory}/info-%i.log.zip</fileNamePattern>
74
+ <maxFileSize>${max_file_size}</maxFileSize>
75
+ <maxHistory>${max_history}</maxHistory>
76
+ <totalSizeCap>${total_size_cap}</totalSizeCap>
77
+ </rollingPolicy>
78
+ <encoder class="PatternLayoutEncoder">
79
+ <pattern>${file_encoder_pattern}</pattern>
80
+ </encoder>
81
+ <filter class="LevelFilter">
82
+ <level>INFO</level>
83
+ <onMatch>ACCEPT</onMatch>
84
+ <onMismatch>DENY</onMismatch>
85
+ </filter>
86
+ </appender>
87
+
88
+ <appender name="FILE_WARN" class="RollingFileAppender">
89
+ <file>${log_directory}/warn.log</file>
90
+ <rollingPolicy class="SizeAndTimeBasedRollingPolicy">
91
+ <fileNamePattern>${log_daily_directory}/warn-%i.log.zip</fileNamePattern>
92
+ <maxFileSize>${max_file_size}</maxFileSize>
93
+ <maxHistory>${max_history}</maxHistory>
94
+ <totalSizeCap>${total_size_cap}</totalSizeCap>
95
+ </rollingPolicy>
96
+ <encoder class="PatternLayoutEncoder">
97
+ <pattern>${file_encoder_pattern}</pattern>
98
+ </encoder>
99
+ <filter class="LevelFilter">
100
+ <level>WARN</level>
101
+ <onMatch>ACCEPT</onMatch>
102
+ <onMismatch>DENY</onMismatch>
103
+ </filter>
104
+ </appender>
105
+
106
+ <appender name="FILE_ERROR" class="RollingFileAppender">
107
+ <file>${log_directory}/error.log</file>
108
+ <rollingPolicy class="SizeAndTimeBasedRollingPolicy">
109
+ <fileNamePattern>${log_daily_directory}/error-%i.log.zip</fileNamePattern>
110
+ <maxFileSize>${max_file_size}</maxFileSize>
111
+ <maxHistory>${max_history}</maxHistory>
112
+ <totalSizeCap>${total_size_cap}</totalSizeCap>
113
+ </rollingPolicy>
114
+ <encoder class="PatternLayoutEncoder">
115
+ <pattern>${file_encoder_pattern}</pattern>
116
+ </encoder>
117
+ <filter class="LevelFilter">
118
+ <level>ERROR</level>
119
+ <onMatch>ACCEPT</onMatch>
120
+ <onMismatch>DENY</onMismatch>
121
+ </filter>
122
+ </appender>
123
+
124
+ <logger name="quicksilver.execution" level="DEBUG"/>
125
+ <logger name="com.qsrun.quicksilver.core.application.security" level="DEBUG"/>
126
+ <logger name="com.qsrun.quicksilver.core.application.web" level="DEBUG"/>
127
+ <logger name="com.qsrun.quicksilver.core.application.component.UnitComponentRegistrar" level="DEBUG"/>
128
+ <logger name="com.qsrun.quicksilver.core.data.command.JsonRunners" level="DEBUG"/>
129
+ <logger name="com.qsrun.quicksilver.lib.database.sql.translation" level="TRACE"/>
130
+ <logger name="com.atomikos" level="WARN"/>
131
+
132
+ <root level="INFO">
133
+ <appender-ref ref="STDOUT"/>
134
+ <appender-ref ref="FILE_TRACE"/>
135
+ <appender-ref ref="FILE_DEBUG"/>
136
+ <appender-ref ref="FILE_INFO"/>
137
+ <appender-ref ref="FILE_WARN"/>
138
+ <appender-ref ref="FILE_ERROR"/>
139
+ </root>
140
+
141
+ </configuration>
@@ -0,0 +1,142 @@
1
+ <?xml version="1.0" encoding="UTF-8" ?>
2
+ <!DOCTYPE configuration>
3
+
4
+ <configuration scan="true" scanPeriod="30 seconds">
5
+
6
+ <import class="ch.qos.logback.core.ConsoleAppender"/>
7
+ <import class="ch.qos.logback.core.rolling.RollingFileAppender"/>
8
+ <import class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"/>
9
+ <import class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"/>
10
+ <import class="ch.qos.logback.classic.filter.LevelFilter"/>
11
+ <import class="ch.qos.logback.classic.filter.ThresholdFilter"/>
12
+
13
+ <property name="console_date_format" value="HH:mm:ss.SSS"/>
14
+ <property name="file_date_format" value="yyyy-MM-dd'T'HH:mm:ss.SSSXXX"/>
15
+ <property name="file_encoder_pattern" value="%d{${file_date_format}} [%thread] %-5level %logger - %msg%n"/>
16
+ <!-- LOG_PATH is injected by Spring from logging.file.path; falls back to the default directory. -->
17
+ <property name="log_directory" value="${LOG_PATH:-local/log/application}"/>
18
+ <property name="log_daily_directory" value="${log_directory}/%d{yyyy-MM-dd}"/>
19
+ <property name="max_file_size" value="100MB"/>
20
+ <property name="max_history" value="100"/>
21
+ <property name="total_size_cap" value="20GB"/>
22
+
23
+ <conversionRule conversionWord="clr" class="org.springframework.boot.logging.logback.ColorConverter"/>
24
+ <conversionRule conversionWord="wEx" class="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
25
+
26
+ <appender name="STDOUT" class="ConsoleAppender">
27
+ <encoder class="PatternLayoutEncoder">
28
+ <pattern>%clr(%d{${console_date_format}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([%15.15t]){faint} %clr(-){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}</pattern>
29
+ </encoder>
30
+ <filter class="ThresholdFilter">
31
+ <level>INFO</level>
32
+ </filter>
33
+ </appender>
34
+
35
+ <appender name="FILE_TRACE" class="RollingFileAppender">
36
+ <file>${log_directory}/trace.log</file>
37
+ <rollingPolicy class="SizeAndTimeBasedRollingPolicy">
38
+ <fileNamePattern>${log_daily_directory}/trace-%i.log.zip</fileNamePattern>
39
+ <maxFileSize>${max_file_size}</maxFileSize>
40
+ <maxHistory>${max_history}</maxHistory>
41
+ <totalSizeCap>${total_size_cap}</totalSizeCap>
42
+ </rollingPolicy>
43
+ <encoder class="PatternLayoutEncoder">
44
+ <pattern>${file_encoder_pattern}</pattern>
45
+ </encoder>
46
+ <filter class="LevelFilter">
47
+ <level>TRACE</level>
48
+ <onMatch>ACCEPT</onMatch>
49
+ <onMismatch>DENY</onMismatch>
50
+ </filter>
51
+ </appender>
52
+
53
+ <appender name="FILE_DEBUG" class="RollingFileAppender">
54
+ <file>${log_directory}/debug.log</file>
55
+ <rollingPolicy class="SizeAndTimeBasedRollingPolicy">
56
+ <fileNamePattern>${log_daily_directory}/debug-%i.log.zip</fileNamePattern>
57
+ <maxFileSize>${max_file_size}</maxFileSize>
58
+ <maxHistory>${max_history}</maxHistory>
59
+ <totalSizeCap>${total_size_cap}</totalSizeCap>
60
+ </rollingPolicy>
61
+ <encoder class="PatternLayoutEncoder">
62
+ <pattern>${file_encoder_pattern}</pattern>
63
+ </encoder>
64
+ <filter class="LevelFilter">
65
+ <level>DEBUG</level>
66
+ <onMatch>ACCEPT</onMatch>
67
+ <onMismatch>DENY</onMismatch>
68
+ </filter>
69
+ </appender>
70
+
71
+ <appender name="FILE_INFO" class="RollingFileAppender">
72
+ <file>${log_directory}/info.log</file>
73
+ <rollingPolicy class="SizeAndTimeBasedRollingPolicy">
74
+ <fileNamePattern>${log_daily_directory}/info-%i.log.zip</fileNamePattern>
75
+ <maxFileSize>${max_file_size}</maxFileSize>
76
+ <maxHistory>${max_history}</maxHistory>
77
+ <totalSizeCap>${total_size_cap}</totalSizeCap>
78
+ </rollingPolicy>
79
+ <encoder class="PatternLayoutEncoder">
80
+ <pattern>${file_encoder_pattern}</pattern>
81
+ </encoder>
82
+ <filter class="LevelFilter">
83
+ <level>INFO</level>
84
+ <onMatch>ACCEPT</onMatch>
85
+ <onMismatch>DENY</onMismatch>
86
+ </filter>
87
+ </appender>
88
+
89
+ <appender name="FILE_WARN" class="RollingFileAppender">
90
+ <file>${log_directory}/warn.log</file>
91
+ <rollingPolicy class="SizeAndTimeBasedRollingPolicy">
92
+ <fileNamePattern>${log_daily_directory}/warn-%i.log.zip</fileNamePattern>
93
+ <maxFileSize>${max_file_size}</maxFileSize>
94
+ <maxHistory>${max_history}</maxHistory>
95
+ <totalSizeCap>${total_size_cap}</totalSizeCap>
96
+ </rollingPolicy>
97
+ <encoder class="PatternLayoutEncoder">
98
+ <pattern>${file_encoder_pattern}</pattern>
99
+ </encoder>
100
+ <filter class="LevelFilter">
101
+ <level>WARN</level>
102
+ <onMatch>ACCEPT</onMatch>
103
+ <onMismatch>DENY</onMismatch>
104
+ </filter>
105
+ </appender>
106
+
107
+ <appender name="FILE_ERROR" class="RollingFileAppender">
108
+ <file>${log_directory}/error.log</file>
109
+ <rollingPolicy class="SizeAndTimeBasedRollingPolicy">
110
+ <fileNamePattern>${log_daily_directory}/error-%i.log.zip</fileNamePattern>
111
+ <maxFileSize>${max_file_size}</maxFileSize>
112
+ <maxHistory>${max_history}</maxHistory>
113
+ <totalSizeCap>${total_size_cap}</totalSizeCap>
114
+ </rollingPolicy>
115
+ <encoder class="PatternLayoutEncoder">
116
+ <pattern>${file_encoder_pattern}</pattern>
117
+ </encoder>
118
+ <filter class="LevelFilter">
119
+ <level>ERROR</level>
120
+ <onMatch>ACCEPT</onMatch>
121
+ <onMismatch>DENY</onMismatch>
122
+ </filter>
123
+ </appender>
124
+
125
+ <logger name="quicksilver.execution" level="DEBUG"/>
126
+ <logger name="com.qsrun.quicksilver.core.application.security" level="DEBUG"/>
127
+ <logger name="com.qsrun.quicksilver.core.application.web" level="DEBUG"/>
128
+ <logger name="com.qsrun.quicksilver.core.application.component.UnitComponentRegistrar" level="DEBUG"/>
129
+ <logger name="com.qsrun.quicksilver.core.data.command.JsonRunners" level="DEBUG"/>
130
+ <logger name="com.qsrun.quicksilver.lib.database.sql.translation" level="TRACE"/>
131
+ <logger name="com.atomikos" level="WARN"/>
132
+
133
+ <root level="INFO">
134
+ <appender-ref ref="STDOUT"/>
135
+ <appender-ref ref="FILE_TRACE"/>
136
+ <appender-ref ref="FILE_DEBUG"/>
137
+ <appender-ref ref="FILE_INFO"/>
138
+ <appender-ref ref="FILE_WARN"/>
139
+ <appender-ref ref="FILE_ERROR"/>
140
+ </root>
141
+
142
+ </configuration>
@@ -0,0 +1,14 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Quicksilver</title>
7
+ <link rel="icon" type="image/svg+xml" href="/images/favicon.svg" />
8
+ <script src='/config.js'></script>
9
+ </head>
10
+ <body>
11
+ <div id="app"></div>
12
+ <script type="module" src='index.ts'></script>
13
+ </body>
14
+ </html>
@@ -0,0 +1,6 @@
1
+ import { Quicksilver } from '@qs-platform/web-module-core';
2
+
3
+ await Quicksilver.initDev({
4
+ {{PLATFORM_WEB_IMPORTS}}
5
+ '{{MODULE_CODE}}': () => import('{{WEB_PACKAGE_NAME}}/module'),
6
+ });
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "{{PROJECT_CODE}}-web-run",
3
+ "private": false,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "dev:main": "vite -- modules={{PLATFORM_MODULE_CODES}},{{MODULE_CODE}}",
9
+ "dev:debug": "vite -d"
10
+ },
11
+ "dependencies": {
12
+ {{PLATFORM_WEB_DEPENDENCIES}},
13
+ "{{WEB_PACKAGE_NAME}}": "workspace:*"
14
+ },
15
+ "devDependencies": {
16
+ "@qs-platform/preset-vite-web": "catalog:quicksilver"
17
+ }
18
+ }
@@ -0,0 +1,15 @@
1
+ window.quicksilverConfig = {
2
+ // apiPort is left unset on purpose: dev proxies /api through Vite (see
3
+ // vite.config.ts), so the SPA and the API share one origin, same as in
4
+ // production. Setting it makes the browser call the API port directly, which
5
+ // splits them across two origins — third-party login does not work in that
6
+ // layout, because the callback page's postMessage back to the opener is
7
+ // dropped by the browser on a targetOrigin mismatch.
8
+ // apiPort: 6288, // used when apiUrl is not set: port on the current domain
9
+
10
+ // apiUrl: 'http://127.0.0.1:6288', // API base; trailing `/` is optional
11
+
12
+ // apiPath: '', // used when apiUrl is not set: path on the current domain
13
+
14
+ // baseHref: '/context',
15
+ };
@@ -0,0 +1,4 @@
1
+ {
2
+ "extends": "@qs-platform/preset-vite-web/tsconfig.quicksilver.json",
3
+ "include": ["index.ts"]
4
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ { "path": "./tsconfig.app.json" },
5
+ { "path": "./tsconfig.node.json" }
6
+ ]
7
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "extends": "@qs-platform/preset-vite-web/tsconfig.node.json",
3
+ "include": ["vite.config.ts"]
4
+ }
@@ -0,0 +1,21 @@
1
+ import { defineConfig } from 'vite';
2
+ import { quicksilverServePlugins } from '@qs-platform/preset-vite-web';
3
+
4
+ export default defineConfig({
5
+ plugins: [...quicksilverServePlugins()],
6
+ server: {
7
+ open: process.env.OPEN !== 'false',
8
+ host: '0.0.0.0',
9
+ allowedHosts: true,
10
+ port: parseInt(process.env.PORT || '6286'),
11
+ strictPort: true,
12
+ proxy: {
13
+ '/api': `http://localhost:${process.env.API_PORT || '6288'}`,
14
+ },
15
+ },
16
+ resolve: {
17
+ alias: [
18
+ { find: /^~(.*)$/, replacement: '$1' },
19
+ ],
20
+ },
21
+ });
@@ -0,0 +1,19 @@
1
+ rootProject.name = "{{PROJECT_CODE}}"
2
+
3
+ pluginManagement {
4
+ // Where the Quicksilver plugin and the platform artifacts come from, and the login for it.
5
+ // See .quicksilver/manual/en-US/00-setup.md. It is applied here rather than further down so that
6
+ // the repository is in place before any plugin in a settings plugins {} block is resolved.
7
+ apply(from = "gradle/repo.settings.gradle.kts")
8
+ // The root plugin's version is the platform version from gradle.properties. The module and run
9
+ // plugins ship in the same plugin jar, so they are applied without a version.
10
+ plugins {
11
+ id("com.qsrun.quicksilver.gradle.root") version providers.gradleProperty("quicksilver.version").get()
12
+ }
13
+ }
14
+
15
+ include("modules:{{MODULE_DIRECTORY}}")
16
+ project(":modules:{{MODULE_DIRECTORY}}").projectDir = file("modules/{{MODULE_DIRECTORY}}/api")
17
+
18
+ include("run")
19
+ project(":run").projectDir = file("run/api")