syntaxase 0.0.0 → 0.1.1
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 +64 -3
- package/binding.js +63 -0
- package/index.d.ts +39 -0
- package/index.js +25 -1
- package/options.js +206 -0
- package/package.json +36 -8
package/README.md
CHANGED
|
@@ -1,6 +1,67 @@
|
|
|
1
1
|
# Syntaxase
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
> Work in progress. This package is not ready for use yet.
|
|
3
|
+
Lightning-fast type stripping and JSX lowering.
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
Named like an enzyme, Syntaxase removes erasable TypeScript syntax and lowers
|
|
6
|
+
supported TypeScript and JSX runtime constructs.
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
npm install syntaxase
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
```js
|
|
17
|
+
import { stripTypes, transform } from "syntaxase";
|
|
18
|
+
|
|
19
|
+
const stripped = stripTypes(`
|
|
20
|
+
interface User { name: string }
|
|
21
|
+
const user: User = { name: "Ada" };
|
|
22
|
+
`);
|
|
23
|
+
|
|
24
|
+
const strippedTsx = stripTypes(`const view = <Card<User> user={user as User} />;`, { lang: "tsx" });
|
|
25
|
+
|
|
26
|
+
const transformed = transform(`const view: JSX.Element = <h1>Hello</h1>;`, { jsx: true });
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## TypeScript syntax
|
|
30
|
+
|
|
31
|
+
`stripTypes` erases fixed-width TypeScript syntax while preserving source
|
|
32
|
+
length and line layout. Use it with source accepted by TypeScript's
|
|
33
|
+
[`erasableSyntaxOnly`](https://www.typescriptlang.org/tsconfig/erasableSyntaxOnly.html)
|
|
34
|
+
option. It does not validate that constraint: runtime TypeScript constructs such
|
|
35
|
+
as enums may remain unchanged or lose TypeScript-only modifiers without gaining
|
|
36
|
+
the JavaScript code needed to preserve their semantics.
|
|
37
|
+
|
|
38
|
+
By default, `stripTypes` parses TypeScript without JSX. Pass `{ lang: "tsx" }`
|
|
39
|
+
to strip TypeScript syntax from TSX while leaving JSX unchanged.
|
|
40
|
+
|
|
41
|
+
`transform` additionally lowers supported runtime TypeScript constructs and,
|
|
42
|
+
when enabled, JSX.
|
|
43
|
+
|
|
44
|
+
## JSX options
|
|
45
|
+
|
|
46
|
+
| `options.jsx` | Behavior | Defaults and supported fields |
|
|
47
|
+
| -------------------------- | ------------------------------------------------- | --------------------------------------------------------------- |
|
|
48
|
+
| omitted or `false` | Parse TypeScript without JSX | None |
|
|
49
|
+
| `true` | Lower JSX with the automatic production runtime | `importSource: "react"` |
|
|
50
|
+
| `{ runtime: "automatic" }` | Lower JSX with the automatic runtime | `development: false`, `importSource: "react"` |
|
|
51
|
+
| `{ runtime: "classic" }` | Lower JSX to factory calls without adding imports | `pragma: "React.createElement"`, `pragmaFrag: "React.Fragment"` |
|
|
52
|
+
| `{ runtime: "preserve" }` | Parse JSX and leave it in the output | No additional fields |
|
|
53
|
+
|
|
54
|
+
Automatic development mode imports `jsxDEV` from
|
|
55
|
+
`<importSource>/jsx-dev-runtime`; production mode imports `jsx` and `jsxs` from
|
|
56
|
+
`<importSource>/jsx-runtime`. The default therefore requires React's JSX runtime
|
|
57
|
+
to be installed. Set `importSource` for another compatible runtime.
|
|
58
|
+
|
|
59
|
+
`development` is supported only by the automatic runtime. `pragma` and
|
|
60
|
+
`pragmaFrag` are supported only by the classic runtime.
|
|
61
|
+
|
|
62
|
+
## Diagnostics and errors
|
|
63
|
+
|
|
64
|
+
The JavaScript API returns transformed strings only. Parser recovery diagnostics
|
|
65
|
+
are not exposed, so malformed input can still produce output. Use a TypeScript
|
|
66
|
+
checker or another parser when validation is required. Invalid API arguments and
|
|
67
|
+
internal transform failures throw.
|
package/binding.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { execSync } from 'node:child_process';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { dirname, join } from 'node:path';
|
|
6
|
+
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const { platform, arch } = process;
|
|
10
|
+
|
|
11
|
+
const isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-');
|
|
12
|
+
|
|
13
|
+
function isMusl() {
|
|
14
|
+
if (platform !== 'linux') return false;
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
if (readFileSync('/usr/bin/ldd', 'utf-8').includes('musl')) return true;
|
|
18
|
+
} catch {}
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const report = typeof process.report?.getReport === 'function'
|
|
22
|
+
? process.report.getReport()
|
|
23
|
+
: null;
|
|
24
|
+
if (report) {
|
|
25
|
+
const header = typeof report === 'string' ? JSON.parse(report).header : report.header;
|
|
26
|
+
if (header?.glibcVersionRuntime) return false;
|
|
27
|
+
if (Array.isArray(report.sharedObjects) && report.sharedObjects.some(isFileMusl)) return true;
|
|
28
|
+
}
|
|
29
|
+
} catch {}
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
return execSync('ldd --version', { encoding: 'utf8' }).includes('musl');
|
|
33
|
+
} catch {}
|
|
34
|
+
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function loadBinding() {
|
|
39
|
+
const errors = [];
|
|
40
|
+
const libc = platform === 'linux' ? (isMusl() ? '-musl' : '-gnu') : '';
|
|
41
|
+
const suffix = `${platform}-${arch}${libc}`;
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
return require(join(__dirname, '@syntaxase', 'binding-' + suffix, 'syntaxase.node'));
|
|
45
|
+
} catch (e) {
|
|
46
|
+
errors.push(e);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
return require('@syntaxase/binding-' + suffix + '/syntaxase.node');
|
|
51
|
+
} catch (e) {
|
|
52
|
+
errors.push(e);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
throw new Error(
|
|
56
|
+
`Failed to load native binding for ${platform}-${arch}.\n` +
|
|
57
|
+
`If this persists, try removing node_modules and reinstalling.\n` +
|
|
58
|
+
errors.map(e => ` - ${e.message}`).join('\n'),
|
|
59
|
+
{ cause: errors[errors.length - 1] }
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export default loadBinding();
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** JSX lowering strategy used by every Syntaxase JavaScript package. */
|
|
2
|
+
export type JSXRuntime = "automatic" | "classic" | "preserve";
|
|
3
|
+
|
|
4
|
+
export type JSXConfig =
|
|
5
|
+
| {
|
|
6
|
+
runtime?: "automatic";
|
|
7
|
+
development?: boolean;
|
|
8
|
+
importSource?: string;
|
|
9
|
+
pragma?: never;
|
|
10
|
+
pragmaFrag?: never;
|
|
11
|
+
}
|
|
12
|
+
| {
|
|
13
|
+
runtime: "classic";
|
|
14
|
+
development?: never;
|
|
15
|
+
importSource?: never;
|
|
16
|
+
pragma?: string;
|
|
17
|
+
pragmaFrag?: string;
|
|
18
|
+
}
|
|
19
|
+
| {
|
|
20
|
+
runtime: "preserve";
|
|
21
|
+
development?: never;
|
|
22
|
+
importSource?: never;
|
|
23
|
+
pragma?: never;
|
|
24
|
+
pragmaFrag?: never;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export interface TransformOptions {
|
|
28
|
+
jsx?: boolean | JSXConfig;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface StripTypesOptions {
|
|
32
|
+
lang?: "ts" | "tsx";
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Transform erasable TypeScript and supported runtime TypeScript/JSX syntax to JavaScript. */
|
|
36
|
+
export function transform(sourceText: string, options?: TransformOptions): string;
|
|
37
|
+
|
|
38
|
+
/** Erase only fixed-width TypeScript syntax while preserving source length and line layout. */
|
|
39
|
+
export function stripTypes(sourceText: string, options?: StripTypesOptions): string;
|
package/index.js
CHANGED
|
@@ -1 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
import binding from "./binding.js";
|
|
2
|
+
import { assertSourceText, resolveStripTypesOptions, resolveTransformOptions } from "./options.js";
|
|
3
|
+
|
|
4
|
+
const encoder = new TextEncoder();
|
|
5
|
+
const empty = new Uint8Array();
|
|
6
|
+
|
|
7
|
+
/** Transform erasable TypeScript and supported runtime TypeScript/JSX syntax to JavaScript. */
|
|
8
|
+
export function transform(sourceText, options = {}) {
|
|
9
|
+
assertSourceText(sourceText);
|
|
10
|
+
const normalized = resolveTransformOptions(options);
|
|
11
|
+
return invoke(sourceText, normalized.mode, normalized.first, normalized.second);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Erase only fixed-width TypeScript syntax while preserving source length and line layout. */
|
|
15
|
+
export function stripTypes(sourceText, options = {}) {
|
|
16
|
+
assertSourceText(sourceText);
|
|
17
|
+
return invoke(sourceText, resolveStripTypesOptions(options), "", "");
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function invoke(sourceText, mode, firstOption, secondOption) {
|
|
21
|
+
const source = encoder.encode(sourceText);
|
|
22
|
+
const first = firstOption.length === 0 ? empty : encoder.encode(firstOption);
|
|
23
|
+
const second = secondOption.length === 0 ? empty : encoder.encode(secondOption);
|
|
24
|
+
return binding.run(source, mode, first, second);
|
|
25
|
+
}
|
package/options.js
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
// Canonical option normalization shared by all JavaScript package boundaries.
|
|
2
|
+
const MODE_TRANSFORM = 0;
|
|
3
|
+
const MODE_AUTOMATIC = 1;
|
|
4
|
+
const MODE_AUTOMATIC_DEVELOPMENT = 2;
|
|
5
|
+
const MODE_CLASSIC = 3;
|
|
6
|
+
const MODE_PRESERVE = 4;
|
|
7
|
+
export const MODE_STRIP_TYPES = 5;
|
|
8
|
+
export const MODE_STRIP_TYPES_TSX = 6;
|
|
9
|
+
|
|
10
|
+
const IDENTIFIER_NAME = /^[$_\p{ID_Start}][$\u200c\u200d_\p{ID_Continue}]*$/u;
|
|
11
|
+
const RESERVED_IDENTIFIER_REFERENCES = new Set([
|
|
12
|
+
"await",
|
|
13
|
+
"break",
|
|
14
|
+
"case",
|
|
15
|
+
"catch",
|
|
16
|
+
"class",
|
|
17
|
+
"const",
|
|
18
|
+
"continue",
|
|
19
|
+
"debugger",
|
|
20
|
+
"default",
|
|
21
|
+
"delete",
|
|
22
|
+
"do",
|
|
23
|
+
"else",
|
|
24
|
+
"enum",
|
|
25
|
+
"export",
|
|
26
|
+
"extends",
|
|
27
|
+
"false",
|
|
28
|
+
"finally",
|
|
29
|
+
"for",
|
|
30
|
+
"function",
|
|
31
|
+
"if",
|
|
32
|
+
"implements",
|
|
33
|
+
"import",
|
|
34
|
+
"in",
|
|
35
|
+
"instanceof",
|
|
36
|
+
"interface",
|
|
37
|
+
"let",
|
|
38
|
+
"new",
|
|
39
|
+
"null",
|
|
40
|
+
"package",
|
|
41
|
+
"private",
|
|
42
|
+
"protected",
|
|
43
|
+
"public",
|
|
44
|
+
"return",
|
|
45
|
+
"static",
|
|
46
|
+
"super",
|
|
47
|
+
"switch",
|
|
48
|
+
"this",
|
|
49
|
+
"throw",
|
|
50
|
+
"true",
|
|
51
|
+
"try",
|
|
52
|
+
"typeof",
|
|
53
|
+
"var",
|
|
54
|
+
"void",
|
|
55
|
+
"while",
|
|
56
|
+
"with",
|
|
57
|
+
"yield",
|
|
58
|
+
]);
|
|
59
|
+
const JSX_CONFIG_KEYS = new Set(["runtime", "development", "importSource", "pragma", "pragmaFrag"]);
|
|
60
|
+
const JSX_RUNTIMES = new Set(["automatic", "classic", "preserve"]);
|
|
61
|
+
|
|
62
|
+
export function assertSourceText(sourceText) {
|
|
63
|
+
if (typeof sourceText !== "string") {
|
|
64
|
+
throw new TypeError("sourceText must be a string");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function resolveTransformOptions(options) {
|
|
69
|
+
assertOptions(options);
|
|
70
|
+
return resolveJSXConfig(options.jsx);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function resolveStripTypesOptions(options) {
|
|
74
|
+
if (options === null || typeof options !== "object" || Array.isArray(options)) {
|
|
75
|
+
throw new TypeError("stripTypes options must be an object");
|
|
76
|
+
}
|
|
77
|
+
for (const key of Reflect.ownKeys(options)) {
|
|
78
|
+
if (key !== "lang") {
|
|
79
|
+
throw new TypeError(`stripTypes options contains unknown option ${String(key)}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (!Object.hasOwn(options, "lang") || options.lang === "ts") {
|
|
84
|
+
return MODE_STRIP_TYPES;
|
|
85
|
+
}
|
|
86
|
+
if (options.lang === "tsx") {
|
|
87
|
+
return MODE_STRIP_TYPES_TSX;
|
|
88
|
+
}
|
|
89
|
+
throw new TypeError('stripTypes options.lang must be "ts" or "tsx"');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function assertOptions(options) {
|
|
93
|
+
if (options === null || typeof options !== "object" || Array.isArray(options)) {
|
|
94
|
+
throw new TypeError("transform options must be an object");
|
|
95
|
+
}
|
|
96
|
+
for (const key of Reflect.ownKeys(options)) {
|
|
97
|
+
if (key !== "jsx") {
|
|
98
|
+
throw new TypeError(`transform options contains unknown option ${String(key)}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function resolveJSXConfig(value) {
|
|
104
|
+
if (value === undefined || value === false) {
|
|
105
|
+
return { mode: MODE_TRANSFORM, first: "", second: "" };
|
|
106
|
+
}
|
|
107
|
+
if (value === true) {
|
|
108
|
+
return { mode: MODE_AUTOMATIC, first: "react", second: "" };
|
|
109
|
+
}
|
|
110
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
111
|
+
throw new TypeError("transform options.jsx must be a boolean or an object");
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
assertKnownJSXKeys(value);
|
|
115
|
+
const runtime = readRuntime(value);
|
|
116
|
+
const importSource = readString(value, "importSource");
|
|
117
|
+
const pragma = readMemberExpression(value, "pragma");
|
|
118
|
+
const pragmaFrag = readMemberExpression(value, "pragmaFrag");
|
|
119
|
+
|
|
120
|
+
if (runtime === "automatic") {
|
|
121
|
+
const development = readBoolean(value, "development", false);
|
|
122
|
+
assertAbsent(value, "pragma", runtime);
|
|
123
|
+
assertAbsent(value, "pragmaFrag", runtime);
|
|
124
|
+
return {
|
|
125
|
+
mode: development ? MODE_AUTOMATIC_DEVELOPMENT : MODE_AUTOMATIC,
|
|
126
|
+
first: importSource ?? "react",
|
|
127
|
+
second: "",
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
if (runtime === "classic") {
|
|
131
|
+
assertAbsent(value, "development", runtime);
|
|
132
|
+
assertAbsent(value, "importSource", runtime);
|
|
133
|
+
return {
|
|
134
|
+
mode: MODE_CLASSIC,
|
|
135
|
+
first: pragma ?? "React.createElement",
|
|
136
|
+
second: pragmaFrag ?? "React.Fragment",
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
assertAbsent(value, "development", runtime);
|
|
141
|
+
assertAbsent(value, "importSource", runtime);
|
|
142
|
+
assertAbsent(value, "pragma", runtime);
|
|
143
|
+
assertAbsent(value, "pragmaFrag", runtime);
|
|
144
|
+
return { mode: MODE_PRESERVE, first: "", second: "" };
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function assertKnownJSXKeys(config) {
|
|
148
|
+
for (const key of Reflect.ownKeys(config)) {
|
|
149
|
+
if (typeof key !== "string" || !JSX_CONFIG_KEYS.has(key)) {
|
|
150
|
+
throw new TypeError(`transform options.jsx contains unknown option ${String(key)}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function readRuntime(config) {
|
|
156
|
+
if (!Object.hasOwn(config, "runtime")) return "automatic";
|
|
157
|
+
const runtime = config.runtime;
|
|
158
|
+
if (typeof runtime !== "string" || !JSX_RUNTIMES.has(runtime)) {
|
|
159
|
+
throw new TypeError('transform options.jsx.runtime must be "automatic", "classic", or "preserve"');
|
|
160
|
+
}
|
|
161
|
+
return runtime;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function readBoolean(config, key, defaultValue) {
|
|
165
|
+
if (!Object.hasOwn(config, key)) return defaultValue;
|
|
166
|
+
const value = config[key];
|
|
167
|
+
if (typeof value !== "boolean") {
|
|
168
|
+
throw new TypeError(`transform options.jsx.${key} must be a boolean`);
|
|
169
|
+
}
|
|
170
|
+
return value;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function readString(config, key) {
|
|
174
|
+
if (!Object.hasOwn(config, key)) return undefined;
|
|
175
|
+
const value = config[key];
|
|
176
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
177
|
+
throw new TypeError(`transform options.jsx.${key} must be a non-empty string`);
|
|
178
|
+
}
|
|
179
|
+
return value;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function readMemberExpression(config, key) {
|
|
183
|
+
if (!Object.hasOwn(config, key)) return undefined;
|
|
184
|
+
const value = config[key];
|
|
185
|
+
if (typeof value !== "string" || !isDottedMemberExpression(value)) {
|
|
186
|
+
throw new TypeError(`transform options.jsx.${key} must be an identifier or dotted member expression`);
|
|
187
|
+
}
|
|
188
|
+
return value;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function isDottedMemberExpression(value) {
|
|
192
|
+
const segments = value.split(".");
|
|
193
|
+
const root = segments[0];
|
|
194
|
+
if (root === undefined || !isIdentifierReference(root)) return false;
|
|
195
|
+
return segments.every((segment) => IDENTIFIER_NAME.test(segment));
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function isIdentifierReference(value) {
|
|
199
|
+
return IDENTIFIER_NAME.test(value) && !RESERVED_IDENTIFIER_REFERENCES.has(value);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function assertAbsent(config, key, runtime) {
|
|
203
|
+
if (Object.hasOwn(config, key)) {
|
|
204
|
+
throw new TypeError(`transform options.jsx.${String(key)} is not supported with ${runtime} runtime`);
|
|
205
|
+
}
|
|
206
|
+
}
|
package/package.json
CHANGED
|
@@ -1,20 +1,48 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "syntaxase",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Lightning-fast type stripping and JSX lowering",
|
|
5
|
+
"license": "MIT OR Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/magic-akari/syntaxase.git"
|
|
9
|
+
},
|
|
5
10
|
"type": "module",
|
|
6
|
-
"
|
|
11
|
+
"main": "index.js",
|
|
12
|
+
"types": "index.d.ts",
|
|
7
13
|
"files": [
|
|
8
|
-
"index.js"
|
|
14
|
+
"index.js",
|
|
15
|
+
"index.d.ts",
|
|
16
|
+
"binding.js",
|
|
17
|
+
"options.js"
|
|
9
18
|
],
|
|
10
|
-
"
|
|
11
|
-
"
|
|
19
|
+
"optionalDependencies": {
|
|
20
|
+
"@syntaxase/binding-linux-x64-gnu": "0.1.1",
|
|
21
|
+
"@syntaxase/binding-linux-arm64-gnu": "0.1.1",
|
|
22
|
+
"@syntaxase/binding-linux-arm-gnu": "0.1.1",
|
|
23
|
+
"@syntaxase/binding-linux-x64-musl": "0.1.1",
|
|
24
|
+
"@syntaxase/binding-linux-arm64-musl": "0.1.1",
|
|
25
|
+
"@syntaxase/binding-linux-arm-musl": "0.1.1",
|
|
26
|
+
"@syntaxase/binding-darwin-x64": "0.1.1",
|
|
27
|
+
"@syntaxase/binding-darwin-arm64": "0.1.1",
|
|
28
|
+
"@syntaxase/binding-win32-x64": "0.1.1",
|
|
29
|
+
"@syntaxase/binding-win32-arm64": "0.1.1",
|
|
30
|
+
"@syntaxase/binding-freebsd-x64": "0.1.1"
|
|
12
31
|
},
|
|
32
|
+
"author": "magic-akari <akari.ccino@gmail.com>",
|
|
33
|
+
"homepage": "https://github.com/magic-akari/syntaxase",
|
|
13
34
|
"keywords": [
|
|
14
35
|
"typescript",
|
|
36
|
+
"tsx",
|
|
15
37
|
"jsx",
|
|
16
38
|
"transformer",
|
|
17
|
-
"
|
|
39
|
+
"strip-types"
|
|
18
40
|
],
|
|
19
|
-
"
|
|
41
|
+
"publishConfig": {
|
|
42
|
+
"access": "public"
|
|
43
|
+
},
|
|
44
|
+
"funding": {
|
|
45
|
+
"type": "github",
|
|
46
|
+
"url": "https://github.com/sponsors/magic-akari"
|
|
47
|
+
}
|
|
20
48
|
}
|