Custom Elements Manifest is a file format that describes custom elements in your project.

Overview

@custom-elements-manifest

Custom Elements Manifest is a file format that describes custom elements. This format will allow tooling and IDEs to give rich information about the custom elements in a given project. You can find the repository for the specification of the schema here.

Try it out in the online playground!

Packages

Comments
  • Error: [CORE - LIT-STATIC-PROPERTIES]: Looks like you've hit an error in the core library.

    Error: [CORE - LIT-STATIC-PROPERTIES]: Looks like you've hit an error in the core library.

    NPM command: custom-elements-manifest analyze --outdir public/ --litelement --dev

    with node version 14.17.0 everything works fine, version 16.14.2 broken with error:

    TypeError: Cannot read properties of undefined (reading 'push') at mapClassMember (file:///C:/machineroom/git/ui-blueprint-webcomponent/blueprint-frontend/node_modules/@custom-elements-manifest/analyzer/src/features/analyse-phase/creators/createClass.js:242:27) at file:///C:/machineroom/git/ui-blueprint-webcomponent/blueprint-frontend/node_modules/@custom-elements-manifest/analyzer/src/features/analyse-phase/creators/createClass.js:211:35 at Array.forEach () at visitNode (file:///C:/machineroom/git/ui-blueprint-webcomponent/blueprint-frontend/node_modules/@custom-elements-manifest/analyzer/src/features/analyse-phase/creators/createClass.js:211:12) at visitNodes (C:\machineroom\git\ui-blueprint-webcomponent\blueprint-frontend\node_modules@custom-elements-manifest\analyzer\node_modules\typescript\lib\typescript.js:29004:30) at Object.forEachChild (C:\machineroom\git\ui-blueprint-webcomponent\blueprint-frontend\node_modules@custom-elements-manifest\analyzer\node_modules\typescript\lib\typescript.js:29316:21) at visitNode (file:///C:/machineroom/git/ui-blueprint-webcomponent/blueprint-frontend/node_modules/@custom-elements-manifest/analyzer/src/features/analyse-phase/creators/createClass.js:216:8) at getDefaultValuesFromConstructorVisitor (file:///C:/machineroom/git/ui-blueprint-webcomponent/blueprint-frontend/node_modules/@custom-elements-manifest/analyzer/src/features/analyse-phase/creators/createClass.js:200:3) at analyzePhase (file:///C:/machineroom/git/ui-blueprint-webcomponent/blueprint-frontend/node_modules/@custom-elements-manifest/analyzer/src/features/framework-plugins/lit/static-properties.js:75:11) at file:///C:/machineroom/git/ui-blueprint-webcomponent/blueprint-frontend/node_modules/@custom-elements-manifest/analyzer/src/create.js:104:23

    at withErrorHandling (file:///C:/machineroom/git/ui-blueprint-webcomponent/blueprint-frontend/node_modules/@custom-elements-manifest/analyzer/src/utils/index.js:67:11)
    at file:///C:/machineroom/git/ui-blueprint-webcomponent/blueprint-frontend/node_modules/@custom-elements-manifest/analyzer/src/create.js:103:7
    at Array.forEach (<anonymous>)
    at visitNode (file:///C:/machineroom/git/ui-blueprint-webcomponent/blueprint-frontend/node_modules/@custom-elements-manifest/analyzer/src/create.js:102:19)
    at visitNodes (C:\machineroom\git\ui-blueprint-webcomponent\blueprint-frontend\node_modules\@custom-elements-manifest\analyzer\node_modules\typescript\lib\typescript.js:29004:30)
    at Object.forEachChild (C:\machineroom\git\ui-blueprint-webcomponent\blueprint-frontend\node_modules\@custom-elements-manifest\analyzer\node_modules\typescript\lib\typescript.js:29241:24)
    at visitNode (file:///C:/machineroom/git/ui-blueprint-webcomponent/blueprint-frontend/node_modules/@custom-elements-manifest/analyzer/src/create.js:108:8)
    at visitNode (C:\machineroom\git\ui-blueprint-webcomponent\blueprint-frontend\node_modules\@custom-elements-manifest\analyzer\node_modules\typescript\lib\typescript.js:28995:24)
    at Object.forEachChild (C:\machineroom\git\ui-blueprint-webcomponent\blueprint-frontend\node_modules\@custom-elements-manifest\analyzer\node_modules\typescript\lib\typescript.js:29125:21)
    at visitNode (file:///C:/machineroom/git/ui-blueprint-webcomponent/blueprint-frontend/node_modules/@custom-elements-manifest/analyzer/src/create.js:108:8)
    
    opened by domoskanonos 12
  • [Feature Request: to-markdown] support `--features` flag

    [Feature Request: to-markdown] support `--features` flag

    Hi all-

    I took a look through the docs and didnt see anything like this, so I figured I'd request it.

    I think it would be really useful to support a option/flag in the to-markdown package and the CEM plugin for markdown that lets consumers decide which sections to include in the final MD output, similar to the --features option in the wca analyzer tool so that the final markdown output could be customized according to use case.

    My first question is whether or not there's currently a way to do this, as I'm trying to use the generated markdown for technical docs for my design system, but Im not a fan of the file info sections that the markdown lib currently creates. Its making me flip flop about deciding which analyzer/markdown tool to use, this one or wca. I predict that wca may end up deprecated as the push for switching to the new manifest.json format is pushed forward, so i'd rather use this one, but I definitely would like to be able to customize the output a bit more

    My second question is how similar in implementations are the two analyzers? is it a case of porting the feature over, or is there more to it because the implementations are drastically different?

    I would be down to help if i can, but i'm not that familiar with ASTs and such.

    Edit:

    Looking through, could it be as simple as how the returned array in makeModuleDoc gets filled. https://github.com/open-wc/custom-elements-manifest/blob/master/packages/to-markdown/index.js#L103

    Thanks!

    opened by michaelwarren1106 8
  • Feature Request: Pre-fill the code field in the playground on error

    Feature Request: Pre-fill the code field in the playground on error

    It would be a nice user experience if, on error, as we get provided the playground link, it would have the parameters so that the code part is pre-filled with the contents of the file that caused the error.

    This would make it easier and less cumbersome to submit bug reports.

    It would mean that we need to add the source to the withErrorHandling function, and then parse the text property of the object.

    What might make this ticket harder is if all of the use cases can't access the file responsible. But in these cases we could maybe just not generate it?

    opened by Matsuuu 8
  • Chore: Add @asdgf/cli as dev dependency

    Chore: Add @asdgf/cli as dev dependency

    Heya,

    Noticed that the project uses asdgf to test the project but didn't pack it as a dev dependency at least in the analyzer. Added the package as a dev dep

    opened by Matsuuu 6
  • Custom element tag name not contained in the manifest

    Custom element tag name not contained in the manifest

    Checklist

    • [] Did you run the analyzer with the --dev flag to get more information?
    • [] Did you create a minimal reproduction in the playground?

    Completing the items above will greatly improve triaging time of your issue.

    Expected behavior Would expect a custom element tag name to be included in the manifest. What is the reason that this is not the case?

    opened by sanjatasic 6
  • Fix: comma separater props appear in analyzer

    Fix: comma separater props appear in analyzer

    I couldn't find any formatter options, so I couldn't reformat the document to it's original form. A editorconfig or such could be useful to have a unified formatting.


    But on the topic: The actual changed code:

    https://github.com/open-wc/custom-elements-manifest/pull/97/files#diff-a543f85e041ff46cf45f93836b2e629122eff5fad168294799c5ad34b64e03c7R209-R232

    https://github.com/open-wc/custom-elements-manifest/pull/97/files#diff-d6615c9992627adb7801a4b8dd26af067750c00544779974509781650089d918R256

    There was a case in which properties of elements with a comma separated initialization in the constructor were not analyzed correctly due to their structure in the Typescript AST.

    This fix should handle it correctly now by checking if the operatortoken is a commatoken, in which case it goes a level deeper on either the left, or left and right side of the equasion


    Example AST: https://ts-ast-viewer.com/#code/MYGwhgzhAEAu0FMAesEDsAmMASAVAsgDICiICAtuvAN7TAD2aEsATgK7Cz0sAUAlNFqwAFgEsIAOlTMADi3oyAjNAC80AIQAGADRwxk6bDkKATKugAiAGIBVWxegBfJ3TbN65UhSqSMCAGaiaAg8Fv709AC0CCAWurB8ANwAUMlAA

    As you can see, the comma separator creates a one level deeper nesting for the actual BinaryExpressions, creating the need to delve deeper into the AST tree to get the actual values.


    This case arose as I was integration CEM analyzer into the devtools itself, and noticed that I was unable to correctly analyze files minified by a transpiler like Rollup

    opened by Matsuuu 6
  • customize export kinds in markdown

    customize export kinds in markdown

    What I Did

    1. Wrap Markdown name column value in backticks
    2. Separate static fields and methods from instance in markdown
    3. add exportKinds option to to-markdown and README, which lets the use replace js and custom-element-definition with strings of images by URL
    4. bump versions
    opened by bennypowers 6
  • `--outdir` file path not reflected in `package.json`

    `--outdir` file path not reflected in `package.json`

    Checklist

    • [x] Did you run the analyzer with the --dev flag to get more information?
    • [x] Did you create a minimal reproduction in the playground?

    Bug I set the output directory for my manifest file to /dist/, but it is not reflected in package.json after running cem analyze script.

    Expected behavior I expect that if I set --outdir to dist in the script, --outdir will be reflected in package.json:

    Command:

    cem analyze --globs src/foo-*.ts --litelement --outdir dist
    

    package.json:

    {
      "name": "foo-button",
      "customElements": "dist/custom-elements.json"
    }
    
    opened by juliexiong 6
  • Improved TypeScript ergonomics

    Improved TypeScript ergonomics

    This issue tracks some nice-to-have enhancements for type detection.

    The analyzer does great picking up on explicitly typed members:

    function XMixin<B extends Constructor<{ b: B }>(superclass: B) {
      return class XL<A> extends superclass {
        x: X<A> = new X<A>(this.b);
        bool: boolean = true;
      }
    }
    

    Here,

    • the mixin parameter will be correctly typed as B
    • the x field will be correctly typed as X<A>
    • the bool field will be typed as boolean

    However, it would be nice if for the following code:

    function XMixin<B extends Constructor>(superclass: B) {
      return class XL<A> extends superclass {
        x = new X<A>();
        bool = true;
      }
    }
    

    Would give:

    • the parameter as B extends Constructor<{ b: B }>
    • the x field as X<A> (even without an explicit typing)
    • the bool field as boolean (even without an explicit typing)

    I'm guessing that the TypeScript API has the chops to infer those things, given a SourceFile AST, but I haven't looked into it just yet.

    opened by bennypowers 6
  • Litelement properties initialized with an imported value does not have type or default value defined

    Litelement properties initialized with an imported value does not have type or default value defined

    Checklist

    • [x] Did you run the analyzer with the --dev flag to get more information?
    • [x] Did you create a minimal reproduction in the playground?

    Completing the items above will greatly improve triaging time of your issue.

    Expected behavior Properties of a lit component that get initialized from an imported module (here's an example) do not have a type or default value defined in the manifest (in this case it would be string and 3.5rem). This was working correctly with web-component-analyzer.

    opened by Niznikr 5
  • The outdir in the config does not seem to work

    The outdir in the config does not seem to work

    Hey team :wink:

    I tried using outdir in my custom-elements-manifest.config.mjs but the file still gets generated at the default location. Using the CLI param works.

    export default {
      globs: ['src/**/cc-*.js'],
      // Has no effect for now
      outdir: 'dist',
      plugins: [
      ],
    };
    
    good first issue 
    opened by hsablonniere 5
  • custom elements manifest analyzer creates wrong types when using an interface

    custom elements manifest analyzer creates wrong types when using an interface

    Checklist

    • [x] Did you run the analyzer with the --dev flag to get more information?
    • [ ] Did you create a minimal reproduction in the playground?

    Expected behavior We are using the custom elements manifest analyzer to create a custom-elements.json that we can use in our storybook docs. We use lit with typescript decorators and types via an interface.

    When we run our command it creates the types wrong:

    {
      "kind": "field",
      "name": "text",
      "type": {
        "text": "IButton['text']"
      },
      "attribute": "text"
    },
    

    But it should create it like this:

    {
      "kind": "field",
      "name": "text",
      "type": {
        "text": "string"
      },
      "attribute": "text"
    },
    

    Our interface:

    export interface IButton {
        text: string;
    }
    

    Our command: cem analyze --litelement --outdir "dist"

    Is there a setting or config we can use, so that the types get correctly inferred from the interface? If it is a bug, will this be fixed soon?

    Thanks!

    opened by beatgubler 0
  • [Analyzer]: Custom Events declared outside of dispatchEvent are not registered

    [Analyzer]: Custom Events declared outside of dispatchEvent are not registered

    Checklist

    • [ ] Did you run the analyzer with the --dev flag to get more information?
    • [X] Did you create a minimal reproduction in the playground?

    Completing the items above will greatly improve triaging time of your issue.

    Expected behavior

    Heya. Was testing out the event analysis on the playgrounds and noticed that events are not registered unless they are instantiated inside the dispatchEvent -method.

    Repro:

    https://custom-elements-manifest.netlify.app/?source=CmNsYXNzIE15RWxlbWVudCBleHRlbmRzIEhUTUxFbGVtZW50IHsKICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHsKICAgIHJldHVybiBbJ2Rpc2FibGVkJ107CiAgfQoKICBzZXQgZGlzYWJsZWQodmFsKSB7CiAgICB0aGlzLl9fZGlzYWJsZWQgPSB2YWw7CiAgfQogIGdldCBkaXNhYmxlZCgpIHsKICAgIHJldHVybiB0aGlzLl9fZGlzYWJsZWQ7CiAgfQoKICBmaXJlKCkgewogICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnZGlzYWJsZWQtY2hhbmdlZCcpKTsKICB9CgogIGZpcmVzVG9vKCkgewogICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnbXktY2hhbmdlZC1ldmVudCcpKTsKICB9CgogIGRvZXNOb3RGaXJlKCkgewogICAgICBjb25zdCBteUV2ID0gbmV3IEV2ZW50KCJteS1ldmVudCIpOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobXlFdik7CiAgfQoKICBkb2VzTm90RmlyZUVpdGhlcigpIHsKICAgICAgY29uc3QgbXlFdiA9IG5ldyBDdXN0b21FdmVudCgibXktb3RoZXItZXZlbnQiKTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG15RXYpOwogIH0KfQoKY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdteS1lbGVtZW50JywgTXlFbGVtZW50KTsK&library=vanilla

    As you can see, the events object only has the events declared inside the method call, and not outside of it.

    Code

    
      fire() {
        this.dispatchEvent(new Event('disabled-changed'));
      }
    
      firesToo() {
        this.dispatchEvent(new CustomEvent('my-changed-event'));
      }
    
      doesNotFire() {
          const myEv = new Event("my-event");
          this.dispatchEvent(myEv);
      }
    
      doesNotFireEither() {
          const myEv = new CustomEvent("my-other-event");
          this.dispatchEvent(myEv);
      }
    

    Output

     "events": [
                {
                  "name": "disabled-changed",
                  "type": {
                    "text": "Event"
                  }
                },
                {
                  "name": "my-changed-event",
                  "type": {
                    "text": "CustomEvent"
                  }
                }
              ]
    
    opened by Matsuuu 2
  • Found playground issue -

    Found playground issue - "@ignore" not working with Lit @property

    Playground issue

    Reproduction URL: https://custom-elements-manifest.netlify.app/?source=CmltcG9ydCB7IExpdEVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0LWVsZW1lbnQnOwoKZXhwb3J0IGNsYXNzIE15RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQgewogIC8qKiAKICAgKiBUaGlzIGlzIG15IGZvbyBwcm9wZXJ0eS4KICAgKiBAaWdub3JlCiAgICovCiAgQHByb3BlcnR5KCkKICBmb28gPSAnYmFyJzsKfQo%3D&library=litelement

    Additional information:

    I encountered this issue when working on a component with the current version of Lit (v2), though I was able to reproduce it in the playground with Lit (v1) as well. CEM analyzer crashes when I include @ignore in the JSDoc for a public property/attribute.

    It's interesting that this seems to hinge on whether the property is an attribute:

    Error:

    /** @ignore */
    @property({attribute: true})
    foo = 'bar';
    

    Not an error:

    /** @ignore */
    @property({attribute: false})
    foo = 'bar';
    
    opened by awmack 0
  • Idea: allow configuring framework plugins (how to adjust core plugin output)

    Idea: allow configuring framework plugins (how to adjust core plugin output)

    For now plugins are "all or nothing". In my case it Lit:

    {
        litelement: true,
    }
    

    Here's a case why it was not good enough for me, how I solved it and what I propose to make it more approachable:

    What was not OK with defaults for me

    I made a decision to amend my LitElements with an override of createProperty:

    @customElement('my-element')
    export class MyElement extends LitElement) {
      static override createProperty(name, options) {
        super.createProperty(name, kebabAttribute(name, options));
      }
    
      // quite a lot of properties which some are 2 or more words and
      // I didn't fancy the default policy of "just lowercase the property"
      // I also want not to express them all because it makes the bundle
      // bigger and code harder to read
    }
    
    export const kebabAttribute = (name, options) => {
      if (
        typeof name !== 'string'
        || !/[A-Z]/.test(name)
        || typeof options?.attribute === 'string'
        || options?.attribute === false
      ) {
        return options;
      }
    
      return {
        ...options,
        attribute: kebabCase(name),
      };
    }
    

    LitPlugin (obviously) does not know about this decision because decision is executed in runtime.

    What I did

    Step 1: Decompose

    + import { customElementDecoratorPlugin } from '@custom-elements-manifest/analyzer/src/features/framework-plugins/decorators/custom-element-decorator.js'
    + import { methodDenyListPlugin } from '@custom-elements-manifest/analyzer/src/features/framework-plugins/lit/method-denylist.js';
    + import { memberDenyListPlugin } from '@custom-elements-manifest/analyzer/src/features/framework-plugins/lit/member-denylist.js';
    + import { propertyDecoratorPlugin } from '@custom-elements-manifest/analyzer/src/features/framework-plugins/lit/property-decorator.js';
    + import { staticPropertiesPlugin } from '@custom-elements-manifest/analyzer/src/features/framework-plugins/lit/static-properties.js';
    
    export default {
    -  litelement: true,
      plugins: [
    +    customElementDecoratorPlugin(),
    +    methodDenyListPlugin(),
    +    memberDenyListPlugin(),
    +    propertyDecoratorPlugin(),
    +    staticPropertiesPlugin(),
      ]
    }
    

    It gave the same result (even though I know it's at a cost of maintenance if internal structure would change), so

    Step 2: Try configuring propertyDecoratorPlugin

    Aaaaaand... it's gone. Plugin is written in such way that it takes no config.

    Step 2.1: Reimplement propertyDecoratorPlugin

    Shortening things up:

    https://github.com/open-wc/custom-elements-manifest/blob/ce0262bb7d6baae89ec22c6dfce487e5eaf7bfed/packages/analyzer/src/features/framework-plugins/lit/property-decorator.js#L67-L78

            if(attributeName) {
              attribute.name = attributeName;
              field.attribute = attributeName;
            } else {
    -         field.attribute = field.name;
    +         field.attribute = kebabCase(field.name);
            }
    
    
            if(reflects(propertyOptions)) {
    -         field.attribute = attribute.name;
    +         field.attribute = kebabCase(attribute.name);
              field.reflects = true;
            }
    

    (BTW: I think there's a bug in reflect logic - it assumes that reflected attribute is given explicitly. I need to think about it some more before I can be sure)

    So: I got what I wanted, but it's WAAAAY too much bound to the internal implementation. It's not what I want to maintain or leave my colleagues to maintain, so...

    Step 3: "Fix it later"

    I wrote my own plugin to adjust what I don't like about the default one:

    import kebabCase from 'just-kebab-case';
    
    export default function kebabCaseAttributesPlugin() {
      const name = 'kebabCase-attributes';
      const is = expectedKind => ({kind}) => kind === expectedKind
      const has = expectedProp => member => expectedProp in member;
      const attributeMatches = regexp => memberWithAttribute => regexp.test(memberWithAttribute.attribute)
    
      return {
        name,
        moduleLinkPhase({moduleDoc, context}) {
          if (moduleDoc.kind !== 'javascript-module') {
            return;
          }
    
          moduleDoc.declarations
            .filter(is('class'))
            .forEach(({members}) => members
              .filter(is('field'))
              .filter(has('attribute'))
              .filter(attributeMatches(/[A-Z]/))
              .forEach(member => {
                const kebabCased = kebabCase(member.attribute);
                if (context.dev) {
                  console.log(`[${name}] ${member.attribute} -> ${kebabCased}`);
                }
                member.attribute = kebabCased;
              })
            );
        }
      }
    }
    

    I'm leaving it in here for reference, maybe someone will benefit from it.

    I'm a rookie in WebComponents and I started using the analyser 2h ago, but I'm a JS dev with 10y+ exp, so it was quite easy for me (btw - kudos for plugin architecture, It was that easy because I made use of terrific idea to allow moduleLinkPhase), but it's not exactly the greatest DX for people with less experience.

    What I propose to discuss

    • define LitPluginOptions
    • allow passing it instead of true to litelement
    • distribute values from LitPluginOptions to plugins

    Or maybe include some examples of how to adjust the output for one's needs as I did. Either way discussing what might get configured is a first step for both.

    Truth to be said: providing tips on how to adjust it with ones own plugin promotes building more plugins and building awareness that it's not that hard to build plugins on one's own, so maybe the latter is even better than allowing configuration. For sure it's less of a maintainer load.

    opened by jrencz 0
  • @internal by default

    @internal by default

    I am using this package to create a manifest for my stencil project in order to generate docs in Storybook.

    A major headache is marking every variable that is not a prop (which is already indicated by @Prop()) with the @internal or @omit decorators, or they will be treated just like props and appear as controls in the Storybook story (I know this is just as much Storybook's fault for ignoring the "private" field, among others).

    I also have to mark all internal functions, including render(), which I'd think would be omitted by the framework integration plugin.

    I didn't see any config options to assume @internal by default unless otherwise indicated. Is there an easy way to do this, would I need to copy the plugin and implement it myself?

    Thank you for this excellent work, by the way! My issues are minimal-- I am just trying to make things as easy as possible for the developers working on my project.

    opened by nedredmond 8
  • Catalyst Plugin: attribute names aren't dasherised

    Catalyst Plugin: attribute names aren't dasherised

    Checklist

    • [ ] Did you run the analyzer with the --dev flag to get more information?
    • [x] Did you create a minimal reproduction in the playground?

    Playground link

    Catalyst attributes are dasherised when serialised to HTML, which the Catalyst plugin does not quite properly reflect.

    Expected behavior

    The following code:

    import { controller, attr } from '@github/catalyst'
    
    @controller
    class HelloWorldElement extends HTMLElement {
      @attr fooBar = 'hello'
    }
    

    Would result in an attribute of data-foo-bar in Catalyst 1.x and an attribute of foo-bar in 2.x and so the attributes json should be:

              "attributes": [
                {
                  "name": "data-foo-bar", // just `foo-bar` in v2
                  "type": {
                    "text": "string"
                  },
                  "default": "'hello'",
                  "fieldName": "fooBar"
                }
              ],
    

    Actual behavior

    The generated manifest has the following:

              "attributes": [
                {
                  "name": "fooBar",
                  "type": {
                    "text": "string"
                  },
                  "default": "'hello'",
                  "fieldName": "fooBar"
                }
              ],
    
    opened by keithamus 1
Owner
open-wc
Open Web Components provides a set of defaults, recommendations and tools to help facilitate your Web Component
open-wc
A small jQuery plugin that will automatically cast a shadow creating depth for your flat UI elements

#Flat Shadow by Pete R. A small jQuery plugin that will automatically cast a shadow creating depth for your flat UI elements Created by Pete R., Found

Pete R. 482 Dec 18, 2022
Central repository for the Glimmer.js project

Glimmer.js Welcome to Glimmer.js! Glimmer.js is actually a made up of lots of small packages, so this meta-repo exists to help you find what you're lo

Glimmer.js 731 Dec 10, 2022
Give your JS App some Backbone with Models, Views, Collections, and Events

____ __ __ /\ _`\ /\ \ /\ \ __ \ \ \ \ \ __ ___\ \ \/'\\ \ \_

Jeremy Ashkenas 28k Jan 9, 2023
A rugged, minimal framework for composing JavaScript behavior in your markup.

Alpine.js Alpine.js offers you the reactive and declarative nature of big frameworks like Vue or React at a much lower cost. You get to keep your DOM,

Alpine.js 22.5k Jan 2, 2023
OpenUI5 lets you build enterprise-ready web applications, responsive to all devices, running on almost any browser of your choice.

OpenUI5. Build Once. Run on any device. What is it? OpenUI5 lets you build enterprise-ready web applications, responsive to all devices, running on al

SAP 2.7k Dec 31, 2022
Turbolinks makes navigating your web application faster

Turbolinks is no longer under active development Please note that Turbolinks is no longer under active development. It has been superseded by a new fr

Turbolinks 12.8k Jan 4, 2023
esbuild plugin to generate mix-manifest.json file compatible with Laravel Mix.

esbuild-mix-manifest-plugin An esbuild plugin to generate a mix-manifest.json compatible with Laravel Mix. Installation You can install the plugin via

Stefan Zweifel 6 Dec 25, 2022
An npm package for demonstration purposes using TypeScript to build for both the ECMAScript Module format (i.e. ESM or ES Module) and CommonJS Module format. It can be used in Node.js and browser applications.

An npm package for demonstration purposes using TypeScript to build for both the ECMAScript Module format (i.e. ESM or ES Module) and CommonJS Module format. It can be used in Node.js and browser applications.

Snyk Labs 57 Dec 28, 2022
Feel free to create new file, don't hesitate to pull your code, the most important thing is that the file name here must match your nickname so that file does not conflict with other people.

Hacktoberfest Indonesia Apa Itu Hacktoberfest ? Hacktoberfest adalah acara tahunan yang bertujuan untuk mendorong berkontribusi kedalam ekosistem open

Juan Daniel 5 Dec 15, 2022
Firebase SDK 9 + Google Sign In + Chrome Extension Manifest Version 3 + Webpack

Firebase SDK 9 + Google Sign In + Chrome Extension Manifest Version 3 + Webpack Demo Find this Chrome Extension Setup and working demo here or on Yout

Rasika Warade 40 Dec 28, 2022
Chrome Extension Boilerplate with SolidJS + Vite + TypeScript + Manifest V3 + Hot Relaod

Chrome Extension Boilerplate with SolidJS + Vite + TypeScript + Manifest V3 + Hot Relaod Intro This boilerplate is made for creating chrome extensions

fuyutarow 34 Dec 27, 2022
Modify Request & Response Headers Chrome Extension (Manifest V3)

Modify request & response headers (Chrome Extension Manifest V3) This Chrome extension will add request header and response header to few network requ

Requestly 6 Dec 9, 2022
Chrome Extension Boilerplate with SolidJS + Vite + TypeScript + Manifest V3 + HMR

mv3-solid-chrome-extension-template chrome-extension development template with firebase Support Chrome Extension Manifest V3 SolidJS Typescript HMR Fi

munron 6 Dec 13, 2022
Create a deep copy of a set of matched elements with the dynamic state of all form elements copied to the cloned elements.

jq-deepest-copy FUNCTION: Create a deep copy of a set of matched elements while preserving the dynamic state of any matched form elements. Example Use

Michael Coughlin 5 Oct 28, 2022
Moxiecode 5.6k Jan 1, 2023
A quickstart AWS Lambda function code generator. Downloads a template function code file, test harness file, sample SAM deffiniation and appropriate file structure.

Welcome to function-stencil ?? A quickstart AWS Lambda function code generator. Downloads a template function code file, test harness file, sample SAM

Ben Smith 21 Jun 20, 2022
Serve file server with single zip file as file system in Deno.

zipland Serve file server with one-single zip file in Deno. Support zip just zip32 with deflated or uncompressed serving plaintext deflate Examples Yo

Yongwook Choi 18 Nov 2, 2022