@gtkx/codegen 1.0.0-rc.3 → 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 +8 -9
- package/dist/analysis/descriptor-render.d.ts +9 -4
- package/dist/analysis/descriptor-render.d.ts.map +1 -1
- package/dist/analysis/descriptor-render.js +51 -61
- package/dist/analysis/descriptor-render.js.map +1 -1
- package/dist/analysis/descriptor.d.ts +7 -7
- package/dist/analysis/descriptor.d.ts.map +1 -1
- package/dist/analysis/descriptor.js +7 -7
- package/dist/analysis/descriptor.js.map +1 -1
- package/dist/analysis/inheritance.d.ts +1 -2
- package/dist/analysis/inheritance.d.ts.map +1 -1
- package/dist/analysis/inheritance.js +25 -22
- package/dist/analysis/inheritance.js.map +1 -1
- package/dist/analysis/nul-terminated-bytes.d.ts +5 -0
- package/dist/analysis/nul-terminated-bytes.d.ts.map +1 -0
- package/dist/analysis/nul-terminated-bytes.js +18 -0
- package/dist/analysis/nul-terminated-bytes.js.map +1 -0
- package/dist/analysis/param-capability.d.ts +5 -0
- package/dist/analysis/param-capability.d.ts.map +1 -0
- package/dist/analysis/param-capability.js +130 -0
- package/dist/analysis/param-capability.js.map +1 -0
- package/dist/analysis/param-structure.d.ts +13 -6
- package/dist/analysis/param-structure.d.ts.map +1 -1
- package/dist/analysis/param-structure.js +44 -20
- package/dist/analysis/param-structure.js.map +1 -1
- package/dist/analysis/ts-type.d.ts +1 -1
- package/dist/analysis/ts-type.d.ts.map +1 -1
- package/dist/analysis/ts-type.js +3 -5
- package/dist/analysis/ts-type.js.map +1 -1
- package/dist/analysis/type-shape.d.ts +8 -0
- package/dist/analysis/type-shape.d.ts.map +1 -0
- package/dist/analysis/type-shape.js +12 -0
- package/dist/analysis/type-shape.js.map +1 -0
- package/dist/compile.d.ts +1 -1
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +2 -1
- package/dist/compile.js.map +1 -1
- package/dist/docs/api-reference.d.ts +79 -3
- package/dist/docs/api-reference.d.ts.map +1 -1
- package/dist/docs/api-reference.js +68 -13
- package/dist/docs/api-reference.js.map +1 -1
- package/dist/docs/element-page.d.ts +4 -4
- package/dist/docs/element-page.d.ts.map +1 -1
- package/dist/docs/element-page.js +32 -20
- package/dist/docs/element-page.js.map +1 -1
- package/dist/docs/handwritten-props.d.ts +9 -0
- package/dist/docs/handwritten-props.d.ts.map +1 -0
- package/dist/docs/handwritten-props.js +149 -0
- package/dist/docs/handwritten-props.js.map +1 -0
- package/dist/docs/pipeline.d.ts +4 -4
- package/dist/docs/pipeline.d.ts.map +1 -1
- package/dist/docs/pipeline.js +6 -6
- package/dist/docs/pipeline.js.map +1 -1
- package/dist/docs/render.d.ts +25 -5
- package/dist/docs/render.d.ts.map +1 -1
- package/dist/docs/render.js +90 -28
- package/dist/docs/render.js.map +1 -1
- package/dist/docs/symbol-page.d.ts +22 -0
- package/dist/docs/symbol-page.d.ts.map +1 -1
- package/dist/docs/symbol-page.js +129 -44
- package/dist/docs/symbol-page.js.map +1 -1
- package/dist/fingerprint.d.ts +3 -6
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js +6 -8
- package/dist/fingerprint.js.map +1 -1
- package/dist/gi.d.ts +3 -11
- package/dist/gi.d.ts.map +1 -1
- package/dist/gi.js +0 -7
- package/dist/gi.js.map +1 -1
- package/dist/gir/ancestry.d.ts +2 -2
- package/dist/gir/ancestry.d.ts.map +1 -1
- package/dist/gir/ancestry.js +11 -1
- package/dist/gir/ancestry.js.map +1 -1
- package/dist/gir/annotations.d.ts +22 -0
- package/dist/gir/annotations.d.ts.map +1 -0
- package/dist/gir/annotations.js +15 -0
- package/dist/gir/annotations.js.map +1 -0
- package/dist/gir/callback.d.ts +1 -0
- package/dist/gir/callback.d.ts.map +1 -1
- package/dist/gir/callback.js +1 -0
- package/dist/gir/callback.js.map +1 -1
- package/dist/gir/class.d.ts +32 -1
- package/dist/gir/class.d.ts.map +1 -1
- package/dist/gir/class.js +8 -3
- package/dist/gir/class.js.map +1 -1
- package/dist/gir/enum.d.ts +21 -1
- package/dist/gir/enum.d.ts.map +1 -1
- package/dist/gir/enum.js +9 -9
- package/dist/gir/enum.js.map +1 -1
- package/dist/gir/field.d.ts +19 -4
- package/dist/gir/field.d.ts.map +1 -1
- package/dist/gir/field.js +7 -11
- package/dist/gir/field.js.map +1 -1
- package/dist/gir/function.d.ts +15 -0
- package/dist/gir/function.d.ts.map +1 -1
- package/dist/gir/function.js.map +1 -1
- package/dist/gir/gir-path.d.ts +7 -0
- package/dist/gir/gir-path.d.ts.map +1 -1
- package/dist/gir/gir-path.js +7 -0
- package/dist/gir/gir-path.js.map +1 -1
- package/dist/gir/libraries.d.ts +13 -2
- package/dist/gir/libraries.d.ts.map +1 -1
- package/dist/gir/libraries.js +11 -0
- package/dist/gir/libraries.js.map +1 -1
- package/dist/gir/library.d.ts +36 -0
- package/dist/gir/library.d.ts.map +1 -1
- package/dist/gir/library.js +34 -0
- package/dist/gir/library.js.map +1 -1
- package/dist/gir/namespace.d.ts +38 -0
- package/dist/gir/namespace.d.ts.map +1 -1
- package/dist/gir/namespace.js +4 -5
- package/dist/gir/namespace.js.map +1 -1
- package/dist/gir/parameter.d.ts +39 -0
- package/dist/gir/parameter.d.ts.map +1 -1
- package/dist/gir/parameter.js +7 -7
- package/dist/gir/parameter.js.map +1 -1
- package/dist/gir/parse.d.ts +3 -1
- package/dist/gir/parse.d.ts.map +1 -1
- package/dist/gir/parse.js +6 -3
- package/dist/gir/parse.js.map +1 -1
- package/dist/gir/primitives.d.ts +1 -0
- package/dist/gir/primitives.d.ts.map +1 -1
- package/dist/gir/primitives.js.map +1 -1
- package/dist/gir/property.d.ts +16 -0
- package/dist/gir/property.d.ts.map +1 -1
- package/dist/gir/property.js +3 -3
- package/dist/gir/property.js.map +1 -1
- package/dist/gir/record.d.ts +22 -0
- package/dist/gir/record.d.ts.map +1 -1
- package/dist/gir/record.js +3 -2
- package/dist/gir/record.js.map +1 -1
- package/dist/gir/size.d.ts +5 -4
- package/dist/gir/size.d.ts.map +1 -1
- package/dist/gir/size.js +0 -3
- package/dist/gir/size.js.map +1 -1
- package/dist/gir/type-id.d.ts +36 -1
- package/dist/gir/type-id.d.ts.map +1 -1
- package/dist/gir/type-id.js +2 -3
- package/dist/gir/type-id.js.map +1 -1
- package/dist/gir/type-ref.d.ts.map +1 -1
- package/dist/gir/type-ref.js +2 -1
- package/dist/gir/type-ref.js.map +1 -1
- package/dist/gir/type.d.ts +20 -0
- package/dist/gir/type.d.ts.map +1 -1
- package/dist/gir/type.js.map +1 -1
- package/dist/index.d.ts +18 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -3
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +3 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +3 -0
- package/dist/internal.js.map +1 -0
- package/dist/jsx.d.ts +7 -12
- package/dist/jsx.d.ts.map +1 -1
- package/dist/jsx.js +18 -19
- package/dist/jsx.js.map +1 -1
- package/dist/khronos/args.d.ts +7 -6
- package/dist/khronos/args.d.ts.map +1 -1
- package/dist/khronos/args.js +29 -7
- package/dist/khronos/args.js.map +1 -1
- package/dist/khronos/doc-context.d.ts +29 -0
- package/dist/khronos/doc-context.d.ts.map +1 -0
- package/dist/khronos/doc-context.js +29 -0
- package/dist/khronos/doc-context.js.map +1 -0
- package/dist/khronos/extensions.d.ts +13 -0
- package/dist/khronos/extensions.d.ts.map +1 -0
- package/dist/khronos/extensions.js +49 -0
- package/dist/khronos/extensions.js.map +1 -0
- package/dist/khronos/jsdoc.d.ts +17 -11
- package/dist/khronos/jsdoc.d.ts.map +1 -1
- package/dist/khronos/jsdoc.js +104 -46
- package/dist/khronos/jsdoc.js.map +1 -1
- package/dist/khronos/model.d.ts +42 -3
- package/dist/khronos/model.d.ts.map +1 -1
- package/dist/khronos/model.js +218 -63
- package/dist/khronos/model.js.map +1 -1
- package/dist/khronos/modules.d.ts +9 -6
- package/dist/khronos/modules.d.ts.map +1 -1
- package/dist/khronos/modules.js +96 -26
- package/dist/khronos/modules.js.map +1 -1
- package/dist/khronos/notes.d.ts +19 -0
- package/dist/khronos/notes.d.ts.map +1 -0
- package/dist/khronos/notes.js +35 -0
- package/dist/khronos/notes.js.map +1 -0
- package/dist/khronos/param-pair.d.ts +1 -1
- package/dist/khronos/param-pair.d.ts.map +1 -1
- package/dist/khronos/param-pair.js.map +1 -1
- package/dist/khronos/pipeline.d.ts +3 -1
- package/dist/khronos/pipeline.d.ts.map +1 -1
- package/dist/khronos/pipeline.js +59 -28
- package/dist/khronos/pipeline.js.map +1 -1
- package/dist/khronos/plan.d.ts +5 -5
- package/dist/khronos/plan.d.ts.map +1 -1
- package/dist/khronos/plan.js +8 -8
- package/dist/khronos/plan.js.map +1 -1
- package/dist/khronos/render.d.ts +8 -6
- package/dist/khronos/render.d.ts.map +1 -1
- package/dist/khronos/render.js +35 -26
- package/dist/khronos/render.js.map +1 -1
- package/dist/khronos/select.d.ts +21 -4
- package/dist/khronos/select.d.ts.map +1 -1
- package/dist/khronos/select.js +47 -34
- package/dist/khronos/select.js.map +1 -1
- package/dist/react/element-config.d.ts +16 -10
- package/dist/react/element-config.d.ts.map +1 -1
- package/dist/react/element-config.js +22 -15
- package/dist/react/element-config.js.map +1 -1
- package/dist/runner.d.ts +33 -21
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +19 -20
- package/dist/runner.js.map +1 -1
- package/dist/store/compile-store.d.ts +2 -3
- package/dist/store/compile-store.d.ts.map +1 -1
- package/dist/store/compile-store.js +2 -2
- package/dist/store/compile-store.js.map +1 -1
- package/dist/store/gi/callable-doc.d.ts +11 -0
- package/dist/store/gi/callable-doc.d.ts.map +1 -0
- package/dist/store/gi/callable-doc.js +62 -0
- package/dist/store/gi/callable-doc.js.map +1 -0
- package/dist/store/gi/callables.d.ts +3 -1
- package/dist/store/gi/callables.d.ts.map +1 -1
- package/dist/store/gi/callables.js +16 -16
- package/dist/store/gi/callables.js.map +1 -1
- package/dist/store/gi/callback.d.ts.map +1 -1
- package/dist/store/gi/callback.js +2 -2
- package/dist/store/gi/callback.js.map +1 -1
- package/dist/store/gi/class.d.ts.map +1 -1
- package/dist/store/gi/class.js +5 -3
- package/dist/store/gi/class.js.map +1 -1
- package/dist/store/gi/closure-invocation.d.ts +4 -0
- package/dist/store/gi/closure-invocation.d.ts.map +1 -0
- package/dist/store/gi/closure-invocation.js +22 -0
- package/dist/store/gi/closure-invocation.js.map +1 -0
- package/dist/store/gi/constant.d.ts.map +1 -1
- package/dist/store/gi/constant.js +3 -4
- package/dist/store/gi/constant.js.map +1 -1
- package/dist/store/gi/constructor-props.d.ts.map +1 -1
- package/dist/store/gi/constructor-props.js +18 -20
- package/dist/store/gi/constructor-props.js.map +1 -1
- package/dist/store/gi/doc-spec.d.ts +14 -0
- package/dist/store/gi/doc-spec.d.ts.map +1 -0
- package/dist/store/gi/doc-spec.js +23 -0
- package/dist/store/gi/doc-spec.js.map +1 -0
- package/dist/store/gi/enum.d.ts.map +1 -1
- package/dist/store/gi/enum.js +29 -16
- package/dist/store/gi/enum.js.map +1 -1
- package/dist/store/gi/function.d.ts.map +1 -1
- package/dist/store/gi/function.js +28 -17
- package/dist/store/gi/function.js.map +1 -1
- package/dist/store/gi/interface.d.ts.map +1 -1
- package/dist/store/gi/interface.js +130 -16
- package/dist/store/gi/interface.js.map +1 -1
- package/dist/store/gi/item-comparators.d.ts.map +1 -1
- package/dist/store/gi/item-comparators.js +3 -5
- package/dist/store/gi/item-comparators.js.map +1 -1
- package/dist/store/gi/method.d.ts +9 -1
- package/dist/store/gi/method.d.ts.map +1 -1
- package/dist/store/gi/method.js +92 -47
- package/dist/store/gi/method.js.map +1 -1
- package/dist/store/gi/param-marshal.d.ts +4 -1
- package/dist/store/gi/param-marshal.d.ts.map +1 -1
- package/dist/store/gi/param-marshal.js +5 -1
- package/dist/store/gi/param-marshal.js.map +1 -1
- package/dist/store/gi/pipeline.d.ts.map +1 -1
- package/dist/store/gi/pipeline.js +3 -2
- package/dist/store/gi/pipeline.js.map +1 -1
- package/dist/store/gi/properties.d.ts.map +1 -1
- package/dist/store/gi/properties.js +2 -2
- package/dist/store/gi/properties.js.map +1 -1
- package/dist/store/gi/property-accessor.d.ts +4 -2
- package/dist/store/gi/property-accessor.d.ts.map +1 -1
- package/dist/store/gi/property-accessor.js +10 -11
- package/dist/store/gi/property-accessor.js.map +1 -1
- package/dist/store/gi/record-constructor.d.ts.map +1 -1
- package/dist/store/gi/record-constructor.js +3 -1
- package/dist/store/gi/record-constructor.js.map +1 -1
- package/dist/store/gi/record-field-accessor.d.ts +4 -2
- package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
- package/dist/store/gi/record-field-accessor.js +6 -11
- package/dist/store/gi/record-field-accessor.js.map +1 -1
- package/dist/store/gi/record-layout.d.ts.map +1 -1
- package/dist/store/gi/record-layout.js +1 -5
- package/dist/store/gi/record-layout.js.map +1 -1
- package/dist/store/gi/record.d.ts.map +1 -1
- package/dist/store/gi/record.js +3 -2
- package/dist/store/gi/record.js.map +1 -1
- package/dist/store/gi/registration.d.ts +1 -1
- package/dist/store/gi/registration.js +2 -2
- package/dist/store/gi/registration.js.map +1 -1
- package/dist/store/gi/return-wrap.d.ts +1 -1
- package/dist/store/gi/return-wrap.d.ts.map +1 -1
- package/dist/store/gi/return-wrap.js +4 -4
- package/dist/store/gi/return-wrap.js.map +1 -1
- package/dist/store/gi/runtime-override.d.ts +2 -1
- package/dist/store/gi/runtime-override.d.ts.map +1 -1
- package/dist/store/gi/runtime-override.js +8 -5
- package/dist/store/gi/runtime-override.js.map +1 -1
- package/dist/store/gi/signal.d.ts.map +1 -1
- package/dist/store/gi/signal.js +27 -31
- package/dist/store/gi/signal.js.map +1 -1
- package/dist/store/gi/value-marshalable.d.ts +1 -10
- package/dist/store/gi/value-marshalable.d.ts.map +1 -1
- package/dist/store/gi/value-marshalable.js +1 -10
- package/dist/store/gi/value-marshalable.js.map +1 -1
- package/dist/store/gi/vtable.d.ts +16 -1
- package/dist/store/gi/vtable.d.ts.map +1 -1
- package/dist/store/gi/vtable.js +214 -51
- package/dist/store/gi/vtable.js.map +1 -1
- package/dist/store/gi-store.d.ts +2 -3
- package/dist/store/gi-store.d.ts.map +1 -1
- package/dist/store/gi-store.js.map +1 -1
- package/dist/store/jsx/element-components.d.ts +1 -3
- package/dist/store/jsx/element-components.d.ts.map +1 -1
- package/dist/store/jsx/element-components.js +6 -8
- package/dist/store/jsx/element-components.js.map +1 -1
- package/dist/store/jsx/element-prop-imports.d.ts +1 -4
- package/dist/store/jsx/element-prop-imports.d.ts.map +1 -1
- package/dist/store/jsx/element-prop-imports.js +0 -2
- package/dist/store/jsx/element-prop-imports.js.map +1 -1
- package/dist/store/jsx/element-prop-types.d.ts +3 -1
- package/dist/store/jsx/element-prop-types.d.ts.map +1 -1
- package/dist/store/jsx/element-prop-types.js +7 -2
- package/dist/store/jsx/element-prop-types.js.map +1 -1
- package/dist/store/jsx/generated-elements.d.ts +29 -0
- package/dist/store/jsx/generated-elements.d.ts.map +1 -0
- package/dist/store/jsx/generated-elements.js +30 -0
- package/dist/store/jsx/generated-elements.js.map +1 -0
- package/dist/store/jsx/intrinsic-elements.d.ts +4 -0
- package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -1
- package/dist/store/jsx/intrinsic-elements.js.map +1 -1
- package/dist/store/jsx/jsx.d.ts.map +1 -1
- package/dist/store/jsx/jsx.js +13 -12
- package/dist/store/jsx/jsx.js.map +1 -1
- package/dist/store/jsx/metadata.js +9 -9
- package/dist/store/jsx/metadata.js.map +1 -1
- package/dist/store/jsx/omitted-props.d.ts +2 -4
- package/dist/store/jsx/omitted-props.d.ts.map +1 -1
- package/dist/store/jsx/omitted-props.js +2 -4
- package/dist/store/jsx/omitted-props.js.map +1 -1
- package/dist/store/jsx/pipeline.d.ts +4 -2
- package/dist/store/jsx/pipeline.d.ts.map +1 -1
- package/dist/store/jsx/pipeline.js +3 -2
- package/dist/store/jsx/pipeline.js.map +1 -1
- package/dist/store/jsx/props.d.ts +1 -7
- package/dist/store/jsx/props.d.ts.map +1 -1
- package/dist/store/jsx/props.js +16 -8
- package/dist/store/jsx/props.js.map +1 -1
- package/dist/store/jsx-store.d.ts +2 -3
- package/dist/store/jsx-store.d.ts.map +1 -1
- package/dist/store/jsx-store.js +3 -3
- package/dist/store/jsx-store.js.map +1 -1
- package/dist/store/resolve-store.d.ts +28 -0
- package/dist/store/resolve-store.d.ts.map +1 -0
- package/dist/store/resolve-store.js +65 -0
- package/dist/store/resolve-store.js.map +1 -0
- package/dist/store/store-fs.d.ts +5 -1
- package/dist/store/store-fs.d.ts.map +1 -1
- package/dist/store/store-fs.js +6 -4
- package/dist/store/store-fs.js.map +1 -1
- package/dist/writer/context.d.ts +2 -1
- package/dist/writer/context.d.ts.map +1 -1
- package/dist/writer/context.js +3 -0
- package/dist/writer/context.js.map +1 -1
- package/dist/writer/doc-tags.d.ts +21 -0
- package/dist/writer/doc-tags.d.ts.map +1 -0
- package/dist/writer/doc-tags.js +38 -0
- package/dist/writer/doc-tags.js.map +1 -0
- package/dist/writer/doc.d.ts +3 -1
- package/dist/writer/doc.d.ts.map +1 -1
- package/dist/writer/doc.js +19 -6
- package/dist/writer/doc.js.map +1 -1
- package/dist/writer/gtk-doc.d.ts +1 -1
- package/dist/writer/gtk-doc.d.ts.map +1 -1
- package/dist/writer/gtk-doc.js +64 -15
- package/dist/writer/gtk-doc.js.map +1 -1
- package/dist/writer/module.d.ts +8 -2
- package/dist/writer/module.d.ts.map +1 -1
- package/dist/writer/module.js +13 -1
- package/dist/writer/module.js.map +1 -1
- package/overrides/gdk/rgba.ts.ejs +26 -0
- package/overrides/gobject/object.ts.ejs +56 -11
- package/overrides/gobject/value.ts.ejs +7 -0
- package/overrides/graphene/structs.ts.ejs +55 -0
- package/package.json +7 -11
- package/src/analysis/descriptor-render.ts +67 -73
- package/src/analysis/descriptor.ts +13 -16
- package/src/analysis/inheritance.ts +35 -34
- package/src/analysis/nul-terminated-bytes.ts +31 -0
- package/src/analysis/param-capability.ts +172 -0
- package/src/analysis/param-structure.ts +90 -32
- package/src/analysis/ts-type.ts +4 -6
- package/src/analysis/type-shape.ts +24 -0
- package/src/compile.ts +3 -2
- package/src/docs/api-reference.ts +162 -28
- package/src/docs/element-page.ts +53 -47
- package/src/docs/handwritten-props.ts +230 -0
- package/src/docs/pipeline.ts +10 -10
- package/src/docs/render.ts +153 -39
- package/src/docs/symbol-page.ts +230 -80
- package/src/fingerprint.ts +8 -14
- package/src/gi.ts +4 -11
- package/src/gir/ancestry.ts +15 -1
- package/src/gir/annotations.ts +37 -0
- package/src/gir/callback.ts +2 -0
- package/src/gir/class.ts +42 -4
- package/src/gir/enum.ts +30 -10
- package/src/gir/field.ts +24 -13
- package/src/gir/function.ts +15 -0
- package/src/gir/gir-path.ts +7 -0
- package/src/gir/libraries.ts +23 -2
- package/src/gir/library.ts +51 -2
- package/src/gir/namespace.ts +41 -5
- package/src/gir/parameter.ts +47 -7
- package/src/gir/parse.ts +8 -2
- package/src/gir/primitives.ts +1 -0
- package/src/gir/property.ts +18 -3
- package/src/gir/record.ts +24 -2
- package/src/gir/size.ts +8 -6
- package/src/gir/type-id.ts +51 -7
- package/src/gir/type-ref.ts +2 -1
- package/src/gir/type.ts +50 -6
- package/src/index.ts +18 -16
- package/src/internal.ts +2 -0
- package/src/jsx.ts +26 -26
- package/src/khronos/args.ts +37 -14
- package/src/khronos/doc-context.ts +62 -0
- package/src/khronos/extensions.ts +85 -0
- package/src/khronos/jsdoc.ts +152 -56
- package/src/khronos/model.ts +314 -69
- package/src/khronos/modules.ts +134 -40
- package/src/khronos/notes.ts +74 -0
- package/src/khronos/param-pair.ts +1 -1
- package/src/khronos/pipeline.ts +95 -42
- package/src/khronos/plan.ts +12 -13
- package/src/khronos/render.ts +62 -50
- package/src/khronos/select.ts +91 -50
- package/src/react/element-config.ts +21 -18
- package/src/runner.ts +51 -40
- package/src/store/compile-store.ts +4 -5
- package/src/store/gi/callable-doc.ts +102 -0
- package/src/store/gi/callables.ts +23 -17
- package/src/store/gi/callback.ts +3 -2
- package/src/store/gi/class.ts +6 -3
- package/src/store/gi/closure-invocation.ts +26 -0
- package/src/store/gi/constant.ts +3 -6
- package/src/store/gi/constructor-props.ts +19 -23
- package/src/store/gi/doc-spec.ts +38 -0
- package/src/store/gi/enum.ts +55 -20
- package/src/store/gi/function.ts +44 -26
- package/src/store/gi/interface.ts +214 -26
- package/src/store/gi/item-comparators.ts +3 -5
- package/src/store/gi/method.ts +126 -68
- package/src/store/gi/param-marshal.ts +15 -1
- package/src/store/gi/pipeline.ts +7 -2
- package/src/store/gi/properties.ts +3 -2
- package/src/store/gi/property-accessor.ts +14 -11
- package/src/store/gi/record-constructor.ts +6 -1
- package/src/store/gi/record-field-accessor.ts +9 -13
- package/src/store/gi/record-layout.ts +1 -5
- package/src/store/gi/record.ts +8 -2
- package/src/store/gi/registration.ts +3 -3
- package/src/store/gi/return-wrap.ts +5 -5
- package/src/store/gi/runtime-override.ts +13 -6
- package/src/store/gi/signal.ts +36 -37
- package/src/store/gi/value-marshalable.ts +1 -10
- package/src/store/gi/vtable.ts +361 -60
- package/src/store/gi-store.ts +2 -4
- package/src/store/jsx/element-components.ts +8 -11
- package/src/store/jsx/element-prop-imports.ts +6 -5
- package/src/store/jsx/element-prop-types.ts +10 -2
- package/src/store/jsx/generated-elements.ts +60 -0
- package/src/store/jsx/intrinsic-elements.ts +4 -0
- package/src/store/jsx/jsx.ts +15 -13
- package/src/store/jsx/metadata.ts +10 -10
- package/src/store/jsx/omitted-props.ts +2 -4
- package/src/store/jsx/pipeline.ts +6 -4
- package/src/store/jsx/props.ts +22 -9
- package/src/store/jsx-store.ts +5 -7
- package/src/store/resolve-store.ts +100 -0
- package/src/store/store-fs.ts +12 -5
- package/src/writer/context.ts +5 -1
- package/src/writer/doc-tags.ts +70 -0
- package/src/writer/doc.ts +29 -6
- package/src/writer/gtk-doc.ts +82 -15
- package/src/writer/module.ts +25 -2
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import type { GlibNamedClass } from "./intrinsic-elements.js";
|
|
4
|
+
import { namespaceDirectory } from "../../gir/namespace.js";
|
|
5
|
+
|
|
6
|
+
/** One element the `@gtkx/jsx` store binds. */
|
|
7
|
+
type GeneratedElement = {
|
|
8
|
+
/** GIR namespace name, such as `"Gtk"`. */
|
|
9
|
+
namespace: string;
|
|
10
|
+
/** Subexport the element is reachable through, such as `"gtk"` in `@gtkx/jsx/gtk`. */
|
|
11
|
+
directory: string;
|
|
12
|
+
/** GLib type name, which is also the JSX tag name, such as `"GtkButton"`. */
|
|
13
|
+
glibName: string;
|
|
14
|
+
/**
|
|
15
|
+
* Whether the element can be rendered. An abstract GType is bound for its props and metadata but
|
|
16
|
+
* exports no component, because `g_object_new` on one is a fatal GObject error.
|
|
17
|
+
*/
|
|
18
|
+
isMountable: boolean;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const ELEMENTS_FILENAME = "elements.json";
|
|
22
|
+
|
|
23
|
+
const collectGeneratedElements = (intrinsicElements: GlibNamedClass[]): GeneratedElement[] =>
|
|
24
|
+
intrinsicElements
|
|
25
|
+
.map((entry) => ({
|
|
26
|
+
namespace: entry.namespace.name,
|
|
27
|
+
directory: namespaceDirectory(entry.namespace),
|
|
28
|
+
glibName: entry.glibName,
|
|
29
|
+
isMountable: !entry.klass.isAbstract,
|
|
30
|
+
}))
|
|
31
|
+
.toSorted((a, b) => a.glibName.localeCompare(b.glibName));
|
|
32
|
+
|
|
33
|
+
const renderGeneratedElements = (elements: GeneratedElement[]): string =>
|
|
34
|
+
`${JSON.stringify(elements, null, 2)}\n`;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Reads the inventory of elements the `@gtkx/jsx` store binds, written into the store by codegen. Answers
|
|
38
|
+
* "what does this project's JSX layer cover" without loading the store, which resolves `virtual:` specifiers
|
|
39
|
+
* that only exist inside a Vite or Vitest build.
|
|
40
|
+
*
|
|
41
|
+
* @param jsxStoreDir The jsx store directory, as given by `resolveStore(projectRoot).jsx.storeDir`.
|
|
42
|
+
* @returns Every bound element, sorted by GLib type name, or an empty array when the store has no inventory.
|
|
43
|
+
*/
|
|
44
|
+
const readGeneratedElements = (jsxStoreDir: string): GeneratedElement[] => {
|
|
45
|
+
const path = join(jsxStoreDir, ELEMENTS_FILENAME);
|
|
46
|
+
|
|
47
|
+
if (!existsSync(path)) {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return JSON.parse(readFileSync(path, "utf8")) as GeneratedElement[];
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export {
|
|
55
|
+
ELEMENTS_FILENAME,
|
|
56
|
+
collectGeneratedElements,
|
|
57
|
+
readGeneratedElements,
|
|
58
|
+
renderGeneratedElements,
|
|
59
|
+
type GeneratedElement,
|
|
60
|
+
};
|
|
@@ -4,9 +4,13 @@ import type { Library } from "../../gir/library.js";
|
|
|
4
4
|
import type { GirNamespace } from "../../gir/namespace.js";
|
|
5
5
|
import { ancestorChain } from "../../gir/ancestry.js";
|
|
6
6
|
|
|
7
|
+
/** A GIR class paired with the GLib type name it is bound under. */
|
|
7
8
|
type GlibNamedClass = {
|
|
9
|
+
/** GLib type name, such as `"GtkButton"`, falling back to the C type when the GIR declares none. */
|
|
8
10
|
glibName: string;
|
|
11
|
+
/** Parsed class the name belongs to. */
|
|
9
12
|
klass: GirClass;
|
|
13
|
+
/** Namespace declaring the class. */
|
|
10
14
|
namespace: GirNamespace;
|
|
11
15
|
};
|
|
12
16
|
|
package/src/store/jsx/jsx.ts
CHANGED
|
@@ -3,8 +3,8 @@ import type { GirClass } from "../../gir/class.js";
|
|
|
3
3
|
import type { Library } from "../../gir/library.js";
|
|
4
4
|
import type { GirNamespace } from "../../gir/namespace.js";
|
|
5
5
|
import type { ImportsBuilder } from "../../writer/imports.js";
|
|
6
|
-
import { renderJsDoc } from "../../writer/doc.js";
|
|
7
6
|
import { renderBlock } from "../../writer/emit.js";
|
|
7
|
+
import { getDoc } from "../gi/doc-spec.js";
|
|
8
8
|
import { elementPropTypeFor } from "./element-prop-imports.js";
|
|
9
9
|
import {
|
|
10
10
|
collectInterfacePropsClasses,
|
|
@@ -97,7 +97,9 @@ const generateJsxSection = (
|
|
|
97
97
|
const intrinsicElementConsts = namespaceElements.filter((entry) => !excludeNames.has(entry.glibName));
|
|
98
98
|
|
|
99
99
|
const constLines = intrinsicElementConsts.map(
|
|
100
|
-
(entry) =>
|
|
100
|
+
(entry) =>
|
|
101
|
+
`${getDoc(entry.klass)}export const ${entry.glibName} = ` +
|
|
102
|
+
`${sourceStringLiteral(entry.glibName)} as const;`,
|
|
101
103
|
);
|
|
102
104
|
|
|
103
105
|
const isIntrinsicElementAncestor = (candidate: GirClass): boolean => {
|
|
@@ -109,7 +111,7 @@ const generateJsxSection = (
|
|
|
109
111
|
addReactBuiltin(imports, "ReactNode");
|
|
110
112
|
addReactBuiltin(imports, "Ref");
|
|
111
113
|
const interfaceResult = renderInterfacePropBlocks(library, targetNamespace.name, options);
|
|
112
|
-
let
|
|
114
|
+
let requiresReactElement = interfaceResult.requiresReactElement;
|
|
113
115
|
const propBlocks: string[] = [...interfaceResult.blocks];
|
|
114
116
|
|
|
115
117
|
const blockContext: RenderPropBlockContext = {
|
|
@@ -124,18 +126,18 @@ const generateJsxSection = (
|
|
|
124
126
|
const { block, objectPropNames } = renderPropBlock(library, entry, blockContext);
|
|
125
127
|
|
|
126
128
|
if (objectPropNames.length > 0) {
|
|
127
|
-
|
|
129
|
+
requiresReactElement = true;
|
|
128
130
|
}
|
|
129
131
|
|
|
130
132
|
propBlocks.push(block);
|
|
131
133
|
}
|
|
132
134
|
|
|
133
|
-
if (
|
|
135
|
+
if (requiresReactElement) {
|
|
134
136
|
addReactBuiltin(imports, "ReactElement");
|
|
135
137
|
}
|
|
136
138
|
|
|
137
139
|
const source = [
|
|
138
|
-
constLines.join("\n"),
|
|
140
|
+
constLines.join("\n\n"),
|
|
139
141
|
"",
|
|
140
142
|
propBlocks.join("\n\n"),
|
|
141
143
|
"",
|
|
@@ -152,11 +154,11 @@ const renderInterfacePropBlocks = (
|
|
|
152
154
|
library: Library,
|
|
153
155
|
targetNamespaceName: string,
|
|
154
156
|
options: GenerateJsxOptions,
|
|
155
|
-
): { blocks: string[];
|
|
157
|
+
): { blocks: string[]; requiresReactElement: boolean; hasContainerProps: HasContainerProps } => {
|
|
156
158
|
const { imports, intrinsicElements } = options;
|
|
157
159
|
const context: InterfaceBlockContext = { library, targetNamespaceName, imports, hasContainerProps };
|
|
158
160
|
const blocks: string[] = [];
|
|
159
|
-
let
|
|
161
|
+
let requiresReactElement = false;
|
|
160
162
|
|
|
161
163
|
for (const iface of collectInterfacePropsClasses(
|
|
162
164
|
library,
|
|
@@ -173,13 +175,13 @@ const renderInterfacePropBlocks = (
|
|
|
173
175
|
const { block, objectPropNames } = renderInterfacePropsBlock(iface, glibName, context);
|
|
174
176
|
|
|
175
177
|
if (objectPropNames.length > 0) {
|
|
176
|
-
|
|
178
|
+
requiresReactElement = true;
|
|
177
179
|
}
|
|
178
180
|
|
|
179
181
|
blocks.push(block);
|
|
180
182
|
}
|
|
181
183
|
|
|
182
|
-
return { blocks,
|
|
184
|
+
return { blocks, requiresReactElement, hasContainerProps };
|
|
183
185
|
};
|
|
184
186
|
|
|
185
187
|
const registerCrossNsProps = (
|
|
@@ -285,7 +287,7 @@ const renderInterfacePropsBlock = (
|
|
|
285
287
|
addGiNamespace(imports, iface.namespace.name, giNamespaceAlias(iface.namespace.name));
|
|
286
288
|
const selfDefault = `${giNamespaceAlias(iface.namespace.name)}.${iface.klass.name}`;
|
|
287
289
|
const signature = `export interface ${glib}Props<Self = ${selfDefault}>${extendsClause}`;
|
|
288
|
-
const block = `${
|
|
290
|
+
const block = `${getDoc(iface.klass)}${renderBlock(signature, ownerLines.join("\n"))}`;
|
|
289
291
|
|
|
290
292
|
return { block, objectPropNames };
|
|
291
293
|
};
|
|
@@ -293,7 +295,7 @@ const renderInterfacePropsBlock = (
|
|
|
293
295
|
const renderJsxAugmentation = (namespaceElements: GlibNamedClass[]): string => {
|
|
294
296
|
const elementLines = namespaceElements
|
|
295
297
|
.filter((entry) => !entry.klass.isAbstract)
|
|
296
|
-
.map((entry) => `${entry.glibName}: ${entry.glibName}Props;`)
|
|
298
|
+
.map((entry) => `${getDoc(entry.klass)}${entry.glibName}: ${entry.glibName}Props;`)
|
|
297
299
|
.join("\n");
|
|
298
300
|
|
|
299
301
|
const intrinsicInterface = renderBlock("interface IntrinsicElements", elementLines);
|
|
@@ -324,7 +326,7 @@ const renderPropBlock = (
|
|
|
324
326
|
const extendsClause = extendsList.length === 0 ? "" : ` extends ${extendsList.join(", ")}`;
|
|
325
327
|
const selfDefault = `${giNamespaceAlias(entry.namespace.name)}.${entry.klass.name}`;
|
|
326
328
|
|
|
327
|
-
const block = `${
|
|
329
|
+
const block = `${getDoc(entry.klass)}${renderBlock(
|
|
328
330
|
`export interface ${entry.glibName}Props<Self = ${selfDefault}>${extendsClause}`,
|
|
329
331
|
ownerLines.join("\n"),
|
|
330
332
|
)}`;
|
|
@@ -23,7 +23,7 @@ type IntrinsicElementEntry = {
|
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
type PropNameCollector = {
|
|
26
|
-
|
|
26
|
+
shouldKeep: (property: GirProperty) => boolean;
|
|
27
27
|
seen: Set<string>;
|
|
28
28
|
names: string[];
|
|
29
29
|
};
|
|
@@ -57,10 +57,10 @@ const generateMetadata = (library: Library): string => {
|
|
|
57
57
|
.map(({ glibName, defaults }) => ` "${glibName}": ${renderDefaultsObject(defaults)},`);
|
|
58
58
|
|
|
59
59
|
return `${[
|
|
60
|
-
`export const
|
|
61
|
-
`export const
|
|
62
|
-
`export const
|
|
63
|
-
`export const
|
|
60
|
+
`export const signals: Record<string, Record<string, string>> = {\n${signalsEntries.join("\n")}\n};`,
|
|
61
|
+
`export const constructOnlyProps: Record<string, Set<string>> = {\n${constructOnlyEntries.join("\n")}\n};`,
|
|
62
|
+
`export const constructProps: Record<string, Set<string>> = {\n${constructableEntries.join("\n")}\n};`,
|
|
63
|
+
`export const defaultProps: Record<string, Record<string, unknown>> = {\n${defaultsEntries.join("\n")}\n};`,
|
|
64
64
|
].join("\n\n")}\n`;
|
|
65
65
|
};
|
|
66
66
|
|
|
@@ -114,10 +114,10 @@ const collectSignals = (sources: GirClass[]): [string, string][] => {
|
|
|
114
114
|
};
|
|
115
115
|
|
|
116
116
|
const collectPropNamesFromSource = (source: GirClass, collector: PropNameCollector): void => {
|
|
117
|
-
const {
|
|
117
|
+
const { shouldKeep, seen, names } = collector;
|
|
118
118
|
|
|
119
119
|
for (const property of source.properties) {
|
|
120
|
-
if (!
|
|
120
|
+
if (!shouldKeep(property)) {
|
|
121
121
|
continue;
|
|
122
122
|
}
|
|
123
123
|
|
|
@@ -133,7 +133,7 @@ const collectPropNamesFromSource = (source: GirClass, collector: PropNameCollect
|
|
|
133
133
|
};
|
|
134
134
|
|
|
135
135
|
const collectPropNames = (sources: GirClass[], shouldKeep: (property: GirProperty) => boolean): string[] => {
|
|
136
|
-
const collector: PropNameCollector = {
|
|
136
|
+
const collector: PropNameCollector = { shouldKeep, seen: new Set<string>(), names: [] };
|
|
137
137
|
|
|
138
138
|
for (const source of sources) {
|
|
139
139
|
collectPropNamesFromSource(source, collector);
|
|
@@ -362,9 +362,9 @@ const primitiveDefaultLiteral = (category: PrimitiveCategory, raw: string): stri
|
|
|
362
362
|
};
|
|
363
363
|
|
|
364
364
|
const bigintDefaultLiteral = (raw: string): string | undefined => {
|
|
365
|
-
const
|
|
365
|
+
const integer = integerDefaultLiteral(raw);
|
|
366
366
|
|
|
367
|
-
return
|
|
367
|
+
return integer === undefined ? undefined : `${integer}n`;
|
|
368
368
|
};
|
|
369
369
|
|
|
370
370
|
const enumDefaultLiteral = (enumType: GirEnum, raw: string): string | undefined => {
|
|
@@ -3,7 +3,6 @@ type OmittedProps = Record<string, string[]>;
|
|
|
3
3
|
|
|
4
4
|
const omittedProps: Map<string, Set<string>> = new Map();
|
|
5
5
|
|
|
6
|
-
/** Installs the props each element omits (GLib type name → prop names); set once per run. */
|
|
7
6
|
const setOmittedProps = (props: OmittedProps): void => {
|
|
8
7
|
omittedProps.clear();
|
|
9
8
|
|
|
@@ -12,12 +11,11 @@ const setOmittedProps = (props: OmittedProps): void => {
|
|
|
12
11
|
}
|
|
13
12
|
};
|
|
14
13
|
|
|
15
|
-
/** Whether the element config declares this prop omitted for the type that declares the property. */
|
|
16
14
|
const isOmittedProp = (glibName: string | undefined, jsName: string): boolean =>
|
|
17
15
|
glibName !== undefined && omittedProps.get(glibName)?.has(jsName) === true;
|
|
18
16
|
|
|
19
17
|
/** Merges omitted-prop maps keyed by GLib type name, concatenating the names each map contributes. */
|
|
20
|
-
const
|
|
18
|
+
const mergeOmittedProps = (...maps: OmittedProps[]): OmittedProps => {
|
|
21
19
|
const merged: OmittedProps = {};
|
|
22
20
|
|
|
23
21
|
for (const map of maps) {
|
|
@@ -29,4 +27,4 @@ const mergeOmitProps = (...maps: OmittedProps[]): OmittedProps => {
|
|
|
29
27
|
return merged;
|
|
30
28
|
};
|
|
31
29
|
|
|
32
|
-
export { setOmittedProps, isOmittedProp,
|
|
30
|
+
export { setOmittedProps, isOmittedProp, mergeOmittedProps, type OmittedProps };
|
|
@@ -5,6 +5,7 @@ import { ImportsBuilder } from "../../writer/imports.js";
|
|
|
5
5
|
import { type ElementComponentOverrides, generateElementComponentsSection } from "./element-components.js";
|
|
6
6
|
import { type ElementProps, setElementProps } from "./element-prop-imports.js";
|
|
7
7
|
import { type LazyElementSpec, lazyElementSpecs } from "./element-prop-types.js";
|
|
8
|
+
import { collectGeneratedElements, type GeneratedElement } from "./generated-elements.js";
|
|
8
9
|
import { buildGirIndex } from "./gir-index.js";
|
|
9
10
|
import { collectIntrinsicElementClasses, type GlibNamedClass } from "./intrinsic-elements.js";
|
|
10
11
|
import { generateJsxSection } from "./jsx.js";
|
|
@@ -20,13 +21,14 @@ type JsxFiles = {
|
|
|
20
21
|
namespaces: JsxNamespaceFile[];
|
|
21
22
|
metadata: string;
|
|
22
23
|
intrinsicElementCount: number;
|
|
24
|
+
elements: GeneratedElement[];
|
|
23
25
|
};
|
|
24
26
|
|
|
25
27
|
type JsxGenerationOptions = {
|
|
26
28
|
reactSubexports?: string[];
|
|
27
29
|
components?: ElementComponentOverrides;
|
|
28
30
|
props?: ElementProps;
|
|
29
|
-
|
|
31
|
+
omittedProps?: OmittedProps;
|
|
30
32
|
lazyElements?: string[];
|
|
31
33
|
};
|
|
32
34
|
|
|
@@ -49,7 +51,7 @@ type JsxNamespaceContext = {
|
|
|
49
51
|
|
|
50
52
|
const generateJsxFiles = (library: Library, options: JsxGenerationOptions = {}): JsxFiles => {
|
|
51
53
|
setElementProps(options.props ?? {});
|
|
52
|
-
setOmittedProps(options.
|
|
54
|
+
setOmittedProps(options.omittedProps ?? {});
|
|
53
55
|
const intrinsicElements = collectIntrinsicElementClasses(library);
|
|
54
56
|
const intrinsicElementByGlibName = new Map(intrinsicElements.map((entry) => [entry.glibName, entry]));
|
|
55
57
|
const girIndex = buildGirIndex(library);
|
|
@@ -66,7 +68,7 @@ const generateJsxFiles = (library: Library, options: JsxGenerationOptions = {}):
|
|
|
66
68
|
|
|
67
69
|
const metadata = generateMetadata(library);
|
|
68
70
|
|
|
69
|
-
return { namespaces, metadata, intrinsicElementCount };
|
|
71
|
+
return { namespaces, metadata, intrinsicElementCount, elements: collectGeneratedElements(intrinsicElements) };
|
|
70
72
|
};
|
|
71
73
|
|
|
72
74
|
const orderedIntrinsicNamespaces = (intrinsicElements: GlibNamedClass[]): GirNamespace[] => {
|
|
@@ -145,4 +147,4 @@ const generateJsxNamespace = (
|
|
|
145
147
|
return { source: `${body.join("\n")}\n`, count };
|
|
146
148
|
};
|
|
147
149
|
|
|
148
|
-
export { generateJsxFiles, type JsxNamespaceFile
|
|
150
|
+
export { generateJsxFiles, type JsxNamespaceFile };
|
package/src/store/jsx/props.ts
CHANGED
|
@@ -4,11 +4,13 @@ import type { Library } from "../../gir/library.js";
|
|
|
4
4
|
import type { GirNamespace } from "../../gir/namespace.js";
|
|
5
5
|
import type { GirCallable } from "../../gir/parameter.js";
|
|
6
6
|
import type { TypeId } from "../../gir/type-id.js";
|
|
7
|
+
import type { JsDocSpec } from "../../writer/doc.js";
|
|
7
8
|
import { forEachAncestor } from "../../analysis/inheritance.js";
|
|
8
9
|
import { renderHandlerParameters, renderHandlerResultType } from "../../analysis/param-structure.js";
|
|
9
10
|
import { recordTypeTarget, renderBaseType, type TsTypeTarget } from "../../analysis/ts-type.js";
|
|
10
11
|
import { type GirProperty, isConstructableProperty } from "../../gir/property.js";
|
|
11
12
|
import { renderJsDoc } from "../../writer/doc.js";
|
|
13
|
+
import { annotationSpec, selfHandlerSpec } from "../gi/doc-spec.js";
|
|
12
14
|
import { getGlibName, giNamespaceAlias, isIntrinsicElementClass, signalHandlerName } from "./intrinsic-elements.js";
|
|
13
15
|
import { isOmittedProp } from "./omitted-props.js";
|
|
14
16
|
|
|
@@ -67,9 +69,18 @@ type IntrinsicElementMemberWalk = IntrinsicElementScope & {
|
|
|
67
69
|
acceptSignal: (signal: GirCallable) => void;
|
|
68
70
|
};
|
|
69
71
|
|
|
72
|
+
const notifyDoc = (property: GirProperty, jsName: string, spec: JsDocSpec): string => {
|
|
73
|
+
const note = `Called with the new value when \`${jsName}\` changes.`;
|
|
74
|
+
const doc = property.doc;
|
|
75
|
+
const text = doc === undefined || doc.length === 0 ? note : `${note}\n\n${doc}`;
|
|
76
|
+
|
|
77
|
+
return renderJsDoc(text, undefined, spec);
|
|
78
|
+
};
|
|
79
|
+
|
|
70
80
|
const appendPropertyLines = (state: PropCollectorState, property: GirProperty, jsName: string): void => {
|
|
71
81
|
const tsType = renderReactPropType(state.types, property.type, false);
|
|
72
|
-
const
|
|
82
|
+
const spec = annotationSpec(property.annotations);
|
|
83
|
+
const doc = renderJsDoc(property.doc, undefined, spec);
|
|
73
84
|
|
|
74
85
|
if (isObjectProp(state.owner.library, property)) {
|
|
75
86
|
state.propLines.push(`${doc}${jsName}?: ${tsType} | ReactElement | null | undefined;`);
|
|
@@ -78,14 +89,15 @@ const appendPropertyLines = (state: PropCollectorState, property: GirProperty, j
|
|
|
78
89
|
return;
|
|
79
90
|
}
|
|
80
91
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
if (isSettable) {
|
|
92
|
+
if (isConstructableProperty(property)) {
|
|
84
93
|
state.propLines.push(`${doc}${jsName}?: ${tsType} | null | undefined;`);
|
|
85
94
|
}
|
|
86
95
|
|
|
87
96
|
const handlerType = `((value: ${tsType} | null, self: Self) => void) | null | undefined`;
|
|
88
|
-
|
|
97
|
+
|
|
98
|
+
state.propLines.push(
|
|
99
|
+
`${notifyDoc(property, jsName, spec)}onNotify${upperFirst(jsName)}?: ${handlerType};`,
|
|
100
|
+
);
|
|
89
101
|
};
|
|
90
102
|
|
|
91
103
|
const acceptCollectorProperty = (state: PropCollectorState, property: GirProperty): void => {
|
|
@@ -112,7 +124,8 @@ const acceptCollectorSignal = (state: PropCollectorState, signal: GirCallable):
|
|
|
112
124
|
|
|
113
125
|
state.seen.add(handlerName);
|
|
114
126
|
const signature = renderSignalHandler({ types: state.types, signal, selfType: "Self" });
|
|
115
|
-
|
|
127
|
+
const doc = renderJsDoc(signal.doc, undefined, selfHandlerSpec(signal));
|
|
128
|
+
state.propLines.push(`${doc}${handlerName}?: (${signature}) | undefined;`);
|
|
116
129
|
};
|
|
117
130
|
|
|
118
131
|
const createPropEntryCollector = (owner: IntrinsicElementScope): PropEntryCollector => {
|
|
@@ -231,8 +244,8 @@ const renderSignalHandler = (options: SignalRenderOptions): string => {
|
|
|
231
244
|
library: types.library,
|
|
232
245
|
signal,
|
|
233
246
|
renderType: (ref, nullable) => renderReactPropType(types, ref, nullable),
|
|
234
|
-
|
|
235
|
-
|
|
247
|
+
shouldIncludeCallerAllocated: false,
|
|
248
|
+
isOptOut: true,
|
|
236
249
|
});
|
|
237
250
|
|
|
238
251
|
return `(${params.join(", ")}) => ${result}`;
|
|
@@ -259,4 +272,4 @@ const renderReactPropType = (context: PropTypeRenderContext, ref: TypeId | undef
|
|
|
259
272
|
return isNullable ? `${base} | null` : base;
|
|
260
273
|
};
|
|
261
274
|
|
|
262
|
-
export { buildElementPropsEntries, buildInterfacePropsEntries, isObjectProp
|
|
275
|
+
export { buildElementPropsEntries, buildInterfacePropsEntries, isObjectProp };
|
package/src/store/jsx-store.ts
CHANGED
|
@@ -2,13 +2,11 @@ import type { JsxNamespaceFile } from "./jsx/pipeline.js";
|
|
|
2
2
|
import type { RawFile } from "./store-fs.js";
|
|
3
3
|
import { buildManifest, type StoreOptions, subpathExport, writeStore } from "./store-fs.js";
|
|
4
4
|
|
|
5
|
-
type JsxStoreOptions = StoreOptions;
|
|
6
|
-
|
|
7
5
|
const writeJsxStore = (
|
|
8
|
-
options:
|
|
6
|
+
options: StoreOptions,
|
|
9
7
|
namespaces: JsxNamespaceFile[],
|
|
10
8
|
metadata: string,
|
|
11
|
-
|
|
9
|
+
rawFiles: RawFile[],
|
|
12
10
|
): void => {
|
|
13
11
|
const exportsMap: Record<string, unknown> = {
|
|
14
12
|
"./metadata": subpathExport("metadata"),
|
|
@@ -31,9 +29,9 @@ const writeJsxStore = (
|
|
|
31
29
|
exports: exportsMap,
|
|
32
30
|
peerDependencies: { "@gtkx/gi": "*", "@gtkx/react": "*", react: "*" },
|
|
33
31
|
}),
|
|
34
|
-
rawFiles
|
|
35
|
-
|
|
32
|
+
rawFiles,
|
|
33
|
+
requiresEnvReference: true,
|
|
36
34
|
});
|
|
37
35
|
};
|
|
38
36
|
|
|
39
|
-
export { writeJsxStore
|
|
37
|
+
export { writeJsxStore };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { existsSync, readFileSync, realpathSync } from "node:fs";
|
|
2
|
+
import { dirname, join, parse } from "node:path";
|
|
3
|
+
import type { StoreOptions } from "./store-fs.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Where a project's generated stores live, ready to spread into `runCodegen`. `jsx` is null when the
|
|
7
|
+
* project has no `@gtkx/react` installed, in which case only the `@gtkx/gi` store can be generated.
|
|
8
|
+
*/
|
|
9
|
+
type ResolvedStore = {
|
|
10
|
+
/** Where the `@gtkx/gi` store goes, versioned by the installed `@gtkx/runtime`. */
|
|
11
|
+
gi: StoreOptions;
|
|
12
|
+
/** Where the `@gtkx/jsx` store goes, versioned by the installed `@gtkx/react`; null when it is absent. */
|
|
13
|
+
jsx: StoreOptions | null;
|
|
14
|
+
/** Subexport names of the installed `@gtkx/react`, empty when it is absent. */
|
|
15
|
+
reactSubexports: string[];
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
type ResolvedPackage = { dir: string; version: string };
|
|
19
|
+
|
|
20
|
+
const STORE_DIR = ".gtkx";
|
|
21
|
+
const SCOPE = "@gtkx";
|
|
22
|
+
|
|
23
|
+
const readManifest = (path: string): { version?: string; exports?: Record<string, unknown> } =>
|
|
24
|
+
JSON.parse(readFileSync(path, "utf8")) as { version?: string; exports?: Record<string, unknown> };
|
|
25
|
+
|
|
26
|
+
const subexportNames = (packageDir: string): string[] =>
|
|
27
|
+
Object.keys(readManifest(join(packageDir, "package.json")).exports ?? {})
|
|
28
|
+
.filter((key) => key.startsWith("./") && key !== "./package.json")
|
|
29
|
+
.map((key) => key.slice(2));
|
|
30
|
+
|
|
31
|
+
const loadPackage = (manifest: string): ResolvedPackage | null => {
|
|
32
|
+
if (!existsSync(manifest)) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const real = realpathSync(manifest);
|
|
37
|
+
|
|
38
|
+
return { dir: dirname(real), version: readManifest(real).version ?? "0.0.0" };
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const nodeModulesChain = function* (projectRoot: string): Generator<string> {
|
|
42
|
+
const { root } = parse(projectRoot);
|
|
43
|
+
let current = projectRoot;
|
|
44
|
+
|
|
45
|
+
while (current !== root) {
|
|
46
|
+
yield join(current, "node_modules");
|
|
47
|
+
current = dirname(current);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
yield join(root, "node_modules");
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const resolvePackage = (projectRoot: string, packageName: string): ResolvedPackage | null => {
|
|
54
|
+
for (const nodeModules of nodeModulesChain(projectRoot)) {
|
|
55
|
+
const found = loadPackage(join(nodeModules, packageName, "package.json"));
|
|
56
|
+
|
|
57
|
+
if (found !== null) {
|
|
58
|
+
return found;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return loadPackage(join(projectRoot, "packages", packageName.replace(/^@[^/]+\//, ""), "package.json"));
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const storeOptions = (nodeModules: string, name: string, version: string): StoreOptions => ({
|
|
66
|
+
storeDir: join(nodeModules, STORE_DIR, name),
|
|
67
|
+
linkDir: join(nodeModules, SCOPE, name),
|
|
68
|
+
version,
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Resolves where a project's `@gtkx/gi` and `@gtkx/jsx` stores belong, from the project root alone. The
|
|
73
|
+
* result supplies every `runCodegen` input except `libraries` and `girPath`, so a caller that has
|
|
74
|
+
* already resolved those can spread it straight into the call.
|
|
75
|
+
*
|
|
76
|
+
* Store versions come from the installed `@gtkx/runtime` and `@gtkx/react`, so a dependency upgrade
|
|
77
|
+
* invalidates the stores. Pass explicit `gi` or `jsx` options to `runCodegen` to override any of it.
|
|
78
|
+
*
|
|
79
|
+
* @param projectRoot Directory holding the project's `package.json` and `node_modules`.
|
|
80
|
+
* @returns The store locations and the React subexports that shape the jsx store.
|
|
81
|
+
* @throws If `@gtkx/runtime` cannot be resolved from the project.
|
|
82
|
+
*/
|
|
83
|
+
const resolveStore = (projectRoot: string): ResolvedStore => {
|
|
84
|
+
const runtime = resolvePackage(projectRoot, "@gtkx/runtime");
|
|
85
|
+
|
|
86
|
+
if (runtime === null) {
|
|
87
|
+
throw new Error(`Cannot resolve @gtkx/runtime from ${projectRoot}; is it installed?`);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const react = resolvePackage(projectRoot, "@gtkx/react");
|
|
91
|
+
const nodeModules = join(projectRoot, "node_modules");
|
|
92
|
+
|
|
93
|
+
return {
|
|
94
|
+
gi: storeOptions(nodeModules, "gi", runtime.version),
|
|
95
|
+
jsx: react === null ? null : storeOptions(nodeModules, "jsx", react.version),
|
|
96
|
+
reactSubexports: react === null ? [] : subexportNames(react.dir),
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export { resolveStore, type ResolvedStore };
|
package/src/store/store-fs.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, mkdtempSync, renameSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
|
|
1
|
+
import { chmodSync, existsSync, mkdirSync, mkdtempSync, renameSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { dirname, join, relative } from "node:path";
|
|
3
3
|
import { compileStore } from "./compile-store.js";
|
|
4
4
|
|
|
5
|
+
/** Where one generated store is written and how it is reached. */
|
|
5
6
|
type StoreOptions = {
|
|
7
|
+
/** Directory the generated package is written to, replaced atomically on each run. */
|
|
6
8
|
storeDir: string;
|
|
9
|
+
/** Path the store is symlinked at, which is the specifier's resolution target under `node_modules`. */
|
|
7
10
|
linkDir: string;
|
|
11
|
+
/** Version stamped on the store's `package.json`, taken from the dependency the store is generated for. */
|
|
8
12
|
version: string;
|
|
9
13
|
};
|
|
10
14
|
|
|
@@ -37,9 +41,11 @@ type WriteStoreParams = {
|
|
|
37
41
|
files: StoreFile[];
|
|
38
42
|
manifest: Manifest;
|
|
39
43
|
rawFiles?: RawFile[];
|
|
40
|
-
|
|
44
|
+
requiresEnvReference?: boolean;
|
|
41
45
|
};
|
|
42
46
|
|
|
47
|
+
const STORE_DIR_MODE = 0o755;
|
|
48
|
+
|
|
43
49
|
const subpathExport = (stem: string): { types: string; default: string } => ({
|
|
44
50
|
types: `./${stem}.d.ts`,
|
|
45
51
|
default: `./${stem}.js`,
|
|
@@ -73,7 +79,7 @@ const writeStore = (params: WriteStoreParams): void => {
|
|
|
73
79
|
storeDir: tmp,
|
|
74
80
|
files: params.files,
|
|
75
81
|
packageName: params.manifest.name,
|
|
76
|
-
...(params.
|
|
82
|
+
...(params.requiresEnvReference !== undefined && { requiresEnvReference: params.requiresEnvReference }),
|
|
77
83
|
});
|
|
78
84
|
|
|
79
85
|
writePackageJson(tmp, params.manifest);
|
|
@@ -83,7 +89,6 @@ const writeStore = (params: WriteStoreParams): void => {
|
|
|
83
89
|
writeFileSync(join(tmp, raw.relativePath), raw.content);
|
|
84
90
|
}
|
|
85
91
|
|
|
86
|
-
symlinkRelative(join(tmp, "node_modules", ...params.manifest.name.split("/")), tmp);
|
|
87
92
|
swapStore(tmp, params.storeDir, params.linkDir);
|
|
88
93
|
} finally {
|
|
89
94
|
rmSync(tmp, { recursive: true, force: true });
|
|
@@ -121,8 +126,10 @@ const swapStore = (tmp: string, storeDir: string, visibleLink: string): void =>
|
|
|
121
126
|
|
|
122
127
|
const createTempStore = (storeDir: string): string => {
|
|
123
128
|
mkdirSync(dirname(storeDir), { recursive: true });
|
|
129
|
+
const tmp = mkdtempSync(`${storeDir}.tmp-`);
|
|
130
|
+
chmodSync(tmp, STORE_DIR_MODE);
|
|
124
131
|
|
|
125
|
-
return
|
|
132
|
+
return tmp;
|
|
126
133
|
};
|
|
127
134
|
|
|
128
135
|
export { subpathExport, buildManifest, writeStore, type StoreOptions, type RawFile };
|
package/src/writer/context.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Library } from "../gir/library.js";
|
|
2
2
|
import type { GirNamespace } from "../gir/namespace.js";
|
|
3
|
-
import { ModuleBuilder } from "./module.js";
|
|
3
|
+
import { type DeclaredType, ModuleBuilder } from "./module.js";
|
|
4
4
|
|
|
5
5
|
class ModuleContext {
|
|
6
6
|
public module: ModuleBuilder = new ModuleBuilder();
|
|
@@ -55,6 +55,10 @@ class ModuleContext {
|
|
|
55
55
|
return namespaceName;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
declaredType(owner: string, name: string = owner): DeclaredType {
|
|
59
|
+
return { name, owner: `${this.namespace.name}.${owner}` };
|
|
60
|
+
}
|
|
61
|
+
|
|
58
62
|
qualify(namespaceName: string, typeName: string): string {
|
|
59
63
|
if (namespaceName === this.namespace.name) {
|
|
60
64
|
return typeName;
|