@alloy-js/core 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/LICENSE.txt +7 -0
- package/api-extractor.json +11 -0
- package/babel.config.cjs +4 -0
- package/dist/src/binder.d.ts +333 -0
- package/dist/src/binder.d.ts.map +1 -0
- package/dist/src/binder.js +444 -0
- package/dist/src/binder.js.map +1 -0
- package/dist/src/code.d.ts +3 -0
- package/dist/src/code.d.ts.map +1 -0
- package/dist/src/code.js +156 -0
- package/dist/src/code.js.map +1 -0
- package/dist/src/components/Declaration.d.ts +29 -0
- package/dist/src/components/Declaration.d.ts.map +1 -0
- package/dist/src/components/Declaration.js +47 -0
- package/dist/src/components/Declaration.js.map +1 -0
- package/dist/src/components/Indent.d.ts +13 -0
- package/dist/src/components/Indent.d.ts.map +1 -0
- package/dist/src/components/Indent.js +23 -0
- package/dist/src/components/Indent.js.map +1 -0
- package/dist/src/components/MemberDeclaration.d.ts +30 -0
- package/dist/src/components/MemberDeclaration.d.ts.map +1 -0
- package/dist/src/components/MemberDeclaration.js +52 -0
- package/dist/src/components/MemberDeclaration.js.map +1 -0
- package/dist/src/components/MemberName.d.ts +2 -0
- package/dist/src/components/MemberName.d.ts.map +1 -0
- package/dist/src/components/MemberName.js +11 -0
- package/dist/src/components/MemberName.js.map +1 -0
- package/dist/src/components/MemberScope.d.ts +27 -0
- package/dist/src/components/MemberScope.d.ts.map +1 -0
- package/dist/src/components/MemberScope.js +28 -0
- package/dist/src/components/MemberScope.js.map +1 -0
- package/dist/src/components/Name.d.ts +2 -0
- package/dist/src/components/Name.d.ts.map +1 -0
- package/dist/src/components/Name.js +11 -0
- package/dist/src/components/Name.js.map +1 -0
- package/dist/src/components/Output.d.ts +31 -0
- package/dist/src/components/Output.d.ts.map +1 -0
- package/dist/src/components/Output.js +44 -0
- package/dist/src/components/Output.js.map +1 -0
- package/dist/src/components/Scope.d.ts +10 -0
- package/dist/src/components/Scope.d.ts.map +1 -0
- package/dist/src/components/Scope.js +25 -0
- package/dist/src/components/Scope.js.map +1 -0
- package/dist/src/components/SourceDirectory.d.ts +7 -0
- package/dist/src/components/SourceDirectory.d.ts.map +1 -0
- package/dist/src/components/SourceDirectory.js +38 -0
- package/dist/src/components/SourceDirectory.js.map +1 -0
- package/dist/src/components/SourceFile.d.ts +12 -0
- package/dist/src/components/SourceFile.d.ts.map +1 -0
- package/dist/src/components/SourceFile.js +26 -0
- package/dist/src/components/SourceFile.js.map +1 -0
- package/dist/src/components/index.d.ts +11 -0
- package/dist/src/components/index.d.ts.map +1 -0
- package/dist/src/components/index.js +11 -0
- package/dist/src/components/index.js.map +1 -0
- package/dist/src/components/stc/index.d.ts +26 -0
- package/dist/src/components/stc/index.d.ts.map +1 -0
- package/dist/src/components/stc/index.js +9 -0
- package/dist/src/components/stc/index.js.map +1 -0
- package/dist/src/context/assignment.d.ts +39 -0
- package/dist/src/context/assignment.d.ts.map +1 -0
- package/dist/src/context/assignment.js +39 -0
- package/dist/src/context/assignment.js.map +1 -0
- package/dist/src/context/binder.d.ts +9 -0
- package/dist/src/context/binder.d.ts.map +1 -0
- package/dist/src/context/binder.js +12 -0
- package/dist/src/context/binder.js.map +1 -0
- package/dist/src/context/declaration.d.ts +4 -0
- package/dist/src/context/declaration.d.ts.map +1 -0
- package/dist/src/context/declaration.js +3 -0
- package/dist/src/context/declaration.js.map +1 -0
- package/dist/src/context/indent.d.ts +5 -0
- package/dist/src/context/indent.d.ts.map +1 -0
- package/dist/src/context/indent.js +8 -0
- package/dist/src/context/indent.js.map +1 -0
- package/dist/src/context/index.d.ts +11 -0
- package/dist/src/context/index.d.ts.map +1 -0
- package/dist/src/context/index.js +11 -0
- package/dist/src/context/index.js.map +1 -0
- package/dist/src/context/member-declaration.d.ts +9 -0
- package/dist/src/context/member-declaration.d.ts.map +1 -0
- package/dist/src/context/member-declaration.js +9 -0
- package/dist/src/context/member-declaration.js.map +1 -0
- package/dist/src/context/member-scope.d.ts +13 -0
- package/dist/src/context/member-scope.d.ts.map +1 -0
- package/dist/src/context/member-scope.js +12 -0
- package/dist/src/context/member-scope.js.map +1 -0
- package/dist/src/context/name-policy.d.ts +5 -0
- package/dist/src/context/name-policy.d.ts.map +1 -0
- package/dist/src/context/name-policy.js +10 -0
- package/dist/src/context/name-policy.js.map +1 -0
- package/dist/src/context/scope.d.ts +5 -0
- package/dist/src/context/scope.d.ts.map +1 -0
- package/dist/src/context/scope.js +6 -0
- package/dist/src/context/scope.js.map +1 -0
- package/dist/src/context/source-directory.d.ts +9 -0
- package/dist/src/context/source-directory.d.ts.map +1 -0
- package/dist/src/context/source-directory.js +3 -0
- package/dist/src/context/source-directory.js.map +1 -0
- package/dist/src/context/source-file.d.ts +12 -0
- package/dist/src/context/source-file.d.ts.map +1 -0
- package/dist/src/context/source-file.js +3 -0
- package/dist/src/context/source-file.js.map +1 -0
- package/dist/src/context.d.ts +13 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +30 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +13 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/jsx-runtime.d.ts +43 -0
- package/dist/src/jsx-runtime.d.ts.map +1 -0
- package/dist/src/jsx-runtime.js +172 -0
- package/dist/src/jsx-runtime.js.map +1 -0
- package/dist/src/name-policy.d.ts +5 -0
- package/dist/src/name-policy.d.ts.map +1 -0
- package/dist/src/name-policy.js +8 -0
- package/dist/src/name-policy.js.map +1 -0
- package/dist/src/refkey.d.ts +9 -0
- package/dist/src/refkey.d.ts.map +1 -0
- package/dist/src/refkey.js +44 -0
- package/dist/src/refkey.js.map +1 -0
- package/dist/src/render.d.ts +147 -0
- package/dist/src/render.d.ts.map +1 -0
- package/dist/src/render.js +317 -0
- package/dist/src/render.js.map +1 -0
- package/dist/src/tsdoc-metadata.json +11 -0
- package/dist/src/utils.d.ts +80 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +219 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/test/children.test.d.ts +2 -0
- package/dist/test/children.test.d.ts.map +1 -0
- package/dist/test/components/source-file.test.d.ts +2 -0
- package/dist/test/components/source-file.test.d.ts.map +1 -0
- package/dist/test/name-policy.test.d.ts +2 -0
- package/dist/test/name-policy.test.d.ts.map +1 -0
- package/dist/test/reactivity/ref-rendering.test.d.ts +2 -0
- package/dist/test/reactivity/ref-rendering.test.d.ts.map +1 -0
- package/dist/test/reactivity/test.test.d.ts +2 -0
- package/dist/test/reactivity/test.test.d.ts.map +1 -0
- package/dist/test/refkey.test.d.ts +2 -0
- package/dist/test/refkey.test.d.ts.map +1 -0
- package/dist/test/rendering/basic.test.d.ts +2 -0
- package/dist/test/rendering/basic.test.d.ts.map +1 -0
- package/dist/test/rendering/code.test.d.ts +2 -0
- package/dist/test/rendering/code.test.d.ts.map +1 -0
- package/dist/test/rendering/indent.test.d.ts +2 -0
- package/dist/test/rendering/indent.test.d.ts.map +1 -0
- package/dist/test/rendering/linebreaks.test.d.ts +2 -0
- package/dist/test/rendering/linebreaks.test.d.ts.map +1 -0
- package/dist/test/rendering/refkeys.test.d.ts +2 -0
- package/dist/test/rendering/refkeys.test.d.ts.map +1 -0
- package/dist/test/stc.test.d.ts +2 -0
- package/dist/test/stc.test.d.ts.map +1 -0
- package/dist/test/symbols.test.d.ts +2 -0
- package/dist/test/symbols.test.d.ts.map +1 -0
- package/dist/test/utils.test.d.ts +2 -0
- package/dist/test/utils.test.d.ts.map +1 -0
- package/dist/testing/extend-expect.d.ts +2 -0
- package/dist/testing/extend-expect.d.ts.map +1 -0
- package/dist/testing/extend-expect.js +22 -0
- package/dist/testing/extend-expect.js.map +1 -0
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +3 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/render.d.ts +7 -0
- package/dist/testing/render.d.ts.map +1 -0
- package/dist/testing/render.js +25 -0
- package/dist/testing/render.js.map +1 -0
- package/dist/testing/vitest.d.js +1 -0
- package/dist/testing/vitest.d.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +64 -0
- package/src/binder.ts +838 -0
- package/src/code.ts +220 -0
- package/src/components/Declaration.tsx +53 -0
- package/src/components/Indent.tsx +33 -0
- package/src/components/MemberDeclaration.tsx +62 -0
- package/src/components/MemberName.tsx +11 -0
- package/src/components/MemberScope.tsx +40 -0
- package/src/components/Name.tsx +11 -0
- package/src/components/Output.tsx +69 -0
- package/src/components/Scope.tsx +27 -0
- package/src/components/SourceDirectory.tsx +43 -0
- package/src/components/SourceFile.tsx +33 -0
- package/src/components/index.tsx +10 -0
- package/src/components/stc/index.ts +9 -0
- package/src/context/assignment.ts +57 -0
- package/src/context/binder.ts +14 -0
- package/src/context/declaration.ts +5 -0
- package/src/context/indent.ts +10 -0
- package/src/context/index.ts +10 -0
- package/src/context/member-declaration.ts +10 -0
- package/src/context/member-scope.ts +17 -0
- package/src/context/name-policy.ts +13 -0
- package/src/context/scope.ts +8 -0
- package/src/context/source-directory.ts +11 -0
- package/src/context/source-file.ts +12 -0
- package/src/context.ts +53 -0
- package/src/index.ts +21 -0
- package/src/jsx-runtime.ts +266 -0
- package/src/name-policy.ts +13 -0
- package/src/refkey.ts +62 -0
- package/src/render.ts +389 -0
- package/src/utils.ts +288 -0
- package/temp/api.json +8840 -0
- package/test/children.test.tsx +33 -0
- package/test/components/source-file.test.tsx +45 -0
- package/test/name-policy.test.tsx +19 -0
- package/test/reactivity/ref-rendering.test.tsx +50 -0
- package/test/reactivity/test.test.tsx +83 -0
- package/test/refkey.test.ts +32 -0
- package/test/rendering/basic.test.tsx +156 -0
- package/test/rendering/code.test.tsx +62 -0
- package/test/rendering/indent.test.tsx +608 -0
- package/test/rendering/linebreaks.test.tsx +72 -0
- package/test/rendering/refkeys.test.tsx +35 -0
- package/test/stc.test.tsx +21 -0
- package/test/symbols.test.ts +406 -0
- package/test/utils.test.tsx +150 -0
- package/testing/extend-expect.ts +20 -0
- package/testing/index.ts +2 -0
- package/testing/render.ts +37 -0
- package/testing/vitest.d.ts +10 -0
- package/tsconfig.json +17 -0
- package/vitest.config.ts +18 -0
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
import { memo } from "@alloy-js/core/jsx-runtime";
|
|
2
|
+
import { computed, effect, reactive, shallowRef } from "@vue/reactivity";
|
|
3
|
+
import { useMemberScope } from "./context/member-scope.js";
|
|
4
|
+
import { useScope } from "./context/scope.js";
|
|
5
|
+
import { refkey } from "./refkey.js";
|
|
6
|
+
/**
|
|
7
|
+
* Flags that describe an output symbol.
|
|
8
|
+
*/
|
|
9
|
+
export let OutputSymbolFlags = /*#__PURE__*/function (OutputSymbolFlags) {
|
|
10
|
+
OutputSymbolFlags[OutputSymbolFlags["None"] = 0] = "None";
|
|
11
|
+
OutputSymbolFlags[OutputSymbolFlags["InstanceMemberContainer"] = 1] = "InstanceMemberContainer";
|
|
12
|
+
OutputSymbolFlags[OutputSymbolFlags["StaticMemberContainer"] = 2] = "StaticMemberContainer";
|
|
13
|
+
OutputSymbolFlags[OutputSymbolFlags["MemberContainer"] = 3] = "MemberContainer";
|
|
14
|
+
OutputSymbolFlags[OutputSymbolFlags["InstanceMember"] = 4] = "InstanceMember";
|
|
15
|
+
OutputSymbolFlags[OutputSymbolFlags["StaticMember"] = 8] = "StaticMember";
|
|
16
|
+
OutputSymbolFlags[OutputSymbolFlags["Member"] = 12] = "Member";
|
|
17
|
+
return OutputSymbolFlags;
|
|
18
|
+
}({});
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* An output symbol is a named entity that can be referenced in your output
|
|
22
|
+
* code. Referencing symbols is generally accomplished by using a
|
|
23
|
+
* {@link Refkey}.
|
|
24
|
+
*
|
|
25
|
+
* @remarks
|
|
26
|
+
*
|
|
27
|
+
* This interface is the base implementation of symbol. Generally, most
|
|
28
|
+
* languages will have subtypes of this interface that provide additional,
|
|
29
|
+
* language-specific metadata about declared symbols. For example, symbols in
|
|
30
|
+
* TypeScript need to track whether they are exported or what kind of symbol
|
|
31
|
+
* they are (e.g. type, value, parameter, etc.)
|
|
32
|
+
*
|
|
33
|
+
* Symbols are reactive values, which allows you to observe changes to the symbol
|
|
34
|
+
* information. For example, a symbol's name may change if it becomes conflicted
|
|
35
|
+
* with a symbol that is added later.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Flags that describe an output scope.
|
|
40
|
+
*/
|
|
41
|
+
export let OutputScopeFlags = /*#__PURE__*/function (OutputScopeFlags) {
|
|
42
|
+
OutputScopeFlags[OutputScopeFlags["None"] = 0] = "None";
|
|
43
|
+
OutputScopeFlags[OutputScopeFlags["StaticMemberScope"] = 1] = "StaticMemberScope";
|
|
44
|
+
OutputScopeFlags[OutputScopeFlags["InstanceMemberScope"] = 2] = "InstanceMemberScope";
|
|
45
|
+
OutputScopeFlags[OutputScopeFlags["MemberScope"] = 3] = "MemberScope";
|
|
46
|
+
return OutputScopeFlags;
|
|
47
|
+
}({});
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* A container of symbols accessible within some scope in your output code.
|
|
51
|
+
*
|
|
52
|
+
* @remarks
|
|
53
|
+
*
|
|
54
|
+
* Scopes form a tree. All scopes except the global scope have a parent scope
|
|
55
|
+
* identified by `parent`. Scopes can have nested scopes which can be accessed
|
|
56
|
+
* using the `children` property. Whether a child scope can be accessed from
|
|
57
|
+
* the parent scope is determined by each language's scoping rules.
|
|
58
|
+
*
|
|
59
|
+
* This interface is the base implementation of scope. Generally, most languages
|
|
60
|
+
* will have subtypes of this interface that provide additional metadata about
|
|
61
|
+
* the scope. For example, TypeScript scopes need to track whether the scope
|
|
62
|
+
* represents a package, module, class, function, etc.
|
|
63
|
+
*
|
|
64
|
+
* Scopes are reactive values, which allows you to observe changes to the scope
|
|
65
|
+
* within a reactive context.
|
|
66
|
+
*/
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* The binder tracks all output scopes and symbols. Scopes are nested containers
|
|
70
|
+
* for symbols.
|
|
71
|
+
*
|
|
72
|
+
* @remarks
|
|
73
|
+
*
|
|
74
|
+
* Symbol information is reactive because in certain situations this data may
|
|
75
|
+
* change. For example, when a symbol becomes conflicted with another symbol,
|
|
76
|
+
* one of the symbol names may change. Ensure that you interact with binder
|
|
77
|
+
* values in a reactive context (i.e. within JSX/code template, or within
|
|
78
|
+
* memo/computed/etc).
|
|
79
|
+
*
|
|
80
|
+
*/
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* A successful resolution of a refkey.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
*
|
|
87
|
+
* Let's say we have the following scopes and symbols:
|
|
88
|
+
*
|
|
89
|
+
* ```
|
|
90
|
+
* scope: global scope
|
|
91
|
+
* ├── scope: namespace scope 1
|
|
92
|
+
* │ └── symbol: foo
|
|
93
|
+
* │ └── static member scope
|
|
94
|
+
* │ └── symbol: bar
|
|
95
|
+
* └── scope: namespace scope 2
|
|
96
|
+
* └── (resolve bar from here)
|
|
97
|
+
* ```
|
|
98
|
+
*
|
|
99
|
+
* When we resolve the refkey for `bar` from within `namespace scope 2`, we will get the following
|
|
100
|
+
* resolution result:
|
|
101
|
+
*
|
|
102
|
+
* * **targetDeclaration**: symbol bar, the symbol we resolved.
|
|
103
|
+
* * **commonScope**: global scope, because this is the most specific scope that contains both the declaration and the reference.
|
|
104
|
+
* * **pathUp**: [namespace scope 2], because this is the scope between the reference and the common scope.
|
|
105
|
+
* * **pathDown**: [namespace scope 1], because this is the scope between the common scope and the declaration
|
|
106
|
+
* * **memberPath**: [foo, bar], because we resolved a member symbol and these are the symbols that lead from the base declaration to the member symbol.
|
|
107
|
+
*/
|
|
108
|
+
|
|
109
|
+
export function createOutputBinder(options = {}) {
|
|
110
|
+
const binder = {
|
|
111
|
+
createScope,
|
|
112
|
+
createSymbol,
|
|
113
|
+
resolveDeclarationByKey,
|
|
114
|
+
addStaticMembersToSymbol,
|
|
115
|
+
addInstanceMembersToSymbol,
|
|
116
|
+
instantiateSymbolInto,
|
|
117
|
+
globalScope: undefined
|
|
118
|
+
};
|
|
119
|
+
const globalSymbols = reactive(new Set());
|
|
120
|
+
binder.globalScope = reactive({
|
|
121
|
+
kind: "global",
|
|
122
|
+
name: "<global>",
|
|
123
|
+
symbols: new Set(),
|
|
124
|
+
symbolsByRefkey: new Map(),
|
|
125
|
+
children: new Set(),
|
|
126
|
+
parent: undefined,
|
|
127
|
+
binder,
|
|
128
|
+
flags: OutputScopeFlags.None,
|
|
129
|
+
getSymbolNames: symbolNames(globalSymbols)
|
|
130
|
+
});
|
|
131
|
+
const knownDeclarations = new Map();
|
|
132
|
+
const waitingDeclarations = new Map();
|
|
133
|
+
return binder;
|
|
134
|
+
function createScope(args) {
|
|
135
|
+
const {
|
|
136
|
+
kind,
|
|
137
|
+
name,
|
|
138
|
+
parent,
|
|
139
|
+
owner,
|
|
140
|
+
flags = OutputScopeFlags.None,
|
|
141
|
+
...rest
|
|
142
|
+
} = args;
|
|
143
|
+
if (flags & OutputScopeFlags.MemberScope) {
|
|
144
|
+
if (!owner) {
|
|
145
|
+
throw new Error("Member scopes must have an owner");
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// member scopes don't have a parent regular scope. Perhaps in the future
|
|
150
|
+
// their parent would be something like a prototype object.
|
|
151
|
+
let parentScope;
|
|
152
|
+
if (parent) {
|
|
153
|
+
parentScope = parent;
|
|
154
|
+
} else if (flags & OutputScopeFlags.MemberScope) {
|
|
155
|
+
parentScope = undefined;
|
|
156
|
+
} else {
|
|
157
|
+
parentScope = useScope() ?? binder.globalScope;
|
|
158
|
+
}
|
|
159
|
+
const symbols = reactive(new Set());
|
|
160
|
+
const symbolsByRefkey = reactive(new Map());
|
|
161
|
+
const scope = reactive({
|
|
162
|
+
kind: kind,
|
|
163
|
+
name: name,
|
|
164
|
+
symbols,
|
|
165
|
+
symbolsByRefkey,
|
|
166
|
+
children: new Set(),
|
|
167
|
+
parent: parentScope,
|
|
168
|
+
flags,
|
|
169
|
+
owner,
|
|
170
|
+
binder,
|
|
171
|
+
...rest,
|
|
172
|
+
getSymbolNames: symbolNames(symbols)
|
|
173
|
+
});
|
|
174
|
+
if (parentScope) {
|
|
175
|
+
parentScope.children.add(scope);
|
|
176
|
+
}
|
|
177
|
+
return scope;
|
|
178
|
+
}
|
|
179
|
+
function createSymbol(args) {
|
|
180
|
+
const {
|
|
181
|
+
name,
|
|
182
|
+
scope = useDefaultScope(args.flags),
|
|
183
|
+
refkey,
|
|
184
|
+
flags = OutputSymbolFlags.None,
|
|
185
|
+
...rest
|
|
186
|
+
} = args;
|
|
187
|
+
if (!scope) {
|
|
188
|
+
throw new Error("No scope was provided and no scope could be found in context");
|
|
189
|
+
}
|
|
190
|
+
if (flags & OutputSymbolFlags.Member && (scope.flags & OutputScopeFlags.MemberScope) === 0) {
|
|
191
|
+
throw new Error("Member symbols must be stored in a member scope.");
|
|
192
|
+
}
|
|
193
|
+
if (scope.flags & OutputScopeFlags.StaticMemberScope) {
|
|
194
|
+
if (~flags & OutputSymbolFlags.InstanceMember && ~flags & OutputSymbolFlags.StaticMember) {
|
|
195
|
+
throw new Error("Symbols stored in a member scope must have either OutputSymbolFlags.InstanceMember or OutputSymbolFlags.StaticMember flags");
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
const symbol = reactive({
|
|
199
|
+
originalName: name,
|
|
200
|
+
name: name,
|
|
201
|
+
scope,
|
|
202
|
+
refkey,
|
|
203
|
+
binder,
|
|
204
|
+
flags,
|
|
205
|
+
...rest
|
|
206
|
+
});
|
|
207
|
+
if (args.flags && args.flags & OutputSymbolFlags.InstanceMemberContainer) {
|
|
208
|
+
symbol.instanceMemberScope = createScope({
|
|
209
|
+
kind: "member",
|
|
210
|
+
name: "instance members",
|
|
211
|
+
parent: undefined,
|
|
212
|
+
owner: symbol,
|
|
213
|
+
flags: OutputScopeFlags.InstanceMemberScope
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
if (args.flags && args.flags & OutputSymbolFlags.StaticMemberContainer) {
|
|
217
|
+
symbol.staticMemberScope = createScope({
|
|
218
|
+
kind: "member",
|
|
219
|
+
name: "static members",
|
|
220
|
+
parent: undefined,
|
|
221
|
+
owner: symbol,
|
|
222
|
+
flags: OutputScopeFlags.StaticMemberScope
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
scope.symbols.add(symbol);
|
|
226
|
+
scope.symbolsByRefkey.set(symbol.refkey, symbol);
|
|
227
|
+
deconflict(symbol);
|
|
228
|
+
notifyRefkey(refkey, symbol);
|
|
229
|
+
return symbol;
|
|
230
|
+
}
|
|
231
|
+
function instantiateSymbolInto(source, target) {
|
|
232
|
+
if (~source.flags & OutputSymbolFlags.InstanceMemberContainer) {
|
|
233
|
+
throw new Error("Can only instantiate symbols with instance members");
|
|
234
|
+
}
|
|
235
|
+
addInstanceMembersToSymbol(target);
|
|
236
|
+
effect(() => {
|
|
237
|
+
for (const sym of source.instanceMemberScope.symbols) {
|
|
238
|
+
if (target.instanceMemberScope.symbols.has(sym)) {
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
createSymbol({
|
|
242
|
+
name: sym.name,
|
|
243
|
+
scope: target.instanceMemberScope,
|
|
244
|
+
refkey: refkey(target.refkey, sym.refkey),
|
|
245
|
+
flags: sym.flags | OutputSymbolFlags.InstanceMember
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
function addStaticMembersToSymbol(symbol) {
|
|
251
|
+
if (symbol.flags & OutputSymbolFlags.StaticMemberContainer) {
|
|
252
|
+
// nothing to do.
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
symbol.flags |= OutputSymbolFlags.StaticMemberContainer;
|
|
256
|
+
symbol.staticMemberScope = createScope({
|
|
257
|
+
kind: "member",
|
|
258
|
+
name: "static members",
|
|
259
|
+
parent: undefined,
|
|
260
|
+
owner: symbol,
|
|
261
|
+
flags: OutputScopeFlags.StaticMemberScope
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
function addInstanceMembersToSymbol(symbol) {
|
|
265
|
+
if (symbol.flags & OutputSymbolFlags.InstanceMemberContainer) {
|
|
266
|
+
// nothing to do.
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
symbol.flags |= OutputSymbolFlags.InstanceMemberContainer;
|
|
270
|
+
symbol.instanceMemberScope = createScope({
|
|
271
|
+
kind: "member",
|
|
272
|
+
name: "instance members",
|
|
273
|
+
parent: undefined,
|
|
274
|
+
owner: symbol,
|
|
275
|
+
flags: OutputScopeFlags.InstanceMemberScope
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
function resolveDeclarationByKey(currentScope, currentMemberScope, key) {
|
|
279
|
+
const targetDeclaration = knownDeclarations.get(key);
|
|
280
|
+
if (targetDeclaration) {
|
|
281
|
+
// this any cast hides a ridiculous error, fix it probably
|
|
282
|
+
return shallowRef(buildResult(currentScope, currentMemberScope, targetDeclaration));
|
|
283
|
+
} else {
|
|
284
|
+
return waitForRefkey(key, symbol => {
|
|
285
|
+
if (symbol) {
|
|
286
|
+
return buildResult(currentScope, currentMemberScope, symbol);
|
|
287
|
+
} else {
|
|
288
|
+
return undefined;
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
function buildResult(currentScope, currentMemberScope, targetDeclarationBase) {
|
|
294
|
+
if (targetDeclarationBase.flags & OutputSymbolFlags.InstanceMember) {
|
|
295
|
+
if (targetDeclarationBase.scope !== currentMemberScope) {
|
|
296
|
+
throw new Error("Cannot resolve member symbols from a different member scope");
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// todo: handle referencing nested objects by refkey
|
|
300
|
+
return {
|
|
301
|
+
pathUp: [],
|
|
302
|
+
pathDown: [],
|
|
303
|
+
memberPath: [targetDeclarationBase],
|
|
304
|
+
commonScope: currentMemberScope,
|
|
305
|
+
targetDeclaration: targetDeclarationBase
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
const {
|
|
309
|
+
memberPath,
|
|
310
|
+
scopeChain: targetChain
|
|
311
|
+
} = scopeAndMemberChain(targetDeclarationBase);
|
|
312
|
+
const currentChain = scopeChain(currentScope);
|
|
313
|
+
let diffStart = 0;
|
|
314
|
+
while (targetChain[diffStart] && currentChain[diffStart] && targetChain[diffStart] === currentChain[diffStart]) {
|
|
315
|
+
diffStart++;
|
|
316
|
+
}
|
|
317
|
+
const pathUp = currentChain.slice(diffStart);
|
|
318
|
+
const pathDown = targetChain.slice(diffStart);
|
|
319
|
+
const commonScope = targetChain[diffStart - 1] ?? null;
|
|
320
|
+
return {
|
|
321
|
+
pathUp,
|
|
322
|
+
pathDown,
|
|
323
|
+
memberPath,
|
|
324
|
+
commonScope,
|
|
325
|
+
targetDeclaration: memberPath && memberPath.length > 0 ? memberPath.at(0) : targetDeclarationBase
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
function scopeAndMemberChain(symbol) {
|
|
329
|
+
const result = {
|
|
330
|
+
memberPath: [],
|
|
331
|
+
scopeChain: []
|
|
332
|
+
};
|
|
333
|
+
let currentSymbol = symbol;
|
|
334
|
+
while (currentSymbol.flags & OutputSymbolFlags.StaticMember) {
|
|
335
|
+
result.memberPath.unshift(currentSymbol);
|
|
336
|
+
currentSymbol = currentSymbol.scope.owner;
|
|
337
|
+
}
|
|
338
|
+
if (symbol.flags & OutputSymbolFlags.StaticMember) {
|
|
339
|
+
result.memberPath.unshift(currentSymbol);
|
|
340
|
+
}
|
|
341
|
+
const startScope = currentSymbol.scope;
|
|
342
|
+
result.scopeChain = scopeChain(startScope);
|
|
343
|
+
return result;
|
|
344
|
+
}
|
|
345
|
+
function scopeChain(scope) {
|
|
346
|
+
const chain = [];
|
|
347
|
+
while (scope) {
|
|
348
|
+
chain.unshift(scope);
|
|
349
|
+
scope = scope.parent;
|
|
350
|
+
}
|
|
351
|
+
return chain;
|
|
352
|
+
}
|
|
353
|
+
function deconflict(symbol) {
|
|
354
|
+
const scope = symbol.scope;
|
|
355
|
+
const existingNames = [...scope.symbols].filter(sym => sym.originalName === symbol.name);
|
|
356
|
+
if (existingNames.length < 2) {
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
if (options.nameConflictResolver) {
|
|
360
|
+
options.nameConflictResolver(symbol.name, existingNames);
|
|
361
|
+
} else {
|
|
362
|
+
// default disambiguation is first-wins
|
|
363
|
+
for (let i = 1; i < existingNames.length; i++) {
|
|
364
|
+
existingNames[i].name = existingNames[i].originalName + "_" + (i + 1);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
function waitForRefkey(refkey, cb) {
|
|
369
|
+
let declSignal;
|
|
370
|
+
if (waitingDeclarations.has(refkey)) {
|
|
371
|
+
declSignal = waitingDeclarations.get(refkey);
|
|
372
|
+
} else {
|
|
373
|
+
declSignal = shallowRef();
|
|
374
|
+
waitingDeclarations.set(refkey, declSignal);
|
|
375
|
+
}
|
|
376
|
+
return computed(() => cb(declSignal.value));
|
|
377
|
+
}
|
|
378
|
+
function notifyRefkey(refkey, symbol) {
|
|
379
|
+
if (!refkey) return;
|
|
380
|
+
knownDeclarations.set(refkey, symbol);
|
|
381
|
+
if (waitingDeclarations.has(refkey)) {
|
|
382
|
+
const signal = waitingDeclarations.get(refkey);
|
|
383
|
+
signal.value = symbol;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* Resolve a refkey in the current scope. Returns a Ref for the resolution result.
|
|
390
|
+
* The value of the ref will be undefined if the identifier hasn't been resolved yet.
|
|
391
|
+
*
|
|
392
|
+
* @remarks
|
|
393
|
+
*
|
|
394
|
+
* This API may return a ref for undefined, but that does not mean that the symbol is
|
|
395
|
+
* not found. The symbol you're looking for may not have been declared yet. When the symbol
|
|
396
|
+
* is declared, the ref will be updated with the resolution result.
|
|
397
|
+
*/
|
|
398
|
+
export function resolve(refkey) {
|
|
399
|
+
const scope = useScope();
|
|
400
|
+
const memberScope = useMemberScope();
|
|
401
|
+
const binder = scope.binder;
|
|
402
|
+
return binder.resolveDeclarationByKey(scope, memberScope?.instanceMembers, refkey);
|
|
403
|
+
}
|
|
404
|
+
const createSymbolsSymbol = Symbol();
|
|
405
|
+
export function getSymbolCreator(creator) {
|
|
406
|
+
return creator[createSymbolsSymbol];
|
|
407
|
+
}
|
|
408
|
+
export function getSymbolCreatorSymbol() {
|
|
409
|
+
return createSymbolsSymbol;
|
|
410
|
+
}
|
|
411
|
+
function symbolNames(symbols) {
|
|
412
|
+
return memo(() => {
|
|
413
|
+
const names = new Set();
|
|
414
|
+
for (const sym of symbols.values()) {
|
|
415
|
+
names.add(sym.name);
|
|
416
|
+
}
|
|
417
|
+
return names;
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* Use symbol flags to determine the scope in which a symbol with those flags
|
|
423
|
+
* should be declared given the current context.
|
|
424
|
+
*
|
|
425
|
+
* @param flags - The symbol flags to use to determine the default scope.
|
|
426
|
+
* @returns an {@link OutputScope} that is the default scope for the given
|
|
427
|
+
* flags.
|
|
428
|
+
*/
|
|
429
|
+
export function useDefaultScope(flags = OutputSymbolFlags.None) {
|
|
430
|
+
if ((flags & OutputSymbolFlags.Member) === 0) {
|
|
431
|
+
return useScope();
|
|
432
|
+
} else {
|
|
433
|
+
const memberScope = useMemberScope();
|
|
434
|
+
if (!memberScope) {
|
|
435
|
+
throw new Error("Cannot declare member symbols without a member scope");
|
|
436
|
+
}
|
|
437
|
+
if (flags & OutputSymbolFlags.InstanceMember) {
|
|
438
|
+
return memberScope.instanceMembers;
|
|
439
|
+
} else {
|
|
440
|
+
return memberScope.staticMembers;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
//# sourceMappingURL=binder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binder.js","names":["memo","computed","effect","reactive","shallowRef","useMemberScope","useScope","refkey","OutputSymbolFlags","OutputScopeFlags","createOutputBinder","options","binder","createScope","createSymbol","resolveDeclarationByKey","addStaticMembersToSymbol","addInstanceMembersToSymbol","instantiateSymbolInto","globalScope","undefined","globalSymbols","Set","kind","name","symbols","symbolsByRefkey","Map","children","parent","flags","None","getSymbolNames","symbolNames","knownDeclarations","waitingDeclarations","args","owner","rest","MemberScope","Error","parentScope","scope","add","useDefaultScope","Member","StaticMemberScope","InstanceMember","StaticMember","symbol","originalName","InstanceMemberContainer","instanceMemberScope","InstanceMemberScope","StaticMemberContainer","staticMemberScope","set","deconflict","notifyRefkey","source","target","sym","has","currentScope","currentMemberScope","key","targetDeclaration","get","buildResult","waitForRefkey","targetDeclarationBase","pathUp","pathDown","memberPath","commonScope","scopeChain","targetChain","scopeAndMemberChain","currentChain","diffStart","slice","length","at","result","currentSymbol","unshift","startScope","chain","existingNames","filter","nameConflictResolver","i","cb","declSignal","value","signal","resolve","memberScope","instanceMembers","createSymbolsSymbol","Symbol","getSymbolCreator","creator","getSymbolCreatorSymbol","names","values","staticMembers"],"sources":["../../src/binder.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../../src/code.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAU,MAAM,gBAAgB,CAAC;AAO/C,wBAAgB,IAAI,CAClB,QAAQ,EAAE,oBAAoB,EAC9B,GAAG,aAAa,EAAE,KAAK,EAAE,WA6E1B"}
|
package/dist/src/code.js
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
// this code is split into a tokenizer and a parser of sorts because I feel like
|
|
2
|
+
// it should be psosible to share logic between this and the babel transform, but
|
|
3
|
+
// this is an exercise for the future.
|
|
4
|
+
import { Indent } from "@alloy-js/core";
|
|
5
|
+
export function code(template, ...substitutions) {
|
|
6
|
+
const indentNodes = [{
|
|
7
|
+
kind: "indent",
|
|
8
|
+
children: [],
|
|
9
|
+
pendingLines: []
|
|
10
|
+
}];
|
|
11
|
+
for (const child of childTokens(template, substitutions)) {
|
|
12
|
+
if (child.indentationLevel > indentNodes.length - 1) {
|
|
13
|
+
// indentation level increased (can only ever increase by 1)
|
|
14
|
+
pushIndent();
|
|
15
|
+
} else if (child.indentationLevel < indentNodes.length - 1) {
|
|
16
|
+
popIndent(child);
|
|
17
|
+
}
|
|
18
|
+
const currentIndent = indentNodes.at(-1);
|
|
19
|
+
if (child.kind === "line") {
|
|
20
|
+
currentIndent.pendingLines.push(child.line);
|
|
21
|
+
} else {
|
|
22
|
+
flushLines();
|
|
23
|
+
currentIndent.children.push(child.value);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
popIndent();
|
|
27
|
+
flushLines();
|
|
28
|
+
function childNodesFor(indentNode) {
|
|
29
|
+
return indentNode.children.map(child => {
|
|
30
|
+
if (typeof child === "object" && child !== null && child.kind === "indent") {
|
|
31
|
+
return () => Indent({
|
|
32
|
+
children: childNodesFor(child)
|
|
33
|
+
});
|
|
34
|
+
} else {
|
|
35
|
+
return child;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return childNodesFor(indentNodes[0]);
|
|
40
|
+
function pushIndent() {
|
|
41
|
+
flushLines();
|
|
42
|
+
const newIndent = {
|
|
43
|
+
kind: "indent",
|
|
44
|
+
children: [],
|
|
45
|
+
pendingLines: [""]
|
|
46
|
+
};
|
|
47
|
+
indentNodes.at(-1).children.push(newIndent);
|
|
48
|
+
indentNodes.push(newIndent);
|
|
49
|
+
}
|
|
50
|
+
function popIndent(child) {
|
|
51
|
+
// indentation level decreased (can decrease by many)
|
|
52
|
+
const times = child ? indentNodes.length - child.indentationLevel - 1 : indentNodes.length - 1;
|
|
53
|
+
for (let i = 0; i < times; i++) {
|
|
54
|
+
flushLines();
|
|
55
|
+
indentNodes.pop();
|
|
56
|
+
}
|
|
57
|
+
if (child) {
|
|
58
|
+
// need a linebreak after dedenting
|
|
59
|
+
indentNodes.at(-1).pendingLines.push("");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function flushLines() {
|
|
63
|
+
const currentIndent = indentNodes.at(-1);
|
|
64
|
+
currentIndent.children.push(currentIndent.pendingLines.join("\n"));
|
|
65
|
+
currentIndent.pendingLines = [];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function* childTokens(template, substitutions) {
|
|
69
|
+
let newline = false;
|
|
70
|
+
const indentStack = [{
|
|
71
|
+
level: -1,
|
|
72
|
+
literalIndent: ""
|
|
73
|
+
}];
|
|
74
|
+
yield* processLiteralString(template[0], substitutions.length === 0 ? "only" : "first");
|
|
75
|
+
newline = false;
|
|
76
|
+
for (let i = 0; i < substitutions.length; i++) {
|
|
77
|
+
const indentationLevel = currentIndent().level;
|
|
78
|
+
yield {
|
|
79
|
+
kind: "other",
|
|
80
|
+
value: substitutions[i],
|
|
81
|
+
indentationLevel: indentationLevel < 0 ? 0 : indentationLevel,
|
|
82
|
+
newline
|
|
83
|
+
};
|
|
84
|
+
yield* processLiteralString(template[i + 1], i === substitutions.length - 1 ? "last" : undefined);
|
|
85
|
+
newline = false;
|
|
86
|
+
}
|
|
87
|
+
function processLiteralString(child, pos) {
|
|
88
|
+
const lines = child.split("\n");
|
|
89
|
+
const lineTokens = [];
|
|
90
|
+
if ((pos === "first" || pos === "only") && lines[0].match(/^\s*$/)) {
|
|
91
|
+
// remove leading whitespace.
|
|
92
|
+
lines.shift();
|
|
93
|
+
newline = true;
|
|
94
|
+
}
|
|
95
|
+
if ((pos === "last" || pos === "only") && lines[lines.length - 1].match(/^\s*$/)) {
|
|
96
|
+
// remove trailing whitespace
|
|
97
|
+
lines.pop();
|
|
98
|
+
if (lines.length === 1 && lines[0].trimStart() === "") {
|
|
99
|
+
// an empty line following a component most likely
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// eslint-disable-next-line prefer-const
|
|
105
|
+
for (let [lineNum, line] of lines.entries()) {
|
|
106
|
+
if (lineNum > 0) {
|
|
107
|
+
newline = true;
|
|
108
|
+
}
|
|
109
|
+
if (newline) {
|
|
110
|
+
if (line === "" && currentIndent().level > -1) {
|
|
111
|
+
// for empty lines we want to just continue with the current indentation
|
|
112
|
+
lineTokens.push({
|
|
113
|
+
kind: "line",
|
|
114
|
+
line: "",
|
|
115
|
+
indentationLevel: currentIndent().level,
|
|
116
|
+
newline
|
|
117
|
+
});
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const lineIndent = line.match(/^\s+/)?.[0] ?? "";
|
|
121
|
+
const startIndent = currentIndent();
|
|
122
|
+
if (lineIndent.length > startIndent.literalIndent.length) {
|
|
123
|
+
indentStack.push({
|
|
124
|
+
level: startIndent.level + 1,
|
|
125
|
+
literalIndent: lineIndent
|
|
126
|
+
});
|
|
127
|
+
} else {
|
|
128
|
+
while (currentIndent().literalIndent.length > lineIndent.length) {
|
|
129
|
+
indentStack.pop();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
line = line.trimStart();
|
|
133
|
+
const indentationLevel = currentIndent().level;
|
|
134
|
+
lineTokens.push({
|
|
135
|
+
kind: "line",
|
|
136
|
+
line,
|
|
137
|
+
indentationLevel: indentationLevel < 0 ? 0 : indentationLevel,
|
|
138
|
+
newline
|
|
139
|
+
});
|
|
140
|
+
} else {
|
|
141
|
+
const indentationLevel = currentIndent().level;
|
|
142
|
+
lineTokens.push({
|
|
143
|
+
kind: "line",
|
|
144
|
+
line,
|
|
145
|
+
indentationLevel: indentationLevel < 0 ? 0 : indentationLevel,
|
|
146
|
+
newline
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return lineTokens;
|
|
151
|
+
}
|
|
152
|
+
function currentIndent() {
|
|
153
|
+
return indentStack.at(-1);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code.js","names":["Indent","code","template","substitutions","indentNodes","kind","children","pendingLines","child","childTokens","indentationLevel","length","pushIndent","popIndent","currentIndent","at","push","line","flushLines","value","childNodesFor","indentNode","map","newIndent","times","i","pop","join","newline","indentStack","level","literalIndent","processLiteralString","undefined","pos","lines","split","lineTokens","match","shift","trimStart","lineNum","entries","lineIndent","startIndent"],"sources":["../../src/code.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Children } from "@alloy-js/core/jsx-runtime";
|
|
2
|
+
import { OutputSymbol } from "../binder.js";
|
|
3
|
+
import { Refkey } from "../refkey.js";
|
|
4
|
+
export interface DeclarationProps {
|
|
5
|
+
name?: string;
|
|
6
|
+
refkey?: Refkey;
|
|
7
|
+
symbol?: OutputSymbol;
|
|
8
|
+
children?: Children;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Declares a symbol in the current scope for this component's children.
|
|
12
|
+
*
|
|
13
|
+
* @remarks
|
|
14
|
+
*
|
|
15
|
+
* This component must be called in one of two ways: with a name and an optional
|
|
16
|
+
* refkey, or else passing in the symbol. When called with a name and refkey, a
|
|
17
|
+
* symbol will be created in the current scope (provided by
|
|
18
|
+
* {@link ScopeContext}) with that name and refkey. If a refkey is not provided,
|
|
19
|
+
* `refkey(props.name)` is used.
|
|
20
|
+
*
|
|
21
|
+
* When called with a symbol, that symbol is merely exposed via
|
|
22
|
+
* {@link DeclarationContext }. It is assumed that the caller of this component
|
|
23
|
+
* has created the symbol with the `createSymbol` API on the
|
|
24
|
+
* {@link BinderContext }.
|
|
25
|
+
*
|
|
26
|
+
* @see {@link BinderContext}
|
|
27
|
+
*/
|
|
28
|
+
export declare function Declaration(props: DeclarationProps): any;
|
|
29
|
+
//# sourceMappingURL=Declaration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Declaration.d.ts","sourceRoot":"","sources":["../../../src/components/Declaration.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAI5C,OAAO,EAAE,MAAM,EAAU,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,OAoBlD"}
|