gazetta 0.4.0 → 0.6.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/admin-dist/assets/index-B6pVot0Y.css +1 -0
- package/admin-dist/assets/index-DniLwxJA.js +609 -0
- package/admin-dist/assets/{vendor-primevue-BnR1c_bQ.js → vendor-primevue-C0Q_YTCb.js} +330 -431
- package/admin-dist/assets/vendor-vue-D3wBSmDf.js +1 -0
- package/admin-dist/index.html +4 -4
- package/dist/admin-api/index.d.ts +26 -5
- package/dist/admin-api/index.d.ts.map +1 -1
- package/dist/admin-api/index.js +175 -13
- package/dist/admin-api/index.js.map +1 -1
- package/dist/admin-api/routes/compare.d.ts +3 -1
- package/dist/admin-api/routes/compare.d.ts.map +1 -1
- package/dist/admin-api/routes/compare.js +34 -24
- package/dist/admin-api/routes/compare.js.map +1 -1
- package/dist/admin-api/routes/fields.d.ts +2 -2
- package/dist/admin-api/routes/fields.d.ts.map +1 -1
- package/dist/admin-api/routes/fields.js +10 -3
- package/dist/admin-api/routes/fields.js.map +1 -1
- package/dist/admin-api/routes/fragments.d.ts +2 -2
- package/dist/admin-api/routes/fragments.d.ts.map +1 -1
- package/dist/admin-api/routes/fragments.js +94 -19
- package/dist/admin-api/routes/fragments.js.map +1 -1
- package/dist/admin-api/routes/history.d.ts +23 -0
- package/dist/admin-api/routes/history.d.ts.map +1 -0
- package/dist/admin-api/routes/history.js +143 -0
- package/dist/admin-api/routes/history.js.map +1 -0
- package/dist/admin-api/routes/pages.d.ts +2 -2
- package/dist/admin-api/routes/pages.d.ts.map +1 -1
- package/dist/admin-api/routes/pages.js +120 -20
- package/dist/admin-api/routes/pages.js.map +1 -1
- package/dist/admin-api/routes/preview.d.ts +2 -2
- package/dist/admin-api/routes/preview.d.ts.map +1 -1
- package/dist/admin-api/routes/preview.js +50 -15
- package/dist/admin-api/routes/preview.js.map +1 -1
- package/dist/admin-api/routes/publish.d.ts +3 -1
- package/dist/admin-api/routes/publish.d.ts.map +1 -1
- package/dist/admin-api/routes/publish.js +306 -65
- package/dist/admin-api/routes/publish.js.map +1 -1
- package/dist/admin-api/routes/site.d.ts +2 -2
- package/dist/admin-api/routes/site.d.ts.map +1 -1
- package/dist/admin-api/routes/site.js +27 -4
- package/dist/admin-api/routes/site.js.map +1 -1
- package/dist/admin-api/routes/templates.d.ts +2 -2
- package/dist/admin-api/routes/templates.d.ts.map +1 -1
- package/dist/admin-api/routes/templates.js +19 -9
- package/dist/admin-api/routes/templates.js.map +1 -1
- package/dist/admin-api/schemas/compare.d.ts +29 -0
- package/dist/admin-api/schemas/compare.d.ts.map +1 -0
- package/dist/admin-api/schemas/compare.js +30 -0
- package/dist/admin-api/schemas/compare.js.map +1 -0
- package/dist/admin-api/schemas/dependents.d.ts +15 -0
- package/dist/admin-api/schemas/dependents.d.ts.map +1 -0
- package/dist/admin-api/schemas/dependents.js +14 -0
- package/dist/admin-api/schemas/dependents.js.map +1 -0
- package/dist/admin-api/schemas/fetch.d.ts +12 -0
- package/dist/admin-api/schemas/fetch.d.ts.map +1 -0
- package/dist/admin-api/schemas/fetch.js +11 -0
- package/dist/admin-api/schemas/fetch.js.map +1 -0
- package/dist/admin-api/schemas/fields.d.ts +11 -0
- package/dist/admin-api/schemas/fields.d.ts.map +1 -0
- package/dist/admin-api/schemas/fields.js +11 -0
- package/dist/admin-api/schemas/fields.js.map +1 -0
- package/dist/admin-api/schemas/fragments.d.ts +27 -0
- package/dist/admin-api/schemas/fragments.d.ts.map +1 -0
- package/dist/admin-api/schemas/fragments.js +26 -0
- package/dist/admin-api/schemas/fragments.js.map +1 -0
- package/dist/admin-api/schemas/history.d.ts +73 -0
- package/dist/admin-api/schemas/history.d.ts.map +1 -0
- package/dist/admin-api/schemas/history.js +35 -0
- package/dist/admin-api/schemas/history.js.map +1 -0
- package/dist/admin-api/schemas/index.d.ts +32 -0
- package/dist/admin-api/schemas/index.d.ts.map +1 -0
- package/dist/admin-api/schemas/index.js +32 -0
- package/dist/admin-api/schemas/index.js.map +1 -0
- package/dist/admin-api/schemas/pages.d.ts +46 -0
- package/dist/admin-api/schemas/pages.d.ts.map +1 -0
- package/dist/admin-api/schemas/pages.js +47 -0
- package/dist/admin-api/schemas/pages.js.map +1 -0
- package/dist/admin-api/schemas/publish.d.ts +67 -0
- package/dist/admin-api/schemas/publish.d.ts.map +1 -0
- package/dist/admin-api/schemas/publish.js +60 -0
- package/dist/admin-api/schemas/publish.js.map +1 -0
- package/dist/admin-api/schemas/site.d.ts +28 -0
- package/dist/admin-api/schemas/site.d.ts.map +1 -0
- package/dist/admin-api/schemas/site.js +24 -0
- package/dist/admin-api/schemas/site.js.map +1 -0
- package/dist/admin-api/schemas/targets.d.ts +36 -0
- package/dist/admin-api/schemas/targets.d.ts.map +1 -0
- package/dist/admin-api/schemas/targets.js +19 -0
- package/dist/admin-api/schemas/targets.js.map +1 -0
- package/dist/admin-api/schemas/templates.d.ts +17 -0
- package/dist/admin-api/schemas/templates.d.ts.map +1 -0
- package/dist/admin-api/schemas/templates.js +16 -0
- package/dist/admin-api/schemas/templates.js.map +1 -0
- package/dist/admin-api/source-context.d.ts +165 -0
- package/dist/admin-api/source-context.d.ts.map +1 -0
- package/dist/admin-api/source-context.js +95 -0
- package/dist/admin-api/source-context.js.map +1 -0
- package/dist/app.js +1 -1
- package/dist/app.js.map +1 -1
- package/dist/assemble.d.ts.map +1 -1
- package/dist/assemble.js +4 -1
- package/dist/assemble.js.map +1 -1
- package/dist/cli/bootstrap.d.ts +48 -0
- package/dist/cli/bootstrap.d.ts.map +1 -0
- package/dist/cli/bootstrap.js +85 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/history.d.ts +45 -0
- package/dist/cli/history.d.ts.map +1 -0
- package/dist/cli/history.js +165 -0
- package/dist/cli/history.js.map +1 -0
- package/dist/cli/index.js +691 -113
- package/dist/cli/index.js.map +1 -1
- package/dist/compare.d.ts +15 -5
- package/dist/compare.d.ts.map +1 -1
- package/dist/compare.js +83 -45
- package/dist/compare.js.map +1 -1
- package/dist/concurrency.d.ts +63 -0
- package/dist/concurrency.d.ts.map +1 -0
- package/dist/concurrency.js +134 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/content-root.d.ts +38 -0
- package/dist/content-root.d.ts.map +1 -0
- package/dist/content-root.js +29 -0
- package/dist/content-root.js.map +1 -0
- package/dist/editor/mount.d.ts +1 -1
- package/dist/editor/mount.d.ts.map +1 -1
- package/dist/editor/mount.js +61 -29
- package/dist/editor/mount.js.map +1 -1
- package/dist/hash.d.ts +47 -1
- package/dist/hash.d.ts.map +1 -1
- package/dist/hash.js +107 -10
- package/dist/hash.js.map +1 -1
- package/dist/history-provider.d.ts +49 -0
- package/dist/history-provider.d.ts.map +1 -0
- package/dist/history-provider.js +226 -0
- package/dist/history-provider.js.map +1 -0
- package/dist/history-recorder.d.ts +98 -0
- package/dist/history-recorder.d.ts.map +1 -0
- package/dist/history-recorder.js +160 -0
- package/dist/history-recorder.js.map +1 -0
- package/dist/history-restorer.d.ts +46 -0
- package/dist/history-restorer.d.ts.map +1 -0
- package/dist/history-restorer.js +105 -0
- package/dist/history-restorer.js.map +1 -0
- package/dist/history.d.ts +111 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +25 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +26 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -3
- package/dist/index.js.map +1 -1
- package/dist/locale.d.ts +74 -0
- package/dist/locale.d.ts.map +1 -0
- package/dist/locale.js +150 -0
- package/dist/locale.js.map +1 -0
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +16 -1
- package/dist/manifest.js.map +1 -1
- package/dist/providers/azure-blob.d.ts.map +1 -1
- package/dist/providers/azure-blob.js.map +1 -1
- package/dist/providers/r2.d.ts.map +1 -1
- package/dist/providers/r2.js +7 -4
- package/dist/providers/r2.js.map +1 -1
- package/dist/providers/s3.d.ts.map +1 -1
- package/dist/providers/s3.js +23 -15
- package/dist/providers/s3.js.map +1 -1
- package/dist/publish-locale.d.ts +44 -0
- package/dist/publish-locale.d.ts.map +1 -0
- package/dist/publish-locale.js +103 -0
- package/dist/publish-locale.js.map +1 -0
- package/dist/publish-rendered.d.ts +17 -5
- package/dist/publish-rendered.d.ts.map +1 -1
- package/dist/publish-rendered.js +114 -66
- package/dist/publish-rendered.js.map +1 -1
- package/dist/publish.d.ts +39 -3
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +166 -17
- package/dist/publish.js.map +1 -1
- package/dist/renderer.d.ts +14 -4
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +35 -23
- package/dist/renderer.js.map +1 -1
- package/dist/resolver.d.ts +7 -2
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +66 -15
- package/dist/resolver.js.map +1 -1
- package/dist/robots.d.ts +22 -0
- package/dist/robots.d.ts.map +1 -0
- package/dist/robots.js +25 -0
- package/dist/robots.js.map +1 -0
- package/dist/seo.d.ts +56 -0
- package/dist/seo.d.ts.map +1 -0
- package/dist/seo.js +72 -0
- package/dist/seo.js.map +1 -0
- package/dist/serve.d.ts +41 -3
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +206 -65
- package/dist/serve.js.map +1 -1
- package/dist/sidecars.d.ts +60 -0
- package/dist/sidecars.d.ts.map +1 -0
- package/dist/sidecars.js +231 -0
- package/dist/sidecars.js.map +1 -0
- package/dist/site-loader.d.ts +74 -6
- package/dist/site-loader.d.ts.map +1 -1
- package/dist/site-loader.js +149 -36
- package/dist/site-loader.js.map +1 -1
- package/dist/sitemap.d.ts +45 -0
- package/dist/sitemap.d.ts.map +1 -0
- package/dist/sitemap.js +67 -0
- package/dist/sitemap.js.map +1 -0
- package/dist/source-sidecars.d.ts +32 -0
- package/dist/source-sidecars.d.ts.map +1 -0
- package/dist/source-sidecars.js +98 -0
- package/dist/source-sidecars.js.map +1 -0
- package/dist/targets.d.ts +47 -1
- package/dist/targets.d.ts.map +1 -1
- package/dist/targets.js +78 -9
- package/dist/targets.js.map +1 -1
- package/dist/template-loader.d.ts +7 -3
- package/dist/template-loader.d.ts.map +1 -1
- package/dist/template-loader.js +27 -12
- package/dist/template-loader.js.map +1 -1
- package/dist/templates-scan-worker.js +1 -1
- package/dist/templates-scan-worker.js.map +1 -1
- package/dist/templates-scan.d.ts.map +1 -1
- package/dist/templates-scan.js +1 -1
- package/dist/templates-scan.js.map +1 -1
- package/dist/types.d.ts +116 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +28 -5
- package/dist/types.js.map +1 -1
- package/dist/workers/cloudflare-r2.d.ts +11 -2
- package/dist/workers/cloudflare-r2.d.ts.map +1 -1
- package/dist/workers/cloudflare-r2.js +120 -55
- package/dist/workers/cloudflare-r2.js.map +1 -1
- package/package.json +11 -2
- package/admin-dist/assets/index-Bh_y1d_l.css +0 -1
- package/admin-dist/assets/index-DjGNi6yy.js +0 -608
- package/admin-dist/assets/vendor-vue-DSjyxCX6.js +0 -1
package/dist/types.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ export type TemplateFunction<T extends Record<string, unknown> = Record<string,
|
|
|
10
10
|
content?: T;
|
|
11
11
|
children?: RenderOutput[];
|
|
12
12
|
params?: Record<string, string>;
|
|
13
|
+
/** Active locale code (e.g. 'fr', 'en'). Always provided by the renderer — defaults to site's locale or 'en'. */
|
|
14
|
+
locale: string;
|
|
13
15
|
}) => RenderOutput | Promise<RenderOutput>;
|
|
14
16
|
/** Mount function for framework-agnostic custom editors */
|
|
15
17
|
export interface EditorMount {
|
|
@@ -73,14 +75,32 @@ export interface CacheConfig {
|
|
|
73
75
|
/** CDN cache purge configuration */
|
|
74
76
|
purge?: PurgeConfig;
|
|
75
77
|
}
|
|
78
|
+
/** SEO metadata for a page — surfaced in <head> and used by sitemap generation. */
|
|
79
|
+
export interface PageMetadata {
|
|
80
|
+
title?: string;
|
|
81
|
+
description?: string;
|
|
82
|
+
ogImage?: string;
|
|
83
|
+
canonical?: string;
|
|
84
|
+
/** Robots directive — e.g. "noindex", "nofollow", "noindex, nofollow".
|
|
85
|
+
* When set, emitted as `<meta name="robots" content="...">`.
|
|
86
|
+
* When absent, the tag is omitted (default: allow indexing). */
|
|
87
|
+
robots?: string;
|
|
88
|
+
}
|
|
76
89
|
/** Page manifest (routable component) */
|
|
77
90
|
export interface PageManifest extends ComponentManifest {
|
|
78
91
|
route: string;
|
|
92
|
+
metadata?: PageMetadata;
|
|
79
93
|
cache?: CacheConfig;
|
|
80
94
|
}
|
|
81
95
|
/** Storage configuration */
|
|
82
96
|
export interface StorageConfig {
|
|
83
97
|
type: 'filesystem' | 'azure-blob' | 's3' | 'r2';
|
|
98
|
+
/**
|
|
99
|
+
* Filesystem storage directory, relative to the site directory.
|
|
100
|
+
* Defaults to `./targets/<target-key>` when unset — the target's key in
|
|
101
|
+
* site.yaml maps to a subdirectory under `targets/`. Override for shared
|
|
102
|
+
* drives, external mounts, or existing custom layouts.
|
|
103
|
+
*/
|
|
84
104
|
path?: string;
|
|
85
105
|
connectionString?: string;
|
|
86
106
|
container?: string;
|
|
@@ -97,33 +117,120 @@ export interface WorkerConfig {
|
|
|
97
117
|
name?: string;
|
|
98
118
|
}
|
|
99
119
|
export type TargetEnvironment = 'local' | 'staging' | 'production';
|
|
120
|
+
export type TargetType = 'static' | 'dynamic';
|
|
100
121
|
/** Target configuration in site.yaml */
|
|
101
122
|
export interface TargetConfig {
|
|
102
123
|
storage: StorageConfig;
|
|
103
124
|
worker?: WorkerConfig;
|
|
104
|
-
/**
|
|
105
|
-
|
|
125
|
+
/**
|
|
126
|
+
* Rendering model:
|
|
127
|
+
* - `static`: pre-rendered at publish time, served from edge (no SSR at request)
|
|
128
|
+
* - `dynamic`: composed/SSR'd at request time on Node/Bun server (ESI-style assembly)
|
|
129
|
+
* Default: `dynamic` if worker configured, `static` otherwise.
|
|
130
|
+
*/
|
|
131
|
+
type?: TargetType;
|
|
106
132
|
/**
|
|
107
133
|
* Semantic intent of this target — drives UI treatment (confirmation
|
|
108
|
-
* prompts, badges) and ops decisions. Default: 'local'
|
|
109
|
-
*
|
|
110
|
-
*
|
|
134
|
+
* prompts, badges) and ops decisions. Default: 'local'. Production
|
|
135
|
+
* targets must be marked explicitly — the default is safe, not
|
|
136
|
+
* alarming; prod opt-in prevents accidental prod chrome on dev targets.
|
|
111
137
|
*/
|
|
112
138
|
environment?: TargetEnvironment;
|
|
139
|
+
/**
|
|
140
|
+
* Whether the author can save form-edits to this target and whether it
|
|
141
|
+
* can receive publishes from the CMS. Default: `true` for `environment:
|
|
142
|
+
* local` (or unset — local is the env default), `false` for `staging`
|
|
143
|
+
* and `production`.
|
|
144
|
+
* Override explicitly for hotfix-tolerant staging/prod setups
|
|
145
|
+
* (`editable: true`) or locked-down local targets (`editable: false`).
|
|
146
|
+
*/
|
|
147
|
+
editable?: boolean;
|
|
113
148
|
/** Base URL of the site (e.g. https://gazetta.studio) */
|
|
114
149
|
siteUrl?: string;
|
|
150
|
+
/**
|
|
151
|
+
* Locale subset this target serves. Inherits site-level `locales.supported`
|
|
152
|
+
* when absent. A single-entry list (e.g. `[fr]`) makes the target
|
|
153
|
+
* single-language — no URL prefix, no locale switching.
|
|
154
|
+
*/
|
|
155
|
+
locales?: string[];
|
|
156
|
+
/**
|
|
157
|
+
* Default locale for this target. Inherits site-level `locale` when absent.
|
|
158
|
+
* The default locale has no URL prefix (unless `defaultPrefix` is true).
|
|
159
|
+
* For single-locale targets, auto-inferred from the `locales` list.
|
|
160
|
+
*/
|
|
161
|
+
locale?: string;
|
|
162
|
+
/**
|
|
163
|
+
* Override site-level `locales.defaultPrefix` for this target.
|
|
164
|
+
*/
|
|
165
|
+
defaultPrefix?: boolean;
|
|
166
|
+
/**
|
|
167
|
+
* Override site-level `locales.detection` for this target.
|
|
168
|
+
*/
|
|
169
|
+
detection?: boolean;
|
|
115
170
|
cache?: CacheConfig;
|
|
171
|
+
/**
|
|
172
|
+
* Per-target history / revisions (undo, rollback). Default: enabled
|
|
173
|
+
* with 50-revision retention. Set `{ enabled: false }` to disable
|
|
174
|
+
* entirely (no `.gazetta/history/` writes on save/publish) for
|
|
175
|
+
* targets where the storage cost isn't worth it (e.g., ephemeral CI
|
|
176
|
+
* preview targets).
|
|
177
|
+
*/
|
|
178
|
+
history?: HistoryConfig;
|
|
116
179
|
}
|
|
117
|
-
/**
|
|
118
|
-
export
|
|
119
|
-
/**
|
|
180
|
+
/** Per-target history configuration. */
|
|
181
|
+
export interface HistoryConfig {
|
|
182
|
+
/** Record revisions on save/publish. Default: true. */
|
|
183
|
+
enabled?: boolean;
|
|
184
|
+
/**
|
|
185
|
+
* Keep at most N most-recent revisions; oldest evicted on write.
|
|
186
|
+
* Default: 50.
|
|
187
|
+
*/
|
|
188
|
+
retention?: number;
|
|
189
|
+
}
|
|
190
|
+
/** Determine rendering type for a target — centralised logic used by CLI and admin API */
|
|
191
|
+
export declare function getType(target: TargetConfig): TargetType;
|
|
192
|
+
/** Resolve a target's environment. Defaults to 'local' — production must be explicit. */
|
|
120
193
|
export declare function getEnvironment(target: TargetConfig): TargetEnvironment;
|
|
194
|
+
/**
|
|
195
|
+
* Whether the author can save and receive publishes on this target from the CMS.
|
|
196
|
+
* Default: true for `environment: local`, false for `staging` / `production`.
|
|
197
|
+
*/
|
|
198
|
+
export declare function isEditable(target: TargetConfig): boolean;
|
|
199
|
+
/** Default retention: keep the last 50 revisions. Matches design-publishing.md. */
|
|
200
|
+
export declare const DEFAULT_HISTORY_RETENTION = 50;
|
|
201
|
+
/** Whether this target records history on save/publish. Default: true. */
|
|
202
|
+
export declare function isHistoryEnabled(target: TargetConfig): boolean;
|
|
203
|
+
/**
|
|
204
|
+
* Effective retention (max revisions) for this target. Defaults to
|
|
205
|
+
* `DEFAULT_HISTORY_RETENTION`. Values ≤ 0 are clamped to 1 — retaining
|
|
206
|
+
* zero revisions would mean every write evicts itself, which is
|
|
207
|
+
* confusing; use `enabled: false` to disable entirely.
|
|
208
|
+
*/
|
|
209
|
+
export declare function getHistoryRetention(target: TargetConfig): number;
|
|
210
|
+
/**
|
|
211
|
+
* i18n configuration. Opt-in: absent = single-locale site.
|
|
212
|
+
* Adding `locales` enables multi-locale support.
|
|
213
|
+
*/
|
|
214
|
+
export interface LocalesConfig {
|
|
215
|
+
/** All supported locale codes (BCP 47). First entry is the default if `locale` is not set. */
|
|
216
|
+
supported: string[];
|
|
217
|
+
/** Locale-specific fallback chains. E.g. `{ 'pt-BR': 'pt' }` → pt-BR falls back to pt before default. */
|
|
218
|
+
fallbacks?: Record<string, string>;
|
|
219
|
+
/** Whether the default locale gets a URL prefix. Default: false (no prefix for default). */
|
|
220
|
+
defaultPrefix?: boolean;
|
|
221
|
+
/** Enable Accept-Language detection and redirect. Default: false. */
|
|
222
|
+
detection?: boolean;
|
|
223
|
+
}
|
|
121
224
|
/** Site manifest (site.yaml) */
|
|
122
225
|
export interface SiteManifest {
|
|
123
226
|
name: string;
|
|
124
227
|
version?: string;
|
|
228
|
+
/** Default locale code (BCP 47). Falls back to first in `locales.supported`, then 'en'. */
|
|
125
229
|
locale?: string;
|
|
126
|
-
|
|
230
|
+
/** i18n configuration. Absent = single-locale site. */
|
|
231
|
+
locales?: LocalesConfig;
|
|
232
|
+
/** Default Open Graph image for pages that don't specify their own. */
|
|
233
|
+
defaultOgImage?: string;
|
|
127
234
|
systemPages?: string[];
|
|
128
235
|
targets?: Record<string, TargetConfig>;
|
|
129
236
|
}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,8DAA8D;AAC9D,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;IACnG,OAAO,CAAC,EAAE,CAAC,CAAA;IACX,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -1,9 +1,32 @@
|
|
|
1
|
-
/** Determine
|
|
2
|
-
export function
|
|
3
|
-
return target.
|
|
1
|
+
/** Determine rendering type for a target — centralised logic used by CLI and admin API */
|
|
2
|
+
export function getType(target) {
|
|
3
|
+
return target.type ?? (target.worker ? 'dynamic' : 'static');
|
|
4
4
|
}
|
|
5
|
-
/** Resolve a target's environment
|
|
5
|
+
/** Resolve a target's environment. Defaults to 'local' — production must be explicit. */
|
|
6
6
|
export function getEnvironment(target) {
|
|
7
|
-
return target.environment ??
|
|
7
|
+
return target.environment ?? 'local';
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Whether the author can save and receive publishes on this target from the CMS.
|
|
11
|
+
* Default: true for `environment: local`, false for `staging` / `production`.
|
|
12
|
+
*/
|
|
13
|
+
export function isEditable(target) {
|
|
14
|
+
return target.editable ?? getEnvironment(target) === 'local';
|
|
15
|
+
}
|
|
16
|
+
/** Default retention: keep the last 50 revisions. Matches design-publishing.md. */
|
|
17
|
+
export const DEFAULT_HISTORY_RETENTION = 50;
|
|
18
|
+
/** Whether this target records history on save/publish. Default: true. */
|
|
19
|
+
export function isHistoryEnabled(target) {
|
|
20
|
+
return target.history?.enabled ?? true;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Effective retention (max revisions) for this target. Defaults to
|
|
24
|
+
* `DEFAULT_HISTORY_RETENTION`. Values ≤ 0 are clamped to 1 — retaining
|
|
25
|
+
* zero revisions would mean every write evicts itself, which is
|
|
26
|
+
* confusing; use `enabled: false` to disable entirely.
|
|
27
|
+
*/
|
|
28
|
+
export function getHistoryRetention(target) {
|
|
29
|
+
const raw = target.history?.retention ?? DEFAULT_HISTORY_RETENTION;
|
|
30
|
+
return raw > 0 ? raw : 1;
|
|
8
31
|
}
|
|
9
32
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAqNA,0FAA0F;AAC1F,MAAM,UAAU,OAAO,CAAC,MAAoB;IAC1C,OAAO,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;AAC9D,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,OAAO,MAAM,CAAC,WAAW,IAAI,OAAO,CAAA;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,OAAO,MAAM,CAAC,QAAQ,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,OAAO,CAAA;AAC9D,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAA;AAE3C,0EAA0E;AAC1E,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACnD,OAAO,MAAM,CAAC,OAAO,EAAE,OAAO,IAAI,IAAI,CAAA;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,SAAS,IAAI,yBAAyB,CAAA;IAClE,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AAC1B,CAAC"}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Reads pre-rendered pages and fragments from an R2 bucket,
|
|
5
5
|
* assembles them using ESI-style composition, and serves with
|
|
6
|
-
* Cache API + ETag support.
|
|
6
|
+
* Cache API + ETag support. Locale-aware: extracts locale prefix
|
|
7
|
+
* from URL, reads locale-suffixed files, falls back to default.
|
|
7
8
|
*
|
|
8
9
|
* Usage: import and re-export from your worker entry point:
|
|
9
10
|
*
|
|
@@ -13,13 +14,21 @@
|
|
|
13
14
|
* Or customize:
|
|
14
15
|
*
|
|
15
16
|
* import { createWorker } from 'gazetta/workers/cloudflare-r2'
|
|
16
|
-
* const worker = createWorker({
|
|
17
|
+
* const worker = createWorker({
|
|
18
|
+
* bucketBinding: 'SITE_BUCKET',
|
|
19
|
+
* locales: ['en', 'fr', 'de'],
|
|
20
|
+
* defaultLocale: 'en',
|
|
21
|
+
* })
|
|
17
22
|
* export default worker
|
|
18
23
|
*/
|
|
19
24
|
import { Hono } from 'hono';
|
|
20
25
|
export interface CloudflareR2WorkerOptions {
|
|
21
26
|
/** R2 bucket binding name (default: 'SITE_BUCKET') */
|
|
22
27
|
bucketBinding?: string;
|
|
28
|
+
/** Supported locale codes (lowercase). Enables locale-prefix routing. */
|
|
29
|
+
locales?: string[];
|
|
30
|
+
/** Default locale — no URL prefix. Falls back to first in `locales`. */
|
|
31
|
+
defaultLocale?: string;
|
|
23
32
|
/** Custom middleware to add before page serving */
|
|
24
33
|
middleware?: (app: Hono<{
|
|
25
34
|
Bindings: Record<string, R2Bucket>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare-r2.d.ts","sourceRoot":"","sources":["../../src/workers/cloudflare-r2.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"cloudflare-r2.d.ts","sourceRoot":"","sources":["../../src/workers/cloudflare-r2.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,MAAM,WAAW,yBAAyB;IACxC,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,mDAAmD;IACnD,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;KAAE,CAAC,KAAK,IAAI,CAAA;CACzE;AA0FD,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,yBAAyB;cAK7B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;0CAuF1D"}
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Reads pre-rendered pages and fragments from an R2 bucket,
|
|
6
6
|
* assembles them using ESI-style composition, and serves with
|
|
7
|
-
* Cache API + ETag support.
|
|
7
|
+
* Cache API + ETag support. Locale-aware: extracts locale prefix
|
|
8
|
+
* from URL, reads locale-suffixed files, falls back to default.
|
|
8
9
|
*
|
|
9
10
|
* Usage: import and re-export from your worker entry point:
|
|
10
11
|
*
|
|
@@ -14,13 +15,97 @@
|
|
|
14
15
|
* Or customize:
|
|
15
16
|
*
|
|
16
17
|
* import { createWorker } from 'gazetta/workers/cloudflare-r2'
|
|
17
|
-
* const worker = createWorker({
|
|
18
|
+
* const worker = createWorker({
|
|
19
|
+
* bucketBinding: 'SITE_BUCKET',
|
|
20
|
+
* locales: ['en', 'fr', 'de'],
|
|
21
|
+
* defaultLocale: 'en',
|
|
22
|
+
* })
|
|
18
23
|
* export default worker
|
|
19
24
|
*/
|
|
20
25
|
import { Hono } from 'hono';
|
|
21
26
|
import { assembleEsi, parseCacheComment, splitFragment, findEsiPaths } from '../assemble.js';
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Locale extraction (same logic as serve.ts — SRP)
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
function extractLocale(requestPath, locales) {
|
|
31
|
+
if (locales.length === 0)
|
|
32
|
+
return { locale: undefined, path: requestPath };
|
|
33
|
+
const parts = requestPath.split('/').filter(Boolean);
|
|
34
|
+
if (parts.length > 0 && locales.includes(parts[0])) {
|
|
35
|
+
return { locale: parts[0], path: '/' + parts.slice(1).join('/') || '/' };
|
|
36
|
+
}
|
|
37
|
+
return { locale: undefined, path: requestPath };
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Fragment fetching with locale fallback (SRP)
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
async function fetchFragment(bucket, path) {
|
|
43
|
+
const key = path.slice(1);
|
|
44
|
+
const obj = await bucket.get(key);
|
|
45
|
+
if (obj)
|
|
46
|
+
return [path, splitFragment(await obj.text())];
|
|
47
|
+
// Locale fallback: index.fr.html → index.html
|
|
48
|
+
const localeFallback = key.replace(/\/index\.[a-z-]+\.html$/, '/index.html');
|
|
49
|
+
if (localeFallback !== key) {
|
|
50
|
+
const fallbackObj = await bucket.get(localeFallback);
|
|
51
|
+
if (fallbackObj)
|
|
52
|
+
return [path, splitFragment(await fallbackObj.text())];
|
|
53
|
+
}
|
|
54
|
+
return [path, { head: '', body: `<!-- fragment not found: ${path} -->` }];
|
|
55
|
+
}
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// Page lookup with locale support (SRP)
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
async function findPage(bucket, requestPath, locales) {
|
|
60
|
+
const { locale, path: resolvedPath } = locales?.length
|
|
61
|
+
? extractLocale(requestPath, locales)
|
|
62
|
+
: { locale: undefined, path: requestPath };
|
|
63
|
+
const indexFile = locale ? `index.${locale}.html` : 'index.html';
|
|
64
|
+
// Try exact page path
|
|
65
|
+
const pagePath = resolvedPath === '/' ? `pages/home/${indexFile}` : `pages${resolvedPath}/${indexFile}`;
|
|
66
|
+
const obj = await bucket.get(pagePath);
|
|
67
|
+
if (obj)
|
|
68
|
+
return { html: await obj.text(), locale };
|
|
69
|
+
// Locale fallback to default
|
|
70
|
+
if (locale) {
|
|
71
|
+
const fallback = resolvedPath === '/' ? 'pages/home/index.html' : `pages${resolvedPath}/index.html`;
|
|
72
|
+
const fallbackObj = await bucket.get(fallback);
|
|
73
|
+
if (fallbackObj)
|
|
74
|
+
return { html: await fallbackObj.text(), locale };
|
|
75
|
+
}
|
|
76
|
+
// Dynamic segments — list parent directory, find [param] entries
|
|
77
|
+
const parts = resolvedPath.split('/').filter(Boolean);
|
|
78
|
+
for (let i = parts.length - 1; i >= 0; i--) {
|
|
79
|
+
const parentDir = parts.slice(0, i).join('/');
|
|
80
|
+
const prefix = parentDir ? `pages/${parentDir}/` : 'pages/';
|
|
81
|
+
const listed = await bucket.list({ prefix, delimiter: '/' });
|
|
82
|
+
for (const item of listed.delimitedPrefixes) {
|
|
83
|
+
const segment = item.replace(prefix, '').replace(/\/$/, '');
|
|
84
|
+
if (segment.startsWith('[') && segment.endsWith(']')) {
|
|
85
|
+
const dynamicParts = [...parts];
|
|
86
|
+
dynamicParts[i] = segment;
|
|
87
|
+
const dynamicPath = `pages/${dynamicParts.join('/')}/${indexFile}`;
|
|
88
|
+
const dynObj = await bucket.get(dynamicPath);
|
|
89
|
+
if (dynObj)
|
|
90
|
+
return { html: await dynObj.text(), locale };
|
|
91
|
+
// Dynamic route locale fallback
|
|
92
|
+
if (locale) {
|
|
93
|
+
const dynFallback = await bucket.get(`pages/${dynamicParts.join('/')}/index.html`);
|
|
94
|
+
if (dynFallback)
|
|
95
|
+
return { html: await dynFallback.text(), locale };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
// Worker composition
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
22
105
|
export function createWorker(options) {
|
|
23
106
|
const bindingName = options?.bucketBinding ?? 'SITE_BUCKET';
|
|
107
|
+
const locales = options?.locales;
|
|
108
|
+
const nonDefaultLocales = locales?.filter(l => l !== (options?.defaultLocale ?? locales?.[0])) ?? [];
|
|
24
109
|
const app = new Hono();
|
|
25
110
|
// Custom middleware (e.g., www redirect, auth)
|
|
26
111
|
if (options?.middleware)
|
|
@@ -32,6 +117,23 @@ export function createWorker(options) {
|
|
|
32
117
|
const fragments = await bucket.list({ prefix: 'fragments/', delimiter: '/' });
|
|
33
118
|
return c.json({ ok: true, pages: pages.delimitedPrefixes.length, fragments: fragments.delimitedPrefixes.length });
|
|
34
119
|
});
|
|
120
|
+
// Root-level files (sitemap.xml, robots.txt) — served from R2
|
|
121
|
+
app.get('/sitemap.xml', async (c) => {
|
|
122
|
+
const obj = await c.env[bindingName].get('sitemap.xml');
|
|
123
|
+
if (!obj)
|
|
124
|
+
return c.notFound();
|
|
125
|
+
return new Response(obj.body, {
|
|
126
|
+
headers: { 'Content-Type': 'application/xml; charset=utf-8', 'Cache-Control': 'public, max-age=3600' },
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
app.get('/robots.txt', async (c) => {
|
|
130
|
+
const obj = await c.env[bindingName].get('robots.txt');
|
|
131
|
+
if (!obj)
|
|
132
|
+
return c.notFound();
|
|
133
|
+
return new Response(obj.body, {
|
|
134
|
+
headers: { 'Content-Type': 'text/plain; charset=utf-8', 'Cache-Control': 'public, max-age=3600' },
|
|
135
|
+
});
|
|
136
|
+
});
|
|
35
137
|
// Static assets (CSS, JS) — immutable cache
|
|
36
138
|
app.get('/pages/*', async (c) => serveStatic(c, c.env[bindingName]));
|
|
37
139
|
app.get('/fragments/*', async (c) => serveStatic(c, c.env[bindingName]));
|
|
@@ -44,47 +146,36 @@ export function createWorker(options) {
|
|
|
44
146
|
return cached;
|
|
45
147
|
const bucket = c.env[bindingName];
|
|
46
148
|
const requestPath = new URL(c.req.url).pathname;
|
|
47
|
-
const
|
|
48
|
-
if (!
|
|
49
|
-
const
|
|
50
|
-
if (
|
|
51
|
-
const { html: raw404 } = parseCacheComment(
|
|
52
|
-
const
|
|
53
|
-
const fragEntries = await Promise.all(fragPaths.map(async (p) => {
|
|
54
|
-
const obj = await bucket.get(p.slice(1));
|
|
55
|
-
if (!obj)
|
|
56
|
-
return [p, { head: '', body: '' }];
|
|
57
|
-
return [p, splitFragment(await obj.text())];
|
|
58
|
-
}));
|
|
149
|
+
const result = await findPage(bucket, requestPath, locales);
|
|
150
|
+
if (!result) {
|
|
151
|
+
const notFound = await findPage(bucket, '/404');
|
|
152
|
+
if (notFound) {
|
|
153
|
+
const { html: raw404 } = parseCacheComment(notFound.html);
|
|
154
|
+
const fragEntries = await Promise.all(findEsiPaths(raw404).map(p => fetchFragment(bucket, p)));
|
|
59
155
|
return c.html(assembleEsi(raw404, new Map(fragEntries)), 404);
|
|
60
156
|
}
|
|
61
157
|
return c.html('<h1>404 — Page not found</h1>', 404);
|
|
62
158
|
}
|
|
63
|
-
const { html: rawHtml, browser, edge } = parseCacheComment(
|
|
64
|
-
// Read all fragments in parallel
|
|
65
|
-
const
|
|
66
|
-
const
|
|
67
|
-
const key = path.slice(1);
|
|
68
|
-
const obj = await bucket.get(key);
|
|
69
|
-
if (!obj)
|
|
70
|
-
return [path, { head: '', body: `<!-- fragment not found: ${path} -->` }];
|
|
71
|
-
return [path, splitFragment(await obj.text())];
|
|
72
|
-
}));
|
|
73
|
-
const fragments = new Map(fragmentEntries);
|
|
74
|
-
const assembled = assembleEsi(rawHtml, fragments);
|
|
159
|
+
const { html: rawHtml, browser, edge } = parseCacheComment(result.html);
|
|
160
|
+
// Read all fragments in parallel (with locale fallback)
|
|
161
|
+
const fragEntries = await Promise.all(findEsiPaths(rawHtml).map(p => fetchFragment(bucket, p)));
|
|
162
|
+
const assembled = assembleEsi(rawHtml, new Map(fragEntries));
|
|
75
163
|
// Compute ETag
|
|
76
164
|
const encoder = new TextEncoder();
|
|
77
165
|
const hashBuffer = await crypto.subtle.digest('SHA-256', encoder.encode(assembled));
|
|
78
|
-
const etag = `"${[...new Uint8Array(hashBuffer)]
|
|
166
|
+
const etag = `"${[...new Uint8Array(hashBuffer)]
|
|
167
|
+
.map(b => b.toString(16).padStart(2, '0'))
|
|
168
|
+
.join('')
|
|
169
|
+
.slice(0, 16)}"`;
|
|
79
170
|
if (c.req.header('If-None-Match') === etag) {
|
|
80
|
-
return new Response(null, { status: 304, headers: {
|
|
171
|
+
return new Response(null, { status: 304, headers: { ETag: etag } });
|
|
81
172
|
}
|
|
82
173
|
const response = new Response(assembled, {
|
|
83
174
|
status: 200,
|
|
84
175
|
headers: {
|
|
85
176
|
'Content-Type': 'text/html; charset=utf-8',
|
|
86
177
|
'Cache-Control': `public, max-age=${browser}, s-maxage=${edge}`,
|
|
87
|
-
|
|
178
|
+
ETag: etag,
|
|
88
179
|
},
|
|
89
180
|
});
|
|
90
181
|
c.executionCtx.waitUntil(cache.put(request, response.clone()));
|
|
@@ -106,30 +197,4 @@ async function serveStatic(c, bucket) {
|
|
|
106
197
|
},
|
|
107
198
|
});
|
|
108
199
|
}
|
|
109
|
-
async function findPage(bucket, requestPath) {
|
|
110
|
-
const pagePath = requestPath === '/' ? 'pages/home/index.html'
|
|
111
|
-
: `pages${requestPath}/index.html`;
|
|
112
|
-
const obj = await bucket.get(pagePath);
|
|
113
|
-
if (obj)
|
|
114
|
-
return await obj.text();
|
|
115
|
-
// Try dynamic segments — list parent directory, find [param] entries
|
|
116
|
-
const parts = requestPath.split('/').filter(Boolean);
|
|
117
|
-
for (let i = parts.length - 1; i >= 0; i--) {
|
|
118
|
-
const parentDir = parts.slice(0, i).join('/');
|
|
119
|
-
const prefix = parentDir ? `pages/${parentDir}/` : 'pages/';
|
|
120
|
-
const listed = await bucket.list({ prefix, delimiter: '/' });
|
|
121
|
-
for (const item of listed.delimitedPrefixes) {
|
|
122
|
-
const segment = item.replace(prefix, '').replace(/\/$/, '');
|
|
123
|
-
if (segment.startsWith('[') && segment.endsWith(']')) {
|
|
124
|
-
const dynamicParts = [...parts];
|
|
125
|
-
dynamicParts[i] = segment;
|
|
126
|
-
const dynamicPath = `pages/${dynamicParts.join('/')}/index.html`;
|
|
127
|
-
const dynObj = await bucket.get(dynamicPath);
|
|
128
|
-
if (dynObj)
|
|
129
|
-
return await dynObj.text();
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
200
|
//# sourceMappingURL=cloudflare-r2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare-r2.js","sourceRoot":"","sources":["../../src/workers/cloudflare-r2.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD
|
|
1
|
+
{"version":3,"file":"cloudflare-r2.js","sourceRoot":"","sources":["../../src/workers/cloudflare-r2.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gazetta",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Stateless CMS for composable websites",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cms",
|
|
@@ -38,6 +38,10 @@
|
|
|
38
38
|
"types": "./dist/admin-api/index.d.ts",
|
|
39
39
|
"import": "./dist/admin-api/index.js"
|
|
40
40
|
},
|
|
41
|
+
"./admin-api/schemas": {
|
|
42
|
+
"types": "./dist/admin-api/schemas/index.d.ts",
|
|
43
|
+
"import": "./dist/admin-api/schemas/index.js"
|
|
44
|
+
},
|
|
41
45
|
"./workers/cloudflare-r2": {
|
|
42
46
|
"types": "./dist/workers/cloudflare-r2.d.ts",
|
|
43
47
|
"import": "./dist/workers/cloudflare-r2.js"
|
|
@@ -55,7 +59,8 @@
|
|
|
55
59
|
"build": "tsc",
|
|
56
60
|
"build:admin": "vite build -c ../../apps/admin/vite.config.ts --base /admin/ --outDir ../../packages/gazetta/admin-dist --emptyOutDir ../../apps/admin",
|
|
57
61
|
"prepublishOnly": "npm run build && npm run build:admin",
|
|
58
|
-
"test": "vitest run"
|
|
62
|
+
"test": "vitest run",
|
|
63
|
+
"test:mutation": "stryker run"
|
|
59
64
|
},
|
|
60
65
|
"dependencies": {
|
|
61
66
|
"@clack/prompts": "^1.2.0",
|
|
@@ -96,11 +101,15 @@
|
|
|
96
101
|
"@aws-sdk/client-s3": "^3.1030.0",
|
|
97
102
|
"@azure/storage-blob": "^12.31.0",
|
|
98
103
|
"@cloudflare/workers-types": "^4.20260413.1",
|
|
104
|
+
"@stryker-mutator/core": "^9.6.1",
|
|
105
|
+
"@stryker-mutator/typescript-checker": "^9.6.1",
|
|
106
|
+
"@stryker-mutator/vitest-runner": "^9.6.1",
|
|
99
107
|
"@types/js-yaml": "^4.0.0",
|
|
100
108
|
"@types/node": "^25.6.0",
|
|
101
109
|
"@types/react": "^19.2.0",
|
|
102
110
|
"@types/react-dom": "^19.2.0",
|
|
103
111
|
"@vitejs/plugin-vue": "^6.0.6",
|
|
112
|
+
"fast-check": "^4.6.0",
|
|
104
113
|
"tsx": "^4.21.0",
|
|
105
114
|
"typescript": "^6.0.2",
|
|
106
115
|
"vite": "^8.0.8",
|