@selvajs/platform 0.15.0-beta.4 → 0.16.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/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/interface.d.ts +61 -2
- package/dist/auth/interface.d.ts.map +1 -1
- package/dist/definitions/schemas.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/organizations/schemas.d.ts +2 -2
- package/dist/shareLinks/schemas.d.ts +1 -1
- package/dist/storage/image.js.map +1 -1
- package/dist/testing/suites/storageProviderSuite.d.ts.map +1 -1
- package/dist/testing/suites/storageProviderSuite.js +9 -4
- package/dist/testing/suites/storageProviderSuite.js.map +1 -1
- package/package.json +4 -4
- package/dist/auth.d.ts +0 -59
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js +0 -12
- package/dist/auth.js.map +0 -1
- package/dist/compute.d.ts +0 -47
- package/dist/compute.d.ts.map +0 -1
- package/dist/compute.js +0 -11
- package/dist/compute.js.map +0 -1
- package/dist/definitions/service.d.ts +0 -63
- package/dist/definitions/service.d.ts.map +0 -1
- package/dist/definitions/service.js +0 -162
- package/dist/definitions/service.js.map +0 -1
- package/dist/definitions.d.ts +0 -135
- package/dist/definitions.d.ts.map +0 -1
- package/dist/definitions.js +0 -23
- package/dist/definitions.js.map +0 -1
- package/dist/invites/schemas.d.ts +0 -24
- package/dist/invites/schemas.d.ts.map +0 -1
- package/dist/invites/schemas.js +0 -17
- package/dist/invites/schemas.js.map +0 -1
- package/dist/organizations.d.ts +0 -93
- package/dist/organizations.d.ts.map +0 -1
- package/dist/organizations.js +0 -14
- package/dist/organizations.js.map +0 -1
- package/dist/testing/adapterSuite.d.ts +0 -33
- package/dist/testing/adapterSuite.d.ts.map +0 -1
- package/dist/testing/adapterSuite.js +0 -166
- package/dist/testing/adapterSuite.js.map +0 -1
- package/dist/testing/orgStoreSuite.d.ts +0 -32
- package/dist/testing/orgStoreSuite.d.ts.map +0 -1
- package/dist/testing/orgStoreSuite.js +0 -363
- package/dist/testing/orgStoreSuite.js.map +0 -1
- package/dist/testing/storageProviderSuite.d.ts +0 -30
- package/dist/testing/storageProviderSuite.d.ts.map +0 -1
- package/dist/testing/storageProviderSuite.js +0 -122
- package/dist/testing/storageProviderSuite.js.map +0 -1
- package/dist/testing/suites/runner.d.ts +0 -21
- package/dist/testing/suites/runner.d.ts.map +0 -1
- package/dist/testing/suites/runner.js +0 -7
- package/dist/testing/suites/runner.js.map +0 -1
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import { SYSTEM_CONTEXT } from '../context.js';
|
|
2
|
-
import { ProviderError } from '../errors.js';
|
|
3
|
-
import { definitionPaths } from './paths.js';
|
|
4
|
-
/**
|
|
5
|
-
* Default age threshold after which a 'pending' record is considered stale.
|
|
6
|
-
* Conservative — covers slow uploads over weak connections.
|
|
7
|
-
*/
|
|
8
|
-
export const PENDING_GC_AGE_MS = 30 * 60 * 1000; // 30 minutes
|
|
9
|
-
/**
|
|
10
|
-
* Orchestrates writes that span IDataProvider + IStorageProvider.
|
|
11
|
-
*
|
|
12
|
-
* Ordering rules (see Phase 4 of the provider refactor):
|
|
13
|
-
*
|
|
14
|
-
* create — metadata-first:
|
|
15
|
-
* 1. Write record with status='pending'
|
|
16
|
-
* 2. Upload blob
|
|
17
|
-
* 3. Flip status to 'ready'
|
|
18
|
-
* If step 2 fails the record stays 'pending' with no blob. List queries
|
|
19
|
-
* filter 'pending' by default, so no consumer sees the half-written state.
|
|
20
|
-
* The janitor (gcStalePending) sweeps records older than PENDING_GC_AGE_MS.
|
|
21
|
-
*
|
|
22
|
-
* updateFile — best-effort, retry-safe, metadata-last:
|
|
23
|
-
* 1. Archive current file to history blob
|
|
24
|
-
* 2. Write the new file to the active blob path
|
|
25
|
-
* 3. Append history entry to the record
|
|
26
|
-
* 4. Prune: delete archive blob first, then remove history entry
|
|
27
|
-
* Ordering is chosen so a mid-flight failure never leaves a history entry
|
|
28
|
-
* pointing at a missing archive blob — that would break revertToVersion.
|
|
29
|
-
* A failure between 1 and 2 can leave an orphan archive blob; the janitor
|
|
30
|
-
* (or the next successful updateFile) reclaims it. History entries use a
|
|
31
|
-
* UUID ref so retries never collide with prior archives.
|
|
32
|
-
*/
|
|
33
|
-
export class DefinitionService {
|
|
34
|
-
data;
|
|
35
|
-
storage;
|
|
36
|
-
constructor(data, storage) {
|
|
37
|
-
this.data = data;
|
|
38
|
-
this.storage = storage;
|
|
39
|
-
}
|
|
40
|
-
async create(ctx, input, file) {
|
|
41
|
-
const now = new Date().toISOString();
|
|
42
|
-
const record = {
|
|
43
|
-
guid: input.guid,
|
|
44
|
-
projectId: input.projectId,
|
|
45
|
-
ownerId: input.ownerId,
|
|
46
|
-
fileExt: input.fileExt,
|
|
47
|
-
meta: input.meta,
|
|
48
|
-
computeServerId: input.computeServerId,
|
|
49
|
-
history: [],
|
|
50
|
-
maxHistory: input.maxHistory ?? 10,
|
|
51
|
-
status: 'pending',
|
|
52
|
-
runCount: 0,
|
|
53
|
-
createdAt: now,
|
|
54
|
-
updatedAt: now
|
|
55
|
-
};
|
|
56
|
-
// 1. Metadata first — if this fails there's nothing to clean up.
|
|
57
|
-
await this.data.definitions.create(ctx, record);
|
|
58
|
-
// 2. Blob upload — if this fails the record stays 'pending' for the janitor.
|
|
59
|
-
await this.storage.put(definitionPaths.file(input.guid, input.fileExt), file, 'application/octet-stream');
|
|
60
|
-
// 3. Flip to draft — the record is now visible to editors.
|
|
61
|
-
await this.data.definitions.update(ctx, input.guid, { status: 'draft' });
|
|
62
|
-
return { ...record, status: 'draft' };
|
|
63
|
-
}
|
|
64
|
-
async updateFile(ctx, guid, file, ext, originalName) {
|
|
65
|
-
const existing = await this.data.definitions.get(ctx, guid);
|
|
66
|
-
if (!existing)
|
|
67
|
-
throw new ProviderError(`Definition not found: ${guid}`, 404);
|
|
68
|
-
const now = new Date().toISOString();
|
|
69
|
-
// UUID-based ref avoids collisions from identical timestamps or special chars in filenames.
|
|
70
|
-
const ref = `${crypto.randomUUID()}_${originalName.replace(/[^a-zA-Z0-9._-]/g, '_')}`;
|
|
71
|
-
// 1. Archive the current file to a UUID-keyed path.
|
|
72
|
-
let archived = false;
|
|
73
|
-
const currentFile = await this.storage.get(definitionPaths.file(guid, existing.fileExt));
|
|
74
|
-
if (currentFile) {
|
|
75
|
-
await this.storage.put(definitionPaths.archive(guid, ref), currentFile, 'application/octet-stream');
|
|
76
|
-
archived = true;
|
|
77
|
-
}
|
|
78
|
-
// 2. Write the new active blob BEFORE recording history — a mid-flight
|
|
79
|
-
// crash here leaves an orphan archive blob (janitor-reclaimable),
|
|
80
|
-
// never a history entry pointing at a missing active blob.
|
|
81
|
-
await this.storage.put(definitionPaths.file(guid, ext), file, 'application/octet-stream');
|
|
82
|
-
if (ext !== existing.fileExt) {
|
|
83
|
-
await this.storage.delete(definitionPaths.file(guid, existing.fileExt));
|
|
84
|
-
}
|
|
85
|
-
// 3. Metadata updates last. fileExt + history in separate calls is fine:
|
|
86
|
-
// if addHistoryEntry fails, retrying reuses the same ref and overwrites.
|
|
87
|
-
await this.data.definitions.update(ctx, guid, { fileExt: ext });
|
|
88
|
-
if (archived) {
|
|
89
|
-
await this.data.definitions.addHistoryEntry(ctx, guid, {
|
|
90
|
-
ref,
|
|
91
|
-
originalName,
|
|
92
|
-
archivedAt: now
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
// 4. Prune history: blob-first, then metadata. An orphan archive blob
|
|
96
|
-
// is harmless; a history entry pointing at a missing blob breaks
|
|
97
|
-
// revertToVersion.
|
|
98
|
-
const updated = await this.data.definitions.get(ctx, guid);
|
|
99
|
-
if (updated && updated.maxHistory > 0 && updated.history.length > updated.maxHistory) {
|
|
100
|
-
const toRemove = updated.history.slice(updated.maxHistory);
|
|
101
|
-
for (const entry of toRemove) {
|
|
102
|
-
await this.storage.delete(definitionPaths.archive(guid, entry.ref));
|
|
103
|
-
await this.data.definitions.removeHistoryEntry(ctx, guid, entry.ref);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
async updateMeta(ctx, guid, patch) {
|
|
108
|
-
const { maxHistory, projectId, computeServerId, status, ...metaFields } = patch;
|
|
109
|
-
const meta = Object.keys(metaFields).length > 0 ? metaFields : undefined;
|
|
110
|
-
const recordPatch = {
|
|
111
|
-
...(meta !== undefined && { meta }),
|
|
112
|
-
...(maxHistory !== undefined && { maxHistory }),
|
|
113
|
-
...(projectId !== undefined && { projectId }),
|
|
114
|
-
...(computeServerId !== undefined && { computeServerId }),
|
|
115
|
-
...(status !== undefined && { status })
|
|
116
|
-
};
|
|
117
|
-
await this.data.definitions.update(ctx, guid, recordPatch);
|
|
118
|
-
}
|
|
119
|
-
async saveCoverImage(ctx, guid, imageData) {
|
|
120
|
-
const path = definitionPaths.image(guid);
|
|
121
|
-
await this.storage.put(path, imageData, 'image/webp');
|
|
122
|
-
const url = this.storage.getPublicUrl(path);
|
|
123
|
-
await this.data.definitions.update(ctx, guid, { meta: { coverImage: url } });
|
|
124
|
-
}
|
|
125
|
-
async revertToVersion(ctx, guid, ref) {
|
|
126
|
-
const existing = await this.data.definitions.get(ctx, guid);
|
|
127
|
-
if (!existing)
|
|
128
|
-
throw new ProviderError(`Definition not found: ${guid}`, 404);
|
|
129
|
-
const entry = existing.history.find((h) => h.ref === ref);
|
|
130
|
-
if (!entry)
|
|
131
|
-
throw new ProviderError(`History entry not found: ${ref}`, 404);
|
|
132
|
-
const archived = await this.storage.get(definitionPaths.archive(guid, ref));
|
|
133
|
-
if (!archived)
|
|
134
|
-
throw new ProviderError(`Archived file not found for ref: ${ref}`, 404);
|
|
135
|
-
// Archive the current file first, then restore the old one
|
|
136
|
-
await this.updateFile(ctx, guid, archived, existing.fileExt, entry.originalName);
|
|
137
|
-
}
|
|
138
|
-
async delete(ctx, guid) {
|
|
139
|
-
// Blobs first — if this fails, record remains and retry is safe.
|
|
140
|
-
// If record delete fails after, the record points at nothing; the
|
|
141
|
-
// next get() returns null-payload semantics and the janitor cleans up.
|
|
142
|
-
await this.storage.deletePrefix(definitionPaths.prefix(guid));
|
|
143
|
-
await this.data.definitions.delete(ctx, guid);
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Janitor — delete records stuck in 'pending' for longer than ageMs and
|
|
147
|
-
* any blobs they may have written. Safe to run on a schedule.
|
|
148
|
-
* Runs under SYSTEM_CONTEXT; callers don't pass one.
|
|
149
|
-
*
|
|
150
|
-
* @returns Number of records reclaimed.
|
|
151
|
-
*/
|
|
152
|
-
async gcStalePending(ageMs = PENDING_GC_AGE_MS) {
|
|
153
|
-
const cutoff = new Date(Date.now() - ageMs).toISOString();
|
|
154
|
-
const stale = await this.data.definitions.listStalePending(SYSTEM_CONTEXT, cutoff);
|
|
155
|
-
for (const record of stale) {
|
|
156
|
-
await this.storage.deletePrefix(definitionPaths.prefix(record.guid));
|
|
157
|
-
await this.data.definitions.delete(SYSTEM_CONTEXT, record.guid);
|
|
158
|
-
}
|
|
159
|
-
return stale.length;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
//# sourceMappingURL=service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/definitions/service.ts"],"names":[],"mappings":"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"}
|
package/dist/definitions.d.ts
DELETED
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Definition provider interfaces — independently swappable.
|
|
3
|
-
*
|
|
4
|
-
* File storage and metadata storage are deliberately split so you can mix:
|
|
5
|
-
* - Filesystem files + Supabase DB metadata
|
|
6
|
-
* - S3 files + local JSON metadata
|
|
7
|
-
* - Everything through one backend (e.g. full Supabase)
|
|
8
|
-
*/
|
|
9
|
-
export type DefinitionFileExt = 'gh' | 'ghx';
|
|
10
|
-
/** File extensions accepted for Grasshopper definitions (with dot) */
|
|
11
|
-
export declare const GH_EXTENSIONS: string[];
|
|
12
|
-
/** Image extensions accepted for cover images (with dot) */
|
|
13
|
-
export declare const COVER_IMAGE_EXTENSIONS: string[];
|
|
14
|
-
/** All accepted upload extensions */
|
|
15
|
-
export declare const ALLOWED_UPLOAD_EXTENSIONS: string[];
|
|
16
|
-
/** MIME types for image extensions */
|
|
17
|
-
export declare const COVER_IMAGE_CONTENT_TYPES: Record<string, string>;
|
|
18
|
-
export interface DefinitionMeta {
|
|
19
|
-
displayName: string;
|
|
20
|
-
description?: string;
|
|
21
|
-
category?: string;
|
|
22
|
-
tags?: string[];
|
|
23
|
-
/** Path or URL to cover image, provider-dependent */
|
|
24
|
-
coverImage?: string;
|
|
25
|
-
/** Original uploaded filename, kept for display only */
|
|
26
|
-
originalFilename?: string;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* A single entry in the file version history.
|
|
30
|
-
* Stored by the meta provider; the actual bytes are stored by the file provider.
|
|
31
|
-
*/
|
|
32
|
-
export interface HistoryEntry {
|
|
33
|
-
/**
|
|
34
|
-
* Provider-specific reference to the archived file.
|
|
35
|
-
* Filesystem: timestamped filename (e.g. "2024-01-15T10-30-45-123Z_definition.gh").
|
|
36
|
-
* S3 / Supabase: object key or storage path.
|
|
37
|
-
*/
|
|
38
|
-
ref: string;
|
|
39
|
-
/** Original uploaded filename, for display purposes */
|
|
40
|
-
originalName: string;
|
|
41
|
-
/** ISO 8601 date of when the file was archived */
|
|
42
|
-
archivedAt: string;
|
|
43
|
-
}
|
|
44
|
-
export interface DefinitionRecord {
|
|
45
|
-
/** UUID v4 primary key */
|
|
46
|
-
guid: string;
|
|
47
|
-
/** UUID of the project that owns this definition */
|
|
48
|
-
projectId: string;
|
|
49
|
-
/** UUID of the user who created this definition */
|
|
50
|
-
ownerId: string;
|
|
51
|
-
/**
|
|
52
|
-
* Optional UUID of a specific compute server to use when solving.
|
|
53
|
-
* Falls back to the org default, then the platform default.
|
|
54
|
-
*/
|
|
55
|
-
computeServerId?: string;
|
|
56
|
-
fileExt: DefinitionFileExt;
|
|
57
|
-
meta: DefinitionMeta;
|
|
58
|
-
/** File version history, newest first */
|
|
59
|
-
history: HistoryEntry[];
|
|
60
|
-
/** Maximum archived versions to keep. 0 = unlimited. */
|
|
61
|
-
maxHistory: number;
|
|
62
|
-
createdAt: string;
|
|
63
|
-
updatedAt: string;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* File storage provider: where .gh / .ghx binaries, archived versions, and preview images live.
|
|
67
|
-
*
|
|
68
|
-
* Implement with: local filesystem, S3, Supabase Storage, Azure Blob, etc.
|
|
69
|
-
*/
|
|
70
|
-
export interface IDefinitionFileProvider {
|
|
71
|
-
/** Load the active Grasshopper definition binary. Returns null if not found. */
|
|
72
|
-
getFile(guid: string): Promise<Uint8Array | null>;
|
|
73
|
-
/** Load the preview image bytes. Returns null if no image exists. */
|
|
74
|
-
getPreviewImage(guid: string): Promise<Uint8Array | null>;
|
|
75
|
-
/**
|
|
76
|
-
* Load an archived file by its provider-specific ref.
|
|
77
|
-
* Used when reverting to a previous version.
|
|
78
|
-
*/
|
|
79
|
-
getArchivedFile(guid: string, ref: string): Promise<Uint8Array | null>;
|
|
80
|
-
/** Store the active definition file. Overwrites any existing active file. */
|
|
81
|
-
saveFile(guid: string, data: Uint8Array, ext: DefinitionFileExt): Promise<void>;
|
|
82
|
-
/**
|
|
83
|
-
* Archive the current active file before replacing it.
|
|
84
|
-
* Returns a HistoryEntry (with provider-specific ref) to be saved by the meta provider.
|
|
85
|
-
* Returns null if there is no current active file to archive.
|
|
86
|
-
*/
|
|
87
|
-
archiveCurrentFile(guid: string, originalName: string): Promise<HistoryEntry | null>;
|
|
88
|
-
/**
|
|
89
|
-
* Delete a specific archived version by its ref.
|
|
90
|
-
* Called when pruning history that exceeds maxHistory.
|
|
91
|
-
*/
|
|
92
|
-
deleteArchivedFile(guid: string, ref: string): Promise<void>;
|
|
93
|
-
/** Store a preview image (expected to be WebP). */
|
|
94
|
-
saveImage(guid: string, data: Uint8Array): Promise<void>;
|
|
95
|
-
/**
|
|
96
|
-
* Returns the public URL for the stored cover image after a saveImage() call.
|
|
97
|
-
* Called immediately after saveImage() so the URL can be persisted in metadata.
|
|
98
|
-
* Filesystem: returns "/api/definitions/{guid}/image/cover.webp".
|
|
99
|
-
* S3/Supabase: returns the CDN or signed URL for the uploaded image.
|
|
100
|
-
*/
|
|
101
|
-
getCoverImageUrl(guid: string): string;
|
|
102
|
-
/** Delete all files associated with a GUID (active file, archives, image). */
|
|
103
|
-
deleteFiles(guid: string): Promise<void>;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Metadata storage provider: where definition config, metadata, and file history live.
|
|
107
|
-
*
|
|
108
|
-
* Implement with: local JSON file, Supabase DB, DynamoDB, PostgreSQL, etc.
|
|
109
|
-
*/
|
|
110
|
-
export interface IDefinitionMetaProvider {
|
|
111
|
-
/** List all definition records, sorted by displayName. */
|
|
112
|
-
list(): Promise<DefinitionRecord[]>;
|
|
113
|
-
/** List all definitions belonging to a specific project. */
|
|
114
|
-
listByProject(projectId: string): Promise<DefinitionRecord[]>;
|
|
115
|
-
/** List definitions that belong to projects with public visibility. */
|
|
116
|
-
listPublic(): Promise<DefinitionRecord[]>;
|
|
117
|
-
/** Get a single record by GUID. Returns null if not found. */
|
|
118
|
-
get(guid: string): Promise<DefinitionRecord | null>;
|
|
119
|
-
/** Create a new definition record. */
|
|
120
|
-
create(record: DefinitionRecord): Promise<void>;
|
|
121
|
-
/** Merge a partial metadata update into an existing record. */
|
|
122
|
-
update(guid: string, patch: Partial<DefinitionMeta>): Promise<void>;
|
|
123
|
-
/**
|
|
124
|
-
* Prepend a new history entry and optionally prune old entries.
|
|
125
|
-
* The file provider has already archived the bytes; this just updates the metadata.
|
|
126
|
-
*/
|
|
127
|
-
addHistoryEntry(guid: string, entry: HistoryEntry): Promise<void>;
|
|
128
|
-
/**
|
|
129
|
-
* Remove a history entry by ref (after the file provider has deleted the bytes).
|
|
130
|
-
*/
|
|
131
|
-
removeHistoryEntry(guid: string, ref: string): Promise<void>;
|
|
132
|
-
/** Delete a definition record entirely. */
|
|
133
|
-
delete(guid: string): Promise<void>;
|
|
134
|
-
}
|
|
135
|
-
//# sourceMappingURL=definitions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../src/definitions.ts"],"names":[],"mappings":"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"}
|
package/dist/definitions.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Definition provider interfaces — independently swappable.
|
|
3
|
-
*
|
|
4
|
-
* File storage and metadata storage are deliberately split so you can mix:
|
|
5
|
-
* - Filesystem files + Supabase DB metadata
|
|
6
|
-
* - S3 files + local JSON metadata
|
|
7
|
-
* - Everything through one backend (e.g. full Supabase)
|
|
8
|
-
*/
|
|
9
|
-
/** File extensions accepted for Grasshopper definitions (with dot) */
|
|
10
|
-
export const GH_EXTENSIONS = ['.gh', '.ghx'];
|
|
11
|
-
/** Image extensions accepted for cover images (with dot) */
|
|
12
|
-
export const COVER_IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.webp', '.gif'];
|
|
13
|
-
/** All accepted upload extensions */
|
|
14
|
-
export const ALLOWED_UPLOAD_EXTENSIONS = [...GH_EXTENSIONS, ...COVER_IMAGE_EXTENSIONS];
|
|
15
|
-
/** MIME types for image extensions */
|
|
16
|
-
export const COVER_IMAGE_CONTENT_TYPES = {
|
|
17
|
-
'.jpg': 'image/jpeg',
|
|
18
|
-
'.jpeg': 'image/jpeg',
|
|
19
|
-
'.png': 'image/png',
|
|
20
|
-
'.webp': 'image/webp',
|
|
21
|
-
'.gif': 'image/gif'
|
|
22
|
-
};
|
|
23
|
-
//# sourceMappingURL=definitions.js.map
|
package/dist/definitions.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../src/definitions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,sEAAsE;AACtE,MAAM,CAAC,MAAM,aAAa,GAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAEvD,4DAA4D;AAC5D,MAAM,CAAC,MAAM,sBAAsB,GAAa,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAE3F,qCAAqC;AACrC,MAAM,CAAC,MAAM,yBAAyB,GAAa,CAAC,GAAG,aAAa,EAAE,GAAG,sBAAsB,CAAC,CAAC;AAEjG,sCAAsC;AACtC,MAAM,CAAC,MAAM,yBAAyB,GAA2B;IAChE,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;CACnB,CAAC"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
export declare const CreateInviteInputSchema: z.ZodObject<{
|
|
3
|
-
email: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
|
|
4
|
-
orgId: z.ZodString;
|
|
5
|
-
orgRole: z.ZodEnum<{
|
|
6
|
-
owner: "owner";
|
|
7
|
-
admin: "admin";
|
|
8
|
-
member: "member";
|
|
9
|
-
}>;
|
|
10
|
-
orgPermissions: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
11
|
-
manage_users: "manage_users";
|
|
12
|
-
manage_compute: "manage_compute";
|
|
13
|
-
manage_definitions: "manage_definitions";
|
|
14
|
-
manage_projects: "manage_projects";
|
|
15
|
-
}>>>;
|
|
16
|
-
}, z.core.$strip>;
|
|
17
|
-
export declare const AcceptInviteInputSchema: z.ZodObject<{
|
|
18
|
-
token: z.ZodString;
|
|
19
|
-
password: z.ZodString;
|
|
20
|
-
displayName: z.ZodOptional<z.ZodString>;
|
|
21
|
-
}, z.core.$strip>;
|
|
22
|
-
export type CreateInviteInput = z.infer<typeof CreateInviteInputSchema>;
|
|
23
|
-
export type AcceptInviteInput = z.infer<typeof AcceptInviteInputSchema>;
|
|
24
|
-
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/invites/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;iBAQlC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;iBAIlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
|
package/dist/invites/schemas.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { OrgRoleSchema, OrgPermissionSchema } from '../organizations/schemas.js';
|
|
3
|
-
export const CreateInviteInputSchema = z.object({
|
|
4
|
-
email: z
|
|
5
|
-
.string()
|
|
6
|
-
.email('Valid email is required')
|
|
7
|
-
.transform((s) => s.toLowerCase()),
|
|
8
|
-
orgId: z.string().uuid(),
|
|
9
|
-
orgRole: OrgRoleSchema,
|
|
10
|
-
orgPermissions: z.array(OrgPermissionSchema).default([])
|
|
11
|
-
});
|
|
12
|
-
export const AcceptInviteInputSchema = z.object({
|
|
13
|
-
token: z.string().min(20),
|
|
14
|
-
password: z.string().min(8, 'Password must be at least 8 characters'),
|
|
15
|
-
displayName: z.string().trim().max(128).optional()
|
|
16
|
-
});
|
|
17
|
-
//# sourceMappingURL=schemas.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/invites/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEjF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,KAAK,EAAE,CAAC;SACN,MAAM,EAAE;SACR,KAAK,CAAC,yBAAyB,CAAC;SAChC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACxB,OAAO,EAAE,aAAa;IACtB,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACxD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACzB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,wCAAwC,CAAC;IACrE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CAClD,CAAC,CAAC"}
|
package/dist/organizations.d.ts
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Organization and Project provider interfaces.
|
|
3
|
-
*
|
|
4
|
-
* Models a three-level ownership hierarchy:
|
|
5
|
-
* Platform → Organization → Project → Definition
|
|
6
|
-
*
|
|
7
|
-
* Implement for any backend:
|
|
8
|
-
* - Local JSON files (built-in default)
|
|
9
|
-
* - Supabase (row-level security tables)
|
|
10
|
-
* - Firebase Firestore
|
|
11
|
-
* - Any relational database
|
|
12
|
-
*/
|
|
13
|
-
export interface Organization {
|
|
14
|
-
/** UUID v4 primary key */
|
|
15
|
-
id: string;
|
|
16
|
-
/** Human-readable display name */
|
|
17
|
-
name: string;
|
|
18
|
-
/** URL-safe unique identifier, e.g. "acme-corp" */
|
|
19
|
-
slug: string;
|
|
20
|
-
/** UUID of the user who owns this org */
|
|
21
|
-
ownerId: string;
|
|
22
|
-
createdAt: string;
|
|
23
|
-
updatedAt: string;
|
|
24
|
-
}
|
|
25
|
-
export type OrgRole = 'owner' | 'admin' | 'member';
|
|
26
|
-
export interface OrgMember {
|
|
27
|
-
orgId: string;
|
|
28
|
-
userId: string;
|
|
29
|
-
role: OrgRole;
|
|
30
|
-
joinedAt: string;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Who can invoke solve on definitions in this project:
|
|
34
|
-
* - 'public' — any authenticated user
|
|
35
|
-
* - 'org' — any member of the parent organization
|
|
36
|
-
* - 'private' — only users listed in ProjectMember
|
|
37
|
-
*/
|
|
38
|
-
export type ProjectVisibility = 'public' | 'org' | 'private';
|
|
39
|
-
export type ProjectRole = 'owner' | 'editor' | 'viewer';
|
|
40
|
-
export interface Project {
|
|
41
|
-
/** UUID v4 primary key */
|
|
42
|
-
id: string;
|
|
43
|
-
/** UUID of the owning organization */
|
|
44
|
-
orgId: string;
|
|
45
|
-
name: string;
|
|
46
|
-
/** URL-safe, unique within the organization */
|
|
47
|
-
slug: string;
|
|
48
|
-
description?: string;
|
|
49
|
-
visibility: ProjectVisibility;
|
|
50
|
-
/** UUID of the user who created this project */
|
|
51
|
-
ownerId: string;
|
|
52
|
-
createdAt: string;
|
|
53
|
-
updatedAt: string;
|
|
54
|
-
}
|
|
55
|
-
export interface ProjectMember {
|
|
56
|
-
projectId: string;
|
|
57
|
-
userId: string;
|
|
58
|
-
role: ProjectRole;
|
|
59
|
-
joinedAt: string;
|
|
60
|
-
}
|
|
61
|
-
export interface IOrganizationProvider {
|
|
62
|
-
listOrgs(): Promise<Organization[]>;
|
|
63
|
-
getOrg(id: string): Promise<Organization | null>;
|
|
64
|
-
getOrgBySlug(slug: string): Promise<Organization | null>;
|
|
65
|
-
createOrg(org: Organization): Promise<void>;
|
|
66
|
-
/** Patch mutable org fields. Only name and slug may be changed after creation. */
|
|
67
|
-
updateOrg(id: string, patch: Partial<Pick<Organization, 'name' | 'slug'>>): Promise<void>;
|
|
68
|
-
/** Delete an org and all its projects (cascade is implementation-specific). */
|
|
69
|
-
deleteOrg(id: string): Promise<void>;
|
|
70
|
-
listOrgMembers(orgId: string): Promise<OrgMember[]>;
|
|
71
|
-
getOrgMember(orgId: string, userId: string): Promise<OrgMember | null>;
|
|
72
|
-
addOrgMember(member: OrgMember): Promise<void>;
|
|
73
|
-
updateOrgMemberRole(orgId: string, userId: string, role: OrgRole): Promise<void>;
|
|
74
|
-
removeOrgMember(orgId: string, userId: string): Promise<void>;
|
|
75
|
-
listProjects(orgId: string): Promise<Project[]>;
|
|
76
|
-
getProject(id: string): Promise<Project | null>;
|
|
77
|
-
getProjectBySlug(orgId: string, slug: string): Promise<Project | null>;
|
|
78
|
-
createProject(project: Project): Promise<void>;
|
|
79
|
-
updateProject(id: string, patch: Partial<Pick<Project, 'name' | 'slug' | 'description' | 'visibility'>>): Promise<void>;
|
|
80
|
-
deleteProject(id: string): Promise<void>;
|
|
81
|
-
listProjectMembers(projectId: string): Promise<ProjectMember[]>;
|
|
82
|
-
getProjectMember(projectId: string, userId: string): Promise<ProjectMember | null>;
|
|
83
|
-
addProjectMember(member: ProjectMember): Promise<void>;
|
|
84
|
-
updateProjectMemberRole(projectId: string, userId: string, role: ProjectRole): Promise<void>;
|
|
85
|
-
removeProjectMember(projectId: string, userId: string): Promise<void>;
|
|
86
|
-
/** Returns true if the user may invoke solve on any definition in the project. */
|
|
87
|
-
canSolve(userId: string, projectId: string): Promise<boolean>;
|
|
88
|
-
/** Returns true if the user may upload or modify definitions in the project. */
|
|
89
|
-
canEdit(userId: string, projectId: string): Promise<boolean>;
|
|
90
|
-
/** Returns true if the user may manage project members and settings. */
|
|
91
|
-
canManage(userId: string, projectId: string): Promise<boolean>;
|
|
92
|
-
}
|
|
93
|
-
//# sourceMappingURL=organizations.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"organizations.d.ts","sourceRoot":"","sources":["../src/organizations.ts"],"names":[],"mappings":"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"}
|
package/dist/organizations.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Organization and Project provider interfaces.
|
|
3
|
-
*
|
|
4
|
-
* Models a three-level ownership hierarchy:
|
|
5
|
-
* Platform → Organization → Project → Definition
|
|
6
|
-
*
|
|
7
|
-
* Implement for any backend:
|
|
8
|
-
* - Local JSON files (built-in default)
|
|
9
|
-
* - Supabase (row-level security tables)
|
|
10
|
-
* - Firebase Firestore
|
|
11
|
-
* - Any relational database
|
|
12
|
-
*/
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=organizations.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"organizations.js","sourceRoot":"","sources":["../src/organizations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Adapter conformance suite for IDefinitionStore.
|
|
3
|
-
*
|
|
4
|
-
* The goal is to prove every adapter behaves identically from the consuming
|
|
5
|
-
* app's perspective — `ctx` scoping, `pending` filtering, `listStalePending`
|
|
6
|
-
* cutoff, history mutations, and error shapes.
|
|
7
|
-
*
|
|
8
|
-
* Runner-agnostic: callers inject a `{ describe, it, expect }` trio so this
|
|
9
|
-
* package stays test-framework free. For vitest or jest, pass the globals
|
|
10
|
-
* directly; for node:test, wrap them.
|
|
11
|
-
*/
|
|
12
|
-
import type { IDefinitionStore } from '../data/interface.js';
|
|
13
|
-
export interface ConformanceRunner {
|
|
14
|
-
describe: (name: string, fn: () => void) => void;
|
|
15
|
-
it: (name: string, fn: () => Promise<void> | void) => void;
|
|
16
|
-
expect: <T>(actual: T) => {
|
|
17
|
-
toBe: (expected: T) => void;
|
|
18
|
-
toEqual: (expected: unknown) => void;
|
|
19
|
-
toBeNull: () => void;
|
|
20
|
-
toBeTruthy: () => void;
|
|
21
|
-
toContain: (expected: unknown) => void;
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
export interface DefinitionStoreConformanceOptions {
|
|
25
|
-
/** Name to show in the test output (e.g. "local-provider"). */
|
|
26
|
-
name: string;
|
|
27
|
-
/** Factory that returns a fresh, empty store per test. */
|
|
28
|
-
createStore: () => Promise<IDefinitionStore> | IDefinitionStore;
|
|
29
|
-
/** Test runner globals injected from the host package. */
|
|
30
|
-
runner: ConformanceRunner;
|
|
31
|
-
}
|
|
32
|
-
export declare function runDefinitionStoreConformance(opts: DefinitionStoreConformanceOptions): void;
|
|
33
|
-
//# sourceMappingURL=adapterSuite.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"adapterSuite.d.ts","sourceRoot":"","sources":["../../src/testing/adapterSuite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAM7D,MAAM,WAAW,iBAAiB;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACjD,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK;QACzB,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC;QAC5B,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;QACrC,QAAQ,EAAE,MAAM,IAAI,CAAC;QACrB,UAAU,EAAE,MAAM,IAAI,CAAC;QACvB,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;KACvC,CAAC;CACF;AAED,MAAM,WAAW,iCAAiC;IACjD,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,WAAW,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;IAChE,0DAA0D;IAC1D,MAAM,EAAE,iBAAiB,CAAC;CAC1B;AA4BD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,iCAAiC,GAAG,IAAI,CA0J3F"}
|