sprockets-export-1.0.0/0000755000175100017510000000000013426517174014104 5ustar pravipravisprockets-export-1.0.0/Rakefile0000644000175100017510000000027213426517174015552 0ustar pravipravirequire "rake/testtask" require "bundler/gem_tasks" task default: :test Rake::TestTask.new do |t| t.libs << "test" t.test_files = FileList["test/*_test.rb"] t.verbose = true end sprockets-export-1.0.0/bin/0000755000175100017510000000000013426517174014654 5ustar pravipravisprockets-export-1.0.0/bin/setup0000755000175100017510000000020313426517174015735 0ustar pravipravi#!/usr/bin/env bash set -euo pipefail IFS=$'\n\t' set -vx bundle install # Do any other automated setup that you need to do here sprockets-export-1.0.0/bin/console0000755000175100017510000000052513426517174016246 0ustar pravipravi#!/usr/bin/env ruby require "bundler/setup" require "sprockets/export" # You can add fixtures and/or initialization code here to make experimenting # with your gem easier. You can also use a different console, if you like. # (If you use this, don't forget to add pry to your Gemfile!) # require "pry" # Pry.start require "irb" IRB.start sprockets-export-1.0.0/README.md0000644000175100017510000000101113426517174015354 0ustar pravipravi# Sprockets Export A [Sprockets directive](https://github.com/rails/sprockets#sprockets-directives) for hassle-free [UMD](https://github.com/umdjs/umd)-style JavaScript module definitions. ## Using ``` ruby # Gemfile gem 'sprockets', '>= 3.0.0' gem 'sprockets-export' ``` ```js /* widget.js */ //= export Widget //= require_self this.Widget = { name: "gizmo" } ``` ## Consuming ```js widget = require("widget") widget.name // gizmo ``` --- Licensed under the [MIT License](LICENSE.txt) © 2016 Javan Makhmali sprockets-export-1.0.0/.gitignore0000644000175100017510000000004413426517174016072 0ustar pravipravi/.bundle/ /Gemfile.lock /pkg/ /tmp/ sprockets-export-1.0.0/.travis.yml0000644000175100017510000000010513426517174016211 0ustar pravipravilanguage: ruby cache: bundler rvm: - 2.2 - 2.1 - 2.0 - 1.9.3 sprockets-export-1.0.0/lib/0000755000175100017510000000000013426517174014652 5ustar pravipravisprockets-export-1.0.0/lib/sprockets/0000755000175100017510000000000013426517174016667 5ustar pravipravisprockets-export-1.0.0/lib/sprockets/export/0000755000175100017510000000000013426517174020210 5ustar pravipravisprockets-export-1.0.0/lib/sprockets/export/metadata_injector.rb0000644000175100017510000000062613426517174024216 0ustar pravipravimodule Sprockets::Export::MetadataInjector extend self def call(input) data, environment, filename = *input.values_at(:data, :environment, :filename) if metadata = Sprockets::Export::Store.get(environment, filename) open = "/* !START EXPORT #{metadata} */" close = "/* !END EXPORT */" data = [open, data.chomp, close].join("\n") + "\n" end { data: data } end end sprockets-export-1.0.0/lib/sprockets/export/bundle_processor.rb0000644000175100017510000000163113426517174024106 0ustar pravipravirequire "sprockets/export/template" require "ostruct" module Sprockets::Export::BundleProcessor extend self PATTERN = /(.*)\/\* !START EXPORT (\S*)\s*(\S*) \*\/(.*)\/\* !END EXPORT \*\/(.*)/m def call(input) Sprockets::Export::Store.reset data = input[:data] if data =~ PATTERN data = Sprockets::Export::Template.new(extract_template_data(data)).render end { data: data } end private def extract_template_data(js) _, head, namespace, flags, export, tail = *js.match(PATTERN) { namespace: namespace, flags: create_flags(flags), export: format(export), head: format(head), tail: format(tail) } end def format(part) part.strip.gsub(/\A\s*;\n*|\n;\s*\z/, "").strip end def create_flags(string = "") flags = {} string.split.each { |flag| flags[flag] = true } OpenStruct.new(flags) end end sprockets-export-1.0.0/lib/sprockets/export/store.rb0000644000175100017510000000057213426517174021675 0ustar pravipravimodule Sprockets::Export::Store extend self def set(environment, filename, data) mapping[environment] ||= {} mapping[environment][filename] = data end def get(environment, filename) if mapping[environment] mapping[environment][filename] end end def reset @mapping = nil end private def mapping @mapping ||= {} end end sprockets-export-1.0.0/lib/sprockets/export/template.rb0000644000175100017510000000112413426517174022346 0ustar pravipravirequire "erb" class Sprockets::Export::Template def self.content @content ||= Sprockets::Export.lib_path.join("sprockets/export/template.js.erb").read end def initialize(data = {}) data.each do |key, value| instance_variable_set("@#{key}".to_sym, value) end end def render ERB.new(self.class.content, nil, "-").result(binding).strip + "\n" end private def indent(string, amount) lines = string.lines.to_a result = lines.shift lines.each do |line| result << line.gsub(/^(?!$)/, " " * amount) end result end end sprockets-export-1.0.0/lib/sprockets/export/directive_processor.rb0000644000175100017510000000047313426517174024616 0ustar pravipraviclass Sprockets::DirectiveProcessor def process_export_directive(namespace, *flags) if @content_type == "application/javascript" Sprockets::Export::Store.set(@environment, @filename, [namespace, flags].flatten.join(" ")) process_depend_on_directive "sprockets/export/version.rb" end end end sprockets-export-1.0.0/lib/sprockets/export/template.js.erb0000644000175100017510000000072613426517174023135 0ustar pravipravi<%= @head %> (function() { var context = <%= @flags.noglobal ? "{}" : "this" %>; (function() { <%= indent(@export, 4)%> }).call(context); var <%= @namespace %> = context.<%= @namespace %>; (function() { <%= indent(@tail, 4) %> }).call(this); if (typeof module === "object" && module.exports) { module.exports = <%= @namespace %>; } else if (typeof define === "function" && define.amd) { define(<%= @namespace %>); } }).call(this); sprockets-export-1.0.0/lib/sprockets/export/version.rb0000644000175100017510000000010113426517174022212 0ustar pravipravimodule Sprockets module Export VERSION = "1.0.0" end end sprockets-export-1.0.0/lib/sprockets/export.rb0000644000175100017510000000114613426517174020537 0ustar pravipravirequire "pathname" require "sprockets" require "sprockets/export/version" require "sprockets/export/store" require "sprockets/export/directive_processor" require "sprockets/export/metadata_injector" require "sprockets/export/bundle_processor" module Sprockets::Export def self.lib_path @lib_path ||= Pathname.new(File.expand_path("../..", __FILE__)) end end Sprockets.append_path Sprockets::Export.lib_path Sprockets.register_postprocessor "application/javascript", Sprockets::Export::MetadataInjector Sprockets.register_bundle_processor "application/javascript", Sprockets::Export::BundleProcessor sprockets-export-1.0.0/sprockets-export.gemspec0000644000175100017510000000201713426517174021005 0ustar pravipravi# coding: utf-8 lib = File.expand_path('../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require 'sprockets/export/version' Gem::Specification.new do |spec| spec.name = "sprockets-export" spec.version = Sprockets::Export::VERSION spec.authors = ["Javan Makhmali"] spec.email = ["javan@javan.us"] spec.summary = %q{Sprockets Export} spec.description = %q{A Sprockets directive for hassle-free UMD-style JavaScript module definitions.} spec.homepage = "https://github.com/javan/sprockets-export" spec.license = "MIT" spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } spec.bindir = "exe" spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } spec.require_paths = ["lib"] spec.add_development_dependency "sprockets", ">= 3.0" spec.add_development_dependency "bundler" spec.add_development_dependency "rake" spec.add_development_dependency "minitest" end sprockets-export-1.0.0/LICENSE.txt0000644000175100017510000000207113426517174015727 0ustar pravipraviThe MIT License (MIT) Copyright (c) 2016 Javan Makhmali Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. sprockets-export-1.0.0/Gemfile0000644000175100017510000000007113426517174015375 0ustar pravipravisource "https://rubygems.org" gemspec gem "rack", "< 2"