@lattix/app 0.1.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 ADDED
@@ -0,0 +1,39 @@
1
+ # @lattix/app
2
+
3
+ Optional App Runtime manifest foundation for Lattix.
4
+
5
+ `@lattix/app` keeps app concerns outside Lattix Core UI nodes. It provides a readable authoring DSL that resolves to plain, typed, serializable manifests.
6
+
7
+ ## Example
8
+
9
+ ```ts
10
+ import { App } from "@lattix/app";
11
+
12
+ const manifest = App("Shop")
13
+ .platforms(["web", "native"])
14
+ .environment((env) =>
15
+ env
16
+ .variable("API_URL", { required: true })
17
+ .variable("APP_ENV", { defaultValue: "development" }),
18
+ )
19
+ .providers((providers) =>
20
+ providers.provider("query-client", { adapter: "tanstack-query" }),
21
+ )
22
+ .toManifest();
23
+ ```
24
+
25
+ The manifest is the runtime source of truth. Adapters in later phases will consume manifests; they must not consume fluent builder state.
26
+
27
+ ## Current scope
28
+
29
+ Phase 10 includes:
30
+
31
+ - `App("Name")`
32
+ - platform declarations
33
+ - provider declarations
34
+ - environment variable declarations
35
+ - structured manifest validation
36
+ - `validateManifest()`
37
+ - `printManifest()`
38
+
39
+ Navigation, data, storage, auth, web/native capabilities, and observability adapters are planned for later optional runtime phases.
@@ -0,0 +1,132 @@
1
+ import type { LattixDiagnostic, LattixSourceLocation, ValidationMode, ValidationResult } from "@lattix/core";
2
+ export type LattixPlatform = "web" | "native";
3
+ export interface LattixEnvironmentVariable {
4
+ readonly key: string;
5
+ readonly required?: boolean;
6
+ readonly defaultValue?: string;
7
+ }
8
+ export interface LattixEnvironmentManifest {
9
+ readonly variables: readonly LattixEnvironmentVariable[];
10
+ }
11
+ export interface LattixProviderManifest {
12
+ readonly id: string;
13
+ readonly adapter?: string;
14
+ }
15
+ export interface LattixObservabilityConsent {
16
+ readonly category: string;
17
+ readonly required?: boolean;
18
+ }
19
+ export interface LattixAnalyticsEventManifest {
20
+ readonly id: string;
21
+ readonly consent?: string;
22
+ readonly pii?: boolean;
23
+ }
24
+ export interface LattixScreenTrackingManifest {
25
+ readonly screenRef: string;
26
+ }
27
+ export interface LattixLogManifest {
28
+ readonly id: string;
29
+ readonly level: "debug" | "info" | "warn" | "error";
30
+ }
31
+ export interface LattixCrashReportingManifest {
32
+ readonly id: string;
33
+ readonly provider: string;
34
+ }
35
+ export interface LattixPerformanceSpanManifest {
36
+ readonly id: string;
37
+ readonly consent?: string;
38
+ }
39
+ export interface LattixPrivacyManifest {
40
+ readonly policyUrl: string;
41
+ }
42
+ export interface LattixObservabilityManifest {
43
+ readonly consent: readonly LattixObservabilityConsent[];
44
+ readonly analyticsEvents: readonly LattixAnalyticsEventManifest[];
45
+ readonly screenTracking: readonly LattixScreenTrackingManifest[];
46
+ readonly logs: readonly LattixLogManifest[];
47
+ readonly crashReporting: readonly LattixCrashReportingManifest[];
48
+ readonly performanceSpans: readonly LattixPerformanceSpanManifest[];
49
+ readonly webVitals: boolean;
50
+ readonly nativePerformance: boolean;
51
+ readonly privacy?: LattixPrivacyManifest;
52
+ }
53
+ export interface ObservabilityAdapterPlan {
54
+ readonly providers: readonly string[];
55
+ readonly analyticsEvents: readonly string[];
56
+ readonly performanceSpans: readonly string[];
57
+ readonly consentCategories: readonly string[];
58
+ }
59
+ export interface LattixManifestMeta {
60
+ readonly source?: LattixSourceLocation;
61
+ readonly path: string;
62
+ readonly builderTrace: readonly string[];
63
+ }
64
+ export interface LattixAppManifest {
65
+ readonly kind: "app";
66
+ readonly name: string;
67
+ readonly platforms: readonly string[];
68
+ readonly environment?: LattixEnvironmentManifest;
69
+ readonly providers: readonly LattixProviderManifest[];
70
+ readonly observability?: LattixObservabilityManifest;
71
+ readonly meta: LattixManifestMeta;
72
+ readonly validation: ValidationResult;
73
+ }
74
+ export interface ToManifestOptions {
75
+ readonly mode?: ValidationMode;
76
+ readonly throwOnError?: boolean;
77
+ }
78
+ export declare class LattixAppValidationError extends Error {
79
+ readonly diagnostics: readonly LattixDiagnostic[];
80
+ constructor(diagnostics: readonly LattixDiagnostic[]);
81
+ }
82
+ export declare const validateManifest: (manifest: LattixAppManifest) => ValidationResult;
83
+ export declare class LattixEnvironmentBuilder {
84
+ private readonly variables;
85
+ variable(key: string, options?: Omit<LattixEnvironmentVariable, "key">): this;
86
+ toManifest(): LattixEnvironmentManifest;
87
+ }
88
+ export declare class LattixProvidersBuilder {
89
+ private readonly providers;
90
+ provider(id: string, options?: Omit<LattixProviderManifest, "id">): this;
91
+ toManifest(): readonly LattixProviderManifest[];
92
+ }
93
+ export declare class LattixObservabilityBuilder {
94
+ private readonly consentItems;
95
+ private readonly analyticsEvents;
96
+ private readonly screenTrackingItems;
97
+ private readonly logItems;
98
+ private readonly crashItems;
99
+ private readonly spanItems;
100
+ private webVitalsEnabled;
101
+ private nativePerformanceEnabled;
102
+ private privacyManifest;
103
+ consent(category: string, options?: Omit<LattixObservabilityConsent, "category">): this;
104
+ analytics(id: string, options?: Omit<LattixAnalyticsEventManifest, "id">): this;
105
+ screenTracking(screenRef: string): this;
106
+ log(id: string, options: Omit<LattixLogManifest, "id">): this;
107
+ crash(id: string, options: Omit<LattixCrashReportingManifest, "id">): this;
108
+ span(id: string, options?: Omit<LattixPerformanceSpanManifest, "id">): this;
109
+ webVitals(): this;
110
+ nativePerformance(): this;
111
+ privacy(privacy: LattixPrivacyManifest): this;
112
+ toManifest(): LattixObservabilityManifest;
113
+ }
114
+ export declare class LattixAppBuilder {
115
+ private state;
116
+ constructor(name: string);
117
+ platforms(platforms: readonly string[]): this;
118
+ providers(author: (providers: LattixProvidersBuilder) => LattixProvidersBuilder): this;
119
+ environment(author: (environment: LattixEnvironmentBuilder) => LattixEnvironmentBuilder): this;
120
+ observability(author: (observability: LattixObservabilityBuilder) => LattixObservabilityBuilder): this;
121
+ toManifest(options?: ToManifestOptions): LattixAppManifest;
122
+ validate(options?: ToManifestOptions): ValidationResult;
123
+ debug(options?: ToManifestOptions): {
124
+ manifest: LattixAppManifest;
125
+ validation: ValidationResult;
126
+ printed: string;
127
+ };
128
+ }
129
+ export declare const App: (name: string) => LattixAppBuilder;
130
+ export declare const printManifest: (manifest: LattixAppManifest) => string;
131
+ export declare const createObservabilityAdapterPlan: (manifest: LattixAppManifest) => ObservabilityAdapterPlan;
132
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,381 @@
1
+ const SUPPORTED_PLATFORMS = new Set(["web", "native"]);
2
+ const ENVIRONMENT_KEY_PATTERN = /^[A-Z][A-Z0-9_]*$/;
3
+ const OBSERVABILITY_PROVIDERS = new Set(["sentry", "bugsnag", "custom"]);
4
+ const runtimeDiagnostic = (diagnostic) => ({
5
+ manifestKind: "app",
6
+ ...diagnostic,
7
+ });
8
+ export class LattixAppValidationError extends Error {
9
+ diagnostics;
10
+ constructor(diagnostics) {
11
+ super(diagnostics[0]?.summary ?? "Lattix app manifest validation failed.");
12
+ this.name = "LattixAppValidationError";
13
+ this.diagnostics = diagnostics;
14
+ }
15
+ }
16
+ export const validateManifest = (manifest) => {
17
+ const diagnostics = [];
18
+ if (manifest.name.trim().length === 0) {
19
+ diagnostics.push(runtimeDiagnostic({
20
+ code: "LATTIX_INVALID_APP_NAME",
21
+ message: "App name is required.",
22
+ summary: "App name is required.",
23
+ path: "app.name",
24
+ field: "name",
25
+ received: manifest.name,
26
+ expected: "A non-empty app name.",
27
+ suggestion: 'Pass a non-empty name to App("Name").',
28
+ }));
29
+ }
30
+ manifest.platforms.forEach((platform, index) => {
31
+ if (!SUPPORTED_PLATFORMS.has(platform)) {
32
+ diagnostics.push(runtimeDiagnostic({
33
+ code: "LATTIX_UNSUPPORTED_PLATFORM",
34
+ message: `Unsupported platform "${platform}".`,
35
+ summary: `Platform "${platform}" is not supported by Lattix App Runtime.`,
36
+ path: `app.platforms[${index}]`,
37
+ field: "platforms",
38
+ received: platform,
39
+ expected: '"web" or "native".',
40
+ suggestion: 'Use platforms(["web"]), platforms(["native"]), or platforms(["web", "native"]).',
41
+ }));
42
+ }
43
+ });
44
+ const providerIds = new Set();
45
+ manifest.providers.forEach((provider, index) => {
46
+ if (providerIds.has(provider.id)) {
47
+ diagnostics.push(runtimeDiagnostic({
48
+ code: "LATTIX_DUPLICATE_PROVIDER_ID",
49
+ message: `Duplicate provider id "${provider.id}".`,
50
+ summary: `Provider id "${provider.id}" is declared more than once.`,
51
+ path: `app.providers[${index}]`,
52
+ field: "providers.id",
53
+ received: provider.id,
54
+ expected: "A unique provider id.",
55
+ suggestion: "Use a unique provider id or remove the duplicate provider declaration.",
56
+ }));
57
+ }
58
+ providerIds.add(provider.id);
59
+ });
60
+ manifest.environment?.variables.forEach((variable, index) => {
61
+ if (!ENVIRONMENT_KEY_PATTERN.test(variable.key)) {
62
+ diagnostics.push(runtimeDiagnostic({
63
+ code: "LATTIX_INVALID_ENVIRONMENT_KEY",
64
+ message: `Invalid environment key "${variable.key}".`,
65
+ summary: `Environment key "${variable.key}" must be uppercase snake case.`,
66
+ path: `app.environment.variables[${index}]`,
67
+ field: "environment.variables.key",
68
+ received: variable.key,
69
+ expected: "Uppercase snake case, for example API_URL.",
70
+ suggestion: "Rename the environment key to uppercase snake case.",
71
+ }));
72
+ }
73
+ });
74
+ const observability = manifest.observability;
75
+ if (observability) {
76
+ const consentCategories = new Set(observability.consent.map((item) => item.category));
77
+ const eventIds = new Set();
78
+ observability.analyticsEvents.forEach((event, index) => {
79
+ if (eventIds.has(event.id)) {
80
+ diagnostics.push(runtimeDiagnostic({
81
+ code: "LATTIX_DUPLICATE_OBSERVABILITY_EVENT_ID",
82
+ message: `Duplicate observability event id "${event.id}".`,
83
+ summary: "Observability event IDs must be unique.",
84
+ path: `app.observability.analyticsEvents[${index}]`,
85
+ field: "observability.analyticsEvents.id",
86
+ received: event.id,
87
+ expected: "A unique analytics event id.",
88
+ suggestion: "Use a unique event id or remove the duplicate event.",
89
+ }));
90
+ }
91
+ eventIds.add(event.id);
92
+ if (!event.consent || !consentCategories.has(event.consent)) {
93
+ diagnostics.push(runtimeDiagnostic({
94
+ code: "LATTIX_OBSERVABILITY_MISSING_CONSENT",
95
+ message: `Analytics event "${event.id}" is missing a declared consent category.`,
96
+ summary: "Analytics events should reference declared consent categories.",
97
+ path: `app.observability.analyticsEvents[${index}].consent`,
98
+ field: "observability.analyticsEvents.consent",
99
+ received: event.consent,
100
+ expected: "A declared consent category.",
101
+ suggestion: "Declare consent() and reference it from analytics().",
102
+ }));
103
+ }
104
+ if (event.pii && !event.consent) {
105
+ diagnostics.push(runtimeDiagnostic({
106
+ code: "LATTIX_OBSERVABILITY_PRIVACY_CONSENT_REQUIRED",
107
+ message: `Analytics event "${event.id}" is marked PII without consent.`,
108
+ summary: "Privacy-sensitive analytics must reference a consent category.",
109
+ path: `app.observability.analyticsEvents[${index}].consent`,
110
+ field: "observability.analyticsEvents.consent",
111
+ received: event.consent,
112
+ expected: "A consent category for PII events.",
113
+ suggestion: "Add a consent category to privacy-sensitive analytics events.",
114
+ }));
115
+ }
116
+ });
117
+ const logIds = new Set();
118
+ observability.logs.forEach((log, index) => {
119
+ if (logIds.has(log.id)) {
120
+ diagnostics.push(runtimeDiagnostic({
121
+ code: "LATTIX_DUPLICATE_OBSERVABILITY_LOG_ID",
122
+ message: `Duplicate observability log id "${log.id}".`,
123
+ summary: "Structured log IDs must be unique.",
124
+ path: `app.observability.logs[${index}]`,
125
+ field: "observability.logs.id",
126
+ received: log.id,
127
+ expected: "A unique log id.",
128
+ suggestion: "Use a unique log id or remove the duplicate log declaration.",
129
+ }));
130
+ }
131
+ logIds.add(log.id);
132
+ });
133
+ observability.crashReporting.forEach((crash, index) => {
134
+ if (!OBSERVABILITY_PROVIDERS.has(crash.provider)) {
135
+ diagnostics.push(runtimeDiagnostic({
136
+ code: "LATTIX_UNKNOWN_OBSERVABILITY_PROVIDER",
137
+ message: `Unknown observability provider "${crash.provider}".`,
138
+ summary: "Crash reporting providers must be known adapter targets.",
139
+ path: `app.observability.crashReporting[${index}].provider`,
140
+ field: "observability.crashReporting.provider",
141
+ received: crash.provider,
142
+ expected: "sentry, bugsnag, or custom.",
143
+ suggestion: 'Use "custom" for host-defined observability providers.',
144
+ }));
145
+ }
146
+ });
147
+ const spanIds = new Set();
148
+ observability.performanceSpans.forEach((span, index) => {
149
+ if (spanIds.has(span.id)) {
150
+ diagnostics.push(runtimeDiagnostic({
151
+ code: "LATTIX_DUPLICATE_OBSERVABILITY_SPAN_ID",
152
+ message: `Duplicate observability span id "${span.id}".`,
153
+ summary: "Performance span IDs must be unique.",
154
+ path: `app.observability.performanceSpans[${index}]`,
155
+ field: "observability.performanceSpans.id",
156
+ received: span.id,
157
+ expected: "A unique performance span id.",
158
+ suggestion: "Use a unique span id or remove the duplicate span declaration.",
159
+ }));
160
+ }
161
+ spanIds.add(span.id);
162
+ if (!span.consent || !consentCategories.has(span.consent)) {
163
+ diagnostics.push(runtimeDiagnostic({
164
+ code: "LATTIX_OBSERVABILITY_MISSING_CONSENT",
165
+ message: `Performance span "${span.id}" is missing a declared consent category.`,
166
+ summary: "Performance spans should reference declared consent categories.",
167
+ path: `app.observability.performanceSpans[${index}].consent`,
168
+ field: "observability.performanceSpans.consent",
169
+ received: span.consent,
170
+ expected: "A declared consent category.",
171
+ suggestion: "Declare consent() and reference it from span().",
172
+ }));
173
+ }
174
+ });
175
+ }
176
+ return {
177
+ valid: diagnostics.length === 0,
178
+ diagnostics,
179
+ };
180
+ };
181
+ const withValidation = (manifest, options = {}) => {
182
+ const completeManifest = {
183
+ ...manifest,
184
+ validation: { valid: true, diagnostics: [] },
185
+ };
186
+ const validation = validateManifest(completeManifest);
187
+ const validatedManifest = { ...completeManifest, validation };
188
+ const mode = options.mode ?? "strict";
189
+ const throwOnError = options.throwOnError ?? mode === "strict";
190
+ if (!validation.valid && throwOnError) {
191
+ throw new LattixAppValidationError(validation.diagnostics);
192
+ }
193
+ return validatedManifest;
194
+ };
195
+ export class LattixEnvironmentBuilder {
196
+ variables = [];
197
+ variable(key, options = {}) {
198
+ this.variables.push({ key, ...options });
199
+ return this;
200
+ }
201
+ toManifest() {
202
+ return { variables: [...this.variables] };
203
+ }
204
+ }
205
+ export class LattixProvidersBuilder {
206
+ providers = [];
207
+ provider(id, options = {}) {
208
+ this.providers.push({ id, ...options });
209
+ return this;
210
+ }
211
+ toManifest() {
212
+ return [...this.providers];
213
+ }
214
+ }
215
+ export class LattixObservabilityBuilder {
216
+ consentItems = [];
217
+ analyticsEvents = [];
218
+ screenTrackingItems = [];
219
+ logItems = [];
220
+ crashItems = [];
221
+ spanItems = [];
222
+ webVitalsEnabled = false;
223
+ nativePerformanceEnabled = false;
224
+ privacyManifest;
225
+ consent(category, options = {}) {
226
+ this.consentItems.push({ category, ...options });
227
+ return this;
228
+ }
229
+ analytics(id, options = {}) {
230
+ this.analyticsEvents.push({ id, ...options });
231
+ return this;
232
+ }
233
+ screenTracking(screenRef) {
234
+ this.screenTrackingItems.push({ screenRef });
235
+ return this;
236
+ }
237
+ log(id, options) {
238
+ this.logItems.push({ id, ...options });
239
+ return this;
240
+ }
241
+ crash(id, options) {
242
+ this.crashItems.push({ id, ...options });
243
+ return this;
244
+ }
245
+ span(id, options = {}) {
246
+ this.spanItems.push({ id, ...options });
247
+ return this;
248
+ }
249
+ webVitals() {
250
+ this.webVitalsEnabled = true;
251
+ return this;
252
+ }
253
+ nativePerformance() {
254
+ this.nativePerformanceEnabled = true;
255
+ return this;
256
+ }
257
+ privacy(privacy) {
258
+ this.privacyManifest = privacy;
259
+ return this;
260
+ }
261
+ toManifest() {
262
+ return {
263
+ consent: [...this.consentItems],
264
+ analyticsEvents: [...this.analyticsEvents],
265
+ screenTracking: [...this.screenTrackingItems],
266
+ logs: [...this.logItems],
267
+ crashReporting: [...this.crashItems],
268
+ performanceSpans: [...this.spanItems],
269
+ webVitals: this.webVitalsEnabled,
270
+ nativePerformance: this.nativePerformanceEnabled,
271
+ ...(this.privacyManifest ? { privacy: this.privacyManifest } : {}),
272
+ };
273
+ }
274
+ }
275
+ export class LattixAppBuilder {
276
+ state;
277
+ constructor(name) {
278
+ this.state = {
279
+ name,
280
+ platforms: [],
281
+ providers: [],
282
+ environmentVariables: [],
283
+ builderTrace: [`App("${name}")`],
284
+ };
285
+ }
286
+ platforms(platforms) {
287
+ this.state = {
288
+ ...this.state,
289
+ platforms: [...platforms],
290
+ builderTrace: [...this.state.builderTrace, "platforms"],
291
+ };
292
+ return this;
293
+ }
294
+ providers(author) {
295
+ const builder = author(new LattixProvidersBuilder());
296
+ this.state = {
297
+ ...this.state,
298
+ providers: builder.toManifest(),
299
+ builderTrace: [...this.state.builderTrace, "providers"],
300
+ };
301
+ return this;
302
+ }
303
+ environment(author) {
304
+ const builder = author(new LattixEnvironmentBuilder());
305
+ this.state = {
306
+ ...this.state,
307
+ environmentVariables: builder.toManifest().variables,
308
+ builderTrace: [...this.state.builderTrace, "environment"],
309
+ };
310
+ return this;
311
+ }
312
+ observability(author) {
313
+ const builder = author(new LattixObservabilityBuilder());
314
+ this.state = {
315
+ ...this.state,
316
+ observability: builder.toManifest(),
317
+ builderTrace: [...this.state.builderTrace, "observability"],
318
+ };
319
+ return this;
320
+ }
321
+ toManifest(options) {
322
+ const environment = this.state.environmentVariables.length > 0
323
+ ? { variables: [...this.state.environmentVariables] }
324
+ : undefined;
325
+ return withValidation({
326
+ kind: "app",
327
+ name: this.state.name,
328
+ platforms: this.state.platforms.length > 0 ? [...this.state.platforms] : ["web"],
329
+ providers: [...this.state.providers],
330
+ ...(environment ? { environment } : {}),
331
+ ...(this.state.observability ? { observability: this.state.observability } : {}),
332
+ meta: {
333
+ path: "app",
334
+ builderTrace: [...this.state.builderTrace],
335
+ },
336
+ }, options);
337
+ }
338
+ validate(options) {
339
+ return this.toManifest({ ...options, throwOnError: false }).validation;
340
+ }
341
+ debug(options) {
342
+ const manifest = this.toManifest({ ...options, throwOnError: false });
343
+ return {
344
+ manifest,
345
+ validation: manifest.validation,
346
+ printed: printManifest(manifest),
347
+ };
348
+ }
349
+ }
350
+ export const App = (name) => new LattixAppBuilder(name);
351
+ export const printManifest = (manifest) => {
352
+ const lines = [
353
+ `app name=${manifest.name} platforms=${manifest.platforms.join(",")}`,
354
+ ];
355
+ if (manifest.environment) {
356
+ lines.push(" environment");
357
+ for (const variable of manifest.environment.variables) {
358
+ lines.push(` variable key=${variable.key}`);
359
+ }
360
+ }
361
+ if (manifest.providers.length > 0) {
362
+ lines.push(" providers");
363
+ for (const provider of manifest.providers) {
364
+ lines.push(` provider id=${provider.id}`);
365
+ }
366
+ }
367
+ if (manifest.observability) {
368
+ lines.push(" observability");
369
+ for (const event of manifest.observability.analyticsEvents) {
370
+ lines.push(` analytics id=${event.id}`);
371
+ }
372
+ }
373
+ return lines.join("\n");
374
+ };
375
+ export const createObservabilityAdapterPlan = (manifest) => ({
376
+ providers: manifest.observability?.crashReporting.map((crash) => crash.provider) ?? [],
377
+ analyticsEvents: manifest.observability?.analyticsEvents.map((event) => event.id) ?? [],
378
+ performanceSpans: manifest.observability?.performanceSpans.map((span) => span.id) ?? [],
379
+ consentCategories: manifest.observability?.consent.map((item) => item.category) ?? [],
380
+ });
381
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@lattix/app",
3
+ "version": "0.1.0",
4
+ "description": "Optional app runtime manifests and authoring DSL for Lattix",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc -p tsconfig.json",
20
+ "clean": "rm -rf dist *.tsbuildinfo",
21
+ "test": "vitest run",
22
+ "typecheck": "tsc -p tsconfig.json --noEmit"
23
+ },
24
+ "license": "MIT",
25
+ "dependencies": {
26
+ "@lattix/core": "0.1.0"
27
+ },
28
+ "devDependencies": {
29
+ "typescript": "^5.7.3",
30
+ "vitest": "^3.0.5"
31
+ }
32
+ }