@plumeria/compiler 16.2.2 → 16.2.4

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.
Files changed (2) hide show
  1. package/dist/index.js +211 -145
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -42,35 +42,72 @@ const rs = __importStar(require("@rust-gear/glob"));
42
42
  const utils_1 = require("@plumeria/utils");
43
43
  const utils_2 = require("@plumeria/utils");
44
44
  function extractStylesFromExpression(expression, ctx) {
45
+ let expr = expression;
46
+ if (ctx.localStyleAliases &&
47
+ utils_1.t.isIdentifier(expr) &&
48
+ ctx.localStyleAliases[expr.value]) {
49
+ expr = ctx.localStyleAliases[expr.value];
50
+ }
45
51
  const results = [];
46
- if (utils_1.t.isObjectExpression(expression)) {
47
- const object = (0, utils_1.objectExpressionToObject)(expression, ctx.mergedStaticTable, ctx.mergedKeyframesTable, ctx.mergedViewTransitionTable, ctx.mergedCreateThemeHashTable, ctx.scannedTables.createThemeObjectTable, ctx.mergedCreateTable, ctx.mergedCreateStaticHashTable, ctx.scannedTables.createStaticObjectTable, ctx.mergedVariantsTable);
52
+ if (utils_1.t.isObjectExpression(expr)) {
53
+ const object = (0, utils_1.objectExpressionToObject)(expr, ctx.mergedStaticTable, ctx.mergedKeyframesTable, ctx.mergedViewTransitionTable, ctx.mergedCreateThemeHashTable, ctx.scannedTables.createThemeObjectTable, ctx.mergedCreateTable, ctx.mergedCreateStaticHashTable, ctx.scannedTables.createStaticObjectTable, ctx.mergedVariantsTable);
48
54
  if (object)
49
55
  results.push(object);
50
56
  }
51
- else if (utils_1.t.isMemberExpression(expression)) {
52
- const memberExpr = expression;
53
- if (utils_1.t.isIdentifier(memberExpr.object) &&
54
- utils_1.t.isIdentifier(memberExpr.property)) {
57
+ else if (utils_1.t.isMemberExpression(expr)) {
58
+ const memberExpr = expr;
59
+ if (utils_1.t.isIdentifier(memberExpr.object)) {
55
60
  const variableName = memberExpr.object.value;
56
- const propertyName = memberExpr.property.value;
57
- const styleSet = ctx.localCreateStyles[variableName];
58
- if (styleSet && styleSet.obj[propertyName]) {
59
- results.push(styleSet.obj[propertyName]);
61
+ if (utils_1.t.isIdentifier(memberExpr.property)) {
62
+ const propertyName = memberExpr.property.value;
63
+ const styleSet = ctx.localCreateStyles[variableName];
64
+ if (styleSet && styleSet.obj[propertyName]) {
65
+ results.push(styleSet.obj[propertyName]);
66
+ }
67
+ else {
68
+ const hash = ctx.mergedCreateTable[variableName];
69
+ if (hash) {
70
+ const object = ctx.scannedTables.createObjectTable[hash];
71
+ if (object && object[propertyName]) {
72
+ results.push(object[propertyName]);
73
+ }
74
+ }
75
+ }
60
76
  }
61
- else {
62
- const hash = ctx.mergedCreateTable[variableName];
63
- if (hash) {
64
- const object = ctx.scannedTables.createObjectTable[hash];
65
- if (object && object[propertyName]) {
66
- results.push(object[propertyName]);
77
+ else if (memberExpr.property.type === 'Computed') {
78
+ const computedProp = memberExpr.property;
79
+ const innerExpr = computedProp.expression;
80
+ let styleObj;
81
+ const styleSet = ctx.localCreateStyles[variableName];
82
+ if (styleSet) {
83
+ styleObj = styleSet.obj;
84
+ }
85
+ else {
86
+ const hash = ctx.mergedCreateTable[variableName];
87
+ if (hash) {
88
+ styleObj = ctx.scannedTables.createObjectTable[hash];
89
+ }
90
+ }
91
+ if (styleObj) {
92
+ if (utils_1.t.isStringLiteral(innerExpr)) {
93
+ const key = innerExpr.value;
94
+ if (styleObj[key]) {
95
+ results.push(styleObj[key]);
96
+ }
97
+ }
98
+ else {
99
+ Object.values(styleObj).forEach((style) => {
100
+ if (style && typeof style === 'object') {
101
+ results.push(style);
102
+ }
103
+ });
67
104
  }
68
105
  }
69
106
  }
70
107
  }
71
108
  }
72
- else if (utils_1.t.isIdentifier(expression)) {
73
- const identifier = expression;
109
+ else if (utils_1.t.isIdentifier(expr)) {
110
+ const identifier = expr;
74
111
  const object = ctx.localCreateStyles[identifier.value];
75
112
  if (object)
76
113
  results.push(object.obj);
@@ -83,19 +120,19 @@ function extractStylesFromExpression(expression, ctx) {
83
120
  }
84
121
  }
85
122
  }
86
- else if (utils_1.t.isConditionalExpression(expression)) {
87
- const condExpr = expression;
123
+ else if (utils_1.t.isConditionalExpression(expr)) {
124
+ const condExpr = expr;
88
125
  results.push(...extractStylesFromExpression(condExpr.consequent, ctx));
89
126
  results.push(...extractStylesFromExpression(condExpr.alternate, ctx));
90
127
  }
91
- else if (utils_1.t.isBinaryExpression(expression) &&
92
- ['&&', '||', '??'].includes(expression.operator)) {
93
- const binaryExpr = expression;
128
+ else if (utils_1.t.isBinaryExpression(expr) &&
129
+ ['&&', '||', '??'].includes(expr.operator)) {
130
+ const binaryExpr = expr;
94
131
  results.push(...extractStylesFromExpression(binaryExpr.left, ctx));
95
132
  results.push(...extractStylesFromExpression(binaryExpr.right, ctx));
96
133
  }
97
- else if (expression.type === 'ParenthesisExpression') {
98
- const parenExpr = expression;
134
+ else if (expr.type === 'ParenthesisExpression') {
135
+ const parenExpr = expr;
99
136
  results.push(...extractStylesFromExpression(parenExpr.expression, ctx));
100
137
  }
101
138
  return results;
@@ -131,6 +168,7 @@ function compileCSS(options) {
131
168
  const createStaticImportMap = {};
132
169
  const plumeriaAliases = {};
133
170
  const localImports = {};
171
+ const localStyleAliases = {};
134
172
  (0, utils_1.traverse)(ast, {
135
173
  ImportDeclaration({ node }) {
136
174
  const sourcePath = node.source.value;
@@ -153,12 +191,20 @@ function compileCSS(options) {
153
191
  const actualPath = (0, utils_1.resolveImportPath)(sourcePath, resourcePath);
154
192
  if (actualPath) {
155
193
  node.specifiers.forEach((specifier) => {
156
- if (specifier.type === 'ImportSpecifier') {
157
- const importedName = specifier.imported
158
- ? specifier.imported.value
159
- : specifier.local.value;
194
+ if (specifier.type === 'ImportSpecifier' ||
195
+ specifier.type === 'ImportDefaultSpecifier') {
196
+ const importedName = specifier.type === 'ImportDefaultSpecifier'
197
+ ? 'default'
198
+ : specifier.imported
199
+ ? specifier.imported.value
200
+ : specifier.local.value;
160
201
  const localName = specifier.local.value;
161
- const uniqueKey = `${actualPath}-${importedName}`;
202
+ let resolvedKey = `${actualPath}-${importedName}`;
203
+ const resolved = (0, utils_1.resolveExport)(actualPath, importedName);
204
+ if (resolved) {
205
+ resolvedKey = `${resolved.filePath}-${resolved.localName}`;
206
+ }
207
+ const uniqueKey = resolvedKey;
162
208
  localImports[localName] = { actualPath, importedName };
163
209
  if (scannedTables.staticTable[uniqueKey])
164
210
  importMap[localName] = scannedTables.staticTable[uniqueKey];
@@ -278,6 +324,7 @@ function compileCSS(options) {
278
324
  localCreateStyles: {},
279
325
  sourceBuffer,
280
326
  baseByteOffset,
327
+ localStyleAliases,
281
328
  };
282
329
  const componentParamNames = new Set();
283
330
  for (const node of ast.body) {
@@ -316,6 +363,12 @@ function compileCSS(options) {
316
363
  records.forEach((r) => extractedSheets.push(r.sheet));
317
364
  };
318
365
  const extractAndProcessConditionals = (args, isStyleName = false) => {
366
+ args.forEach((arg) => {
367
+ if (utils_1.t.isIdentifier(arg.expression) &&
368
+ localStyleAliases[arg.expression.value]) {
369
+ arg.expression = localStyleAliases[arg.expression.value];
370
+ }
371
+ });
319
372
  const conditionals = [];
320
373
  let groupIdCounter = 0;
321
374
  let baseStyle = {};
@@ -690,128 +743,138 @@ function compileCSS(options) {
690
743
  };
691
744
  (0, utils_1.traverse)(ast, {
692
745
  VariableDeclarator({ node }) {
693
- if (utils_1.t.isIdentifier(node.id) &&
694
- node.init &&
695
- utils_1.t.isCallExpression(node.init)) {
696
- const callee = node.init.callee;
697
- let pName;
698
- if (utils_1.t.isMemberExpression(callee) &&
699
- utils_1.t.isIdentifier(callee.object) &&
700
- utils_1.t.isIdentifier(callee.property)) {
701
- if (plumeriaAliases[callee.object.value] === 'NAMESPACE')
702
- pName = callee.property.value;
703
- }
704
- else if (utils_1.t.isIdentifier(callee) && plumeriaAliases[callee.value]) {
705
- pName = plumeriaAliases[callee.value];
706
- }
707
- const isTheme = pName === 'createTheme';
708
- if (pName &&
709
- node.init.arguments.length > 0 &&
710
- ((!isTheme &&
711
- node.init.arguments.length === 1 &&
712
- utils_1.t.isObjectExpression(node.init.arguments[0].expression)) ||
713
- (isTheme &&
714
- node.init.arguments.length >= 2 &&
715
- utils_1.t.isObjectExpression(node.init.arguments[1].expression)))) {
716
- const arg = isTheme
717
- ? node.init.arguments[1].expression
718
- : node.init.arguments[0].expression;
719
- const resolveVariable = (name) => ctx.localCreateStyles[name]?.obj ||
720
- (ctx.mergedCreateThemeHashTable[name]
721
- ? ctx.scannedTables.createAtomicMapTable[ctx.mergedCreateThemeHashTable[name]]
722
- : undefined);
723
- if (pName === 'create') {
724
- const obj = (0, utils_1.objectExpressionToObject)(arg, ctx.mergedStaticTable, ctx.mergedKeyframesTable, ctx.mergedViewTransitionTable, ctx.mergedCreateThemeHashTable, ctx.scannedTables.createThemeObjectTable, ctx.mergedCreateTable, ctx.mergedCreateStaticHashTable, ctx.scannedTables.createStaticObjectTable, ctx.mergedVariantsTable, resolveVariable);
725
- if (obj) {
726
- const styleFunctions = {};
727
- arg.properties.forEach((prop) => {
728
- if (prop.type !== 'KeyValueProperty' ||
729
- prop.key.type !== 'Identifier')
730
- return;
731
- const func = prop.value;
732
- if (func.type !== 'ArrowFunctionExpression' &&
733
- func.type !== 'FunctionExpression')
734
- return;
735
- const params = func.params.map((p) => {
736
- if (utils_1.t.isIdentifier(p))
737
- return p.value;
738
- if (typeof p === 'object' &&
739
- p !== null &&
740
- 'pat' in p &&
741
- utils_1.t.isIdentifier(p.pat))
742
- return p.pat.value;
743
- return 'arg';
744
- });
745
- let actualBody = func.body;
746
- if (actualBody?.type === 'ParenthesisExpression')
747
- actualBody = actualBody.expression;
748
- if (actualBody?.type === 'BlockStatement') {
749
- const first = actualBody.stmts?.[0];
750
- if (first?.type === 'ReturnStatement')
751
- actualBody = first.argument;
746
+ if (utils_1.t.isIdentifier(node.id) && node.init) {
747
+ const init = node.init;
748
+ if (utils_1.t.isCallExpression(init)) {
749
+ const callee = init.callee;
750
+ let pName;
751
+ if (utils_1.t.isMemberExpression(callee) &&
752
+ utils_1.t.isIdentifier(callee.object) &&
753
+ utils_1.t.isIdentifier(callee.property)) {
754
+ if (plumeriaAliases[callee.object.value] === 'NAMESPACE')
755
+ pName = callee.property.value;
756
+ }
757
+ else if (utils_1.t.isIdentifier(callee) &&
758
+ plumeriaAliases[callee.value]) {
759
+ pName = plumeriaAliases[callee.value];
760
+ }
761
+ const isTheme = pName === 'createTheme';
762
+ if (pName &&
763
+ init.arguments.length > 0 &&
764
+ ((!isTheme &&
765
+ init.arguments.length === 1 &&
766
+ utils_1.t.isObjectExpression(init.arguments[0].expression)) ||
767
+ (isTheme &&
768
+ init.arguments.length >= 2 &&
769
+ utils_1.t.isObjectExpression(init.arguments[1].expression)))) {
770
+ const arg = isTheme
771
+ ? init.arguments[1].expression
772
+ : init.arguments[0].expression;
773
+ const resolveVariable = (name) => ctx.localCreateStyles[name]?.obj ||
774
+ (ctx.mergedCreateThemeHashTable[name]
775
+ ? ctx.scannedTables.createAtomicMapTable[ctx.mergedCreateThemeHashTable[name]]
776
+ : undefined);
777
+ if (pName === 'create') {
778
+ const obj = (0, utils_1.objectExpressionToObject)(arg, ctx.mergedStaticTable, ctx.mergedKeyframesTable, ctx.mergedViewTransitionTable, ctx.mergedCreateThemeHashTable, ctx.scannedTables.createThemeObjectTable, ctx.mergedCreateTable, ctx.mergedCreateStaticHashTable, ctx.scannedTables.createStaticObjectTable, ctx.mergedVariantsTable, resolveVariable);
779
+ if (obj) {
780
+ const styleFunctions = {};
781
+ arg.properties.forEach((prop) => {
782
+ if (prop.type !== 'KeyValueProperty' ||
783
+ prop.key.type !== 'Identifier')
784
+ return;
785
+ const func = prop.value;
786
+ if (func.type !== 'ArrowFunctionExpression' &&
787
+ func.type !== 'FunctionExpression')
788
+ return;
789
+ const params = func.params.map((p) => {
790
+ if (utils_1.t.isIdentifier(p))
791
+ return p.value;
792
+ if (typeof p === 'object' &&
793
+ p !== null &&
794
+ 'pat' in p &&
795
+ utils_1.t.isIdentifier(p.pat))
796
+ return p.pat.value;
797
+ return 'arg';
798
+ });
799
+ let actualBody = func.body;
752
800
  if (actualBody?.type === 'ParenthesisExpression')
753
801
  actualBody = actualBody.expression;
754
- }
755
- if (actualBody && actualBody.type === 'ObjectExpression') {
756
- styleFunctions[prop.key.value] = {
757
- params,
758
- body: actualBody,
759
- };
760
- }
761
- });
762
- ctx.localCreateStyles[node.id.value] = {
763
- type: 'create',
764
- obj,
765
- functions: styleFunctions,
766
- };
802
+ if (actualBody?.type === 'BlockStatement') {
803
+ const first = actualBody.stmts?.[0];
804
+ if (first?.type === 'ReturnStatement')
805
+ actualBody = first.argument;
806
+ if (actualBody?.type === 'ParenthesisExpression')
807
+ actualBody = actualBody.expression;
808
+ }
809
+ if (actualBody && actualBody.type === 'ObjectExpression') {
810
+ styleFunctions[prop.key.value] = {
811
+ params,
812
+ body: actualBody,
813
+ };
814
+ }
815
+ });
816
+ ctx.localCreateStyles[node.id.value] = {
817
+ type: 'create',
818
+ obj,
819
+ functions: styleFunctions,
820
+ };
821
+ }
767
822
  }
768
- }
769
- else if (pName === 'variants') {
770
- const obj = (0, utils_1.objectExpressionToObject)(arg, ctx.mergedStaticTable, ctx.mergedKeyframesTable, ctx.mergedViewTransitionTable, ctx.mergedCreateThemeHashTable, ctx.scannedTables.createThemeObjectTable, ctx.mergedCreateTable, ctx.mergedCreateStaticHashTable, ctx.scannedTables.createStaticObjectTable, ctx.mergedVariantsTable, resolveVariable);
771
- if (obj) {
772
- const { hashMap } = (0, utils_1.processVariants)(obj);
823
+ else if (pName === 'variants') {
824
+ const obj = (0, utils_1.objectExpressionToObject)(arg, ctx.mergedStaticTable, ctx.mergedKeyframesTable, ctx.mergedViewTransitionTable, ctx.mergedCreateThemeHashTable, ctx.scannedTables.createThemeObjectTable, ctx.mergedCreateTable, ctx.mergedCreateStaticHashTable, ctx.scannedTables.createStaticObjectTable, ctx.mergedVariantsTable, resolveVariable);
825
+ if (obj) {
826
+ const { hashMap } = (0, utils_1.processVariants)(obj);
827
+ ctx.localCreateStyles[node.id.value] = {
828
+ type: 'variant',
829
+ obj,
830
+ hashMap,
831
+ };
832
+ }
833
+ }
834
+ else if (pName === 'createTheme') {
835
+ let selector = '';
836
+ const selectorExpr = init.arguments[0].expression;
837
+ if (utils_1.t.isStringLiteral(selectorExpr)) {
838
+ selector = selectorExpr.value;
839
+ }
840
+ const obj = (0, utils_1.objectExpressionToObject)(arg, ctx.mergedStaticTable, ctx.mergedKeyframesTable, ctx.mergedViewTransitionTable, ctx.mergedCreateThemeHashTable, ctx.scannedTables.createThemeObjectTable, ctx.mergedCreateTable, ctx.mergedCreateStaticHashTable, ctx.scannedTables.createStaticObjectTable, ctx.mergedVariantsTable);
841
+ const hash = (0, zss_engine_1.genBase36Hash)({ _themeSelector: selector, ...obj }, 1, 8);
842
+ const uKey = `${resourcePath}-${node.id.value}`;
843
+ ctx.scannedTables.createThemeHashTable[uKey] = hash;
844
+ ctx.scannedTables.createThemeObjectTable[hash] = obj;
845
+ if (ctx.scannedTables.createThemeSelectorTable) {
846
+ ctx.scannedTables.createThemeSelectorTable[hash] = selector;
847
+ }
848
+ const themeHashMap = {};
849
+ for (const [key, value] of Object.entries(obj)) {
850
+ const cssVarName = (0, zss_engine_1.camelToKebabCase)(key);
851
+ const atomicHash = (0, zss_engine_1.genBase36Hash)({ [key]: value }, 1, 8);
852
+ themeHashMap[key] = `var(--${atomicHash}-${cssVarName})`;
853
+ }
854
+ ctx.scannedTables.createAtomicMapTable[hash] = themeHashMap;
773
855
  ctx.localCreateStyles[node.id.value] = {
774
- type: 'variant',
775
- obj,
776
- hashMap,
856
+ type: 'create',
857
+ obj: ctx.scannedTables.createAtomicMapTable[hash],
777
858
  };
778
859
  }
779
- }
780
- else if (pName === 'createTheme') {
781
- let selector = '';
782
- const selectorExpr = node.init.arguments[0].expression;
783
- if (utils_1.t.isStringLiteral(selectorExpr)) {
784
- selector = selectorExpr.value;
785
- }
786
- const obj = (0, utils_1.objectExpressionToObject)(arg, ctx.mergedStaticTable, ctx.mergedKeyframesTable, ctx.mergedViewTransitionTable, ctx.mergedCreateThemeHashTable, ctx.scannedTables.createThemeObjectTable, ctx.mergedCreateTable, ctx.mergedCreateStaticHashTable, ctx.scannedTables.createStaticObjectTable, ctx.mergedVariantsTable);
787
- const hash = (0, zss_engine_1.genBase36Hash)({ _themeSelector: selector, ...obj }, 1, 8);
788
- const uKey = `${resourcePath}-${node.id.value}`;
789
- ctx.scannedTables.createThemeHashTable[uKey] = hash;
790
- ctx.scannedTables.createThemeObjectTable[hash] = obj;
791
- if (ctx.scannedTables.createThemeSelectorTable) {
792
- ctx.scannedTables.createThemeSelectorTable[hash] = selector;
793
- }
794
- const themeHashMap = {};
795
- for (const [key, value] of Object.entries(obj)) {
796
- const cssVarName = (0, zss_engine_1.camelToKebabCase)(key);
797
- const atomicHash = (0, zss_engine_1.genBase36Hash)({ [key]: value }, 1, 8);
798
- themeHashMap[key] = `var(--${atomicHash}-${cssVarName})`;
860
+ else if (pName === 'createStatic') {
861
+ const obj = (0, utils_1.objectExpressionToObject)(arg, ctx.mergedStaticTable, ctx.mergedKeyframesTable, ctx.mergedViewTransitionTable, ctx.mergedCreateThemeHashTable, ctx.scannedTables.createThemeObjectTable, ctx.mergedCreateTable, ctx.mergedCreateStaticHashTable, ctx.scannedTables.createStaticObjectTable, ctx.mergedVariantsTable);
862
+ if (obj) {
863
+ const hash = (0, zss_engine_1.genBase36Hash)(obj, 1, 8);
864
+ const uKey = `${resourcePath}-${node.id.value}`;
865
+ ctx.scannedTables.createStaticHashTable[uKey] = hash;
866
+ ctx.scannedTables.createStaticObjectTable[hash] = obj;
867
+ ctx.mergedCreateStaticHashTable[node.id.value] = hash;
868
+ }
799
869
  }
800
- ctx.scannedTables.createAtomicMapTable[hash] = themeHashMap;
801
- ctx.localCreateStyles[node.id.value] = {
802
- type: 'create',
803
- obj: ctx.scannedTables.createAtomicMapTable[hash],
804
- };
805
870
  }
806
- else if (pName === 'createStatic') {
807
- const obj = (0, utils_1.objectExpressionToObject)(arg, ctx.mergedStaticTable, ctx.mergedKeyframesTable, ctx.mergedViewTransitionTable, ctx.mergedCreateThemeHashTable, ctx.scannedTables.createThemeObjectTable, ctx.mergedCreateTable, ctx.mergedCreateStaticHashTable, ctx.scannedTables.createStaticObjectTable, ctx.mergedVariantsTable);
808
- if (obj) {
809
- const hash = (0, zss_engine_1.genBase36Hash)(obj, 1, 8);
810
- const uKey = `${resourcePath}-${node.id.value}`;
811
- ctx.scannedTables.createStaticHashTable[uKey] = hash;
812
- ctx.scannedTables.createStaticObjectTable[hash] = obj;
813
- ctx.mergedCreateStaticHashTable[node.id.value] = hash;
814
- }
871
+ }
872
+ else if (utils_1.t.isMemberExpression(init) &&
873
+ utils_1.t.isIdentifier(init.object)) {
874
+ const objName = init.object.value;
875
+ if (ctx.localCreateStyles[objName] !== undefined ||
876
+ ctx.mergedCreateTable[objName] !== undefined) {
877
+ localStyleAliases[node.id.value] = init;
815
878
  }
816
879
  }
817
880
  }
@@ -839,7 +902,10 @@ function compileCSS(options) {
839
902
  if (node.value &&
840
903
  node.value.type === 'JSXExpressionContainer' &&
841
904
  node.value.expression.type !== 'JSXEmptyExpression') {
842
- const expr = node.value.expression;
905
+ let expr = node.value.expression;
906
+ if (utils_1.t.isIdentifier(expr) && localStyleAliases[expr.value]) {
907
+ expr = localStyleAliases[expr.value];
908
+ }
843
909
  const styles = extractStylesFromExpression(expr, ctx);
844
910
  styles.forEach(processStyle);
845
911
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plumeria/compiler",
3
- "version": "16.2.2",
3
+ "version": "16.2.4",
4
4
  "description": "Plumeria swc based compiler for statically extracting css",
5
5
  "author": "Refirst 11",
6
6
  "license": "MIT",
@@ -21,7 +21,7 @@
21
21
  "dist/"
22
22
  ],
23
23
  "dependencies": {
24
- "@plumeria/utils": "^16.2.2"
24
+ "@plumeria/utils": "^16.2.4"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@rust-gear/glob": "1.0.0",