canopycms 0.0.54 → 0.0.56
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/dist/api/assets.d.ts +14 -2
- package/dist/api/assets.d.ts.map +1 -1
- package/dist/api/assets.js +14 -3
- package/dist/api/assets.js.map +1 -1
- package/dist/api/branch-status.d.ts.map +1 -1
- package/dist/api/branch-status.js +8 -2
- package/dist/api/branch-status.js.map +1 -1
- package/dist/api/client.d.ts +2 -2
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +29 -14
- package/dist/api/client.js.map +1 -1
- package/dist/api/content.d.ts +2 -2
- package/dist/api/content.d.ts.map +1 -1
- package/dist/api/content.js +160 -26
- package/dist/api/content.js.map +1 -1
- package/dist/api/entries.d.ts.map +1 -1
- package/dist/api/entries.js +8 -4
- package/dist/api/entries.js.map +1 -1
- package/dist/api/github-sync.d.ts.map +1 -1
- package/dist/api/github-sync.js +45 -7
- package/dist/api/github-sync.js.map +1 -1
- package/dist/api/groups.d.ts.map +1 -1
- package/dist/api/groups.js +15 -5
- package/dist/api/groups.js.map +1 -1
- package/dist/api/permissions.d.ts +6 -6
- package/dist/api/permissions.d.ts.map +1 -1
- package/dist/api/permissions.js +24 -9
- package/dist/api/permissions.js.map +1 -1
- package/dist/api/request-body-hash.d.ts +33 -0
- package/dist/api/request-body-hash.d.ts.map +1 -0
- package/dist/api/request-body-hash.js +43 -0
- package/dist/api/request-body-hash.js.map +1 -0
- package/dist/api/resolve-references.d.ts.map +1 -1
- package/dist/api/resolve-references.js +8 -1
- package/dist/api/resolve-references.js.map +1 -1
- package/dist/api/schema.js +9 -9
- package/dist/api/schema.js.map +1 -1
- package/dist/api/settings-helpers.d.ts +14 -1
- package/dist/api/settings-helpers.d.ts.map +1 -1
- package/dist/api/settings-helpers.js +11 -2
- package/dist/api/settings-helpers.js.map +1 -1
- package/dist/api/types.d.ts +10 -0
- package/dist/api/types.d.ts.map +1 -1
- package/dist/auth/caching-auth-plugin.d.ts +8 -1
- package/dist/auth/caching-auth-plugin.d.ts.map +1 -1
- package/dist/auth/caching-auth-plugin.js +6 -1
- package/dist/auth/caching-auth-plugin.js.map +1 -1
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +1 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/plugin.d.ts +35 -0
- package/dist/auth/plugin.d.ts.map +1 -1
- package/dist/auth/plugin.js +27 -1
- package/dist/auth/plugin.js.map +1 -1
- package/dist/authorization/helpers.d.ts +16 -0
- package/dist/authorization/helpers.d.ts.map +1 -1
- package/dist/authorization/helpers.js +18 -0
- package/dist/authorization/helpers.js.map +1 -1
- package/dist/authorization/index.d.ts +1 -1
- package/dist/authorization/index.d.ts.map +1 -1
- package/dist/authorization/index.js +1 -1
- package/dist/authorization/index.js.map +1 -1
- package/dist/build/generate-ai-content.d.ts.map +1 -1
- package/dist/build/generate-ai-content.js +7 -0
- package/dist/build/generate-ai-content.js.map +1 -1
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +2 -1
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/generate-ai-content.js +1150 -355
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +40 -13
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +88 -60
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/template-files/canopy.ts.template +2 -1
- package/dist/cli/template-files/edit-page.tsx.template +8 -1
- package/dist/cli/template-files/middleware.ts.template +18 -0
- package/dist/cli/templates.d.ts.map +1 -1
- package/dist/cli/templates.js +19 -4
- package/dist/cli/templates.js.map +1 -1
- package/dist/config/helpers.d.ts +9 -1
- package/dist/config/helpers.d.ts.map +1 -1
- package/dist/config/helpers.js +33 -75
- package/dist/config/helpers.js.map +1 -1
- package/dist/config/schemas/config.d.ts +8 -24
- package/dist/config/schemas/config.d.ts.map +1 -1
- package/dist/config/schemas/config.js +12 -5
- package/dist/config/schemas/config.js.map +1 -1
- package/dist/config/schemas/media.d.ts +1 -10
- package/dist/config/schemas/media.d.ts.map +1 -1
- package/dist/config/schemas/media.js +8 -6
- package/dist/config/schemas/media.js.map +1 -1
- package/dist/config/types.d.ts +6 -4
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config-test.d.ts +5 -3
- package/dist/config-test.d.ts.map +1 -1
- package/dist/config-test.js +9 -1
- package/dist/config-test.js.map +1 -1
- package/dist/content-id-index.d.ts +12 -6
- package/dist/content-id-index.d.ts.map +1 -1
- package/dist/content-id-index.js +12 -6
- package/dist/content-id-index.js.map +1 -1
- package/dist/content-index-generation.d.ts +30 -0
- package/dist/content-index-generation.d.ts.map +1 -0
- package/dist/content-index-generation.js +131 -0
- package/dist/content-index-generation.js.map +1 -0
- package/dist/content-index-registry.d.ts +38 -0
- package/dist/content-index-registry.d.ts.map +1 -0
- package/dist/content-index-registry.js +53 -0
- package/dist/content-index-registry.js.map +1 -0
- package/dist/content-listing.d.ts +3 -1
- package/dist/content-listing.d.ts.map +1 -1
- package/dist/content-listing.js +1 -0
- package/dist/content-listing.js.map +1 -1
- package/dist/content-store.d.ts +130 -6
- package/dist/content-store.d.ts.map +1 -1
- package/dist/content-store.js +343 -31
- package/dist/content-store.js.map +1 -1
- package/dist/editor/Editor.d.ts.map +1 -1
- package/dist/editor/Editor.js +27 -19
- package/dist/editor/Editor.js.map +1 -1
- package/dist/editor/FormRenderer.d.ts +7 -0
- package/dist/editor/FormRenderer.d.ts.map +1 -1
- package/dist/editor/FormRenderer.js +12 -3
- package/dist/editor/FormRenderer.js.map +1 -1
- package/dist/editor/components/EditorHeader.d.ts.map +1 -1
- package/dist/editor/components/EditorHeader.js +3 -4
- package/dist/editor/components/EditorHeader.js.map +1 -1
- package/dist/editor/components/EditorSidebar.d.ts.map +1 -1
- package/dist/editor/components/EditorSidebar.js +2 -4
- package/dist/editor/components/EditorSidebar.js.map +1 -1
- package/dist/editor/fields/ReferenceField.d.ts.map +1 -1
- package/dist/editor/fields/ReferenceField.js +19 -2
- package/dist/editor/fields/ReferenceField.js.map +1 -1
- package/dist/editor/group-manager/hooks/useGroupState.d.ts.map +1 -1
- package/dist/editor/group-manager/hooks/useGroupState.js +5 -2
- package/dist/editor/group-manager/hooks/useGroupState.js.map +1 -1
- package/dist/editor/hooks/useDraftManager.d.ts +15 -0
- package/dist/editor/hooks/useDraftManager.d.ts.map +1 -1
- package/dist/editor/hooks/useDraftManager.js +140 -1
- package/dist/editor/hooks/useDraftManager.js.map +1 -1
- package/dist/editor/hooks/useEntryManager.d.ts +9 -2
- package/dist/editor/hooks/useEntryManager.d.ts.map +1 -1
- package/dist/editor/hooks/useEntryManager.js +9 -3
- package/dist/editor/hooks/useEntryManager.js.map +1 -1
- package/dist/editor/hooks/useSchemaManager.d.ts +34 -10
- package/dist/editor/hooks/useSchemaManager.d.ts.map +1 -1
- package/dist/editor/hooks/useSchemaManager.js +22 -25
- package/dist/editor/hooks/useSchemaManager.js.map +1 -1
- package/dist/editor/schema-editor/CollectionEditor.d.ts +6 -5
- package/dist/editor/schema-editor/CollectionEditor.d.ts.map +1 -1
- package/dist/editor/schema-editor/CollectionEditor.js +37 -12
- package/dist/editor/schema-editor/CollectionEditor.js.map +1 -1
- package/dist/entry-link-resolver.d.ts.map +1 -1
- package/dist/entry-link-resolver.js +5 -0
- package/dist/entry-link-resolver.js.map +1 -1
- package/dist/git-manager.d.ts +38 -3
- package/dist/git-manager.d.ts.map +1 -1
- package/dist/git-manager.js +141 -33
- package/dist/git-manager.js.map +1 -1
- package/dist/github-service.d.ts +69 -3
- package/dist/github-service.d.ts.map +1 -1
- package/dist/github-service.js +149 -25
- package/dist/github-service.js.map +1 -1
- package/dist/http/handler.d.ts +1 -1
- package/dist/http/handler.d.ts.map +1 -1
- package/dist/http/handler.js +36 -7
- package/dist/http/handler.js.map +1 -1
- package/dist/http/router.d.ts +11 -0
- package/dist/http/router.d.ts.map +1 -1
- package/dist/http/router.js +80 -16
- package/dist/http/router.js.map +1 -1
- package/dist/paths/validation.d.ts.map +1 -1
- package/dist/paths/validation.js +12 -0
- package/dist/paths/validation.js.map +1 -1
- package/dist/schema/schema-store.d.ts +9 -0
- package/dist/schema/schema-store.d.ts.map +1 -1
- package/dist/schema/schema-store.js +57 -8
- package/dist/schema/schema-store.js.map +1 -1
- package/dist/services.d.ts +1 -0
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +9 -2
- package/dist/services.js.map +1 -1
- package/dist/static/index.d.ts +32 -0
- package/dist/static/index.d.ts.map +1 -1
- package/dist/static/index.js +90 -0
- package/dist/static/index.js.map +1 -1
- package/dist/sync-core.d.ts.map +1 -1
- package/dist/sync-core.js +22 -9
- package/dist/sync-core.js.map +1 -1
- package/dist/user.d.ts +0 -18
- package/dist/user.d.ts.map +1 -1
- package/dist/user.js +7 -22
- package/dist/user.js.map +1 -1
- package/dist/utils/error.d.ts +8 -0
- package/dist/utils/error.d.ts.map +1 -1
- package/dist/utils/error.js +35 -7
- package/dist/utils/error.js.map +1 -1
- package/dist/validation/deletion-checker.d.ts.map +1 -1
- package/dist/validation/deletion-checker.js +6 -5
- package/dist/validation/deletion-checker.js.map +1 -1
- package/dist/validation/entry-validator.d.ts +67 -0
- package/dist/validation/entry-validator.d.ts.map +1 -0
- package/dist/validation/entry-validator.js +277 -0
- package/dist/validation/entry-validator.js.map +1 -0
- package/dist/validation/field-traversal.d.ts +23 -1
- package/dist/validation/field-traversal.d.ts.map +1 -1
- package/dist/validation/field-traversal.js +29 -9
- package/dist/validation/field-traversal.js.map +1 -1
- package/dist/worker/cms-worker.d.ts +70 -6
- package/dist/worker/cms-worker.d.ts.map +1 -1
- package/dist/worker/cms-worker.js +199 -93
- package/dist/worker/cms-worker.js.map +1 -1
- package/package.json +2 -2
- package/dist/editor/components/EditorContext.d.ts +0 -35
- package/dist/editor/components/EditorContext.d.ts.map +0 -1
- package/dist/editor/components/EditorContext.js +0 -19
- package/dist/editor/components/EditorContext.js.map +0 -1
- package/dist/editor/env.d.ts +0 -5
- package/dist/editor/env.d.ts.map +0 -1
- package/dist/editor/env.js +0 -5
- package/dist/editor/env.js.map +0 -1
package/dist/config/helpers.js
CHANGED
|
@@ -55,10 +55,28 @@ export function defineCanopyConfig(config) {
|
|
|
55
55
|
},
|
|
56
56
|
};
|
|
57
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Assigns `value` onto `target[key]` unless `value` is undefined.
|
|
60
|
+
* Used by `composeCanopyConfig` to merge fragments key-by-key without a later
|
|
61
|
+
* fragment's absent (undefined) field clobbering a value set by an earlier one.
|
|
62
|
+
*/
|
|
63
|
+
function assignFragmentField(target, key, value) {
|
|
64
|
+
if (value !== undefined) {
|
|
65
|
+
target[key] = value;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
58
68
|
/**
|
|
59
69
|
* Helper to compose config fragments defined across multiple files.
|
|
60
70
|
* Useful for splitting large configurations into domain-specific modules.
|
|
61
|
-
*
|
|
71
|
+
*
|
|
72
|
+
* Merges every field declared on `CanopyConfigFragment` (i.e. every field of
|
|
73
|
+
* `CanopyConfigInput`) — not just a hand-picked subset — so adopters can put any
|
|
74
|
+
* config field (including `authPlugin`, `validateEntry`, `editor`, etc.) into any
|
|
75
|
+
* fragment without it being silently dropped.
|
|
76
|
+
*
|
|
77
|
+
* Fragments are applied in order and later fragments win field-by-field: if a later
|
|
78
|
+
* fragment sets a field, it overrides an earlier one; if a later fragment omits a
|
|
79
|
+
* field (leaves it undefined), the earlier fragment's value is preserved.
|
|
62
80
|
*
|
|
63
81
|
* @example
|
|
64
82
|
* ```ts
|
|
@@ -74,82 +92,22 @@ export function defineCanopyConfig(config) {
|
|
|
74
92
|
* ```
|
|
75
93
|
*/
|
|
76
94
|
export const composeCanopyConfig = (...fragments) => {
|
|
77
|
-
|
|
78
|
-
let contentRoot;
|
|
79
|
-
let sourceRoot;
|
|
80
|
-
let defaultBranchAccess;
|
|
81
|
-
let defaultPathAccess;
|
|
82
|
-
let defaultBaseBranch;
|
|
83
|
-
let defaultActiveBranch;
|
|
84
|
-
let defaultRemoteName;
|
|
85
|
-
let defaultRemoteUrl;
|
|
86
|
-
let gitBotAuthorName;
|
|
87
|
-
let gitBotAuthorEmail;
|
|
88
|
-
let mode;
|
|
89
|
-
let deploymentName;
|
|
90
|
-
let dev;
|
|
95
|
+
const merged = {};
|
|
91
96
|
for (const fragment of fragments) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
95
|
-
if (fragment.contentRoot) {
|
|
96
|
-
contentRoot = fragment.contentRoot;
|
|
97
|
-
}
|
|
98
|
-
if (fragment.sourceRoot) {
|
|
99
|
-
sourceRoot = fragment.sourceRoot;
|
|
100
|
-
}
|
|
101
|
-
if (fragment.defaultBranchAccess) {
|
|
102
|
-
defaultBranchAccess = fragment.defaultBranchAccess;
|
|
103
|
-
}
|
|
104
|
-
if (fragment.defaultPathAccess) {
|
|
105
|
-
defaultPathAccess = fragment.defaultPathAccess;
|
|
106
|
-
}
|
|
107
|
-
if (fragment.defaultBaseBranch) {
|
|
108
|
-
defaultBaseBranch = fragment.defaultBaseBranch;
|
|
109
|
-
}
|
|
110
|
-
if (fragment.defaultActiveBranch) {
|
|
111
|
-
defaultActiveBranch = fragment.defaultActiveBranch;
|
|
112
|
-
}
|
|
113
|
-
if (fragment.defaultRemoteName) {
|
|
114
|
-
defaultRemoteName = fragment.defaultRemoteName;
|
|
115
|
-
}
|
|
116
|
-
if (fragment.defaultRemoteUrl) {
|
|
117
|
-
defaultRemoteUrl = fragment.defaultRemoteUrl;
|
|
118
|
-
}
|
|
119
|
-
if (fragment.gitBotAuthorName) {
|
|
120
|
-
gitBotAuthorName = fragment.gitBotAuthorName;
|
|
121
|
-
}
|
|
122
|
-
if (fragment.gitBotAuthorEmail) {
|
|
123
|
-
gitBotAuthorEmail = fragment.gitBotAuthorEmail;
|
|
124
|
-
}
|
|
125
|
-
if (fragment.mode) {
|
|
126
|
-
mode = fragment.mode;
|
|
127
|
-
}
|
|
128
|
-
if (fragment.deploymentName) {
|
|
129
|
-
deploymentName = fragment.deploymentName;
|
|
130
|
-
}
|
|
131
|
-
if (fragment.dev) {
|
|
132
|
-
dev = fragment.dev;
|
|
97
|
+
for (const key of Object.keys(fragment)) {
|
|
98
|
+
assignFragmentField(merged, key, fragment[key]);
|
|
133
99
|
}
|
|
134
100
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
...(defaultRemoteUrl ? { defaultRemoteUrl } : {}),
|
|
147
|
-
...(gitBotAuthorName ? { gitBotAuthorName } : {}),
|
|
148
|
-
...(gitBotAuthorEmail ? { gitBotAuthorEmail } : {}),
|
|
149
|
-
...(mode ? { mode } : {}),
|
|
150
|
-
...(deploymentName ? { deploymentName } : {}),
|
|
151
|
-
...(dev ? { dev } : {}),
|
|
152
|
-
};
|
|
153
|
-
return validateCanopyConfig(merged);
|
|
101
|
+
return validateCanopyConfig({
|
|
102
|
+
...merged,
|
|
103
|
+
// gitBotAuthorName/gitBotAuthorEmail are required by CanopyConfigInput; default to ''
|
|
104
|
+
// so a fragment set omitting them fails validation (min length / email format) with a
|
|
105
|
+
// clear error rather than a TS/runtime "missing required field" surprise.
|
|
106
|
+
gitBotAuthorName: merged.gitBotAuthorName ?? '',
|
|
107
|
+
gitBotAuthorEmail: merged.gitBotAuthorEmail ?? '',
|
|
108
|
+
// `mode` is intentionally NOT defaulted here (SEC-C1): if no fragment supplies it,
|
|
109
|
+
// this composes with mode omitted and Zod fails validation with a clear
|
|
110
|
+
// "mode: Required"-style error rather than silently falling back to dev semantics.
|
|
111
|
+
});
|
|
154
112
|
};
|
|
155
113
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/config/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/config/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAWnD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAiD;IAClF,MAAM,SAAS,GAAG,oBAAoB,CAAC,MAA2B,CAAC,CAAA;IAEnE,OAAO;QACL,2DAA2D;QAC3D,MAAM,EAAE,SAAS;QAEjB,mEAAmE;QACnE,6FAA6F;QAC7F,MAAM,EAAE,CAAC,eAAkC,EAAsB,EAAE;YACjE,MAAM,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GACvF,SAAS,CAAA;YACX,MAAM,YAAY,GAAuB;gBACvC,iBAAiB;gBACjB,mBAAmB;gBACnB,WAAW;gBACX,MAAM;gBACN,IAAI;gBACJ,YAAY;gBACZ,UAAU,EAAE,EAAE,EAAE,uCAAuC;aACxD,CAAA;YAED,uEAAuE;YACvE,IAAI,eAAe,EAAE,MAAM,EAAE,CAAC;gBAC5B,YAAY,CAAC,MAAM,GAAG;oBACpB,GAAG,YAAY,CAAC,MAAM;oBACtB,GAAG,eAAe,CAAC,MAAM;iBAC1B,CAAA;YACH,CAAC;YAED,OAAO,YAAY,CAAA;QACrB,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAC1B,MAAkC,EAClC,GAAM,EACN,KAA8B;IAE9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IACrB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,SAAiC,EAAgB,EAAE;IACxF,MAAM,MAAM,GAA+B,EAAE,CAAA;IAE7C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAmC,EAAE,CAAC;YAC1E,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QACjD,CAAC;IACH,CAAC;IAED,OAAO,oBAAoB,CAAC;QAC1B,GAAG,MAAM;QACT,sFAAsF;QACtF,sFAAsF;QACtF,0EAA0E;QAC1E,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,EAAE;QAC/C,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,EAAE;QACjD,mFAAmF;QACnF,wEAAwE;QACxE,mFAAmF;KACpF,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -13,7 +13,7 @@ export declare const defaultRemoteUrlSchema: z.ZodString;
|
|
|
13
13
|
export declare const gitBotAuthorNameSchema: z.ZodString;
|
|
14
14
|
export declare const gitBotAuthorEmailSchema: z.ZodString;
|
|
15
15
|
export declare const githubTokenEnvVarSchema: z.ZodDefault<z.ZodString>;
|
|
16
|
-
export declare const operatingModeSchema: z.
|
|
16
|
+
export declare const operatingModeSchema: z.ZodEnum<["prod", "dev"]>;
|
|
17
17
|
export declare const deployedAsSchema: z.ZodDefault<z.ZodEnum<["static", "server"]>>;
|
|
18
18
|
export declare const contentRootSchema: z.ZodDefault<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string, string>>;
|
|
19
19
|
export declare const sourceRootSchema: z.ZodOptional<z.ZodString>;
|
|
@@ -52,7 +52,7 @@ export declare const editorConfigSchema: z.ZodObject<{
|
|
|
52
52
|
AccountComponent?: import("react").ComponentType<{}> | undefined;
|
|
53
53
|
}>;
|
|
54
54
|
export declare const CanopyConfigSchema: z.ZodObject<{
|
|
55
|
-
media: z.ZodOptional<z.
|
|
55
|
+
media: z.ZodOptional<z.ZodDiscriminatedUnion<"adapter", [z.ZodObject<{
|
|
56
56
|
adapter: z.ZodLiteral<"local">;
|
|
57
57
|
publicBaseUrl: z.ZodOptional<z.ZodString>;
|
|
58
58
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -85,18 +85,9 @@ export declare const CanopyConfigSchema: z.ZodObject<{
|
|
|
85
85
|
}, {
|
|
86
86
|
adapter: "lfs";
|
|
87
87
|
publicBaseUrl?: string | undefined;
|
|
88
|
-
}>, z.ZodObject<{
|
|
89
|
-
adapter: z.ZodString;
|
|
90
|
-
publicBaseUrl: z.ZodOptional<z.ZodString>;
|
|
91
|
-
}, "strip", z.ZodTypeAny, {
|
|
92
|
-
adapter: string;
|
|
93
|
-
publicBaseUrl?: string | undefined;
|
|
94
|
-
}, {
|
|
95
|
-
adapter: string;
|
|
96
|
-
publicBaseUrl?: string | undefined;
|
|
97
88
|
}>]>>;
|
|
98
|
-
defaultBranchAccess: z.
|
|
99
|
-
defaultPathAccess: z.
|
|
89
|
+
defaultBranchAccess: z.ZodDefault<z.ZodEnum<["allow", "deny"]>>;
|
|
90
|
+
defaultPathAccess: z.ZodDefault<z.ZodEnum<["allow", "deny"]>>;
|
|
100
91
|
defaultBaseBranch: z.ZodOptional<z.ZodDefault<z.ZodString>>;
|
|
101
92
|
defaultActiveBranch: z.ZodOptional<z.ZodString>;
|
|
102
93
|
defaultRemoteName: z.ZodOptional<z.ZodDefault<z.ZodString>>;
|
|
@@ -104,7 +95,7 @@ export declare const CanopyConfigSchema: z.ZodObject<{
|
|
|
104
95
|
gitBotAuthorName: z.ZodString;
|
|
105
96
|
gitBotAuthorEmail: z.ZodString;
|
|
106
97
|
githubTokenEnvVar: z.ZodOptional<z.ZodDefault<z.ZodString>>;
|
|
107
|
-
mode: z.
|
|
98
|
+
mode: z.ZodEnum<["prod", "dev"]>;
|
|
108
99
|
deployedAs: z.ZodDefault<z.ZodEnum<["static", "server"]>>;
|
|
109
100
|
settingsBranch: z.ZodOptional<z.ZodString>;
|
|
110
101
|
autoCreateSettingsPR: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -147,6 +138,8 @@ export declare const CanopyConfigSchema: z.ZodObject<{
|
|
|
147
138
|
contentSync?: "off" | "warn" | undefined;
|
|
148
139
|
}>>;
|
|
149
140
|
}, "strict", z.ZodTypeAny, {
|
|
141
|
+
defaultBranchAccess: "allow" | "deny";
|
|
142
|
+
defaultPathAccess: "allow" | "deny";
|
|
150
143
|
gitBotAuthorName: string;
|
|
151
144
|
gitBotAuthorEmail: string;
|
|
152
145
|
mode: "prod" | "dev";
|
|
@@ -166,12 +159,7 @@ export declare const CanopyConfigSchema: z.ZodObject<{
|
|
|
166
159
|
} | {
|
|
167
160
|
adapter: "lfs";
|
|
168
161
|
publicBaseUrl?: string | undefined;
|
|
169
|
-
} | {
|
|
170
|
-
adapter: string;
|
|
171
|
-
publicBaseUrl?: string | undefined;
|
|
172
162
|
} | undefined;
|
|
173
|
-
defaultBranchAccess?: "allow" | "deny" | undefined;
|
|
174
|
-
defaultPathAccess?: "allow" | "deny" | undefined;
|
|
175
163
|
defaultBaseBranch?: string | undefined;
|
|
176
164
|
defaultActiveBranch?: string | undefined;
|
|
177
165
|
defaultRemoteName?: string | undefined;
|
|
@@ -196,6 +184,7 @@ export declare const CanopyConfigSchema: z.ZodObject<{
|
|
|
196
184
|
}, {
|
|
197
185
|
gitBotAuthorName: string;
|
|
198
186
|
gitBotAuthorEmail: string;
|
|
187
|
+
mode: "prod" | "dev";
|
|
199
188
|
dev?: {
|
|
200
189
|
contentSync?: "off" | "warn" | undefined;
|
|
201
190
|
} | undefined;
|
|
@@ -210,9 +199,6 @@ export declare const CanopyConfigSchema: z.ZodObject<{
|
|
|
210
199
|
} | {
|
|
211
200
|
adapter: "lfs";
|
|
212
201
|
publicBaseUrl?: string | undefined;
|
|
213
|
-
} | {
|
|
214
|
-
adapter: string;
|
|
215
|
-
publicBaseUrl?: string | undefined;
|
|
216
202
|
} | undefined;
|
|
217
203
|
defaultBranchAccess?: "allow" | "deny" | undefined;
|
|
218
204
|
defaultPathAccess?: "allow" | "deny" | undefined;
|
|
@@ -221,7 +207,6 @@ export declare const CanopyConfigSchema: z.ZodObject<{
|
|
|
221
207
|
defaultRemoteName?: string | undefined;
|
|
222
208
|
defaultRemoteUrl?: string | undefined;
|
|
223
209
|
githubTokenEnvVar?: string | undefined;
|
|
224
|
-
mode?: "prod" | "dev" | undefined;
|
|
225
210
|
deployedAs?: "static" | "server" | undefined;
|
|
226
211
|
settingsBranch?: string | undefined;
|
|
227
212
|
autoCreateSettingsPR?: boolean | undefined;
|
|
@@ -253,7 +238,6 @@ export declare const getConfigDefaults: () => {
|
|
|
253
238
|
pathAccess: "allow" | "deny";
|
|
254
239
|
branchAccess: "allow" | "deny";
|
|
255
240
|
contentRoot: string;
|
|
256
|
-
mode: "prod" | "dev";
|
|
257
241
|
githubTokenEnvVar: string;
|
|
258
242
|
deploymentName: string;
|
|
259
243
|
prodWorkspace: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/config/schemas/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAKjD,eAAO,MAAM,yBAAyB,4CAA4C,CAAA;AAClF,eAAO,MAAM,uBAAuB,4CAA4C,CAAA;AAChF,eAAO,MAAM,uBAAuB,2BAA6B,CAAA;AACjE,eAAO,MAAM,uBAAuB,2BAA+B,CAAA;AACnE,eAAO,MAAM,sBAAsB,aAAoB,CAAA;AACvD,eAAO,MAAM,sBAAsB,aAAoB,CAAA;AACvD,eAAO,MAAM,uBAAuB,aAAqB,CAAA;AACzD,eAAO,MAAM,uBAAuB,2BAAyC,CAAA;AAC7E,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/config/schemas/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAKjD,eAAO,MAAM,yBAAyB,4CAA4C,CAAA;AAClF,eAAO,MAAM,uBAAuB,4CAA4C,CAAA;AAChF,eAAO,MAAM,uBAAuB,2BAA6B,CAAA;AACjE,eAAO,MAAM,uBAAuB,2BAA+B,CAAA;AACnE,eAAO,MAAM,sBAAsB,aAAoB,CAAA;AACvD,eAAO,MAAM,sBAAsB,aAAoB,CAAA;AACvD,eAAO,MAAM,uBAAuB,aAAqB,CAAA;AACzD,eAAO,MAAM,uBAAuB,2BAAyC,CAAA;AAC7E,eAAO,MAAM,mBAAmB,4BAA0B,CAAA;AAC1D,eAAO,MAAM,gBAAgB,+CAAiD,CAAA;AAC9E,eAAO,MAAM,iBAAiB,qHAAwC,CAAA;AACtE,eAAO,MAAM,gBAAgB,4BAA+B,CAAA;AAC5D,eAAO,MAAM,oBAAoB,2BAA6B,CAAA;AAC9D,eAAO,MAAM,oBAAoB,0CAA0C,CAAA;AAG3E,eAAO,MAAM,eAAe;;;;;;EAE1B,CAAA;AAGF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;EAU7B,CAAA;AAGF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCpB,CAAA;AAEX;;;GAGG;AACH,2FAA2F;AAC3F,eAAO,MAAM,sBAAsB,uBAAuB,CAAA;AAI1D,eAAO,MAAM,iBAAiB;;;;;;;;;CAS5B,CAAA"}
|
|
@@ -13,7 +13,7 @@ export const defaultRemoteUrlSchema = z.string().min(1);
|
|
|
13
13
|
export const gitBotAuthorNameSchema = z.string().min(1);
|
|
14
14
|
export const gitBotAuthorEmailSchema = z.string().email();
|
|
15
15
|
export const githubTokenEnvVarSchema = z.string().default('GITHUB_BOT_TOKEN');
|
|
16
|
-
export const operatingModeSchema = z.enum(['prod', 'dev'])
|
|
16
|
+
export const operatingModeSchema = z.enum(['prod', 'dev']);
|
|
17
17
|
export const deployedAsSchema = z.enum(['static', 'server']).default('server');
|
|
18
18
|
export const contentRootSchema = relativePathSchema.default('content');
|
|
19
19
|
export const sourceRootSchema = z.string().min(1).optional();
|
|
@@ -39,8 +39,12 @@ export const editorConfigSchema = z.object({
|
|
|
39
39
|
export const CanopyConfigSchema = z
|
|
40
40
|
.object({
|
|
41
41
|
media: mediaSchema.optional(),
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
// No outer .optional() here: defaultBranchAccessSchema/defaultPathAccessSchema already
|
|
43
|
+
// have .default('deny'), so the field is optional on input but always resolves to
|
|
44
|
+
// 'allow'/'deny' (never undefined) on output. An outer .optional() would short-circuit
|
|
45
|
+
// before the inner default runs, defeating the fail-closed default (SCH-M1).
|
|
46
|
+
defaultBranchAccess: defaultBranchAccessSchema,
|
|
47
|
+
defaultPathAccess: defaultPathAccessSchema,
|
|
44
48
|
// .optional() deliberately defeats defaultBaseBranchSchema's .default('main'):
|
|
45
49
|
// unset must stay undefined after parsing so dev mode can detect the fork
|
|
46
50
|
// point from git HEAD (see resolveBaseBranch in utils/git.ts).
|
|
@@ -51,7 +55,9 @@ export const CanopyConfigSchema = z
|
|
|
51
55
|
gitBotAuthorName: gitBotAuthorNameSchema,
|
|
52
56
|
gitBotAuthorEmail: gitBotAuthorEmailSchema,
|
|
53
57
|
githubTokenEnvVar: githubTokenEnvVarSchema.optional(),
|
|
54
|
-
|
|
58
|
+
// Required by design (follow-up to SEC-C1): a prod deploy that omits `mode` must fail
|
|
59
|
+
// validation loudly rather than silently running header-trusting dev auth semantics.
|
|
60
|
+
mode: operatingModeSchema,
|
|
55
61
|
deployedAs: deployedAsSchema, // Has .default('server'), so always present after validation
|
|
56
62
|
settingsBranch: z.string().optional(),
|
|
57
63
|
autoCreateSettingsPR: z.boolean().optional(),
|
|
@@ -71,13 +77,14 @@ export const CanopyConfigSchema = z
|
|
|
71
77
|
*/
|
|
72
78
|
/** Default workspace path for prod mode (used when CANOPYCMS_WORKSPACE_ROOT is not set) */
|
|
73
79
|
export const DEFAULT_PROD_WORKSPACE = '/mnt/efs/workspace';
|
|
80
|
+
// Note: `mode` has no default by design (SEC-C1) and is intentionally omitted here —
|
|
81
|
+
// operatingModeSchema.parse(undefined) would throw.
|
|
74
82
|
export const getConfigDefaults = () => ({
|
|
75
83
|
baseBranch: defaultBaseBranchSchema.parse(undefined),
|
|
76
84
|
remoteName: defaultRemoteNameSchema.parse(undefined),
|
|
77
85
|
pathAccess: defaultPathAccessSchema.parse(undefined),
|
|
78
86
|
branchAccess: defaultBranchAccessSchema.parse(undefined),
|
|
79
87
|
contentRoot: contentRootSchema.parse(undefined),
|
|
80
|
-
mode: operatingModeSchema.parse(undefined),
|
|
81
88
|
githubTokenEnvVar: githubTokenEnvVarSchema.parse(undefined),
|
|
82
89
|
deploymentName: deploymentNameSchema.parse(undefined),
|
|
83
90
|
prodWorkspace: DEFAULT_PROD_WORKSPACE,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/config/schemas/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAErC,wBAAwB;AACxB,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;AAClF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;AAChF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;AACjE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AACvD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AACvD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAA;AACzD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/config/schemas/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Zod schemas for media adapter configuration validation.
|
|
3
3
|
*/
|
|
4
4
|
import { z } from 'zod';
|
|
5
|
-
export declare const mediaSchema: z.
|
|
5
|
+
export declare const mediaSchema: z.ZodDiscriminatedUnion<"adapter", [z.ZodObject<{
|
|
6
6
|
adapter: z.ZodLiteral<"local">;
|
|
7
7
|
publicBaseUrl: z.ZodOptional<z.ZodString>;
|
|
8
8
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -35,14 +35,5 @@ export declare const mediaSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
35
35
|
}, {
|
|
36
36
|
adapter: "lfs";
|
|
37
37
|
publicBaseUrl?: string | undefined;
|
|
38
|
-
}>, z.ZodObject<{
|
|
39
|
-
adapter: z.ZodString;
|
|
40
|
-
publicBaseUrl: z.ZodOptional<z.ZodString>;
|
|
41
|
-
}, "strip", z.ZodTypeAny, {
|
|
42
|
-
adapter: string;
|
|
43
|
-
publicBaseUrl?: string | undefined;
|
|
44
|
-
}, {
|
|
45
|
-
adapter: string;
|
|
46
|
-
publicBaseUrl?: string | undefined;
|
|
47
38
|
}>]>;
|
|
48
39
|
//# sourceMappingURL=media.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/config/schemas/media.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/config/schemas/media.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AASvB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAetB,CAAA"}
|
|
@@ -2,8 +2,14 @@
|
|
|
2
2
|
* Zod schemas for media adapter configuration validation.
|
|
3
3
|
*/
|
|
4
4
|
import { z } from 'zod';
|
|
5
|
-
// Media adapter configuration schema
|
|
6
|
-
|
|
5
|
+
// Media adapter configuration schema.
|
|
6
|
+
// Keyed as a discriminated union on `adapter` so each adapter's required fields are
|
|
7
|
+
// enforced at parse time. With a plain z.union, a malformed s3 config (e.g. missing
|
|
8
|
+
// `region`) could fall through to a looser branch, silently stripping fields instead
|
|
9
|
+
// of failing validation. There is no generic/custom adapter branch: only 'local', 's3',
|
|
10
|
+
// and 'lfs' are implemented (see BACKLOG.md "Asset adapters"); add a literal branch here
|
|
11
|
+
// when a new adapter ships.
|
|
12
|
+
export const mediaSchema = z.discriminatedUnion('adapter', [
|
|
7
13
|
z.object({
|
|
8
14
|
adapter: z.literal('local'),
|
|
9
15
|
publicBaseUrl: z.string().url().optional(),
|
|
@@ -18,9 +24,5 @@ export const mediaSchema = z.union([
|
|
|
18
24
|
adapter: z.literal('lfs'),
|
|
19
25
|
publicBaseUrl: z.string().url().optional(),
|
|
20
26
|
}),
|
|
21
|
-
z.object({
|
|
22
|
-
adapter: z.string().min(1),
|
|
23
|
-
publicBaseUrl: z.string().url().optional(),
|
|
24
|
-
}),
|
|
25
27
|
]);
|
|
26
28
|
//# sourceMappingURL=media.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/config/schemas/media.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/config/schemas/media.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,sCAAsC;AACtC,oFAAoF;AACpF,oFAAoF;AACpF,qFAAqF;AACrF,wFAAwF;AACxF,yFAAyF;AACzF,4BAA4B;AAC5B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE;IACzD,CAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAC3B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KAC3C,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QACxB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KAC3C,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QACzB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KAC3C,CAAC;CACH,CAAC,CAAA"}
|
package/dist/config/types.d.ts
CHANGED
|
@@ -115,9 +115,6 @@ export type MediaConfig = {
|
|
|
115
115
|
} | {
|
|
116
116
|
adapter: 'lfs';
|
|
117
117
|
publicBaseUrl?: string;
|
|
118
|
-
} | {
|
|
119
|
-
adapter: string;
|
|
120
|
-
publicBaseUrl?: string;
|
|
121
118
|
};
|
|
122
119
|
/**
|
|
123
120
|
* Field definitions for one entry type — the array of FieldConfig that
|
|
@@ -290,7 +287,12 @@ export interface CanopyConfigInput {
|
|
|
290
287
|
gitBotAuthorName: string;
|
|
291
288
|
gitBotAuthorEmail: string;
|
|
292
289
|
githubTokenEnvVar?: string;
|
|
293
|
-
|
|
290
|
+
/**
|
|
291
|
+
* Operating mode: 'prod' or 'dev'. Required — no default (SEC-C1). A prod deploy that
|
|
292
|
+
* omits this would otherwise silently run header-trusting dev auth semantics; the Zod
|
|
293
|
+
* schema fails validation loudly instead.
|
|
294
|
+
*/
|
|
295
|
+
mode: OperatingMode;
|
|
294
296
|
/** How this build is deployed. 'static' = no request context, no auth. Default: 'server'. */
|
|
295
297
|
deployedAs?: DeployedAs;
|
|
296
298
|
settingsBranch?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
|
package/dist/config-test.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { CanopyConfig, CanopyConfigInput, RootCollectionConfig } from './config';
|
|
2
2
|
import { type CanopyServices, type CreateCanopyServicesOptions } from './services';
|
|
3
|
-
type TestConfigInput = Omit<CanopyConfigInput, 'gitBotAuthorName' | 'gitBotAuthorEmail'> & {
|
|
3
|
+
type TestConfigInput = Omit<CanopyConfigInput, 'gitBotAuthorName' | 'gitBotAuthorEmail' | 'mode'> & {
|
|
4
4
|
schema: RootCollectionConfig;
|
|
5
|
-
} & Partial<Pick<CanopyConfigInput, 'gitBotAuthorName' | 'gitBotAuthorEmail'>>;
|
|
5
|
+
} & Partial<Pick<CanopyConfigInput, 'gitBotAuthorName' | 'gitBotAuthorEmail' | 'mode'>>;
|
|
6
6
|
/**
|
|
7
|
-
* Test-only helper that fills required author fields for
|
|
7
|
+
* Test-only helper that fills required author fields (and defaults `mode` to 'dev') for
|
|
8
|
+
* convenience. The real schema requires `mode` with no default (SEC-C1); this helper
|
|
9
|
+
* intentionally defaults it so existing test configs don't all need `mode: 'dev'` added.
|
|
8
10
|
* Do not use in production code; prefer defineCanopyConfig.
|
|
9
11
|
*/
|
|
10
12
|
export declare const defineCanopyTestConfig: (config: TestConfigInput, overrides?: Partial<CanopyConfigInput>) => CanopyConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-test.d.ts","sourceRoot":"","sources":["../src/config-test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAErF,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,2BAA2B,EACjC,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"config-test.d.ts","sourceRoot":"","sources":["../src/config-test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAErF,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,2BAA2B,EACjC,MAAM,YAAY,CAAA;AAanB,KAAK,eAAe,GAAG,IAAI,CACzB,iBAAiB,EACjB,kBAAkB,GAAG,mBAAmB,GAAG,MAAM,CAClD,GAAG;IACF,MAAM,EAAE,oBAAoB,CAAA;CAC7B,GAAG,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,GAAG,mBAAmB,GAAG,MAAM,CAAC,CAAC,CAAA;AAEvF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GACjC,QAAQ,eAAe,EACvB,YAAY,OAAO,CAAC,iBAAiB,CAAC,KACrC,YASF,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,eAAe,EACvB,UAAU,2BAA2B,KACpC,OAAO,CAAC,cAAc,CAkBxB,CAAA"}
|
package/dist/config-test.js
CHANGED
|
@@ -4,8 +4,15 @@ const FALLBACK_AUTHOR = {
|
|
|
4
4
|
gitBotAuthorName: 'CanopyCMS Test Bot',
|
|
5
5
|
gitBotAuthorEmail: 'canopycms-test@example.com',
|
|
6
6
|
};
|
|
7
|
+
// mode has no default on the real schema (SEC-C1: a prod deploy that omits it must fail
|
|
8
|
+
// validation loudly). This test-only fallback keeps existing test configs terse by
|
|
9
|
+
// defaulting to 'dev'; production config authoring goes through defineCanopyConfig, which
|
|
10
|
+
// has no such fallback.
|
|
11
|
+
const FALLBACK_MODE = 'dev';
|
|
7
12
|
/**
|
|
8
|
-
* Test-only helper that fills required author fields for
|
|
13
|
+
* Test-only helper that fills required author fields (and defaults `mode` to 'dev') for
|
|
14
|
+
* convenience. The real schema requires `mode` with no default (SEC-C1); this helper
|
|
15
|
+
* intentionally defaults it so existing test configs don't all need `mode: 'dev'` added.
|
|
9
16
|
* Do not use in production code; prefer defineCanopyConfig.
|
|
10
17
|
*/
|
|
11
18
|
export const defineCanopyTestConfig = (config, overrides) => {
|
|
@@ -13,6 +20,7 @@ export const defineCanopyTestConfig = (config, overrides) => {
|
|
|
13
20
|
const { schema: _schema, ...configWithoutSchema } = config;
|
|
14
21
|
return defineCanopyConfig({
|
|
15
22
|
...FALLBACK_AUTHOR,
|
|
23
|
+
mode: FALLBACK_MODE,
|
|
16
24
|
...configWithoutSchema,
|
|
17
25
|
...(overrides ?? {}),
|
|
18
26
|
}).server;
|
package/dist/config-test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-test.js","sourceRoot":"","sources":["../src/config-test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC5D,OAAO,EACL,wBAAwB,GAGzB,MAAM,YAAY,CAAA;AAEnB,MAAM,eAAe,GAAG;IACtB,gBAAgB,EAAE,oBAAoB;IACtC,iBAAiB,EAAE,4BAA4B;CAChD,CAAA;
|
|
1
|
+
{"version":3,"file":"config-test.js","sourceRoot":"","sources":["../src/config-test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC5D,OAAO,EACL,wBAAwB,GAGzB,MAAM,YAAY,CAAA;AAEnB,MAAM,eAAe,GAAG;IACtB,gBAAgB,EAAE,oBAAoB;IACtC,iBAAiB,EAAE,4BAA4B;CAChD,CAAA;AAED,wFAAwF;AACxF,mFAAmF;AACnF,0FAA0F;AAC1F,wBAAwB;AACxB,MAAM,aAAa,GAAG,KAAc,CAAA;AASpC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,MAAuB,EACvB,SAAsC,EACxB,EAAE;IAChB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB,EAAE,GAAG,MAAM,CAAA;IAC1D,OAAO,kBAAkB,CAAC;QACxB,GAAG,eAAe;QAClB,IAAI,EAAE,aAAa;QACnB,GAAG,mBAAmB;QACtB,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;KACrB,CAAC,CAAC,MAAM,CAAA;AACX,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,MAAuB,EACvB,OAAqC,EACZ,EAAE;IAC3B,MAAM,YAAY,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAA;IACnD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,WAAW,CAAC,CAAA;IAEzE,+DAA+D;IAC/D,MAAM,qBAAqB,GAAG;QAC5B,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACtB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU;SACX,CAAC;QACF,UAAU,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;KAC3B,CAAA;IAED,OAAO,wBAAwB,CAAC,YAAY,EAAE;QAC5C,GAAG,OAAO;QACV,iBAAiB,EACf,qBAAoF;KACvF,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -29,15 +29,21 @@ export interface IdLocation {
|
|
|
29
29
|
* - Write operations that change filenames are atomic (rename is atomic)
|
|
30
30
|
* - Read operations always reflect current filesystem state after index rebuild
|
|
31
31
|
*
|
|
32
|
+
* **How staleness is bounded:**
|
|
33
|
+
* - Same process: mutation sites invalidate registered ContentStores directly
|
|
34
|
+
* (content-index-registry.ts); the next access rebuilds.
|
|
35
|
+
* - Other processes: mutation sites bump an on-disk generation marker
|
|
36
|
+
* (content-index-generation.ts) that ContentStore probes on access, so
|
|
37
|
+
* stale indexes converge within the probe interval plus NFS caching delay.
|
|
38
|
+
* - Residual windows self-heal via ContentStore's suspicious-lookup rebuild
|
|
39
|
+
* (ID miss or index hit whose file is gone).
|
|
40
|
+
*
|
|
32
41
|
* **Race condition handling:**
|
|
33
42
|
* - Multiple processes creating entries simultaneously: Each generates a unique ID,
|
|
34
43
|
* collisions detected during index build (fail fast)
|
|
35
|
-
* -
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* For most use cases (CMS with human editors), race conditions are unlikely and
|
|
40
|
-
* eventual consistency is sufficient.
|
|
44
|
+
* - ContentStore.write() refuses to recreate an entry file whose ID the
|
|
45
|
+
* directory listing places at a different slug (existence guard), so stale
|
|
46
|
+
* indexes cannot manufacture duplicate-ID files.
|
|
41
47
|
*/
|
|
42
48
|
export declare class ContentIdIndex {
|
|
43
49
|
private idToLocation;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-id-index.d.ts","sourceRoot":"","sources":["../src/content-id-index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAA;AAmBxF,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,SAAS,CAAA;IACb,IAAI,EAAE,OAAO,GAAG,YAAY,CAAA;IAC5B,YAAY,EAAE,YAAY,CAAA;IAC1B,UAAU,CAAC,EAAE,WAAW,CAAA;IACxB,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ;AAED
|
|
1
|
+
{"version":3,"file":"content-id-index.d.ts","sourceRoot":"","sources":["../src/content-id-index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAA;AAmBxF,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,SAAS,CAAA;IACb,IAAI,EAAE,OAAO,GAAG,YAAY,CAAA;IAC5B,YAAY,EAAE,YAAY,CAAA;IAC1B,UAAU,CAAC,EAAE,WAAW,CAAA;IACxB,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAAqC;IACzD,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,IAAI,CAAQ;gBAER,IAAI,EAAE,MAAM;IAIxB;;;OAGG;IACG,kBAAkB,CAAC,SAAS,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC;YAIjD,aAAa;IAkE3B;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAIvC;;OAEG;IACH,UAAU,CAAC,YAAY,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI;IAIxD;;;OAGG;IACH,eAAe,IAAI,UAAU,EAAE;IAI/B;;;;;;;OAOG;IACH,sBAAsB,CAAC,cAAc,EAAE,WAAW,GAAG,UAAU,EAAE;IAiBjE;;;;;;;;;OASG;IACH,0BAA0B,CAAC,cAAc,EAAE,WAAW,GAAG,UAAU,EAAE;IAkBrE;;;;;;;OAOG;IACH,oBAAoB,IAAI,UAAU,EAAE;IAepC;;;;OAIG;IACH,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,IAAI;IAgC3C;;;OAGG;IACH,MAAM,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI;IAoB3B;;;OAGG;IACH,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,GAAG,IAAI;CA6C/D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAuBxE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BxB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc5E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAsCtF"}
|
package/dist/content-id-index.js
CHANGED
|
@@ -41,15 +41,21 @@ function toLogicalCollectionPath(physicalPath) {
|
|
|
41
41
|
* - Write operations that change filenames are atomic (rename is atomic)
|
|
42
42
|
* - Read operations always reflect current filesystem state after index rebuild
|
|
43
43
|
*
|
|
44
|
+
* **How staleness is bounded:**
|
|
45
|
+
* - Same process: mutation sites invalidate registered ContentStores directly
|
|
46
|
+
* (content-index-registry.ts); the next access rebuilds.
|
|
47
|
+
* - Other processes: mutation sites bump an on-disk generation marker
|
|
48
|
+
* (content-index-generation.ts) that ContentStore probes on access, so
|
|
49
|
+
* stale indexes converge within the probe interval plus NFS caching delay.
|
|
50
|
+
* - Residual windows self-heal via ContentStore's suspicious-lookup rebuild
|
|
51
|
+
* (ID miss or index hit whose file is gone).
|
|
52
|
+
*
|
|
44
53
|
* **Race condition handling:**
|
|
45
54
|
* - Multiple processes creating entries simultaneously: Each generates a unique ID,
|
|
46
55
|
* collisions detected during index build (fail fast)
|
|
47
|
-
* -
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* For most use cases (CMS with human editors), race conditions are unlikely and
|
|
52
|
-
* eventual consistency is sufficient.
|
|
56
|
+
* - ContentStore.write() refuses to recreate an entry file whose ID the
|
|
57
|
+
* directory listing places at a different slug (existence guard), so stale
|
|
58
|
+
* indexes cannot manufacture duplicate-ID files.
|
|
53
59
|
*/
|
|
54
60
|
export class ContentIdIndex {
|
|
55
61
|
constructor(root) {
|