@pascal-app/ifc-converter 1.0.4 → 1.0.5
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 +0 -1
- package/dist/export/guid.d.ts.map +1 -1
- package/dist/export/ifc-model.d.ts +4 -0
- package/dist/export/ifc-model.d.ts.map +1 -1
- package/dist/export/ifc-model.js +1 -0
- package/dist/export/scene-to-ifc.d.ts.map +1 -1
- package/dist/export/scene-to-ifc.js +58 -6
- package/dist/export/step.d.ts.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -35,7 +35,6 @@ The importer writes intent for Pascal's room-first model; the scene load
|
|
|
35
35
|
migrations (room adoption, floor plates) and the structure kernel turn it into
|
|
36
36
|
rooms, floor plates and ceilings. `tests/room-first-load.test.ts` converts the
|
|
37
37
|
reference files and runs that load chain.
|
|
38
|
-
|
|
39
38
|
- **Walls.** Merged collinear fragments, then every straight wall end moves
|
|
40
39
|
along its axis onto the centreline it meets (L and T joins; ends inside
|
|
41
40
|
another wall's body reach its centreline, `IfcRelConnectsPathElements` widens
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guid.d.ts","sourceRoot":"","sources":["../../src/export/guid.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEzD;AA+CD,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAS3D;AAED,6FAA6F;AAC7F,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IAEzC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"guid.d.ts","sourceRoot":"","sources":["../../src/export/guid.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEzD;AA+CD,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAS3D;AAED,6FAA6F;AAC7F,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IAEzC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAW/C;CACF"}
|
|
@@ -75,6 +75,10 @@ export declare const bool: (value: boolean) => {
|
|
|
75
75
|
readonly type: string;
|
|
76
76
|
readonly value: StepValue;
|
|
77
77
|
};
|
|
78
|
+
export declare const logical: (value: boolean) => {
|
|
79
|
+
readonly type: string;
|
|
80
|
+
readonly value: StepValue;
|
|
81
|
+
};
|
|
78
82
|
export declare const length: (value: number) => {
|
|
79
83
|
readonly type: string;
|
|
80
84
|
readonly value: StepValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ifc-model.d.ts","sourceRoot":"","sources":["../../src/export/ifc-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,EACL,OAAO,EACP,SAAS,EAET,GAAG,EAEH,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,UAAU,EAEX,MAAM,QAAQ,CAAA;AAEf,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AACnC,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAE3C,uFAAuF;AACvF,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,IAAI,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,cAAc,EAAE,SAA2C,CAAA;AAExE,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI,CAMhE;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,SAAS,CAE5E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,GAAG,MAAM,CAQ1D;AAED,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,GAAG,IAAI,EAAE,CAczD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,gBAAgB,EAAE,OAAO,GAAG,IAAI,EAAE,CAE5E;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,IAAI,CAAA;IACT,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,mCAAmC;IACnC,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IAC5B,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IAC1B,KAAK,CAAC,EAAE,QAAQ,CAAA;CACjB;AAID;;;GAGG;AACH,qBAAa,QAAQ;IACnB,QAAQ,CAAC,IAAI,aAAmB;IAChC,QAAQ,CAAC,KAAK,eAAqB;IACnC,YAAY,EAAE,OAAO,GAAG,IAAI,CAAO;IACnC,WAAW,EAAG,OAAO,CAAA;IACrB,WAAW,EAAG,OAAO,CAAA;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IAExD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"ifc-model.d.ts","sourceRoot":"","sources":["../../src/export/ifc-model.ts"],"names":[],"mappings":"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"}
|
package/dist/export/ifc-model.js
CHANGED
|
@@ -178,6 +178,7 @@ export const label = (value) => typed('IFCLABEL', value);
|
|
|
178
178
|
export const identifier = (value) => typed('IFCIDENTIFIER', value);
|
|
179
179
|
export const text = (value) => typed('IFCTEXT', value);
|
|
180
180
|
export const bool = (value) => typed('IFCBOOLEAN', value);
|
|
181
|
+
export const logical = (value) => typed('IFCLOGICAL', value);
|
|
181
182
|
export const length = (value) => typed('IFCLENGTHMEASURE', value);
|
|
182
183
|
export const ratio = (value) => typed('IFCPOSITIVERATIOMEASURE', value);
|
|
183
184
|
export { DERIVED, enumValue, int };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-to-ifc.d.ts","sourceRoot":"","sources":["../../src/export/scene-to-ifc.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAIZ,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"scene-to-ifc.d.ts","sourceRoot":"","sources":["../../src/export/scene-to-ifc.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAIZ,KAAK,UAAU,EAoChB,MAAM,kBAAkB,CAAA;AAyBzB,0FAA0F;AAC1F,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IAC5B,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IAC3B,+BAA+B;IAC/B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;IAClD,oGAAoG;IACpG,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,sDAAsD;IACtD,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,qFAAqF;IACrF,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,aAAa,GAAG,YAAY,GAAG,UAAU,CAAA;CAClD;AAED,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,OAAO,EAAE,aAAa,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,gBAAgB,CAAA;CAC1B;AAoMD,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAm1CrE;AAiCD,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAE9D"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { calculateLevelMiters, DEFAULT_WALL_THICKNESS, difference, getLevelElevations, getOpeningWallCut, getRenderableSlabPolygon, getWallBodyCenterOffset, getWallCurveFrameAt, getWallCurveLength, getWallFaceOffsets,
|
|
1
|
+
import { calculateLevelMiters, DEFAULT_WALL_THICKNESS, difference, getLevelElevations, getOpeningWallCut, getRenderableSlabPolygon, getWallAssemblyPreset, getWallBodyCenterOffset, getWallCurveFrameAt, getWallCurveLength, getWallFaceOffsets, getWallPlanFootprint, getWallTop, hidesDescendants, intersection, isCurvedWall, liftedManualSlab, measureStair, prepareSlabPolygonContext, resolveCeilingHeight, resolveWallExteriorSide, sampleWallCenterline, union, wallSupportForNodes, } from '@pascal-app/core';
|
|
2
2
|
import { doorGlazingFraction, doorOperationForIfc } from './door-operation';
|
|
3
|
-
import { bool, cleanRing, DERIVED, enumValue, frameToLocal, IDENTITY_FRAME, IfcModel, identifier, int, label, ratio, relativeFrame, } from './ifc-model';
|
|
3
|
+
import { bool, cleanRing, DERIVED, enumValue, frameToLocal, IDENTITY_FRAME, IfcModel, identifier, int, label, logical, ratio, relativeFrame, } from './ifc-model';
|
|
4
4
|
import { typed } from './step';
|
|
5
5
|
import { wallBaseCells, wallCellBand } from './wall-base';
|
|
6
6
|
const NON_PHYSICAL_TYPES = new Set([
|
|
@@ -514,6 +514,47 @@ export function buildIfcExport(input) {
|
|
|
514
514
|
}
|
|
515
515
|
const layerUsages = new Map();
|
|
516
516
|
const wallMaterial = step.add('IFCMATERIAL', 'Wall', null, null);
|
|
517
|
+
// One IfcMaterial per (material, role) used by an assembly layer.
|
|
518
|
+
const layerMaterials = new Map();
|
|
519
|
+
const layerMaterial = (name, category) => {
|
|
520
|
+
const key = `${name}|${category ?? ''}`;
|
|
521
|
+
let ref = layerMaterials.get(key);
|
|
522
|
+
if (!ref) {
|
|
523
|
+
ref = step.add('IFCMATERIAL', name, null, category);
|
|
524
|
+
layerMaterials.set(key, ref);
|
|
525
|
+
}
|
|
526
|
+
return ref;
|
|
527
|
+
};
|
|
528
|
+
// IFC4's suggested layer categories.
|
|
529
|
+
const layerCategory = (role, core) => core
|
|
530
|
+
? 'LoadBearing'
|
|
531
|
+
: role === 'insulation'
|
|
532
|
+
? 'Insulation'
|
|
533
|
+
: role === 'finish' || role === 'lining'
|
|
534
|
+
? 'Finish'
|
|
535
|
+
: null;
|
|
536
|
+
/**
|
|
537
|
+
* The wall's assembly as IFC layers, ordered from Pascal's front face (+n),
|
|
538
|
+
* which is where an AXIS2/POSITIVE usage starting at -faces.a begins. Null
|
|
539
|
+
* when the wall has no assembly or its layers don't add up to the body.
|
|
540
|
+
*/
|
|
541
|
+
const wallAssemblyLayers = (wall, thickness) => {
|
|
542
|
+
const assembly = wall.assembly;
|
|
543
|
+
if (!assembly?.layers.length)
|
|
544
|
+
return null;
|
|
545
|
+
const sum = assembly.layers.reduce((total, layer) => total + layer.thickness, 0);
|
|
546
|
+
if (Math.abs(sum - thickness) > 1e-4)
|
|
547
|
+
return null;
|
|
548
|
+
// Layers run from the front face unless the stack starts at the exterior
|
|
549
|
+
// and the exterior is the back face.
|
|
550
|
+
const startsAtBack = assembly.face === 'exterior' && (resolveWallExteriorSide(wall) ?? -1) === -1;
|
|
551
|
+
const layers = startsAtBack ? [...assembly.layers].reverse() : assembly.layers;
|
|
552
|
+
const preset = getWallAssemblyPreset(assembly.presetId);
|
|
553
|
+
return {
|
|
554
|
+
name: preset?.label ?? null,
|
|
555
|
+
layers: layers.filter((layer) => layer.thickness > 0),
|
|
556
|
+
};
|
|
557
|
+
};
|
|
517
558
|
const wallsByLevel = new Map();
|
|
518
559
|
for (const wall of ofType('wall'))
|
|
519
560
|
if (wall.parentId)
|
|
@@ -536,7 +577,7 @@ export function buildIfcExport(input) {
|
|
|
536
577
|
const chord = Math.hypot(endPlan[0] - startPlan[0], endPlan[1] - startPlan[1]);
|
|
537
578
|
const support = wallSupportForNodes(wall, nodes);
|
|
538
579
|
const base = support.elevation;
|
|
539
|
-
const top =
|
|
580
|
+
const top = getWallTop(wall, levelId, nodes, base);
|
|
540
581
|
const cells = wallBaseCells(wall, support, top);
|
|
541
582
|
if (chord < 1e-6 || cells.every((cell) => top - cell.bottom <= 1e-4)) {
|
|
542
583
|
skipped.push({ nodeId: wall.id, type: wall.type, reason: 'degenerate' });
|
|
@@ -597,11 +638,22 @@ export function buildIfcExport(input) {
|
|
|
597
638
|
// Pascal's body spans [b, a] along its left normal; that normal is
|
|
598
639
|
// IFC -Y in the wall frame, so the first layer starts at -a.
|
|
599
640
|
const offset = -faces.a;
|
|
600
|
-
const
|
|
641
|
+
const stack = wallAssemblyLayers(wall, thickness);
|
|
642
|
+
const stackKey = stack
|
|
643
|
+
? stack.layers
|
|
644
|
+
.map((l) => `${l.role}:${l.material ?? ''}:${l.thickness.toFixed(6)}:${l.core ? 1 : 0}`)
|
|
645
|
+
.join(',')
|
|
646
|
+
: 'core';
|
|
647
|
+
const usageKey = `${thickness.toFixed(6)}|${offset.toFixed(6)}|${stackKey}`;
|
|
601
648
|
let usage = layerUsages.get(usageKey);
|
|
602
649
|
if (!usage) {
|
|
603
|
-
const
|
|
604
|
-
|
|
650
|
+
const layers = stack
|
|
651
|
+
? stack.layers.map((l) => {
|
|
652
|
+
const category = layerCategory(l.role, l.core === true);
|
|
653
|
+
return step.add('IFCMATERIALLAYER', layerMaterial(l.material ?? l.role, category), l.thickness, l.role === 'air' ? logical(true) : null, l.id, l.role, category, null);
|
|
654
|
+
})
|
|
655
|
+
: [step.add('IFCMATERIALLAYER', wallMaterial, thickness, null, 'Core', null, null, null)];
|
|
656
|
+
const layerSet = step.add('IFCMATERIALLAYERSET', layers, stack?.name ?? `Wall ${Math.round(thickness * 1000)} mm`, null);
|
|
605
657
|
usage = {
|
|
606
658
|
usage: step.add('IFCMATERIALLAYERSETUSAGE', layerSet, enumValue('AXIS2'), enumValue('POSITIVE'), offset, null),
|
|
607
659
|
walls: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../src/export/step.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qBAAa,OAAO;IACN,QAAQ,CAAC,EAAE,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../src/export/step.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qBAAa,OAAO;IACN,QAAQ,CAAC,EAAE,EAAE,MAAM;IAA/B,YAAqB,EAAE,EAAE,MAAM,EAAI;CACpC;AAED,cAAM,QAAQ;IACA,QAAQ,CAAC,KAAK,EAAE,MAAM;IAAlC,YAAqB,KAAK,EAAE,MAAM,EAAI;CACvC;AAED,cAAM,OAAO;IACC,QAAQ,CAAC,KAAK,EAAE,MAAM;IAAlC,YAAqB,KAAK,EAAE,MAAM,EAAI;CACvC;AAED,cAAM,SAAS;IAEX,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS;IAF3B,YACW,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,EACvB;CACL;AAED,cAAM,OAAO;IACC,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAjC,YAAqB,IAAI,EAAE,MAAM,EAAI;CACtC;AAED,QAAA,MAAM,aAAa,eAAoB,CAAA;AAEvC,MAAM,MAAM,SAAS,GACjB,IAAI,GACJ,SAAS,GACT,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,QAAQ,GACR,OAAO,GACP,SAAS,GACT,OAAO,GACP,OAAO,aAAa,GACpB,SAAS,SAAS,EAAE,CAAA;AAExB,2DAA2D;AAC3D,eAAO,MAAM,OAAO,EAAE,OAAO,aAA6B,CAAA;AAC1D,eAAO,MAAM,SAAS,UAAW,MAAM,aAAwB,CAAA;AAC/D,eAAO,MAAM,GAAG,UAAW,MAAM,YAAmC,CAAA;AACpE,eAAO,MAAM,KAAK,SAAU,MAAM,SAAS,SAAS,cAA+B,CAAA;AACnF,iFAAiF;AACjF,eAAO,MAAM,GAAG,SAAU,MAAM,YAAsB,CAAA;AAEtD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAc9D;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAsBlD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAYpD;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,MAAM,CAAI;IAClB,QAAQ,CAAC,MAAM,sBAA4B;IAE3C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAK/C;IAED,iFAAiF;IACjF,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAOrD;IAED,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAmBpC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pascal-app/ifc-converter",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"description": "IFC → Pascal scene-graph conversion. Pure logic — no DOM, no React.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -28,13 +28,13 @@
|
|
|
28
28
|
"prepublishOnly": "npm run build"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@pascal-app/core": "^1.0.
|
|
32
|
-
"web-ifc": "^0.0.
|
|
31
|
+
"@pascal-app/core": "^1.0.5",
|
|
32
|
+
"web-ifc": "^0.0.78"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@pascal/typescript-config": "*",
|
|
36
|
-
"@types/bun": "^1.4.
|
|
37
|
-
"typescript": "
|
|
36
|
+
"@types/bun": "^1.4.3",
|
|
37
|
+
"typescript": "7.0.2"
|
|
38
38
|
},
|
|
39
39
|
"repository": {
|
|
40
40
|
"type": "git",
|