nx-content-store-server 1.0.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/README.md +107 -0
- package/dist/adapters/BackendAdapterRegistry.d.ts +13 -0
- package/dist/adapters/BackendAdapterRegistry.d.ts.map +1 -0
- package/dist/adapters/BackendAdapterRegistry.js +19 -0
- package/dist/adapters/BackendAdapterRegistry.js.map +1 -0
- package/dist/adapters/nxContent/NxContentBackendAdapter.d.ts +21 -0
- package/dist/adapters/nxContent/NxContentBackendAdapter.d.ts.map +1 -0
- package/dist/adapters/nxContent/NxContentBackendAdapter.js +89 -0
- package/dist/adapters/nxContent/NxContentBackendAdapter.js.map +1 -0
- package/dist/adapters/nxContent/NxContentBindingFactory.d.ts +8 -0
- package/dist/adapters/nxContent/NxContentBindingFactory.d.ts.map +1 -0
- package/dist/adapters/nxContent/NxContentBindingFactory.js +29 -0
- package/dist/adapters/nxContent/NxContentBindingFactory.js.map +1 -0
- package/dist/adapters/nxContent/compare.d.ts +18 -0
- package/dist/adapters/nxContent/compare.d.ts.map +1 -0
- package/dist/adapters/nxContent/compare.js +71 -0
- package/dist/adapters/nxContent/compare.js.map +1 -0
- package/dist/adapters/nxContent/importExport.d.ts +36 -0
- package/dist/adapters/nxContent/importExport.d.ts.map +1 -0
- package/dist/adapters/nxContent/importExport.js +124 -0
- package/dist/adapters/nxContent/importExport.js.map +1 -0
- package/dist/adapters/nxContent/mapping.d.ts +36 -0
- package/dist/adapters/nxContent/mapping.d.ts.map +1 -0
- package/dist/adapters/nxContent/mapping.js +85 -0
- package/dist/adapters/nxContent/mapping.js.map +1 -0
- package/dist/adapters/nxContent/publish.d.ts +8 -0
- package/dist/adapters/nxContent/publish.d.ts.map +1 -0
- package/dist/adapters/nxContent/publish.js +17 -0
- package/dist/adapters/nxContent/publish.js.map +1 -0
- package/dist/adapters/types.d.ts +76 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/app.d.ts +14 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +85 -0
- package/dist/app.js.map +1 -0
- package/dist/config/types.d.ts +16 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/handlers/publish.handlers.d.ts +6 -0
- package/dist/handlers/publish.handlers.d.ts.map +1 -0
- package/dist/handlers/publish.handlers.js +8 -0
- package/dist/handlers/publish.handlers.js.map +1 -0
- package/dist/handlers/sync.handlers.d.ts +31 -0
- package/dist/handlers/sync.handlers.d.ts.map +1 -0
- package/dist/handlers/sync.handlers.js +20 -0
- package/dist/handlers/sync.handlers.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/authorize.d.ts +23 -0
- package/dist/middleware/authorize.d.ts.map +1 -0
- package/dist/middleware/authorize.js +32 -0
- package/dist/middleware/authorize.js.map +1 -0
- package/dist/persistence/InMemorySyncRunPersistence.d.ts +14 -0
- package/dist/persistence/InMemorySyncRunPersistence.d.ts.map +1 -0
- package/dist/persistence/InMemorySyncRunPersistence.js +25 -0
- package/dist/persistence/InMemorySyncRunPersistence.js.map +1 -0
- package/dist/routes/backends.d.ts +6 -0
- package/dist/routes/backends.d.ts.map +1 -0
- package/dist/routes/backends.js +6 -0
- package/dist/routes/backends.js.map +1 -0
- package/dist/routes/sync.d.ts +17 -0
- package/dist/routes/sync.d.ts.map +1 -0
- package/dist/routes/sync.js +7 -0
- package/dist/routes/sync.js.map +1 -0
- package/dist/services/CompareApplicationService.d.ts +12 -0
- package/dist/services/CompareApplicationService.d.ts.map +1 -0
- package/dist/services/CompareApplicationService.js +33 -0
- package/dist/services/CompareApplicationService.js.map +1 -0
- package/dist/services/PublishApplicationService.d.ts +15 -0
- package/dist/services/PublishApplicationService.d.ts.map +1 -0
- package/dist/services/PublishApplicationService.js +29 -0
- package/dist/services/PublishApplicationService.js.map +1 -0
- package/dist/services/SyncApplicationService.d.ts +18 -0
- package/dist/services/SyncApplicationService.d.ts.map +1 -0
- package/dist/services/SyncApplicationService.js +103 -0
- package/dist/services/SyncApplicationService.js.map +1 -0
- package/dist/services/types.d.ts +19 -0
- package/dist/services/types.d.ts.map +1 -0
- package/dist/services/types.js +2 -0
- package/dist/services/types.js.map +1 -0
- package/dist/validation/backends.d.ts +8 -0
- package/dist/validation/backends.d.ts.map +1 -0
- package/dist/validation/backends.js +20 -0
- package/dist/validation/backends.js.map +1 -0
- package/dist/validation/sync.d.ts +27 -0
- package/dist/validation/sync.d.ts.map +1 -0
- package/dist/validation/sync.js +39 -0
- package/dist/validation/sync.js.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
const FORMAT_TO_EXT = {
|
|
2
|
+
md: '.md',
|
|
3
|
+
json: '.json',
|
|
4
|
+
txt: '.txt',
|
|
5
|
+
raw: '',
|
|
6
|
+
};
|
|
7
|
+
const EXT_TO_FORMAT = {
|
|
8
|
+
'.md': 'md',
|
|
9
|
+
'.json': 'json',
|
|
10
|
+
'.txt': 'txt',
|
|
11
|
+
};
|
|
12
|
+
const DEFAULT_NAMESPACE = 'default';
|
|
13
|
+
/**
|
|
14
|
+
* Build nx-content key from store selector.
|
|
15
|
+
* Namespace is always included in the key path.
|
|
16
|
+
* Example: { namespace: "default", key: "blocks/greeting" } -> "default/blocks/greeting"
|
|
17
|
+
*/
|
|
18
|
+
export function selectorToNxContentKey(selector) {
|
|
19
|
+
const ns = selector.namespace ?? DEFAULT_NAMESPACE;
|
|
20
|
+
const key = (selector.key || '').replace(/^\/+/, '').replace(/\\/g, '/');
|
|
21
|
+
if (selector.variant) {
|
|
22
|
+
return `variants/${selector.variant}/${ns}/${key}`;
|
|
23
|
+
}
|
|
24
|
+
return `${ns}/${key}`;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Parse nx-content key into store selector parts (namespace, key).
|
|
28
|
+
* Variant is inferred if key starts with variants/<variant>/.
|
|
29
|
+
*/
|
|
30
|
+
export function nxContentKeyToSelector(nxKey, storeId) {
|
|
31
|
+
const k = nxKey.replace(/\\/g, '/').replace(/^\/+/, '');
|
|
32
|
+
let variant = null;
|
|
33
|
+
let rest = k;
|
|
34
|
+
if (k.startsWith('variants/')) {
|
|
35
|
+
const after = k.slice('variants/'.length);
|
|
36
|
+
const slash = after.indexOf('/');
|
|
37
|
+
if (slash !== -1) {
|
|
38
|
+
variant = after.slice(0, slash);
|
|
39
|
+
rest = after.slice(slash + 1);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const firstSlash = rest.indexOf('/');
|
|
43
|
+
const namespace = firstSlash !== -1 ? rest.slice(0, firstSlash) : DEFAULT_NAMESPACE;
|
|
44
|
+
const key = firstSlash !== -1 ? rest.slice(firstSlash + 1) : rest;
|
|
45
|
+
return { storeId, namespace, key, variant };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get file extension for format (e.g. md -> .md).
|
|
49
|
+
* Raw has no extension.
|
|
50
|
+
*/
|
|
51
|
+
export function formatToExtension(format) {
|
|
52
|
+
return FORMAT_TO_EXT[format] ?? '';
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Infer format from file path/extension.
|
|
56
|
+
*/
|
|
57
|
+
export function extensionToFormat(pathOrKey) {
|
|
58
|
+
const lower = pathOrKey.toLowerCase();
|
|
59
|
+
for (const [ext, format] of Object.entries(EXT_TO_FORMAT)) {
|
|
60
|
+
if (lower.endsWith(ext)) {
|
|
61
|
+
return format;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return 'raw';
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Strip known format extension from nx-content key for canonical key.
|
|
68
|
+
*/
|
|
69
|
+
export function stripExtensionFromKey(key) {
|
|
70
|
+
const lower = key.toLowerCase();
|
|
71
|
+
for (const ext of Object.keys(EXT_TO_FORMAT)) {
|
|
72
|
+
if (lower.endsWith(ext)) {
|
|
73
|
+
return key.slice(0, -ext.length);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return key;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Append extension to nx-content key for physical path.
|
|
80
|
+
*/
|
|
81
|
+
export function keyWithExtension(key, format) {
|
|
82
|
+
const ext = formatToExtension(format);
|
|
83
|
+
return ext ? `${key}${ext}` : key;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../../src/adapters/nxContent/mapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { StoreBackendAdapter } from '../types.js';
|
|
2
|
+
import type { BackendPublishResult } from '../types.js';
|
|
3
|
+
import type { BackendBindingRecord } from 'nx-content-store';
|
|
4
|
+
/**
|
|
5
|
+
* Validate that the backend allows push and perform publish (push to remote).
|
|
6
|
+
*/
|
|
7
|
+
export declare function publishNxContentBackend(binding: BackendBindingRecord, adapter: StoreBackendAdapter): Promise<BackendPublishResult>;
|
|
8
|
+
//# sourceMappingURL=publish.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../src/adapters/nxContent/publish.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAG7D;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CAY/B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate that the backend allows push and perform publish (push to remote).
|
|
3
|
+
*/
|
|
4
|
+
export async function publishNxContentBackend(binding, adapter) {
|
|
5
|
+
if (binding.type !== 'nx-content') {
|
|
6
|
+
return { ok: false, message: 'Publish only supported for nx-content backends' };
|
|
7
|
+
}
|
|
8
|
+
const config = binding.config;
|
|
9
|
+
if (!config?.allowPush) {
|
|
10
|
+
return { ok: false, message: 'Publish not allowed (allowPush is false)' };
|
|
11
|
+
}
|
|
12
|
+
if (!adapter.publish) {
|
|
13
|
+
return { ok: false, message: 'Adapter does not support publish' };
|
|
14
|
+
}
|
|
15
|
+
return adapter.publish();
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/adapters/nxContent/publish.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAA6B,EAC7B,OAA4B;IAE5B,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAClC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,gDAAgD,EAAE,CAAC;IAClF,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAA4C,CAAC;IACpE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,0CAA0C,EAAE,CAAC;IAC5E,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { ContentSelector } from 'nx-content-store';
|
|
2
|
+
/**
|
|
3
|
+
* Options for reading content from a backend adapter.
|
|
4
|
+
*/
|
|
5
|
+
export interface BackendReadOptions {
|
|
6
|
+
storeId: string;
|
|
7
|
+
namespace?: string;
|
|
8
|
+
key: string;
|
|
9
|
+
variant?: string | null;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Input for writing content to a backend adapter.
|
|
13
|
+
*/
|
|
14
|
+
export interface BackendWriteInput {
|
|
15
|
+
selector: ContentSelector;
|
|
16
|
+
content: string;
|
|
17
|
+
format?: 'md' | 'json' | 'txt' | 'raw';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Result of a backend write operation.
|
|
21
|
+
*/
|
|
22
|
+
export interface BackendWriteResult {
|
|
23
|
+
key: string;
|
|
24
|
+
written: boolean;
|
|
25
|
+
hash?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Input for listing keys from a backend adapter.
|
|
29
|
+
*/
|
|
30
|
+
export interface BackendListInput {
|
|
31
|
+
storeId: string;
|
|
32
|
+
namespace?: string;
|
|
33
|
+
prefix?: string;
|
|
34
|
+
variant?: string | null;
|
|
35
|
+
limit?: number;
|
|
36
|
+
offset?: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Result of listing keys from a backend adapter.
|
|
40
|
+
*/
|
|
41
|
+
export interface BackendListResult {
|
|
42
|
+
keys: string[];
|
|
43
|
+
total?: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Summary of a single revision from a backend (e.g. git commit).
|
|
47
|
+
*/
|
|
48
|
+
export interface BackendRevisionSummary {
|
|
49
|
+
revisionId: string;
|
|
50
|
+
ref?: string;
|
|
51
|
+
message?: string;
|
|
52
|
+
createdAt?: string;
|
|
53
|
+
author?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Result of publishing (e.g. push to remote) from a backend adapter.
|
|
57
|
+
*/
|
|
58
|
+
export interface BackendPublishResult {
|
|
59
|
+
ok: boolean;
|
|
60
|
+
message?: string;
|
|
61
|
+
ref?: string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Generic backend adapter interface used by the server.
|
|
65
|
+
* Implementations bridge to concrete backends (nx-content, etc.).
|
|
66
|
+
*/
|
|
67
|
+
export interface StoreBackendAdapter {
|
|
68
|
+
get(selector: ContentSelector): Promise<string>;
|
|
69
|
+
set(input: BackendWriteInput): Promise<BackendWriteResult>;
|
|
70
|
+
exists(selector: ContentSelector): Promise<boolean>;
|
|
71
|
+
list(input: BackendListInput): Promise<BackendListResult>;
|
|
72
|
+
listRevisions(selector: ContentSelector): Promise<BackendRevisionSummary[]>;
|
|
73
|
+
getRevision(selector: ContentSelector, ref: string): Promise<string>;
|
|
74
|
+
publish?(): Promise<BackendPublishResult>;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,GAAG,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC3D,MAAM,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC1D,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC5E,WAAW,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrE,OAAO,CAAC,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAC3C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":""}
|
package/dist/app.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal Express app wiring for Step 5 routes.
|
|
3
|
+
* Depends: express (add to package.json if not present).
|
|
4
|
+
*/
|
|
5
|
+
import type { Express } from 'express';
|
|
6
|
+
import type { ManagedContentStore } from 'nx-content-store';
|
|
7
|
+
import type { SyncRunPersistence, AuditEmitter } from './services/types.js';
|
|
8
|
+
export interface AppDeps {
|
|
9
|
+
store: ManagedContentStore;
|
|
10
|
+
syncRunPersistence: SyncRunPersistence;
|
|
11
|
+
audit?: AuditEmitter;
|
|
12
|
+
}
|
|
13
|
+
export declare function registerSyncAndPublishRoutes(app: Express, deps: AppDeps): void;
|
|
14
|
+
//# sourceMappingURL=app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAS5E,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAUD,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,OAAO,GACZ,IAAI,CA6EN"}
|
package/dist/app.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { BackendAdapterRegistry } from './adapters/BackendAdapterRegistry.js';
|
|
2
|
+
import { SyncApplicationService } from './services/SyncApplicationService.js';
|
|
3
|
+
import { CompareApplicationService } from './services/CompareApplicationService.js';
|
|
4
|
+
import { PublishApplicationService } from './services/PublishApplicationService.js';
|
|
5
|
+
import { createSyncHandlers } from './handlers/sync.handlers.js';
|
|
6
|
+
import { createPublishHandlers } from './handlers/publish.handlers.js';
|
|
7
|
+
import { getAuthFromRequest, requireSecretOrAdmin } from './middleware/authorize.js';
|
|
8
|
+
function envelope(data) {
|
|
9
|
+
return { ok: true, data };
|
|
10
|
+
}
|
|
11
|
+
function errorEnvelope(message, code) {
|
|
12
|
+
return { ok: false, error: message, code };
|
|
13
|
+
}
|
|
14
|
+
export function registerSyncAndPublishRoutes(app, deps) {
|
|
15
|
+
const registry = new BackendAdapterRegistry();
|
|
16
|
+
const syncService = new SyncApplicationService(deps.store, registry, deps.syncRunPersistence, deps.audit);
|
|
17
|
+
const compareService = new CompareApplicationService(deps.store, registry);
|
|
18
|
+
const publishService = new PublishApplicationService(deps.store, registry, deps.audit);
|
|
19
|
+
const syncHandlers = createSyncHandlers({ syncService, compareService });
|
|
20
|
+
const publishHandlers = createPublishHandlers(publishService);
|
|
21
|
+
function requireAuth(req, res, next) {
|
|
22
|
+
const auth = getAuthFromRequest(req);
|
|
23
|
+
if (!requireSecretOrAdmin(auth)) {
|
|
24
|
+
res.status(403).json(errorEnvelope('Secret or admin access required', 'FORBIDDEN'));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
next();
|
|
28
|
+
}
|
|
29
|
+
app.post('/stores/:storeId/sync', requireAuth, async (req, res) => {
|
|
30
|
+
try {
|
|
31
|
+
const record = await syncHandlers.runSync(req.params.storeId, req.body, {
|
|
32
|
+
actorId: getAuthFromRequest(req)?.actorId,
|
|
33
|
+
});
|
|
34
|
+
res.json(envelope(record));
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
res.status(400).json(errorEnvelope(e instanceof Error ? e.message : String(e)));
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
app.get('/stores/:storeId/sync-runs', requireAuth, async (req, res) => {
|
|
41
|
+
try {
|
|
42
|
+
const runs = await syncHandlers.listRuns(req.params.storeId);
|
|
43
|
+
res.json(envelope(runs));
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
res.status(500).json(errorEnvelope(e instanceof Error ? e.message : String(e)));
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
app.get('/stores/:storeId/sync-runs/:syncRunId', requireAuth, async (req, res) => {
|
|
50
|
+
try {
|
|
51
|
+
const run = await syncHandlers.getRun(req.params.storeId, req.params.syncRunId);
|
|
52
|
+
if (!run) {
|
|
53
|
+
res.status(404).json(errorEnvelope('Sync run not found', 'NOT_FOUND'));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
res.json(envelope(run));
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
res.status(500).json(errorEnvelope(e instanceof Error ? e.message : String(e)));
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
app.post('/stores/:storeId/compare', requireAuth, async (req, res) => {
|
|
63
|
+
try {
|
|
64
|
+
const result = await syncHandlers.compare(req.params.storeId, req.body, {
|
|
65
|
+
actorId: getAuthFromRequest(req)?.actorId,
|
|
66
|
+
});
|
|
67
|
+
res.json(envelope(result));
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
res.status(400).json(errorEnvelope(e instanceof Error ? e.message : String(e)));
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
app.post('/stores/:storeId/backends/:backendId/publish', requireAuth, async (req, res) => {
|
|
74
|
+
try {
|
|
75
|
+
const result = await publishHandlers.publish(req.params.storeId, req.params.backendId, {
|
|
76
|
+
actorId: getAuthFromRequest(req)?.actorId,
|
|
77
|
+
});
|
|
78
|
+
res.json(envelope({ backendId: req.params.backendId, ok: result.ok, message: result.message }));
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
res.status(400).json(errorEnvelope(e instanceof Error ? e.message : String(e)));
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config for an nx-content backend binding.
|
|
3
|
+
* Stored in BackendBindingRecord.config when type is 'nx-content'.
|
|
4
|
+
*/
|
|
5
|
+
export interface NxContentBackendConfig {
|
|
6
|
+
mode?: 'dev' | 'prod';
|
|
7
|
+
localRoot?: string;
|
|
8
|
+
repoUrl?: string;
|
|
9
|
+
branch?: string;
|
|
10
|
+
authToken?: string;
|
|
11
|
+
variant?: string | null;
|
|
12
|
+
exportRoot?: string;
|
|
13
|
+
prefix?: string;
|
|
14
|
+
allowPush?: boolean;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PublishApplicationService } from '../services/PublishApplicationService.js';
|
|
2
|
+
import type { RequestContext } from 'nx-content-store';
|
|
3
|
+
export declare function createPublishHandlers(publishService: PublishApplicationService): {
|
|
4
|
+
publish(storeId: string, backendId: string, ctx?: RequestContext): Promise<import("../index.js").BackendPublishResult>;
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=publish.handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.handlers.d.ts","sourceRoot":"","sources":["../../src/handlers/publish.handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AAC1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,yBAAyB;qBAEpD,MAAM,aAAa,MAAM,QAAQ,cAAc;EAIzE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.handlers.js","sourceRoot":"","sources":["../../src/handlers/publish.handlers.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,qBAAqB,CAAC,cAAyC;IAC7E,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,SAAiB,EAAE,GAAoB;YACpE,OAAO,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { SyncApplicationService } from '../services/SyncApplicationService.js';
|
|
2
|
+
import type { CompareApplicationService } from '../services/CompareApplicationService.js';
|
|
3
|
+
import type { RequestContext } from 'nx-content-store';
|
|
4
|
+
export interface SyncHandlersDeps {
|
|
5
|
+
syncService: SyncApplicationService;
|
|
6
|
+
compareService: CompareApplicationService;
|
|
7
|
+
}
|
|
8
|
+
export interface SyncRequestBody {
|
|
9
|
+
sourceBackend?: string;
|
|
10
|
+
targetBackend?: string;
|
|
11
|
+
prefix?: string;
|
|
12
|
+
namespace?: string;
|
|
13
|
+
variant?: string | null;
|
|
14
|
+
mode?: string;
|
|
15
|
+
deleteExtraneous?: boolean;
|
|
16
|
+
dryRun?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface CompareRequestBody {
|
|
19
|
+
sourceBackend?: string;
|
|
20
|
+
targetBackend?: string;
|
|
21
|
+
prefix?: string;
|
|
22
|
+
namespace?: string;
|
|
23
|
+
variant?: string | null;
|
|
24
|
+
}
|
|
25
|
+
export declare function createSyncHandlers(deps: SyncHandlersDeps): {
|
|
26
|
+
runSync(storeId: string, body: SyncRequestBody, ctx?: RequestContext): Promise<import("nx-content-store").SyncRunRecord>;
|
|
27
|
+
listRuns(storeId: string): Promise<import("nx-content-store").SyncRunRecord[]>;
|
|
28
|
+
getRun(storeId: string, syncRunId: string): Promise<import("nx-content-store").SyncRunRecord | null>;
|
|
29
|
+
compare(storeId: string, body: CompareRequestBody, ctx?: RequestContext): Promise<import("nx-content-store").CompareBackendsResult>;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=sync.handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.handlers.d.ts","sourceRoot":"","sources":["../../src/handlers/sync.handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AAC1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGvD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,sBAAsB,CAAC;IACpC,cAAc,EAAE,yBAAyB,CAAC;CAC3C;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB;qBAG1C,MAAM,QACT,eAAe,QACf,cAAc;sBAKE,MAAM;oBAGR,MAAM,aAAa,MAAM;qBAIpC,MAAM,QACT,kBAAkB,QAClB,cAAc;EAMzB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { validateSyncInput, validateCompareInput } from '../validation/sync.js';
|
|
2
|
+
export function createSyncHandlers(deps) {
|
|
3
|
+
return {
|
|
4
|
+
async runSync(storeId, body, ctx) {
|
|
5
|
+
const input = validateSyncInput(body);
|
|
6
|
+
return deps.syncService.runSync(storeId, input, ctx);
|
|
7
|
+
},
|
|
8
|
+
async listRuns(storeId) {
|
|
9
|
+
return deps.syncService.listRuns(storeId);
|
|
10
|
+
},
|
|
11
|
+
async getRun(storeId, syncRunId) {
|
|
12
|
+
return deps.syncService.getRun(storeId, syncRunId);
|
|
13
|
+
},
|
|
14
|
+
async compare(storeId, body, ctx) {
|
|
15
|
+
const input = validateCompareInput(storeId, body);
|
|
16
|
+
return deps.compareService.compare(input, ctx);
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=sync.handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.handlers.js","sourceRoot":"","sources":["../../src/handlers/sync.handlers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AA0BhF,MAAM,UAAU,kBAAkB,CAAC,IAAsB;IACvD,OAAO;QACL,KAAK,CAAC,OAAO,CACX,OAAe,EACf,IAAqB,EACrB,GAAoB;YAEpB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,OAAe;YAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,SAAiB;YAC7C,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACrD,CAAC;QACD,KAAK,CAAC,OAAO,CACX,OAAe,EACf,IAAwB,EACxB,GAAoB;YAEpB,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nx-content-store-server — HTTP server for nx-content-store.
|
|
3
|
+
* Step 5: adapter layer, sync, compare, publish.
|
|
4
|
+
*/
|
|
5
|
+
export { BackendAdapterRegistry } from './adapters/BackendAdapterRegistry.js';
|
|
6
|
+
export type { StoreBackendAdapter, BackendReadOptions, BackendWriteInput, BackendWriteResult, BackendListInput, BackendListResult, BackendRevisionSummary, BackendPublishResult } from './adapters/types.js';
|
|
7
|
+
export { NxContentBackendAdapter } from './adapters/nxContent/NxContentBackendAdapter.js';
|
|
8
|
+
export { createNxContentResolver } from './adapters/nxContent/NxContentBindingFactory.js';
|
|
9
|
+
export * from './adapters/nxContent/mapping.js';
|
|
10
|
+
export { importFromNxContent, exportToNxContent } from './adapters/nxContent/importExport.js';
|
|
11
|
+
export { compareAdapters } from './adapters/nxContent/compare.js';
|
|
12
|
+
export { publishNxContentBackend } from './adapters/nxContent/publish.js';
|
|
13
|
+
export { SyncApplicationService } from './services/SyncApplicationService.js';
|
|
14
|
+
export { CompareApplicationService } from './services/CompareApplicationService.js';
|
|
15
|
+
export { PublishApplicationService } from './services/PublishApplicationService.js';
|
|
16
|
+
export type { SyncRunPersistence, AuditEmitter } from './services/types.js';
|
|
17
|
+
export { createSyncHandlers } from './handlers/sync.handlers.js';
|
|
18
|
+
export { createPublishHandlers } from './handlers/publish.handlers.js';
|
|
19
|
+
export { registerSyncAndPublishRoutes } from './app.js';
|
|
20
|
+
export { InMemorySyncRunPersistence } from './persistence/InMemorySyncRunPersistence.js';
|
|
21
|
+
export type { NxContentBackendConfig } from './config/types.js';
|
|
22
|
+
export { validateNxContentConfig } from './validation/backends.js';
|
|
23
|
+
export { validateSyncInput, validateCompareInput } from './validation/sync.js';
|
|
24
|
+
export { requireSecretOrAdmin, getAuthFromRequest } from './middleware/authorize.js';
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC7M,OAAO,EAAE,uBAAuB,EAAE,MAAM,iDAAiD,CAAC;AAC1F,OAAO,EAAE,uBAAuB,EAAE,MAAM,iDAAiD,CAAC;AAC1F,cAAc,iCAAiC,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AAEzF,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nx-content-store-server — HTTP server for nx-content-store.
|
|
3
|
+
* Step 5: adapter layer, sync, compare, publish.
|
|
4
|
+
*/
|
|
5
|
+
export { BackendAdapterRegistry } from './adapters/BackendAdapterRegistry.js';
|
|
6
|
+
export { NxContentBackendAdapter } from './adapters/nxContent/NxContentBackendAdapter.js';
|
|
7
|
+
export { createNxContentResolver } from './adapters/nxContent/NxContentBindingFactory.js';
|
|
8
|
+
export * from './adapters/nxContent/mapping.js';
|
|
9
|
+
export { importFromNxContent, exportToNxContent } from './adapters/nxContent/importExport.js';
|
|
10
|
+
export { compareAdapters } from './adapters/nxContent/compare.js';
|
|
11
|
+
export { publishNxContentBackend } from './adapters/nxContent/publish.js';
|
|
12
|
+
export { SyncApplicationService } from './services/SyncApplicationService.js';
|
|
13
|
+
export { CompareApplicationService } from './services/CompareApplicationService.js';
|
|
14
|
+
export { PublishApplicationService } from './services/PublishApplicationService.js';
|
|
15
|
+
export { createSyncHandlers } from './handlers/sync.handlers.js';
|
|
16
|
+
export { createPublishHandlers } from './handlers/publish.handlers.js';
|
|
17
|
+
export { registerSyncAndPublishRoutes } from './app.js';
|
|
18
|
+
export { InMemorySyncRunPersistence } from './persistence/InMemorySyncRunPersistence.js';
|
|
19
|
+
export { validateNxContentConfig } from './validation/backends.js';
|
|
20
|
+
export { validateSyncInput, validateCompareInput } from './validation/sync.js';
|
|
21
|
+
export { requireSecretOrAdmin, getAuthFromRequest } from './middleware/authorize.js';
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAE9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iDAAiD,CAAC;AAC1F,OAAO,EAAE,uBAAuB,EAAE,MAAM,iDAAiD,CAAC;AAC1F,cAAc,iCAAiC,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AAGpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AAGzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authorization middleware.
|
|
3
|
+
* Step 5: sync, compare, publish, and backend upsert require secret/admin-level access only.
|
|
4
|
+
* Do not allow publishable keys or anonymous for these routes.
|
|
5
|
+
*/
|
|
6
|
+
export type AuthLevel = 'anonymous' | 'publishable-key' | 'secret-key' | 'admin';
|
|
7
|
+
export interface AuthInfo {
|
|
8
|
+
level: AuthLevel;
|
|
9
|
+
actorId?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Require secret-key or admin for sync/compare/publish/backend write.
|
|
13
|
+
* Returns true if authorized, false otherwise.
|
|
14
|
+
*/
|
|
15
|
+
export declare function requireSecretOrAdmin(auth: AuthInfo | undefined): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Placeholder: extract auth from request (e.g. API key header, JWT).
|
|
18
|
+
* Wire to your real auth in the app.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getAuthFromRequest(req: {
|
|
21
|
+
headers?: Record<string, string | string[] | undefined>;
|
|
22
|
+
}): AuthInfo | undefined;
|
|
23
|
+
//# sourceMappingURL=authorize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorize.d.ts","sourceRoot":"","sources":["../../src/middleware/authorize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,iBAAiB,GAAG,YAAY,GAAG,OAAO,CAAC;AAEjF,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAGxE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;CAAE,GAAG,QAAQ,GAAG,SAAS,CAWzH"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authorization middleware.
|
|
3
|
+
* Step 5: sync, compare, publish, and backend upsert require secret/admin-level access only.
|
|
4
|
+
* Do not allow publishable keys or anonymous for these routes.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Require secret-key or admin for sync/compare/publish/backend write.
|
|
8
|
+
* Returns true if authorized, false otherwise.
|
|
9
|
+
*/
|
|
10
|
+
export function requireSecretOrAdmin(auth) {
|
|
11
|
+
if (!auth)
|
|
12
|
+
return false;
|
|
13
|
+
return auth.level === 'secret-key' || auth.level === 'admin';
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Placeholder: extract auth from request (e.g. API key header, JWT).
|
|
17
|
+
* Wire to your real auth in the app.
|
|
18
|
+
*/
|
|
19
|
+
export function getAuthFromRequest(req) {
|
|
20
|
+
const raw = req.headers?.['x-api-key'] ?? req.headers?.['authorization'];
|
|
21
|
+
const key = Array.isArray(raw) ? raw[0] : raw;
|
|
22
|
+
if (!key || typeof key !== 'string')
|
|
23
|
+
return undefined;
|
|
24
|
+
if (key.startsWith('secret-')) {
|
|
25
|
+
return { level: 'secret-key', actorId: key.slice(0, 20) };
|
|
26
|
+
}
|
|
27
|
+
if (key.startsWith('Bearer ')) {
|
|
28
|
+
return { level: 'secret-key', actorId: 'bearer' };
|
|
29
|
+
}
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=authorize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorize.js","sourceRoot":"","sources":["../../src/middleware/authorize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAA0B;IAC7D,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,OAAO,IAAI,CAAC,KAAK,KAAK,YAAY,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAgE;IACjG,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC;IACzE,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACtD,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAC5D,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SyncRunRecord } from 'nx-content-store';
|
|
2
|
+
import type { SyncRunPersistence } from '../services/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* In-memory implementation of SyncRunPersistence for tests and minimal setups.
|
|
5
|
+
*/
|
|
6
|
+
export declare class InMemorySyncRunPersistence implements SyncRunPersistence {
|
|
7
|
+
private runs;
|
|
8
|
+
private key;
|
|
9
|
+
create(record: SyncRunRecord): Promise<void>;
|
|
10
|
+
update(record: SyncRunRecord): Promise<void>;
|
|
11
|
+
get(storeId: string, syncRunId: string): Promise<SyncRunRecord | null>;
|
|
12
|
+
list(storeId: string): Promise<SyncRunRecord[]>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=InMemorySyncRunPersistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemorySyncRunPersistence.d.ts","sourceRoot":"","sources":["../../src/persistence/InMemorySyncRunPersistence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D;;GAEG;AACH,qBAAa,0BAA2B,YAAW,kBAAkB;IACnE,OAAO,CAAC,IAAI,CAAyC;IAErD,OAAO,CAAC,GAAG;IAIL,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAItE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAGtD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory implementation of SyncRunPersistence for tests and minimal setups.
|
|
3
|
+
*/
|
|
4
|
+
export class InMemorySyncRunPersistence {
|
|
5
|
+
runs = new Map();
|
|
6
|
+
key(storeId, syncRunId) {
|
|
7
|
+
return `${storeId}:${syncRunId}`;
|
|
8
|
+
}
|
|
9
|
+
async create(record) {
|
|
10
|
+
this.runs.set(this.key(record.storeId, record.syncRunId), { ...record });
|
|
11
|
+
}
|
|
12
|
+
async update(record) {
|
|
13
|
+
const k = this.key(record.storeId, record.syncRunId);
|
|
14
|
+
if (this.runs.has(k)) {
|
|
15
|
+
this.runs.set(k, { ...record });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async get(storeId, syncRunId) {
|
|
19
|
+
return this.runs.get(this.key(storeId, syncRunId)) ?? null;
|
|
20
|
+
}
|
|
21
|
+
async list(storeId) {
|
|
22
|
+
return [...this.runs.values()].filter((r) => r.storeId === storeId);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=InMemorySyncRunPersistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemorySyncRunPersistence.js","sourceRoot":"","sources":["../../src/persistence/InMemorySyncRunPersistence.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAO,0BAA0B;IAC7B,IAAI,GAA+B,IAAI,GAAG,EAAE,CAAC;IAE7C,GAAG,CAAC,OAAe,EAAE,SAAiB;QAC5C,OAAO,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAqB;QAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAqB;QAChC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,SAAiB;QAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe;QACxB,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IACtE,CAAC;CACF"}
|